Ë
    tPêjï  ã                   ó¦  — U d Z ddlmZmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlmZmZmZ ddlmZmZ dd	lmZ dd
lmZmZmZ ddlmZ ddlmZmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0  ee+¬«      Z1ee2d<   dZ3ee2d<    G d„ de«      Z4 G d„ de«      Z5 ee6e4df   «      Z7ee2d<    ee6e5df   «      Z8ee2d<   djs                  d„ e4jt                  D «       «      Z;ee2d<    edd¬ «       G d!„ d"«      «       Z<d#e4d$e4fd%„Z=d&ed$e#fd'„Z> e ee? e@d(«      ¬)«       eeA e@d*«      ¬)«       ee e@d+«      ¬)«      d,œ«      ZBeee?ef      e2d-<    e d. e@d/«       e@d0«      eB e&d1d¬2«      fd3d4e>e=d5¬6«
      ZCee e4e4f      e2d7<   e1j‰                  d8d9 ee«      fe/e4   ¬:«      d;ed<e
e ee«      f   d$e/e4   fd=„«       ZEy>)?z`GET /management/v1/budgets`.é    )ÚMappingÚSequence)Ú	dataclass)Údatetime)ÚMappingProxyType)Ú	AnnotatedÚFinal)Ú	APIRouterÚDependsÚRequest)Ú	BaseModelÚTypeAdapter)Úverbose_proxy_logger)ÚCommonProxyErrorsÚUserAPIKeyAuthÚuser_api_key_has_admin_view)Úuser_api_key_auth)ÚPROBLEM_TYPE_BASEÚManagementProblem)Ú
FilterSpecÚListSpecÚ	PredicateÚ	QueryPlanÚScopeÚScopeAllÚScopeDeniedÚSortKeyÚhandle_listÚorder_by_sqlÚ	where_sql)ÚMANAGEMENT_V1_PREFIX)ÚPrismaClient)ÚListResponseÚProblemDetail)ÚprefixÚrouterz"LiteLLM_BudgetTable"ÚBUDGET_TABLEc                   ó¨   — e Zd ZU dZeed<   dZedz  ed<   dZedz  ed<   dZ	e
dz  ed<   dZe
dz  ed<   dZedz  ed<   dZedz  ed	<   eed
<   eed<   y)ÚBudgetListItemaD  One budget as the Budgets page reads it, and as it comes back off the table.

    Validating the raw row through here is what makes `tpm_limit` / `rpm_limit`
    numbers: they are `BigInt?` in the schema, which the query engine hands back as
    decimal strings, and a quoted "60000" breaks arithmetic in the dashboard.
    Ú	budget_idNÚ
max_budgetÚsoft_budgetÚ	tpm_limitÚ	rpm_limitÚbudget_durationÚbudget_reset_atÚ
created_atÚ
updated_at)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__r+   Úfloatr,   r-   Úintr.   r/   r0   r   © ó    ú}/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/management_endpoints/management_v1/budgets.pyr)   r)   0   sn   … ñð ƒNØ#€J�˜‘Ó#Ø $€K�˜‘Ó$Ø €Iˆs�T‰zÓ Ø €Iˆs�T‰zÓ Ø"&€O�S˜4‘ZÓ&Ø'+€O�X ‘_Ó+ØÓØÔr<   r)   c                   ó   — e Zd ZU eed<   y)Ú	_RowCountÚcountN)r3   r4   r5   r:   r8   r;   r<   r=   r?   r?   C   s   … Ø„Jr<   r?   .Ú_BUDGET_ROWSÚ_ROW_COUNTSz, c              #   ó(   K  — | ]
  }d |› d �–— Œ y­w)ú"Nr;   )Ú.0Únames     r=   ú	<genexpr>rG   J   s   è ø€ Ò#X°D a¨ v¨Q¤KÑ#Xùs   ‚ÚSELECTED_COLUMNST)ÚfrozenÚslotsc                   óL   — e Zd ZU dZeed<   deedf   defd„Z	de
dee   fd„Zy	)
ÚPrismaBudgetListExecutorz¥The database half of the budgets list. Every caller-supplied value is bound to a
    placeholder by `where_sql`; only the spec's own column names reach the SQL text.Úprisma_clientÚwhere.Úreturnc              ƒ   óþ   K  — t        |«      \  }}dt        › �|rd|› �ndz   } | j                  j                  j                  |g|¢­Ž ƒ d {  –—† }t
        j                  |«      }|r|d   j                  S dS 7 Œ,­w)NzSELECT COUNT(*) AS count FROM ú WHERE Ú r   )r    r'   rM   ÚdbÚ	query_rawrB   Úvalidate_pythonr@   )ÚselfrN   ÚclausesÚparamsÚsqlÚrowsÚcounteds          r=   r@   zPrismaBudgetListExecutor.countT   s‡   è ø€ Ü# EÓ*‰ˆ�Ø5´l°^ÐDÑ_fÈ'ÐRYÐQZÑH[ÐlnÑoˆØ;˜D×.Ñ.×1Ñ1×;Ñ;¸CÐIÀ&ÒI×IˆÜ$×4Ñ4°TÓ:ˆÙ#*ˆw�q‰z×ÑÐ1°Ð1ð Jús   ‚AA=ÁA;Á-A=Úplanc              ƒ   óž  K  — t        |j                  «      \  }}dt        › dt        › �|rd|› �ndz   dt	        |j
                  «      › �z   dt        |«      dz   › dt        |«      d	z   › �z   } | j                  j                  j                  |g|¢|j                  ‘|j                  ‘­Ž ƒ d {  –—† }t        j                  |«      S 7 Œ­w)
NzSELECT z FROM rQ   rR   z
 ORDER BY z LIMIT $é   z	 OFFSET $é   )r    rN   rH   r'   r   ÚorderÚlenrM   rS   rT   ÚtakeÚskiprA   rU   )rV   r\   rW   rX   rY   rZ   s         r=   Ú	find_manyz"PrismaBudgetListExecutor.find_many[   sÙ   è ø€ Ü# D§J¡JÓ/‰ˆ�àÔ&Ð' v¬l¨^Ð<Ù&-�˜˜	Ñ"°2ñ7àœ<¨¯
©
Ó3Ð4Ð5ñ6ð œ˜V› q™Ð)¨´3°v³;À±?Ð2CÐDñEð 	ð <˜D×.Ñ.×1Ñ1×;Ñ;¸CÐ_À&Ð_È$Ï)É)Ð_ÐUY×U^ÑU^Ò_×_ˆÜ×+Ñ+¨DÓ1Ð1ð `ús   ‚B/CÂ1CÂ2CN)r3   r4   r5   r6   r"   r8   Útupler   r:   r@   r   r   r)   rd   r;   r<   r=   rL   rL   M   sD   … ñXð  Óð2  y°# ~Ñ!6ð 2¸3ó 2ð	2 Ið 	2°(¸>Ñ2Jô 	2r<   rL   ÚrowrO   c                 ó   — | S )zNThe row shape is the wire shape: the query selects exactly the columns served.r;   )rf   s    r=   Ú
_serializerh   g   s   € à€Jr<   Úcallerc                 ó^   — t        | «      r
t        «       S t        d| j                  › �¬«      S )Nz.Only proxy admins can list budgets, your role=)Úreason)r   r   r   Ú	user_role)ri   s    r=   Ú_scoperm   l   s,   € Ü" 6Ô*Ü‹zÐÜÐ NÈv×O_ÑO_ÐN`ÐaÔbÐbr<   )ÚinÚis_null)ÚtypeÚops)ÚgteÚltero   )rr   rs   )r/   r+   r1   ÚBUDGET_FILTERSÚbudgets)r*   r+   r-   r.   r1   )r*   r1   )ÚfieldÚ
descendingé2   éd   r*   )
ÚresourceÚsortableÚ
searchableÚfiltersÚdefault_sortÚdefault_page_sizeÚmax_page_sizeÚscopeÚ	serializeÚ
tiebreakerÚBUDGETS_LIST_SPECz/budgets)zbudget management)ÚtagsÚdependenciesÚresponse_modelÚrequestÚuser_api_key_dictc           	   ƒ   óv  K  — 	 ddl m} |€7t        t        t        › d�ddt
        j                  j                  ¬«      «      ‚t        t        t        |¬«      | |¬«      ƒ d{  –—† S 7 Œ# t        $ r ‚ t        $ r:}t        j                  d	|«       t        t        t        › d
�ddd¬«      «      ‚d}~ww xY w­w)a  
    The budgets defined on this proxy, paged, sortable and filterable, for the
    Budgets page.

    Readable by a proxy admin or an admin viewer; anyone else is refused 403. The
    older `/budget/list` answers with the whole table as a bare array and has no
    way to page, sort or filter it.

    `sort` takes a comma-separated list of `budget_id`, `max_budget`, `tpm_limit`,
    `rpm_limit` or `created_at`, each optionally prefixed with `-` for descending,
    and defaults to `-created_at`. `budget_id` is appended to every sort as the
    tiebreaker. `q` is a case-insensitive substring match on `budget_id`.
    `page_size` defaults to 50 and is capped at 100. Filters are
    `filter[budget_duration][in|is_null]`, `filter[max_budget][gte|lte|is_null]`
    and `filter[created_at][gte|lte]`.

    Example curl:
    ```
    curl --location --globoff 'http://0.0.0.0:4000/management/v1/budgets?sort=-max_budget&filter[budget_duration][in]=7d,30d&page_size=25'         --header 'Authorization: Bearer sk-1234'
    ```
    r   )rM   Nzdatabase-not-connectedzDatabase not connectedi÷  )rp   ÚtitleÚstatusÚdetail)ÚspecÚexecutorrˆ   ri   z_litellm.proxy.management_endpoints.management_v1.budgets.list_budgets(): Exception occured - %szinternal-server-errorzInternal server erroriô  zFailed to list budgets.)Úlitellm.proxy.proxy_serverrM   r   r$   r   r   Údb_not_connected_errorÚvaluer   r„   rL   Ú	Exceptionr   Ú	exception)rˆ   r‰   rM   Úes       r=   Úlist_budgetsr–   Š   sÑ   è ø€ ð@!
Ý<àÐ Ü#ÜÜ-Ð.Ð.DÐEØ2ØÜ,×CÑC×IÑIô	óð ô !Ü"Ü-¸MÔJØØ$ô	
÷ 
ð 	
ð 
ùô ò ØÜò 
Ü×&Ñ&ØmÐopô	
ô  ÜÜ)Ð*Ð*?Ð@Ø-ØØ0ô	ó
ð 	
ûð	
üs;   ‚B9„AA* Á#A(Á$A* Á'B9Á(A* Á*B6Á<5B1Â1B6Â6B9N)Fr6   Úcollections.abcr   r   Údataclassesr   r   Útypesr   Útypingr   r	   Úfastapir
   r   r   Úpydanticr   r   Úlitellm._loggingr   Úlitellm.proxy._typesr   r   r   Ú$litellm.proxy.auth.user_api_key_authr   Úlitellm.proxy.list_api.commonr   r   Ú%litellm.proxy.list_api.list_frameworkr   r   r   r   r   r   r   r   r   r   r    Ú7litellm.proxy.management_endpoints.management_v1.commonr!   Úlitellm.proxy.utilsr"   Ú6litellm.types.proxy.management_endpoints.management_v1r#   r$   r&   r8   r'   r)   r?   re   rA   rB   ÚjoinÚmodel_fieldsrH   rL   rh   rm   r7   Ú	frozensetr9   rt   r„   Úgetr–   r;   r<   r=   ú<module>r©      sD  ðÚ #ç -Ý !Ý Ý "ß #ç /Ñ /ß +å 1÷ñ õ
 C÷÷÷ ÷ ñ õ YÝ ,÷ñ
 Ð!5Ô6€ˆÓ 6à-€ˆeÓ -ô�Yô ô&�	ô ñ " %¨¸Ð(;Ñ"<Ó=€ˆeÓ =Ù   y°# ~Ñ!6Ó7€ˆUÓ 7àŸ)™)Ñ#X¸N×<WÑ<WÔ#XÓXÐ �%Ó Xñ �$˜dÔ#÷2ð 2ó $ð2ð2�Nð  ~ó ð
c�>ð c eó cñ 3Cá%¨3±IÐ>OÓ4PÔQÙ  e±Ð;TÓ1UÔVÙ  h±I¸nÓ4MÔNñó3€��g˜c :˜oÑ.Ñ/ó ñ FNØÙÐZÓ[Ù˜Ó(ØÙ ¸Ô>Ð@ØØØ
ØØôFÐ �5˜ .°.Ð"@ÑAÑBó ð ‡�ØØ	ÙÐ+Ó,Ð.Ø Ñ/ð	 ó ð;
Øð;
à  ±Ð9JÓ1KÐ!KÑLð;
ð �.Ñ!ò;
óñ;
r<   