
    Cj"                     t    S SK r S SKrS SKrS SKrS SKJrJr  S SKrS SKJ	r	J
r
JrJr  S SKJr   " S S5      rg)    N)LiteralOptional)DAYS_IN_A_MONTHDAYS_IN_A_WEEKDAYS_IN_A_YEARHOURS_IN_A_DAY)ModelResponsec                   L   \ rS rSr   S#S\S\S\\   S\\   4S jjrS rS	 r	S\
R                  " 5       4S
\S\S\\S      S\4S jjrS\S\S\4S jrS\4S jr    S$S\S\\   S\\   S\\   S\\   4
S jjrS rS rS\S\4S jrS rS rS\4S jrS rS  rS! rS"rg)%BudgetManager   Nproject_nameclient_typeapi_baseheadersc                     X l         Xl        U=(       d    SU l        U=(       d    SS0U l        U R	                  5         g )Nzhttps://api.litellm.aizContent-Typezapplication/json)r   r   r   r   	load_data)selfr   r   r   r   s        h/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/litellm/budget_manager.py__init__BudgetManager.__init__   s9     '( <$<F>3E"F    c                 |     [         R                  (       a  SS KnUR                  U5        g g ! [         a     g f = f)Nr   )litellmset_verboselogginginfo	Exception)r   print_statementr   s      r   print_verboseBudgetManager.print_verbose)   s8    	""_- #  		s   *. 
;;c                 `   U R                   S:X  a  [        R                  R                  S5      (       a1  [	        SS5       n[
        R                  " U5      U l        S S S 5        OU R                  S5        0 U l        U R                  SU R                   35        g U R                   S:X  aq  U R                  S-   nSU R                  0n[        R                  R                  X R                  US	9nUR                  5       nUS
   S:X  a  0 U l        g US   U l        g g ! , (       d  f       N= f)Nlocaluser_cost.jsonrzUser Dictionary not found!zuser dict from local: hostedz/get_budgetr   r   jsonstatuserrordata)r   ospathisfileopenr'   load	user_dictr   r   r   r   module_level_clientpostr   )r   	json_fileurlr*   responses        r   r   BudgetManager.load_data2   s   w&ww~~.//*C0I%)YYy%9DN 10 ""#?@!#!77GHI)---/C"D$5$56D2277\\ 8 H  }}H!W,  "*&!1 * 10s   D
D-total_budgetuserduration)dailyweeklymonthlyyearly
created_atc                 $   SU0U R                   U'   Uc  U R                   U   $ US:X  a  SnO2US:X  a  [        nO%US:X  a  [        nOUS:X  a  [        nO[	        S5      eUUUUS.U R                   U'   U R                  5         U R                   U   $ )	Nr7   r:      r;   r<   r=   zDduration needs to be one of ["daily", "weekly", "monthly", "yearly"])r7   r9   r>   last_updated_at)r0   r   r   r   
ValueError_save_data_thread)r   r7   r8   r9   r>   duration_in_dayss         r   create_budgetBudgetManager.create_budgetL   s     !/=t>>$''w !-".!-Z  )($)	 
t 	 ~~d##r   modelmessagesc                     SR                  S U 5       5      n[        R                  " XS9n[        R                  " XSS9u  pgU R                  U   R                  SS5      nXh-   n	U	$ )N c              3   *   #    U  H	  oS    v   M     g7f)contentN ).0messages     r   	<genexpr>/BudgetManager.projected_cost.<locals>.<genexpr>m   s     Bgy)s   )rG   textr   rG   prompt_tokenscompletion_tokenscurrent_cost)joinr   token_countercost_per_tokenr0   get)
r   rG   rH   r8   rR   rT   prompt_cost_rV   projected_costs
             r   r]   BudgetManager.projected_costl   sh    wwBBB--EE //
 ~~d+//B$3r   c                 &    U R                   U   S   $ )Nr7   r0   r   r8   s     r   get_total_budgetBudgetManager.get_total_budgetv   s    ~~d#N33r   completion_obj
input_textoutput_textc                    U(       a^  U(       aW  U(       aP  [         R                  " USUS./S9n[         R                  " USUS./S9n[         R                  " UUUS9u  nn	X-   n
O,U(       a  [         R                  " US9n
US   nO[	        S5      eXR
                  U   R                  SS	5      -   U R
                  U   S'   S
U R
                  U   ;   a8  XR
                  U   S
   R                  US	5      -   U R
                  U   S
   U'   OX:0U R
                  U   S
'   U R                  5         SU R
                  U   0$ )Nr8   )rolerL   )rG   rH   rS   )completion_responserG   zEither a chat completion object or the text response needs to be passed in. Learn more - https://docs.litellm.ai/docs/budget_managerrV   r   
model_cost)r   rX   rY   completion_costrB   r0   rZ   rC   )r   r8   rd   rG   re   rf   rT   rU   prompt_tokens_cost_usd_dollar!completion_tokens_cost_usd_dollarcosts              r   update_costBudgetManager.update_costy   sb    ZK#11:'N&OM !( 5 5;'O&P! &&+"3-1 1TD**~ND"E  W  04nnT6J6N6NA7
 0
t^, 4>>$//8<~~d?S@c%m9DNN4 .u5 38DNN4 . t,--r   c                 @    U R                   U   R                  SS5      $ )NrV   r   r0   rZ   ra   s     r   get_current_costBudgetManager.get_current_cost   s    ~~d#''::r   c                 @    U R                   U   R                  SS5      $ )Nrj   r   rr   ra   s     r   get_model_costBudgetManager.get_model_cost   s    ~~d#''a88r   returnc                     XR                   ;   $ Nr`   ra   s     r   is_valid_userBudgetManager.is_valid_user   s    ~~%%r   c                 H    [        U R                  R                  5       5      $ rz   )listr0   keys)r   s    r   	get_usersBudgetManager.get_users   s    DNN'')**r   c                 l    SU R                   U   S'   0 U R                   U   S'   SU R                   U   0$ )a9  
Reset the tracked spend for a user back to zero.

Clears both the aggregate ``current_cost`` and the per-model
``model_cost`` breakdown stored for the given user.

Args:
    user: The user identifier whose cost should be reset.

Returns:
    dict: ``{"user": <updated user record>}`` reflecting the reset state.
r   rV   rj   r8   r`   ra   s     r   
reset_costBudgetManager.reset_cost   s>     01t^,-/t\*t,--r   c                    U R                   U   S   n[        R                  " 5       nU R                   U   S   [        -  S-  S-  nX2-
  U:  a3  U R                  U5        X0R                   U   S'   U R	                  5         g g )NrA   r9   <   )r0   timer   r   rC   )r   r8   rA   current_timeduration_in_secondss        r   reset_on_durationBudgetManager.reset_on_duration   s    .../@Ayy{ NN4 ,~=BRG 	
 )-@@OOD!6BNN4 !23""$	 Ar   c                 ~    U R                  5        H)  nSU R                  U   ;   d  M  U R                  U5        M+     g )Nr9   )r   r0   r   ra   s     r   update_budget_all_users%BudgetManager.update_budget_all_users   s2    NN$DT^^D11&&t, %r   c                 `    [         R                  " U R                  S9nUR                  5         g )N)target)	threadingThread	save_datastart)r   threads     r   rC   BudgetManager._save_data_thread   s$    !!>>
 	r   c                    U R                   S:X  a9  SS Kn[        SS5       nUR                  " U R                  USS9  S S S 5        SS0$ U R                   S	:X  ab  U R
                  S
-   nU R                  U R                  S.n[        R                  R                  X0R                  US9nUR                  5       nU$ g ! , (       d  f       SS0$ = f)Nr"   r   r#   w   )indentr(   successr%   z/set_budget)r   r0   r&   )r   r'   r.   dumpr0   r   r   r   r1   r2   r   )r   r'   r3   r4   r*   r5   s         r   r   BudgetManager.save_data   s    w& &,			NNIa - i(()---/C$($5$5DNNSD2277\\ 8 H  }}HO * -, i((s   B==
C)r   r   r   r   r0   )r"   NN)NNNN)__name__
__module____qualname____firstlineno__strr   dictr   r   r   r   floatr   rE   r~   r]   rb   r	   ro   rs   rv   boolr{   r   r   r   r   rC   r   __static_attributes__rM   r   r   r   r      sN    #"&"&  3-	
 $2< OS IIK$$ $ 7#IJK	$
 $@C 4 s 4S 4 37#$(%)-.-. !/-. }	-.
 SM-. c]-.^;9&# &$ &+."%c %"-
r   r   )r'   r+   r   r   typingr   r   r   litellm.constantsr   r   r   r   litellm.utilsr	   r   rM   r   r   <module>r      s4     	   $   (X Xr   