Ë
    tPêjó2  ã                   ó¼  — U d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	 ddl
­ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ  e«       Zeed<   ej1                  ddg ee«      g¬«       ee«      fdedefd„«       Zej1                  ddg ee«      g¬«       ee«      fdedefd„«       Zej1                  ddg ee«      g¬«      defd„«       Zej?                  ddg ee«      g¬«       ee«      fde defd„«       Z!ej?                  ddg ee«      g¬«       ee«      fdefd„«       Z"ej1                  ddg ee«      g¬«       ee«      fde#defd„«       Z$y)z‹
BUDGET MANAGEMENT

All /budget management endpoints

/budget/new
/budget/info
/budget/update
/budget/delete
/budget/settings
/budget/list
é    N)ÚMapping)ÚFinal)Ú	APIRouterÚDependsÚHTTPException)Ú*)Úuser_api_key_auth)Úget_budget_reset_time)Ú_user_has_admin_viewÚvalidate_budget_duration)Újsonify_object)ÚBudgetRepositoryÚrouterz/budget/newzbudget management)ÚtagsÚdependenciesÚ
budget_objÚuser_api_key_dictc              ƒ   ó†  K  — ddl m} ddlm}m} |€'t        ddt        j                  j                  i¬«      ‚| j                  �Jt        j                  | j                  «      r| j                  dk  rt        ddd	| j                  › �i¬«      ‚| j                  �Jt        j                  | j                  «      r| j                  dk  rt        ddd
| j                  › �i¬«      ‚t        | j                  «       | j                  �1t!        | j                  «      dkD  rddlm} 	  || j                  «       | j*                  €'| j                  �t-        | j                  ¬«      | _        | j/                  d¬«      }t1        |«      }	 t3        |«      j4                  j7                  i |¥|j8                  xs ||j8                  xs |dœ¥¬«      ƒ d{  –—† }	|	S # t&        $ r}t        ddt)        |«      i¬«      ‚d}~ww xY w7 Œ/# t:        $ r/}t=        ||«      s‚ t        ddd| j>                  › d�i¬«      ‚d}~ww xY w­w)aÎ  
    Create a new budget object. Can apply this to teams, orgs, end-users, keys.

    Parameters:
    - budget_duration: Optional[str] - Budget reset period ("30d", "1h", etc.)
    - budget_id: Optional[str] - The id of the budget. If not provided, a new id will be generated.
    - max_budget: Optional[float] - The max budget for the budget.
    - soft_budget: Optional[float] - The soft budget for the budget.
    - max_parallel_requests: Optional[int] - The max number of parallel requests for the budget.
    - tpm_limit: Optional[int] - The tokens per minute limit for the budget.
    - rpm_limit: Optional[int] - The requests per minute limit for the budget.
    - model_max_budget: Optional[dict] - Specify max budget for a given model. Example: {"openai/gpt-4o-mini": {"max_budget": 100.0, "budget_duration": "1d", "tpm_limit": 100000, "rpm_limit": 100000}}
    - budget_reset_at: Optional[datetime] - Datetime when the initial budget is reset. Default is now.
    r   )ÚUniqueViolationError©Úlitellm_proxy_admin_nameÚprisma_clientNéô  Úerror©Ústatus_codeÚdetailé�  ú;max_budget must be a non-negative finite number. Received: ú<soft_budget must be a non-negative finite number. Received: ©Úvalidate_model_max_budget©Úbudget_durationT©Úexclude_none)Ú
created_byÚ
updated_by)ÚdatazBudget with id 'z' already exists.) Úprisma.errorsr   Úlitellm.proxy.proxy_serverr   r   r   ÚCommonProxyErrorsÚdb_not_connected_errorÚvalueÚ
max_budgetÚmathÚisfiniteÚsoft_budgetr   r$   Úmodel_max_budgetÚlenÚ;litellm.proxy.management_endpoints.key_management_endpointsr"   Ú
ValueErrorÚstrÚbudget_reset_atr
   Ú
model_dumpr   r   ÚtableÚcreateÚuser_idÚ	ExceptionÚ
isinstanceÚ	budget_id)
r   r   r   r   r   r"   ÚeÚbudget_obj_jsonÚbudget_obj_jsonifiedÚresponses
             úƒ/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/management_endpoints/budget_management_endpoints.pyÚ
new_budgetrE   "   sS  è ø€ õ. 3çRàÐÜØØÔ.×EÑE×KÑKÐLô
ð 	
ð ×ÑÐ(´$·-±-À
×@UÑ@UÔ2VÐZd×ZoÑZoÐrsÒZsÜØØÐZÐ[e×[pÑ[pÐZqÐrÐsô
ð 	
ð ×ÑÐ)´4·=±=À×AWÑAWÔ3XÐ\f×\rÑ\rÐuvÒ\vÜØØÐ[Ð\f×\rÑ\rÐ[sÐtÐuô
ð 	
ô
 ˜Z×7Ñ7Ô8ð ×"Ñ"Ð.´3°z×7RÑ7RÓ3SÐVWÒ3Wõ	
ð	KÙ% j×&AÑ&AÔBð
 ×!Ñ!Ð)¨j×.HÑ.HÐ.TÜ%:È:×KeÑKeÔ%fˆ
Ô"à'×2Ñ2ÀÐ2ÓE€OÜ5CÀOÓ5TÐð
Ü 0°Ó ?× EÑ E× LÑ LðØ&ðà/×7Ñ7ÒSÐ;SØ/×7Ñ7ÒSÐ;Sòð !Mó !
÷ 
ˆð €Oøô3 ò 	KÜ¨C¸Ä#ÀaÃ&Ð8IÔJÐJûð	Kúð
ùô ò 
Ü˜!Ð1Ô2ØÜØØÐ/°
×0DÑ0DÐ/EÐEVÐWÐXô
ð 	
ûð
üsb   ‚D#IÄ&G Ä8AIÆ	AH ÇHÇH ÇIÇ	HÇ$G<Ç<HÈIÈH È	H>È*H9È9H>È>Iz/budget/updatec              ƒ   ó6  K  — ddl m}m} |€'t        ddt        j
                  j                  i¬«      ‚| j                  €t        dddi¬«      ‚| j                  �Jt        j                  | j                  «      r| j                  dk  rt        ddd	| j                  › �i¬«      ‚| j                  �Jt        j                  | j                  «      r| j                  dk  rt        ddd
| j                  › �i¬«      ‚t        | j                  «       | j                  �1t        | j                  «      dkD  rddlm} 	  || j                  «       | j                  �&d| j(                  vrdt+        | j                  ¬«      ini }t-        i | j/                  d¬«      ¥|¥d|j0                  xs |i¥«      }t3        |«      j4                  j7                  d| j                  i|¬«      ƒ d{  –—† }|S # t$        $ r}t        ddt'        |«      i¬«      ‚d}~ww xY w7 Œ/­w)a�  
    Update an existing budget object.

    Parameters:
    - budget_duration: Optional[str] - Budget reset period ("30d", "1h", etc.)
    - budget_id: Optional[str] - The id of the budget. If not provided, a new id will be generated.
    - max_budget: Optional[float] - The max budget for the budget.
    - soft_budget: Optional[float] - The soft budget for the budget.
    - max_parallel_requests: Optional[int] - The max number of parallel requests for the budget.
    - tpm_limit: Optional[int] - The tokens per minute limit for the budget.
    - rpm_limit: Optional[int] - The requests per minute limit for the budget.
    - model_max_budget: Optional[dict] - Specify max budget for a given model. Example: {"openai/gpt-4o-mini": {"max_budget": 100.0, "budget_duration": "1d", "tpm_limit": 100000, "rpm_limit": 100000}}
    - budget_reset_at: Optional[datetime] - Update the Datetime when the budget was last reset.
    r   r   Nr   r   r   r   zbudget_id is requiredr   r    r!   r8   r#   T)Úexclude_unsetr(   r?   )Úwherer)   )r+   r   r   r   r,   r-   r.   r?   r/   r0   r1   r2   r   r$   r3   r4   r5   r"   r6   r7   Úmodel_fields_setr
   r   r9   r<   r   r:   Úupdate)	r   r   r   r   r"   r@   Úrecomputed_reset_atrB   rC   s	            rD   Úupdate_budgetrL   u   sA  è ø€ ÷. SàÐÜØØÔ.×EÑE×KÑKÐLô
ð 	
ð ×ÑÐ#Ü¨°WÐ>UÐ4VÔWÐWð ×ÑÐ(´$·-±-À
×@UÑ@UÔ2VÐZd×ZoÑZoÐrsÒZsÜØØÐZÐ[e×[pÑ[pÐZqÐrÐsô
ð 	
ð ×ÑÐ)´4·=±=À×AWÑAWÔ3XÐ\f×\rÑ\rÐuvÒ\vÜØØÐ[Ð\f×\rÑ\rÐ[sÐtÐuô
ð 	
ô
 ˜Z×7Ñ7Ô8ð ×"Ñ"Ð.´3°z×7RÑ7RÓ3SÐVWÒ3Wõ	
ð	KÙ% j×&AÑ&AÔBð ×%Ñ%Ð1Ð6GÈz×OjÑOjÑ6jð 
Ô1À*×B\ÑB\Ô]Ñ^àð ô 9Gð	
Ø×#Ñ#°$Ð#Ó7ð	
à!ð	
ð Ð+×3Ñ3ÒOÐ7Oñ	
ó9Ðô -¨]Ó;×AÑA×HÑHØ˜J×0Ñ0Ð1Ø!ð Ió ÷ €Hð
 €Oøô/ ò 	KÜ¨C¸Ä#ÀaÃ&Ð8IÔJÐJûð	Kúð$ús7   ‚D8HÄ;G. ÅBHÇ'HÇ(HÇ.	HÇ7HÈHÈHz/budget/infor)   c              ƒ   ó  K  — ddl m} |€t        dddi¬«      ‚t        | j                  «      dk(  rt        ddd	| j                  › �i¬«      ‚t        |«      j                  j                  d
d| j                  ii¬«      ƒ d{  –—† }|S 7 Œ­w)zŠ
    Get the budget id specific information

    Parameters:
    - budgets: List[str] - The list of budget ids to get information for
    r   ©r   Nr   r   zNo db connectedr   r   z0Specify list of budget id's to query. Passed in=r?   Úin©rH   )r+   r   r   r4   Úbudgetsr   r:   Ú	find_many)r)   r   rC   s      rD   Úinfo_budgetrS   Æ   s¡   è ø€ õ 9àÐÜ¨°WÐ>OÐ4PÔQÐQä
ˆ4�<‰<Ó˜AÒÜØØÐOÐPT×P\ÑP\È~Ð^Ð_ô
ð 	
ô -¨]Ó;×AÑA×KÑKØ˜T 4§<¡<Ð0Ð1ð Ló ÷ €Hð €Oð	ús   ‚BBÂBÂBz/budget/settingsr?   c           
   ƒ   ó¬  K  — ddl m} |€'t        ddt        j                  j
                  i¬«      ‚t        |«      s6t        ddt        j                  j
                  › d|j                  › �i¬«      ‚t        |«      j                  j                  d| i¬	«      ƒ d{  –—† }|�|j                  d
¬«      }ni }ddiddiddiddiddiddiddidœ}g }t        j                  j                  «       D ]\  \  }}||v sŒd
}	t!        |||   d   |j"                  xs d|j%                  |d«      |	|j&                  ¬«      }
|j)                  |
«       Œ^ |S 7 Œ´­w)zÑ
    Get list of configurable params + current value for a budget item + description of each field

    Used on Admin UI.

    Query Parameters:
    - budget_id: str - The budget id to get information for
    r   rN   Nr   r   r   ú, your role=r?   rP   Tr%   ÚtypeÚIntegerÚStringÚFloatÚObject)Úmax_parallel_requestsÚ	tpm_limitÚ	rpm_limitr$   r/   r2   r3   Ú )Ú
field_nameÚ
field_typeÚfield_descriptionÚfield_valueÚstored_in_dbÚfield_default_value)r+   r   r   r,   r-   r.   r   Únot_allowed_accessÚ	user_roler   r:   Ú
find_firstr9   ÚBudgetNewRequestÚmodel_fieldsÚitemsÚ
ConfigListÚdescriptionÚgetÚdefaultÚappend)r?   r   r   Údb_budget_rowÚdb_budget_row_dictÚallowed_argsÚ
return_valr_   Ú
field_infoÚ_stored_in_dbÚ_response_objs              rD   Úbudget_settingsrw   ã   sŸ  è ø€ õ" 9àÐÜØØÔ.×EÑE×KÑKÐLô
ð 	
ô
  Ð 1Ô2ÜØØÔ 1× DÑ D× JÑ JÐKÈ<ÐXi×XsÑXsÐWtÐuÐvô
ð 	
ô "2°-Ó!@×!FÑ!F×!QÑ!QÐYdÐfoÐXpÐ!QÓ!q×q€MàÐ Ø*×5Ñ5À4Ð5ÓHÑàÐð #)¨)Ð!4Ø˜iÐ(Ø˜iÐ(Ø" HÐ-Ø˜wÐ'Ø Ð(Ø# XÐ.ñ€Lð €Jä"2×"?Ñ"?×"EÑ"EÓ"Gò -Ñˆ
�JØ˜Ò%Ø ˆMä&Ø%Ø'¨
Ñ3°FÑ;Ø",×"8Ñ"8Ò">¸BØ.×2Ñ2°:¸tÓDØ*Ø$.×$6Ñ$6ôˆMð ×Ñ˜mÕ,ð-ð ÐðC rús   ‚BEÂEÂAEÃ<AEz/budget/listc              ƒ   óH  K  — ddl m} |€'t        ddt        j                  j
                  i¬«      ‚t        | «      s6t        ddt        j                  j
                  › d| j                  › �i¬«      ‚t        |«      j                  j                  «       ƒ d{  –—† }|S 7 Œ­w)z;List all the created budgets in proxy db. Used on Admin UI.r   rN   Nr   r   r   rU   )r+   r   r   r,   r-   r.   r   re   rf   r   r:   rR   )r   r   rC   s      rD   Úlist_budgetry   '  s£   è ø€ õ 9àÐÜØØÔ.×EÑE×KÑKÐLô
ð 	
ô
  Ð 1Ô2ÜØØÔ 1× DÑ D× JÑ JÐKÈ<ÐXi×XsÑXsÐWtÐuÐvô
ð 	
ô
 -¨]Ó;×AÑA×KÑKÓM×M€Hà€Oð Nús   ‚BB"ÂB ÂB"z/budget/deletec              ƒ   óˆ  K  — ddl m} |€'t        ddt        j                  j
                  i¬«      ‚|j                  t        j                  k7  r6t        ddt        j                  j
                  › d|j                  › �i¬«      ‚t        |«      j                  j                  d	| j                  i¬
«      ƒ d{  –—† }|S 7 Œ­w)zP
    Delete budget

    Parameters:
    - id: str - The budget id to delete
    r   rN   Nr   r   r   r   rU   r?   rP   )r+   r   r   r,   r-   r.   rf   ÚLitellmUserRolesÚPROXY_ADMINre   r   r:   ÚdeleteÚid)r)   r   r   rC   s       rD   Údelete_budgetr   C  sÁ   è ø€ õ 9àÐÜØØÔ.×EÑE×KÑKÐLô
ð 	
ð
 ×"Ñ"Ô&6×&BÑ&BÒBÜØØÔ 1× DÑ D× JÑ JÐKÈ<ÐXi×XsÑXsÐWtÐuÐvô
ð 	
ô
 -¨]Ó;×AÑA×HÑHÐP[Ð]a×]dÑ]dÐOeÐHÓf×f€Hà€Oð gús   ‚B7CÂ9C Â:C)%Ú__doc__r0   Úcollections.abcr   Útypingr   Úfastapir   r   r   Úlitellm.proxy._typesÚ$litellm.proxy.auth.user_api_key_authr	   Ú)litellm.proxy.common_utils.timezone_utilsr
   Ú/litellm.proxy.management_endpoints.common_utilsr   r   Úlitellm.proxy.utilsr   Ú&litellm.repositories.budget_repositoryr   r   Ú__annotations__Úpostrh   ÚUserAPIKeyAuthrE   rL   ÚBudgetRequestrS   rm   r7   rw   ry   ÚBudgetDeleteRequestr   © ó    rD   ú<module>r‘      s  ðòó Ý #Ý ç 5Ñ 5ä "Ý BÝ K÷õ /Ý Cá“€ˆÓ ð ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(BñKØ ðKà%òKóð
Kð\ ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(BñIØ ðIà%òIóð
IðX ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ð
˜Mò óð
ð0 ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(Bñ<Øð<à%ò<óð
<ð~ ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(BñØ%òóð
ð. ‡�ØØ
Ð	ÙÐ+Ó,Ð-ð ó ñ )0Ð0AÓ(BñØ
ðà%òóñ
r�   