
    ^hR                      \    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	   " S S5      r
g)    N)LiteralOptional)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        P/home/james-whalen/.local/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_data,   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O&US:X  a  SnOUS:X  a  SnOUS:X  a  S	nO[        S
5      eUUUUS.U R                   U'   U R                  5         U R                   U   $ )Nr3   r6      r7      r8      r9   im  zDduration needs to be one of ["daily", "weekly", "monthly", "yearly"])r3   r5   r:   last_updated_at)r,   
ValueError_save_data_thread)r   r3   r4   r5   r:   duration_in_dayss         r   create_budgetBudgetManager.create_budgetF   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>g   s     Bgy)s   )rE   textr   rE   prompt_tokenscompletion_tokenscurrent_cost)joinr   token_countercost_per_tokenr,   get)
r   rE   rF   r4   rP   rR   prompt_cost_rT   projected_costs
             r   r[   BudgetManager.projected_costf   sh    wwBBB--EE //
 ~~d+//B$3r   c                 &    U R                   U   S   $ )Nr3   r,   r   r4   s     r   get_total_budgetBudgetManager.get_total_budgetp   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$ )Nr4   )rolerJ   )rE   rF   rQ   )completion_responserE   zEither a chat completion object or the text response needs to be passed in. Learn more - https://docs.litellm.ai/docs/budget_managerrT   r   
model_cost)r   rV   rW   completion_costr@   r,   rX   rA   )r   r4   rb   rE   rc   rd   rR   rS   prompt_tokens_cost_usd_dollar!completion_tokens_cost_usd_dollarcosts              r   update_costBudgetManager.update_costs   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      $ )NrT   r   r,   rX   r_   s     r   get_current_costBudgetManager.get_current_cost   s    ~~d#''::r   c                 @    U R                   U   R                  SS5      $ )Nrh   r   rp   r_   s     r   get_model_costBudgetManager.get_model_cost   s    ~~d#''a88r   returnc                     XR                   ;   $ Nr^   r_   s     r   is_valid_userBudgetManager.is_valid_user   s    ~~%%r   c                 H    [        U R                  R                  5       5      $ rx   )listr,   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$ )Nr   rT   rh   r4   r^   r_   s     r   
reset_costBudgetManager.reset_cost   s<    /0t^,-/t\*t,--r   c                     U R                   U   S   n[        R                  " 5       nU R                   U   S   S-  S-  S-  nX2-
  U:  a3  U R                  U5        X0R                   U   S'   U R                  5         g g )Nr?   r5      <   )r,   timer   rA   )r   r4   r?   current_timeduration_in_secondss        r   reset_on_durationBudgetManager.reset_on_duration   s    .../@Ayy{ #nnT2:>CbH2M )-@@OOD!6BNN4 !23""$	 Ar   c                 ~    U R                  5        H)  nSU R                  U   ;   d  M  U R                  U5        M+     g )Nr5   )r~   r,   r   r_   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   rA   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	   r,   r"   )r
   r#   r*   dumpr,   r   r	   r   r-   r.   r   )r   r#   r/   r0   r&   r1   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	   r,   )r   NN)NNNN)__name__
__module____qualname____firstlineno__strr   dictr   r   r   r   floatr   rC   r|   r[   r`   r   rm   rq   rt   boolry   r~   r   r   r   rA   r   __static_attributes__rK   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.utilsr   r   rK   r   r   <module>r      s(     	   $  'J Jr   