
    gR                      \    d dl Z d dlZd dlZd dlZd dlmZmZ d dlZd dlm	Z	  G d d      Z
y)    N)LiteralOptional)ModelResponsec                   0   e Zd Z	 	 	 d!dededee   dee   fdZd Zd Zd e	j                         fd	e
d
edeed      de
fdZdeded
efdZd
efdZ	 	 	 	 d"d
edee   dee   dee   dee   f
dZd Zd Zd
edefdZd Zd Zd
efdZd Zd Zd  Zy)#BudgetManagerNproject_nameclient_typeapi_baseheadersc                 p    || _         || _        |xs d| _        |xs ddi| _        | j	                          y )Nzhttps://api.litellm.aizContent-Typezapplication/json)r	   r   r
   r   	load_data)selfr   r	   r
   r   s        K/var/www/openai/venv/lib/python3.12/site-packages/litellm/budget_manager.py__init__zBudgetManager.__init__   s=     '( <$<F>3E"F    c                 p    	 t         j                  rdd l}|j                  |       y y # t        $ r Y y w xY w)Nr   )litellmset_verboselogginginfo	Exception)r   print_statementr   s      r   print_verbosezBudgetManager.print_verbose#   s8    	""_- #  		s   %) 	55c                 L   | j                   dk(  rt        j                  j                  d      r0t	        dd      5 }t        j                  |      | _        d d d        n| j                  d       i | _        | j                  d| j                          y | j                   dk(  rt| j                  dz   }d| j                  i}t        j                  j                  || j                  |	      }|j                         }|d
   dk(  ri | _        y |d   | _        y y # 1 sw Y   xY w)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   z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T\\ 8 H  }}H!W,  "*&!1 * 10s   DD#total_budgetuserduration)dailyweeklymonthlyyearly
created_atc                    d|i| j                   |<   || j                   |   S |dk(  rd}n#|dk(  rd}n|dk(  rd}n|dk(  rd	}nt        d
      ||||d| j                   |<   | j                          | j                   |   S )Nr/   r2      r3      r4      r5   im  zDduration needs to be one of ["daily", "weekly", "monthly", "yearly"])r/   r1   r6   last_updated_at)r)   
ValueError_save_data_thread)r   r/   r0   r1   r6   duration_in_dayss         r   create_budgetzBudgetManager.create_budgetF   s     !/=t>>$''w ! "!!"Z  )($)	 
t 	 ~~d##r   modelmessagesc                     dj                  d |D              }t        j                  ||      }t        j                  ||d      \  }}| j                  |   j                  dd      }||z   }	|	S )N c              3   &   K   | ]	  }|d      yw)contentN ).0messages     r   	<genexpr>z/BudgetManager.projected_cost.<locals>.<genexpr>g   s     Bgwy)s   )r@   textr   r@   prompt_tokenscompletion_tokenscurrent_cost)joinr   token_countercost_per_tokenr)   get)
r   r@   rA   r0   rJ   rL   prompt_cost_rN   projected_costs
             r   rU   zBudgetManager.projected_costf   sp    wwBBB--EE //}
Q ~~d+//B$|3r   c                 &    | j                   |   d   S )Nr/   r)   r   r0   s     r   get_total_budgetzBudgetManager.get_total_budgetp   s    ~~d#N33r   completion_obj
input_textoutput_textc                 p   |r[|rY|rWt        j                  |d|dg      }t        j                  |d|dg      }t        j                  |||      \  }}	||	z   }
n)|rt        j                  |      }
|d   }nt	        d      |
| j
                  |   j                  dd	      z   | j
                  |   d<   d
| j
                  |   v r9|
| j
                  |   d
   j                  |d	      z   | j
                  |   d
   |<   n||
i| j
                  |   d
<   | j                          d| j
                  |   iS )Nr0   )rolerE   )r@   rA   rK   )completion_responser@   zEither a chat completion object or the text response needs to be passed in. Learn more - https://docs.litellm.ai/docs/budget_managerrN   r   
model_cost)r   rP   rQ   completion_costr<   r)   rR   r=   )r   r0   rZ   r@   r[   r\   rL   rM   prompt_tokens_cost_usd_dollar!completion_tokens_cost_usd_dollarcosts              r   update_costzBudgetManager.update_costs   sk    ZK#11:'N&OM !( 5 5;'O&P! &&+"3-1 13TTD**~ND"E  W  04dnnT6J6N6NA7
 0
t^, 4>>$//8<t~~d?S@c%m9DNN4 .u5 38DNN4 . t,--r   c                 @    | j                   |   j                  dd      S )NrN   r   r)   rR   rX   s     r   get_current_costzBudgetManager.get_current_cost   s    ~~d#''::r   c                 @    | j                   |   j                  dd      S )Nr`   r   rg   rX   s     r   get_model_costzBudgetManager.get_model_cost   s    ~~d#''a88r   returnc                     || j                   v S NrW   rX   s     r   is_valid_userzBudgetManager.is_valid_user   s    t~~%%r   c                 H    t        | j                  j                               S rm   )listr)   keys)r   s    r   	get_userszBudgetManager.get_users   s    DNN'')**r   c                 l    d| j                   |   d<   i | j                   |   d<   d| j                   |   iS )Nr   rN   r`   r0   rW   rX   s     r   
reset_costzBudgetManager.reset_cost   s<    /0t^,-/t\*t,--r   c                     | j                   |   d   }t        j                         }| j                   |   d   dz  dz  dz  }||z
  |k\  r4| j                  |       || j                   |   d<   | j                          y y )Nr;   r1      <   )r)   timert   r=   )r   r0   r;   current_timeduration_in_secondss        r   reset_on_durationzBudgetManager.reset_on_duration   s    .../@Ayy{ #nnT2:>CbH2M /)-@@OOD!6BDNN4 !23""$	 Ar   c                 t    | j                         D ]%  }d| j                  |   v s| j                  |       ' y )Nr1   )rr   r)   r{   rX   s     r   update_budget_all_usersz%BudgetManager.update_budget_all_users   s2    NN$DT^^D11&&t, %r   c                 d    t        j                  | j                        }|j                          y )N)target)	threadingThread	save_datastart)r   threads     r   r=   zBudgetManager._save_data_thread   s$    !!>>
 	r   c                    | j                   dk(  r<dd l}t        dd      5 } |j                  | j                  |d       d d d        ddiS | j                   d	k(  rf| j
                  d
z   }| j                  | j                  d}t        j                  j                  || j                  |      }|j                         }|S y # 1 sw Y   ddiS xY w)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,   r-   r#   r.   s         r   r   zBudgetManager.save_data   s    w& &,			NNIa - i(()---/C$($5$5DNNSD2277T\\ 8 H  }}HO * - i((s    CC)r   NN)NNNN)__name__
__module____qualname__strr   dictr   r   r   rx   floatr   r?   rp   rU   rY   r   re   rh   rj   boolrn   rr   rt   r{   r}   r=   r   rF   r   r   r   r      sP    #"&"&  3-	
 $2< OS%DIIK$$ $ 7#IJK	$
 $@C 4 s 4S 4 37#$(%)-.-. !/-. }	-.
 SM-. c]-.^;9&# &$ &+.
%c %-
r   r   )r    r$   r   rx   typingr   r   r   litellm.utilsr   r   rF   r   r   <module>r      s(     	   $  'J Jr   