o
    ưi!                     @   sn   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	m
Z
mZmZ d dlmZ G dd dZdS )    N)LiteralOptional)DAYS_IN_A_MONTHDAYS_IN_A_WEEKDAYS_IN_A_YEARHOURS_IN_A_DAY)ModelResponsec                   @   s&  e Zd Z			d2dededee dee fddZd	d
 Zdd Zde		 fde
dedeed  de
fddZdededefddZdefddZ				d3dedee dee dee dee f
ddZdd  Zd!d" Zded#efd$d%Zd&d' Zd(d) Zdefd*d+Zd,d- Zd.d/ Zd0d1 ZdS )4BudgetManagerlocalNproject_nameclient_typeapi_baseheadersc                 C   s0   || _ || _|p	d| _|pddi| _|   d S )Nzhttps://api.litellm.aizContent-Typezapplication/json)r   r   r   r   	load_data)selfr   r   r   r    r   M/home/app/Keep/.python/lib/python3.10/site-packages/litellm/budget_manager.py__init__   s
   
zBudgetManager.__init__c                 C   s:   zt jrdd l}|| W d S W d S  ty   Y d S w )Nr   )litellmZset_verboselogginginfo	Exception)r   Zprint_statementr   r   r   r   print_verbose)   s   zBudgetManager.print_verbosec                 C   s   | j dkr:tjdr'tdd}t|| _W d    n1 s!w   Y  n| d i | _| d| j  d S | j dkri| j	d }d| j
i}tjj|| j|d	}| }|d
 dkrbi | _d S |d | _d S d S )Nr
   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    responser   r   r   r   2   s*   




zBudgetManager.load_datatotal_budgetuserduration)dailyweeklymonthlyyearly
created_atc                 C   s   d|i| j |< |d u r| j | S |dkrd}n|dkrt}n|dkr%t}n|dkr,t}ntd||||d| j |< |   | j | S )	Nr,   r/      r0   r1   r2   zDduration needs to be one of ["daily", "weekly", "monthly", "yearly"])r,   r.   r3   last_updated_at)r&   r   r   r   
ValueError_save_data_thread)r   r,   r-   r.   r3   Zduration_in_daysr   r   r   create_budgetL   s*   

zBudgetManager.create_budgetmodelmessagesc           
      C   sT   d dd |D }tj||d}tj||dd\}}| j| dd}|| }	|	S )N c                 s   s    | ]}|d  V  qdS )contentNr   ).0messager   r   r   	<genexpr>m   s    z/BudgetManager.projected_cost.<locals>.<genexpr>)r9   textr   r9   prompt_tokenscompletion_tokenscurrent_cost)joinr   token_countercost_per_tokenr&   get)
r   r9   r:   r-   r@   rB   Zprompt_cost_rD   projected_costr   r   r   rJ   l   s   
zBudgetManager.projected_costc                 C   s   | j | d S )Nr,   r&   r   r-   r   r   r   get_total_budgetv      zBudgetManager.get_total_budgetcompletion_obj
input_textoutput_textc                 C   s   |r+|r+|r+t j|d|dgd}t j|d|dgd}t j|||d\}}	||	 }
n|r8t j|d}
|d }ntd|
| j| dd	 | j| d< d
| j| v rh|
| j| d
 |d	 | j| d
 |< n	||
i| j| d
< |   d| j| iS )Nr-   )Zroler<   )r9   r:   rA   )Zcompletion_responser9   zEither a chat completion object or the text response needs to be passed in. Learn more - https://docs.litellm.ai/docs/budget_managerrD   r   
model_cost)r   rF   rG   Zcompletion_costr6   r&   rH   r7   )r   r-   rO   r9   rP   rQ   rB   rC   Zprompt_tokens_cost_usd_dollarZ!completion_tokens_cost_usd_dollarZcostr   r   r   update_costy   sH   

zBudgetManager.update_costc                 C      | j | ddS )NrD   r   r&   rH   rL   r   r   r   get_current_cost      zBudgetManager.get_current_costc                 C   rT   )NrR   r   rU   rL   r   r   r   get_model_cost   rW   zBudgetManager.get_model_costreturnc                 C   s
   || j v S NrK   rL   r   r   r   is_valid_user   s   
zBudgetManager.is_valid_userc                 C   s   t | j S rZ   )listr&   keys)r   r   r   r   	get_users   rN   zBudgetManager.get_usersc                 C   s*   d| j | d< i | j | d< d| j | iS )Nr   rD   rR   r-   rK   rL   r   r   r   
reset_cost   s   zBudgetManager.reset_costc                 C   sd   | j | d }t }| j | d t d d }|| |kr0| | || j | d< |   d S d S )Nr5   r.   <   )r&   timer   r_   r7   )r   r-   r5   current_timeZduration_in_secondsr   r   r   reset_on_duration   s   
zBudgetManager.reset_on_durationc                 C   s*   |   D ]}d| j| v r| | qd S )Nr.   )r^   r&   rc   rL   r   r   r   update_budget_all_users   s
   
z%BudgetManager.update_budget_all_usersc                 C   s   t j| jd}|  d S )N)target)	threadingThread	save_datastart)r   threadr   r   r   r7      s   zBudgetManager._save_data_threadc                 C   s   | j dkr.dd l}tdd}|j| j|dd W d    ddiS 1 s%w   Y  ddiS | j d	krO| jd
 }| j| jd}tjj	|| j
|d}| }|S d S )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+   r   r   r   rh      s&   



zBudgetManager.save_data)r
   NN)NNNN)__name__
__module____qualname__strr   dictr   r   r   ra   floatr   r8   r\   rJ   rM   r   rS   rV   rX   boolr[   r^   r_   rc   rd   r7   rh   r   r   r   r   r	      sh    
	

 

/r	   )r   r!   rf   ra   typingr   r   r   Zlitellm.constantsr   r   r   r   Zlitellm.utilsr   r	   r   r   r   r   <module>   s   	