Ë
    tPêjÐÜ ã                  óÎ  — U d dl mZ d dlZd dlZd dlZd dlZd dlmZmZm	Z	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 d dlmZ d dlZd dlmZmZ d dlmZmZ d d	lmZ d d
l m!Z!m"Z" d dl#m$Z$ d dl%m&Z&m'Z' d dl(m)Z) d dl*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9­ d dl9m:Z:m;Z;m<Z< d dl=m>Z>m?Z? erd dl@mAZA d dlBmCZC neZA ed«      ZDdeEd<    ede¬«      ZFdeEd<   dZGdeEd<    eHd«      ZId eEd!<    G d"„ d#eeF   «      ZJd4d$„ZK G d%„ d&e«      ZL G d'„ d(«      ZMd5d)„ZN G d*„ d+e«      ZOd6d,„ZP	 	 	 	 	 	 d7d-„ZQ	 d8dd.œ	 	 	 	 	 	 	 	 	 d9d/„ZRd:d0„ZS	 	 	 	 d;d1„ZTd<d2„ZUd=d3„ZVy)>é    )ÚannotationsN)Ú	AwaitableÚCallableÚMappingÚSequence)ÚdatetimeÚ	timedelta)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚProtocolÚTypeVarÚcast)Ú	BaseModel)Úprint_verboseÚverbose_logger)Úvalidate_rate_limit_categoryÚvalidate_rate_limit_type)ÚCustomLogger)ÚPrometheusLabelFactoryContextÚ)_get_cached_end_user_id_for_cost_tracking)ÚBoundedPrometheusSeriesTracker)Ú get_litellm_metadata_from_kwargsÚ&get_metadata_variable_name_from_kwargs)Ú.get_service_tier_from_standard_logging_payload)Ú LiteLLM_DeletedVerificationTokenÚLiteLLM_TeamTableÚLiteLLM_UserTableÚUserAPIKeyAuth)ÚBaseRepository)ÚOrganizationRepository)ÚTeamRepository)ÚUserRepository)ÚGuardrailEventHooks)Ú*)Ú_sanitize_prometheus_label_nameÚ _sanitize_prometheus_label_valueÚ:validate_prometheus_deployment_and_latency_caller_identity)Ú#StandardLoggingGuardrailInformationÚStandardLoggingPayload)ÚAsyncIOScheduler)ÚMetricWrapperBaseÚ_BudgetRowTr   Ú
_TableRowT)Úboundg      @Ú+_DEFAULT_BUDGET_METRICS_PER_REQUEST_TIMEOUT)Úguardrail_nameÚstatusÚ
error_typeÚ	hook_typeÚpurposeÚ	file_typeÚresultzFinal[frozenset[str]]Ú_NON_ENUM_METRIC_LABELSc                  ó8   — e Zd ZdZddœ	 	 	 	 	 	 	 	 	 dd„Zdd„Zy)Ú_PaginatedPrismaTablezMThe slice of a prisma table action surface used for budget-metric pagination.N)Úincludec             ƒ  ó   K  — y ­w©N© )ÚselfÚskipÚtakeÚorderr<   s        úd/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/prometheus.pyÚ	find_manyz_PaginatedPrismaTable.find_manyV   s   è ø€ ð ùó   ‚c              ƒ  ó   K  — y ­wr>   r?   ©r@   s    rD   Úcountz_PaginatedPrismaTable.count_   ó   è ø� ùrF   )
rA   ÚintrB   rK   rC   zMapping[str, str]r<   zMapping[str, bool] | NoneÚreturnzlist[_TableRowT])rL   rK   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rE   rI   r?   ó    rD   r;   r;   S   sF   „ ÙWð .2ñð ðð ð	ð
 !ðð +ðð 
óô &rQ   r;   c                óD   — t        t        t           | j                  «      S )zTView a repository's prisma table through the pagination surface budget metrics need.)r   r;   r/   Útable)Ú
repositorys    rD   Ú_paginated_tablerU   b   s    € äÜœjÑ)Ø×Ñóð rQ   c                  ó4   — e Zd ZdZedd„«       Zedd„«       Zy)Ú_OrgBudgetRowz3The budget columns joined onto an organization row.c                 ó   — y r>   r?   rH   s    rD   Ú
max_budgetz_OrgBudgetRow.max_budgetm   s   € Ø*-rQ   c                 ó   — y r>   r?   rH   s    rD   Úbudget_reset_atz_OrgBudgetRow.budget_reset_atp   s   € Ø25rQ   N)rL   úfloat | None)rL   údatetime | None)rM   rN   rO   rP   ÚpropertyrY   r[   r?   rQ   rD   rW   rW   j   s!   „ Ù=àÚ-ó Ø-àÚ5ó Ù5rQ   rW   c                  ó0   — e Zd ZdZ	 	 	 	 	 	 	 	 dd„Zdd„Zy)Ú_ExcludedLabelMetriczàProxies a prometheus metric whose declared ``labelnames`` had globally
    excluded labels removed, dropping those labels from every ``labels(...)``
    call so the emitted arguments always match the metric's real label set.c                ó.   — || _         || _        || _        y r>   )Ú_metricÚ_original_labelnamesÚ_excluded_labels)r@   ÚmetricÚoriginal_labelnamesÚexcluded_labelss       rD   Ú__init__z_ExcludedLabelMetric.__init__y   s   € ð ˆŒØ$7ˆÔ!Ø /ˆÕrQ   c                óè   ‡ ‡— |xs t        ˆfd„‰ j                  D «       «      }t        ˆ fd„t        ‰ j                  |«      D «       «      }|r ‰ j                  j                  |Ž S ‰ j                  S )Nc              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wr>   r?   )Ú.0ÚnameÚlabelkwargss     €rD   ú	<genexpr>z._ExcludedLabelMetric.labels.<locals>.<genexpr>„   s   øè ø€ Ò,eÀ4¨[¸Õ->Ñ,eùs   ƒc              3  óF   •K  — | ]  \  }}|‰j                   vsŒ|–— Œ y ­wr>   )rd   )rk   rl   Úvaluer@   s      €rD   rn   z._ExcludedLabelMetric.labels.<locals>.<genexpr>…   s(   øè ø€ ò #
Ù!�d˜EÈtÐ[_×[pÑ[pÒOpŒEñ#
ùs   ƒ!š!)Útuplerc   Úziprb   Úlabels)r@   Úlabelvaluesrm   ÚvaluesÚkept_valuess   ` `  rD   rs   z_ExcludedLabelMetric.labelsƒ   sh   ù€ Ø#Òe¤uÓ,eÈ4×KdÑKdÔ,eÓ'eˆÜ"ó #
Ü%(¨×)BÑ)BÀFÓ%Kô#
ó 
ˆñ 5@Ð"ˆt�|‰|×"Ñ" KÐ0ÐQÀTÇ\Á\ÐQrQ   N)re   r-   rf   ztuple[str, ...]rg   úfrozenset[str]rL   ÚNone)rt   Ústrrm   ry   rL   r-   )rM   rN   rO   rP   rh   rs   r?   rQ   rD   r`   r`   t   s9   „ ñOð0à!ð0ð -ð0ð (ð	0ð
 
ó0ôRrQ   r`   c                 óô   — t        j                  d«      } | €t        S 	 t        | «      }|�t        j                  |«      r|dk  r!t        j                  d| t        «       t        S |S # t        $ r d }Y ŒLw xY w)NÚ-PROMETHEUS_BUDGET_METRICS_PER_REQUEST_TIMEOUTr   zg[Non-Blocking] Prometheus: invalid PROMETHEUS_BUDGET_METRICS_PER_REQUEST_TIMEOUT=%r; using default %ss.)	ÚosÚgetenvr1   ÚfloatÚ
ValueErrorÚmathÚisfiniter   Údebug)ÚrawÚparseds     rD   Ú'_get_budget_metrics_per_request_timeoutr…   ‹   s|   € Ü—‘ÐJÓK€CØ
€{Ü:Ð:ðÜ�s“ˆð €~œTŸ]™]¨6Ô2°fÀ²kÜ×ÑØuØÜ7ô	
ô
 ;Ð:Ø€Møô ò ØŠðús   ŸA) Á)A7Á6A7c                  óv  — e Zd Z eej
                  j                  ej                  j                  f«      Ze	ddd„«       Z
d„ Zded„Zdfd„Ze	dgd„«       Zdhd„Zdid„Zdjd„Zdkd	„Zdld
„Zdmd„Z	 	 	 	 	 	 	 	 dnd„Zdod„Zdpd„Zdqd„Zdrd„Zd„ Zdsd„Ze	dtd„«       Ze		 	 	 	 dud„«       Z	 dv	 	 	 	 	 	 	 dwd„Z	 	 	 	 	 	 	 	 dxd„Z	 	 dy	 	 	 	 	 	 	 	 	 	 	 dzd„Z d„ Z!	 dv	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d{d„Z"	 dv	 	 	 	 	 	 	 dwd„Z#	 dv	 	 	 	 	 	 	 dwd„Z$	 dv	 	 	 	 	 	 	 d|d„Z%	 dv	 	 	 	 	 d}d„Z&e	d~d„«       Z'e	dd „«       Z(	 	 	 	 	 	 	 	 d€d!„Z)	 	 d�	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d‚d"„Z*	 dv	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dƒd#„Z+e		 	 	 	 	 	 d„d$„«       Z,	 dv	 	 	 	 	 	 	 	 	 d…d%„Z-	 dv	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d†d&„Z.d'„ Z/	 	 	 d‡	 	 	 	 	 	 	 dˆd(„Z0	 dv	 	 	 	 	 d‰d)„Z1	 	 	 	 	 dŠ	 	 	 	 	 	 	 	 	 	 	 d‹d*„Z2e	dŒd+„«       Z3	 dv	 	 	 	 	 	 	 d�d,„Z4dŽd-„Z5dvd�d.„Z6d�d/„Z7d‘d0„Z8	 	 	 	 	 	 	 	 	 	 	 	 d’d1„Z9	 dv	 	 	 	 	 	 	 dwd2„Z:	 	 d“	 	 	 	 	 	 	 d”d3„Z;	 	 	 	 	 	 	 	 	 	 d•d4„Z<	 	 	 	 	 	 	 	 	 	 d–d5„Z=	 	 	 d‡	 	 	 	 	 	 	 	 	 	 	 d—d6„Z>	 	 d�	 	 	 	 	 d˜d7„Z?	 	 	 	 	 	 	 	 	 	 d–d8„Z@d™d9„ZA	 dv	 	 	 dšd:„ZBd›d;„ZCe	dœd<„«       ZDe		 	 	 	 d�d=„«       ZEdžd>„ZFdžd?„ZG	 	 	 	 	 	 	 	 	 	 dŸd@„ZH	 	 	 	 	 	 	 	 d dA„ZI	 	 	 	 	 	 	 	 d¡dB„ZJ	 	 	 	 	 	 	 	 d¡dC„ZK	 	 	 	 	 	 	 	 	 	 d¢dD„ZL	 	 d£dE„ZMd¤dF„ZNd¥dG„ZO	 	 	 	 	 	 d¦dH„ZPdI„ ZQdJ„ ZRdK„ ZSdL„ ZTdM„ ZUdN„ ZVdO„ ZW	 	 	 	 d§dP„ZXd¨dQ„ZYd©dR„ZZdªdS„Z[	 	 	 	 	 	 	 	 	 	 d«dT„Z\	 	 	 	 	 	 	 	 	 	 	 	 d¬dU„Z]	 	 d­dV„Z^d®dW„Z_	 	 	 	 d¯dX„Z`	 	 	 	 	 	 	 	 	 	 d°dY„Zad±dZ„Zb	 	 	 	 	 	 	 	 	 	 d²d[„Zc	 	 	 	 	 	 	 	 	 	 	 	 d³d\„Zd	 	 	 	 	 	 	 	 d´d]„Ze	 	 	 	 	 	 	 	 	 	 dµd^„Zf	 	 d¶d_„Zgd·d`„Zh	 	 	 	 	 	 d¸da„Zie	d¹db„«       Zje	dc„ «       Zky)ºÚPrometheusLoggerc                 óV   — ddl } | j                  D ]  }t        |t        «      sŒ|c S  y)zIFind the PrometheusLogger instance from litellm.callbacks, if registered.r   N)ÚlitellmÚ	callbacksÚ
isinstancer‡   )r‰   Úcbs     rD   Úget_instancezPrometheusLogger.get_instance¢   s1   € ó 	à×#Ñ#ò 	ˆBÜ˜"Ô.Õ/Ø’	ð	ð rQ   c                ó  — 	 ddl m}m}m} t	        «        | j                  «       | _        | j                  «       \  | _        | _	        i | _
        t        j                  }|�t        |«      nt        | _        t!        «       | _        | j%                  |«      | _        | j%                  |«      | _        | j%                  |«      | _        | j'                  dd| j-                  d«      ¬«      | _        | j'                  dd| j-                  d«      ¬«      | _        | j+                  dd	| j-                  d«      | j                  ¬
«      | _        | j+                  dd| j-                  d«      | j                  ¬
«      | _        | j+                  dd| j-                  d«      | j                  ¬
«      | _        | j'                  dd| j-                  d«      ¬«      | _        | j'                  dd| j-                  d«      ¬«      | _        | j'                  dd| j-                  d«      ¬«      | _        | j'                  dd| j-                  d«      ¬«      | _        | j'                  dd| j-                  d«      ¬«      | _         | j'                  dd| j-                  d«      ¬«      | _!        | j'                  dd| j-                  d«      ¬«      | _"        | j'                  dd| j-                  d«      ¬«      | _#        | j'                  d d!| j-                  d «      ¬«      | _$        | j'                  d"d#| j-                  d"«      ¬«      | _%        | j'                  d$d%| j-                  d$«      ¬«      | _&        | j)                  d&d'| j-                  d&«      ¬«      | _'        | j)                  d(d)| j-                  d(«      ¬«      | _(        | j)                  d*d+| j-                  d*«      ¬«      | _)        | j)                  d,d-| j-                  d,«      ¬«      | _*        | j)                  d.d/| j-                  d.«      ¬«      | _+        | j)                  d0d1| j-                  d0«      ¬«      | _,        | j)                  d2d3| j-                  d2«      ¬«      | _-        | j)                  d4d5| j-                  d4«      ¬«      | _.        | j)                  d6d7| j-                  d6«      ¬«      | _/        | j)                  d8d9| j-                  d8«      ¬«      | _0        | j)                  d:d;| j-                  d:«      ¬«      | _1        | j)                  d<d=| j-                  d<«      ¬«      | _2        | j)                  d>d?| j-                  d>«      ¬«      | _3        | j)                  d@dA| j-                  d@«      ¬«      | _4        | j)                  dBdC| j-                  dB«      ¬«      | _5        | j)                  dDdE| j-                  dD«      ¬«      | _6        | j)                  dFdG| j-                  dF«      ¬«      | _7        | j+                  dHdI| j-                  dH«      | j                  ¬
«      | _8        | j+                  dJdK| j-                  dJ«      | j                  ¬
«      | _9        | j+                  dLdM| j-                  dL«      | j                  ¬
«      | _:        | j+                  dNdOg dP¢| j                  ¬
«      | _;        | j'                  dQdRg dS¢¬«      | _<        | j'                  dTdUg dV¢¬«      | _=        | j)                  dWdXdYg¬«      | _>        | j)                  dZd[| j-                  dZ«      ¬«      | _?        | j)                  d\d]| j-                  d\«      ¬«      | _@        | j)                  d^d_| j-                  d^«      ¬«      | _A        | j'                  d`da| j-                  d`«      ¬«      | _B        | j'                  dbdc| j-                  db«      ¬«      | _C        | j'                  ddde| j-                  dd«      ¬«      | _D        | j'                  dfdg| j-                  df«      ¬«      | _E        | j+                  dhdi| j-                  dh«      ¬«      | _F        | j'                  djdk| j-                  dj«      «      | _G        | j'                  dldm| j-                  dl«      «      | _H        | j'                  dndodpg¬«      | _I        | j'                  dqdr| j-                  dq«      ¬«      | _J        | j'                  dsdt| j-                  ds«      ¬«      | _K        | j'                  dudv| j-                  du«      ¬«      | _L        | j'                  dwdx| j-                  dw«      ¬«      | _M        | j'                  dydz| j-                  dy«      ¬«      | _N        | j'                  d{d|| j-                  d{«      ¬«      | _O        | j'                  d}d~| j-                  d}«      ¬«      | _P        | j)                  dd€g ¬«      | _Q        | j)                  d�d‚g ¬«      | _R        | j)                  dƒd„g ¬«      | _S        | j'                  d…d†g d‡¢¬«      | _T        | j)                  dˆd‰g dŠ¢¬«      | _U        | j+                  d‹dŒd�dYgt¬        ¬
«      | _W        | j'                  dŽd�g d‡¢¬«      | _X        | j'                  d�d‘d’g¬«      | _Y        | j)                  d“d”g ¬«      | _Z        | j'                  d•d–d�dYg¬«      | _[        | j'                  d—d˜d™g¬«      | _\        | j)                  dšd›g ¬«      | _]        | j'                  dœd�| j-                  dœ«      ¬«      | _^        | j'                  dždŸ| j-                  dž«      ¬«      | __        y # tÀ        $ r}tÃ        d |› �«       |‚d }~ww xY w)¡Nr   )ÚCounterÚGaugeÚ	HistogramÚ$litellm_proxy_failed_requests_metriczjTotal number of failed responses from proxy - the client did not get a success response from litellm proxy)rl   ÚdocumentationÚ
labelnamesÚ#litellm_proxy_total_requests_metriczXTotal number of requests made to the proxy server - track number of client side requestsÚ$litellm_request_total_latency_metriczæEnd-to-end latency (seconds) for a request to LiteLLM Proxy Server, from the moment the request reached the proxy through the end of processing -- includes authentication, pre-call hooks, the LLM API call, and post-call processing)r”   ÚbucketsÚlitellm_llm_api_latency_metricz1Total latency (seconds) for a models LLM API callÚ*litellm_llm_api_time_to_first_token_metricz-Time to first token for a models LLM API callÚlitellm_spend_metriczTotal spend on LLM requests)r”   Úlitellm_total_tokens_metricz7Total number of input + output tokens from LLM requestsÚlitellm_input_tokens_metricz.Total number of input tokens from LLM requestsÚlitellm_output_tokens_metricz/Total number of output tokens from LLM requestsÚ"litellm_input_cached_tokens_metriczvProvider-side cached input tokens (e.g. OpenAI prompt_tokens_details.cached_tokens, Anthropic cache_read_input_tokens)Ú*litellm_input_cache_creation_tokens_metricz_Provider-side input tokens written to prompt cache (e.g. Anthropic cache_creation_input_tokens)Ú!litellm_input_audio_tokens_metriczAAudio input tokens reported in prompt_tokens_details.audio_tokensÚ&litellm_output_reasoning_tokens_metriczGReasoning tokens reported in completion_tokens_details.reasoning_tokensÚ"litellm_output_audio_tokens_metriczFAudio output tokens reported in completion_tokens_details.audio_tokensÚ%litellm_video_duration_seconds_metriczQSeconds of video generated, from usage.duration_seconds on video generation callsÚlitellm_images_generated_metricz>Number of images generated, from the image generation responseÚ$litellm_remaining_team_budget_metriczRemaining budget for teamÚlitellm_team_max_budget_metriczMaximum budget set for teamÚ*litellm_team_budget_remaining_hours_metricz*Remaining days for team budget to be resetÚlitellm_team_members_metriczNumber of members in a teamÚ#litellm_remaining_org_budget_metriczRemaining budget for orgÚlitellm_org_max_budget_metriczMaximum budget set for orgÚ)litellm_org_budget_remaining_hours_metricz*Remaining hours for org budget to be resetÚ'litellm_remaining_api_key_budget_metriczRemaining budget for api keyÚ!litellm_api_key_max_budget_metriczMaximum budget set for api keyÚ-litellm_api_key_budget_remaining_hours_metricz.Remaining hours for api key budget to be resetÚ$litellm_remaining_user_budget_metriczRemaining budget for userÚlitellm_user_max_budget_metriczMaximum budget set for userÚ*litellm_user_budget_remaining_hours_metricz+Remaining hours for user budget to be resetÚ,litellm_remaining_api_key_requests_for_modelzLRemaining Requests API Key can make for model (model based rpm limit on key)Ú*litellm_remaining_api_key_tokens_for_modelzJRemaining Tokens API Key can make for model (model based tpm limit on key)Ú!litellm_remaining_requests_metriczWLLM Deployment Analytics - remaining requests for model, returned from LLM API ProviderÚlitellm_remaining_tokens_metricz:remaining tokens for model, returned from LLM API ProviderÚlitellm_overhead_latency_metricz;Latency overhead (milliseconds) added by LiteLLM processingÚ/litellm_overhead_with_guardrails_latency_metriczqTotal internal latency (seconds) added by LiteLLM, including pre/post-call guardrails (excludes the LLM API call)Ú"litellm_request_queue_time_secondsz‹Time (seconds) from request arrival at the proxy to the start of pre-call processing -- includes authentication and any ASGI-level queueingÚ!litellm_guardrail_latency_secondsz)Latency (seconds) for guardrail execution©r2   r3   r4   r5   Úlitellm_guardrail_errors_totalz=Total number of errors encountered during guardrail execution©r2   r4   r5   Ú litellm_guardrail_requests_totalz%Total number of guardrail invocations©r2   r3   r5   Ú(litellm_provider_remaining_budget_metriczHRemaining budget for provider - used when you set provider budget limitsÚapi_providerÚlitellm_deployment_statezlLLM Deployment Analytics - The state of the deployment: 0 = healthy, 1 = partial outage, 2 = complete outageÚlitellm_deployment_tpm_limitz$Deployment TPM limit found in configÚlitellm_deployment_rpm_limitz$Deployment RPM limit found in configÚlitellm_deployment_cooled_downzÊLLM Deployment Analytics - Number of times a deployment has been cooled down by LiteLLM load balancing logic. exception_status is the status of the exception that caused the deployment to be cooled downÚ$litellm_deployment_success_responseszOLLM Deployment Analytics - Total number of successful LLM API calls via litellmÚ$litellm_deployment_failure_responseszŸLLM Deployment Analytics - Total number of failed LLM API calls for a specific LLM deploymeny. exception_status is the status of the exception from the llm apiÚ!litellm_deployment_total_requestszXLLM Deployment Analytics - Total number of LLM API calls via litellm - success + failureÚ+litellm_deployment_latency_per_output_tokenz3LLM Deployment Analytics - Latency per output tokenÚ'litellm_deployment_successful_fallbackszfLLM Deployment Analytics - Number of successful fallback requests from primary model -> fallback modelÚ#litellm_deployment_failed_fallbackszbLLM Deployment Analytics - Number of failed fallback requests from primary model -> fallback modelÚ(litellm_callback_logging_failures_metriczTTotal number of failures when emitting logs to callbacks (e.g. s3_v2, langfuse, etc)Úcallback_nameÚ&litellm_llm_api_failed_requests_metricz5deprecated - use litellm_proxy_failed_requests_metricÚlitellm_requests_metricz€deprecated - use litellm_proxy_total_requests_metric. Total number of LLM calls to litellm - track total per API Key, team, userÚlitellm_cache_hits_metricz"Total number of LiteLLM cache hitsÚlitellm_cache_misses_metricz$Total number of LiteLLM cache missesÚlitellm_cached_tokens_metricz&Total tokens served from LiteLLM cacheÚ/litellm_provider_cache_read_input_tokens_metricz`Total prompt/input tokens read from provider prompt cache (e.g. OpenAI/Anthropic/Gemini/Bedrock)Ú3litellm_provider_cache_creation_input_tokens_metriczSTotal prompt/input tokens written to provider prompt cache (e.g. Anthropic/Bedrock)Úlitellm_total_usersz Total number of users in LiteLLMÚlitellm_active_userszENumber of billable users in LiteLLM (excludes SCIM-deactivated users)Úlitellm_teams_countz Total number of teams in LiteLLMÚ#litellm_managed_batch_created_totalz'Total number of managed batches created©ÚmodelrÀ   ÚuserÚ
user_emailÚapi_key_aliasÚlitellm_managed_file_size_bytesz[Size of the most recent managed batch file in bytes (last-seen value per label combination)©r6   r7   rÙ   rÀ   rÚ   Ú&litellm_managed_batch_duration_secondszLDuration of completed managed batches in seconds (completed_at - created_at)rÙ   Ú"litellm_managed_file_created_totalz%Total number of managed files createdÚ"litellm_managed_file_deleted_totalz;Total number of managed file deletions (success or blocked)r8   Ú$litellm_check_batch_cost_jobs_polledzCNumber of unprocessed batches found by the last CheckBatchCost pollÚ-litellm_check_batch_cost_jobs_processed_totalzCTotal number of batches successfully cost-tracked by CheckBatchCostÚ%litellm_check_batch_cost_errors_totalz6Total number of errors in CheckBatchCost by error typer4   Ú+litellm_check_batch_cost_last_run_timestampz1Unix timestamp of the last CheckBatchCost job runÚlitellm_mcp_tool_calls_totalz7Total MCP tool calls, segmented by tool and server nameÚ"litellm_mcp_tool_call_spend_metricz@Total spend on MCP tool calls, segmented by tool and server namez(Got exception on init prometheus client )bÚprometheus_clientr�   r�   r‘   r)   Ú_parse_prometheus_configÚlabel_filtersÚ_parse_exclude_configÚexclude_metricsÚexclude_labelsÚ_cached_metric_labelsr‰   Úprometheus_latency_bucketsrq   ÚLATENCY_BUCKETSÚlatency_bucketsr   Ú"_bounded_prometheus_series_trackerÚ_create_metric_factoryÚ_counter_factoryÚ_gauge_factoryÚ_histogram_factoryÚget_labels_for_metricr’   r•   r–   r˜   r™   rš   Úlitellm_tokens_metricrœ   r�   rž   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   r¯   r°   r±   r²   r³   r´   rµ   r¶   r·   Ú!litellm_request_queue_time_metricÚ litellm_guardrail_latency_metricr»   r½   r¿   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   rÊ   rË   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   rÓ   Úlitellm_total_users_metricÚlitellm_active_users_metricÚlitellm_teams_count_metricr×   rÝ   ÚBATCH_DURATION_BUCKETSrß   rà   rá   râ   rã   rä   rå   ræ   rç   Ú	Exceptionr   )r@   Úkwargsr�   r�   r‘   Ú_custom_bucketsÚes          rD   rh   zPrometheusLogger.__init__¬   s#  € ðc	ßCÑCô
 GÔHð "&×!>Ñ!>Ó!@ˆDÔà8<×8RÑ8RÓ8TÑ5ˆDÔ  $Ô"5ð @BˆDÔ&ä%,×%GÑ%GˆOØ=LÐ=X¤5¨Ô#9Ô^mˆDÔ Ü6TÓ6VˆDÔ3ð %)×$?Ñ$?ÀÓ$HˆDÔ!Ø"&×"=Ñ"=¸eÓ"DˆDÔØ&*×&AÑ&AÀ)Ó&LˆDÔ#à8<×8MÑ8MØ;ð KØ×5Ñ5Ð6\Ó]ð 9Nó 9ˆDÔ5ð 8<×7LÑ7LØ:ØxØ×5Ñ5Ð6[Ó\ð 8Mó 8ˆDÔ4ð 9=×8OÑ8OØ6ð]ð  ×5Ñ5Ð6\Ó]Ø×,Ñ,ð 9Pó 9ˆDÔ5ð 37×2IÑ2IØ0ØCØ×5Ñ5Ð6VÓWØ×,Ñ,ð	 3Jó 3ˆDÔ/ð ?C×>UÑ>UØ<Ø?ð  ×5Ñ5Ð6bÓcØ×,Ñ,ð ?Vó ?ˆDÔ;ð )-×(=Ñ(=Ø&Ø-Ø×5Ñ5Ð6LÓMð )>ó )ˆDÔ%ð *.×)>Ñ)>Ø-ØIØ×5Ñ5Ð6SÓTð *?ó *ˆDÔ&ð 04×/DÑ/DØ-Ø@Ø×5Ñ5Ð6SÓTð 0Eó 0ˆDÔ,ð 15×0EÑ0EØ.ØAØ×5Ñ5Ð6TÓUð 1Fó 1ˆDÔ-ð 7;×6KÑ6KØ4ð IØ×5Ñ5Ð6ZÓ[ð 7Ló 7ˆDÔ3ð ?C×>SÑ>SØ<ØqØ×5Ñ5Ð6bÓcð ?Tó ?ˆDÔ;ð 6:×5JÑ5JØ3ØSØ×5Ñ5Ð6YÓZð 6Kó 6ˆDÔ2ð ;?×:OÑ:OØ8ØYØ×5Ñ5Ð6^Ó_ð ;Pó ;ˆDÔ7ð 7;×6KÑ6KØ4ØXØ×5Ñ5Ð6ZÓ[ð 7Ló 7ˆDÔ3ð :>×9NÑ9NØ7ØcØ×5Ñ5Ð6]Ó^ð :Oó :ˆDÔ6ð 48×3HÑ3HØ1ØPØ×5Ñ5Ð6WÓXð 4Ió 4ˆDÔ0ð 9=×8KÑ8KØ6Ø+Ø×5Ñ5Ð6\Ó]ð 9Ló 9ˆDÔ5ð 37×2EÑ2EØ0Ø-Ø×5Ñ5Ð6VÓWð 3Fó 3ˆDÔ/ð ?C×>QÑ>QØ<Ø<Ø×5Ñ5Ð6bÓcð ?Ró ?ˆDÔ;ð 04×/BÑ/BØ-Ø-Ø×5Ñ5Ð6SÓTð 0Có 0ˆDÔ,ð 8<×7JÑ7JØ5Ø*Ø×5Ñ5Ð6[Ó\ð 8Kó 8ˆDÔ4ð 26×1DÑ1DØ/Ø,Ø×5Ñ5Ð6UÓVð 2Eó 2ˆDÔ.ð >B×=PÑ=PØ;Ø<Ø×5Ñ5Ð6aÓbð >Qó >ˆDÔ:ð <@×;NÑ;NØ9Ø.Ø×5Ñ5Ð6_Ó`ð <Oó <ˆDÔ8ð 6:×5HÑ5HØ3Ø0Ø×5Ñ5Ð6YÓZð 6Ió 6ˆDÔ2ð BF×ATÑATØ?Ø@Ø×5Ñ5Ð6eÓfð BUó BˆDÔ>ð 9=×8KÑ8KØ6Ø+Ø×5Ñ5Ð6\Ó]ð 9Ló 9ˆDÔ5ð 37×2EÑ2EØ0Ø-Ø×5Ñ5Ð6VÓWð 3Fó 3ˆDÔ/ð ?C×>QÑ>QØ<Ø=Ø×5Ñ5Ð6bÓcð ?Ró ?ˆDÔ;ð AE×@SÑ@SØ>Ø^Ø×5Ñ5Ð6dÓeð ATó AˆDÔ=ð ?C×>QÑ>QØ<Ø\Ø×5Ñ5Ð6bÓcð ?Ró ?ˆDÔ;ð 6:×5HÑ5HØ3ØiØ×5Ñ5Ð6YÓZð 6Ió 6ˆDÔ2ð 48×3FÑ3FØ1ØLØ×5Ñ5Ð6WÓXð 4Gó 4ˆDÔ0ð 48×3JÑ3JØ1ØMØ×5Ñ5Ð6WÓXØ×,Ñ,ð	 4Kó 4ˆDÔ0ð DH×CZÑCZØAðGà×5Ñ5Ð6gÓhØ×,Ñ,ð D[ó DˆDÔ@ð 6:×5LÑ5LØ4ðTà×5Ñ5Ð6ZÓ[Ø×,Ñ,ð 6Mó 6ˆDÔ2ð 59×4KÑ4KØ3Ø;ÚRØ×,Ñ,ð	 5Ló 5ˆDÔ1ð 37×2GÑ2GØ0ØOÚHð 3Hó 3ˆDÔ/ð 59×4IÑ4IØ2Ø7ÚDð 5Jó 5ˆDÔ1ð =A×<OÑ<OØ:ØZØ*Ð+ð =Pó =ˆDÔ9ð -1×,?Ñ,?Ø*Ø~Ø×5Ñ5Ð6PÓQð -@ó -ˆDÔ)ð 15×0CÑ0CØ.Ø6Ø×5Ñ5Ð6TÓUð 1Dó 1ˆDÔ-ð 15×0CÑ0CØ.Ø6Ø×5Ñ5Ð6TÓUð 1Dó 1ˆDÔ-ð 37×2GÑ2GØ0ð ]à×5Ñ5Ð6VÓWð	 3Hó 3ˆDÔ/ð 9=×8MÑ8MØ;ØoØ×5Ñ5Ð6\Ó]ð 9Nó 9ˆDÔ5ð
 9=×8MÑ8MØ;ð @Ø×5Ñ5Ð6\Ó]ð 9Nó 9ˆDÔ5ð 6:×5JÑ5JØ8ØxØ×5Ñ5Ð6YÓZð 6Kó 6ˆDÔ2ð @D×?VÑ?VØBØSØ×5Ñ5Ð6cÓdð @Wó @ˆDÔ<ð <@×;PÑ;PØ9ØxØ×*Ñ*Ð+TÓUó<ˆDÔ8ð 8<×7LÑ7LØ5ØtØ×*Ñ*Ð+PÓQó8ˆDÔ4ð =A×<QÑ<QØ?ØtØ+Ð,ð =Ró =ˆDÔ9ð ;?×:OÑ:OØ=ØUØ×5Ñ5Ð6^Ó_ð ;Pó ;ˆDÔ7ð ,0×+@Ñ+@Ø.ð aØ×5Ñ5Ð6OÓPð ,Aó ,ˆDÔ(ð .2×-BÑ-BØ0ØBØ×5Ñ5Ð6QÓRð .Có .ˆDÔ*ð 04×/DÑ/DØ2ØDØ×5Ñ5Ð6SÓTð 0Eó 0ˆDÔ,ð 15×0EÑ0EØ3ØFØ×5Ñ5Ð6TÓUð 1Fó 1ˆDÔ-ð DH×CXÑCXØFð AØ×5Ñ5Ð6gÓhð DYó DˆDÔ@ð HL×G\ÑG\ØJØsØ×5Ñ5Ð6kÓlð H]ó HˆDÔDð /3×.AÑ.AØ%Ø2Øð /Bó /ˆDÔ+ð 04×/BÑ/BØ&ØWØð 0Có 0ˆDÔ,ð /3×.AÑ.AØ%Ø2Øð /Bó /ˆDÔ+ð 8<×7LÑ7LØ:ØGòð 8Mó 
8ˆDÔ4ð 48×3FÑ3FØ1ØmÚTð 4Gó 4ˆDÔ0ð ;?×:QÑ:QØ8Ø^Ø# ^Ð4Ü.ð	 ;Ró ;ˆDÔ7ð 7;×6KÑ6KØ9ØEòð 7Ló 
7ˆDÔ3ð 7;×6KÑ6KØ9Ø[Ø$˜:ð 7Ló 7ˆDÔ3ð 9=×8KÑ8KØ6ØUØð 9Ló 9ˆDÔ5ð BF×AVÑAVØDØcØ# ^Ð4ð BWó BˆDÔ>ð :>×9NÑ9NØ<ØVØ(˜>ð :Oó :ˆDÔ6ð @D×?RÑ?RØ=ØCØð @Só @ˆDÔ<ð 15×0EÑ0EØ3ØWØ×5Ñ5Ð6TÓUð 1Fó 1ˆDÔ-ð 7;×6KÑ6KØ9Ø`Ø×5Ñ5Ð6ZÓ[ð 7Ló 7ˆDÕ3øô ò 	ÜÐDÀQÀCÐHÔIØˆGûð	ús   ‚m+m. í.	ní7nînc                ó*  — ddl }ddlm} |j                  }|si S t	        j
                  d|«       g }t        «       | _        |D ]S  }t        |t        «      r	 |di |¤Ž}n|}|j                  |«       | j                  j                  |j                  «       ŒU | j                  |«      }|j                  r:| j                  |«       ddj!                  |j"                  «      z   }t%        |«      ‚| j'                  |«      }	| j)                  |	«       |	S )zNParse prometheus metrics configuration for label filtering and enabled metricsr   N)ÚPrometheusMetricsConfigzprometheus config: %sz!Configuration validation failed:
ú
r?   )r‰   Ú%litellm.types.integrations.prometheusr  Úprometheus_metrics_configr   r‚   ÚsetÚenabled_metricsr‹   ÚdictÚappendÚupdateÚmetricsÚ_validate_all_configurationsÚ
has_errorsÚ_pretty_print_validation_errorsÚjoinÚall_error_messagesr   Ú_build_label_filtersÚ_pretty_print_prometheus_config)
r@   r‰   r  ÚconfigÚparsed_configsÚgroup_configÚparsed_configÚvalidation_resultsÚerror_messagerê   s
             rD   ré   z)PrometheusLogger._parse_prometheus_configÕ  s
  € ãÝQà×9Ñ9ˆñ ØˆIä×ÑÐ4°fÔ=ð !#ˆÜ"›uˆÔà"ò 	?ˆLÜ˜,¬Ô-Ù 7Ñ G¸,Ñ G‘à ,�à×!Ñ! -Ô0Ø× Ñ ×'Ñ'¨×(=Ñ(=Õ>ð	?ð %)×$EÑ$EÀnÓ$UÐà×(Ò(Ø×0Ñ0Ð1CÔDØ@À4Ç9Á9ÐM_×MrÑMrÓCsÑsˆMÜ˜]Ó+Ð+ð  $×8Ñ8¸ÓHˆð 	×,Ñ,¨]Ô;ØÐrQ   c                ól  — ddl m} ddl}t        |j                  xs d«      }t        |j
                  xs d«      }t         |t        «      «      }t        ||z
  «      }| j                  «       }t        ||z
  «      }g d„ |D «       ¢d„ |D «       ¢­}	|	rt        ddj                  |	«      z   «      ‚||fS )	zPParse and validate the global ``exclude_metrics`` / ``exclude_labels`` settings.r   ©Úget_argsNr?   c              3  ó&   K  — | ]	  }d |› �–— Œ y­w)z3Invalid metric name in prometheus_exclude_metrics: Nr?   )rk   re   s     rD   rn   z9PrometheusLogger._parse_exclude_config.<locals>.<genexpr>  s   è ø€ ÒkÐQWÐCÀFÀ8ÔLÑkùó   ‚c              3  ó&   K  — | ]	  }d |› �–— Œ y­w)z1Invalid label name in prometheus_exclude_labels: Nr?   ©rk   Úlabels     rD   rn   z9PrometheusLogger._parse_exclude_config.<locals>.<genexpr>  s   è ø€ ÒfÈeÐAÀ%ÀÔIÑfùr  z4Prometheus exclude configuration validation failed:
r  )Útypingr  r‰   Ú	frozensetÚprometheus_exclude_metricsÚprometheus_exclude_labelsÚDEFINED_PROMETHEUS_METRICSÚsortedÚ_all_defined_labelsr   r  )
r@   r  r‰   rì   rí   Úvalid_metricsÚinvalid_metricsÚvalid_labelsÚinvalid_labelsÚerrorss
             rD   rë   z&PrometheusLogger._parse_exclude_configþ  sÀ   € å#ãä!*¨7×+MÑ+MÒ+SÐQSÓ!TˆÜ )¨'×*KÑ*KÒ*QÈrÓ Rˆä(©Ô2LÓ)MÓNˆÜ!'¨¸-Ñ(GÓ!Hˆà"×6Ñ6Ó8ˆÜ & ~¸Ñ'DÓ Eˆð
ÙkÐ[jÔkð
áfÐWeÔfñ
ˆñ ÜÐTÐW[×W`ÑW`ÐagÓWhÑhÓiÐià Ð.Ð.rQ   c                 óÄ   — ddl } t        d„ t        D «       «      }t        d„ | j                  D «       «      }t        d„ | j                  D «       «      }|t
        z  |z  |z  S )zcEvery label a metric can emit: enum labels, hard-coded labels, and configured custom labels / tags.r   Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr>   )rp   r!  s     rD   rn   z7PrometheusLogger._all_defined_labels.<locals>.<genexpr>  s   è ø€ Ò)X¸%¨%¯+­+Ñ)Xùs   ‚c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr>   ©r'   r!  s     rD   rn   z7PrometheusLogger._all_defined_labels.<locals>.<genexpr>  s   è ø€ ò 2
Ø7<Ô+¨E×2ñ2
ùs   ‚c              3  ó8   K  — | ]  }t        d |› �«      –— Œ y­w)Útag_Nr2  )rk   Útags     rD   rn   z7PrometheusLogger._all_defined_labels.<locals>.<genexpr>  s!   è ø€ ò -
Ø>AÔ+¨d°3°%¨L×9ñ-
ùs   ‚)r‰   r$  ÚUserAPIKeyLabelNamesÚ!custom_prometheus_metadata_labelsÚcustom_prometheus_tagsr9   )r‰   Úbuiltin_labelsÚcustom_metadata_labelsÚcustom_tag_labelss       rD   r)  z$PrometheusLogger._all_defined_labels  sp   € ó 	ä )Ñ)XÔCWÔ)XÓ XˆÜ(1ñ 2
Ø@G×@iÑ@iô2
ó )
Ðô $-ñ -
ØEL×EcÑEcô-
ó $
Ðð Ô 7Ñ7Ð:PÑPÐSdÑdÐdrQ   c                ó  — g }g }|D ]u  }|j                   D ]d  }| j                  |«      }|r|j                  |«       Œ(|j                  sŒ5| j	                  ||j                  «      }|sŒT|j                  |«       Œf Œw t        ||¬«      S )z>Validate all metric configurations and return collected errors)Úmetric_errorsÚlabel_errors)r  Ú_validate_single_metric_namer  Úinclude_labelsÚ_validate_single_metric_labelsÚValidationResults)r@   r  r=  r>  r  Úmetric_nameÚmetric_errorÚlabel_errors           rD   r  z-PrometheusLogger._validate_all_configurations$  s–   € à!ˆØ ˆà$ò 	9ˆFØ%Ÿ~™~ò 9�à#×@Ñ@ÀÓM�ÙØ!×(Ñ(¨Ô6Øð ×(Ó(Ø"&×"EÑ"EÀkÐSY×ShÑShÓ"i�KÚ"Ø$×+Ñ+¨KÕ8ñ9ð	9ô !¨}È<ÔXÐXrQ   c                ól   — ddl m} |t         |t        «      «      vrt	        | |t        «      ¬«      S y)zValidate a single metric namer   r  )rC  r*  N)r#  r  r  r'  ÚMetricValidationError)r@   rC  r  s      rD   r?  z-PrometheusLogger._validate_single_metric_name9  s6   € å#àœc¡(Ô+EÓ"FÓGÑGÜ(Ø'Ù&Ô'AÓBôð ð rQ   c                ó¢   — ddl m} t        j                   |t        |«      «      }|D �cg c]	  }||vsŒ|‘Œ }}|rt        |||¬«      S yc c}w )z#Validate labels for a single metricr   )r   ©rC  r-  r,  N)r#  r   ÚPrometheusMetricLabelsÚ
get_labelsr'  ÚLabelValidationError)r@   rC  rs   r   r,  r"  r-  s          rD   rA  z/PrometheusLogger._validate_single_metric_labelsD  s`   € åô 5×?Ñ?ÁÔE_ÐalÓ@mÓnˆð 5;Ö X¨5¸eÈ<Ò>W¢Ð XˆÐ XáÜ'Ø'Ø-Ø)ôð ð
 ùò !Ys
   «	AµAc                ó–   — i }|D ]A  }|j                   D ]0  }|j                  sŒ| j                  |«      �Œ"|j                  ||<   Œ2 ŒC |S )z1Build label filters from validated configurations)r  r@  r?  )r@   r  rê   r  rC  s        rD   r  z%PrometheusLogger._build_label_filtersV  s_   € à!ˆà$ò 	KˆFØ%Ÿ~™~ò K�Ø×(Ó(à×8Ñ8¸ÓEÑMØ5;×5JÑ5J˜ kÒ2ñ	Kð	Kð ÐrQ   c                óº   — | j                  ||«      }|rG| j                  |j                  |j                  |j                  ¬«       t        |j                  «      ‚y)z¨
        Ensure that all the configured labels are valid for the metric

        Raises ValueError if the metric labels are invalid and pretty prints the error
        rI  T)rA  Ú"_pretty_print_invalid_labels_errorrC  r-  r,  r   Úmessage)r@   rC  rs   rE  s       rD   Ú"_validate_configured_metric_labelsz3PrometheusLogger._validate_configured_metric_labelsc  s]   € ð "×@Ñ@ÀÈfÓUˆÙØ×3Ñ3Ø'×3Ñ3Ø*×9Ñ9Ø(×5Ñ5ð 4ô ô
 ˜[×0Ñ0Ó1Ð1àrQ   c           	     óþ  — 	 ddl m} ddlm} ddlm} ddlm}  |«       } |dd¬«      }|j                  d	«       |j                   ||d
¬«      «       |j                  rÄ|j                  D �cg c]  }|j                  ‘Œ }	}|j                  d   j                  }
 |ddj                  |	«      › �d¬«      }|j                   ||d
¬«      «        |ddddd¬«      }|j                  ddd¬«       t        |
«      D ]  }|j                  |«       Œ |j                  |«       |j                   rÈ|j                   D ]¹  } |d|j                  › ddj                  |j"                  «      › �d¬«      }|j                   ||d
¬«      «        |d|j                  › d�dddd¬«      }|j                  ddd¬«       t        |j$                  «      D ]  }|j                  |«       Œ |j                  |«       Œ» |j                  d	«       yc c}w # t&        $ rc |j                  D ]!  }t)        j*                  |j,                  «       Œ# |j                   D ]!  }t)        j*                  |j,                  «       Œ# Y yw xY w)z-Pretty print all validation errors using richr   ©ÚConsole©ÚPanel©ÚTable©ÚTextu(   ðŸš¨ðŸš¨ Configuration Validation Errorsúbold red©Ústyler  Úred©Úborder_stylezInvalid Metric Names: ú, õ   ðŸ“Š Valid Metric NamesTú
bold greenÚleftÚgreen©ÚtitleÚshow_headerÚheader_styleÚtitle_justifyr`  úAvailable MetricsÚcyan©r]  Úno_wrapzInvalid Labels for 'z': u   ðŸ�·ï¸� Valid Labels for 'ú'úValid LabelsN)Úrich.consolerT  Ú
rich.panelrV  Ú
rich.tablerX  Ú	rich.textrZ  Úprintr=  rC  r*  r  Ú
add_columnr(  Úadd_rowr>  r-  r,  ÚImportErrorr   ÚerrorrP  )r@   r  rT  rV  rX  rZ  Úconsolerg  r  r+  r*  Úmetrics_error_textÚmetrics_tablere   ry  Úlabels_error_textÚlabels_tabler"  rD  rE  s                       rD   r  z0PrometheusLogger._pretty_print_validation_errorsx  s  € ðF	:Ý,Ý(Ý(Ý&á$›YˆGñ  Ð JÐR\Ô]ˆEð �M‰M˜$ÔØ�M‰M™% °EÔ:Ô;ð "×/Ò/ØAS×AaÑAaÖ)b¸A¨!¯-«-Ð)b�Ð)bØ 2× @Ñ @ÀÑ C× QÑ Q�á,0Ø,¨T¯Y©Y°Ó-GÐ,HÐIØ$ô-Ð"ð —‘™eÐ$6ÀUÔKÔLá',Ø3Ø $Ø!-Ø"(Ø!(ô(�ð ×(Ñ(Ð)<ÀFÐTXÐ(ÔYä$ ]Ó3ò 2�FØ!×)Ñ)¨&Õ1ð2ð —‘˜mÔ,ð "×.Ò.Ø/×<Ñ<ò 0�EÙ(,Ø.¨u×/@Ñ/@Ð.AÀÀTÇYÁYÈu×OcÑOcÓEdÐDeÐfØ(ô)Ð%ð —M‘M¡%Ð(9ÈÔ"NÔOá#(Ø :¸5×;LÑ;LÐ:MÈQÐOØ$(Ø%1Ø&,Ø%,ô$�Lð !×+Ñ+¨NÀ&ÐRVÐ+ÔWä!'¨×(:Ñ(:Ó!;ò 4˜Ø$×,Ñ,¨UÕ3ð4ð —M‘M ,Õ/ð'0ð* �M‰M˜$Õùò] *cøô` ò 	:à 2× @Ñ @ò ;�Ü×$Ñ$ \×%9Ñ%9Õ:ð;à1×>Ñ>ò :�Ü×$Ñ$ [×%8Ñ%8Õ9ò:ð		:ús&   ‚A-H Á/HÂFH ÈH ÈA)I<É;I<c           	     ó   — 	 ddl m} ddlm} ddlm} ddlm}  |«       } |d|› ddj                  |«      › d	�d
¬«      }	 |ddddd¬«      }
|
j                  ddd¬«       t        |«      D ]  }|
j                  |«       Œ |j                  d«       |j                   ||	d¬«      «       |j                  |
«       |j                  d«       y# t        $ r$ t        j                  d||t        |«      «       Y yw xY w)z8Pretty print error message for invalid labels using richr   rS  rU  rW  rY  u%   ðŸš¨ðŸš¨ Invalid Labels for Metric: 'z'
Invalid labels: ra  z'
Please specify only valid labels belowr[  r\  u$   ðŸ�·ï¸� Valid Labels for this MetricTrc  rd  re  rf  rp  rl  rm  r  r^  r_  z4Invalid labels for metric '%s': %s. Valid labels: %sN)rq  rT  rr  rV  rs  rX  rt  rZ  r  rv  r(  rw  ru  rx  r   ry  )r@   rC  r-  r,  rT  rV  rX  rZ  rz  rg  r~  r"  s               rD   rO  z3PrometheusLogger._pretty_print_invalid_labels_errorÂ  s  € ð(	Ý,Ý(Ý(Ý&á$›YˆGñ  Ø7¸°}ÐDWÐX\×XaÑXaÐbpÓXqÐWrð  s[ð  \Ø ôˆEñ #(Ø<Ø Ø)Ø$Ø$ô#ˆLð ×#Ñ# N¸&È$Ð#ÔOä Ó-ò ,�Ø×$Ñ$ UÕ+ð,ð �M‰M˜$ÔØ�M‰M™% °EÔ:Ô;Ø�M‰M˜,Ô'Ø�M‰M˜$Õøäò 	ä× Ñ ØFØØÜ�|Ó$ö	ð	ús   ‚CC Ã*C=Ã<C=c                óÚ  — 	 ddl m} ddlm} ddlm} ddlm}  |«       } |d|› d�d¬	«      } |d
dddd¬«      }	|	j                  ddd¬«       t        |«      D ]  }
|	j                  |
«       Œ |j                  d«       |j                   ||d¬«      «       |j                  |	«       |j                  d«       y# t        $ r# t        j                  d|t        |«      «       Y yw xY w)z=Pretty print error message for invalid metric name using richr   rS  rU  rW  rY  u   ðŸš¨ðŸš¨ Invalid Metric Name: 'z1'
Please specify one of the allowed metrics belowr[  r\  rb  Trc  rd  re  rf  rk  rl  rm  r  r^  r_  z*Invalid metric name: %s. Valid metrics: %sN)rq  rT  rr  rV  rs  rX  rt  rZ  rv  r(  rw  ru  rx  r   ry  )r@   Úinvalid_metric_namer*  rT  rV  rX  rZ  rz  rg  r|  re   s              rD   Ú"_pretty_print_invalid_metric_errorz3PrometheusLogger._pretty_print_invalid_metric_errorð  só   € ð%	Ý,Ý(Ý(Ý&á$›YˆGñ  Ø1Ð2EÐ1FÐFxÐyØ ôˆEñ $)Ø/Ø Ø)Ø$Ø$ô$ˆMð ×$Ñ$Ð%8ÀÐPTÐ$ÔUä  Ó/ò .�Ø×%Ñ% fÕ-ð.ð �M‰M˜$ÔØ�M‰M™% °EÔ:Ô;Ø�M‰M˜-Ô(Ø�M‰M˜$Õøäò 	ä× Ñ Ø<Ð>QÔSYÐZgÓShöð	ús   ‚B;B> Â>)C*Ã)C*c                ó¢   — | j                  |«      }|r<| j                  |j                  |j                  ¬«       t	        |j
                  «      ‚y)z]
        Raises ValueError if the metric name is invalid and pretty prints the error
        )r�  r*  N)r?  r‚  rC  r*  r   rP  )r@   rC  ry  s      rD   Ú_valid_metric_namez#PrometheusLogger._valid_metric_name  sQ   € ð ×8Ñ8¸ÓEˆÙØ×3Ñ3Ø$)×$5Ñ$5ÀU×EXÑEXð 4ô ô ˜UŸ]™]Ó+Ð+ð	 rQ   c                óÔ  — 	 ddl m} ddlm} ddlm} ddlm}  |«       } |dd¬«      } |d	d
dd¬«      }|j                  ddd
¬«       t        | d«      r8| j                  r,t        | j                  «      D ]  }	|j                  |	«       Œ n|j                  d«        |dd
dd¬«      }
|
j                  ddd
¬«       |
j                  dd¬«       |rIt        |j                  «       «      D ],  \  }}|rdj                  |«      nd}|
j                  ||«       Œ. n|
j                  dd«       |j                  d«       |j                   ||d¬«      «       |j                  |«       |j                  |
«       |j                  d«       y!# t         $ rP t#        j$                  dt        | d«      rt        | j                  «      nd«       t#        j$                  d |«       Y y!w xY w)"z>Pretty print the processed prometheus configuration using richr   rS  rU  rW  rY  z"Prometheus Configuration Processedz	bold bluer\  u   ðŸ“Š Enabled MetricsTzbold magentard  )rg  rh  ri  rj  zMetric Namerl  rm  r	  z8[yellow]All metrics enabled (no filter applied)[/yellow]u   ðŸ�·ï¸�  Label Filtersrc  zAllowed LabelsÚyellowra  z[dim]No labels specified[/dim]z+[yellow]No label filtering applied[/yellow]z*[dim]All default labels will be used[/dim]r  Úbluer_  zEnabled metrics: %szAll metricszLabel filters: %sN)rq  rT  rr  rV  rs  rX  rt  rZ  rv  Úhasattrr	  r(  rw  Úitemsr  ru  rx  r   Úinfo)r@   rê   rT  rV  rX  rZ  rz  rg  r|  re   r~  rC  rs   Ú
labels_strs                 rD   r  z0PrometheusLogger._pretty_print_prometheus_config(  sÝ  € ð;	DÝ,Ý(Ý(Ý&á$›YˆGñ  Ð DÈKÔXˆEñ $)Ø,Ø Ø+Ø$ô	$ˆMð ×$Ñ$ ]¸&È$Ð$ÔOä�tÐ.Ô/°D×4HÒ4HÜ$ T×%9Ñ%9Ó:ò 2�FØ!×)Ñ)¨&Õ1ñ2ð ×%Ñ%Ð&`Ôañ #(Ø.Ø Ø)Ø$ô	#ˆLð ×#Ñ# M¸ÈÐ#ÔNØ×#Ñ#Ð$4¸HÐ#ÔEáÜ+1°-×2EÑ2EÓ2GÓ+Hò BÑ'�K Ù6< §¡¨6Ô!2ÐBb�JØ ×(Ñ(¨°jÕAñBð ×$Ñ$ØAØ@ôð �M‰M˜$ÔØ�M‰M™% °FÔ;Ô<Ø�M‰M˜-Ô(Ø�M‰M˜,Ô'Ø�M‰M˜$Õøäò 	Dä×ÑØ%Ü07¸Ð>OÔ0P”�t×+Ñ+Ô,ÐVcôô ×ÑÐ 3°]ÖCð	Dús   ‚FF ÆAG'Ç&G'c                óp   — || j                   v ryt        | d«      sy| j                  sy|| j                  v S )z3Check if a metric is enabled based on configurationFr	  T)rì   rˆ  r	  )r@   rC  s     rD   Ú_is_metric_enabledz#PrometheusLogger._is_metric_enabledg  sB   € à˜$×.Ñ.Ñ.Øô �tÐ.Ô/Øð ×#Ò#Øà˜d×2Ñ2Ð2Ð2rQ   c                ó   ‡ ‡— ˆˆ fd„}|S )zMCreate a factory function that returns either a real metric or a no-op metricc                 ó^  •— | r| d   n|j                  dd«      }‰j                  |«      s
t        «       S t        |j                  d«      xs d«      }t	        |«      ‰j
                  z  s ‰| i |¤ŽS t        ˆfd„|D «       «      }i |¥d|i¥} ‰| i |¤Ž}t        ||‰j
                  «      S )Nr   rl   Ú r”   r?   c              3  ó@   •K  — | ]  }|‰j                   vsŒ|–— Œ y ­wr>   )rí   )rk   rl   r@   s     €rD   rn   zKPrometheusLogger._create_metric_factory.<locals>.factory.<locals>.<genexpr>„  s   øè ø€ Òh¨ÈÐTX×TgÑTgÒHg¤Ñhùs   ƒ—)Úgetr�  Ú
NoOpMetricrq   r$  rí   r`   )	Úargsr   rC  rf   ÚkeptÚkept_kwargsÚreal_metricÚmetric_classr@   s	          €€rD   Úfactoryz8PrometheusLogger._create_metric_factory.<locals>.factoryy  sµ   ø€ á,0  a¢°f·j±jÀÈÓ6LˆKà×*Ñ*¨;Ô7Ü!“|Ð#ä).¨v¯z©z¸,Ó/GÒ/MÈ2Ó)NÐÜÐ1Ó2°T×5HÑ5HÒHÙ# TÐ4¨VÑ4Ð4äÓhÐ1DÔhÓhˆDØ!? FÐ!?¨L¸$Ñ!?ˆKÙ!-¨tÐ!C°{Ñ!CˆKÜ'¨Ð5HÈ$×J]ÑJ]Ó^Ð^rQ   r?   )r@   r˜  r™  s   `` rD   ró   z'PrometheusLogger._create_metric_factoryv  s   ù€ õ	_ð  ˆrQ   c                ó  — | j                   j                  |«      }|�|S t        j                  |«      }|D �cg c]1  }|| j                  vr!|| j
                  vs|| j
                  |   v r|‘Œ3 }}|| j                   |<   |S c c}w )a@  
        Get the labels for a metric, filtered if configured.

        The result is cached on the instance so the label set used to
        construct each Prometheus metric at ``__init__`` time stays in lock
        step with the label set passed to ``counter.labels(...)`` at
        runtime, even if the underlying module-level toggles consulted by
        :meth:`PrometheusMetricLabels.get_labels` (e.g.
        ``litellm.prometheus_emit_rate_limit_labels``,
        ``litellm.prometheus_emit_stream_label``) are flipped after the
        logger has been created.
        )rî   r’  rJ  rK  rí   rê   )r@   rC  ÚcachedÚdefault_labelsr"  Úresolved_labelss         rD   r÷   z&PrometheusLogger.get_labels_for_metric‹  s£   € ð ×2Ñ2×6Ñ6°{ÓCˆØÐØˆMô !7× AÑ AÀ+Ó Nˆð (ö"
àØ˜D×/Ñ/Ñ/Ø D×$6Ñ$6Ñ6¸%À4×CUÑCUÐVaÑCbÑ:bò ð"
ˆð "
ð 3Bˆ×"Ñ" ;Ñ/ØÐùò"
s   ¹6Bc                ó²   — | j                  d«      }t        |t        «      r|n|g}t        d„ |D «       «      }t	        |«      xr |t
        j                  k  S )NÚguardrail_modec              3  óz   K  — | ]3  }t        |t        «      sŒt        |t        «      r|j                  n|–— Œ5 y ­wr>   )r‹   ry   r%   rp   )rk   Úms     rD   rn   z:PrometheusLogger._guardrail_is_additive.<locals>.<genexpr>­  s4   è ø€ ò '
ØEFÔS]Ð^_ÔadÕSe”z !Ô%8Ô9ˆA�GŠG¸qÓ@ñ'
ùs   ‚;˜#;)r’  r‹   Úlistr$  Úboolr‡   Ú_ADDITIVE_GUARDRAIL_MODES)rŠ  ÚmodeÚmodesÚmode_valuess       rD   Ú_guardrail_is_additivez'PrometheusLogger._guardrail_is_additive©  sX   € à—h‘hÐ/Ó0ˆÜ)¨$´Ô5‘t¸D¸6ˆÜ&ñ '
ØJOô'
ó 
ˆô �KÓ Ò^ [Ô4D×4^Ñ4^Ñ%^Ð^rQ   c                ó�   — | j                  d«      }t        |t        «      rt        d|«      gn|xs g }t	        d„ |D «       d«      S )ab  Seconds of additive guardrail time (pre/post-call only) on the payload.

        during_call guardrails run concurrently with the LLM call, so their
        wall-clock overlaps the provider call and is not additive overhead;
        logging_only and MCP modes never block the user-facing response. A
        guardrail counts only when every mode it carries is pre/post-call, so a
        mixed list such as ["pre_call", "during_call"] is excluded.

        guardrail_information is typed as a list, but some guardrails assign a
        single dict directly, so normalize that shape to a one-item list.
        Úguardrail_informationr*   c              3  ó„   K  — | ]8  }t         j                  |«      sŒt        |j                  d «      xs d«      –— Œ: y­w)Údurationç        N)r‡   r¨  r~   r’  )rk   rŠ  s     rD   rn   zCPrometheusLogger._get_guardrail_overhead_seconds.<locals>.<genexpr>È  s2   è ø€ Òu°DÔGW×GnÑGnÐosÕGtŒU�4—8‘8˜JÓ'Ò.¨3×/Ñuùs
   ‚A �#A r­  )r’  r‹   r
  r   Úsum)Ústandard_logging_payloadrª  Úentriess      rD   Ú_get_guardrail_overhead_secondsz0PrometheusLogger._get_guardrail_overhead_seconds²  s\   € ð (@×'CÑ'CÐD[Ó'\Ðô Ð/´Ô6ô Ð7Ð9NÓOÑPà&Ò,¨"ð 	ô
 Ùu¸GÔuØó
ð 	
rQ   Nc                ó  — |d   j                  d«      }| j                  |«      }|€|dk  ryt        | j                  d¬«      ||¬«      } | j                  j
                  d
i |¤Žj                  |xs dd	z  |z   «       y)a  Record litellm_overhead_with_guardrails_latency_metric (seconds): SDK overhead +
        pre/post-call guardrail time. Recorded outside the SDK-overhead gate so
        guardrail-only overhead is still captured when litellm_overhead_time_ms
        is 0 or absent.
        Úhidden_paramsÚlitellm_overhead_time_msNr   r·   ©rC  ©Úsupported_enum_labelsÚenum_valuesÚlabel_contextr­  éè  r?   )r’  r±  Úprometheus_label_factoryr÷   r·   rs   Úobserve)r@   r¯  r¸  r¹  r´  Úguardrail_overhead_secondsrs   s          rD   Ú$_set_overhead_with_guardrails_metricz5PrometheusLogger._set_overhead_with_guardrails_metricÌ  s¡   € ð +CÀ?Ñ*S×*WÑ*WÐXrÓ*sÐ Ø,0×,PÑ,PÐQiÓ,jÐ"Ø#Ð+Ð0JÈaÒ0OØÜ0Ø"&×"<Ñ"<ØMð #=ó #ð $Ø'ô
ˆð 	Dˆ×<Ñ<×CÑCÑMÀfÑM×UÑUØ&Ò-¨#°Ñ5Ð9SÑSõ	
rQ   c                ó‚  ‡— | j                  |«      }t        j                  j                  |vry‰j	                  t        j                  j                  «      €yt
        j                  }t
        j                  }|€|€y| j                  j                  ||t        ˆfd„|D «       «      ||t
        j                  ¬«       y)uŠ  
        Cap the cardinality of metrics that include the ``end_user`` label.

        Called *after* ``metric.labels(...).inc()/observe()`` so the emission is
        recorded in prometheus-client's child map before any eviction runs.
        Series that get evicted before the next scrape lose updates accrued
        since the last scrape â€” this is inherent to any cardinality cap.
        Nc              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr>   )r’  )rk   r"  rs   s     €rD   rn   zAPrometheusLogger._track_end_user_metric_series.<locals>.<genexpr>  s   øè ø€ ÒI°U˜vŸz™z¨%×0ÑIùs   ƒ)re   rC  Úlabel_valuesÚ
max_seriesÚttl_secondsÚcleanup_interval_seconds)r÷   r6  ÚEND_USERrp   r’  r‰   Ú1prometheus_end_user_metrics_max_series_per_metricÚ'prometheus_end_user_metrics_ttl_secondsrò   Útrack_seriesrq   Ú4prometheus_end_user_metrics_cleanup_interval_seconds)r@   re   rC  rs   r”   rÂ  rÃ  s      `   rD   Ú_track_end_user_metric_seriesz.PrometheusLogger._track_end_user_metric_seriesæ  s«   ø€ ð !×6Ñ6°{ÓCˆ
Ü×(Ñ(×.Ñ.°jÑ@ØØ�:‰:Ô*×3Ñ3×9Ñ9Ó:ÐBØä#×UÑUˆ
Ü$×LÑLˆØÐ +Ð"5Øà×/Ñ/×<Ñ<ØØ#ÜÓI¸jÔIÓIØ!Ø#Ü%,×%aÑ%að 	=õ 	
rQ   c                ó¨   — t        | j                  |¬«      ||¬«      } |j                  di |¤Žj                  |«       | j	                  |||«       y )Nrµ  r¶  r?   )r»  r÷   rs   ÚincrÊ  )r@   ÚcounterrC  r¸  r¹  ÚamountÚ_labelss          rD   Ú_inc_labeled_counterz%PrometheusLogger._inc_labeled_counter  sU   € ô 2Ø"&×"<Ñ"<ÈÐ"<Ó"UØ#Ø'ô
ˆð
 	ˆ�‰Ñ!˜Ñ!×%Ñ% fÔ-Ø×*Ñ*¨7°KÀÕIrQ   c              ƒ  óž  K  — t        j                  dt        |t        «      rt	        |j                  «       «      nt        |«      j                  «       |j                  d«      }|�t        |t        «      st        d|› �«      ‚| j                  ||¬«      ry |j                  dd«      }|j                  di «      xs i }|j                  d«      xs i }t        «       }	 |	|d	¬
«      }
|d   d   }|d   d   }|d   d   }|d   d   }|d   d   }|d   j                  d«      }|d   j                  d«      }|d   }|d   }|d   }t        |¬«      }|�t        |t        «      r|d   }ng }t        d|› d|› d|› d|
› d|› �
«       t        dGi d|
“d|“d|“d|d    “d |d    “d!|“d"|“d#|“d$|“d%|“d&|d   d'   “d(d)“d|“d*|“d+|“d,|d,   “d-|d-   “d.|d/   “d0d “d1d “d2t        |¬3«      “d4|d   j                  d5«      “d6|d   j                  d7«      “d8|d   j                  d8«      “d9t         j"                  rt%        |j                  d9«      «      nd “d:t'        |«      “Ž}|�/t        |t$        «      r|j)                  d;«      rd<d=lm}  ||«      }t/        |«      }| j1                  |
|||||||||¬>«
       | j3                  ||
||||||||¬?«
       | j5                  ||||||||¬@«      ƒ d {  –—†  | j7                  |||||j8                  ¬A«       | j;                  ||||||||¬B«       | j=                  ||||||¬C«       | j?                  |||¬D«      ƒ d {  –—†  | jA                  |||¬D«       | jC                  |||¬D«       | jE                  |||¬E«       tF        jI                  | | jJ                  dF||¬C«       y 7 ŒÑ7 Œg­w)HNzFprometheus Logging - Enters success logging function (kwargs keys: %s)Ústandard_logging_objectz)standard_logging_object is required, got=©r   r¯  rÙ   r�  Úlitellm_paramsÚmetadataÚ
prometheus©Úservice_typeÚuser_api_key_user_idÚuser_api_key_hashÚuser_api_key_aliasÚuser_api_key_team_idÚuser_api_key_team_aliasÚuser_api_key_org_idÚuser_api_key_org_aliasÚcompletion_tokensÚtotal_tokensÚresponse_cost©r¯  Úrequest_tagsz'inside track_prometheus_metrics, model z, response_cost z, tokens_used z, end_user_id z, user_api_key Úend_userÚhashed_api_keyrÜ   Úrequested_modelÚmodel_groupÚteamÚ
team_aliasÚorg_idÚ	org_aliasrÚ   rÛ   Úuser_api_key_user_emailÚstatus_codeÚ200Úlitellm_model_nameÚtagsÚmodel_idÚapi_baserÀ   Úcustom_llm_providerÚexception_statusÚexception_classr:  ©rÕ  ÚrouteÚuser_api_key_request_routeÚ	client_ipÚrequester_ip_addressÚ
user_agentÚstreamÚservice_tierzsk-r   )Ú
hash_token)
Úend_user_idÚuser_api_keyrÛ  rÙ   Úuser_api_teamÚuser_api_team_aliasÚuser_idrâ  r¸  r¹  )
r¯  r   r  rÛ  rÙ   r  r  r  r¸  r¹  )r  r  r  rÛ  rÔ  râ  r  rÞ  )r  rÛ  r   rÕ  rò  )r   rÙ   r  rÛ  r  r  r¸  r¹  ©r¹  ©r¯  r¸  r¹  )r¯  r¸  râ  r•   r?   )&r   r‚   r‹   r
  r¢  ÚkeysÚtyperM   r’  r   Ú$_should_skip_metrics_for_invalid_keyr   Ú;_get_combined_custom_metadata_from_standard_logging_payloadr   ÚUserAPIKeyLabelValuesÚget_custom_labels_from_metadatar‰   Úprometheus_emit_stream_labelry   r   Ú
startswithÚlitellm.proxy.utilsrÿ  r   Ú._increment_top_level_request_and_spend_metricsÚ_increment_token_metricsÚ#_increment_remaining_budget_metricsÚ#_set_virtual_key_rate_limit_metricsrò  Ú_set_latency_metricsÚ"set_llm_deployment_success_metricsÚ#_async_set_router_remaining_metricsÚ_increment_cache_metricsÚ#_increment_media_generation_metricsÚ _increment_mcp_tool_call_metricsr‡   rÐ  r•   )r@   r   Úresponse_objÚ
start_timeÚend_timer¯  rÙ   rÔ  Ú	_metadataÚ!get_end_user_id_for_cost_trackingr   r  r  rÛ  r  r  rÞ  rß  Úoutput_tokensÚtokens_usedrâ  Úcombined_metadataÚ_tagsr¸  rÿ  r¹  s                             rD   Úasync_log_success_eventz(PrometheusLogger.async_log_success_event  s˜  è ø€ ä×ÑØTÜ#-¨f´dÔ#;ŒD�—‘“ÔÄÀfÃ×AVÑAVô	
ð JPÏÉÐTmÓInÐ à#Ð+´:Ð>VÔX\Ô3]ÜÐHÐIaÐHbÐcÓdÐdà×4Ñ4¸FÐ]uÐ4ÔvØà—z‘z '¨2Ó.ˆØ &§
¡
Ð+;¸RÓ @Ò FÀBˆØ)×-Ñ-¨jÓ9Ò?¸Rˆ	Ü3\Ó3^Ð)á>¸~Ð\hÔiˆØ1°*Ñ=Ð>TÑUˆØ/°
Ñ;Ð<OÑPˆØ$<¸ZÑ$HÐI]Ñ$^ÐØ7¸
ÑCÐDZÑ[ˆØ%=¸jÑ%IÐJcÑ%dÐØ%=¸jÑ%I×%MÑ%MÐNcÓ%dÐØ(@ÀÑ(L×(PÑ(PÐQiÓ(jÐØ7Ð8KÑLˆØ5°nÑEˆØ7¸ÑHˆÜ#^Ø%=ô$
Ðð $Ð/´JÐ?WÔY]Ô4^Ø,¨^Ñ<‰EàˆEäØ5°e°WÐ<LÈ]ÈOÐ[iÐjuÐivð  wEð  FQð  ERð  Rað  bnð  aoð  pô	
ô 3ò 
Ù ð
á'ð
ñ -ð
ð 5°]ÒCð	
ð
 1°Ò?ð
ñ ð
ñ +ð
ñ 'ð
ñ -ð
ñ ð
ð 0°
Ñ;Ð<UÒVð
ñ ð
ñ ð
ñ  %ð
ñ ð
ð  .¨jÒ9ð!
ð" .¨jÒ9ð#
ð$ 2Ð2GÒHð%
ñ& "ð'
ñ( !ð)
ô* $CÐL]Õ#^ð+
ð, +¨:Ñ6×:Ñ:Ð;WÔXð-
ð. /¨zÑ:×>Ñ>Ð?UÔVð/
ð0 0°
Ñ;×?Ñ?ÀÔMð1
ô2 DK×CgÒCg”CÐ0×4Ñ4°XÓ>Ô?Ðmqøð3
ô4 HÐH`Ôað5
ˆð: Ð#¬
°<ÄÔ(EÈ,×JaÑJaÐbgÔJhÝ6á% lÓ3ˆLä<¸[ÓIˆð 	×;Ñ;Ø#Ø%Ø1ØØ'Ø 3ØØ'Ø#Ø'ð 	<ô 	
ð 	×%Ñ%ð &>Ø#Ø%Ø1ØØ'Ø 3ØØ#Ø'ð 	&ô 	
ð" ×6Ñ6Ø'Ø 3Ø%Ø1Ø)Ø'ØØ 3ð 7ó 	
÷ 		
ð 		
ð 	×0Ñ0Ø%Ø1ØØØ ×)Ñ)ð 	1ô 	
ð 	×!Ñ!ØØØ%Ø1Ø'Ø 3ð $Ø'ð 	"ô 	
ð 	×/Ñ/ØØØØØØ'ð 	0ô 	
ð ×6Ñ6Ø%=Ø#Ø'ð 7ó 
÷ 	
ð 	
ð 	×%Ñ%Ø%=Ø#Ø'ð 	&ô 	
ð 	×0Ñ0Ø%=Ø#Ø'ð 	1ô 	
ð 	×-Ñ-Ø%=Ø#Ø'ð 	.ô 	
ô 	×-Ñ-ØØ×4Ñ4Ø1ØØ'ð 	.õ 	
ð_		
øðd	
ús&   ‚K5OË7O	Ë8A+OÍ#OÍ$A&OÏOc                óª  — t        j                  d«       |�t        |t        «      r|d   }t        j                  | | j                  d|	|
t        |d   «      ¬«       t        j                  | | j                  d|	|
t        |d   «      ¬«       t        j                  | | j                  d|	|
t        |d	   «      ¬«       | j                  ||	|
¬
«       y )Nz2prometheus Logging - Enters token metrics functionrä  r›   rá  ©r¹  rÎ  rœ   Úprompt_tokensr�   rà  r  )r   r‚   r‹   r
  r‡   rÐ  rø   r~   rœ   r�   Ú_increment_token_detail_metrics)r@   r¯  r   r  rÛ  rÙ   r  r  r  r¸  r¹  r"  s               rD   r  z)PrometheusLogger._increment_token_metricsß  sõ   € ô 	×ÑÐQÔRð $Ð/´JÐ?WÔY]Ô4^Ø3°NÑCˆEä×-Ñ-ØØ×&Ñ&Ø)ØØ'ÜÐ1°.ÑAÓBð 	.ô 	
ô 	×-Ñ-ØØ×,Ñ,Ø)ØØ'ÜÐ1°/ÑBÓCð 	.ô 	
ô 	×-Ñ-ØØ×-Ñ-Ø*ØØ'ÜÐ1Ð2EÑFÓGð 	.ô 	
ð 	×,Ñ,Ø%=Ø#Ø'ð 	-õ 	
rQ   c           
     óÞ  — |j                  d«      xs i }t        |t        «      r|j                  d«      nd}t        |t        «      sy|j                  d«      xs i }|j                  d«      xs i }t        j	                  |«      }| j
                  dt        |t        «      r|j                  d«      ndf| j                  d|f| j                  d	t        |t        «      r|j                  d
«      ndf| j                  dt        |t        «      r|j                  d«      ndf| j                  dt        |t        «      r|j                  d
«      ndfg}	t        j                  | |	||¬«       y)a×  
        Increment per-token-type counters from the Usage object that providers
        attach to the request. The Usage dict is plumbed onto
        ``standard_logging_payload["metadata"]["usage_object"]`` by
        ``get_standard_logging_object_payload``.

        Each counter is only incremented when the underlying value is > 0, so
        scrape output stays sparse for providers that don't report these
        details (most non-OpenAI/Anthropic models).
        rÕ  Úusage_objectNÚprompt_tokens_detailsÚcompletion_tokens_detailsrž   Úcached_tokensrŸ   r    Úaudio_tokensr¡   Úreasoning_tokensr¢   ©r¸  r¹  )r’  r‹   r
  r‡   Ú_resolve_cache_write_tokensrž   rŸ   r    r¡   r¢   Ú_inc_sparse_usage_counters)
r@   r¯  r¸  r¹  rÕ  r)  Úprompt_detailsÚcompletion_detailsÚcache_creation_detail_tokensÚdetail_metricss
             rD   r'  z0PrometheusLogger._increment_token_detail_metrics  s}  € ð  3×6Ñ6°zÓBÒHÀbˆÜ>HÈÔSWÔ>X˜hŸl™l¨>Ô:Ð^bˆÜ˜,¬Ô-Øà ,× 0Ñ 0Ð1HÓ IÒ OÈRˆØ$0×$4Ñ$4Ð5PÓ$QÒ$WÐUWÐä.>×.ZÑ.ZÐ[iÓ.jÐ$ð ×7Ñ7Ø4Ü8BÀ>ÔSWÔ8X�×#Ñ# OÔ4Ð^bðð ×?Ñ?Ø<Ø,ðð ×6Ñ6Ø3Ü7AÀ.ÔRVÔ7W�×#Ñ# NÔ3Ð]aðð ×;Ñ;Ø8Ü?IÐJ\Ô^bÔ?cÐ#×'Ñ'Ð(:Ô;Ðimðð ×7Ñ7Ø4Ü;EÐFXÔZ^Ô;_Ð#×'Ñ'¨Ô7Ðeiðð+W
ˆô8 	×3Ñ3ØØØ#Ø'ð	 	4õ 	
rQ   c                ó@  — |j                  d«      xs i }t        |t        «      r|j                  d«      nd}t        |t        «      sy| j                  d|j                  d«      f| j                  d|j                  d«      fg}t
        j                  | |||¬«       y)	ay  
        Increment video-seconds and images-generated counters from
        ``standard_logging_payload["metadata"]["usage_object"]``. Video
        providers report ``duration_seconds`` there; image generation calls
        report ``output_image_count``. Both are sparse: only emitted when the
        value is present and > 0, so token-only call types are unaffected.
        rÕ  r)  Nr£   Úduration_secondsr¤   Úoutput_image_countr/  )r’  r‹   r
  r£   r¤   r‡   r1  )r@   r¯  r¸  r¹  rÕ  r)  Úmedia_metricss          rD   r  z4PrometheusLogger._increment_media_generation_metricsQ  s®   € ð 3×6Ñ6°zÓBÒHÀbˆÜ>HÈÔSWÔ>X˜hŸl™l¨>Ô:Ð^bˆÜ˜,¬Ô-Øð ×:Ñ:Ø7Ø× Ñ Ð!3Ó4ðð ×4Ñ4Ø1Ø× Ñ Ð!5Ó6ððV
ˆô 	×3Ñ3ØØØ#Ø'ð	 	4õ 	
rQ   c                óº   — |D ]V  \  }}}t        |t        «      st        |t        t        f«      r|dk  rŒ3t        j                  | ||||t        |«      ¬«       ŒX y)a	  
        Increment each ``(counter, metric_name, value)`` entry whose value is
        a positive number. Non-numeric values (including booleans from
        malformed provider usage dicts) and values <= 0 are skipped, keeping
        scrape output sparse.
        r   r%  N)r‹   r£  rK   r~   r‡   rÐ  )r@   Úcounters_with_valuesr¸  r¹  rÍ  rC  rp   s          rD   r1  z+PrometheusLogger._inc_sparse_usage_countersw  sg   € ð ,@ò 
	Ñ'ˆG�[ %Ü˜%¤Ô&¬j¸ÄÄeÀÔ.MÐQVÐZ[ÒQ[ØÜ×1Ñ1ØØØØØ+Ü˜U“|ð 2õ ñ
	rQ   c           
     óº  — |j                  d«      }|€n’|du rjt        j                  | | j                  d||¬«       |j                  dd«      }|dkD  rSt        j                  | | j                  d||t        |«      ¬	«       n$t        j                  | | j                  d
||¬«       |j                  di «      xs i j                  d«      }t        |t        «      r€t        j                  |«      \  }}|dkD  r.t        j                  | | j                  d||t        |«      ¬	«       |dkD  r/t        j                  | | j                  d||t        |«      ¬	«       yyy)zù
        Increment cache-related Prometheus metrics based on cache hit/miss status.

        Args:
            standard_logging_payload: Contains cache_hit field (True/False/None)
            enum_values: Label values for Prometheus metrics
        Ú	cache_hitNTrÏ   r  rá  r   rÑ   r%  rÐ   rÕ  r)  rÒ   rÓ   )r’  r‡   rÐ  rÏ   rÑ   r~   rÐ   r‹   r
  Ú_resolve_provider_cache_tokensrÒ   rÓ   )	r@   r¯  r¸  r¹  r=  rá  Ú	usage_objÚprovider_cache_read_tokensÚprovider_cache_creation_tokenss	            rD   r  z)PrometheusLogger._increment_cache_metrics�  s�  € ð 4×7Ñ7¸ÓDˆ	àÐð Ø˜$Ñä×1Ñ1ØØ×.Ñ.Ø+ØØ+ð 2ô ð #;×">Ñ">¸~ÈqÓ"QˆLØ˜aÒÜ ×5Ñ5ØØ×5Ñ5Ø2ØØ"/Ü  Ó.ð 6õ ô ×1Ñ1ØØ×0Ñ0Ø-ØØ+ð 2ô ð 5×8Ñ8¸ÀRÓHÒNÈB×SÑSÐTbÓcˆ	Ü�i¤Ô&ô !×?Ñ?À	ÓJñØ*Ø.ð *¨AÒ-Ü ×5Ñ5ØØ×HÑHØEØØ"/Ü Ð!;Ó<ð 6ô ð .°Ò1Ü ×5Ñ5ØØ×LÑLØIØØ"/Ü Ð!?Ó@ð 6õ ð 2ð! 'rQ   c                ó`  — | j                  d«      }| j                  d«      }t        |t        «      r|nd}t        |t        «      r|nd}| j                  d«      }|€3t        |t        «      r#|j                  d«      }t        |t        «      r|}|€t        j                  |«      }|�|}||fS )NÚcache_read_input_tokensÚcache_creation_input_tokensr   r*  r,  )r’  r‹   rK   r
  r‡   r0  )r?  Ú_readÚ_writer@  rA  r2  r,  Úwrite_tokenss           rD   r>  z/PrometheusLogger._resolve_provider_cache_tokensÝ  s±   € ð !—}‘}Ð%>Ó?ˆØ!Ÿ™Ð&CÓDˆä.8¸ÄÔ.D¡UÈ!Ð"Ü3=¸fÄcÔ3J©ÐPQÐ&ð !*§¡Ð.EÓ FˆØˆ=œZ¨¼Ô=Ø#1×#5Ñ#5°oÓ#FˆMÜ˜-¬Ô-Ø-:Ð*àˆ>Ü"2×"NÑ"NÈ~Ó"^ˆLØÐ'Ø1=Ð.à)Ð+IÐIÐIrQ   c                ó    — t        | t        «      sy dD ]8  }| j                  |«      }t        |t        «      sŒ%t        |t        «      rŒ6|c S  y )N)Úcache_write_tokensÚcache_creation_tokens)r‹   r
  r’  rK   r£  )r2  Úkeyrp   s      rD   r0  z,PrometheusLogger._resolve_cache_write_tokensõ  sK   € ä˜.¬$Ô/ØØBò 	ˆCØ"×&Ñ& sÓ+ˆEÜ˜%¤Õ%¬j¸ÄÕ.EØ’ð	ð rQ   c           
     ó  — |j                  d«      }t        |t        «      sy |j                  d«      }t        |t        «      sy t        |j                  d«      |j                  d«      |j                  |j
                  |j                  |j                  |j                  |j                  ¬«      }t        |«      }t        j                  | | j                  d||¬«       |dkD  r&t        j                  | | j                  d	|||¬
«       y y )NrÕ  Úmcp_tool_call_metadatarl   Úmcp_server_name)Úmcp_tool_namerN  ræ  rÜ   ré  rê  rÚ   rå  ræ   r  r   rç   r%  )r’  r‹   r
  r  ræ  rÜ   ré  rê  rÚ   rå  r   r‡   rÐ  ræ   rç   )r@   r¯  r¸  râ  rÕ  Úmcp_metaÚmcp_enum_valuesÚmcp_label_contexts           rD   r  z1PrometheusLogger._increment_mcp_tool_call_metricsÿ  s  € ð 3×6Ñ6°zÓBˆÜ˜(¤DÔ)ØØ"Ÿ,™,Ð'?Ó@ˆÜ˜(¤DÔ)Øä!6Ø"Ÿ,™, vÓ.Ø$ŸL™LÐ):Ó;Ø&×5Ñ5Ø%×3Ñ3Ø×!Ñ!Ø"×-Ñ-Ø×!Ñ!Ø ×)Ñ)ô	"
ˆô $AÀÓ#QÐä×-Ñ-ØØ×-Ñ-Ø*ØØ+ð 	.ô 	
ð ˜1ÒÜ×1Ñ1ØØ×7Ñ7Ø4ØØ/Ø$ð 2õ ð rQ   c	           
   ƒ  óâ  K  — t        | j                  t        «      rOt        | j                  t        «      r5t        | j                  t        «      rt        | j
                  t        «      ry |j                  d«      xs i }	|	j                  dd «      }
|	j                  dd «      }|	j                  dd «      }|	j                  dd «      }|	j                  dd «      }|	j                  dd «      }t        «       }t        j                  | j                  |||||¬«      | j                  |||
||¬	«      | j                  ||||¬
«      | j                  ||¬«      d¬«      }	 t        j                  ||¬«      ƒ d {  –—† }t%        |«      D ]2  \  }}t        |t&        «      sŒt!        j"                  dg d¢|   |«       Œ4 y 7 ŒE# t        j                  $ r t!        j"                  d|«       Y y w xY w­w)NrÕ  Úuser_api_key_team_spendÚuser_api_key_team_max_budgetÚuser_api_key_spendÚuser_api_key_max_budgetÚuser_api_key_user_spendÚuser_api_key_user_max_budget)r  rÛ  râ  Úkey_max_budgetÚ	key_spend)r  r  Ú
team_spendÚteam_max_budgetrâ  )r  Ú
user_spendÚuser_max_budgetrâ  ©rë  râ  T)Úreturn_exceptions)ÚtimeoutzŸ[Non-Blocking] Prometheus: per-request budget metric emission exceeded %ss under load; skipping (values are refreshed by the periodic budget-metrics cron job).z=[Non-Blocking] Prometheus: Budget metric lookup %s failed: %s)rK  ré  rÚ   Úorg)r‹   r¥   r“  r¬   r¯   r©   r’  r…   ÚasyncioÚgatherÚ-_set_api_key_budget_metrics_after_api_requestÚ*_set_team_budget_metrics_after_api_requestÚ*_set_user_budget_metrics_after_api_requestÚ)_set_org_budget_metrics_after_api_requestÚwait_forÚTimeoutErrorr   r‚   Ú	enumeraterÿ   )r@   r  r  r  rÛ  rÔ  râ  r  rÞ  r  Ú_team_spendÚ_team_max_budgetÚ_api_key_spendÚ_api_key_max_budgetÚ_user_spendÚ_user_max_budgetÚbudget_metrics_timeoutÚgather_coroÚresultsÚiÚrs                        rD   r  z4PrometheusLogger._increment_remaining_budget_metrics*  sþ  è ø€ ô �t×@Ñ@Ä*ÔMÜ˜4×GÑGÌÔTÜ˜4×DÑDÄjÔQÜ˜4×CÑCÄZÔPàà)×-Ñ-¨jÓ9Ò?¸Rˆ	Ø&Ÿ]™]Ð+DÀdÓKˆØ"+§-¡-Ð0NÐPTÓ"UÐà )§¡Ð.BÀDÓ IˆØ%.§]¡]Ð3LÈdÓ%SÐà&Ÿ]™]Ð+DÀdÓKˆØ"+§-¡-Ð0NÐPTÓ"UÐô )PÓ(QÐÜ$Ÿ^™^Ø×>Ñ>Ø)Ø#5Ø+Ø2Ø(ð ?ó ð ×;Ñ;Ø+Ø$7Ø&Ø 0Ø+ð <ó ð ×;Ñ;ØØ&Ø 0Ø+ð	 <ó ð ×:Ñ:Ø*Ø+ð ;ó ð #ô3
ˆð6		Ü#*×#3Ñ#3°KÐI_Ô#`×`ˆGô ˜gÓ&ò 	‰DˆAˆqÜ˜!œYÕ'Ü×$Ñ$ØSÚ2°1Ñ5Øõñ	ð aùÜ×#Ñ#ò 	Ü× Ñ ð5ð 'ô	ñ ð	üsB   ‚EG/ÅG  Å8F>Å9G  Å=!G/ÆG/Æ>G  Ç )G,Ç)G/Ç+G,Ç,G/c           
     ó¨   — t         j                  | | j                  d|	|
¬«       t         j                  | | j                  d|	|
t	        |«      ¬«       y )NrÎ   r  rš   r%  )r‡   rÐ  rÎ   rš   r~   )r@   r   r  rÛ  rÙ   r  r  r  râ  r¸  r¹  s              rD   r  z?PrometheusLogger._increment_top_level_request_and_spend_metrics|  s^   € ô 	×-Ñ-ØØ×(Ñ(Ø%ØØ'ð 	.ô 	
ô 	×-Ñ-ØØ×%Ñ%Ø"ØØ'Ü˜Ó'ð 	.õ 	
rQ   c                óØ   — | €y| j                  d«      }|€y|j                  d«      }|€yt        |«      j                  d|› �«      }t        |t        «      st        |t        «      sy|S )a˜  
        Read the per-(key, model) remaining value emitted by the v3 rate
        limiter (``parallel_request_limiter_v3.py``), which writes
        ``x-ratelimit-model_per_key-remaining-{requests,tokens}`` into
        ``standard_logging_object.hidden_params.additional_headers`` instead
        of the ``litellm-key-remaining-*`` metadata keys the legacy limiter
        sets. The header carries no model group; it always refers to this
        request's model group, which is what the gauges are labeled with.
        Values are written in-process as plain ints (never HTTP-serialized
        strings), so anything else is rejected rather than coerced.
        Nr³  Úadditional_headersz$x-ratelimit-model_per_key-remaining-)r’  r
  r‹   r£  rK   )r¯  Úrate_limit_typer³  rz  rp   s        rD   Ú)_get_remaining_from_v3_rate_limit_headersz:PrometheusLogger._get_remaining_from_v3_rate_limit_headers™  s|   € ð  $Ð+ØØ7×;Ñ;¸OÓLˆØÐ ØØ$1×$5Ñ$5Ð6JÓ$KÐØÐ%ØÜÐ.Ó/×3Ñ3Ð6ZÐ[jÐZkÐ4lÓmˆÜ�eœTÔ"¬*°U¼CÔ*@ØØˆrQ   c                óÒ  — ddl m}  ||«      }d|› �}d|› �}	|j                  d«      }
|j                  |«      }|€| j                  |
d¬«      }|€t        j
                  }|j                  |	«      }|€| j                  |
d¬«      }|€t        j
                  }t        ||||t        t        |j                  d«      ¬	«      ¬
«      ¬«      }t        |«      }t        | j                  d«      ||¬«      } | j                  j                  di |¤Žj                  |«       t        | j                  d«      ||¬«      } | j                  j                  di |¤Žj                  |«       y )Nr   )Ú#get_model_group_from_litellm_kwargszlitellm-key-remaining-requests-zlitellm-key-remaining-tokens-rÒ  Úrequests)r¯  r{  Útokensrã  r÷  )ræ  rÜ   rÙ   rò  r:  r²   r¶  r³   r?   )Ú)litellm.proxy.common_utils.callback_utilsr~  r’  r|  ÚsysÚmaxsizer  r  r
  r   r»  r÷   r²   rs   r  r³   )r@   r  rÛ  r   rÕ  rò  r~  rè  Ú remaining_requests_variable_nameÚremaining_tokens_variable_namer¯  Úremaining_requestsÚremaining_tokensr¸  r¹  Úrequests_labelsÚtokens_labelss                    rD   r  z4PrometheusLogger._set_virtual_key_rate_limit_metrics¶  s—  € õ	
ñ AÀÓHˆØ4SÐT_ÐS`Ð2aÐ(Ø2OÐP[È}Ð0]Ð&ØIOÏÉÐTmÓInÐ à%Ÿ\™\Ð*JÓKÐØÐ%Ø!%×!OÑ!OØ)AÐS]ð "Pó "Ðð Ð%Ü!$§¡ÐØ#Ÿ<™<Ð(FÓGÐØÐ#Ø#×MÑMØ)AÐS[ð  Nó  Ðð Ð#Ü"Ÿ{™{Ðä2Ø'Ø,ØØÜ#BÜTØ-3¯Z©ZÐ8QÓ-Rôô$ô

ˆô  =¸[ÓIˆÜ!9Ø"&×"<Ñ"<Ð=kÓ"lØ#Ø'ô"
ˆð
 	Aˆ×9Ñ9×@Ñ@ÑSÀ?ÑS×WÑWÐXjÔkä7Ø"&×"<Ñ"<Ð=iÓ"jØ#Ø'ô 
ˆð
 	?ˆ×7Ñ7×>Ñ>ÑOÀÑO×SÑSÐTdÕerQ   c	                ó`  — |j                  d«      xs t        j                  «       }	|j                  d«      }
|j                  dd «      }|j                  dd «      }| j                  ||¬«      }|�{|j                  dd«      du rgt	        | j                  d	¬
«      ||¬«      } | j                  j                  di |¤Žj                  |«       | j                  | j                  d	|«       nt        j                  d«       | j                  ||	¬«      }|�ft	        | j                  d¬
«      ||¬«      } | j                  j                  di |¤Žj                  |«       | j                  | j                  d|«       |j                  di «      xs i }|j                  d«      xs i j                  d«      }| j                  |
|	¬«      }|�t|�
|dk\  r||z   n|}t	        | j                  d¬
«      ||¬«      } | j                  j                  di |¤Žj                  |«       | j                  | j                  d|«       |�m|dk\  rgt	        | j                  d¬
«      ||¬«      } | j                  j                  di |¤Žj                  |«       | j                  | j                  d|«       y y y )Nr  r  Úapi_call_start_timeÚcompletion_start_time)r  r  rý  FTr™   rµ  r¶  zUTime to first token metric not emitted, stream option in model_parameters is not Truer˜   rÔ  rÕ  Úqueue_time_secondsr   r–   r¸   r?   )r’  r   ÚnowÚ_safe_duration_secondsr»  r÷   r™   rs   r¼  rÊ  r   r‚   r˜   r–   rù   )r@   r   rÙ   r  rÛ  r  r  r¸  r¹  r  r  r‹  rŒ  Útime_to_first_token_secondsÚ_ttft_labelsÚapi_call_total_time_secondsrÏ  Ú_litellm_paramsr�  Útotal_time_secondsÚ_observed_total_time_secondss                        rD   r  z%PrometheusLogger._set_latency_metricsò  s   € ð %+§J¡J¨zÓ$:Ò$L¼h¿l¹l»nˆØ-3¯Z©Z¸Ó-Eˆ
Ø%+§Z¡ZÐ0EÀtÓ%LÐØ'-§z¡zÐ2IÈ4Ó'PÐØ-1×-HÑ-HØ*Ø*ð .Ió .
Ð#ð
 (Ð3Ø—
‘
˜8 UÓ+¨tÑ3ä":Ø&*×&@Ñ&@Ø Lð 'Aó 'ð (Ø+ô#ˆLð CˆD×;Ñ;×BÑBÑRÀ\ÑR×ZÑZÐ[vÔwØ×.Ñ.Ø×?Ñ?Ø<Øõô × Ñ Øgôð .2×-HÑ-HØ*Øð .Ió .
Ð#ð 'Ð2Ü.Ø&*×&@Ñ&@ÐMmÐ&@Ó&nØ'Ø+ôˆGð
 7ˆD×/Ñ/×6Ñ6ÑA¸ÑA×IÑIÐJeÔfØ×.Ñ.Ø×3Ñ3Ø0Øôð "(§¡Ð,<¸bÓ!AÒ!GÀRˆØ%4×%8Ñ%8¸Ó%DÒ%JÈ×$OÑ$OÐPdÓ$eÐð %)×$?Ñ$?Ø!Øð %@ó %
Ðð Ð)ð &Ð1Ð6HÈAÒ6Mð #Ð%7Ò7à'ð )ô
 /Ø&*×&@Ñ&@ÐMsÐ&@Ó&tØ'Ø+ôˆGð
 =ˆD×5Ñ5×<Ñ<ÑG¸wÑG×OÑOÐPlÔmØ×.Ñ.Ø×9Ñ9Ø6Øôð Ð)Ð.@ÀAÒ.EÜ.Ø&*×&@Ñ&@ÐMqÐ&@Ó&rØ'Ø+ôˆGð
 :ˆD×2Ñ2×9Ñ9ÑD¸GÑD×LÑLÐM_Ô`Ø×.Ñ.Ø×6Ñ6Ø4Øõð /FÐ)rQ   c              ƒ  óV  K  — t        j                  dt        |t        «      rt	        |j                  «       «      nt        |«      j                  «       |j                  di «      }| j                  ||¬«      ry |j                  dd«      }|j                  di «      xs i }t        «       } ||d¬«      }	|d	   d
   }
|d	   d   }|d	   d   }|d	   d   }|d	   d   }|d	   j                  d«      }	 t        |	||||||
|j                  dd«      t        t        |¬«      ¬«      ¬«	      }t        j                  | | j                   d|«       | j#                  |«       | j%                  |d¬«      ƒ d {  –—†  y 7 Œ# t&        $ r }t        j(                  d|«       Y d }~y d }~ww xY w­w)NzFprometheus Logging - Enters failure logging function (kwargs keys: %s)rÒ  rÓ  rÙ   r�  rÔ  rÖ  r×  rÕ  rÙ  rÚ  rÛ  rÜ  rÝ  rÞ  rò  rã  r÷  )	rå  ræ  rÜ   rÙ   ré  rê  rÚ   rò  r:  rÍ   r   r`  ú0prometheus Layer Error(): Exception occured - %s)r   r‚   r‹   r
  r¢  r  r  rM   r’  r	  r   r  r  r
  r‡   rÐ  rÍ   Ú"set_llm_deployment_failure_metricsri  rÿ   Ú	exception)r@   r   r  r  r  r¯  rÙ   rÔ  r  r   r  r  rÛ  r  r  rÞ  r¸  r  s                     rD   Úasync_log_failure_eventz(PrometheusLogger.async_log_failure_eventY  sÓ  è ø€ Ü×ÑØTÜ#-¨f´dÔ#;ŒD�—‘“ÔÄÀfÃ×AVÑAVô	
ð
 CIÇ*Á*ÐMfÐhjÓBkÐ à×4Ñ4¸FÐ]uÐ4ÔvØà—z‘z '¨2Ó.ˆà &§
¡
Ð+;¸RÓ @Ò FÀBˆÜ3\Ó3^Ð)á>¸~Ð\hÔiˆØ1°*Ñ=Ð>TÑUˆØ6°zÑBÐCVÑWˆØ$<¸ZÑ$HÐI]Ñ$^ÐØ7¸
ÑCÐDZÑ[ˆØ%=¸jÑ%IÐJcÑ%dÐØ%=¸jÑ%I×%MÑ%MÐNcÓ%dÐð	\Ü!6Ø$Ø+Ø0ØØ"Ø.ØØ1×5Ñ5°jÀ"ÓEÜ'FÜXØ1Iôô(ô"ˆKô ×1Ñ1ØØ×;Ñ;Ø8Øô	ð ×3Ñ3°FÔ;Ø×@Ñ@Ø*Øð Aó ÷ ò ùô ò 	\Ü×$Ñ$Ð%WÐYZ×[Ñ[ûð	\üsC   ‚C1F)Ã4BE= Å5E;Å6E= Å:F)Å;E= Å=	F&ÆF!ÆF)Æ!F&Æ&F)c                óÔ  — d}|r.t        |d«      r"|j                  r	 t        |j                  «      }|s,|r*t        |dd«      xs t        |dd«      }|�	 t        |«      }|sA|r?|j                  d«      }|r,t        |dd«      xs t        |dd«      }|�	 t        |«      }|S |S # t        t        f$ r Y Œ„w xY w# t        t        f$ r d}Y Œmw xY w# t        t        f$ r d}Y |S w xY w)aT  
        Extract HTTP status code from various input formats for validation.

        This is a centralized helper to extract status code from different
        callback function signatures. Handles both ProxyException (uses 'code')
        and standard exceptions (uses 'status_code').

        Args:
            kwargs: Dictionary potentially containing 'exception' key
            enum_values: Object with 'status_code' attribute
            exception: Exception object to extract status code from directly

        Returns:
            Status code as integer if found, None otherwise
        Nrî  Úcoder™  )rˆ  rî  rK   r   Ú	TypeErrorÚgetattrr’  )r@   r   r¸  r™  rî  Úexception_in_kwargss         rD   Ú_extract_status_codez%PrometheusLogger._extract_status_code�  s"  € ð* #'ˆñ œ7 ;°Ô>À;×CZÒCZðÜ! +×"9Ñ"9Ó:�ñ ™yä! )¨]¸DÓAÒeÄWÈYÐX^Ð`dÓEeˆKØÐ&ð'Ü"% kÓ"2�Kñ ™vØ)/¯©°KÓ)@ÐÙ"Ü%Ð&9¸=È$ÓOò ÔSZØ'¨°óT�ð Ð*ð+Ü&)¨+Ó&6˜ð Ðˆ{Ðøô1 ¤	Ð*ò Ùðûô #¤IÐ.ò 'Ø"&’Kð'ûô '¬	Ð2ò +Ø&*™àÐð+ús5   žB& ÁB; ÂC Â&B8Â7B8Â;CÃCÃC'Ã&C'c                óz   ‡— |dk(  ry|�2t        |«      j                  «       Šg d¢}t        ˆfd„|D «       «      ryy)aþ  
        Determine if a request has an invalid API key based on status code and exception.

        This method prevents invalid authentication attempts from being recorded in
        Prometheus metrics. A 401 status code is the definitive indicator of authentication
        failure. Additionally, we check exception messages for authentication error patterns
        to catch cases where the exception hasn't been converted to a ProxyException yet.

        Args:
            status_code: HTTP status code (401 indicates authentication error)
            exception: Exception object to check for auth-related error messages

        Returns:
            True if the request has an invalid API key and metrics should be skipped,
            False otherwise
        i‘  T)zvirtual key expectedzexpected to start with 'sk-'zauthentication errorzinvalid api keyzapi key not validc              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr>   r?   )rk   ÚpatternÚexception_strs     €rD   rn   z?PrometheusLogger._is_invalid_api_key_request.<locals>.<genexpr>æ  s   øè ø€ ÒO°�7˜mÔ+ÑOùs   ƒF)ry   ÚlowerÚany)r@   rî  r™  Úauth_error_patternsr¤  s       @rD   Ú_is_invalid_api_key_requestz,PrometheusLogger._is_invalid_api_key_requestÄ  sI   ø€ ð* ˜#ÒØð Ð Ü#& y£>×#7Ñ#7Ó#9ˆMò*Ðô ÓOÐ;NÔOÔOØàrQ   c                óä   — | j                  |||¬«      }|€|r|j                  d«      }| j                  ||¬«      r4t        j                  d||rt        |«      j                  «       yd«       yy)aD  
        Determine if Prometheus metrics should be skipped for invalid API key requests.

        This is a centralized validation method that extracts status code and exception
        information from various callback function signatures and determines if the request
        represents an invalid API key attempt that should be filtered from metrics.

        Args:
            kwargs: Dictionary potentially containing exception and other data
            user_api_key_dict: User API key authentication object (currently unused)
            enum_values: Object with status_code attribute
            standard_logging_payload: Standard logging payload dictionary
            exception: Exception object to check directly

        Returns:
            True if metrics should be skipped (invalid key detected), False otherwise
        )r   r¸  r™  Nr™  ©r™  zUSkipping Prometheus metrics for invalid API key request: status_code=%s, exception=%sTF)r   r’  r¨  r   r‚   r  rM   )r@   r   Úuser_api_key_dictr¸  r¯  r™  rî  s          rD   r	  z5PrometheusLogger._should_skip_metrics_for_invalid_keyë  sˆ   € ð2 "×6Ñ6ØØ#Øð 7ó 
ˆð Ð¡ØŸ
™
 ;Ó/ˆIà×+Ñ+¨KÀ9Ð+ÔMÜ× Ñ ØgØÙ,5”�Y“×(Ñ(ôð
 ð <@ôð
 àrQ   c                óÊ  — | j                  d«      xs i }|j                  d«      }|r|S | j                  d«      xs i }|j                  d«      }|r|S |j                  d«      xs | j                  d«      }|sy	 t        j                  |¬«      d   xs dS # t        j                  j                  $ r Y yt
        $ r!}t        j                  d||«       Y d}~yd}~ww xY w)	a¡  
        Best-effort provider for the client-side failure path.

        A request can fail before a deployment is resolved, so the provider is
        not always known. Prefer the resolved ``custom_llm_provider`` on
        ``litellm_params``, then any provider recovered onto a partial
        ``standard_logging_object`` (e.g. a stream that broke mid-flight), and
        finally infer it from the requested model name (e.g. ``gpt-4o-mini`` ->
        ``openai``) since the proxy's failure ``request_data`` usually carries
        only the client-supplied model. Return ``None`` when it cannot be
        determined so the label emits empty rather than a guess.
        rÔ  rô  rÒ  rÙ   N)rÙ   é   zEprometheus: unexpected error inferring api_provider from model=%s: %s)r’  r‰   Úget_llm_providerÚ
exceptionsÚBadRequestErrorrÿ   r   r‚   )Úrequest_datarÔ  ÚproviderrÒ  rÙ   r  s         rD   Ú'_extract_api_provider_from_request_dataz8PrometheusLogger._extract_api_provider_from_request_data	  sí   € ð !-× 0Ñ 0Ð1AÓ BÒ HÀbˆØ!×%Ñ%Ð&;Ó<ˆÙØˆOØ)5×)9Ñ)9Ð:SÓ)TÒ)ZÐXZÐØ*×.Ñ.Ð/DÓEˆÙØˆOØ%×)Ñ)¨'Ó2ÒO°l×6FÑ6FÀwÓ6OˆÙØð
	Ü×+Ñ+°%Ô8¸Ñ;ÒC¸tÐCøÜ×!Ñ!×1Ñ1ò 	ÙÜò 	Ü× Ñ ØWØØôô
 ûð	ús   Á=B ÂC"Â9C"ÃCÃC"c           
   ƒ  óø  K  — ddl m} | j                  ||¬«      ry| j                  |¬«      }	 |j	                  ||j                  di «      ¬«      }|j                  di «      xs i }|j                  d	i «      j                  d
«      xs! |j                  d	i «      j                  d
«      }	| j                  |«      \  }
}| j                  |«      }t        d(i d|j                  “d|j                  “d|j                  “d|j                  “d|j                  “d|j                  “d|j                  “d|j                   “d|j"                  “d|j                  dd«      “dt%        |«      “dt%        |«      “d| j'                  |«      “d|
“d|“d|“d|j(                  “d|j                  d«      “d |j                  d «      “d!|	“d"|“d#t*        j,                  rt%        |j                  d#«      «      nd“Ž}t/        |«      }t0        j3                  | | j4                  d$||¬%«       t0        j3                  | | j6                  d&||¬%«       y# t8        $ r }t;        j<                  d'|«       Y d}~yd}~ww xY w­w))zþ
        Track client side failures

        Proxy level tracking - failed client side requests

        See :attr:`PrometheusMetricLabels.litellm_proxy_failed_requests_metric`
        for the authoritative list of labels emitted on this metric.
        r   )ÚStandardLoggingPayloadSetup)r«  r™  Nrª  Úproxy_server_request)rÔ  r¶  rÕ  Ú
model_infoÚidrå  rÚ   rÛ   ræ  rÜ   ré  rê  rë  rì  rç  rÙ   r�  rî  rõ  rö  Úrate_limit_categoryr{  rñ  rø  rú  rû  rü  rò  rÀ   rý  r’   r  r•   r—  r?   )Ú*litellm.litellm_core_utils.litellm_loggingrµ  r	  r   Ú_get_request_tagsr’  Ú_extract_rate_limit_labelsr³  r  r   r  rÛ   Úapi_keyÚ	key_aliasÚteam_idrê  rë  Úorganization_aliasry   Ú_get_exception_class_nameÚrequest_router‰   r  r   r‡   rÐ  r’   r•   rÿ   r   r™  )r@   r±  Úoriginal_exceptionr«  Útraceback_strrµ  rî  r"  r  rò  r¹  r{  rÀ   r¸  Ú
_label_ctxr  s                   rD   Úasync_post_call_failure_hookz-PrometheusLogger.async_post_call_failure_hook<	  sá  è ø€ õ	
ð ×4Ñ4Ø/Ø(ð 5ô 
ð à!×6Ñ6ÐASÐ6ÓTˆð2	\Ø6×HÑHØ+Ø%1×%5Ñ%5Ð6LÈbÓ%Qð Ió ˆEð  ,×/Ñ/°
¸BÓ?ÒEÀ2ˆIØ'Ÿm™m¨L¸"Ó=×AÑAÀ$ÓGÒwÈ<×K[ÑK[Ð\hÐjlÓKm×KqÑKqÐrvÓKwˆHØ37×3RÑ3RÐSeÓ3fÑ0Ð Ø"&×"NÑ"NÈ|Ó"\ˆLÜ!6ò "Ø*×6Ò6ð"à&×.Ò.ð"ð -×7Ò7ð"ð  1×8Ò8ð	"ð
 0×9Ò9ð"ð '×.Ò.ð"ð -×7Ò7ð"ð )×/Ò/ð"ð ,×>Ò>ð"ð !-× 0Ñ 0°¸"Ô =ð"ô   Ô,ð"ô "% [Ô!1ð"ð !%× >Ñ >Ð?QÔ Rð"ñ %8ð"ñ !0ð"ñ  ð!"ð" (×5Ò5ð#"ð$ $Ÿ-™-Ð(>Ô?ð%"ð& %Ÿ=™=¨Ô6ð'"ñ( "ð)"ñ* *ð+"ô, <C×;_Ò;_œ˜L×,Ñ,¨XÓ6Ô7Ðeiøð-"ˆKô0 !>¸kÓ JˆJÜ×1Ñ1ØØ×9Ñ9Ø6ØØ(ð 2ô ô ×1Ñ1ØØ×8Ñ8Ø5ØØ(ð 2õ øô ò 	\Ü×$Ñ$Ð%WÐYZ×[Ñ[ûð	\üs/   ‚-I:°HI ÉI:É	I7ÉI2É-I:É2I7É7I:c              ƒ  ó   K  — y­w)a^  
        Proxy level tracking - triggered when the proxy responds with a success response to the client

        Note: litellm_proxy_total_requests_metric is NOT incremented here to avoid
        double-counting. It is incremented in async_log_success_event which fires
        for all successful requests (both streaming and non-streaming).
        Nr?   )r@   Údatar«  Úresponses       rD   Úasync_post_call_success_hookz-PrometheusLogger.async_post_call_success_hook‹	  rJ   rF   c                óh   — |€|S t        |t        «      r|j                  ||«      S t        |||«      S )z&Get value from dict or Pydantic model.)r‹   r
  r’  rž  )r@   ÚobjrK  Údefaults       rD   Ú	_safe_getzPrometheusLogger._safe_get”	  s6   € àˆ;ØˆNÜ�cœ4Ô Ø—7‘7˜3 Ó(Ð(Ü�s˜C Ó)Ð)rQ   c                óÐ  ‡ ‡
‡‡— |j                  di «      xs i }|j                  di «      xs i }‰ j                  |d«      xs i }t        |t        «      r|ŠnWt	        |dd«      t	        |dd«      t	        |dd«      t	        |dd«      t	        |d	d«      t	        |d
d«      t	        |dd«      dœŠ|j                  di «      xs i Š
‰
j                  d«      Šdˆ
ˆˆfd„}dˆ
ˆˆ ˆfd„}dˆ
ˆˆfd„}dˆ
ˆˆfd„}dˆ
ˆˆfd„}	 |«        |«        |«        |«        |	«       ‰j                  d
«      xs ‰
j                  d
«      ‰j                  d«      xs ‰
j                  d«      dœS )zî
        Extract label values for deployment failure metrics from all available
        sources in request_kwargs. Falls back to litellm_params metadata and
        user_api_key_auth when standard_logging_payload has None values.
        rÒ  rÔ  rÕ  rÛ  Nrí  rÜ  rÝ  rÚ  rû  rü  )rÛ  rí  rÜ  rÝ  rÚ  rû  rü  Úuser_api_key_authc                 óx   •— ‰j                  d«      } | �| S ‰j                  d«      } | �| S ‰�t        ‰dd «      S y )NrÛ  r¾  ©r’  rž  ©ÚvalÚ_litellm_params_metadatar  rÐ  s    €€€rD   Ú_get_api_key_aliaszUPrometheusLogger._extract_deployment_failure_label_values.<locals>._get_api_key_alias¶	  sP   ø€ Ø—-‘-Ð 4Ó5ˆCØˆØ�
Ø*×.Ñ.Ð/CÓDˆCØˆØ�
Ø Ð,ÜÐ0°+¸tÓDÐDØrQ   c                 ó‚   •— ‰j                  d«      } | �| S ‰j                  d«      }|�|S ‰�‰j                  ‰d«      S y )Nrí  rÛ   )r’  rÎ  )Úfrom_metadataÚfrom_paramsrÕ  r  r@   rÐ  s     €€€€rD   Ú_get_user_emailzRPrometheusLogger._extract_deployment_failure_label_values.<locals>._get_user_emailÁ	  sV   ø€ Ø#,§=¡=Ð1JÓ#KˆMØÐ(Ø$Ð$Ø!9×!=Ñ!=Ð>WÓ!XˆKØÐ&Ø"Ð"Ø Ð,Ø—~‘~Ð&7¸ÓFÐFØrQ   c                 óx   •— ‰j                  d«      } | �| S ‰j                  d«      } | �| S ‰�t        ‰dd «      S y )NrÜ  r¿  rÒ  rÓ  s    €€€rD   Ú_get_team_idzOPrometheusLogger._extract_deployment_failure_label_values.<locals>._get_team_idÌ	  sP   ø€ Ø—-‘-Ð 6Ó7ˆCØˆØ�
Ø*×.Ñ.Ð/EÓFˆCØˆØ�
Ø Ð,ÜÐ0°)¸TÓBÐBØrQ   c                 óx   •— ‰j                  d«      } | �| S ‰j                  d«      } | �| S ‰�t        ‰dd «      S y )NrÝ  rê  rÒ  rÓ  s    €€€rD   Ú_get_team_aliaszRPrometheusLogger._extract_deployment_failure_label_values.<locals>._get_team_alias×	  sP   ø€ Ø—-‘-Ð 9Ó:ˆCØˆØ�
Ø*×.Ñ.Ð/HÓIˆCØˆØ�
Ø Ð,ÜÐ0°,ÀÓEÐEØrQ   c                 ó–   •— ‰j                  d«      } | �| S ‰j                  d«      } | �| S ‰�t        ‰dd «      xs t        ‰dd «      S y )NrÚ  r½  Úapi_key_hashrÒ  rÓ  s    €€€rD   Ú_get_hashed_api_keyzVPrometheusLogger._extract_deployment_failure_label_values.<locals>._get_hashed_api_keyâ	  sa   ø€ Ø—-‘-Ð 3Ó4ˆCØˆØ�
Ø*×.Ñ.Ð/BÓCˆCØˆØ�
Ø Ð,ÜÐ0°)¸TÓBÒvÄgÐN_ÐaoÐquÓFvÐvØrQ   )rÜ   rÛ   ré  rê  ræ  rú  rü  )rL   ú
str | None)r’  rÎ  r‹   r
  rž  )r@   Úrequest_kwargsr¯  r“  Ú_metadata_rawrÖ  rÚ  rÜ  rÞ  rá  rÕ  r  rÐ  s   `         @@@rD   Ú(_extract_deployment_failure_label_valuesz9PrometheusLogger._extract_deployment_failure_label_valuesœ	  sz  û€ ð +9×*<Ñ*<Ð=VÐXZÓ*[Ò*aÐ_aÐ Ø!/×!3Ñ!3Ð4DÀbÓ!IÒ!OÈRˆØ#Ÿ~™~Ð.FÈ
ÓSÒYÐWYˆÜ�m¤TÔ*Ø%‰Iô '.¨mÐ=QÐSWÓ&XÜ+2°=ÐB[Ð]aÓ+bÜ(/°Ð?UÐW[Ó(\Ü+2°=ÐB[Ð]aÓ+bÜ%,¨]Ð<OÐQUÓ%VÜ(/°Ð?UÐW[Ó(\Ü% m°\À4ÓHñˆIð +:×*=Ñ*=¸jÈ"Ó*MÒ*SÐQSÐ ð $<×#?Ñ#?Ð@SÓ#TÐ÷		÷		ð 		÷		÷		÷		ñ 0Ó1Ù)Ó+Ù “NÙ)Ó+Ù1Ó3Ø"Ÿ™Ð'=Ó>ÒvÐBZ×B^ÑB^Ð_uÓBvØ#Ÿ-™-¨Ó5ÒcÐ9Q×9UÑ9UÐVbÓ9cñ
ð 	
rQ   c                óˆ  — 	 t        j                  d«       |j                  di «      }|j                  di «      xs i }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  d	d«      }|€_|j                  d
«      xs i j                  d«      xs( |j                  d«      xs i j                  d«      xs i }	|	j                  d«      }|€J|j                  d
«      xs i j                  d«      xs$ |j                  d«      xs i j                  d«      }|j                  dd«      }
| j                  ||¬«      ry| j	                  |«      }|j                  di «      xs i }|j                  d«      xs |j                  d«      }|j                  d«      xs |j                  d«      }|j                  d«      }|j                  d«      xs |j                  d«      }|j                  d«      xs |j                  d«      }|j                  d«      xs |j                  d«      }|j                  d«      xs |j                  d«      }d}|�7t        t        |dd«      «      }|dk(  s|st        |dd«      }|�t        |«      }t        |«      }|r|}|}|}|
}|xs |}nd}d}d}d}|xs |xs d}t        ||||||r| j                  |«      nd|||||||j                  d g «      ||¬!«      }	 |r| j                  |xs d|||
xs d¬"«       t        |«      }|�$t        j                  | | j                  d#||¬$«       t        j                  | | j                  d%||¬$«       y# t         $ r }t        j                  d&|«       Y d}~yd}~ww xY w)'a  
        Sets Failure metrics when an LLM API call fails

        - mark the deployment as partial outage
        - increment deployment failure responses metric
        - increment deployment total requests metric

        Args:
            request_kwargs: dict

        ú(setting remaining tokens requests metricrÒ  rÔ  rÙ   Nrè  ró  rò  r™  Úlitellm_metadatar·  rÕ  r¸  rô  rÓ  ræ  rÚ  rÜ   rÛ  rÛ   ré  rÜ  rê  rÝ  rú  rû  rü  rî  rx   rœ  r�  rä  )rð  rò  ró  rÀ   rõ  rö  rç  ræ  rÜ   rÛ   ré  rê  rñ  rú  rü  ©rð  rò  ró  rÀ   rÆ   r  rÇ   zLPrometheus Error: set_llm_deployment_failure_metrics. Exception occured - %s)r   r‚   r’  r	  rå  ry   rž  r£  r  rÁ  Úset_deployment_partial_outager   r‡   rÐ  rÆ   rÇ   rÿ   )r@   rã  r¯  r“  rð  rè  ró  rò  r™  Ú_model_infoÚllm_providerÚfallback_valuesr  ræ  rÜ   rÛ   ré  rê  rú  rü  rõ  rœ  Údeployment_selectedÚlabel_litellm_model_nameÚlabel_model_idÚlabel_api_baseÚlabel_api_providerÚlabel_requested_modelr¸  Ú_deployment_label_ctxr  s                                  rD   r˜  z3PrometheusLogger.set_llm_deployment_failure_metrics÷	  s7  € ðv	tÜ× Ñ Ð!KÔLØFT×FXÑFXÐYrÐtvÓFwÐ$Ø%3×%7Ñ%7Ð8HÈ"Ó%MÒ%SÐQSˆOØ(6×(:Ñ(:¸7ÀDÓ(IÐØ2×6Ñ6°}ÀdÓKˆKØ6×:Ñ:¸:ÀtÓLˆHØ/×3Ñ3°JÀÓEˆHØ-×1Ñ1°+¸tÓDˆIð Ðà$×(Ñ(Ð);Ó<ÒBÀ×GÑGÈÓUò Ø'×+Ñ+¨JÓ7Ò=¸2×BÑBÀ<ÓPòàð ð
 'Ÿ?™?¨4Ó0�ð Ð"Ø.×2Ñ2Ð3EÓFÒLÈ"×QÑQÐR_Ó`ò %Ø#×'Ñ'¨
Ó3Ò9°rß‘#�mÓ$ð ð #2×"5Ñ"5Ð6KÈTÓ"RˆLà×8Ñ8Ø%Ø)Að 9ô ð ð &*×%RÑ%RÐSaÓ%bˆOØ7×;Ñ;¸JÈÓKÒQÈrˆIØ$3×$7Ñ$7Ð8HÓ$IÒ$oÈYÏ]É]Ð[nÓMoˆNØ#2×#6Ñ#6°Ó#GÒ#nÈ9Ï=É=ÐYmÓKnˆMØ /× 3Ñ 3°LÓ AˆJØ)×-Ñ-¨fÓ5Ò^¸¿¹ÐG]Ó9^ˆDØ /× 3Ñ 3°LÓ AÒ mÀYÇ]Á]ÐSlÓEmˆJØ.×2Ñ2°;Ó?ÒhÀ9Ç=Á=ÐQgÓChˆIØ /× 3Ñ 3°LÓ AÒ `ÀYÇ]Á]ÐS_ÓE`ˆJð  $ÐØÐ$Ü#&¤w¨y¸-ÈÓ'NÓ#OÐ Ø# vÒ-Ñ5EÜ")¨)°V¸TÓ"B�DØÐ'Ü+.¨t«9Ð(ô *.¨h«ÐÙ"Ø+=Ð(Ø!)�Ø!)�Ø%1Ð"Ø(3Ò(IÐ7IÑ%à+-Ð(Ø!#�Ø!#�Ø%'Ð"Ø(:Ò(O¸kÒ(OÈRÐ%ä!6Ø#;Ø'Ø'Ø/Ø!1ÙNW ×!?Ñ!?À	Ô!JÐ]aØ 5Ø-Ø+Ø%ØØ%Ø-×1Ñ1°.À"ÓEØ#Ø%ô"ˆKð$ñ
 #Ø×2Ñ2Ø'9Ò'?¸RØ%Ø%Ø!-Ò!3°ð	 3ô ô ,IÈÓ+UÐ!ØÐ$Ü ×5Ñ5ØØ×=Ñ=Ø:ØØ"7ð 6ô ô ×1Ñ1ØØ×6Ñ6Ø3ØØ3ð 2õ øô ò 	tÜ× Ñ Ð!oÐqr×sÑsûð	tús   ‚E)N Å,H+N Î	OÎ!N<Î<Oc           	     óò  — |j                  d«      xs |j                  d«      }|j                  d«      xs |j                  d«      }|�Ut        | j                  d¬«      t        ||||¬«      ¬«      }	 | j                  j
                  d	i |	¤Žj                  |«       |�Vt        | j                  d¬«      t        ||||¬«      ¬«      }	 | j                  j
                  d	i |	¤Žj                  |«       yy)
z?
        Set the deployment TPM and RPM limits metrics
        ÚtpmÚrpmNrÂ   rµ  ré  ©r·  r¸  rÃ   r?   )r’  r»  r÷   r  rÂ   rs   r  rÃ   )
r@   r·  rÔ  rð  rò  ró  rì  rö  r÷  rÏ  s
             rD   Ú%_set_deployment_tpm_rpm_limit_metricsz6PrometheusLogger._set_deployment_tpm_rpm_limit_metrics{
  sû   € ð  —^‘^ EÓ*ÒG¨n×.@Ñ.@ÀÓ.GˆØ—^‘^ EÓ*ÒG¨n×.@Ñ.@ÀÓ.Gˆàˆ?Ü.Ø&*×&@Ñ&@ÐMkÐ&@Ó&lÜ1Ø'9Ø%Ø%Ø!-ô	ôˆGð 5ˆD×-Ñ-×4Ñ4Ñ?°wÑ?×CÑCÀCÔHàˆ?Ü.Ø&*×&@Ñ&@ÐMkÐ&@Ó&lÜ1Ø'9Ø%Ø%Ø!-ô	ôˆGð 5ˆD×-Ñ-×4Ñ4Ñ?°wÑ?×CÑCÀCÕHð rQ   c              ƒ  ó€  K  — 	 |j                  di «      xs i j                  d«      xs i }|j                  d«      du}|j                  d«      du}|r|ry|j                  d«      }|sy	 ddlm} |€y	 |j	                  |«      ƒ d{  –—† }	|	sy|	j                  d
«      }|	j                  d«      }|sK|�It        | j                  d¬«      ||¬«      } | j                  j                  di |¤Žj                  |«       |sM|�Jt        | j                  d¬«      ||¬«      } | j                  j                  di |¤Žj                  |«       yyy# t        $ r d}Y Œìw xY w7 Œ×# t
        $ r!}
t        j                  d	||
«       Y d}
~
yd}
~
ww xY w# t
        $ r }
t        j                  d|
«       Y d}
~
yd}
~
ww xY w­w)ao  
        Populate ``litellm_remaining_tokens_metric`` /
        ``litellm_remaining_requests_metric`` from the router's internal usage
        counters when the upstream provider did not return
        ``x-ratelimit-remaining-*`` response headers.

        OpenAI / Anthropic / Azure return remaining tokens/requests in response
        headers, but Bedrock and Vertex AI do not. This fallback computes
        ``configured_limit - current_usage`` via
        ``Router.get_remaining_model_group_usage`` so the same gauges are
        emitted for every provider when tpm/rpm is configured on the
        deployment.
        r³  rz  Úx_ratelimit_remaining_tokensNÚx_ratelimit_remaining_requestsrè  r   )Ú
llm_routerzIPrometheus: get_remaining_model_group_usage failed for model_group=%s: %szx-ratelimit-remaining-tokenszx-ratelimit-remaining-requestsrµ   rµ  r¶  r´   zMPrometheus Error: _async_set_router_remaining_metrics. Exception occured - %sr?   )r’  Úlitellm.proxy.proxy_serverrý  rx  Úget_remaining_model_group_usagerÿ   r   r™  r»  r÷   rµ   rs   r  r´   )r@   r¯  r¸  r¹  rz  Úalready_have_tokensÚalready_have_requestsrè  rý  Úremaining_usager  r‡  r†  rÏ  s                 rD   r  z4PrometheusLogger._async_set_router_remaining_metrics¢
  s  è ø€ ð&6	yØ)A×)EÑ)EÀoÐWYÓ)ZÒ)`Ð^`×(eÑ(eØ$ó)ò )àð ð *<×)?Ñ)?Ð@^Ó)_ÐgkÐ)kÐØ+=×+AÑ+AÐBbÓ+cÐkoÐ+oÐ!Ù"Ñ'<Øà!9×!=Ñ!=¸mÓ!LˆKÙØð"ÝAð Ð!ØðØ/9×/YÑ/YÐZeÓ/f×)f�ñ #Øà&5×&9Ñ&9Ð:XÓ&YÐØ(7×(;Ñ(;Ð<\Ó(]Ðá&Ð+;Ð+GÜ2Ø*.×*DÑ*DÐQrÐ*DÓ*sØ +Ø"/ô�ð
 <�×4Ñ4×;Ñ;ÑF¸gÑF×JÑJÐK[Ô\á(Ð-?Ð-KÜ2Ø*.×*DÑ*DÐQtÐ*DÓ*uØ +Ø"/ô�ð
 >�×6Ñ6×=Ñ=ÑHÀÑH×LÑLÐM_Õ`ð .LÐ(øô= ò "Ø!’
ð"úð *gùÜò Ü×(Ñ(Ø_ØØôô
 ûðûô: ò 	yÜ×$Ñ$Ð%tÐvw×xÑxûð	yüsº   ‚F>„AF ÁF>ÁF Á+F>Á-E Á3F Á5F>Á7E% ÂE#ÂE% ÂF ÂF>ÂB<F ÅF>ÅE ÅF ÅE Å F Å#E% Å%	FÅ.F
ÆF Æ	F>Æ
FÆF Æ	F;ÆF6Æ1F>Æ6F;Æ;F>c                ó”  — 	 t        j                  d«       |j                  d«      }|€y | j                  |||¬«      ry |d   }|j                  di «      xs i }	t	        |«      }
|j                  dd «      }|	j                  dd «      }|
j                  d«      xs i }|j                  d	d «      }|s|	r| j                  ||	||||¬
«       d }d }|d   d   x}r$|j                  dd «      }|j                  dd «      }|d   j                  d«      x}rLt        | j                  d¬«      ||¬«      } | j                  j                  d"i |¤Žj                  |dz  «       | j                  |||¬«       |rJ	 t        | j                  d¬«      ||¬«      } | j                  j                  d"i |¤Žj                  |«       |rIt        | j                  d¬«      ||¬«      } | j                  j                  d"i |¤Žj                  |«       	 | j                  |xs d|xs d|xs d|xs d¬«       t         j#                  | | j$                  d||¬«       t         j#                  | | j&                  d||¬«       ||z
  }d }|j                  dd «      �|d   du r|j                  d|«      |z
  }|xs |}|j)                  «       }d }|�U|dkD  rO||z  }t        | j                  d ¬«      ||¬«      } | j*                  j                  d"i |¤Žj                  |«       y y y # t,        $ r }t        j.                  d!|«       Y d }~y d }~ww xY w)#Nrç  rÒ  )r   r¸  r¯  ró  rÔ  rÙ   rô  r·  r¸  )r·  rÔ  rð  rò  ró  rì  r³  rz  rü  rû  r´  r¶   rµ  r¶  rº  r  r´   rµ   r�  ré  rÅ   r  rÇ   rý  TrŒ  r   rÈ   zLPrometheus Error: set_llm_deployment_success_metrics. Exception occured - %sr?   )r   r‚   r’  r	  r   rù  r»  r÷   r¶   rs   r¼  r¾  r´   r  rµ   Úset_deployment_healthyr‡   rÐ  rÅ   rÇ   Útotal_secondsrÈ   rÿ   r™  )r@   rã  r  r  r¸  r  r¹  r¯  ró  r“  r  rð  rì  rë  rò  r†  r‡  rz  r´  rÏ  Úresponse_msÚ!time_to_first_token_response_timeÚ_latencyÚ_latency_secondsÚlatency_per_tokenr  s                             rD   r  z3PrometheusLogger.set_llm_deployment_success_metricsí
  s  € ðE	Ü× Ñ Ð!KÔLØFT×FXÑFXÐYrÓFsÐ$à'Ð/Øð ×8Ñ8Ø%Ø'Ø)Að 9ô ð
 à6°zÑBˆHØ%3×%7Ñ%7Ð8HÈ"Ó%MÒ%SÐQSˆOÜ?ÀÓOˆIØ(6×(:Ñ(:¸7ÀDÓ(IÐØ"1×"5Ñ"5Ð6KÈTÓ"RˆLØ!*§¡¨|Ó!<Ò!BÀˆKØ)Ÿo™o¨d°DÓ9ˆHá™oØ×:Ñ:Ø*Ø#2Ø'9Ø%Ø%Ø!-ð ;ô ð .2ÐØ+/ÐØ%=¸oÑ%NÐOcÑ%dÐdÐ!Ðdà%7×%;Ñ%;Ð<\Ð^bÓ%cÐ"Ø#5×#9Ñ#9Ð:XÐZ^Ó#_Ð à+CÀOÑ+T×+XÑ+XÐYsÓ+tÐtÐ'ÐtÜ2Ø*.×*DÑ*DÐQrÐ*DÓ*sØ +Ø"/ô�ð
 <�×4Ñ4×;Ñ;ÑF¸gÑF×NÑNØ,¨tÑ3ôð ×5Ñ5Ø)AØ'Ø+ð 6ô ñ "ðô 3Ø*.×*DÑ*DÐQtÐ*DÓ*uØ +Ø"/ô�ð
 >�×6Ñ6×=Ñ=ÑHÀÑH×LÑLÐM_Ô`áÜ2Ø*.×*DÑ*DÐQrÐ*DÓ*sØ +Ø"/ô�ð
 <�×4Ñ4×;Ñ;ÑF¸gÑF×JÑJÐK[Ô\ðð ×'Ñ'Ø#5Ò#;¸Ø!š RØ!š RØ)Ò/¨Rð	 (ô ô ×1Ñ1ØØ×9Ñ9Ø6ØØ+ð 2ô ô ×1Ñ1ØØ×6Ñ6Ø3ØØ+ð 2ô ð -5°zÑ,AˆKØBFÐ-à×!Ñ! (¨DÓ1Ð=À.ÐQYÑBZÐ^bÑBbà4B×4FÑ4FÐG^Ð`hÓ4iÐlvÑ4vÐ1ð
 *KÒ)YÈkˆHØ&.×&<Ñ&<Ó&>Ðð !%ÐØÐ(¨]¸QÒ->Ø$4°}Ñ$DÐ!Ü2Ø*.×*DÑ*DØ$Qð +Eó +ð !,Ø"/ô�ð H�×@Ñ@×GÑGÑRÈ'ÑR×ZÑZÐ[lÕmð .?Ð(øô ò 	Ü×$Ñ$Ð%sÐuvÔwÜûð	ús#   ‚(L «L Á KL Ì	MÌ'MÍMc                ó„  — 	 | j                   j                  |||xs d|¬«      j                  |«       | j                  j                  |||¬«      j	                  «        |dk(  r0|r-| j
                  j                  |||¬«      j	                  «        yyy# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)ak  
        Record guardrail metrics for prometheus.

        Args:
            guardrail_name: Name of the guardrail
            latency_seconds: Execution latency in seconds
            status: "success", "error", or "intervened"
            error_type: Type of error if any, None otherwise
            hook_type: "pre_call", "during_call", or "post_call"
        Únonerº   r¾   ry  r¼   z%Error recording guardrail metrics: %sN)	rú   rs   r¼  r½   rÌ  r»   rÿ   r   r‚   )r@   r2   Úlatency_secondsr3   r4   r5   r  s          rD   Ú_record_guardrail_metricsz*PrometheusLogger._record_guardrail_metrics}  sÒ   € ð$	Mà×1Ñ1×8Ñ8Ø-ØØ%Ò/¨Ø#ð	 9ó ÷
 ‰g�oÔ&ð ×1Ñ1×8Ñ8Ø-ØØ#ð 9ó ÷ ‰cŒeð ˜Ò ¡ZØ×3Ñ3×:Ñ:Ø#1Ø)Ø'ð ;ó ÷ ‘#•%ð &0Ð øô ò 	MÜ× Ñ Ð!HÈ!×LÑLûð	Mús   ‚BB Â	B?ÂB:Â:B?c                óº   — 	 | j                   j                  |||||¬«      j                  «        y # t        $ r }t	        j
                  d|«       Y d }~y d }~ww xY w)NrØ   z(Error recording batch created metric: %s)r×   rs   rÌ  rÿ   r   Úwarning©r@   rÙ   rÀ   rÚ   rÛ   rÜ   r  s          rD   Úrecord_managed_batch_createdz-PrometheusLogger.record_managed_batch_created­  s_   € ð		RØ×4Ñ4×;Ñ;ØØ)ØØ%Ø+ð <ó ÷ ‰c�eøÜò 	RÜ×"Ñ"Ð#MÈq×QÑQûð	Rúó   ‚.1 ±	AºAÁAc                óÔ   — 	 | j                   j                  |||xs d|xs d|xs d¬«      j                  |«       y# t        $ r }t	        j
                  d|«       Y d}~yd}~ww xY w)zXRecord the size of a managed file. Uses a gauge (last-seen value per label combination).r�  rÞ   z$Error recording file size metric: %sN)rÝ   rs   r  rÿ   r   r  )r@   Ú
size_bytesr6   r7   rÙ   rÀ   rÚ   r  s           rD   Úrecord_managed_file_sizez)PrometheusLogger.record_managed_file_sizeÀ  sn   € ð		NØ×0Ñ0×7Ñ7ØØ#Ø’k˜rØ)Ò/¨RØ’Z˜Rð 8ó ÷ ‰c�*�oøÜò 	NÜ×"Ñ"Ð#IÈ1×MÑMûð	Nús   ‚;> ¾	A'ÁA"Á"A'c                óÆ   — 	 | j                   j                  |xs d|xs d¬«      j                  |«       y # t        $ r }t	        j
                  d|«       Y d }~y d }~ww xY w)Nr�  ©rÙ   rÀ   z)Error recording batch duration metric: %s)rß   rs   r¼  rÿ   r   r  )r@   r7  rÙ   rÀ   r  s        rD   Úrecord_managed_batch_durationz.PrometheusLogger.record_managed_batch_durationÕ  sd   € ð	SØ×7Ñ7×>Ñ>Ø’k˜rØ)Ò/¨Rð ?ó ÷ ‰gÐ&Õ'øÜò 	SÜ×"Ñ"Ð#NÐPQ×RÑRûð	Sús   ‚47 ·	A Á AÁA c                óº   — 	 | j                   j                  |||||¬«      j                  «        y # t        $ r }t	        j
                  d|«       Y d }~y d }~ww xY w)NrØ   z'Error recording file created metric: %s)rà   rs   rÌ  rÿ   r   r  r  s          rD   Úrecord_managed_file_createdz,PrometheusLogger.record_managed_file_createdã  s_   € ð		QØ×3Ñ3×:Ñ:ØØ)ØØ%Ø+ð ;ó ÷ ‰c�eøÜò 	QÜ×"Ñ"Ð#LÈa×PÑPûð	Qúr  c                ó²   — 	 | j                   j                  |¬«      j                  «        y# t        $ r }t	        j
                  d|«       Y d}~yd}~ww xY w)zIRecord a managed file deletion attempt. result is 'success' or 'blocked'.)r8   z'Error recording file deleted metric: %sN)rá   rs   rÌ  rÿ   r   r  )r@   r8   r  s      rD   Úrecord_managed_file_deletedz,PrometheusLogger.record_managed_file_deletedö  sN   € ð	QØ×3Ñ3×:Ñ:À&Ð:ÓI×MÑMÕOøÜò 	QÜ×"Ñ"Ð#LÈa×PÑPûð	Qúó   ‚*- ­	A¶AÁAc                ón  — ddl }	 | j                  j                  |j                  «       «       | j                  j                  |«       |r>|D ]8  \  }}| j                  j                  |xs d|xs d¬«      j                  «        Œ: yy# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)zÚ
        Record CheckBatchCost polling metrics.

        Args:
            jobs_polled: Number of unprocessed batches found
            processed_models: List of (model, api_provider) tuples for processed jobs
        r   Nr�  r  z,Error recording check batch cost metrics: %s)
Útimerå   r  râ   rã   rs   rÌ  rÿ   r   r  )r@   Újobs_polledÚprocessed_modelsr   rÙ   rÀ   r  s          rD   Úrecord_check_batch_cost_runz,PrometheusLogger.record_check_batch_cost_runý  s²   € ó 	ð	VØ×<Ñ<×@Ñ@ÀÇÁÃÔMØ×5Ñ5×9Ñ9¸+ÔFáØ+;ò Ñ'�E˜<Ø×FÑF×MÑMØ#šk rØ%1Ò%7°Rð Nó ÷ ‘c•eñ	ð  øô ò 	VÜ×"Ñ"Ð#QÐST×UÑUûð	Vús   †BB Â	B4ÂB/Â/B4c                ó²   — 	 | j                   j                  |¬«      j                  «        y # t        $ r }t	        j
                  d|«       Y d }~y d }~ww xY w)N)r4   z1Error recording check batch cost error metric: %s)rä   rs   rÌ  rÿ   r   r  )r@   r4   r  s      rD   Úrecord_check_batch_cost_errorz.PrometheusLogger.record_check_batch_cost_error  sR   € ð	[Ø×6Ñ6×=Ñ=Ø%ð >ó ç‰c�eøÜò 	[Ü×"Ñ"Ð#VÐXY×ZÑZûð	[úr  c                óX  — t        | dd «      }t        |t        «      r|r|S 	 ddlm} |�t        | |«      ryd}t        | d«      rt        | d«      xs d}t        |«      dk\  r|d   j                  «       |dd  z   dz   }|| j                  j                  z  }|S # t
        $ r d }Y Œw xY w)	NÚprometheus_exception_class_namer   )ÚBudgetExceededErrorr(  r�  rì  r­  ú.)rž  r‹   ry   Úlitellm.exceptionsr(  rx  rˆ  ÚlenÚupperÚ	__class__rM   )r™  Úlegacy_class_namer(  Úexception_class_names       rD   rÁ  z*PrometheusLogger._get_exception_class_name   sÕ   € ô $+¨9Ð6WÐY]Ó#^ÐÜÐ'¬Ô-Ñ2CØ$Ð$ð	'Ý>ð Ð*¬z¸)ÐEXÔ/YØ(à!ÐÜ�9˜nÔ-Ü#*¨9°nÓ#EÒ#KÈÐ ô Ð#Ó$¨Ò)Ø#7¸Ñ#:×#@Ñ#@Ó#BÐEYÐZ[ÐZ\ÐE]Ñ#]Ð`cÑ#cÐ à 	× 3Ñ 3× <Ñ <Ñ<ÐØ#Ð#øô! ò 	'Ø"&Òð	'ús   £B ÂB)Â(B)c                ó`   — | €yt        t        | dd«      «      t        t        | dd«      «      fS )a  
        Pull the unified ``category`` / ``rate_limit_type`` fields off any
        exception that declares them (``litellm.RateLimitError`` and bare-
        Exception subclasses like ``BudgetExceededError``).

        Values are validated against the :class:`RateLimitErrorCategory` /
        :class:`RateLimitType` enums so unrelated third-party exceptions that
        happen to declare ``.category`` / ``.rate_limit_type`` string attributes
        can't leak garbage into Prometheus label cardinality.
        N©NNÚcategoryr{  )r   rž  r   rª  s    rD   r¼  z+PrometheusLogger._extract_rate_limit_labelsG  s:   € ð ÐØä(¬°¸JÈÓ)MÓNÜ$¤W¨YÐ8IÈ4Ó%PÓQð
ð 	
rQ   c              ƒ  ó  K  — ddl m}m} t        j                  d||«       t        |«      }|j                  |«      xs i }|j                  |¬«      }|j                  d«      }	t        t        t           |j                  d«      xs g «      }
t        ||	|d   |d   |d	   |d
   t        t        |dd«      «      | j                  |«      |
¬«	      }t        j                  | | j                   d|t#        |«      ¬«       y­w)zF

        Logs a successful LLM fallback event on prometheus

        r   ©ÚStandardLoggingMetadatarµ  zLPrometheus: log_success_fallback_event, original_model_group: %s, kwargs: %sr÷  rÙ   rñ  rÚ  rÛ  rÜ  rÝ  rî  N©	rç  Úfallback_modelræ  rÜ   ré  rê  rõ  rö  rñ  rÉ   r  )rº  r5  rµ  r   r‚   r   r’  Úget_standard_logging_metadatar   r¢  ry   r  rž  rÁ  r‡   rÐ  rÉ   r   )r@   Úoriginal_model_groupr   rÃ  r5  rµ  Ú_metadata_keyr  Ústandard_metadataÚ
_new_modelr"  r¸  s               rD   Úlog_success_fallback_eventz+PrometheusLogger.log_success_fallback_event\  s  è ø€ ÷	
ô
 	×ÑØZØ Øô	
ô
  FÀfÓMˆØ!Ÿ:™: mÓ4Ò:¸ˆ	Ø<W×<uÑ<uØð =vó =
Ðð #ŸJ™J wÓ/ˆ
ÜœD¤™I v§z¡z°&Ó'9Ò'?¸RÓ@ˆä2Ø0Ø%Ø,Ð-@ÑAØ+Ð,@ÑAØ"Ð#9Ñ:Ø(Ð)BÑCÜ ¤Ð);¸]ÈDÓ!QÓRØ ×:Ñ:Ð;MÓNØô

ˆô 	×-Ñ-ØØ×8Ñ8Ø5ØÜ7¸ÓDð 	.õ 	
ùó   ‚C>D c              ƒ  ó  K  — ddl m}m} t        j                  d||«       |j                  d«      }t        |«      }|j                  |«      xs i }t        t        t           |j                  d«      xs g «      }	|j                  |¬«      }
t        |||
d   |
d   |
d	   |
d
   t        t        |dd«      «      | j                  |«      |	¬«	      }t        j                  | | j                   d|t#        |«      ¬«       y­w)z@
        Logs a failed LLM fallback event on prometheus
        r   r4  zLPrometheus: log_failure_fallback_event, original_model_group: %s, kwargs: %srÙ   rñ  r÷  rÚ  rÛ  rÜ  rÝ  rî  Nr6  rÊ   r  )rº  r5  rµ  r   r‚   r’  r   r   r¢  ry   r8  r  rž  rÁ  r‡   rÐ  rÊ   r   )r@   r9  r   rÃ  r5  rµ  r<  r:  r  r"  r;  r¸  s               rD   Úlog_failure_fallback_eventz+PrometheusLogger.log_failure_fallback_event‡  s  è ø€ ÷	
ô
 	×ÑØZØ Øô	
ð
 #ŸJ™J wÓ/ˆ
ÜEÀfÓMˆØ!Ÿ:™: mÓ4Ò:¸ˆ	ÜœD¤™I v§z¡z°&Ó'9Ò'?¸RÓ@ˆØ<W×<uÑ<uØð =vó =
Ðô 3Ø0Ø%Ø,Ð-@ÑAØ+Ð,@ÑAØ"Ð#9Ñ:Ø(Ð)BÑCÜ ¤Ð);¸]ÈDÓ!QÓRØ ×:Ñ:Ð;MÓNØô

ˆô 	×-Ñ-ØØ×4Ñ4Ø1ØÜ7¸ÓDð 	.õ 	
ùr>  c           	     ó®   — t        | j                  d¬«      t        ||||¬«      ¬«      } | j                  j                  di |¤Žj                  |«       y)z+
        Set the deployment state.
        rÁ   rµ  ré  rø  Nr?   )r»  r÷   r  rÁ   rs   r  )r@   Ústaterð  rò  ró  rÀ   rÏ  s          rD   Úset_litellm_deployment_statez-PrometheusLogger.set_litellm_deployment_state±  sZ   € ô 2Ø"&×"<Ñ"<ÐIcÐ"<Ó"dÜ-Ø#5Ø!Ø!Ø)ô	ô
ˆð 	-ˆ×%Ñ%×,Ñ,Ñ7¨wÑ7×;Ñ;¸EÕBrQ   c                ó.   — | j                  d||||«       y )Nr   ©rC  ©r@   rð  rò  ró  rÀ   s        rD   r  z'PrometheusLogger.set_deployment_healthyÈ  ó   € ð 	×)Ñ)¨!Ð-?ÀÈ8ÐUaÕbrQ   c                ó.   — | j                  d||||«       y )Nr­  rE  rF  s        rD   rê  z.PrometheusLogger.set_deployment_partial_outageÑ  rG  rQ   c                ó.   — | j                  d||||«       y )Né   rE  rF  s        rD   Úset_deployment_complete_outagez/PrometheusLogger.set_deployment_complete_outageÚ  rG  rQ   c           	     ó¸   — | j                   j                  t        |«      t        |«      t        |«      t        |«      t        |«      «      j                  «        y)zn
        increment metric when litellm.Router / load balancing logic places a deployment in cool down
        N)rÄ   rs   r(   rÌ  )r@   rð  rò  ró  rÀ   rõ  s         rD   Ú increment_deployment_cooled_downz1PrometheusLogger.increment_deployment_cooled_downã  sK   € ð 	×+Ñ+×2Ñ2Ü,Ð-?Ó@Ü,¨XÓ6Ü,¨XÓ6Ü,¨\Ó:Ü,Ð-=Ó>ó	
÷ ‰#�%rQ   c                óX   — | j                   j                  |¬«      j                  «        y)za
        Increment metric when logging to a callback fails (e.g., s3_v2, langfuse, etc.)
        )rÌ   N)rË   rs   rÌ  )r@   rÌ   s     rD   Ú"increment_callback_logging_failurez3PrometheusLogger.increment_callback_logging_failureö  s$   € ð 	×5Ñ5×<Ñ<È=Ð<ÓY×]Ñ]Õ_rQ   c                óz   — | j                   j                  |«      j                  | j                  ||¬«      «       y)z?
        Track provider remaining budget in Prometheus
        ©rY   ÚspendN)r¿   rs   r  Ú_safe_get_remaining_budget)r@   r²  rR  Úbudget_limits       rD   Útrack_provider_remaining_budgetz0PrometheusLogger.track_provider_remaining_budgetÿ  s<   € ð 	×5Ñ5×<Ñ<¸XÓF×JÑJØ×+Ñ+Ø'Øð ,ó õ	
rQ   c                ó.   — |€t        d«      S |€|S ||z
  S )NÚinf)r~   )r@   rY   rR  s      rD   rS  z+PrometheusLogger._safe_get_remaining_budget
  s(   € ØÐÜ˜“<Ðàˆ=ØÐà˜EÑ!Ð!rQ   c              ƒ  ó~  K  — ddl m} |€y	 d}d} |||¬«      ƒ d{  –—† \  }}|€t        |«      }||z   dz
  |z  }	 ||«      ƒ d{  –—†  t        d|	dz   «      D ]'  } |||¬«      ƒ d{  –—† \  }}
 ||«      ƒ d{  –—†  Œ) y7 Œi7 Œ@7 Œ7 Œ# t        $ r!}t        j                  d||«       Y d}~yd}~ww xY w­w)	ab  
        Generic method to initialize budget metrics for teams or API keys.

        Args:
            data_fetch_function: Function to fetch data with pagination.
            set_metrics_function: Function to set metrics for the fetched data.
            data_type: String representing the type of data ("teams" or "keys") for logging purposes.
        r   ©Úprisma_clientNr­  é2   )Ú	page_sizeÚpagerJ  z(Error initializing %s budget metrics: %s)rþ  rZ  r+  Úrangerÿ   r   r™  )r@   Údata_fetch_functionÚset_metrics_functionÚ	data_typerZ  r]  r\  rÈ  Útotal_countÚtotal_pagesÚ_r  s               rD   Ú_initialize_budget_metricsz+PrometheusLogger._initialize_budget_metrics  së   è ø€ õ 	=àÐ Øð	_ØˆDØ!ˆIÙ&9ÀIÐTXÔ&Y× YÑˆD�+àÐ"Ü! $›i�ð #.°	Ñ"9¸AÑ"=À)Ñ!KˆKñ ' tÓ,×,Ð,ô ˜a ¨q¡Ó1ò 1�Ù 3¸iÈdÔ S×S‘��aÙ*¨4Ó0×0Ñ0ñ1ð !Zøð -øð TøØ0ùäò 	_Ü×$Ñ$Ð%OÐQZÐ\]×^Ñ^ûð	_üst   ‚
B=�B žBŸ*B Á	B
Á
#B Á-BÁ.B Â BÂB ÂB=ÂB Â
B ÂB ÂB Â	B:ÂB5Â0B=Â5B:Â:B=c              ƒ  ó¶   ‡‡K  — ddl mŠ ddlmŠ ‰€t	        j
                  d«       yd	ˆˆfd„}| j                  || j                  d¬«      ƒ d{  –—†  y7 Œ­w)
zY
        Initialize team budget metrics by reusing the generic pagination logic.
        r   )Úget_paginated_teamsrY  NzDPrometheus: skipping team metrics initialization, DB not initializedc              “  ó^   •K  —  ‰‰| |¬«      ƒ d {  –—† \  }}|€t        |«      }||fS 7 Œ­w)N)rZ  r\  r]  )r+  )r\  r]  Úteamsrb  rg  rZ  s       €€rD   Úfetch_teamszEPrometheusLogger._initialize_team_budget_metrics.<locals>.fetch_teamsI  s?   øè ø€ Ù':ÈÐbkÐrvÔ'w×!wÑˆE�;ØÐ"Ü! %›j�Ø˜+Ð%Ð%ð "xús   ƒ-’+“-ri  ©r_  r`  ra  )r\  rK   r]  rK   rL   z*tuple[list[LiteLLM_TeamTable], int | None])Ú1litellm.proxy.management_endpoints.team_endpointsrg  rþ  rZ  r   r‚   re  Ú_set_team_list_budget_metrics)r@   rj  rg  rZ  s     @@rD   Ú_initialize_team_budget_metricsz0PrometheusLogger._initialize_team_budget_metrics<  s\   ùè ø€ õ	
õ 	=àÐ Ü× Ñ Ð!gÔhØö	&ð ×-Ñ-Ø +Ø!%×!CÑ!CØð .ó 
÷ 	
ò 	
ús   „AAÁAÁAc              ƒ  óÒ   ‡‡‡K  — ddl mŠ ddlmŠ ddlmŠ ‰€t        j                  d«       y	 	 	 	 	 	 d
ˆˆˆfd„}| j                  || j                  d¬	«      ƒ d{  –—†  y7 Œ­w)z\
        Initialize API key budget metrics by reusing the generic pagination logic.
        r   )ÚUI_SESSION_TOKEN_TEAM_ID)Ú_list_key_helperrY  NzCPrometheus: skipping key metrics initialization, DB not initializedc              “  ó¬   •K  —  ‰‰|| d d d d ‰dd ¬«
      ƒ d {  –—† }|j                  dg «      }|j                  d«      }|€t        |«      }||fS 7 Œ8­w)NT)
rZ  r]  Úsizer  r¿  r¾  Úkey_hashÚexclude_team_idÚreturn_full_objectÚorganization_idr  rb  )r’  r+  )r\  r]  Úkey_list_responser  rb  rp  rq  rZ  s        €€€rD   Ú
fetch_keyszGPrometheusLogger._initialize_api_key_budget_metrics.<locals>.fetch_keysc  sz   øè ø€ ñ .>Ø+ØØØØØØØ 8Ø#'Ø $ô.÷ (Ðð ,×/Ñ/°¸Ó;ˆDØ+×/Ñ/°Ó>ˆKØÐ"Ü! $›i�Ø˜Ð$Ð$ð!(ús   ƒA™Aš9Ar  rk  )r\  rK   r]  rK   rL   zPtuple[list[str | UserAPIKeyAuth | LiteLLM_DeletedVerificationToken], int | None])
Úlitellm.constantsrp  Ú;litellm.proxy.management_endpoints.key_management_endpointsrq  rþ  rZ  r   r‚   re  Ú_set_key_list_budget_metrics)r@   ry  rp  rq  rZ  s     @@@rD   Ú"_initialize_api_key_budget_metricsz3PrometheusLogger._initialize_api_key_budget_metricsU  s{   úè ø€ õ 	?õ	
õ 	=àÐ Ü× Ñ Ð!fÔgØð	%Øð	%Ø"%ð	%ð
÷	%ð0 ×-Ñ-Ø *Ø!%×!BÑ!BØð .ó 
÷ 	
ò 	
ús   …AA'ÁA%Á A'c              ƒ  ó¦   ‡K  — ddl mŠ ‰€t        j                  d«       ydˆfd„}| j	                  || j
                  d¬«      ƒ d{  –—†  y7 Œ­w)	zY
        Initialize user budget metrics by reusing the generic pagination logic.
        r   rY  NzDPrometheus: skipping user metrics initialization, DB not initializedc              “  óà   •K  — |dz
  | z  }t        t        ‰«      «      j                  || ddi¬«      ƒ d {  –—† }t        t        ‰«      «      j                  «       ƒ d {  –—† }||fS 7 Œ27 Œ
­w)Nr­  Ú
created_atÚdesc)rA   rB   rC   )rU   r$   rE   rI   )r\  r]  rA   Úusersrb  rZ  s        €rD   Úfetch_userszEPrometheusLogger._initialize_user_budget_metrics.<locals>.fetch_users‹  s|   øè ø€ Ø !™8 yÑ0ˆDÜ!1´.ÀÓ2OÓ!P×!ZÑ!ZØØØ# VÐ,ð "[ó "÷ ˆEô
 (8¼À}Ó8UÓ'V×'\Ñ'\Ó'^×!^ˆKØ˜+Ð%Ð%ðøð
 "_ús!   ƒ4A.·A*¸)A.Á!A,Á"	A.Á,A.r‚  rk  )r\  rK   r]  rK   rL   z*tuple[list[LiteLLM_UserTable], int | None])rþ  rZ  r   r‚   re  Ú_set_user_list_budget_metrics)r@   rƒ  rZ  s     @rD   Ú_initialize_user_budget_metricsz0PrometheusLogger._initialize_user_budget_metrics�  sW   øè ø€ õ 	=àÐ Ü× Ñ Ð!gÔhØõ	&ð ×-Ñ-Ø +Ø!%×!CÑ!CØð .ó 
÷ 	
ò 	
úó   ƒAAÁ	AÁ
Ac              ƒ  ó¦   ‡K  — ddl mŠ ‰€t        j                  d«       ydˆfd„}| j	                  || j
                  d¬«      ƒ d{  –—†  y7 Œ­w)	zX
        Initialize org budget metrics by reusing the generic pagination logic.
        r   rY  NzCPrometheus: skipping org metrics initialization, DB not initializedc              “  óæ   •K  — |dz
  | z  }t        t        ‰«      «      j                  || ddiddi¬«      ƒ d {  –—† }t        t        ‰«      «      j                  «       ƒ d {  –—† }||fS 7 Œ27 Œ
­w)Nr­  r€  r�  Úlitellm_budget_tableT)rA   rB   rC   r<   )rU   r"   rE   rI   )r\  r]  rA   Úorgsrb  rZ  s        €rD   Ú
fetch_orgszCPrometheusLogger._initialize_org_budget_metrics.<locals>.fetch_orgs¥  s†   øè ø€ Ø !™8 yÑ0ˆDÜ 0Ô1GÈÓ1VÓ W× aÑ aØØØ# VÐ,Ø/°Ð6ð	 !bó !÷ ˆDô (8Ô8NÈ}Ó8]Ó'^×'dÑ'dÓ'f×!fˆKØ˜Ð$Ð$ðøð "gús!   ƒ7A1ºA-»)A1Á$A/Á%	A1Á/A1rŠ  rk  )r\  rK   r]  rK   rL   ztuple[list, int | None])rþ  rZ  r   r‚   re  Ú_set_org_list_budget_metrics)r@   r‹  rZ  s     @rD   Ú_initialize_org_budget_metricsz/PrometheusLogger._initialize_org_budget_metrics›  sW   øè ø€ õ 	=àÐ Ü× Ñ Ð!fÔgØõ		%ð ×-Ñ-Ø *Ø!%×!BÑ!BØð .ó 
÷ 	
ò 	
úr†  c              ƒ  óŠ  K  — ddl m} ddlm} |j                  j
                  }|r[|j                  rO|j                  |¬«      ƒ d{  –—† r4	 | j                  «       ƒ d{  –—†  |j                  |¬«      ƒ d{  –—†  yy| j                  «       ƒ d{  –—†  y7 ŒR7 Œ;7 Œ## |j                  |¬«      ƒ d{  –—†7   w xY w7 Œ+­w)a¡  
        Handler for initializing remaining budget metrics for all teams to avoid metric discrepancies.

        Runs when prometheus logger starts up.

        - If redis cache is available, we use the pod lock manager to acquire a lock and initialize the metrics.
            - Ensures only one pod emits the metrics at a time.
        - If redis cache is not available, we initialize the metrics directly.
        r   )Ú'PROMETHEUS_EMIT_BUDGET_METRICS_JOB_NAME)Úproxy_logging_obj)Ú
cronjob_idN)
rz  r�  rþ  r�  Údb_spend_update_writerÚpod_lock_managerÚredis_cacheÚacquire_lockÚ$_initialize_remaining_budget_metricsÚrelease_lock)r@   r�  r�  r“  s       rD   Ú#initialize_remaining_budget_metricsz4PrometheusLogger.initialize_remaining_budget_metrics¶  s¾   è ø€ õ 	NÝ@à"3×"JÑ"J×"[Ñ"[Ðñ Ð 0× <Ò <Ø%×2Ñ2Ð>eÐ2Óf×fÐfðlØ×CÑCÓE×EÐEà*×7Ñ7ÐCjÐ7Ók×kÑkð	 gð ×;Ñ;Ó=×=Ñ=ð gøàEøàkùÐ*×7Ñ7ÐCjÐ7Ók×kÒkúð >úsf   ‚ACÁBÁ	CÁB! Á!BÁ"B! Á&CÁ;BÁ<CÂCÂCÂB! ÂCÂ!B>Â7B:Â8B>Â>Cc              ƒ  ó:  K  — t        j                  d«       | j                  «       ƒ d{  –—†  | j                  «       ƒ d{  –—†  | j	                  «       ƒ d{  –—†  | j                  «       ƒ d{  –—†  | j                  «       ƒ d{  –—†  y7 Œe7 ŒO7 Œ97 Œ#7 Œ­w)zc
        Helper to initialize remaining budget metrics for all teams, API keys, and users.
        z0Emitting key, team, user, org budget metrics....N)r   r‚   rn  r}  r…  r�  Ú'_initialize_user_and_team_count_metricsrH   s    rD   r–  z5PrometheusLogger._initialize_remaining_budget_metricsÐ  s†   è ø€ ô 	×ÑÐOÔPØ×2Ñ2Ó4×4Ð4Ø×5Ñ5Ó7×7Ð7Ø×2Ñ2Ó4×4Ð4Ø×1Ñ1Ó3×3Ð3Ø×:Ñ:Ó<×<Ñ<ð	 	5øØ7øØ4øØ3øØ<úsW   ‚)B«B¬BÁBÁBÁBÁBÁ3BÁ4BÂBÂBÂBÂBÂBÂBc              ƒ  ó¾  K  — ddl m} |€t        j                  d«       y	 t	        t        |«      «      j                  «       ƒ d{  –—† }| j                  j                  |«       t        j                  d|«       t        |«      j                  «       ƒ d{  –—† }| j                  j                  |«       t        j                  d|«       t	        t        |«      «      j                  «       ƒ d{  –—† }| j                  j                  |«       t        j                  d|«       y7 Œã7 Œ“7 Œ:# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)	a@  
        Initialize user and team count metrics by querying the database.

        Updates:
        - litellm_total_users: Total count of users in the database
        - litellm_active_users: Count of billable users (excludes SCIM-deactivated)
        - litellm_teams_count: Total count of teams in the database
        r   rY  NzOPrometheus: skipping user/team count metrics initialization, DB not initializedz)Prometheus: set litellm_total_users to %sz*Prometheus: set litellm_active_users to %sz)Prometheus: set litellm_teams_count to %sz.Error initializing user/team count metrics: %s)rþ  rZ  r   r‚   rU   r$   rI   rû   r  Úcount_billable_usersrü   r#   rý   rÿ   r™  )r@   rZ  Útotal_usersÚbillable_usersÚtotal_teamsr  s         rD   rš  z8PrometheusLogger._initialize_user_and_team_count_metricsÛ  s"  è ø€ õ 	=àÐ Ü× Ñ Ð!rÔsØð	Zä'7¼À}Ó8UÓ'V×'\Ñ'\Ó'^×!^ˆKØ×+Ñ+×/Ñ/°Ô<Ü× Ñ Ð!LÈkÔZä*8¸Ó*G×*\Ñ*\Ó*^×$^ˆNØ×,Ñ,×0Ñ0°Ô@Ü× Ñ Ð!MÈ~Ô^ô (8¼À}Ó8UÓ'V×'\Ñ'\Ó'^×!^ˆKØ×+Ñ+×/Ñ/°Ô<Ü× Ñ Ð!LÈkÕZð "_øð %_øð
 "_ùô ò 	ZÜ×$Ñ$Ð%UÐWX×YÑYûð	Züsf   ‚E¢%D1 ÁD+ÁAD1 ÂD-ÂAD1 Ã4D/Ã55D1 Ä*EÄ+D1 Ä-D1 Ä/D1 Ä1	EÄ:EÅEÅEÅEc              ƒ  ó^   K  — |D ]$  }t        |t        «      sŒ| j                  |«       Œ& y­w)z8Helper function to set budget metrics for a list of keysN)r‹   r    Ú_set_key_budget_metrics)r@   r  rK  s      rD   r|  z-PrometheusLogger._set_key_list_budget_metricsû  s/   è ø€ ð ò 	2ˆCÜ˜#œ~Õ.Ø×,Ñ,¨SÕ1ñ	2ùs   ‚-™-c              ƒ  ó<   K  — |D ]  }| j                  |«       Œ y­w)z9Helper function to set budget metrics for a list of teamsN)Ú_set_team_budget_metrics)r@   ri  ré  s      rD   rm  z.PrometheusLogger._set_team_list_budget_metrics  ó#   è ø€ àò 	0ˆDØ×)Ñ)¨$Õ/ñ	0ùó   ‚c              ƒ  ó<   K  — |D ]  }| j                  |«       Œ y­w)z9Helper function to set budget metrics for a list of usersN)Ú_set_user_budget_metrics)r@   r‚  rÚ   s      rD   r„  z.PrometheusLogger._set_user_list_budget_metrics  r¤  r¥  c              ƒ  óî   K  — |D ]l  }t        |dd«      }| j                  |j                  xs d|j                  xs d|j                  xs d|r|j
                  nd|rt        |dd«      nd¬«       Œn y­w)z8Helper function to set budget metrics for a list of orgsr‰  Nr�  r­  r[   ©rë  rì  rR  rY   r[   )rž  Ú_set_org_budget_metricsrw  rÀ  rR  rY   )r@   rŠ  rc  Úbudget_tables       rD   rŒ  z-PrometheusLogger._set_org_list_budget_metrics  s   è ø€ àò 	ˆCÜ18¸Ð>TÐVZÓ1[ˆLØ×(Ñ(Ø×*Ñ*Ò0¨bØ×0Ñ0Ò6°BØ—i‘iÒ& 3Ù6B˜<×2Ò2ÈÙS_¤¨Ð7HÈ$Ô!OÐeið )õ ñ	ùs   ‚A3A5c              ƒ  ó²   K  — t        | j                  t        «      ry|r4| j                  ||xs d|||¬«      ƒ d{  –—† }| j	                  |«       yy7 Œ­w)zÙ
        Set team budget metrics after an LLM API request

        - Assemble a LiteLLM_TeamTable object
            - looks up team info from db if not available in metadata
        - Set team budget metrics
        Nr�  )r¿  rê  rR  rY   râ  )r‹   r¥   r“  Ú_assemble_team_objectr£  )r@   r  r  r\  r]  râ  Úteam_objects          rD   rg  z;PrometheusLogger._set_team_budget_metrics_after_api_request  sg   è ø€ ô �d×?Ñ?ÄÔLØáØ'+×'AÑ'AØ%Ø.Ò4°"Ø Ø*Ø+ð (Bó (÷ "ˆKð ×)Ñ)¨+Õ6ð ð"úó   ‚;A½A¾Ac              ƒ  óZ  K  — ddl m} ddlm}m} |xs d|z   }	t        |||	|¬«      }
	  ||||¬«      ƒ d{  –—† }|r:|j                  |
_	        |
j                  €|j                  �|j                  |
_
        |
S 7 ŒB# t        $ r"}t        j                  d|«       |
cY d}~S d}~ww xY w­w)z»
        Assemble a LiteLLM_TeamTable object

        for fields not available in metadata, we fetch from db
        Fields not available in metadata:
        - `budget_reset_at`
        r   )Úget_team_object©rZ  Úuser_api_key_cache)r¿  rê  rR  rY   )r¿  rZ  r³  Nz6[Non-Blocking] Prometheus: Error getting team info: %s)Úlitellm.proxy.auth.auth_checksr±  rþ  rZ  r³  r   rÿ   r   r‚   r[   rY   )r@   r¿  rê  rR  rY   râ  r±  rZ  r³  Ú_total_team_spendr®  Ú	team_infor  s                rD   r­  z&PrometheusLogger._assemble_team_object6  s½   è ø€ õ 	CßPà$)¢J¨Q°-Ñ#?ÐÜ.ØØ!Ø#Ø!ô	
ˆð	Ù%4ØØ+Ø#5ô&÷  ˆIñ Ø*3×*CÑ*CˆKÔ'Ø×%Ñ%Ð-°)×2FÑ2FÐ2RØ)2×)=Ñ)=�Ô&àÐð ùô
 ò 	Ü× Ñ Ð!YÐ[\Ô]ØÕûð	üsC   ‚'B+ªA= ¸A;¹A= ½>B+Á;A= Á=	B(ÂB#ÂB(ÂB+Â#B(Â(B+c                óÂ  — t        |j                  |j                  xs d¬«      }t        | j	                  d¬«      |¬«      } | j
                  j                  di |¤Žj                  | j                  |j                  |j                  ¬«      «       |j                  �Rt        | j	                  d¬«      |¬«      } | j                  j                  di |¤Žj                  |j                  «       |j                  �ct        | j	                  d	¬«      |¬«      } | j                  j                  di |¤Žj                  | j                  |j                  ¬
«      «       yy)z†
        Set team budget metrics for a single team

        - Remaining Budget
        - Max Budget
        - Budget Reset At
        r�  ©ré  rê  r¥   rµ  rø  rQ  Nr¦   r§   ©r[   r?   )r  r¿  rê  r»  r÷   r¥   rs   r  rS  rY   rR  r¦   r[   r§   Ú%_get_remaining_hours_for_budget_reset©r@   ré  r¸  rÏ  s       rD   r£  z)PrometheusLogger._set_team_budget_metrics`  sS  € ô 3Ø—‘Ø—‘Ò,¨"ô
ˆô
 +Ø"&×"<Ñ"<ÐIoÐ"<Ó"pØ#ô
ˆð 	9ˆ×1Ñ1×8Ñ8ÑC¸7ÑC×GÑGØ×+Ñ+ØŸ?™?Ø—j‘jð ,ó ô	
ð �?‰?Ð&Ü.Ø&*×&@Ñ&@ÐMmÐ&@Ó&nØ'ôˆGð 7ˆD×/Ñ/×6Ñ6ÑA¸ÑA×EÑEÀdÇoÁoÔVà×ÑÐ+Ü.Ø&*×&@Ñ&@Ø Lð 'Aó 'ð (ô	ˆGð CˆD×;Ñ;×BÑBÑMÀWÑM×QÑQØ×:Ñ:È4×K_ÑK_Ð:Ó`õð ,rQ   c                ó  — t        |j                  |j                  xs d¬«      }t        | j	                  d¬«      |¬«      } | j
                  j                  di |¤Žj                  t        |j                  «      «       y)z>Set the team members gauge to the team's current member count.r�  r¸  r¨   rµ  rø  Nr?   )
r  r¿  rê  r»  r÷   r¨   rs   r  r+  Úmembers_with_rolesr»  s       rD   Úset_team_members_metricz(PrometheusLogger.set_team_members_metric�  sq   € ä2Ø—‘Ø—‘Ò,¨"ô
ˆô 2Ø"&×"<Ñ"<ÐIfÐ"<Ó"gØ#ô
ˆð 	0ˆ×(Ñ(×/Ñ/Ñ:°'Ñ:×>Ñ>¼sÀ4×CZÑCZÓ?[Õ\rQ   c              ƒ  óÂ  K  — t        | j                  t        «      ry|syddlm} ddlm}m} |€y	  ||||d¬«      ƒ d{  –—† }|€y|j                  xs d}|j                  xs d	|z   }	|j                  }
|
r|
j                  nd}|
rt        |
d
d«      nd}| j!                  |||	||¬«       y7 Œn# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w­w)zš
        Set org budget metrics after an LLM API request

        - Fetches org info via cache (get_org_object)
        - Sets org budget metrics
        Nr   )Úget_org_objectr²  T)rë  rZ  r³  Úinclude_budget_tablez5[Non-Blocking] Prometheus: Error getting org info: %sr�  r­  r[   r©  )r‹   r©   r“  r´  rÀ  rþ  rZ  r³  rÿ   r   r‚   rÀ  rR  r‰  rY   rž  rª  )r@   rë  râ  rÀ  rZ  r³  Úorg_infor  rì  Ú_total_org_spendr«  rY   r[   s                rD   ri  z:PrometheusLogger._set_org_budget_metrics_after_api_request™  sú   è ø€ ô �d×>Ñ>Ä
ÔKØáØåAßPàÐ Øð		Ù$2ØØ+Ø#5Ø%)ô	%÷ ˆHð ÐØà#×6Ñ6Ò<¸"ˆ	Ø#+§>¡>Ò#8°S¸MÑ"IÐØ&×;Ñ;ˆÙ7C˜L×3Ò3Èˆ
ÙS_¤¨Ð7HÈ$Ô!OÐeiˆà×$Ñ$ØØØ"Ø!Ø+ð 	%õ 	
ð'ùô ò 	Ü× Ñ Ð!XÐZ[Ô\Üûð	üsA   ‚0C³B3 ÁB1ÁB3 ÁA*CÂ1B3 Â3	CÂ<CÃCÃCÃCc                ó  — t        ||¬«      }t        | j                  d¬«      |¬«      } | j                  j                  d
i |¤Žj                  | j                  ||¬«      «       |�Ht        | j                  d¬«      |¬«      } | j                  j                  d
i |¤Žj                  |«       |�Yt        | j                  d¬«      |¬«      } | j                  j                  d
i |¤Žj                  | j                  |¬	«      «       yy)z„
        Set org budget metrics for a single org

        - Remaining Budget
        - Max Budget
        - Budget Reset At
        )rë  rì  r©   rµ  rø  rQ  Nrª   r«   r¹  r?   )
r  r»  r÷   r©   rs   r  rS  rª   r«   rº  )r@   rë  rì  rR  rY   r[   r¸  rÏ  s           rD   rª  z(PrometheusLogger._set_org_budget_metricsÌ  s*  € ô 3ØØô
ˆô
 +Ø"&×"<Ñ"<ÐInÐ"<Ó"oØ#ô
ˆð 	8ˆ×0Ñ0×7Ñ7ÑB¸'ÑB×FÑFØ×+Ñ+Ø%Øð ,ó ô	
ð Ð!Ü.Ø&*×&@Ñ&@ÐMlÐ&@Ó&mØ'ôˆGð 6ˆD×.Ñ.×5Ñ5Ñ@¸Ñ@×DÑDÀZÔPàÐ&Ü.Ø&*×&@Ñ&@Ø Kð 'Aó 'ð (ô	ˆGð BˆD×:Ñ:×AÑAÑLÀGÑL×PÑPØ×:Ñ:È?Ð:Ó[õð 'rQ   c                óˆ  — t        |j                  |j                  xs d¬«      }t        | j	                  d¬«      |¬«      } | j
                  j                  d
i |¤Žj                  | j                  |j                  |j                  ¬«      «       |j                  �Rt        | j	                  d¬«      |¬«      } | j                  j                  d
i |¤Žj                  |j                  «       |j                  �F | j                  j                  d
i |¤Žj                  | j                  |j                  ¬	«      «       yy)z{
        Set virtual key budget metrics

        - Remaining Budget
        - Max Budget
        - Budget Reset At
        r�  )ræ  rÜ   r¬   rµ  rø  rQ  Nr­   r¹  r?   )r  Útokenr¾  r»  r÷   r¬   rs   r  rS  rY   rR  r­   r[   r®   rº  )r@   r«  r¸  rÏ  s       rD   r¡  z(PrometheusLogger._set_key_budget_metricsý  s8  € ô 3Ø,×2Ñ2Ø+×5Ñ5Ò;¸ô
ˆô +Ø"&×"<Ñ"<ÐIrÐ"<Ó"sØ#ô
ˆð 	<ˆ×4Ñ4×;Ñ;ÑF¸gÑF×JÑJØ×+Ñ+Ø,×7Ñ7Ø'×-Ñ-ð ,ó ô	
ð ×'Ñ'Ð3Ü.Ø&*×&@Ñ&@ÐMpÐ&@Ó&qØ'ôˆGð :ˆD×2Ñ2×9Ñ9ÑD¸GÑD×HÑHÐIZ×IeÑIeÔfà×,Ñ,Ð8ØEˆD×>Ñ>×EÑEÑPÈÑP×TÑTØ×:Ñ:ÐK\×KlÑKlÐ:Ómõð 9rQ   c              ƒ  ó²   K  — t        | j                  t        «      ry |r4| j                  ||xs d|||¬«      ƒ d {  –—† }| j	                  |«       y y 7 Œ­w)Nr�  )r  rÛ  rZ  r[  râ  )r‹   r¬   r“  Ú_assemble_key_objectr¡  )r@   r  rÛ  râ  rZ  r[  r«  s          rD   rf  z>PrometheusLogger._set_api_key_budget_metrics_after_api_request   si   è ø€ ô �d×BÑBÄJÔOØáØ-1×-FÑ-FØ)Ø#5Ò#;¸Ø-Ø#Ø+ð .Gó .÷ (Ðð ×(Ñ(Ð):Õ;ð ð(úr¯  c              ƒ  ó4  K  — ddl m} ddlm}m} |xs d|z   }	t        ||||	¬«      }
	 |
j                  r1 ||
j                  ||d¬«      ƒ d{  –—† }|r|j                  |
_        |
S 7 Œ# t        $ r!}t        j                  d|«       Y d}~|
S d}~ww xY w­w)	z2
        Assemble a UserAPIKeyAuth object
        r   )Úget_key_objectr²  )rÆ  r¾  rY   rR  T)Úhashed_tokenrZ  r³  Úcheck_cache_onlyNz5[Non-Blocking] Prometheus: Error getting key info: %s)r´  rÊ  rþ  rZ  r³  r    rÆ  r[   rÿ   r   r‚   )r@   r  rÛ  rZ  r[  râ  rÊ  rZ  r³  Ú_total_key_spendr«  Ú
key_objectr  s                rD   rÈ  z%PrometheusLogger._assemble_key_object5  s´   è ø€ õ 	BßPà#,¢>°°]Ñ"BÐÜ#1ØØ(Ø%Ø"ô	$
Ðð	]Ø ×&Ò&Ù*8Ø!2×!8Ñ!8Ø"/Ø'9Ø%)ô	+÷ %�
ñ Ø8B×8RÑ8RÐ%Ô5ð !Ð ð%ùô ò 	]Ü× Ñ Ð!XÐZ[×\Ð\à Ð ûð	]üs@   ‚'Bª%A+ ÁA)ÁA+ Á'BÁ)A+ Á+	BÁ4BÂ
BÂBÂBc              ƒ  ó¨   K  — t        | j                  t        «      ry|r/| j                  ||||¬«      ƒ d{  –—† }| j	                  |«       yy7 Œ­w)zÙ
        Set user budget metrics after an LLM API request

        - Assemble a LiteLLM_UserTable object
            - looks up user info from db if not available in metadata
        - Set user budget metrics
        N)r  rR  rY   râ  )r‹   r¯   r“  Ú_assemble_user_objectr§  )r@   r  r^  r_  râ  Úuser_objects         rD   rh  z;PrometheusLogger._set_user_budget_metrics_after_api_requestY  s_   è ø€ ô �d×?Ñ?ÄÔLØáØ'+×'AÑ'AØØ Ø*Ø+ð	 (Bó (÷ "ˆKð ×)Ñ)¨+Õ6ð ð"ús   ‚6A¸A¹Ac              ƒ  óÐ  K  — ddl m} ddlm}m} |xs d|z   }t        |||¬«      }		  ||||dd¬«      ƒ d{  –—† }
|
rt|
j                  |	_	        |	j                  €|
j                  �|
j                  |	_
        |
j                  �|
j                  |	_        |
j                  �|
j                  |	_        |	S 7 Œ|# t        $ r"}t        j                  d|«       |	cY d}~S d}~ww xY w­w)	z»
        Assemble a LiteLLM_UserTable object

        for fields not available in metadata, we fetch from db
        Fields not available in metadata:
        - `budget_reset_at`
        r   )Úget_user_objectr²  )r  rR  rY   F)r  rZ  r³  Úuser_id_upsertÚcheck_db_onlyNz6[Non-Blocking] Prometheus: Error getting user info: %s)r´  rÓ  rþ  rZ  r³  r   rÿ   r   r‚   r[   rY   rÛ   Ú
user_alias)r@   r  rR  rY   râ  rÓ  rZ  r³  Ú_total_user_spendrÑ  Ú	user_infor  s               rD   rÐ  z&PrometheusLogger._assemble_user_objectt  sö   è ø€ õ 	CßPà$)¢J¨Q°-Ñ#?ÐÜ.ØØ#Ø!ô
ˆð
	ñ &5ØØ+Ø#5Ø$Ø#ô&÷  ˆIñ Ø*3×*CÑ*CˆKÔ'Ø×%Ñ%Ð-°)×2FÑ2FÐ2RØ)2×)=Ñ)=�Ô&Ø×#Ñ#Ð/Ø)2×)=Ñ)=�Ô&Ø×#Ñ#Ð/Ø)2×)=Ñ)=�Ô&àÐð) ùô ò 	Ü× Ñ Ð!YÐ[\Ô]ØÕûð	üsD   ‚&C&©B8 ¹B6ºB8 ¾A8C&Â6B8 Â8	C#ÃCÃC#ÃC&ÃC#Ã#C&c                óà  — t        |j                  |j                  xs d|j                  xs d¬«      }t	        | j                  d¬«      |¬«      } | j                  j                  di |¤Žj                  | j                  |j                  |j                  ¬«      «       |j                  �Rt	        | j                  d¬«      |¬«      } | j                  j                  di |¤Žj                  |j                  «       |j                  �ct	        | j                  d	¬«      |¬«      } | j                  j                  di |¤Žj                  | j                  |j                  ¬
«      «       yy)z†
        Set user budget metrics for a single user

        - Remaining Budget
        - Max Budget
        - Budget Reset At
        r�  )rÚ   rÛ   rÖ  r¯   rµ  rø  rQ  Nr°   r±   r¹  r?   )r  r  rÛ   rÖ  r»  r÷   r¯   rs   r  rS  rY   rR  r°   r[   r±   rº  )r@   rÚ   r¸  rÏ  s       rD   r§  z)PrometheusLogger._set_user_budget_metrics¤  s_  € ô 3Ø—‘Ø—‘Ò,¨"Ø—‘Ò,¨"ô
ˆô +Ø"&×"<Ñ"<ÐIoÐ"<Ó"pØ#ô
ˆð 	9ˆ×1Ñ1×8Ñ8ÑC¸7ÑC×GÑGØ×+Ñ+ØŸ?™?Ø—j‘jð ,ó ô	
ð �?‰?Ð&Ü.Ø&*×&@Ñ&@ÐMmÐ&@Ó&nØ'ôˆGð 7ˆD×/Ñ/×6Ñ6ÑA¸ÑA×EÑEÀdÇoÁoÔVà×ÑÐ+Ü.Ø&*×&@Ñ&@Ø Lð 'Aó 'ð (ô	ˆGð CˆD×;Ñ;×BÑBÑMÀWÑM×QÑQØ×:Ñ:È4×K_ÑK_Ð:Ó`õð ,rQ   c                óh   — |t        j                  |j                  «      z
  j                  «       dz  S )z6
        Get remaining hours for budget reset
        i  )r   rŽ  Útzinfor  )r@   r[   s     rD   rº  z6PrometheusLogger._get_remaining_hours_for_budget_resetÒ  s-   € ð  ¤(§,¡,¨×/EÑ/EÓ"FÑF×UÑUÓWÐZ^Ñ^Ð^rQ   c                ój   — t        |t        «      r#t        |t        «      r||z
  j                  «       S y)zÀ
        Compute the duration in seconds between two objects.

        Returns the duration as a float if both start and end are instances of datetime,
        otherwise returns None.
        N)r‹   r   r  )r@   r  r  s      rD   r�  z'PrometheusLogger._safe_duration_secondsØ  s.   € ô �j¤(Ô+´
¸8ÄXÔ0NØ˜zÑ)×8Ñ8Ó:Ð:ØrQ   c                óJ  — ddl m} t        j                  j	                  t
        ¬«      }t        j                  dt        |«      «       t        |«      dkD  rLt        t
        |d   «      }t        j                  d|z  «       | j                  |j                  d|dd¬	«       y
y
)zÛ
        Initialize budget metrics as a cron job. This job runs every `PROMETHEUS_BUDGET_METRICS_REFRESH_INTERVAL_MINUTES` minutes.

        It emits the current remaining budget metrics for all Keys and Teams.
        r   )Ú2PROMETHEUS_BUDGET_METRICS_REFRESH_INTERVAL_MINUTES)Úcallback_typezfound %s prometheus loggerszNInitializing remaining budget metrics as a cron job executing every %s minutesÚintervalÚprometheus_budget_metrics_jobT)Úminutesr¸  Úreplace_existingN)rz  rÞ  r‰   Úlogging_callback_managerÚget_custom_loggers_for_typer‡   r   r‚   r+  r   Úadd_jobr˜  )Ú	schedulerrÞ  Úprometheus_loggersÚprometheus_loggers       rD   Ú"initialize_budget_metrics_cron_jobz3PrometheusLogger.initialize_budget_metrics_cron_jobç  s­   € õ 	Yä8?×8XÑ8X×8tÑ8tÜ*ð 9uó 9
Ðô 	×ÑÐ:¼CÐ@RÓ<SÔTÜÐ!Ó" QÒ&Ü'+Ô,<Ð>PÐQRÑ>SÓ'TÐÜ× Ñ Ø`ØDñEôð ×ÑØ!×EÑEØØJà2Ø!%ð õ ð 'rQ   c                 ó   — ddl m}  ddlm} ddlm} ddlm} dt        j                  v r)ddl m
}m}  |«       }|j                  |«        ||«      }n || «      }|j                  d|«       |j                  d	«       y
)a  
        Mount the Prometheus metrics endpoint with optional authentication.

        Args:
            require_auth (bool, optional): Whether to require authentication for the metrics endpoint.
                                        Defaults to False.
        r   )ÚREGISTRY)Úverbose_proxy_logger)Úmake_metrics_asgi_app)ÚappÚPROMETHEUS_MULTIPROC_DIR)ÚCollectorRegistryÚmultiprocessz/metricsz;Starting Prometheus Metrics on /metrics (no authentication)N)rè   rì  Úlitellm._loggingrí  Ú0litellm.integrations.prometheus_metrics_endpointrî  rþ  rï  r|   Úenvironrñ  rò  ÚMultiProcessCollectorÚmountr‚   )rì  rí  rî  rï  rñ  rò  ÚregistryÚmetrics_apps           rD   Ú_mount_metrics_endpointz(PrometheusLogger._mount_metrics_endpoint  sj   € õ 	/å9ÝZÝ2ð &¬¯©Ñ3ßIá/Ó1ˆHØ×.Ñ.¨xÔ8Ù/°Ó9‰Ká/°Ó9ˆKð 	�	‰	�*˜kÔ*Ø×"Ñ"Ð#`ÕarQ   )rL   zPrometheusLogger | None)rL   údict[str, list[str]])rL   z%tuple[frozenset[str], frozenset[str]])rL   rw   )r  r¢  rL   rB  )rC  ry   rL   zMetricValidationError | None)rC  ry   rs   ú	list[str]rL   zLabelValidationError | None)r  r¢  rL   rû  )rC  ry   rs   rü  )r  rB  rL   rx   )rC  ry   r-  rü  r,  rü  rL   rx   )r�  ry   r*  rq   rL   rx   )rC  ry   )rê   rû  rL   rx   )rC  ry   rL   r£  )rC  r'  rL   rü  )rŠ  r*   rL   r£  )r¯  r+   rL   r~   r>   )r¯  r+   r¸  r  r¹  ú$PrometheusLabelFactoryContext | NonerL   rx   )re   r   rC  r'  rs   údict[str, str | None]rL   rx   )Nç      ð?)rÍ  r   rC  r'  r¸  r  r¹  rý  rÎ  r~   rL   rx   )r¯  r+   r   râ  r  râ  rÛ  râ  rÙ   râ  r  râ  r  râ  r  râ  r¸  r  r¹  rý  )r;  z8Sequence[tuple[Any, DEFINED_PROMETHEUS_METRICS, object]]r¸  r  r¹  rý  rL   rx   )r¯  r+   r¸  r  r¹  rý  )r?  úMapping[str, object]rL   ztuple[int, int])r2  ÚobjectrL   ú
int | None)r¯  r+   r¸  r  râ  r~   rL   rx   r1  )r  râ  r  râ  r  râ  rÛ  râ  rÔ  r
  râ  r~   r  râ  rÞ  râ  )r   râ  r  râ  rÛ  râ  rÙ   râ  r  râ  r  râ  r  râ  râ  r~   r¸  r  r¹  rý  )r¯  zStandardLoggingPayload | Noner{  zLiteral['requests', 'tokens']rL   r  )
r  râ  rÛ  râ  r   r
  rÕ  r
  rò  râ  )r   r
  rÙ   râ  r  râ  rÛ  râ  r  râ  r  râ  r¸  r  r¹  rý  )NNN)r   údict | Noner¸  úUserAPIKeyLabelValues | Noner™  úException | NonerL   r  )rî  r  r™  r  rL   r£  )NNNNN)r   r  r«  zUserAPIKeyAuth | Noner¸  r  r¯  z$dict | StandardLoggingPayload | Noner™  r  rL   r£  )r±  r
  rL   râ  )r±  r
  rÃ  rÿ   r«  r    rÄ  râ  )rÈ  r
  r«  r    )rÌ  r   rK  ry   rÍ  r  rL   r   )rã  r
  rL   rþ  )rã  r
  )r·  r
  rÔ  r
  rð  râ  rò  râ  ró  râ  rì  râ  )rÿ  N)rã  r
  r¸  r  r  r~   r¹  rý  )
r2   ry   r  r~   r3   ry   r4   râ  r5   ry   )
rÙ   râ  rÀ   râ  rÚ   râ  rÛ   râ  rÜ   râ  )r  rK   r6   ry   r7   ry   rÙ   râ  rÀ   râ  rÚ   râ  )r7  r~   rÙ   râ  rÀ   râ  )r8   ry   )r!  rK   r"  z*list[tuple[str | None, str | None]] | None)r4   ry   )r™  rÿ   rL   ry   )r™  r  rL   ztuple[str | None, str | None])r9  ry   r   r
  rÃ  rÿ   )
rB  rK   rð  ry   rò  râ  ró  râ  rÀ   ry   )rð  ry   rò  ry   ró  ry   rÀ   ry   )rð  ry   rò  râ  ró  râ  rÀ   ry   )
rð  ry   rò  ry   ró  ry   rÀ   ry   rõ  ry   )rÌ   ry   )r²  ry   rR  r~   rT  r~   )rY   r\   rR  r\   rL   r~   )r_  z>Callable[..., Awaitable[tuple[list[_BudgetRowT], int | None]]]r`  z.Callable[[list[_BudgetRowT]], Awaitable[None]]ra  z)Literal['teams', 'keys', 'users', 'orgs'])r  z=list[str | UserAPIKeyAuth | LiteLLM_DeletedVerificationToken]rL   rx   )ri  zlist[LiteLLM_TeamTable])r‚  zlist[LiteLLM_UserTable])rŠ  r¢  )
r  râ  r  râ  r\  r\   r]  r\   râ  r~   )r¿  ry   rê  ry   rR  r\   rY   r\   râ  r~   rL   r   )ré  r   )ré  r   rL   rx   )rë  râ  râ  r~   )
rë  ry   rì  ry   rR  r~   rY   r\   r[   r]   )r«  r    )
r  râ  rÛ  râ  râ  r~   rZ  r\   r[  r\   )r  ry   rÛ  ry   rZ  r\   r[  r\   râ  r~   rL   r    )r  râ  r^  r\   r_  r\   râ  r~   )
r  ry   rR  r\   rY   r\   râ  r~   rL   r   )rÚ   r   )r[   r   rL   r~   )r  r   r  r   rL   r\   )rç  r,   )lrM   rN   rO   r$  r%   Úpre_callrp   Ú	post_callr¤  Ústaticmethodr�   rh   ré   rë   r)  r  r?  rA  r  rQ  r  rO  r‚  r„  r  r�  ró   r÷   r¨  r±  r¾  rÊ  rÐ  r#  r  r'  r  r1  r  r>  r0  r  r  r  r|  r  r  rš  r   r¨  r	  r³  rÆ  rÊ  rÎ  rå  r˜  rù  r  r  r  r  r  r  r  r  r#  r%  rÁ  r¼  r=  r@  rC  r  rê  rK  rM  rO  rU  rS  re  rn  r}  r…  r�  r˜  r–  rš  r|  rm  r„  rŒ  rg  r­  r£  r¾  ri  rª  r¡  rf  rÈ  rh  rÐ  r§  rº  r�  rê  rú  r?   rQ   rD   r‡   r‡   �   s  „ ñ !*Ð+>×+GÑ+G×+MÑ+MÐOb×OlÑOl×OrÑOrÐ*sÓ tÐàòó ðògóR'óR/ð0 òeó ðeóYó*	óó$óó*H:ðT,Øð,Ø09ð,ØIRð,à	ó,ó\'óZ	,ó=Dó~3òó*ð< ò_ó ð_ð ð
Ø"8ð
à	ò
ó ð
ð: ?Cð	
à"8ð
ð +ð
ð <ð	
ð
 
ó
ð4 
àð 
ð 0ð 
ð &ð	 
ð
 
ó 
ðN ?CØðJàðJð 0ðJð +ð	Jð
 <ðJð ðJð 
óJò E
ðd ?Cð3
à"8ð3
ð  ð3
ð !ð	3
ð
 'ð3
ð ð3
ð "ð3
ð (ð3
ð ð3
ð +ð3
ð <ó3
ðr ?Cð	;
à"8ð;
ð +ð;
ð <ð	;
ð
 
ó;
ðB ?Cð	$
à"8ð$
ð +ð$
ð <ð	$
ð
 
ó$
ðT ?Cð	àVðð +ðð <ð	ð
 
óð8 ?Cð	Là"8ðLð +ðLð <ó	Lð\ òJó ðJð. òó ðð)à"8ð)ð +ð)ð ð	)ð
 
ó)ðf #Ø*.ðPà!ðPð (ðPð !ð	Pð
 'ðPð ðPð ðPð ðPð (óPðz ?Cð
àð
ð !ð
ð 'ð	
ð
 ð
ð "ð
ð (ð
ð ð
ð ð
ð +ð
ð <ó
ð: ðØ"?ðà6ðð 
òó ððD  $ð:fà ð:fð 'ð:fð ð	:fð
 ð:fð ó:fðJ ?Cðeàðeð ðeð !ð	eð
 'ðeð "ðeð (ðeð +ðeð <óeòN4\ðp #Ø48Ø&*ð	3àð3ð 2ð3ð $ð	3ð
 
ó3ðp '+ð%àð%ð $ð%ð 
ó	%ðR #Ø37Ø48ØIMØ&*ð*àð*ð 1ð*ð 2ð	*ð
 #Gð*ð $ð*ð 
ó*ðX ò"ó ð"ðR %)ðM\àðM\ð &ðM\ð *ð	M\ð
 "óM\ó^ô*óY
óvBtðH%Iàð%Ið ð%Ið 'ð	%Ið
 ð%Ið ð%Ið !ó%IðV ?Cð	Iyà"8ðIyð +ðIyð <ð	Iyð
 
óIyðb  #Ø>BðNàðNð
 +ðNð ðNð <óNð`*Màð*Mð ð*Mð ð	*Mð
 ð*Mð ó*Mð`RàðRð !ðRð ð	Rð
 ðRð "óRð0 !Ø#'ØðNàðNð ðNð ð	Nð
 ðNð !ðNð óNð0 !Ø#'ð	SàðSð ðSð !ó	SðQàðQð !ðQð ð	Qð
 ðQð "óQó&Qð HLðVàðVð EóVó6[ð ò$$ó ð$$ðL ð
Ø#ð
à	&ò
ó ð
ó()
óV(
ðTCàðCð  ðCð ð	Cð
 ðCð óCð.càðcð ðcð ð	cð
 ócðcàðcð ðcð ð	cð
 ócðcàðcð ðcð ð	cð
 ócðàðð ðð ð	ð
 ðð óð&`àó`ó	
ó"ð'_à[ð'_ð Mð'_ð =ó	'_òR
ò2*
òX
ò4
ò6>ò4	=òZð@2ØQð2à	ó2ó0ó
0ó

ð7à!ð7ð (ð7ð !ð	7ð
 &ð7ð ó7ð:(àð(ð ð(ð ð	(ð
 !ð(ð ð(ð 
ó(ðT+àó+óZ
]ð1
àð1
ð ó1
ðf/àð/ð ð/ð ð	/ð
 !ð/ð )ó/ób!ðF<à ð<ð 'ð<ð ð	<ð
 %ð<ð  ó<ð*"!àð"!ð  ð"!ð %ð	"!ð
  ð"!ð ð"!ð 
ó"!ðH7àð7ð !ð7ð &ð	7ð
 ó7ð6.àð.ð ð.ð !ð	.ð
 ð.ð 
ó.ð`,àó,ó\_ðàðð ðð 
ó	ð òó ðð8 ñbó ñbrQ   r‡   c                ó"   — | j                  «       S )zSFlatten the label values into the opaque name/value mapping the label filters read.)Ú
model_dump)r¸  s    rD   Ú_label_sourcer  "  s   € à×!Ñ!Ó#Ð#rQ   c                óÈ  — | D �ci c]!  }||j                   v sŒ||j                   |   “Œ# }}t        j                  j                  |v r+|j	                  «       |t        j                  j                  <   |j
                  j                  «       D ]  \  }}|| v sŒ|||<   Œ |j                  j                  «       D ]  \  }}|| v sŒ|||<   Œ | D ]  }||vsŒd ||<   Œ |S c c}w r>   )Ú_sanitized_enumr6  rÅ  rp   Úget_resolved_end_userÚ_custom_by_sanitized_keyr‰  Ú_tag_labels)r·  Úctxr"  Úfiltered_labelsÚskrÔ  ÚkÚvs           rD   Ú_prometheus_labels_from_contextr  '  s  € ð
 8Mö5Ø.3ÐPUÐY\×YlÑYlÒPlˆˆs×"Ñ" 5Ñ)Ñ)ð5€Oð 5ô ×$Ñ$×*Ñ*¨oÑ=Ø?B×?XÑ?XÓ?ZˆÔ,×5Ñ5×;Ñ;Ñ<à×/Ñ/×5Ñ5Ó7ò &‰ˆˆCØÐ&Ò&Ø"%ˆO˜BÒð&ð —‘×%Ñ%Ó'ò #‰ˆˆ1ØÐ%Ò%Ø!"ˆO˜AÒð#ð 'ò *ˆØ˜Ò'Ø%)ˆO˜EÒ"ð*ð Ðùò'5s
   …C™Cr  c               ó¦  — |�%|j                   |urt        d«      ‚t        | |«      S t        |«      }|j	                  «       D ��ci c]  \  }}|| v r|t        |«      “Œ }}}t        j                  j                  |v r#t        «       } |d|j                  id¬«      |d<   |j                  �@|j                  j	                  «       D ]#  \  }	}t        |	«      }
|
| v sŒt        |«      ||
<   Œ% |j                  �@t        |j                  «      }|j	                  «       D ]  \  }	}|	| v sŒt        |«      ||	<   Œ | D ]  }||vsŒd||<   Œ |S c c}}w )a/  
    Returns a dictionary of label + values for prometheus.

    Ensures end_user param is not sent to prometheus if it is not supported.

    When ``label_context`` is provided, it must have been built from the same
    ``enum_values`` object; work is amortized (single model_dump, tag map, etc.).
    Nz@label_context.enum_values must be the same object as enum_valuesÚuser_api_key_end_user_idrÖ  )rÔ  rØ  rå  )r¸  r   r  r  r‰  r(   r6  rÅ  rp   r   rå  r:  r'   rñ  Úget_custom_labels_from_tags)r·  r¸  r5  r¹  Ú	enum_dictr"  rp   r  r  rK  Úsanitized_keyr;  s               rD   r»  r»  A  s–  € ð Ð Ø×$Ñ$¨KÑ7ÜÐ_Ó`Ð`Ü.Ð/DÀmÓTÐTô % [Ó1€Ið &ŸO™OÓ-÷áˆE�5ØÐ)Ñ)ð 	Ô/°Ó6Ñ6ð€Oñ ô ×$Ñ$×*Ñ*¨oÑ=Ü3\Ó3^Ð)á&GØ6¸×8LÑ8LÐMØ%ô'
ˆ˜
Ñ#ð
 ×)Ñ)Ð5Ø%×<Ñ<×BÑBÓDò 	Y‰JˆC�ä;¸CÓ@ˆMØÐ 5Ò5Ü1QÐRWÓ1X� Ò.ð		Yð ×ÑÐ#Ü#>¸{×?OÑ?OÓ#PÐØ+×1Ñ1Ó3ò 	O‰JˆC�ØÐ+Ò+Ü'GÈÓ'N� Ò$ð	Oð 'ò *ˆØ˜Ò'Ø%)ˆO˜EÒ"ð*ð ÐùóAs   ÁEc                ó„  — t         j                  }|�t        |«      dk(  ri S i }|D ]–  }|}|j                  d«      r|j	                  ddd«      n|}|j                  d«      }| }|D ]+  }t        |t        «      r|j                  |d«      }nd}|�Œ+ n |€Œqt        |t        «      sŒ‚|||j	                  dd«      <   Œ˜ |S )z)
    Get custom labels from metadata
    Nr   z	metadata.r�  r­  r)  rd  )
r‰   r7  r+  r  ÚreplaceÚsplitr‹   r
  r’  ry   )rÕ  r  r8   rK  Úoriginal_keyÚ
keys_partsrp   Úparts           rD   r  r  }  sÓ   € ô ×;Ñ;€DØ€|”s˜4“y A’~Øˆ	à$&€Fàò ;ˆàˆØ14·±ÀÔ1Lˆc�k‰k˜+ r¨1Ô-ÐRUˆà—Y‘Y˜s“^ˆ
à ˆØò 	ˆDÜ˜%¤Ô&ØŸ	™	 $¨Ó-‘à�Ø‰}Ùð	ð Ñ¤¨E´3Õ!7Ø5:ˆF�<×'Ñ'¨¨SÓ1Ò2ð#;ð& €MrQ   c           	     óÎ  — t        | t        «      si S | j                  d«      xs i }t        |t        «      si S |j                  d«      }|j                  d«      }|j                  d«      }i |j                  «       D ��ci c]  \  }}t        |t        «      rŒ||“Œ c}}¥t        |t        «      r|ni ¥t        |t        «      r|ni ¥t        |t        «      r|¥S i ¥S c c}}w )a(  
    Combine the metadata sources that can supply custom Prometheus labels.

    Includes top-level scalar fields from the standard logging metadata (e.g.
    user_api_key_project_alias, user_api_key_team_alias) so they are accessible
    via custom_prometheus_metadata_labels configuration.
    rÕ  Úrequester_metadataÚuser_api_key_auth_metadataÚspend_logs_metadata)r‹   r
  r’  r‰  )r¯  Ústandard_logging_metadatar#  r$  r%  r  r  s          rD   r
  r
  �  s  € ô Ð.´Ô5Øˆ	à'?×'CÑ'CÀJÓ'OÒ'UÐSUÐÜÐ/´Ô6Øˆ	à 9× =Ñ =Ð>RÓ SÐØ(A×(EÑ(EÐFbÓ(cÐØ!:×!>Ñ!>Ð?TÓ!UÐðØ5×;Ñ;Ó=×
Y‘D�A�qÄZÐPQÔSWÕEXˆ1ˆa‰4Ó
Yðä!+Ð,>ÄÔ!EÑÈ2ðô *4Ð4NÔPTÔ)UÑ%Ð[]ðô #-Ð-@Ä$Ô"GÐð	ð ð NPð	ð ùÛ
Ys   ÂC!ÂC!c                ót   ‡‡— ddl Šddlm}  |«       }|j                  |«      Št	        ˆˆfd„| D «       «      S )a  
    Check if any of the request tags matches a wildcard configured pattern

    Args:
        tags: List[str] - The request tags
        configured_tag: str - The configured tag

    Returns:
        bool - True if any of the request tags matches the configured tag, False otherwise

    e.g.
    tags = ["User-Agent: curl/7.68.0", "User-Agent: python-requests/2.28.1", "prod"]
    configured_tag = "User-Agent: curl/*"
    _tag_matches_wildcard_configured_pattern(tags=tags, configured_tag=configured_tag) # True

    configured_tag = "User-Agent: python-requests/*"
    _tag_matches_wildcard_configured_pattern(tags=tags, configured_tag=configured_tag) # True

    configured_tag = "gm"
    _tag_matches_wildcard_configured_pattern(tags=tags, configured_tag=configured_tag) # False
    r   N)ÚPatternMatchRouterc              3  óD   •K  — | ]  }‰j                  ‰|¬ «      –— Œ y­w))r£  ÚstringN)Úmatch)rk   r5  ÚreÚregex_patterns     €€rD   rn   z;_tag_matches_wildcard_configured_pattern.<locals>.<genexpr>Ö  s   øè ø€ ÒK¸sˆr�x‰x °cˆx×:ÑKùs   ƒ )r,  Ú.litellm.router_utils.pattern_match_deploymentsr(  Ú_pattern_to_regexr¦  )rñ  Úconfigured_tagr(  Úpattern_routerr,  r-  s       @@rD   Ú(_tag_matches_wildcard_configured_patternr2  º  s4   ù€ ó, åQá.Ó0€NØ)×;Ñ;¸NÓK€MÜÔKÀdÔKÓKÐKrQ   c                óÊ   — ddl m} t        j                  }|�t	        |«      dk(  ri S i }|D ]3  } |d|› �«      }|| v rd||<   Œd|v rt        | |¬«      rd||<   Œ/d||<   Œ5 |S )aª  
    Get custom labels from tags based on admin configuration.

    Supports both exact matches and wildcard patterns:
    - Exact match: "prod" matches "prod" exactly
    - Wildcard pattern: "User-Agent: curl/*" matches "User-Agent: curl/7.68.0"

    Reuses PatternMatchRouter for wildcard pattern matching.

    Returns dict of label_name: "true" if the tag matches the configured tag, "false" otherwise

    {
        "tag_User-Agent_curl": "true",
        "tag_User-Agent_python_requests": "false",
        "tag_Environment_prod": "true",
        "tag_Environment_dev": "false",
        "tag_Service_api_gateway_v2": "true",
        "tag_Service_web_app_v1": "false",
    }
    r   r2  r4  Útruer&   )rñ  r0  Úfalse)r  r'   r‰   r8  r+  r2  )rñ  r'   Úconfigured_tagsr8   r0  Ú
label_names         rD   r  r  Ù  s�   € õ, Vä$×;Ñ;€OØÐ¤# oÓ"6¸!Ò";Øˆ	à$&€Fà)ò %ˆÙ4°t¸NÐ;KÐ5LÓMˆ
ð ˜TÑ!Ø!'ˆF�:ÑØð �.Ñ Ô%MÐSWÐhvÕ%wØ!'ˆF�:ÑØð %ˆˆzÒð%ð  €MrQ   )rT   zBaseRepository[_TableRowT]rL   z!_PaginatedPrismaTable[_TableRowT])rL   r~   )r¸  r  rL   r   )r·  rü  r  r   rL   rþ  r>   )
r·  rü  r¸  r  r5  râ  r¹  rý  rL   r
  )rÕ  r
  rL   údict[str, str])r¯  r  rL   zdict[str, object])rñ  úSequence[str]r0  ry   rL   r£  )rñ  r9  rL   r8  )WÚ
__future__r   rd  r€   r|   r‚  Úcollections.abcr   r   r   r   r   r	   r#  r
   r   r   r   r   r   r   Úpydanticr   r‰   ró  r   r   r*  r   r   Ú"litellm.integrations.custom_loggerr   Ú'litellm.integrations.prometheus_helpersr   r   ÚIlitellm.integrations.prometheus_helpers.bounded_prometheus_series_trackerr   Ú'litellm.litellm_core_utils.core_helpersr   r   Ú-litellm.litellm_core_utils.service_tier_utilsr   Úlitellm.proxy._typesr   r   r   r    Ú$litellm.repositories.base_repositoryr!   Ú,litellm.repositories.organization_repositoryr"   Ú$litellm.repositories.team_repositoryr#   Ú$litellm.repositories.user_repositoryr$   Úlitellm.types.guardrailsr%   r  r'   r(   r)   Úlitellm.types.utilsr*   r+   Úapscheduler.schedulers.asyncior,   Úprometheus_client.metricsr-   r.   Ú__annotations__r/   r1   r$  r9   r;   rU   rW   r`   r…   r‡   r  r  r»  r  r
  r2  r  r?   rQ   rD   ú<module>rL     s£  ðö #ã Û Û 	Û 
ß BÓ Bß (ß N× NÑ Nå ã ß :÷õ <÷õ÷õ÷ó õ @Ý OÝ ?Ý ?Ý 8Ü 3÷ñ ÷
ñ
 Ý?Þ;àÐá˜]Ó+€ˆUÓ +Ù˜L°	Ô:€
ˆEÓ :à58Ð +¨UÓ 8á1:ðó
2Ð Ð.ó 
ô&˜H ZÑ0ô &óô6�Hô 6÷Rñ Ró.ô$B>b�|ô B>bóJ|$ð
Ø$ðà	&ðð óð: ð9ð
 ;?ñ9Ø$ð9à&ð9ð 
ð9ð
 8ð9ð 
ó9óxð@Ø)ðàóó:Lô>.rQ   