Ë
    uPêjX!  ã                   ót   — 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«      Zy)é    N)ÚFinalÚLiteral)ÚDAYS_IN_A_MONTHÚDAYS_IN_A_WEEKÚDAYS_IN_A_YEARÚHOURS_IN_A_DAY)ÚModelResponsec                   ó0  — e Zd Z	 	 	 d!dedededz  dedz  fd„Zd„ Zd„ Zd ej                  «       fd	e	d
ede
d   dz  de	fd„Zdeded
efd„Zd
efd„Z	 	 	 	 d"d
ededz  dedz  dedz  dedz  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        ú[/home/oem/CyberBrain26-unified/.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(  r†t        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_data2   s	  € Ø×Ñ˜wÒ&ä�w‰w�~‰~Ð.Ô/äÐ*¨CÓ0ð :°IÜ%)§Y¡Y¨yÓ%9�D”N÷:ð :ð ×"Ñ"Ð#?Ô@Ø!#�”Ø×ÑÐ!7¸¿¹Ð7GÐHÕIØ×Ñ Ò)àŸ™¨Ñ6ˆCØ)¨4×+<Ñ+<Ð=ˆDÜ×2Ñ2×7Ñ7¸ÀTÇ\Á\ÐX\Ð7Ó]ˆHØ—}‘}“ˆHØ˜Ñ! WÒ,Ø!#�•à!)¨&Ñ!1�•ð *÷:ð :ús   »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t        }n#|dk(  rt        }n|dk(  rt        }nt	        d«      ‚||||dœ| j                   |<   | j                  «        | j                   |   S )	Nr3   r6   é   r7   r8   r9   zDduration needs to be one of ["daily", "weekly", "monthly", "yearly"])r3   r5   r:   Úlast_updated_at)r-   r   r   r   Ú
ValueErrorÚ_save_data_thread)r   r3   r4   r5   r:   Úduration_in_dayss         r   Úcreate_budgetzBudgetManager.create_budgetH   s©   € ð !/°Ð=ˆ�‰�tÑØÐØ—>‘> $Ñ'Ð'à�wÒØ ÑØ˜Ò!Ü-ÑØ˜Ò"Ü.ÑØ˜Ò!Ü-ÑäÐgÓhÐhà(Ø(Ø$Ø)ñ	 
ˆ�‰�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   è ø€ ÒI°W˜g iÕ0ÑIùs   ‚)rB   Útextr   ©rB   Úprompt_tokensÚcompletion_tokensÚcurrent_cost)Újoinr   Útoken_counterÚcost_per_tokenr-   Úget)
r   rB   rC   r4   rL   rN   Úprompt_costÚ_rP   Úprojected_costs
             r   rW   zBudgetManager.projected_costf   sl   € Ø—g‘gÑIÀÔIÓIˆÜ&×4Ñ4¸5ÀtÔLˆÜ ×/Ñ/°eÈ=ÐlmÔn‰ˆ�QØ"Ÿn™n¨TÑ2×6Ñ6°~ÀqÓIˆØ +¨lÑ :ˆØÐr   c                 ó&   — | j                   |   d   S )Nr3   ©r-   ©r   r4   s     r   Úget_total_budgetzBudgetManager.get_total_budgetn   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 )Nr4   )ÚrolerG   )rB   rC   rM   )Úcompletion_responserB   z„Either a chat completion object or the text response needs to be passed in. Learn more - https://docs.litellm.ai/docs/budget_managerrP   r   Ú
model_cost)r   rR   rS   Úcompletion_costr>   r-   rT   r?   )r   r4   r\   rB   r]   r^   rN   rO   Úprompt_tokens_cost_usd_dollarÚ!completion_tokens_cost_usd_dollarÚcosts              r   Úupdate_costzBudgetManager.update_costq   sY  € ñ ‘Z¡KÜ#×1Ñ1¸ÐRXÐeoÑIpÐHqÔrˆMÜ '× 5Ñ 5¸EÐV\ÐitÑMuÐLvÔ wÐô ×&Ñ&ØØ+Ø"3ôñØ-Ø1ð 1Ð3TÑT‰DÙÜ×*Ñ*¸~ÔNˆDØ" 7Ñ+‰Eäð Wóð ð 04°d·n±nÀTÑ6J×6NÑ6NÈ~Ð_`Ó6aÑ/aˆ�‰�tÑ˜^Ñ,Ø˜4Ÿ>™>¨$Ñ/Ñ/Ø8<¸t¿~¹~ÈdÑ?SÐT`Ñ?a×?eÑ?eÐfkÐmnÓ?oÑ8oˆD�N‰N˜4Ñ  Ñ.¨uÒ5à27¸°ˆD�N‰N˜4Ñ  Ñ.à×ÑÔ Ø˜Ÿ™ tÑ,Ð-Ð-r   c                 ó@   — | j                   |   j                  dd«      S )NrP   r   ©r-   rT   rZ   s     r   Úget_current_costzBudgetManager.get_current_cost–   s   € Ø�~‰~˜dÑ#×'Ñ'¨¸Ó:Ð:r   c                 ó@   — | j                   |   j                  dd«      S )Nrb   r   ri   rZ   s     r   Úget_model_costzBudgetManager.get_model_cost™   s   € Ø�~‰~˜dÑ#×'Ñ'¨°aÓ8Ð8r   Úreturnc                 ó   — || j                   v S ©NrY   rZ   s     r   Úis_valid_userzBudgetManager.is_valid_userœ   s   € Ø�t—~‘~Ð%Ð%r   c                 óH   — t        | j                  j                  «       «      S ro   )Úlistr-   Úkeys)r   s    r   Ú	get_userszBudgetManager.get_usersŸ   s   € Ü�D—N‘N×'Ñ'Ó)Ó*Ð*r   c                 ól   — d| j                   |   d<   i | j                   |   d<   d| j                   |   iS )ay  
        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   rP   rb   r4   rY   rZ   s     r   Ú
reset_costzBudgetManager.reset_cost¢   s>   € ð 01ˆ�‰�tÑ˜^Ñ,Ø-/ˆ�‰�tÑ˜\Ñ*Ø˜Ÿ™ tÑ,Ð-Ð-r   c                 ó  — | j                   |   d   }t        j                  «       }| j                   |   d   t        z  dz  dz  }||z
  |k\  r4| j                  |«       || j                   |   d<   | j	                  «        y y )Nr=   r5   é<   )r-   Útimer   rv   r?   )r   r4   r=   Úcurrent_timeÚduration_in_secondss        r   Úreset_on_durationzBudgetManager.reset_on_duration³   sŠ   € à!%§¡°Ñ!5Ð6GÑ!HˆÜ"Ÿi™i›kˆð &*§^¡^°DÑ%9¸*Ñ%EÌÑ%VÐY[Ñ%[Ð^`Ñ%`Ðð ˜/Ñ)Ð-@Ò@à�O‰O˜DÔ!Ø6BˆD�N‰N˜4Ñ Ð!2Ñ3Ø×"Ñ"Õ$ð	 Ar   c                 ót   — | j                  «       D ]%  }d| j                  |   v sŒ| j                  |«       Œ' y )Nr5   )rt   r-   r|   rZ   s     r   Úupdate_budget_all_usersz%BudgetManager.update_budget_all_usersÂ   s7   € Ø—N‘NÓ$ò 	-ˆ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$   r0   r1   r'   r2   s         r   rƒ   zBudgetManager.save_dataË   sÅ   € Ø×Ñ˜wÒ&Ûô Ð&¨Ó,ð ?°	Ø�—	‘	˜$Ÿ.™.¨)¸AÕ>÷?à˜iÐ(Ð(Ø×Ñ Ò)ØŸ™¨Ñ6ˆCØ+/×+<Ñ+<È4Ï>É>ÑZˆDÜ×2Ñ2×7Ñ7¸ÀTÇ\Á\ÐX\Ð7Ó]ˆHØ—}‘}“ˆHØˆOð *÷?à˜iÐ(Ð(ús     CÃC)r   NN)NNNN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚdictr   r   r   ry   Úfloatr   rA   rr   rW   r[   r	   rg   rj   rl   Úboolrp   rt   rv   r|   r~   r?   rƒ   rH   r   r   r   r      sO  „ ð #Ø#Ø#ñàðð ðð ˜‘*ð	ð
 ˜‘óòò2ð4 LPØ%˜DŸI™I›Kñ$àð$ð ð$ð Ð@ÑAÀDÑHð	$ð
 ó$ð< Cð °4ð ¸só ð4 Só 4ð 04Ø Ø!%Ø"&ñ#.àð#.ð &¨Ñ,ð#.ð �T‰zð	#.ð
 ˜$‘Jð#.ð ˜4‘Zó#.òJ;ò9ð& #ð &¨$ó &ò+ò.ð"% có %ò-ò
ór   r   )r$   r(   r�   ry   Útypingr   r   r   Úlitellm.constantsr   r   r   r   Úlitellm.utilsr	   r   rH   r   r   ú<module>r–      s4   ðó Û 	Û Û ß !ã ÷ó õ (÷~ò ~r   