Ë
    tPêjäb ã                   óþ  — U d dl Z d dl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mZ d dl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 m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+m,Z, d dl-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 erUd dl9m:Z; d dl<m=Z> d dl?m@ZA d dlBmCZD d dlBmEZF d dlBmGZH d dlBmIZJ d dlKmLZM d dlNmOZP eFez  ZEeJez  ZIeDez  ZCeAez  Z@ePez  ZOeMez  ZLneZEeZIeZ@eZOeZLeZC G d„ de«      ZQ G d „ d!eQd"¬#«      ZR G d$„ d%ed"¬#«      ZS G d&„ d'ed"¬#«      ZTd(ZUeeVd)<    ed*d+¬,«      ZWeeVd-<    e j°                  d.d/«      ZYeeVd0<    e j°                  d1d/«      ZZeeVd1<    e j°                  d2d/«      Z[eeVd2<   d3Z\eeVd4<   d5Z]eeVd6<   d7Z^eeVd8<   d9Z_eeVd:<   d;Z`eeVd<<   d=ZaeeVd><   d?ZbeeVd@<   dAZceeVdB<   dCZdeeVdD<   dEZeeeVdF<   dGZfeeVdH<   dIZgeeVdJ<   dKZheeVdL<   dMZieeVdN<   dOZjeeVdP<   dQZkeeVdR<   eheiejekhZleeVdS<   dTZmeeneodUf      eVdV<   dWZpeeo   eVdX<    eqdY endZ„ emD «       «      z   «      Zreeqeo      eVd[<    e
d\¬]«       G d^„ d_«      «       Zsd`edaesfdb„Ztdcesdz  daeneqeo   dz  eqeo   dz  f   fdd„Zud`edaeveo   fde„ZwdfZxeeVdg<   eoeyz  ezz  e{z  e|z  dz  endh   z  eqdi   z  Z}dwd`e~djeydae}fdk„Zdxdl„Z€ e
d\d\¬m«       G dn„ do«      «       Z�dpdqdae{fdr„Z‚e
 G ds„ dt«      «       Zƒ G du„ dvee«      Z„y)yé    N)ÚOrderedDict)ÚCallableÚMapping)ÚThreadPoolExecutor)Ú	dataclassÚfield)Údatetime)ÚTYPE_CHECKINGÚAnyÚFinalÚ	TypedDictÚcast)Úverbose_logger)ÚOpenInferenceSpanKindValuesÚSpanAttributes)ÚCustomLogger)Ú!OTEL_SEMCONV_STABILITY_OPT_IN_ENVÚOTELGenAISemconvMixinÚOTELSemconvCategoryÚparse_semconv_opt_in)Údb_span_attributes)ÚMetric)Ú*is_unbilled_non_inference_call_from_params)Ú
safe_dumps)Úredact_string)Úget_requested_service_tierÚget_served_service_tier)Úget_secret_boolÚstr_to_bool)ÚServiceLoggerPayload)ÚChatCompletionMessageToolCallÚCostBreakdownÚFunctionÚLLMResponseTypesÚStandardCallbackDynamicParamsÚStandardLoggingPayload)ÚResource©ÚTracerProvider)ÚSpanExporter)ÚContext)ÚSpan©ÚSpanKind)ÚTracer)Ú ManagementEndpointLoggingPayload)ÚUserAPIKeyAuthc                   ó,   — e Zd ZU eed<   eed<   ded<   y)Ú_StartSpanRequiredKwargsÚnameÚ
start_timeúContext | NoneÚcontextN)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__Úint© ó    úg/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/opentelemetry.pyr3   r3   J   s   … Ø
ƒIØƒOØÔr?   r3   c                   ó   — e Zd ZU ded<   y)Ú_StartSpanKwargsÚ	_SpanKindÚkindN©r8   r9   r:   r<   r>   r?   r@   rB   rB   P   s   … Ø
Ôr?   rB   F)Útotalc                   ó   — e Zd ZU eed<   y)Ú_UsageCompletionTokensViewÚcompletion_tokensN)r8   r9   r:   r=   r<   r>   r?   r@   rH   rH   T   s   … ØÔr?   rH   c                   ó   — e Zd ZU ded<   y)Ú_ResponseWithUsageViewz!_UsageCompletionTokensView | NoneÚusageNrE   r>   r?   r@   rK   rK   X   s   … Ø.Ô.r?   rK   é   Ú_MAX_DYNAMIC_TRACER_PROVIDERSé   ÚOtelProviderShutdown)Úmax_workersÚthread_name_prefixÚ_PROVIDER_SHUTDOWN_EXECUTORÚOTEL_TRACER_NAMEÚlitellmÚLITELLM_TRACER_NAMEÚLITELLM_METER_NAMEÚLITELLM_LOGGER_NAMEzReceived Proxy Server RequestÚLITELLM_PROXY_REQUEST_SPAN_NAMEzhttp.response.status_codeÚ#HTTP_RESPONSE_STATUS_CODE_ATTRIBUTEz
http.routeÚHTTP_ROUTE_ATTRIBUTEzurl.pathÚURL_PATH_ATTRIBUTEz!litellm.preprocessing.duration_msÚ#PREPROCESSING_DURATION_MS_ATTRIBUTEzlitellm.team.metadataÚTEAM_METADATA_ATTRIBUTEzlitellm.model_groupÚMODEL_GROUP_ATTRIBUTEzlitellm.provider.modelÚPROVIDER_MODEL_ATTRIBUTEz"gen_ai.openai.request.service_tierÚREQUEST_SERVICE_TIER_ATTRIBUTEz#gen_ai.openai.response.service_tierÚRESPONSE_SERVICE_TIER_ATTRIBUTEÚraw_gen_ai_requestÚRAW_REQUEST_SPAN_NAMEÚlitellm_requestÚLITELLM_REQUEST_SPAN_NAMEÚ
NO_CONTENTÚCAPTURE_MODE_NO_CONTENTÚ	SPAN_ONLYÚCAPTURE_MODE_SPAN_ONLYÚ
EVENT_ONLYÚCAPTURE_MODE_EVENT_ONLYÚSPAN_AND_EVENTÚCAPTURE_MODE_SPAN_AND_EVENTÚ_VALID_CAPTURE_MODES)Úuser_api_key_hashÚuser_api_key_aliasÚuser_api_key_team_idÚuser_api_key_org_idÚuser_api_key_user_idÚuser_api_key_team_aliasÚuser_api_key_user_emailÚspend_logs_metadataÚrequester_ip_addressÚrequester_metadataÚuser_api_key_end_user_idÚprompt_management_metadataÚapplied_guardrailsÚmcp_tool_call_metadataÚvector_store_request_metadata.ÚMETRIC_METADATA_KEYSzgen_ai.token.typeÚTOKEN_TYPE_ATTRIBUTE)úgen_ai.operation.nameúgen_ai.provider.nameúgen_ai.systemúgen_ai.request.modelúgen_ai.frameworkÚhidden_paramsc              #   ó&   K  — | ]	  }d |› �–— Œ y­w)ú	metadata.Nr>   )Ú.0Úkeys     r@   ú	<genexpr>r‹   Ÿ   s   è ø€ Ò> #ˆi˜�uÔÑ>ùs   ‚ÚVALID_METRIC_ATTRIBUTE_NAMEST)Úfrozenc                   óB   — e Zd ZU dZee   dz  ed<   dZee   dz  ed<   y)ÚOTELMetricAttributeFilterNÚinclude_listÚexclude_list)r8   r9   r:   r�   Úlistr;   r<   r‘   r>   r?   r@   r�   r�   £   s(   … à%)€L�$�s‘)˜dÑ"Ó)Ø%)€L�$�s‘)˜dÑ"Ô)r?   r�   ÚvalueÚreturnc                 óÞ   — t        | t        «      r| S t        | t        «      s!t        dt	        | «      j
                  › �«      ‚t        | j                  d«      | j                  d«      ¬«      S )NzUotel.attributes must be a mapping with optional 'include_list' / 'exclude_list', got r�   r‘   )r�   r‘   )Ú
isinstancer�   ÚdictÚ
ValueErrorÚtyper8   Úget)r“   s    r@   Ú_build_metric_attribute_filterr›   ©   sj   € Ü�%Ô2Ô3ØˆÜ�eœTÔ"Üð#Ü#'¨£;×#7Ñ#7Ð"8ð:ó
ð 	
ô %Ø—Y‘Y˜~Ó.Ø—Y‘Y˜~Ó.ôð r?   Ú
attributesc                 óR  — | €y| j                   xs d }| j                  xs d }|r|rt        d«      ‚|xs |xs g }t        |v rt        dt        › d�«      ‚t	        d„ |D «       «      }|rt        d|› dt	        t
        «      › �«      ‚|rt        |«      nd |rt        |«      fS d fS )N©NNzEotel.attributes: include_list and exclude_list are mutually exclusivezotel.attributes: zA is a structural token-usage discriminator and cannot be filteredc              3   ó2   K  — | ]  }|t         vsŒ|–— Œ y ­w©N)rŒ   )r‰   r4   s     r@   r‹   z3_resolve_metric_attribute_filter.<locals>.<genexpr>Å   s   è ø€ Òc T¸$ÔFbÒ:bœDÑcùs   ‚�z+otel.attributes: unknown attribute name(s) z. Valid names: )r�   r‘   r˜   r€   ÚsortedrŒ   Ú	frozenset)rœ   ÚincludeÚexcludeÚ	requestedÚunknowns        r@   Ú _resolve_metric_attribute_filterr§   ·   sÚ   € ð ÐØØ×,Ñ,Ò4°€GØ×,Ñ,Ò4°€GÙ‘7ÜÐ`ÓaÐaØÒ/ 'Ò/¨R€IÜ˜yÑ(ÜØÔ 4Ð5Ð5vÐwó
ð 	
ô Ñc¨YÔcÓc€GÙÜØ9¸'¸À/ÔRXÔYuÓRvÐQwÐxó
ð 	
ñ &Œ	�'Ô¨4Ù%Œ	�'Óðð à+/ðð r?   c                 ó<  — | €g S t        | t        «      r>| j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% c}S | D �cg c]5  }t        |«      j                  «       sŒt        |«      j                  «       ‘Œ7 c}S c c}w c c}w )zÖCoerce a team-metadata allowlist from a list or comma-separated string.

    config.yaml passes a YAML list; an env var passes a comma-separated string.
    Both collapse to a list of stripped, non-empty keys.
    ú,)r–   r;   ÚsplitÚstrip)r“   Úitems     r@   Ú_normalize_team_metadata_keysr­   Ð   sr   € ð €}Øˆ	Ü�%œÔØ).¯©°SÓ)9ÖJ ¸T¿Z¹Z½\�—
‘
•ÒJÐJØ*/ÖE $´3°t³9·?±?Õ3DŒC�‹I�O‰OÕÒEÐEùò KùÚEs   ¨B¾BÁBÁ6Bé   Ú_FREEZE_MAX_DEPTH)ÚHashableScope.r°   Ú_depthc                 óŠ  ‡— ‰t         k\  rt        | «      S t        | t        t        f«      rt	        ˆfd„| D «       «      S t        | t
        «      rt        ˆfd„| D «       «      S t        | t        «      r"t        ˆfd„| j                  «       D «       «      S t        | t        t        t        t        f«      s| €| S t        | «      S )Nc              3   ó<   •K  — | ]  }t        |‰d z   «      –— Œ y­w©é   N©Ú_freeze_for_dedupe©r‰   r¬   r±   s     €r@   r‹   z%_freeze_for_dedupe.<locals>.<genexpr>æ   s   øè ø€ ÒL¸dÔ'¨¨f°q©j×9ÑLùó   ƒc              3   ó<   •K  — | ]  }t        |‰d z   «      –— Œ y­wr´   r¶   r¸   s     €r@   r‹   z%_freeze_for_dedupe.<locals>.<genexpr>è   s   øè ø€ ÒPÀ$Ô+¨D°&¸1±*×=ÑPùr¹   c              3   ó`   •K  — | ]%  \  }}t        |‰d z   «      t        |‰d z   «      f–— Œ' y­wr´   r¶   )r‰   rŠ   r¬   r±   s      €r@   r‹   z%_freeze_for_dedupe.<locals>.<genexpr>ê   s:   øè ø€ ò 
Ù\eÐ\_ÐaeÔ  V¨a¡ZÓ0Ô2DÀTÈ6ÐTUÉ:Ó2VÔWñ
ùs   ƒ+.)r¯   Úreprr–   r’   ÚtupleÚsetr¢   r—   Úitemsr;   r=   ÚfloatÚbytes)r“   r±   s    `r@   r·   r·   â   s¥   ø€ ØÔ"Ò"Ü�E‹{ÐÜ�%œ$¤˜Ô'ÜÓLÀeÔLÓLÐLÜ�%œÔÜÓPÈ%ÔPÓPÐPÜ�%œÔÜó 
Øin×itÑitÓivô
ó 
ð 	
ô �%œ#œs¤E¬5Ð1Ô2°e°mØˆÜ�‹;Ðr?   c                 ó~   — 	 | j                  «        y# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)zFFlush and stop a dropped provider so its exporter thread is reclaimed.z>OpenTelemetry: error shutting down dropped tracer provider: %sN)ÚshutdownÚ	Exceptionr   Údebug)ÚproviderÚes     r@   Ú_shutdown_tracer_providerrÈ   ò   s;   € ðbØ×ÑÕøÜò bÜ×ÑÐ]Ð_`×aÑaûðbús   ‚ “	<œ7·<)r�   Úslotsc                   ó&   — e Zd ZU dZded<   eed<   y)Ú_CachedTracerProviderzRA cached credential-scoped provider plus whether it may be shut down when dropped.Ú_SDKTracerProviderrÆ   Úowns_exporterN)r8   r9   r:   Ú__doc__r<   Úboolr>   r?   r@   rË   rË   ú   s   … á\à"Ó"ØÔr?   rË   Úexporterzstr | _SpanExporterc                 ó   — t        | d«       S )aÞ  Whether a provider built for ``exporter`` may be shut down when it is dropped.

    ``_get_span_processor`` builds a fresh exporter for a named kind, but wraps a
    caller-supplied ``SpanExporter`` instance as-is, and that instance is shared with the
    logger's own provider. Shutting a dropped provider down would then stop exporting for
    the whole process. The shared case also uses ``SimpleSpanProcessor``, so it owns no
    thread and there is nothing to reclaim.
    Úexport)Úhasattr©rÐ   s    r@   Ú_provider_owns_exporterrÕ     s   € ô �x Ó*Ð*Ð*r?   c                   óH  — e Zd ZU dZeez  ed<   dZedz  ed<   dZedz  ed<   dZ	e
ed<   dZe
ed<   dZedz  ed	<   dZedz  ed
<   dZedz  ed<   dZe
dz  ed<   dZe
ed<   dZedz  ed<    ee¬«      Zee   ed<    ee¬«      Zee   ed<   dZedz  ed<   dd„Zed„ «       Zy)ÚOpenTelemetryConfigÚconsolerÐ   NÚendpointÚheadersFÚenable_metricsÚenable_eventsÚservice_nameÚdeployment_environmentÚmodel_idÚignore_context_propagationÚskip_set_globalÚcapture_message_content)Údefault_factoryÚsemconv_stability_opt_inÚbaggage_team_metadata_keysrœ   c                 ó¶  — | j                   r0t        | j                  t        «      r| j                  dk(  rd| _        | j                  st        j                  dd«      | _        | j                  st        j                  dd«      | _        | j                  s%t        j                  d| j                  «      | _        | j                  €#t        t        j                  d«      «      | _	        | xj                  t        t        j                  t        «      «      z  c_        t        | j                  «      xs t        t        j                  d	«      «      | _        y )
NrØ   Ú	otlp_httpÚOTEL_SERVICE_NAMErU   ÚOTEL_ENVIRONMENT_NAMEÚ
productionÚOTEL_MODEL_IDÚOTEL_IGNORE_CONTEXT_PROPAGATIONÚ'LITELLM_OTEL_BAGGAGE_TEAM_METADATA_KEYS)rÙ   r–   rÐ   r;   rÝ   ÚosÚgetenvrÞ   rß   rà   r   rä   r   r   r­   rå   ©Úselfs    r@   Ú__post_init__z!OpenTelemetryConfig.__post_init__'  sû   € ð
 �=Š=œZ¨¯©´sÔ;ÀÇÁÐQZÒ@ZØ'ˆDŒMà× Ò Ü "§	¡	Ð*=¸yÓ IˆDÔØ×*Ò*Ü*,¯)©)Ð4KÈ\Ó*ZˆDÔ'Ø�}Š}ÜŸI™I o°t×7HÑ7HÓIˆDŒMØ×*Ñ*Ð2Ü.9¼"¿)¹)ÐDeÓ:fÓ.gˆDÔ+ð 	×%Ò%Ô)=¼b¿i¹iÔHiÓ>jÓ)kÑkÕ%Ü*GØ×+Ñ+ó+
ò +aä*¬2¯9©9Ð5^Ó+_Ó`ð 	Õ'r?   c           
      ól  — ddl m} t        j                  dt        j                  dd«      «      }t        j                  dt        j                  d«      «      }t        j                  dt        j                  d	«      «      }t        j                  d
d«      j	                  «       dk(  }t        j                  dd«      j	                  «       dk(  }t        j                  dd«      }t        j                  dd«      }t        j                  d|«      }	|dk(  r |  |«       ¬«      S  | ||||||||	¬«      S )zî
        OTEL_HEADERS=x-honeycomb-team=B85YgLm9****
        OTEL_EXPORTER="otlp_http"
        OTEL_ENDPOINT="https://api.honeycomb.io/v1/traces"

        OTEL_HEADERS gets sent as headers = {"x-honeycomb-team": "B85YgLm96******"}
        r   )ÚInMemorySpanExporterÚOTEL_EXPORTER_OTLP_PROTOCOLÚOTEL_EXPORTERrØ   ÚOTEL_EXPORTER_OTLP_ENDPOINTÚOTEL_ENDPOINTÚOTEL_EXPORTER_OTLP_HEADERSÚOTEL_HEADERSÚ'LITELLM_OTEL_INTEGRATION_ENABLE_METRICSÚfalseÚtrueÚ&LITELLM_OTEL_INTEGRATION_ENABLE_EVENTSrè   rU   ré   rê   rë   Ú	in_memoryrÔ   )rÐ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   )Ú6opentelemetry.sdk.trace.export.in_memory_span_exporterrô   rî   rï   Úlower)
Úclsrô   rÐ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   s
             r@   Úfrom_envzOpenTelemetryConfig.from_env>  s  € õ	
ô Ÿ)™)Ð$AÄ2Ç9Á9È_Ð^gÓChÓiˆÜŸ)™)Ð$AÄ2Ç9Á9È_ÓC]Ó^ˆÜŸ™Ø(¬"¯)©)°NÓ*Có
ˆô ')§i¡iÐ0YÐ[bÓ&c×&iÑ&iÓ&kÐouÑ&uˆÜ%'§Y¡YÐ/WÐY`Ó%a×%gÑ%gÓ%iÐmsÑ%sˆÜ Ÿi™iÐ(;¸YÓGˆÜ(*¯	©	Ð2IÈ<Ó(XÐÜŸ)™) O°\ÓBˆà�{Ò"ÙÑ 4Ó 6Ô7Ð7ÙØØØØ)Ø'Ø%Ø#9Øô	
ð 		
r?   ©r”   N)r8   r9   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ò   Úclassmethodr  r>   r?   r@   r×   r×     sî   … à#,€Hˆc�LÑ Ó,Ø€Hˆc�D‰jÓØ€GˆS�4‰ZÓØ €N�DÓ Ø€M�4ÓØ#€L�#˜‘*Ó#Ø)-Ð˜C $™JÓ-Ø€Hˆc�D‰jÓØ.2Ð  t¡Ó2à!€O�TÓ!ð +/Ð˜S 4™ZÓ.Ù9>ÈsÔ9SÐ˜cÐ"5Ñ6ÓSñ -2À$Ô,GÐ  S¡	ÓGð 48€JÐ)¨DÑ0Ó7óað. ñ"
ó ñ"
r?   r×   c                   ót  ‡ — e Zd Zdddddefdedz  dedz  dedz  dedz  dedz  defˆ fd„Ze	ded	d
fd„«       Z
dœd„Zd„ Z	 d�dedefd„Zd	efd„Zd	edz  fd„Zd	efd„Zd	efd„Zd	efd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdededed	efd „Z	 	 	 	 dždededz  d!eez  dz  d"eez  dz  d#e dz  f
d$„Z!	 	 	 	 	 dŸded%edz  dedz  d!eez  dz  d"eez  dz  d#e dz  fd&„Z"	 d d'e d(e#d)e$d*edz  fd+„Z%d'e d,d-d	dfd.„Z&d/e d)e$d0e'fd1„Z(d2e d	e)fd3„Z*d	e dz  fd4„Z+d2e d	edz  fd5„Z,d6ed7d8d	d9fd:„Z-d6ed;e.g d<f   d=ed	d>fd?„Z/d@ed	d>fdA„Z0dBe1eef   d	d>fdC„Z2dDe3d	e dz  fdE„Z4dDe3d	edz  fdF„Z5d2e dGed	efdH„Z6d2e d	dfdI„Z7dJed	dfdK„Z8dL„ Z9	 	 d¡dN„Z:dO„ Z;dJedPedz  dQedz  d	dfdR„Z<dJed2e d	dfdS„Z=d2e d	dfdT„Z>dJedUe?dVe d	dfdW„Z@dJedUe?d	dfdX„ZAe	dYeBdZeCe   d	edz  fd[„«       ZDd¢d\„ZEd]e eef   d	e eef   fd^„ZFd_„ ZGe	d`eez  ez  dz  d	edz  fda„«       ZHd2e dbe fdc„ZId2e ddded"edfedbe f
dg„ZJd2e d"eez  dbe fdh„ZKe	di„ «       ZLdJefdj„ZMe		 	 	 	 	 	 	 	 d£dk„«       ZNd2e dz  dMeOdz  fdl„ZPdm„ ZQdJed2e fdn„ZRdJefdo„ZSd	eez  ez  ez  fdp„ZTe	dqeCeU   d	e eef   fdr„«       ZVdJeddeBdz  fds„ZWd	eez  ez  ez  fdt„ZXdJeduedYeBfdv„ZYdweCe    ez  d	eCe    fdx„ZZdyeCe    d	eCe    fdz„Z[e	d	e dz  fd{„«       Z\d|eCd	eCe    fd}„Z]dJefd~„Z^d„ Z_d	efd€„Z`d�„ Zad d‚edz  fdƒ„Zb	 	 d¤dBe1eef   dz  d„edz  fd…„Zcd†„ Zdd‡„ Zedˆedz  d‰ed	edz  fdŠ„Zfe	d‹dŒd	e eef   fd�„«       Zg	 d dŽehdedz  fd�„Zi	 d dŽehdedz  fd�„Zjd!ed‹e d	edz  fd‘„Zkddd’œdJedz  d“edz  d”edz  d	dfd•„ZldJedz  d–edz  d	dfd—„ZmdJedz  d˜e#dz  d–ed	dfd™„ZndJedz  dšeBd	dfd›„Zoˆ xZpS )¥ÚOpenTelemetryNÚconfigÚcallback_nameÚtracer_providerÚlogger_providerÚmeter_providerÚmax_dynamic_tracer_providersc                 óV  •— |j                  dd «      }|j                  dd «      }	|€t        j                  «       }|�t        |«      |_        |	�t        |	«      |_        || _        || _        d | _	        d | _
        d| _        |j                  �| j                  «        | j                  j                  | _        | j                  j                  | _        | j                  j"                  | _        t'        «       | _        t+        j,                  «       | _        t1        d|«      | _        d | _        | j7                  |«       t9        t;        j<                  dd«      «      j?                  «       }
|
dk(  radd l }|jC                  |jD                  ¬	«       |jG                  tH        «       |jG                  d
«      }|jK                  |jD                  «       tM        ‰| �œ  di |¤Ž | jQ                  |«       | jS                  |«       | jU                  «       | _+        | jY                  «        y )Nrå   rœ   Frµ   Ú
DEBUG_OTELÚFalserý   r   )Úlevelzopentelemetry.sdk.trace.exportr>   )-Úpopr×   r  r­   rå   r›   rœ   r  r	  Ú_metric_attr_includeÚ_metric_attr_excludeÚ_metric_attr_filter_resolvedÚ_ensure_metric_attribute_filterrÐ   rö   rÙ   rø   rÚ   rú   r   Ú_tracer_provider_cacheÚ	threadingÚLockÚ_tracer_provider_cache_lockÚmaxÚ_max_dynamic_tracer_providersÚ_litellm_resource_memoÚ_init_tracingr;   rî   rï   r  ÚloggingÚbasicConfigÚDEBUGÚ	getLoggerr8   ÚsetLevelÚsuperÚ__init__Ú_init_metricsÚ
_init_logsÚ%_compute_capture_mode_from_init_stateÚ_capture_mode_cachedÚ"_init_otel_logger_on_litellm_proxy)rñ   r  r	  r
  r  r  r  ÚkwargsÚteam_metadata_keys_overrideÚmetric_attributes_overrideÚ_debug_otelr  Úotel_exporter_loggerÚ	__class__s                €r@   r%  zOpenTelemetry.__init__e  sØ  ø€ ð .4¯Z©ZÐ8TÐVZÓ-[Ð#Ø,2¯J©J°|ÀTÓ,JÐ"Øˆ>Ü(×1Ñ1Ó3ˆFØ&Ð2Ü0MÐNiÓ0jˆFÔ-Ø%Ð1Ü >Ð?YÓ ZˆFÔàˆŒØ*ˆÔð
 <@ˆÔ!Ø;?ˆÔ!Ø,1ˆÔ)Ø×ÑÐ(Ø×0Ñ0Ô2Ø!Ÿ[™[×1Ñ1ˆÔØ!Ÿ[™[×1Ñ1ˆÔØ ŸK™K×/Ñ/ˆÔÜOZË}ˆÔ#Ü2;·.±.Ó2BˆÔ(Ü47¸Ð;WÓ4XˆÔ*Ø8<ˆÔ#Ø×Ñ˜?Ô+ä ¤§¡¨<¸Ó!AÓB×HÑHÓJˆà˜&Ò ãà×Ñ g§m¡mÐÔ4Ø×ÑœhÔ'ð +2×*;Ñ*;Ð<\Ó*]Ð Ø ×)Ñ)¨'¯-©-Ô8ô 	‰ÑÑ"˜6Ò"Ø×Ñ˜>Ô*Ø�‰˜Ô(ð %)×$NÑ$NÓ$PˆÔ!Ø×/Ñ/Õ1r?   r”   Ú	_Resourcec                 óè   — ddl m}m} | j                  | j                  | j
                  xs | j                  dœ}|j                  |«      } |«       }|j                  «       }|j                  |«      S )z>Create an OpenTelemetry Resource using config-driven defaults.r   )ÚOTELResourceDetectorr'   )zservice.namezdeployment.environmentrß   )	Úopentelemetry.sdk.resourcesr3  r'   rÝ   rÞ   rß   ÚcreateÚdetectÚmerge)r  r3  r'   Úbase_attributesÚbase_resourceÚotel_resource_detectorÚenv_resources          r@   Ú_get_litellm_resourcez#OpenTelemetry._get_litellm_resource£  sm   € ÷ 	Oð #×/Ñ/Ø&,×&CÑ&CØŸ™Ò>¨6×+>Ñ+>ñ9
ˆð  (Ÿ™¨Ó?ˆÙ(<Ó(>ÐØ4×;Ñ;Ó=ˆØ×"Ñ" <Ó0Ð0r?   c                 ój   — | j                   }|�|S | j                  | j                  «      }|| _         |S )aÁ  The Resource every provider on this logger is built with, frozen at first use.

        ``Resource.create`` scans every installed distribution's entry points, roughly 3ms and
        200 file opens, and the dynamic providers reach it from the async logging path. Freezing
        also keeps them consistent with whatever this logger built at startup. ``cached_property``
        locks class-wide before 3.12, which this file still supports.
        )r  r<  r  )rñ   ÚmemoÚbuilts      r@   Ú_litellm_resourcezOpenTelemetry._litellm_resource³  s;   € ð ×1Ñ1ˆØÐØˆKØ×1Ñ1°$·+±+Ó>ˆØ&+ˆÔ#Øˆr?   c                 ó2  — 	 ddl m} dt
        j                  vr?t        d„ t
        j                  D «       «      rt
        j                  j                  | «       t        |dd«      €t        |d| «       yy# t        $ r t        j                  d«       Y yw xY w)z«
        Initializes OpenTelemetry for litellm proxy server

        - Adds Otel as a service callback
        - Sets `proxy_server.open_telemetry_logger` to self
        r   )Úproxy_serverzEProxy Server is not installed. Skipping OpenTelemetry initialization.NÚotelc              3   ó>   K  — | ]  }t        |t        «       –— Œ y ­wr    )r–   r  )r‰   Úcbs     r@   r‹   zCOpenTelemetry._init_otel_logger_on_litellm_proxy.<locals>.<genexpr>Ð  s   è ø€ ò :
Ø24”
˜2œ}Ó-Ô-ñ:
ùs   ‚Úopen_telemetry_logger)Úlitellm.proxyrB  ÚImportErrorr   ÚwarningrU   Úservice_callbackÚallÚappendÚgetattrÚsetattr)rñ   rB  s     r@   r*  z0OpenTelemetry._init_otel_logger_on_litellm_proxyÂ  s’   € ð	Ý2ð œ×1Ñ1Ñ1´cñ :
Ü8?×8PÑ8Pô:
ô 7
ô ×$Ñ$×+Ñ+¨DÔ1ô �<Ð!8¸$Ó?ÐGÜ�LÐ"9¸4Õ@ð Høô ò 	Ü×"Ñ"Ð#jÔkÙð	ús   ‚A5 Á5BÂBÚprovider_namerá   c                 ó:  — |�+t        j                  dt        |«      j                  «       |S 	  |«       }t	        ||«      rQ|r t        j                  d||«        |«       }|S t        j                  d|t        |«      j                  «       |}	 |S t        j                  d|«        |«       }|s
 ||«       |S t        j
                  d|«       	 |S # t        $ r<}	t        j                  d|t        |	«      «        |«       }|s ||«       Y d}	~	|S d}	~	ww xY w)a  
        Generic helper to get or create an OpenTelemetry provider (Tracer, Meter, or Logger).

        Args:
            provider: The provider instance passed to the init function (can be None)
            provider_name: Name for logging (e.g., "TracerProvider")
            get_existing_provider_fn: Function to get the existing global provider
            sdk_provider_class: The SDK provider class to check for (e.g., TracerProvider from SDK)
            create_new_provider_fn: Function to create a new provider instance
            set_provider_fn: Function to set the provider globally
            skip_set_global: If True, don't set the provider globally (for dynamic-only providers)

        Returns:
            The provider to use (either existing, new, or explicitly provided)
        Nz0OpenTelemetry: Using provided TracerProvider: %sz\OpenTelemetry: existing %s found but skip_set_global=True; creating private %s for isolationz$OpenTelemetry: Using existing %s: %szOpenTelemetry: Creating new %sz^OpenTelemetry: Created %s but NOT setting it globally (will use dynamic providers per-request)zCOpenTelemetry: Exception checking existing %s, creating new one: %s)r   rÅ   r™   r8   r–   ÚinforÄ   r;   )
rñ   rÆ   rO  Úget_existing_provider_fnÚsdk_provider_classÚcreate_new_provider_fnÚset_provider_fnrá   Úexisting_providerrÇ   s
             r@   Ú_get_or_create_providerz%OpenTelemetry._get_or_create_providerÝ  s;  € ð2 Ðô × Ñ ØBÜ�X“×'Ñ'ôð ˆOð&	*Ù'?Ó'AÐäÐ+Ð-?Ô@Ù"Ü"×(Ñ(ØvØ%Ø%ôñ
  6Ó7�Hð< ˆô9 #×(Ñ(Ø>Ø%ÜÐ.Ó/×8Ñ8ôð
  1‘Hð. ˆô) ×$Ñ$Ð%EÀ}ÔUÙ1Ó3�Ù&Ù# HÔ-ð" ˆô #×'Ñ'ØxØ%õð ˆøô ò 		*ä× Ñ ØUØÜ�A“ôñ
 .Ó/ˆHÙ"Ù Ô)ûàˆûð		*ús)   ¯3C Á$,C Â'C Â<C Ã	DÃ1DÄDc                 ól   — | j                   j                  xs t        | d«      xr | j                  dk(  S )Nr	  Úlangfuse_otel)r  rá   rÓ   r	  rð   s    r@   Ú_skip_set_globalzOpenTelemetry._skip_set_global+  s0   € à�{‰{×*Ñ*Òx¬w°t¸_Ó/MÒ/wÐRV×RdÑRdÐhwÑRwÐxr?   c                 óÀ   — | j                   j                  xs t        j                  d«      }|sy|j	                  «       }|dv rt
        S |dv rt        S |t        v r|S y)a{  Sample explicit settings at init. Returns the resolved mode or
        None if nothing explicit is set (in which case the legacy
        ``self.message_logging`` flag is consulted dynamically per request).

        ``"true"``/``"1"`` map to ``EVENT_ONLY`` per the contrib convention.
        ``"false"``/``"0"`` map to ``NO_CONTENT``.
        Unknown values are ignored.
        Ú2OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENTN)ÚTRUEÚ1)ÚFALSEÚ0)r  râ   rî   rï   Úupperrl   rh   ro   )rñ   ÚexplicitÚ
normalizeds      r@   r(  z3OpenTelemetry._compute_capture_mode_from_init_state/  si   € ð Ÿ+™+×=Ñ=ò 
ÄÇÁØ@óB
ˆñ ØØ$ŸN™NÓ,ˆ
Ø˜Ñ&Ü*Ð*Ø˜Ñ'Ü*Ð*ØÔ-Ñ-ØÐØr?   c                 óŽ   — t         j                  rt        S | j                  �| j                  S | j                  rt
        S t        S )aÇ  Return the active capture mode for this request.

        Precedence:
          1. ``litellm.turn_off_message_logging=True`` forces ``NO_CONTENT``
             (kill-switch checked dynamically).
          2. Explicit setting sampled at init from
             ``OpenTelemetryConfig.capture_message_content`` or
             ``OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT``.
          3. Legacy ``self.message_logging`` (checked dynamically).
        )rU   Úturn_off_message_loggingrh   r)  Úmessage_loggingrn   rð   s    r@   Ú_resolve_capture_modez#OpenTelemetry._resolve_capture_modeF  s@   € ô ×+Ò+Ü*Ð*Ø×$Ñ$Ð0Ø×,Ñ,Ð,Ø.2×.BÒ.BÔ*Ð_ÔH_Ð_r?   c                 ó:   — | j                  «       t        t        fv S r    )rg  rj   rn   rð   s    r@   Ú_capture_in_spanzOpenTelemetry._capture_in_spanW  s#   € Ø×)Ñ)Ó+Ü"Ü'ð0
ð 
ð 	
r?   c                 ó:   — | j                  «       t        t        fv S r    )rg  rl   rn   rð   s    r@   Ú_capture_in_eventzOpenTelemetry._capture_in_event]  s#   € Ø×)Ñ)Ó+Ü#Ü'ð0
ð 
ð 	
r?   c           
      óü   ‡ ‡— ddl m} ddlmŠ ddlm} ˆˆ fd„}‰ j                  |d|j                  ‰||j                  ‰ j                  «       ¬«      }|j                  t        «      ‰ _        |‰ _        |‰ _        y )Nr   ©Útracer(   r-   c                  ót   •—  ‰‰j                  «       ¬«      } | j                  ‰j                  «       «       | S ©N)Úresource©r@  Úadd_span_processorÚ_get_span_processor)rÆ   r)   rñ   s    €€r@   Úcreate_tracer_providerz;OpenTelemetry._init_tracing.<locals>.create_tracer_providerh  s2   ø€ Ù,°d×6LÑ6LÓ6NÔOˆHØ×'Ñ'¨×(@Ñ(@Ó(BÔCØˆOr?   r)   ©rÆ   rO  rR  rS  rT  rU  rá   )Úopentelemetryrn  Úopentelemetry.sdk.tracer)   Úopentelemetry.tracer.   rW  Úget_tracer_providerÚset_tracer_providerrZ  Ú
get_tracerrV   ÚtracerÚ_tracer_providerÚ	span_kind)rñ   r
  rn  r.   ru  r)   s   `    @r@   r  zOpenTelemetry._init_tracingc  sv   ù€ Ý'Ý:Ý0õ	ð
 ×6Ñ6Ø$Ø*Ø%*×%>Ñ%>Ø-Ø#9Ø!×5Ñ5Ø ×1Ñ1Ó3ð 7ó 
ˆð &×0Ñ0Ô1DÓEˆŒØ /ˆÔØ!ˆ�r?   c           
      ó<  ‡ ‡— ‰ j                   j                  s2d ‰ _        d ‰ _        d ‰ _        d ‰ _        d ‰ _        d ‰ _        d ‰ _        y ddl	m
} ddlmŠ ˆˆ fd„}‰ j                  |d|j                  ‰||j                  ‰ j!                  «       ¬«      }|‰ _        |j#                  t$        «      }|j'                  t(        j*                  dd¬	«      ‰ _        |j'                  t(        j,                  d
d¬	«      ‰ _        |j'                  t(        j.                  dd¬	«      ‰ _        |j'                  t(        j0                  dd¬	«      ‰ _        |j'                  t(        j2                  dd¬	«      ‰ _        |j'                  t(        j4                  dd¬	«      ‰ _        y )Nr   )Úmetrics)ÚMeterProviderc                  óV   •— ‰j                  «       }  ‰| g‰j                  «       ¬«      S )N)Úmetric_readersrq  )Ú_get_metric_readerr@  )Úmetric_readerr‚  rñ   s    €€r@   Úcreate_meter_providerz:OpenTelemetry._init_metrics.<locals>.create_meter_provider‹  s/   ø€ Ø#'×#:Ñ#:Ó#<ˆMÙ Ø -˜Ø×/Ñ/Ó1ôð r?   r‚  rv  zGenAI operation durationÚs)r4   ÚdescriptionÚunitzGenAI token usagez{token}zGenAI request costÚUSDz*Time to first token for streaming requestszCAverage time per output token (generation time / completion tokens)z9Total LLM API generation time (excludes LiteLLM overhead))r  rÛ   Ú_meter_providerÚ_operation_duration_histogramÚ_token_usage_histogramÚ_cost_histogramÚ_time_to_first_token_histogramÚ _time_per_output_token_histogramÚ_response_duration_histogramrw  r�  Úopentelemetry.sdk.metricsr‚  rW  Úget_meter_providerÚset_meter_providerrZ  Ú	get_meterr8   Úcreate_histogramr   ÚOPERATION_DURATIONÚTOKEN_USAGEÚ
TOKEN_COSTÚTIME_TO_FIRST_TOKENÚTIME_PER_OUTPUT_TOKENÚRESPONSE_DURATION)rñ   r  r�  r‡  Úmeterr‚  s   `    @r@   r&  zOpenTelemetry._init_metrics}  s©  ù€ Ø�{‰{×)Ò)Ø#'ˆDÔ Ø15ˆDÔ.Ø*.ˆDÔ'Ø#'ˆDÔ Ø26ˆDÔ/Ø48ˆDÔ1Ø04ˆDÔ-Øå)Ý;õ	ð ×5Ñ5Ø#Ø)Ø%,×%?Ñ%?Ø,Ø#8Ø#×6Ñ6Ø ×1Ñ1Ó3ð 6ó 
ˆð  .ˆÔà%×/Ñ/´Ó9ˆà-2×-CÑ-CÜ×*Ñ*Ø2Øð .Dó .
ˆÔ*ð
 ',×&<Ñ&<Ü×#Ñ#Ø+Øð '=ó '
ˆÔ#ð
  %×5Ñ5Ü×"Ñ"Ø,Øð  6ó  
ˆÔð
 /4×.DÑ.DÜ×+Ñ+ØDØð /Eó /
ˆÔ+ð
 16×0FÑ0FÜ×-Ñ-Ø]Øð 1Gó 1
ˆÔ-ð
 -2×,BÑ,BÜ×)Ñ)ØSØð -Có -
ˆÕ)r?   c           
      óÒ   ‡ ‡‡— ‰ j                   j                  sd ‰ _        y ddlm}m} ddlmŠ ddlm	Š ˆˆˆ fd„}‰ j                  |d|‰||‰ j                  «       ¬«      ‰ _        y )Nr   )Úget_logger_providerÚset_logger_provider)ÚLoggerProvider)ÚBatchLogRecordProcessorc                  ó„   •—  ‰‰j                  «       ¬«      } ‰j                  «       }| j                   ‰|«      «       | S rp  )r@  Ú_get_log_exporterÚadd_log_record_processor)rÆ   Úlog_exporterr£  ÚOTLoggerProviderrñ   s     €€€r@   Úcreate_logger_providerz8OpenTelemetry._init_logs.<locals>.create_logger_providerÈ  s=   ø€ Ù.¸×8NÑ8NÓ8PÔQˆHØ"&×"8Ñ"8Ó":ˆLØ×-Ñ-Ñ.EÀlÓ.SÔTØˆOr?   r¢  rv  )r  rÜ   Ú_logger_providerÚopentelemetry._logsr   r¡  Úopentelemetry.sdk._logsr¢  Úopentelemetry.sdk._logs.exportr£  rW  rZ  )rñ   r  r   r¡  r©  r£  r¨  s   `    @@r@   r'  zOpenTelemetry._init_logs¾  sa   ú€ à�{‰{×(Ò(Ø$(ˆDÔ!ØçPÝNÝJö	ð !%× <Ñ <Ø$Ø*Ø%8Ø/Ø#9Ø/Ø ×1Ñ1Ó3ð !=ó !
ˆÕr?   c                 ó,   — | j                  ||||«       y r    ©Ú_handle_success©rñ   r+  Úresponse_objr5   Úend_times        r@   Úlog_success_eventzOpenTelemetry.log_success_eventØ  ó   € Ø×Ñ˜V \°:¸xÕHr?   c                 ó,   — | j                  ||||«       y r    ©Ú_handle_failurer±  s        r@   Úlog_failure_eventzOpenTelemetry.log_failure_eventÛ  rµ  r?   c              ƒ   ó4   K  — | j                  ||||«       y ­wr    r¯  r±  s        r@   Úasync_log_success_eventz%OpenTelemetry.async_log_success_eventÞ  ó   è ø€ Ø×Ñ˜V \°:¸xÕHùó   ‚c              ƒ   ó4   K  — | j                  ||||«       y ­wr    r·  r±  s        r@   Úasync_log_failure_eventz%OpenTelemetry.async_log_failure_eventá  r¼  r½  ÚpayloadÚparent_otel_spanÚstart_time_nsc                 ój  — ddl m} ddlm} t	        |j
                  j                  |j                  «      }| j                  j                  |j
                  |j                  |«      ||r|j                  n|j                  ¬«      }|j                  «       D ]  \  }}	| j                  |||	¬«       Œ |S )a�  Open a service span, named and classified by what the service is.

        A datastore call is an outbound CLIENT span carrying ``db.*`` semconv.
        Without those a Postgres span says only ``service=postgres``, so the
        backend falls back to the transport peer, which for Prisma is the local
        query engine on loopback. Everything else stays an INTERNAL span.
        r   rm  r-   )r4   r7   r5   rD   ©ÚspanrŠ   r“   )rw  rn  ry  r.   r   Úservicer“   Ú	call_typer}  Ú
start_spanÚset_span_in_contextÚCLIENTÚINTERNALr¿   Úsafe_set_attribute)
rñ   rÀ  rÁ  rÂ  rn  r.   rœ   rÅ  rŠ   r“   s
             r@   Ú_start_service_spanz!OpenTelemetry._start_service_spanä  s£   € õ 	(Ý0ä.¨w¯©×/DÑ/DÀg×FWÑFWÓXˆ
Ø—k‘k×,Ñ,Ø—‘Ø×-Ñ-Ð.>Ó?Ø$Ù$.�—’°H×4EÑ4Eð	 -ó 
ˆð %×*Ñ*Ó,ò 	E‰JˆC�Ø×#Ñ#¨°3¸eÐ#ÕDð	Eàˆr?   r5   r³  Úevent_metadatac              ƒ   óÀ  K  — ddl m}m} d}d}	t        |t        «      rt        |dz  «      }n| j                  |«      }t        |t        «      rt        |dz  «      }	n| j                  |«      }	|�Û| j                  |||«      }
| j                  |
d|j                  ¬«       | j                  |
d|j                  j                  ¬«       |rL|j                  «       D ]9  \  }}|€d}t        |t        «      r	 t        |«      }| j                  |
||¬«       Œ; |
j!                   ||j"                  «      «       |
j%                  |	¬	«       y y # t        $ r d}Y ŒXw xY w­w)
Nr   ©ÚStatusÚ
StatusCodeç    eÍÍArÇ  rÄ  rÆ  ÚNonez0litellm logging error - could_not_json_serialize©r³  )ry  rÑ  rÒ  r–   rÀ   r=   Ú_to_nsrÍ  rÌ  rÇ  rÆ  r“   r¿   r—   r;   rÄ   Ú
set_statusÚOKÚend)rñ   rÀ  rÁ  r5   r³  rÎ  rÑ  rÒ  Ú_start_time_nsÚ_end_time_nsÚservice_logging_spanrŠ   r“   s                r@   Úasync_service_success_hookz(OpenTelemetry.async_service_success_hookú  sq  è ø€ ÷ 	;àˆØˆä�j¤%Ô(Ü  ¨cÑ!1Ó2‰Nà!Ÿ[™[¨Ó4ˆNä�h¤Ô&Ü˜x¨#™~Ó.‰LàŸ;™; xÓ0ˆLàÐ'Ø*.×*BÑ*BÀ7ÐL\Ð^lÓ*mÐ Ø×#Ñ#Ø)ØØ×'Ñ'ð $ô ð
 ×#Ñ#Ø)ØØ—o‘o×+Ñ+ð $ô ñ Ø"0×"6Ñ"6Ó"8ò ‘J�C˜Ø�}Ø &˜Ü! %¬Ô.ðWÜ$'¨£J˜Eð ×+Ñ+Ø1ØØ#ð ,õ ðð !×+Ñ+©F°:·=±=Ó,AÔBØ ×$Ñ$¨lÐ$Õ;ð9 (øô(  )ò WØ$VšEðWüs+   ‚C4EÃ7EÄAEÅEÅEÅEÅEÚerrorc              ƒ   ó  K  — ddl m}m} d}	d}
t        |t        «      rt        t        |«      dz  «      }	n| j                  |«      }	t        |t        «      rt        t        |«      dz  «      }
n| j                  |«      }
|�í| j                  |||	«      }| j                  |d|j                  ¬«       | j                  |d|j                  j                  ¬«       |r| j                  |d|¬«       |rH|j                  «       D ]5  \  }}t        |t        «      r	 t        |«      }| j                  |||¬«       Œ7 |j!                   ||j"                  «      «       |j%                  |
¬	«       y y # t        $ r d}Y ŒXw xY w­w)
Nr   rÐ  rÓ  rÇ  rÄ  rÆ  rÞ  z/litllm logging error - could_not_json_serializerÕ  )ry  rÑ  rÒ  r–   rÀ   r=   rÖ  rÍ  rÌ  rÇ  rÆ  r“   r¿   r—   r;   rÄ   r×  ÚERRORrÙ  )rñ   rÀ  rÞ  rÁ  r5   r³  rÎ  rÑ  rÒ  rÚ  rÛ  rÜ  rŠ   r“   s                 r@   Úasync_service_failure_hookz(OpenTelemetry.async_service_failure_hook/  s”  è ø€ ÷ 	;àˆØˆä�j¤%Ô(Ü ¤ Z£°3Ñ!6Ó7‰Nà!Ÿ[™[¨Ó4ˆNä�h¤Ô&Üœs 8›}¨sÑ2Ó3‰LàŸ;™; xÓ0ˆLàÐ'Ø*.×*BÑ*BÀ7ÐL\Ð^lÓ*mÐ Ø×#Ñ#Ø)ØØ×'Ñ'ð $ô ð
 ×#Ñ#Ø)ØØ—o‘o×+Ñ+ð $ô ñ
 Ø×'Ñ'Ø-ØØð (ô ñ
 Ø"0×"6Ñ"6Ó"8ò 
‘J�C˜Ü! %¬Ô.ðVÜ$'¨£J˜Eð ×+Ñ+Ø1ØØ#ð ,õ ð
ð !×+Ñ+©F°:×3CÑ3CÓ,DÔEØ ×$Ñ$¨lÐ$Õ;ðA (øô.  )ò VØ$UšEðVüs+   ‚DFÄE1Ä&AFÅ1E?Å<FÅ>E?Å?FÚrequest_dataÚoriginal_exceptionÚuser_api_key_dictÚtraceback_strc              ƒ   óÌ  K  — ddl m} ddlm}m} |j
                  }|��Ã|j                   ||j                  «      «       | j                  ||j                  |j                  ¬«       ddlm}	 |	j                  ||¬«      }
| j                  ||d|
idœ¬	«       |
r|
j                  d
«      nd }|s| j!                  |d«       | j#                  ||«       d}| j$                  j'                  ||j)                  |«      ¬«      }| j+                  |dt-        |«      ¬«       | j                  ||j                  |j                  ¬«       |j                   ||j                  «      «       |j/                  | j1                  t3        j4                  «       «      ¬«       | j7                  ||¬«       |j/                  | j1                  t3        j4                  «       «      ¬«       y y ­w)Nr   rm  rÐ  ©rÅ  Úteam_idÚ
team_alias©ÚStandardLoggingPayloadSetup)rã  rå  Úerror_information©Ú	exceptionÚstandard_logging_object©rÅ  r+  Ú
error_codeiô  zFailed Proxy Server Request)r4   r7   rî  rÄ  rÕ  )râ  Úparent_span)rw  rn  ry  rÑ  rÒ  rÁ  r×  rà  Ú_set_team_attributes_on_spanrè  ré  Ú*litellm.litellm_core_utils.litellm_loggingrë  Úget_error_informationÚ_record_exception_on_spanrš   Ú"set_response_status_code_attributeÚ$set_preprocessing_duration_attributer}  rÈ  rÉ  rÌ  r;   rÙ  rÖ  r	   ÚnowÚ'_emit_guardrail_spans_from_request_data)rñ   râ  rã  rä  rå  rn  rÑ  rÒ  rÁ  rë  rì  rñ  Ú
_span_nameÚexception_logging_spans                 r@   Úasync_post_call_failure_hookz*OpenTelemetry.async_post_call_failure_hooki  sò  è ø€ õ 	(ß:à"3×"DÑ"DÐØÑ'Ø×'Ñ'©¨z×/?Ñ/?Ó(@ÔAð
 ×-Ñ-Ø%Ø)×1Ñ1Ø,×7Ñ7ð .ô õð (C×'XÑ'XØ#5Ø+ð (Yó (Ðð ×*Ñ*Ø%à!3Ø0CÐEVÐ/Wñð +ô ñ HYÐ 1× 5Ñ 5°lÔ CÐ^bˆJÙØ×7Ñ7Ð8HÈ#ÔNð ×5Ñ5Ð6FÈÔUà =ˆJð -1¯K©K×,BÑ,BØØ×1Ñ1Ð2BÓCð -Có -Ð"ð ×#Ñ#Ø+ØÜÐ,Ó-ð $ô ð
 ×-Ñ-Ø+Ø)×1Ñ1Ø,×7Ñ7ð .ô ð
 #×-Ñ-©f°Z×5EÑ5EÓ.FÔGØ"×&Ñ&°·±¼H¿L¹L»NÓ0KÐ&ÔLð ×8Ñ8Ø)Ø,ð 9ô ð × Ñ ¨$¯+©+´h·l±l³nÓ*EÐ ÕFðW (ùs   ‚G"G$rò  úSpan | Nonec                 óê   — ddl m} ddlm} |xs i }|j	                   ||«      «      xs i }|j	                  d«      }|syd|i||dœdœ}|�|j                  |«      nd}| j                  ||¬	«       y)
u_  Emit ``guardrail`` spans from the request's proxy-internal metadata bucket
        (``standard_logging_guardrail_information``).

        Routed through ``_create_guardrail_span`` so the dedupe state in
        ``_otel_internal`` is honoured â€” if ``_handle_failure`` already
        emitted these spans for the same kwargs, this is a no-op.
        r   rm  )Ú&get_metadata_variable_name_from_kwargsÚ&standard_logging_guardrail_informationNÚmetadata)Úguardrail_informationr  )Úlitellm_paramsrï  ©r+  r7   )rw  rn  Ú'litellm.litellm_core_utils.core_helpersr   rš   rÉ  Ú_create_guardrail_span)	rñ   râ  rò  Ú_tracer   r  r  r+  r7   s	            r@   rú  z5OpenTelemetry._emit_guardrail_spans_from_request_dataÁ  s–   € õ 	2õ	
ð $Ò) rˆØ&×*Ñ*Ñ+QÐR^Ó+_Ó`ÒfÐdfˆØ'/§|¡|Ð4\Ó']ÐÙ$Øð  *¨8Ð4à)>Ø$ñ(ñ,
ˆð EPÐD[˜×3Ñ3°KÔ@ÐaeˆØ×#Ñ#¨6¸7Ð#ÕCr?   ÚdataÚresponsec              ƒ   óþ   K  — ddl m} |j                  d«      }|�_t        ||«      rS|j                  }|j
                  }| j                  ||¬«      \  }}	| j                  ||«       | j                  ||¬«       |S ­w)Nr   )ÚLoggingÚlitellm_logging_obj)Údefault_spanr  )	rô  r  rš   r–   Úmodel_call_detailsrÁ  Ú_get_span_contextrø  r  )
rñ   r	  rä  r
  ÚLiteLLMLoggingr  r+  rò  ÚctxÚ_s
             r@   Úasync_post_call_success_hookz*OpenTelemetry.async_post_call_success_hookè  s‡   è ø€ õ 	Yà%)§X¡XÐ.CÓ%DÐàÐ*¬zÐ:MÈ~Ô/^Ø/×BÑBˆFØ!2×!CÑ!CˆKà×+Ñ+¨FÀÐ+ÓM‰FˆC�ð ×5Ñ5°kÀ6ÔJð ×'Ñ'¨v¸sÐ'ÔCàˆùs   ‚A;A=r+  c                 óŽ  — | j                  |«      }|�1t        j                  d|j                  «       | j	                  |«      S | j                  |«      }|�;| j                  |«      }t        j                  dt        t        |«      «      «       |S t        | d«      r…| j                  dk(  rv| j                  r| j                  | j                  «      ni }|r(| j                  |«      }t        j                  d«       |S | j                  }t        j                  d«       |S | j                  }t        j                  d«       |S )a  
        Get the tracer to use for this request

        If dynamic headers are present, a temporary tracer is created with the dynamic headers.
        Otherwise, the default tracer is used.

        Returns:
            Tracer: The tracer to use for this request
        z:[OTEL DEBUG] Using DYNAMIC config tracer with endpoint: %sz2[OTEL DEBUG] Using DYNAMIC tracer with headers: %sr	  rY  zM[OTEL DEBUG] Using env var credentials for langfuse_otel (master key request)z7[OTEL DEBUG] No credentials available for langfuse_otelz5[OTEL DEBUG] Using GLOBAL tracer (no dynamic headers))Ú$_get_dynamic_otel_config_from_kwargsr   rÅ   rÙ   Ú_get_tracer_with_dynamic_configÚ%_get_dynamic_otel_headers_from_kwargsÚ _get_tracer_with_dynamic_headersr   r;   rÓ   r	  rú   Ú_get_headers_dictionaryr}  )rñ   r+  Údynamic_configÚdynamic_headersÚtracer_to_useÚenv_var_headerss         r@   Úget_tracer_to_use_for_requestz+OpenTelemetry.get_tracer_to_use_for_request  s<  € ð !%× IÑ IÈ&Ó QˆØÐ%Ü× Ñ ØLØ×'Ñ'ôð ×7Ñ7¸ÓGÐGà!%×!KÑ!KÈFÓ!SˆàÐ&à ×AÑAÀ/ÓRˆMÜ× Ñ ØDÄmÔTWÐXgÓThÓFiôð* Ðô! �t˜_Ô-°$×2DÑ2DÈÒ2Wà\`×\mÒ\m¨×)EÑ)EÀd×FWÑFWÔ)XÐsu�Ù"Ø$(×$IÑ$IÈ/Ó$Z�MÜ"×(Ñ(Øgôð Ðð %)§K¡K�MÜ"×(Ñ(Ð)bÔcð
 Ðð !%§¡�Ü×$Ñ$Ð%\Ô]àÐr?   c                 óZ   — |j                  d«      }|sy| j                  |¬«      }|r|S dS )z1Extract dynamic headers from kwargs if available.Ú standard_callback_dynamic_paramsN©r!  )rš   Úconstruct_dynamic_otel_headers)rñ   r+  r!  r  s       r@   r  z3OpenTelemetry._get_dynamic_otel_headers_from_kwargs1  sG   € àX^×XbÑXbØ.óY
Ð(ñ 0Øà!%×!DÑ!DØ-Mð "Eó "
ˆñ #2ˆÐ;°tÐ;r?   c                 óN   — |j                  d«      }|sy| j                  |¬«      S )z@Extract a full dynamic exporter config from kwargs if available.r!  Nr"  )rš   Úconstruct_dynamic_otel_config)rñ   r+  r!  s      r@   r  z2OpenTelemetry._get_dynamic_otel_config_from_kwargs@  s4   € àX^×XbÑXbØ.óY
Ð(ñ 0Øà×1Ñ1ÐSsÐ1ÓtÐtr?   Ú	cache_keyr?  rË   z:tuple[_CachedTracerProvider, _CachedTracerProvider | None]c                 ó&  — | j                   j                  |«      }|�| j                   j                  |«       ||fS || j                   |<   t        | j                   «      | j                  kD  r!|| j                   j                  d¬«      d   fS |dfS )a  Cache ``built`` under ``cache_key``, returning the entry to use and what to drop.

        Caller holds ``_tracer_provider_cache_lock``. The drop is either the loser of a
        concurrent build for this key or the LRU victim its insertion pushed out.
        NF)Úlastrµ   )r  rš   Úmove_to_endÚlenr  Úpopitem)rñ   r&  r?  Úraceds       r@   Ú_insert_or_dropzOpenTelemetry._insert_or_dropK  s•   € ð ×2Ñ2×6Ñ6°yÓAˆØÐØ×'Ñ'×3Ñ3°IÔ>Ø˜%�<Ðà16ˆ×#Ñ# IÑ.Üˆt×*Ñ*Ó+¨d×.PÑ.PÒPØ˜$×5Ñ5×=Ñ=À5Ð=ÓIÈ!ÑLÐLÐLØ�dˆ{Ðr?   ÚbuildrÌ   rÍ   Ú_Tracerc                 ó8  — | j                   5  | j                  j                  |«      }|�C| j                  j                  |«       |j                  j                  t        «      cddd«       S 	 ddd«       t         |«       |¬«      }| j                   5  | j                  ||«      \  }}ddd«       �0|j                  r$t        j                  t        |j                  «       j                  j                  t        «      S # 1 sw Y   Œ–xY w# 1 sw Y   ŒfxY w)aZ  Return the tracer for ``cache_key``, building and caching a provider on miss.

        A provider that owns its exporter also owns a ``BatchSpanProcessor`` worker thread
        that only stops on ``shutdown()``, so the cache is a bounded LRU and whatever it
        drops is shut down. Without both, a proxy serving key-scoped credentials accumulates
        one live thread per credential set for the life of the process.

        ``owns_exporter`` also decides ``shutdown_on_exit`` at build time: a provider we may
        never shut down must not hold an interpreter-exit hook, which would both pin it in
        memory for the life of the process and stop the shared exporter at exit. Those
        providers use ``SimpleSpanProcessor``, which buffers nothing, so the hook costs them
        no flush.

        ``owns_exporter`` describes the provider being built, and is cached with it, because
        the two dynamic entry points share this cache and can disagree: whether the LRU
        victim may be shut down is a property of the victim, never of the request that
        happened to evict it.
        N)rÆ   rÍ   )r  r  rš   r)  rÆ   r|  rV   rË   r-  rÍ   rS   ÚsubmitrÈ   )rñ   r&  r.  rÍ   Úcachedr?  ÚwinnerÚdroppeds           r@   Ú_cached_dynamic_tracerz$OpenTelemetry._cached_dynamic_tracer]  sý   € ð0 ×-Ñ-ñ 	GØ ×7Ñ7×;Ñ;¸IÓFˆFØÐ!Ø×+Ñ+×7Ñ7¸	ÔBØ—‘×1Ñ1Ô2EÓF÷		Gñ 	Gà!÷	Gô -±e³gÈ]Ô[ˆà×-Ñ-ñ 	EØ"×2Ñ2°9¸eÓD‰OˆF�G÷	Eð Ð 7×#8Ò#8ä'×.Ñ.Ô/HÈ'×JZÑJZÔ[Ø�‰×)Ñ)Ô*=Ó>Ð>÷	Gð 	Gú÷	Eð 	Eús   �ADÂDÄDÄDr  c                 óÊ   ‡ ‡‡‡— ddl mŠ t        ‰j                  «      Šdˆˆˆˆ fd„}d‰j                  › d‰j                  › d‰j
                  › �}‰ j                  ||‰«      S )zQCreate (or reuse) a tracer whose exporter target comes from a per-request config.r   r(   c                  óz   •—  ‰‰j                  «       ‰¬«      } | j                  ‰j                  ‰¬«      «       | S )N©rq  Úshutdown_on_exit)Úconfig_overriderr  )rÆ   r)   r  rÍ   rñ   s    €€€€r@   Ú_buildz=OpenTelemetry._get_tracer_with_dynamic_config.<locals>._buildŒ  s;   ø€ Ù,°d×6LÑ6LÓ6NÐanÔoˆHØ×'Ñ'¨×(@Ñ(@ÐQ_Ð(@Ó(`ÔaØˆOr?   zdynamic_config:ú:©r”   rÌ   )rx  r)   rÕ   rÐ   rÙ   rÚ   r5  )rñ   r  r;  r&  r)   rÍ   s   ``  @@r@   r  z-OpenTelemetry._get_tracer_with_dynamic_config†  sk   û€ å:ä6°~×7NÑ7NÓOˆ÷	ð 	ð ˜n×5Ñ5Ð6°a¸×8OÑ8OÐ7PÐPQÐR`×RhÑRhÐQiÐjð 	ð ×*Ñ*¨9°f¸mÓLÐLr?   r  c                 ó¼   ‡ ‡‡‡— ddl mŠ t        ‰ j                  «      Šdˆˆˆˆ fd„}t	        t        ‰j                  «       «      «      }‰ j                  ||‰«      S )zUCreate (or reuse) a tracer whose OTLP headers come from a per-request credential set.r   r(   c                  óz   •—  ‰‰j                  «       ‰¬«      } | j                  ‰j                  ‰¬«      «       | S )Nr8  )r  rr  )rÆ   r)   r  rÍ   rñ   s    €€€€r@   r;  z>OpenTelemetry._get_tracer_with_dynamic_headers.<locals>._buildœ  s;   ø€ Ù,°d×6LÑ6LÓ6NÐanÔoˆHØ×'Ñ'¨×(@Ñ(@ÐQ`Ð(@Ó(aÔbØˆOr?   r=  )rx  r)   rÕ   rö   r;   r¡   r¿   r5  )rñ   r  r;  r&  r)   rÍ   s   ``  @@r@   r  z.OpenTelemetry._get_tracer_with_dynamic_headers–  sO   û€ å:ä6°t×7IÑ7IÓJˆ÷	ð 	ô
 œv o×&;Ñ&;Ó&=Ó>Ó?ˆ	Ø×*Ñ*¨9°f¸mÓLÐLr?   r!  c                  ó   — y)a  
        Construct dynamic headers from standard callback dynamic params

        Note: You just need to override this method in Arize, Langfuse Otel if you want to allow team/key based logging.

        Returns:
            dict: A dictionary of dynamic headers
        Nr>   ©rñ   r!  s     r@   r#  z,OpenTelemetry.construct_dynamic_otel_headers¤  ó   € ð r?   c                  ó   — y)ac  
        Construct a full exporter config from standard callback dynamic params.

        Override this when team/key dynamic params must control the export
        target (exporter kind + endpoint), not just the request headers. When
        this returns a config, it takes precedence over
        construct_dynamic_otel_headers for the request.
        Nr>   rA  s     r@   r%  z+OpenTelemetry.construct_dynamic_otel_config±  rB  r?   Úscopec                 óÌ  — |j                  d«      }t        |t        «      si }||d<   |j                  d«      }t        |t        «      si }||d<   |j                  d«      }t        |t        «      si }||d<   |j                  d«      }t        |t        «      si }||d<   | j                  j                  t        | «      gd„ |D «       ¢­}|j                  |«      du ryd||<   y)aY  Return True the first time this handler is asked to emit a span
        for the given (handler, scope) on this kwargs; False on repeats.

        Used to suppress duplicate span emission for two distinct patterns:

        1. **Handler-level dual-fire**: streaming code paths trigger both
           the sync and async callback for one request, so ``_handle_success``
           / ``_handle_failure`` would otherwise produce two
           ``litellm_request`` spans. Scope: ``("success",)`` / ``("failure",)``.
        2. **Payload-driven multi-entrypoint emission**: a span loop that
           reads entries from ``standard_logging_payload`` (currently only
           guardrails) is invoked from multiple lifecycle points
           (post-call hooks, success callback, failure callback). The list
           can be re-read with mutated entries between calls, so dedupe
           must be at entry granularity. Scope: the entry's stable identity.

        ``scope`` parts may include unhashable containers (list, dict, set);
        they are normalized into a hashable shape via ``_freeze_for_dedupe``
        before keying the marker dict. The marker is stored in
        ``kwargs["litellm_params"]["metadata"]["_otel_internal"]`` so it is
        request-local (kwargs is shared across the sync/async callbacks and
        lifecycle hooks for one request).
        r  r  Ú_otel_internalÚspans_loggedc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr    r¶   )r‰   Úparts     r@   r‹   z+OpenTelemetry._emit_once.<locals>.<genexpr>ñ  s   è ø€ Ò9¨4Ô  ×&Ñ9ùs   ‚TF)rš   r–   r—   r0  r8   Úid)rñ   r+  rD  r  Ú	_metadatarF  rG  Ú
dedupe_keys           r@   Ú
_emit_oncezOpenTelemetry._emit_onceÂ  sù   € ð0  Ÿ™Ð$4Ó5ˆÜ˜.¬$Ô/ØˆNØ'5ˆFÐ#Ñ$à"×&Ñ& zÓ2ˆ	Ü˜)¤TÔ*ØˆIØ)2ˆN˜:Ñ&à"Ÿ™Ð'7Ó8ˆÜ˜.¬$Ô/ØˆNØ*8ˆIÐ&Ñ'à%×)Ñ)¨.Ó9ˆÜ˜,¬Ô-ØˆLØ-9ˆN˜>Ñ*ð �N‰N×#Ñ#Üˆt‹Hð
ñ :°5Ô9ñ
ˆ
ð
 ×Ñ˜JÓ'¨4Ñ/Øà#'ˆ�ZÑ Ør?   c                 ód  — |j                  di «      xs i }|j                  di «      xs i }|j                  dd«      }|€(|j                  di «      xs i }|j                  dd«      }|�Ft        |dd«      t        k(  r1t        |d«      r$|j	                  «       r| j                  ||«       yyyyy)uN  Close the proxy-level parent span if it is still recording.

        This helper retrieves the proxy span directly from kwargs metadata
        and closes it after all child spans have been recorded.

        Only called from the success path. The failure path deliberately
        leaves the proxy span open so ``async_post_call_failure_hook`` can
        append the ``"Failed Proxy Server Request"`` child span before
        closing it.

        Only spans named ``LITELLM_PROXY_REQUEST_SPAN_NAME`` are closed â€”
        externally provided spans must not be closed by LiteLLM.
        r  r  Úlitellm_parent_otel_spanNÚlitellm_metadatar4   Úis_recording)rš   rM  rY   rÓ   rQ  Ú_close_proxy_span_ok)rñ   r+  r³  r  rK  Ú
proxy_spanÚ_litellm_metadatas          r@   Ú_end_proxy_span_from_kwargsz)OpenTelemetry._end_proxy_span_from_kwargsù  sÌ   € ð !'§
¡
Ð+;¸RÓ @Ò FÀBˆØ)×-Ñ-¨j¸"Ó=ÒCÀˆ	Ø—]‘]Ð#=¸tÓDˆ
ð ÐØ'5×'9Ñ'9Ð:LÈbÓ'QÒ'WÐUWÐØ*×.Ñ.Ð/IÈ4ÓPˆJð Ð"Ü˜
 F¨DÓ1Ô5TÒTÜ˜
 NÔ3Ø×'Ñ'Ô)à×%Ñ% j°(Õ;ð *ð 4ð Uð #r?   rÅ  c                 ó¼   — ddl m}m} | j                  |d«       |j	                   ||j
                  «      «       |j                  | j                  |«      ¬«       y)zCStamp http.response.status_code=200 + status=OK, then end the span.r   rÐ  éÈ   rÕ  N)ry  rÑ  rÒ  r÷  r×  rØ  rÙ  rÖ  )rñ   rÅ  r³  rÑ  rÒ  s        r@   rR  z"OpenTelemetry._close_proxy_span_ok  sA   € ç:à×/Ñ/°°cÔ:Ø�‰™˜zŸ}™}Ó-Ô.Ø�‰˜$Ÿ+™+ hÓ/ˆÕ0r?   c                 ó6  — t        j                  d|| j                  «       | j                  |d«      s=t        j                  d| j                  j
                  «       | j                  ||«       y| j                  |«      \  }}| j                  j                  rd}d}|du xs t        d«      }|r+| j                  |||||«      }| j                  |||||«       n_ddlm}	m}
 d}t        |d«      r4|j!                   |	|
j"                  «      «       | j%                  |||«       | j                  |||||«       | j'                  |||¬	«      }| j)                  ||¬
«       | j+                  ||||«       | j                  j,                  r|�|n|}|�| j/                  |||«       |�Mt        |d«      rA|j0                  t2        k(  r.t        |d«      r"|j5                  «       r| j7                  ||«       | j9                  |«       | j                  ||«       y)z:Create the litellm_request span then close the proxy span.zAOpenTelemetry Logger: Logging kwargs: %s, OTEL config settings=%sÚsuccessz=OpenTelemetry: skipping duplicate success span for handler=%sNÚUSE_OTEL_LITELLM_REQUEST_SPANr   rÐ  r×  ©rÅ  rò  Úfallback_ctxr  r4   rQ  )r   rÅ   r  rM  r0  r8   rU  r  rà   r   Ú_start_primary_spanÚ_maybe_log_raw_requestry  rÑ  rÒ  rÓ   r×  rØ  Úset_attributesÚ_resolve_guardrail_contextr  Ú_record_metricsrÜ   Ú_emit_semantic_logsr4   rY   rQ  rR  Ú._set_team_attributes_on_proxy_span_from_kwargs)rñ   r+  r²  r5   r³  r  rò  Úshould_create_primary_spanrÅ  rÑ  rÒ  Úguardrail_ctxÚlog_spans                r@   r°  zOpenTelemetry._handle_success!  s  € ä×ÑØOØØ�K‰Kô	
ð �‰˜v yÔ1Ü× Ñ ØOØ—‘×'Ñ'ôð ×,Ñ,¨V°XÔ>Øà×1Ñ1°&Ó9Ñˆˆ[à�;‰;×1Ò1ØˆKØˆCð
 -8¸4Ð,?Ò,sÄ?ÐSrÓCsÐ"á%à×+Ñ+¨F°LÀ*ÈhÐX[Ó\ˆDà×'Ñ'¨°¸jÈ(ÐTXÕY÷ ?àˆDô �{ LÔ1Ø×&Ñ&¡v¨j¯m©mÓ'<Ô=Ø×#Ñ# K°¸ÔFà×'Ñ'¨°¸jÈ(ÐT_Ô`ð  $×>Ñ>ÀDÐVaÐpsÐ>ÓtˆØ×#Ñ#¨6¸=Ð#ÔIð 	×Ñ˜V \°:¸xÔHð �;‰;×$Ò$Ø&*Ð&6™d¸KˆHØÐ#Ø×(Ñ(¨°¸xÔHð Ð#Ü˜ VÔ,Ø× Ñ Ô$CÒCÜ˜ ^Ô4Ø×(Ñ(Ô*à×%Ñ% k°8Ô<ð 	×;Ñ;¸FÔCð
 	×(Ñ(¨°Õ:r?   r7   c                 ó˜  — ddl m}m} | j                  |«      }| j	                  |«      | j                  |«      |dœ}	| j                  r| j                  j                  |	d<    |j                  di |	¤Ž}
|
j                   ||j                  «      «       | j                  |
||«       |
j                  | j                  |«      ¬«       |
S )Nr   rÐ  ©r4   r5   r7   rD   rÕ  r>   )ry  rÑ  rÒ  r  Ú_get_span_namerÖ  Ú#_gen_ai_semconv_latest_experimentalr  rÊ  rÈ  r×  rØ  r_  rÙ  )rñ   r+  r²  r5   r³  r7   rÑ  rÒ  Úotel_tracerÚspan_kwargsrÅ  s              r@   r]  z!OpenTelemetry._start_primary_spany  s´   € ÷ 	;à%)×%GÑ%GÈÓ%Oˆð ×'Ñ'¨Ó/ØŸ+™+ jÓ1Øñ0
ˆð
 ×3Ò3Ø"&§.¡.×"7Ñ"7ˆK˜ÑØ,�k×,Ñ,Ñ;¨{Ñ;ˆà�‰™˜zŸ}™}Ó-Ô.Ø×Ñ˜D &¨,Ô7Ø�‰˜$Ÿ+™+ hÓ/ˆÔ0Øˆr?   c                 ó4  — ddl m} ddlm}m} | j
                  ry | j                  «       sy |j                  di «      }	|	j                  d«      xs i }
|
j                  d«      }|r|nt        }| j                  |«      }|j                  || j                  |«      |j                  |«      ¬«      }|j                   ||j                  «      «       | j                  |||«       | j!                  ||«       |j#                  | j                  |«      ¬«       y )	Nr   rm  rÐ  r  r  Úgeneration_namerh  rÕ  )rw  rn  ry  rÑ  rÒ  rj  ri  rš   rd   r  rÈ  rÖ  rÉ  r×  rØ  Úset_raw_request_attributesÚ _set_team_attributes_from_kwargsrÙ  )rñ   r+  r²  r5   r³  rò  rn  rÑ  rÒ  r  r  rn  Úraw_span_namerk  Úraw_spans                  r@   r^  z$OpenTelemetry._maybe_log_raw_request“  sø   € Ý'ß:ð ×3Ò3Øà×$Ñ$Ô&Øà &§
¡
Ð+;¸RÓ @ˆØ(×,Ñ,¨ZÓ8Ò>¸BˆØ!)§¡Ð.?Ó!@ˆá2A™ÔG\ˆà%)×%GÑ%GÈÓ%OˆØ%×0Ñ0ØØ—{‘{ :Ó.Ø×-Ñ-¨kÓ:ð 1ó 
ˆð
 	×Ñ™F :§=¡=Ó1Ô2Ø×'Ñ'¨°&¸,ÔGØ×-Ñ-¨h¸Ô?Ø�‰˜dŸk™k¨(Ó3ˆÕ4r?   rè  ré  c                 ó^   — |r| j                  |d|¬«       |r| j                  |d|¬«       yy)aµ  Stamp team_id / team_alias onto a span so every child span of a
        litellm_request trace carries them, not just the root span.

        Empty strings are treated as absent: a request made with the master
        key or a team-less virtual key carries ``user_api_key_team_id=""``
        in ``standard_logging_object.metadata``; propagating that to every
        span only adds noise that makes traces look mis-instrumented.
        zmetadata.user_api_key_team_idrÄ  z metadata.user_api_key_team_aliasN)rÌ  )rñ   rÅ  rè  ré  s       r@   ró  z*OpenTelemetry._set_team_attributes_on_span¯  sI   € ñ Ø×#Ñ#ØØ3Øð $ô ñ
 Ø×#Ñ#ØØ6Ø ð $õ ð r?   c                 ó   — |j                  d«      }i }t        |t        «      r|j                  d«      xs i }n|�t        |dd«      xs i }| j	                  ||j                  d«      |j                  d«      ¬«       y)z`Pull team_id / team_alias from the standard logging metadata in kwargs and stamp them onto span.rï  r  Nrr   ru   rç  )rš   r–   r—   rM  ró  )rñ   rÅ  r+  Ústd_logÚmds        r@   rp  z.OpenTelemetry._set_team_attributes_from_kwargsÊ  s|   € àŸ™Ð$=Ó>ˆØˆÜ�gœtÔ$Ø—‘˜ZÓ(Ò.¨B‰BØÐ Ü˜ *¨dÓ3Ò9°rˆBØ×)Ñ)ØØ—F‘FÐ1Ó2Ø—v‘vÐ7Ó8ð 	*õ 	
r?   c                 ó
  — |j                  d«      xs i }|j                  d«      xs i }|j                  d«      }|�Ft        |dd«      t        k(  r1t        |d«      r$|j	                  «       r| j                  ||«       yyyyy)a¥  Stamp team attributes onto the proxy SERVER (root) span so the
        trace root is filterable by team, not just its children. The root
        span is created in auth before the team is resolved and is
        otherwise only closed (never re-attributed) on the success path.

        Guarded to the LiteLLM-created proxy span (by name + recording) so
        externally provided parent spans are never mutated.
        r  r  rO  Nr4   rQ  )rš   rM  rY   rÓ   rQ  rp  )rñ   r+  r  r  rS  s        r@   rc  z<OpenTelemetry._set_team_attributes_on_proxy_span_from_kwargsØ  s�   € ð !'§
¡
Ð+;Ó <Ò BÀˆØ(×,Ñ,¨ZÓ8Ò>¸BˆØ$ŸL™LÐ)CÓDˆ
àÐ"Ü˜
 F¨DÓ1Ô5TÒTÜ˜
 NÔ3Ø×'Ñ'Ô)à×1Ñ1°*¸fÕEð *ð 4ð Uð #r?   Ústandard_logging_payloadr  c                 óp  — |j                  d«      xs i }|j                  d«      }|r| j                  |t        |¬«       |j                  d«      xs |j                  d«      xs i }| j                  |j                  d«      | j                  j
                  «      }|r| j                  |t        |¬«       |j                  d«      }|r| j                  |t        |¬«       |j                  d«      xs i }	|	j                  d«      xs |j                  d	«      }
|
r| j                  |t        |
¬«       y
y
)a(  Stamp request-identity attributes onto an inference span so every
        LLM-call span is filterable by the route it came in on, the team's
        metadata, and both the user-facing (model_group alias) and the
        dispatched (provider) model names. Empty/absent values are skipped.
        r  Úuser_api_key_request_routerÄ  rP  Úuser_api_key_team_metadataÚmodel_groupr†   Úlitellm_model_nameÚmodelN)	rš   rÌ  r[   Ú_team_metadata_jsonr  rå   r^   r_   r`   )rñ   rÅ  rx  r  r  Ú
http_routeÚraw_metadataÚteam_metadatar|  r†   Úprovider_models              r@   Ú"_set_inference_identity_attributesz0OpenTelemetry._set_inference_identity_attributesì  s4  € ð 3×6Ñ6°zÓBÒHÀbˆà$ŸL™LÐ)EÓFˆ
ÙØ×#Ñ#¨Ô3GÈzÐ#ÔZð -×0Ñ0°Ó<ÒlÀ×@RÑ@RÐSeÓ@fÒlÐjlˆØ#×7Ñ7Ø×ÑÐ9Ó:Ø�K‰K×2Ñ2ó 
ˆñ Ø×#Ñ#¨Ô3JÐR_Ð#Ô`à5×9Ñ9¸-ÓHˆÙØ×#Ñ#¨Ô3HÐP[Ð#Ô\à7×;Ñ;¸OÓLÒRÐPRˆØ -× 1Ñ 1Ð2FÓ GÒ pÐKc×KgÑKgÐhoÓKpˆÙØ×#Ñ#¨Ô3KÐSaÐ#Õbð r?   c                 óš   — t        |«      }|�| j                  |t        |¬«       t        |«      }|�| j                  |t        |¬«       yy)zðStamp the tier the caller asked for and the tier the provider reports it
        served, so tier usage is segmentable in traces. Both are optional: a caller
        may not name a tier, and streaming responses carry no served tier.
        NrÄ  )r   rÌ  ra   r   rb   )rñ   rÅ  rx  Úrequested_tierÚserved_tiers        r@   Ú_set_service_tier_attributesz*OpenTelemetry._set_service_tier_attributes  sY   € ô !;Ð;SÓ TˆØÐ%Ø×#Ñ#¨Ô3QÐYgÐ#Ôhä4Ð5MÓNˆØÐ"Ø×#Ñ#¨Ô3RÐZeÐ#Õfð #r?   r“   Úallowed_keysc                 ó‚   — t        | t        «      r| r|sy|D �ci c]  }|| v sŒ|| |   “Œ }}|syt        |«      S c c}w )a  JSON-serialize only the allowlisted sub-keys of a team's metadata.

        Returns ``None`` when nothing is allowlisted or no allowlisted key is
        present, so the empty case is dropped rather than stamping a useless
        ``"{}"`` (and so a team's metadata never leaves the process until an
        operator opts each sub-key in via ``baggage_team_metadata_keys``).
        N)r–   r—   r   )r“   r‰  rŠ   Úfiltereds       r@   r  z!OpenTelemetry._team_metadata_json#  sM   € ô ˜%¤Ô&©e¹<ØØ6BÖS¨sÀcÈUÂl˜3  c¡
™?ÐSˆÐSÙØÜ˜(Ó#Ð#ùò Ts   š	<¤<c                 óV  — | j                   ry| j                  j                  }|€e| j                  dv rWt        j
                  xs i j                  d«      xs i }t        |t        «      r|j                  d«      nd}|�t        |«      }t        |«      \  | _        | _        d| _         y)z’Resolve the include/exclude filter once, falling back to the proxy's
        callback_settings.otel.attributes when no explicit config was passed.N)NrC  rC  rœ   T)r  r  rœ   r	  rU   Úcallback_settingsrš   r–   r—   r›   r§   r  r  )rñ   rœ   Úotel_settingsÚraws       r@   r  z-OpenTelemetry._ensure_metric_attribute_filter3  s¢   € ð ×,Ò,ØØ—[‘[×+Ñ+ˆ
ØÐ $×"4Ñ"4¸Ñ"FÜ$+×$=Ñ$=Ò$CÀ×#HÑ#HÈÓ#PÒ#VÐTVˆMÜ<FÀ}ÔVZÔ<[˜×*Ñ*¨<Ô8ÐaeˆCØˆÜ;¸CÓ@�
ô -¨ZÓ8ñ	
ØÔ%ØÔ%à,0ˆÕ)r?   Úattrsc                 óR  — | j                   s| j                  «        | j                  �3|j                  «       D ��ci c]  \  }}|| j                  v sŒ||“Œ c}}S | j                  �3|j                  «       D ��ci c]  \  }}|| j                  vsŒ||“Œ c}}S |S c c}}w c c}}w r    )r  r  r  r¿   r  )rñ   r�  ÚkÚvs       r@   Ú_filter_metric_attributesz'OpenTelemetry._filter_metric_attributesD  s•   € Ø×0Ò0Ø×0Ñ0Ô2Ø×$Ñ$Ð0Ø%*§[¡[£]×U™T˜Q °a¸4×;TÑ;TÒ6T�A�q‘DÓUÐUØ×$Ñ$Ð0Ø%*§[¡[£]×Y™T˜Q °a¸t×?XÑ?XÒ6X�A�q‘DÓYÐYØˆùó VùãYs   ¼BÁBÁ;B#ÂB#c                 ó"  — ||z
  j                  «       }|j                  d«      xs i }|j                  dd«      }| j                  r| j                  |«      nd||j                  d«      ddœ}|j                  d«      }	t	        |	d	d «      xs |	xs i j                  d	i «      }
t
        D ]O  }|
j                  |«      }|€Œt        |t        t        f«      rt        |«      |d
|› �<   Œ?t        |«      |d
|› �<   ŒQ t	        |	dd «      xs |	xs i j                  di «      }|rt        |«      |d<   | j                  |«      }| j                  rÌ| j                  j                  ||¬«       | j                  r£|r¡t        |j                  d«      ||«      s…|j                  d«      x}rri |¥t         di¥}i |¥t         di¥}| j                  j                  |j                  dd«      |¬«       | j                  j                  |j                  dd«      |¬«       |j                  d«      }| j"                  r|r| j"                  j                  ||¬«       | j%                  ||«       | j'                  |||||«       | j)                  |||«       y )Nr  Úcustom_llm_providerÚUnknownÚchatr~  rU   )r�   rƒ   r„   r…   rï  r  rˆ   r†   ©rœ   rÇ  rL   ÚinputÚoutputÚprompt_tokensr   rI   Úresponse_cost)Útotal_secondsrš   rj  Ú_gen_ai_operation_namerM  r   r–   r—   r’   r   r;   r”  r�  ÚrecordrŽ  r   r€   r�  Ú"_record_time_to_first_token_metricÚ$_record_time_per_output_token_metricÚ _record_response_duration_metric)rñ   r+  r²  r5   r³  Ú
duration_sÚparamsrÆ   Úcommon_attrsru  rv  rŠ   r“   r†   rL   Úin_attrsÚ	out_attrsÚcosts                     r@   ra  zOpenTelemetry._record_metricsM  s…  € Ø%¨
Ñ2×AÑAÓCˆ
ØŸ
™
Ð#3Ó4Ò:¸ˆØ Ÿ*™*Ð%:¸IÓFˆð 8<×7_Ò7_�×+Ñ+¨FÔ3Ðekà%Ø$*§J¡J¨wÓ$7Ø )ñ
ˆð  Ÿ™Ð$=Ó>ˆÜ˜G Z°Ó6Ò]¸7º=Àb×:MÑ:MÈjÐZ\Ó:]ˆÜ'ò 	=ˆCØ—F‘F˜3“KˆEØˆ}ØÜ˜%¤$¬ Ô.Ü2<¸UÓ2C�˜y¨¨Ð.Ò/ä25°e³*�˜y¨¨Ð.Ò/ð	=ô  ' w°ÀÓFÒrÈ7Ê=ÐVX×J]ÑJ]Ð^mÐoqÓJrˆÙÜ,6°}Ó,EˆL˜Ñ)à×5Ñ5°lÓCˆà×-Ò-Ø×.Ñ.×5Ñ5°jÈ\Ð5ÔZà×+Ò+Ù ÜBÀ6Ç:Á:ÈkÓCZÐ\bÐdpÔqØ*×.Ñ.¨wÓ7Ð7�UÐ7à"Q \Ð"QÔ3GÈÑ"Q�Ø#S lÐ#SÔ4HÈ(Ñ#S�	Ø×+Ñ+×2Ñ2°5·9±9¸_ÈaÓ3PÐ]eÐ2ÔfØ×+Ñ+×2Ñ2°5·9±9Ð=PÐRSÓ3TÐajÐ2Ôkà—j‘j Ó1ˆØ×Ò¡DØ× Ñ ×'Ñ'¨¸Ð'ÔFð 	×/Ñ/°¸ÔEØ×1Ñ1°&¸,ÈÐR\Ð^jÔkØ×-Ñ-¨f°hÀÕMr?   Úvalc                 ó\  — | €yt        | t        «      r| j                  «       S t        | t        t        f«      rt	        | «      S 	 t        j
                  | d«      j                  «       S # t        $ r8 	 t        j
                  | d«      j                  «       cY S # t        $ r Y Y yw xY ww xY w)z+Convert datetime/float/string to timestamp.Nz%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%S)r–   r	   Ú	timestampr=   rÀ   Ústrptimer˜   )rª  s    r@   Ú_to_timestampzOpenTelemetry._to_timestampƒ  sŸ   € ð
 ˆ;ØÜ�cœ8Ô$Ø—=‘=“?Ð"Ü�cœC¤˜<Ô(Ü˜“:Ðð	Ü×$Ñ$ SÐ*@ÓA×KÑKÓMÐMøÜò 	ðÜ×(Ñ(¨Ð.AÓB×LÑLÓNÒNøÜò Úðúð	ús0   Á#A* Á*	B+Á4#BÂB+Â	B'Â#B+Â&B'Â'B+r¦  c                 óP  — |j                  di «      }|j                  dd«      }| j                  r|sy|j                  dd«      }|j                  dd«      }|�M|�J| j                  |«      }| j                  |«      }|�|€y||z
  }	| j                  j                  |	|¬«       yyy)z@Record Time to First Token (TTFT) metric for streaming requests.Úoptional_paramsÚstreamFNÚapi_call_start_timeÚcompletion_start_timer™  )rš   r�  r®  r   )
rñ   r+  r¦  r°  Úis_streamingr²  r³  Úapi_call_start_tsÚcompletion_start_tsÚtime_to_first_token_secondss
             r@   r¡  z0OpenTelemetry._record_time_to_first_token_metric—  sÈ   € à!'§¡Ð,=¸rÓ!BˆØ-×1Ñ1°(¸EÓBˆà×3Ò3¹Øð &,§Z¡ZÐ0EÀtÓ%LÐØ'-§z¡zÐ2IÈ4Ó'PÐàÐ*Ð/DÐ/Pà'+×'9Ñ'9Ð:MÓ'NÐØ)-×);Ñ);Ð<QÓ)RÐà Ð(Ð,?Ð,GØà1DÐGXÑ1XÐ'Ø×/Ñ/×6Ñ6Ð7RÐ_kÐ6Õlð 0QÐ*r?   r²  z_ResponseWithUsageView | Noner¤  c                 ód  — | j                   syt        |j                  d«      |j                  d«      |«      ryd}|r$|j                  d«      x}r|j                  d«      }|�|dk  ry|j                  dd«      }|j                  dd«      }	| j                  |«      }
|
€*|}|dkD  r"||z  }| j                   j	                  ||¬	«       y|�| j                  |«      }|€|}n&|
|z
  }n |	�| j                  |	«      }|€|}n|
|z
  }n|}|dkD  r#||z  }| j                   j	                  ||¬	«       yy)
a2  Record Time Per Output Token (TPOT) metric.

        Calculated as: generation_time / completion_tokens
        - For streaming: uses end_time - completion_start_time (time to generate all tokens after first)
        - For non-streaming: uses end_time - api_call_start_time (total generation time)
        NrÇ  r  rL   rI   r   r³  r²  r™  )r‘  r   rš   r®  r   )rñ   r+  r²  r³  r¤  r¦  rI   rL   r³  r²  Úend_time_tsÚgeneration_time_secondsÚtime_per_output_token_secondsr¶  rµ  s                  r@   r¢  z2OpenTelemetry._record_time_per_output_token_metric¯  sŒ  € ð ×4Ò4Øä5Ø�J‰J�{Ó# V§Z¡ZÐ0@Ó%AÀ<ô
ð ð !ÐÙ l×&6Ñ&6°wÓ&?Ð?˜UÐ?Ø %§	¡	Ð*=Ó >ÐàÐ$Ð(9¸QÒ(>Øð (.§z¡zÐ2IÈ4Ó'PÐØ%+§Z¡ZÐ0EÀtÓ%LÐð "×/Ñ/°Ó9ˆØÐà&0Ð#Ø&¨Ò*Ø0GÐJ[Ñ0[Ð-Ø×5Ñ5×<Ñ<Ð=ZÐgsÐ<ÔtØà Ð,ð *.×);Ñ);Ð<QÓ)RÐØ"Ð*à*4Ñ'à*5Ð8KÑ*KÑ'Ø Ð,à'+×'9Ñ'9Ð:MÓ'NÐØ Ð(à*4Ñ'à*5Ð8IÑ*IÑ'ð '1Ð#à" QÒ&Ø,CÐFWÑ,WÐ)Ø×1Ñ1×8Ñ8Ð9VÐcoÐ8Õpð 'r?   c                 ó<  — | j                   sy|j                  dd«      }|€y|j                  d«      xs |}|€t        j                  «       }| j	                  |«      }| j	                  |«      }|�|€y||z
  }|dkD  r| j                   j                  ||¬«       yy)aÆ  Record Total Generation Time (response duration) metric.

        Measures pure LLM API generation time: end_time - api_call_start_time
        This excludes LiteLLM overhead and measures only the LLM provider's response time.
        Works for both streaming and non-streaming requests.

        Mirrors Prometheus's litellm_llm_api_latency_metric.
        Uses kwargs.get("end_time") with fallback to parameter for consistency with Prometheus.
        Nr²  r³  r   r™  )r’  rš   r	   rù  r®  r   )	rñ   r+  r³  r¦  r²  Ú	_end_timerµ  r¹  Úresponse_duration_secondss	            r@   r£  z.OpenTelemetry._record_response_duration_metricô  s·   € ð ×0Ò0Øà%+§Z¡ZÐ0EÀtÓ%LÐØÐ&Øð
 —J‘J˜zÓ*Ò6¨hˆ	ØÐÜ Ÿ™›ˆIð $(×#5Ñ#5Ð6IÓ#JÐØ!×/Ñ/°	Ó:ˆàÐ$¨Ð(;Øà+6Ð9JÑ+JÐ!à$ qÒ(Ø×-Ñ-×4Ñ4Ð5NÐ[gÐ4Õhð )r?   c                  óT   — ddl m}  	 ddlm} || fS # t        $ r ddlm} Y || fS w xY w)a  Resolve ``(LogRecord, SeverityNumber)`` across OTEL SDK versions.

        ``LogRecord`` moved out of ``opentelemetry.sdk._logs`` in OTEL >= 1.39.0
        (open-telemetry/opentelemetry-python#4676). Imports stay function-local
        because the SDK is an optional dependency.
        r   )ÚSeverityNumber)Ú	LogRecord)r«  rÀ  r¬  rÁ  rH  Ú!opentelemetry.sdk._logs._internal)rÀ  rÁ  s     r@   Ú_otel_log_typeszOpenTelemetry._otel_log_types  s?   € õ 	7ð	Ý9ð
 ˜.Ð(Ð(øô	 ò 	öð ˜.Ð(Ð(ð		ús   ˆ ’'¦'c                 óž  — | j                   j                  sy | j                  «       \  }}| j                  j	                  t
        «      }|j                  «       }|j                  d«      xs i j                  dd«      }| j                  r| j                  |||||¬«       y |j                  dg «      D ]ð  }	|	j                  dd«      }
d|d	œ}|
d
k(  r|	j                  d«      r|	d   |d<   | j                  «       }|r|	j                  d«      r|	d   |d<   |	j                  «       }|s|j                  dd «        || j                  t        j                  «       «      |j                   |j"                  |j$                  |j&                  d||¬«      }|j)                  |«       Œò t+        |j                  dg «      «      D �]  \  }}d|||j                  d«      dœ}|j                  di «      }| j                  «       }|r|j                  d«      r|d   |d<   ||j                  d«      d|j                  dd«      idœ}|r|j                  d«      r|d   |d   d<    || j                  t        j                  «       «      |j                   |j"                  |j$                  |j&                  d||¬«      }|j)                  |«       �Œ y )Nr  r–  r—  )r+  r²  rÆ   Úotel_loggerÚ
parent_ctxÚmessagesÚroleÚuserzgen_ai.content.prompt)Ú
event_namerƒ   ÚtoolrJ  Úcontentzgen_ai.promptÚINFO)r¬  Útrace_idÚspan_idÚtrace_flagsÚseverity_numberÚseverity_textÚbodyrœ   Úchoiceszgen_ai.content.completionÚfinish_reason)rÊ  rƒ   ÚindexrÕ  Úmessagezmessage.contentÚ	assistant)rÖ  rÕ  r×  )r  rÜ   rÃ  rª  Ú
get_loggerrX   Úget_span_contextrš   rj  Ú_emit_inference_details_eventrk  Úcopyr  rÖ  r	   rù  rÎ  rÏ  rÐ  rÍ  ÚemitÚ	enumerate)rñ   r+  r²  rÅ  ÚSdkLogRecordrÀ  rÅ  rÆ  rÆ   ÚmsgrÈ  r�  Úcapture_event_contentrÓ  Ú
log_recordÚidxÚchoiceÚbody_msgs                     r@   rb  z!OpenTelemetry._emit_semantic_logs/  sÁ  € Ø�{‰{×(Ò(Øð (,×';Ñ';Ó'=Ñ$ˆ�nð
 "×2Ñ2×=Ñ=Ô>QÓRˆà ×1Ñ1Ó3ˆ
Ø!Ÿ:™:Ð&6Ó7Ò=¸2×BÑBÐCXÐZcÓdˆà×3Ò3Ø×.Ñ.ØØ)Ø!Ø'Ø%ð /ô ð ð —:‘:˜j¨"Ó-ò 	)ˆCØ—7‘7˜6 6Ó*ˆDà5Ø!)ñˆEð �vŠ~ #§'¡'¨$¤-Ø! $™i��d‘Ø$(×$:Ñ$:Ó$<Ð!Ù$¨¯©°Ô);Ø),¨Y©��oÑ&à—8‘8“:ˆDÙ(Ø—‘˜ DÔ)á%ØŸ+™+¤h§l¡l£nÓ5Ø#×,Ñ,Ø"×*Ñ*Ø&×2Ñ2Ø .× 3Ñ 3Ø$ØØ ô	ˆJð ×Ñ˜ZÕ(ð5	)ô: % \×%5Ñ%5°iÀÓ%DÓEó 	)‰KˆC�à9Ø!)ØØ!'§¡¨OÓ!<ñ	ˆEð —z‘z )¨RÓ0ˆHØ$(×$:Ñ$:Ó$<Ð!Ù$¨¯©°iÔ)@Ø+3°IÑ+>�Ð'Ñ(àØ!'§¡¨OÓ!<Ø" H§L¡L°¸Ó$EÐFñˆDñ
 %¨¯©°iÔ)@Ø-5°iÑ-@��Y‘ 	Ñ*á%ØŸ+™+¤h§l¡l£nÓ5Ø#×,Ñ,Ø"×*Ñ*Ø&×2Ñ2Ø .× 3Ñ 3Ø$ØØ ô	ˆJð ×Ñ˜ZÖ(ñ;	)r?   c                 ó^   — ddl m} | �|j                  | «      S |�|j                  |«      S |S )u1  
        Return a valid OTEL context for guardrail child spans so they are
        never orphaned (Issue #5).  Priority:
          1. The litellm_request span that was just created
          2. The parent proxy-request span
          3. The original fallback context (may be None â€” last resort)
        r   rm  )rw  rn  rÉ  )rÅ  rò  r\  r  s       r@   r`  z(OpenTelemetry._resolve_guardrail_context�  s;   € õ 	2àÐØ×-Ñ-¨dÓ3Ð3ØÐ"Ø×-Ñ-¨kÓ:Ð:ØÐr?   c           
      ó   — |xs i }|j                  d«      }|€y|j                  d«      }|sy|D �cg c]  }t        |t        «      sŒ|‘Œ }}|sy| j                  |«      }|D �]á  }|j                  d«      }	|j                  d«      }
| j	                  |d|j                  d«      |	|j                  d«      «      sŒZt        j                  «       }|	�t        j                  |	«      }t        j                  «       }|
�t        j                  |
«      }|j                  d| j                  |«      |¬	«      }| j                  |t        j                  t        j                  j                  ¬
«       | j                  |d|j                  d«      ¬
«       | j                  |d|j                  d«      ¬
«       |j                  d«      }|�|j!                  dt#        |«      «       |j                  d«      }|�|j!                  dt#        |«      «       | j                  |d|j                  d«      ¬
«       |j                  d«      }|r|j!                  d|«       |j                  d«      }|r|j!                  dt#        |«      «       |j                  d«      }|�|j!                  dt#        |«      «       |j                  d«      }|�| j                  |d|¬
«       |j                  d«      }t        |t$        «      r| j                  |d|¬
«       | j'                  ||«       |j)                  | j                  |«      ¬«       �Œä yc c}w )zr
        Creates a span for Guardrail, if any guardrail information is present in standard_logging_object
        rï  Nr  r5   r³  Ú	guardrailÚguardrail_nameÚguardrail_moderh  rÄ  Úmasked_entity_countÚguardrail_responseÚguardrail_statusÚguardrail_actionÚviolation_categoriesÚguardrail_violation_categoriesÚguardrail_usageÚguardrail_costÚguardrail_cost_in_spendrÕ  )rš   r–   r—   r  rM  r	   rù  ÚfromtimestamprÈ  rÖ  rÌ  r   ÚOPENINFERENCE_SPAN_KINDr   Ú	GUARDRAILr“   Úset_attributer   rÏ   rp  rÙ  )rñ   r+  r7   rx  Úguardrail_information_dataÚinformationÚguardrail_information_listrk  r  Ústart_time_floatÚend_time_floatÚstart_time_datetimeÚend_time_datetimeÚguardrail_spanrë  rì  rî  rï  rñ  rò  ró  s                        r@   r  z$OpenTelemetry._create_guardrail_span¢  s”  € ð
 ’˜2ˆØIOÏÉÐTmÓInÐ Ø#Ð+Øà,D×,HÑ,HÐI`Ó,aÐ"á)Øð ,Fö-
Ø'ÌÐT_ÔaeÕIfŠKð-
Ð"ð -
ñ *Øà%)×%GÑ%GÈÓ%OˆØ%?ó l	HÐ!Ø4×8Ñ8¸ÓFÐØ2×6Ñ6°zÓBˆNð —?‘?ØØØ%×)Ñ)Ð*:Ó;Ø Ø%×)Ñ)Ð*:Ó;ôð ä"*§,¡,£.ÐØÐ+Ü&.×&<Ñ&<Ð=MÓ&NÐ#Ü (§¡£ÐØÐ)Ü$,×$:Ñ$:¸>Ó$JÐ!à(×3Ñ3Ø ØŸ;™;Ð':Ó;Øð 4ó ˆNð ×#Ñ#Ø#Ü"×:Ñ:Ü1×;Ñ;×AÑAð $ô ð ×#Ñ#Ø#Ø$Ø+×/Ñ/Ð0@ÓAð $ô ð ×#Ñ#Ø#Ø$Ø+×/Ñ/Ð0@ÓAð $ô ð #8×";Ñ";Ð<QÓ"RÐØ"Ð.Ø×,Ñ,Ð-BÄJÐObÓDcÔdà!6×!:Ñ!:Ð;OÓ!PÐØ!Ð-Ø×,Ñ,Ð-AÄ:ÐN`ÓCaÔbð ×#Ñ#Ø#Ø&Ø+×/Ñ/Ð0BÓCð $ô ð  5×8Ñ8Ð9KÓLÐÙØ×,Ñ,Ð-?ÐAQÔRð $9×#<Ñ#<Ð=SÓ#TÐ Ù#ð ×,Ñ,Ð-MÌzÐZnÓOoÔpð 4×7Ñ7Ð8IÓJˆOØÐ*Ø×,Ñ,Ð->Ä
È?Ó@[Ô\Ø2×6Ñ6Ð7GÓHˆNØÐ)Ø×'Ñ'Ø'Ø(Ø(ð (ô ð
 '<×&?Ñ&?Ð@YÓ&ZÐ#ÜÐ1´4Ô8Ø×'Ñ'Ø'Ø1Ø1ð (ô ð ×1Ñ1°.À&ÔIà×Ñ¨¯©Ð4EÓ(FÐÖGñYl	Hùò-
s   ³MÁ	Mc                 ó†  — ddl m}m} t        j                  d|| j
                  «       | j                  |d«      s+t        j                  d| j                  j                  «       y | j                  |«      \  }}| j
                  j                  rd }d }|d u xs t        d«      }	d }
|	rÕ| j                  |«      }| j                  |«      | j                  |«      |dœ}| j                  r| j                   j"                  |d<    |j$                  di |¤Ž}
|
j'                   ||j(                  «      «       | j+                  |
||«       | j-                  |
|¬	«       |
j/                  | j                  |«      ¬
«       nW|j1                  «       rG|j'                   ||j(                  «      «       | j+                  |||«       | j-                  ||¬	«       | j3                  |
||¬«      }| j5                  ||¬«       |�Ct7        |d«      r6|j8                  t:        k(  r"|j/                  | j                  |«      ¬
«       y y y y )Nr   rÐ  zPOpenTelemetry Logger: Failure HandlerLogging kwargs: %s, OTEL config settings=%sÚfailurez=OpenTelemetry: skipping duplicate failure span for handler=%srZ  rh  rD   rð  rÕ  r[  r  r4   r>   )ry  rÑ  rÒ  r   rÅ   r  rM  r0  r8   r  rà   r   r  ri  rÖ  rj  r  rÊ  rÈ  r×  rà  r_  rö  rÙ  rQ  r`  r  rÓ   r4   rY   )rñ   r+  r²  r5   r³  rÑ  rÒ  Ú_parent_contextrÁ  rd  rÅ  rk  rl  re  s                 r@   r¸  zOpenTelemetry._handle_failure'  s,  € ß:ä×ÑØ^ØØ�K‰Kô	
ð �‰˜v yÔ1Ü× Ñ ØOØ—‘×'Ñ'ôð à,0×,BÑ,BÀ6Ó,JÑ)ˆÐ)à�;‰;×1Ò1Ø#ÐØ"ˆOð
 -=ÀÐ,DÒ,xÌÐXwÓHxÐ"àˆÙ%à)-×)KÑ)KÈFÓ)SˆKà×+Ñ+¨FÓ3Ø"Ÿk™k¨*Ó5Ø*ñ4ˆKð
 ×7Ò7Ø&*§n¡n×&;Ñ&;�˜FÑ#Ø)�;×)Ñ)Ñ8¨KÑ8ˆDØ�O‰O™F :×#3Ñ#3Ó4Ô5Ø×Ñ  f¨lÔ;ð ×*Ñ*°¸VÐ*ÔDà�H‰H˜dŸk™k¨(Ó3ˆHÕ4ð  ×,Ñ,Ô.Ø ×+Ñ+©F°:×3CÑ3CÓ,DÔEØ×#Ñ#Ð$4°f¸lÔKØ×.Ñ.Ð4DÈVÐ.ÔTð  $×>Ñ>ØÐ#3À/ð  ?ó  
ˆð 	×#Ñ#¨6¸=Ð#ÔIð Ð(ÜÐ(¨&Ô1Ø ×%Ñ%Ô)HÒHà× Ñ ¨$¯+©+°hÓ*?Ð Õ@ð Ið 2ð )r?   c                 óè  — 	 ddl m} |j                  d«      }|�|j                  |«       |j                  d«      }|€y|j                  d«      }|€2|j                  d«      }|r| j	                  ||j
                  |¬«       y|j                  d	«      rJ| j	                  ||j                  |d	   ¬«       |d	   }|�"	 | j	                  |t        t        |«      ¬«       |j                  d
«      r!| j	                  ||j                  |d
   ¬«       |j                  d«      r!| j	                  ||j
                  |d   ¬«       |j                  d«      r!| j	                  ||j                  |d   ¬«       |j                  d«      r"| j	                  ||j                  |d   ¬«       yy# t        t        f$ r Y ŒÛw xY w# t        $ r)}	t        j                   dt#        |	«      «       Y d}	~	yd}	~	ww xY w)aQ  
        Record exception information on the span using OTEL standard methods.

        This extracts error information from StandardLoggingPayload and:
        1. Uses span.record_exception() for the actual exception object (OTEL standard)
        2. Sets structured error attributes from StandardLoggingPayloadErrorInformation
        r   )ÚErrorAttributesrî  Nrï  rì  Ú	error_strrÄ  rñ  Úerror_classÚerror_messageÚllm_providerÚ	tracebackz4OpenTelemetry: Error recording exception on span: %s)Ú*litellm.integrations._types.open_inferencer  rš   Úrecord_exceptionrÌ  ÚERROR_MESSAGEÚ
ERROR_CODErZ   r=   r˜   Ú	TypeErrorÚ
ERROR_TYPEÚERROR_LLM_PROVIDERÚERROR_STACK_TRACErÄ   r   rî  r;   )
rñ   rÅ  r+  r  rî  rx  rì  r  Ú_error_code_valrÇ   s
             r@   rö  z'OpenTelemetry._record_exception_on_spanv  s=  € ðR	eõð
  &Ÿz™z¨+Ó6ˆIð Ð$Ø×%Ñ% iÔ0ð NTÏZÉZÐXqÓMrÐ$à'Ð/Øð (@×'CÑ'CÐDWÓ'XÐà Ð(à#;×#?Ñ#?ÀÓ#L�	ÙØ×+Ñ+Ø!Ø+×9Ñ9Ø'ð ,ô ð
 ð !×$Ñ$ \Ô2Ø×'Ñ'ØØ'×2Ñ2Ø+¨LÑ9ð (ô ð *;¸<Ñ)H�Ø"Ð.ðØ×/Ñ/Ø!%Ü CÜ"% oÓ"6ð 0ô ð !×$Ñ$ ]Ô3Ø×'Ñ'ØØ'×2Ñ2Ø+¨MÑ:ð (ô ð !×$Ñ$ _Ô5Ø×'Ñ'ØØ'×5Ñ5Ø+¨OÑ<ð (ô ð !×$Ñ$ ^Ô4Ø×'Ñ'ØØ'×:Ñ:Ø+¨NÑ;ð (ô ð !×$Ñ$ [Ô1Ø×'Ñ'ØØ'×9Ñ9Ø+¨KÑ8ð (õ ð 2øô1 '¬	Ð2ò Ùðûô> ò 	eÜ×$Ñ$Ð%[Ô]`ÐabÓ]c×dÑdûð	eúsI   ‚=F? Á AF? Â9F? Â?!F* Ã CF? Æ*F<Æ9F? Æ;F<Æ<F? Æ?	G1ÇG,Ç,G1c           
      ó  — dd l }ddlm} |sy 	 t        |«      D ]µ  \  }}|j	                  d«      }|sŒ|j
                  j                  › d|› �}| j                  ||› d�|j	                  d«      ¬«       | j                  ||› d�|j	                  d	«      ¬«       | j                  ||› d
�|j                  |j	                  d«      «      ¬«       Œ· y # t        $ r)}	t        j                  dt        |	«      «       Y d }	~	y d }	~	ww xY w)Nr   ©r   Úfunctionú.z.namer4   rÄ  z.descriptionr‰  z.parametersÚ
parametersz1OpenTelemetry: Error setting tools attributes: %s)ÚjsonÚlitellm.proxy._typesr   rÞ  rš   ÚLLM_REQUEST_FUNCTIONSr“   rÌ  ÚdumpsrÄ   r   rÞ  r;   )
rñ   rÅ  Útoolsr  r   ÚirË  r  ÚprefixrÇ   s
             r@   Úset_tools_attributesz"OpenTelemetry.set_tools_attributesÒ  s  € Ûå7áØð	^Ü$ UÓ+ò ‘��4ØŸ8™8 JÓ/�ÙØà*×@Ñ@×FÑFÐGÀqÈÈÐL�Ø×'Ñ'ØØ!˜( %Ð(Ø"Ÿ,™, vÓ.ð (ô ð
 ×'Ñ'ØØ!˜( ,Ð/Ø"Ÿ,™, }Ó5ð (ô ð
 ×'Ñ'ØØ!˜( +Ð.ØŸ*™* X§\¡\°,Ó%?Ó@ð (õ ñ!øô* ò 	^Ü× Ñ Ð!TÔVYÐZ[ÓV\×]Ñ]ûð	^ús   �CC Ã	DÃD Ä Dc                 ó‚   — |€yt        |t        t        t        t        f«      r|S 	 t        |«      S # t
        $ r Y yw xY w©z×
        Casts the value to a primitive OTEL type if it is not already a primitive type.

        OTEL supports - str, bool, int, float

        If it's not a primitive type, then it's converted to a string
        Ú ©r–   r;   rÏ   r=   rÀ   rÄ   ©rñ   r“   s     r@   Úcast_as_primitive_value_typez*OpenTelemetry.cast_as_primitive_value_typeó  óE   € ð ˆ=ØÜ�eœc¤4¬¬eÐ4Ô5ØˆLð	Ü�u“:ÐøÜò 	Ùð	úó   §
2 ²	>½>Ú
tool_callsc           	      ó  — ddl m} i }t        | «      D ]s  \  }}|j                  d«      }|sŒt        j
                  j                  «       }|D ]7  }|j                  |«      }|sŒ|||j                  j                  › d|› d|› �<   Œ9 Œu |S )Nr   r  r  r  z.function_call.)	r  r   rÞ  rš   r#   r<   ÚkeysÚLLM_COMPLETIONSr“   )	r(  r   Úkv_pairsrã  Ú	tool_callÚ	_functionr*  rŠ   Ú_values	            r@   Ú_tool_calls_kv_pairz!OpenTelemetry._tool_calls_kv_pair	  s¡   € õ 	8à-/ˆÜ'¨
Ó3ò 		k‰NˆC�Ø!Ÿ™ jÓ1ˆIÙØä×+Ñ+×0Ñ0Ó2ˆDØò k�Ø"Ÿ™ sÓ+�ÚØdj�H × >Ñ >× DÑ DÐEÀQÀsÀeÈ?Ð[^ÐZ_Ð`Òañkð		kð ˆr?   c           
      óà  — 	 | j                   dk(  rddlm}  |«       j                  |||«       y | j                   dk(  rddlm} |j                  |||«       y | j                   dk(  rddlm}  ||||«       y ddl	m
} |j                  d	i «      }|j                  d
i «      xs i }	|j                  d«      }
|
€t        d«      ‚|
d   }|j                  «       D ]  \  }}| j                  |d|› �|¬«       Œ t        |
dd «      xs |
xs i j                  di «      }|r| j                  |dt!        |«      ¬«       | j#                  ||
|	¬«       |
j                  d«      }|r2|j                  «       D ]  \  }}|€Œ	| j                  |d|› �|¬«       Œ! |j                  d«      r7| j                  ||j$                  j&                  |j                  d«      ¬«       | j                  ||j(                  j&                  |
d   ¬«       |	j                  dd«      }| j*                  r| j                  |d|¬«       n(| j                  ||j,                  j&                  |¬«       |j                  d«      r7| j                  ||j.                  j&                  |j                  d«      ¬«       |j                  d«      r7| j                  ||j0                  j&                  |j                  d«      ¬«       |j                  d«      r7| j                  ||j2                  j&                  |j                  d«      ¬«       | j*                  r%| j5                  ||«       | j7                  ||
«       nA| j                  ||j8                  j&                  t;        |j                  dd«      «      ¬«       |j                  d«      r7| j                  ||j<                  j&                  |j                  d«      ¬«       |r|j                  d«      nd xs |
j                  d«      }|r| j                  |d |¬«       |
j                  d!«      }|r| j                  |d"|¬«       |rH|j                  d«      r7| j                  ||j>                  j&                  |j                  d«      ¬«       | jA                  ||
¬#«       |r-tC        |j                  d«      |	|«      s|j                  d$«      nd }|r¥| j                  ||jD                  j&                  |j                  d%«      ¬«       | j                  ||jF                  j&                  |j                  d&«      ¬«       | j                  ||jH                  j&                  |j                  d'«      ¬«       | jK                  «       sy |j                  d(«      r|d(   }| jM                  ||«       |j                  d)«      rQ| jO                  |j                  d)«      «      }| j                  ||jP                  j&                  t!        |«      ¬«       |j                  d*«      �|j                  d*«      n2|j                  d+«      �|j                  d+«      n|j                  d,«      }|r{tS        |t:        «      r)| j                  ||jT                  j&                  |¬«       nB| jO                  |«      }| j                  ||jT                  j&                  t!        |«      ¬«       | j*                  r| jW                  |«      }n+|
j                  d«      d-k(  rd.n|
j                  d«      xs d.}| j                  ||jX                  j&                  |¬«       |
j                  d/«      r7| j                  ||jZ                  j&                  |
j                  d/«      ¬«       |��á|j                  d0«      �ru| j]                  |j                  d0«      «      }| j                  ||j^                  j&                  t!        |«      ¬«       g }ta        |j                  d0«      «      D ]7  \  }}|j                  d1«      sŒ|jc                  |j                  d1«      «       Œ9 |r1| j                  ||jd                  j&                  t!        |«      ¬«       ta        |j                  d0«      «      D ]}  \  }}|j                  d1«      sŒ|j                  d2«      }|j                  d3«      }|sŒ=tf        ji                  |«      }|j                  «       D ]  \  }}| j                  |||¬«       Œ Œ y |j                  d4«      �rG|j                  d4«      } | jk                  | «      }!|!r1| j                  ||j^                  j&                  t!        |!«      ¬«       g }| D ]a  }"| jm                  |"«      }#|#sŒ|#j                  d5«      d6k(  sŒ,|jc                  d7|#j                  d8d9«      |#j                  d:d9«      d;œi«       Œc |rAtf        ji                  |«      }|j                  «       D ]  \  }}| j                  |||¬«       Œ |j                  d<«      }$|$r3| j                  ||jd                  j&                  t!        |$g«      ¬«       y y y y # tn        $ rI}%| jq                  | j                   xs d=¬>«       ts        jt                  d?t;        |%«      «       Y d }%~%y d }%~%ww xY w)@NÚ	langtracer   )ÚLangtraceAttributesrY  )ÚLangfuseOtelLoggerÚ
weave_otel)Úset_weave_otel_attributesr  r°  r  rï  z+standard_logging_object not found in kwargsr  rˆ   rÄ  r†   )rÅ  rx  r  Úcost_breakdownzgen_ai.cost.r~  rÇ  r–  r—  r‚   Ú
max_tokensÚtemperatureÚtop_pr±  FrÉ  rJ  zgen_ai.response.idÚlitellm_call_idzlitellm.call_id)rÅ  rx  rL   Útotal_tokensrI   rœ  r  rÇ  Úsystem_instructionsÚinstructionsÚsystemÚ
completionr˜  Ú
request_idrÔ  rÕ  r×  r(  r›  r™   Úfunction_callr  r4   r"  Ú	arguments)r4   rC  Ústatusrw  )r	  z0OpenTelemetry logging error in set_attributes %s);r	  Úlitellm.integrations.langtracer3  Úset_langtrace_attributesÚ+litellm.integrations.langfuse.langfuse_otelr4  Úset_langfuse_otel_attributesÚ%litellm.integrations.weave.weave_otelr6  r  r   rš   r˜   r¿   rÌ  rM  r   r„  ÚLLM_REQUEST_MODELr“   ÚLLM_REQUEST_TYPErj  Ú
LLM_SYSTEMÚLLM_REQUEST_MAX_TOKENSÚLLM_REQUEST_TEMPERATUREÚLLM_REQUEST_TOP_PÚ_set_semconv_request_attributesÚ#_set_semconv_cache_token_attributesÚLLM_IS_STREAMINGr;   ÚLLM_USERÚLLM_RESPONSE_MODELrˆ  r   ÚGEN_AI_USAGE_TOTAL_TOKENSÚGEN_AI_USAGE_OUTPUT_TOKENSÚGEN_AI_USAGE_INPUT_TOKENSri  r  Ú0_transform_messages_to_otel_semantic_conventionsÚGEN_AI_INPUT_MESSAGESr–   ÚGEN_AI_SYSTEM_INSTRUCTIONSrŸ  ÚGEN_AI_OPERATION_NAMEÚGEN_AI_REQUEST_IDÚ/_transform_choices_to_otel_semantic_conventionsÚGEN_AI_OUTPUT_MESSAGESrÞ  rL  ÚGEN_AI_RESPONSE_FINISH_REASONSr  r0  Ú'_transform_responses_api_output_to_otelÚ_to_dictrÄ   Úhandle_callback_failurer   rî  )&rñ   rÅ  r+  r²  r3  r4  r6  r   r°  r  rx  r  rŠ   r“   r†   r7  rO  Úresponse_idr;  rL   r  Útransformed_messagesr=  Útransformed_system_instructionsÚoperation_nameÚtransformed_choicesÚfinish_reasonsrã  rä  r×  r(  r,  Úoutput_itemsÚoutput_messagesÚout_itemÚitem_drD  rÇ   s&                                         r@   r_  zOpenTelemetry.set_attributes	  s"  € ði	aØ×!Ñ! [Ò0ÝNá#Ó%×>Ñ>¸tÀVÈ\ÔZØØ×#Ñ# Ò6õð #×?Ñ?ÀÀfÈlÔ[ØØ×#Ñ# |Ò3õñ *¨$°¸ÔEØÝ;à%+§Z¡ZÐ0AÀ2Ó%FˆOØ$*§J¡JÐ/?ÀÓ$DÒ$JÈˆNØMSÏZÉZÐXqÓMrÐ$Ø'Ð/Ü Ð!NÓOÐOð 7°zÑBˆHØ&Ÿn™nÓ.ò W‘
��UØ×'Ñ'¨T¸À3À%Ð7HÐPUÐ'ÕVðWô $+Ð+CÀ_ÐVZÓ#[ò $'Ø(Ò.¨Bß‰c�/ 2Ó&ð ñ Ø×'Ñ'ØØ'Ü$ ]Ó3ð (ô ð ×3Ñ3ØØ)AØ-ð 4ô ð ;S×:VÑ:VÐWgÓ:hˆNÙØ"0×"6Ñ"6Ó"8ò ‘J�C˜ØÑ(Ø×/Ñ/Ø!%Ø".¨s¨eÐ 4Ø"'ð 0õ ðð �z‰z˜'Ô"Ø×'Ñ'ØØ&×8Ñ8×>Ñ>Ø Ÿ*™* WÓ-ð (ô ð ×#Ñ#ØØ"×3Ñ3×9Ñ9Ø.¨{Ñ;ð $ô ð $2×#5Ñ#5Ð6KÈYÓ#WˆMð ×7Ò7Ø×'Ñ'ØØ.Ø'ð (õ ð ×'Ñ'ØØ&×1Ñ1×7Ñ7Ø'ð (ô ð ×"Ñ" <Ô0Ø×'Ñ'ØØ&×=Ñ=×CÑCØ)×-Ñ-¨lÓ;ð (ô ð ×"Ñ" =Ô1Ø×'Ñ'ØØ&×>Ñ>×DÑDØ)×-Ñ-¨mÓ<ð (ô ð ×"Ñ" 7Ô+Ø×'Ñ'ØØ&×8Ñ8×>Ñ>Ø)×-Ñ-¨gÓ6ð (ô ð ×7Ò7ð ×4Ñ4°T¸?ÔKØ×8Ñ8¸Ð?WÕXà×'Ñ'ØØ&×7Ñ7×=Ñ=Ü˜o×1Ñ1°(¸EÓBÓCð (ô ð ×"Ñ" 6Ô*Ø×'Ñ'ØØ&×/Ñ/×5Ñ5Ø)×-Ñ-¨fÓ5ð (ô ñ 6B˜<×+Ñ+¨DÔ1ÀtÒrÐPh×PlÑPlÐmqÓPrˆKÙØ×'Ñ'ØØ,Ø%ð (ô ð &>×%AÑ%AÐBSÓ%TˆOÙØ×'Ñ'ØØ)Ø)ð (ô ñ  × 0Ñ 0°Ô 9Ø×'Ñ'ØØ&×9Ñ9×?Ñ?Ø&×*Ñ*¨7Ó3ð (ô ð ×-Ñ-°4ÐRjÐ-Ôkñ  ÜBØ—J‘J˜{Ó+¨^¸\ôð × Ñ  Ô)ð
 ð ñ Ø×'Ñ'ØØ&×@Ñ@×FÑFØŸ)™) NÓ3ð (ô ð ×'Ñ'ØØ&×AÑA×GÑGØŸ)™)Ð$7Ó8ð (ô ð ×'Ñ'ØØ&×@Ñ@×FÑFØŸ)™) OÓ4ð (ô ð ×(Ñ(Ô*Øà×"Ñ" 7Ô+Ø.¨wÑ7�Ø×)Ñ)¨$°Ô6à�z‰z˜*Ô%Ø'+×'\Ñ'\Ð]c×]gÑ]gÐhrÓ]sÓ'tÐ$Ø×'Ñ'ØØ&×<Ñ<×BÑBÜ$Ð%9Ó:ð (ô ð —:‘:Ð3Ó4Ð@ð —
‘
Ð0Ô1à4:·J±J¸~Ó4NÐ4Z�f—j‘j Ô0Ð`f×`jÑ`jÐksÓ`tð  ñ
 #ÜÐ1´3Ô7à×+Ñ+Ø!Ø*×EÑE×KÑKØ1ð ,õ ð >B×=rÑ=rØ+ó>Ð3ð ×+Ñ+Ø!Ø*×EÑE×KÑKÜ(Ð)HÓIð ,ô ð ×7Ò7Ø!%×!<Ñ!<¸VÓ!D‘ð 0×3Ñ3°KÓ@ÀLÒPñ à1×5Ñ5°kÓBÒLÀfð ð
 ×#Ñ#ØØ"×8Ñ8×>Ñ>Ø$ð $ô ð (×+Ñ+¨LÔ9Ø×'Ñ'ØØ&×8Ñ8×>Ñ>Ø2×6Ñ6°|ÓDð (ô ð Ñ'Ø×#Ñ# IÕ.Ø15×1eÑ1eØ$×(Ñ(¨Ó3ó2Ð'ð ×+Ñ+Ø!Ø*×AÑA×GÑGÜ(Ð)<Ó=ð ,ô ð -/�NÜ'0°×1AÑ1AÀ)Ó1LÓ'Mò O™˜˜VØ!Ÿ:™: oÕ6Ø*×1Ñ1°&·*±*¸_Ó2MÕNðOñ &Ø×/Ñ/Ø!%Ø .× MÑ M× SÑ SÜ",¨^Ó"<ð 0ô ô (1°×1AÑ1AÀ)Ó1LÓ'Mò &™˜˜VØ!Ÿ:™: oÕ6Ø&,§j¡j°Ó&;˜GØ)0¯©°\Ó)B˜JÚ)Ü+8×+LÑ+LÈZÓ+X Ø2:·.±.Ó2Bò !&¡J C¨Ø$(×$;Ñ$;Ø-1Ø,/Ø.3ð %<õ %&ñ!&ñ&ð "×%Ñ% hÕ/ð
 +7×*:Ñ*:¸8Ó*D�LØ-1×-YÑ-YÐZfÓ-g�OÙ&Ø×/Ñ/Ø!%Ø .× EÑ E× KÑ KÜ",¨_Ó"=ð 0ô ð "$�JØ$0ò 
˜Ø!%§¡¨xÓ!8˜Ú! f§j¡j°Ó&8¸OÓ&KØ&×-Ñ-à$.Ø06·
±
¸6À2Ó0FØ5;·Z±ZÀÈRÓ5Pñ1&ð!"õð
ñ "Ü#0×#DÑ#DÀZÓ#P˜Ø*2¯.©.Ó*:ò ™J˜C Ø ×3Ñ3Ø%)Ø$'Ø&+ð 4õ ðð %1×$4Ñ$4°XÓ$>�FÙØ×/Ñ/Ø!%Ø .× MÑ M× SÑ SÜ",¨f¨XÓ"6ð 0õ ð ðU 0ðI (øôj ò 	aØ×(Ñ(°t×7IÑ7IÒ7\È_Ð(Ô]Ü×$Ñ$Ð%WÔY\Ð]^ÓY_×`Ñ`ûð	aús_   ‚-j °(j Áj Á9Dj Å=P#j Ö!J.j áBj ã$j ã<Aj å Bj çj çC j ê	k-ê$?k(ë(k-c                 ó‚   — |€yt        |t        t        t        t        f«      r|S 	 t        |«      S # t
        $ r Y yw xY wr!  r#  r$  s     r@   Ú_cast_as_primitive_value_typez+OpenTelemetry._cast_as_primitive_value_type„
  r&  r'  rŠ   c                 óJ   — | j                  |«      }|j                  ||«       y)z_
        Safely sets an attribute on the span, ensuring the value is a primitive type.
        N)rn  r÷  )rñ   rÅ  rŠ   r“   Úprimitive_values        r@   rÌ  z OpenTelemetry.safe_set_attribute•
  s$   € ð "&×!CÑ!CÀEÓ!JˆØ×Ñ˜3 Õ0r?   rÇ  c                 ó  — t        |t        «      r
dd|dœgdœgS g }|D ]Ý  }|j                  dd«      }|j                  dd«      }g }t        |t        «      r|j                  d|dœ«       nVt        |t        «      rF|D ]A  }t        |t
        «      r|j                  |«       Œ%|j                  dt        |«      dœ«       ŒC ||dœ}d	|v r|d	   |d	<   d
|v r|d
   |d
<   d|v r|d   |d<   |j                  |«       Œß |S )z¬
        Transforms LiteLLM/OpenAI style messages into OTEL GenAI 1.38 compliant format.
        OTEL expects a 'parts' array instead of a single 'content' string.
        r?  Útext©r™   rÌ  ©rÈ  ÚpartsrÈ  rÉ  rÌ  r"  rJ  r(  Útool_call_id)r–   r;   rš   rL  r’   r—   )	rñ   rÇ  Útransformedrà  rÈ  rÌ  ru  rI  Útransformed_msgs	            r@   rX  z>OpenTelemetry._transform_messages_to_otel_semantic_conventionsœ
  s.  € ô
 �h¤Ô$ð %Ø'-¸(ÑCÐDñðð ð  ˆØò 	0ˆCØ—7‘7˜6 6Ó*ˆDØ—g‘g˜i¨Ó,ˆGØˆEä˜'¤3Ô'Ø—‘ f¸ÑAÕBÜ˜G¤TÔ*à#ò M�DÜ! $¬Ô-ØŸ™ TÕ*àŸ™¨fÄÀTÃÑ%KÕLð	Mð (,°eÑ<ˆOØ�s‰{Ø(+¨D©	� Ñ%Ø˜sÑ"Ø03°LÑ0A� Ñ-Ø Ñ$Ø25°nÑ2E� Ñ/Ø×Ñ˜Õ/ð-	0ð0 Ðr?   rÔ  c                 ó¾   — g }|D ]U  }|j                  d«      xs i }|j                  d«      }| j                  |g«      d   }|r||d<   |j                  |«       ŒW |S )z_
        Transforms choices into OTEL GenAI 1.38 compliant format for output.messages.
        r×  rÕ  r   )rš   rX  rL  )rñ   rÔ  rw  rä  r×  rÕ  rx  s          r@   r]  z=OpenTelemetry._transform_choices_to_otel_semantic_conventionsÅ
  sv   € ð  ˆØò 	0ˆFØ—j‘j Ó+Ò1¨rˆGØ"ŸJ™J Ó7ˆMà"×SÑSÐU\ÐT]Ó^Ð_`ÑaˆOÙØ3@� Ñ0à×Ñ˜Õ/ð	0ð Ðr?   c                 ó|   — t        | t        «      r| S t        | d«      r| S t        | d«      r| j                  «       S y)u'  Normalize an object to a plain dict.

        Handles three forms that appear in practice:

        1. Plain ``dict`` â€” returned as-is.
        2. LiteLLM's ``BaseLiteLLMOpenAIResponseObject`` â€” exposes a
           ``.get()`` method that delegates to ``__dict__``.
        3. Raw Pydantic v2 models from the ``openai`` SDK (e.g.
           ``ResponseOutputMessage``, ``ResponseOutputText``) â€” these do
           **not** have ``.get()`` but do have ``.model_dump()``.

        Returns ``None`` for anything else so callers can skip it.
        rš   Ú
model_dumpN)r–   r—   rÓ   r{  )Úobjs    r@   ra  zOpenTelemetry._to_dictÕ
  s<   € ô �cœ4Ô ØˆJÜ�3˜ÔàˆJÜ�3˜Ô%à—>‘>Ó#Ð#Ør?   r›  c                 óh  — g }|D �])  }| j                  |«      }|€Œ|j                  d«      dk(  r•|j                  dd«      }g }|j                  dg «      D ]T  }| j                  |«      }|€Œ|j                  d«      dk(  sŒ,|j                  dd«      }	|	sŒA|j                  d|	d	œ«       ŒV |sŒ¬|j                  ||d
œ«       ŒÁ|j                  d«      dk(  sŒÖd|j                  dd«      |j                  dd«      dœ}
|j                  d«      r|d   |
d<   |j                  d|
gd
œ«       �Œ, |S )aä  
        Transform Responses API output items into OTEL GenAI 1.38 format.

        The Responses API returns output as a list of items, each with a
        ``type`` field.  Message items (``type="message"``) contain a
        ``content`` list of ``OutputText`` objects with ``type="output_text"``
        and ``text`` fields.

        Items may be plain dicts, LiteLLM wrapper objects (with ``.get()``),
        or raw Pydantic v2 models from the ``openai`` SDK (with
        ``.model_dump()``).  We normalize each item to a dict via
        ``_to_dict`` before processing.

        This method converts them to the same ``{"role": ..., "parts": [...]}``
        format used by ``_transform_choices_to_otel_semantic_conventions``.
        r™   r×  rÈ  rØ  rÌ  Úoutput_textrr  r"  rs  rt  rB  r-  r4   rC  )r™   r4   rC  Úcall_idrJ  )ra  rš   rL  )rñ   r›  rw  Úraw_itemr¬   rÈ  ru  Úraw_contentrÌ  rr  rI  s              r@   r`  z5OpenTelemetry._transform_responses_api_output_to_otelî
  sF  € ð"  ˆØó 	KˆHØ—=‘= Ó*ˆDØˆ|ØØ�x‰x˜Ó 9Ò,Ø—x‘x ¨Ó4�Ø�Ø#'§8¡8¨I°rÓ#:ò L�KØ"Ÿm™m¨KÓ8�GØ�Ø Ø—{‘{ 6Ó*¨mÓ;Ø&Ÿ{™{¨6°2Ó6˜ÚØ!ŸL™L°&ÀTÑ)JÕKðLò Ø×&Ñ&°¸uÑ'EÕFØ—‘˜&Ó! _Ó4ð (Ø ŸH™H V¨RÓ0Ø!%§¡¨+°rÓ!:ñ�ð
 —8‘8˜IÔ&Ø!% i¡�D˜‘JØ×"Ñ"¨KÀ4À&Ñ#IÖJð5	Kð6 Ðr?   c                 óö  — 	 |j                  di «      xs i }|j                  dd«      }|j                  d«      }|j                  di «      xs i }|j                  d«      }|rBt        |t        «      r2|j                  «       D ]  \  }	}
| j	                  |d|› d|	› �|
¬	«       Œ! |rZt        |t
        «      rId
d l}	 |j                  |«      }|j                  «       D ]  \  }	}
| j	                  |d|› d|	› �|
¬	«       Œ! y y y # |j                  $ r1 t        j                  d|«       | j	                  |d|› d�|¬	«       Y y w xY w# t        $ r)}t        j                  dt        |«      «       Y d }~y d }~ww xY w)Nr  r–  r—  Úoriginal_responseÚadditional_argsÚcomplete_input_dictzllm.r  rÄ  r   zglitellm.integrations.opentelemetry.py::set_raw_request_attributes() - raw_response not json string - %sz.stringified_raw_responsez<OpenTelemetry logging error in set_raw_request_attributes %s)rš   r–   r—   r¿   rÌ  r;   r  ÚloadsÚJSONDecodeErrorr   rÅ   rÄ   rî  )rñ   rÅ  r+  r²  r  r–  Ú_raw_responseÚ_additional_argsr…  Úparamrª  r  Ú_parsedrÇ   s                 r@   ro  z(OpenTelemetry.set_raw_request_attributes  s¸  € ð6	ð
 %+§J¡JÐ/?ÀÓ$DÒ$JÈˆNØ)7×);Ñ);Ð<QÐS\Ó)]Ðà"ŸJ™JÐ':Ó;ˆMØ&,§j¡jÐ1BÀBÓ&GÒ&MÈ2ÐØ)9×)=Ñ)=Ð>SÓ)TÐñ #¤zÐ2EÄtÔ'LØ"5×";Ñ";Ó"=ò ‘J�E˜3Ø×+Ñ+Ø!Ø"Ð#6Ð"7°q¸¸Ð@Ø!ð ,õ ðñ ¤¨M¼3Ô!?ãðØ;?¿:¹:ÀmÓ;T�GØ&-§m¡m£oò ™
˜˜sØ×/Ñ/Ø!%Ø"&Ð':Ð&;¸1¸U¸GÐ DØ"%ð 0õ ñð "@ˆ}øð ×+Ñ+ò 
Ü"×(Ñ(ð BØ%ôð
 ×+Ñ+Ø!Ø"Ð#6Ð"7Ð7PÐQØ+ð ,ö ð
ûô ò 	Ü×$Ñ$ØNÜ�A“÷ñ ûð	ús7   ‚B:E Â=AD Ä=EÅ E ÅEÅE Å	E8ÅE3Å3E8c                 óâ   — |€.t        t        j                  «       j                  «       dz  «      S t	        |t         t
        f«      rt        |dz  «      S t        |j                  «       dz  «      S )NrÓ  )r=   r	   rù  r¬  r–   rÀ   )rñ   Údts     r@   rÖ  zOpenTelemetry._to_nsV  sX   € Øˆ:Ü”x—|‘|“~×/Ñ/Ó1°CÑ7Ó8Ð8Ü�bœ3¤˜,Ô'Ü�r˜C‘x“=Ð Ü�2—<‘<“> CÑ'Ó(Ð(r?   c                 óô   — |j                  di «      }|j                  d«      xs i }|j                  d«      }|r|S | j                  r+|j                  d«      xs d}| j                  |«      › d|› �S t        S )Nr  r  rn  r~  r¦   ú )rš   rj  rŸ  rf   )rñ   r+  r  r  rn  r~  s         r@   ri  zOpenTelemetry._get_span_name]  s   € Ø &§
¡
Ð+;¸RÓ @ˆØ(×,Ñ,¨ZÓ8Ò>¸BˆØ!)§¡Ð.?Ó!@ˆáØ"Ð"à×3Ò3Ø!Ÿ:™: gÓ.Ò;°)ˆEØ×1Ñ1°&Ó9Ð:¸!¸E¸7ÐCÐCä(Ð(r?   c                 ó|   — |€y |j                  dd «      }|€y ddlm}  |«       }d|i}|j                  |¬«      }|S )NÚtraceparentr   ©ÚTraceContextTextMapPropagator©Úcarrier)rš   Ú,opentelemetry.trace.propagation.tracecontextr“  Úextract)rñ   rÚ   Ú_traceparentr“  Ú
propagatorr•  r  s          r@   Úget_traceparent_from_headerz)OpenTelemetry.get_traceparent_from_headerk  sU   € Øˆ?ØØ%Ÿk™k¨-¸Ó>ˆØÐØõ	
ñ :Ó;ˆ
Ø'¨Ð6ˆØ!+×!3Ñ!3¸GÐ!3Ó!DˆàÐr?   r  c           	      óÜ  — ddl m}m} ddlm} |j                  di «      xs i }|j                  di «      xs i }|j                  di «      xs i }|j                  dd «      }	|j                  di «      xs i }
|
j                  d	d «      }|€(|j                  d
i «      xs i }|j                  d	d «      }|�(t        j                  d«       |j                  |«      d fS |	�2t        j                  d«       d|	i} |«       j                  |¬«      d fS 	 |j                  «       }|�}|j                  «       }|j                  rat        j                  d|t        |j                  d«      t        |j                  d«      |j!                  «       «       |j#                  «       |fS t        j                  d«       y# t$        $ r)}t        j                  dt'        |«      «       Y d }~ŒCd }~ww xY w)Nr   )r7   rn  r’  r  Úproxy_server_requestrÚ   r‘  r  rO  rP  z7OpenTelemetry: Using explicit parent span from metadataz?OpenTelemetry: Using traceparent header for context propagationr”  zcOpenTelemetry: Using active span from global context: %s (trace_id=%s, span_id=%s, is_recording=%s)Ú032xÚ016xz-OpenTelemetry: Error getting current span: %sz:OpenTelemetry: No parent context found, creating root spanrž   )rw  r7   rn  r–  r“  rš   r   rÅ   rÉ  r—  Úget_current_spanrÚ  Úis_validÚformatrÎ  rÏ  rQ  Úget_currentrÄ   r;   )rñ   r+  r  r7   rn  r“  r  rœ  rÚ   r‘  rK  rÁ  rT  r•  Úcurrent_spanÚspan_contextrÇ   s                    r@   r  zOpenTelemetry._get_span_context|  sþ  € ß0õ	
ð !'§
¡
Ð+;¸RÓ @Ò FÀBˆØ&4×&8Ñ&8Ð9OÐQSÓ&TÒ&ZÐXZÐØ-×1Ñ1°)¸RÓ@ÒFÀBˆØ$Ÿ[™[¨¸Ó=ˆØ)×-Ñ-¨j¸"Ó=ÒCÀˆ	Ø$Ÿ=™=Ð)CÀTÓJÐð
 Ð#Ø'5×'9Ñ'9Ð:LÈbÓ'QÒ'WÐUWÐØ0×4Ñ4Ð5OÐQUÓVÐð Ð'Ü× Ñ Ð!ZÔ[Ø×,Ñ,Ð-=Ó>ÀÐDÐDð Ð"Ü× Ñ Ð!bÔcØ+¨[Ð9ˆGá-Ó/×7Ñ7ÀÐ7ÓHØðð ð	ZØ"'×"8Ñ"8Ó":ˆLØÐ'Ø&2×&CÑ&CÓ&E�Ø×(Ò(Ü"×(Ñ(Ø}Ø$Ü˜|×4Ñ4°fÓ=Ü˜|×3Ñ3°VÓ<Ø$×1Ñ1Ó3ôð #×.Ñ.Ó0°,Ð>Ð>ô
 	×ÑÐYÔZØøô ò 	ZÜ× Ñ Ð!PÔRUÐVWÓRX×YÑYûð	Zús   ÄBF9 Æ9	G+ÇG&Ç&G+r:  c           
      ó�  — ddl m}m}m}m} |r|j
                  n| j                  }|r|j                  n| j                  }|r|j                  n| j                  }	t        j                  d||t        t        |	«      «      «       t        j!                  |xs |	¬«      }
|r)t        j                  dt        t        |
«      «      «       n.|rt        j                  d|«       nt        j                  d«       t#        |d«      r(t        j                  d	|«        |t%        ||«      «      S |d
k(  r#t        j                  d|«        | |«       «      S |dk(  s
|dk(  s|dk(  r?	 ddlm} t        j                  d|«       | j-                  |d«      } | |||
¬«      «      S |dk(  s|dk(  r?	 ddlm} t        j                  d|«       | j-                  |d«      } | |||
¬«      «      S t        j                  d|«        | |«       «      S # t*        $ r}t+        d«      |‚d }~ww xY w# t*        $ r}t+        d«      |‚d }~ww xY w)Nr   )ÚBatchSpanProcessorÚConsoleSpanExporterÚSimpleSpanProcessorr*   zXOpenTelemetry Logger, initializing span processor 
exporter: %s
endpoint: %s
headers: %s©rÚ   z=[OTEL DEBUG] Creating span processor with DYNAMIC headers: %szF[OTEL DEBUG] Creating span processor with DYNAMIC config, endpoint: %sz8[OTEL DEBUG] Creating span processor with GLOBAL headersrÒ   zDOpenTelemetry: intiializing SpanExporter. Value of OTEL_EXPORTER: %srØ   zHOpenTelemetry: intiializing console exporter. Value of OTEL_EXPORTER: %srç   úhttp/protobufú	http/json)ÚOTLPSpanExporterzmOpenTelemetry OTLP HTTP exporter is not available. Install `opentelemetry-exporter-otlp` to enable OTLP HTTP.zEOpenTelemetry: intiializing http exporter. Value of OTEL_EXPORTER: %sÚtraces©rÙ   rÚ   Ú	otlp_grpcÚgrpcz{OpenTelemetry OTLP gRPC exporter is not available. Install `opentelemetry-exporter-otlp` and `grpcio` (or `litellm[grpc]`).zEOpenTelemetry: intiializing grpc exporter. Value of OTEL_EXPORTER: %s)Úopentelemetry.sdk.trace.exportr¦  r§  r¨  r*   rÐ   rö   rÙ   rø   rÚ   rú   r   rÅ   r   r;   r  r  rÓ   r   Ú5opentelemetry.exporter.otlp.proto.http.trace_exporterr¬  rH  Ú_normalize_otel_endpointÚ5opentelemetry.exporter.otlp.proto.grpc.trace_exporter)rñ   r  r:  r¦  r§  r¨  r*   Úotel_exporterÚotel_endpointÚotel_headersÚ_split_otel_headersÚOTLPSpanExporterHTTPÚexcÚnormalized_endpointÚOTLPSpanExporterGRPCs                  r@   rt  z!OpenTelemetry._get_span_processor³  s|  € ÷
	
ó 	
ñ <K˜×7Ò7ÐPT×PbÑPbˆÙ;J˜×7Ò7ÐPT×PbÑPbˆÙ9H˜o×5Ò5Èd×N_ÑN_ˆä×ÑØiØØÜœ#˜lÓ+Ó,ô		
ô &3×%JÑ%JÐSbÒSrÐfrÐ%JÓ%sÐáÜ× Ñ ØOÜœcÐ"5Ó6Ó7õñ Ü× Ñ ØXØõô
 × Ñ Ð![Ô\ä�= (Ô+Ü× Ñ ØVØôñ '¤t¨L¸-Ó'HÓIÐIà˜IÒ%Ü× Ñ ØZØôñ &Ñ&9Ó&;Ó<Ð<Ø˜kÒ)¨]¸oÒ-MÐQ^ÐbmÒQmðõô × Ñ ØWØôð #'×"?Ñ"?ÀÈxÓ"XÐÙ%Ù$Ð.AÐK^Ô_óð ð ˜kÒ)¨]¸fÒ-Dðõô × Ñ ØWØôð #'×"?Ñ"?ÀÈxÓ"XÐÙ%Ù$Ð.AÐK^Ô_óð ô × Ñ ØZØôñ &Ñ&9Ó&;Ó<Ð<øôM ò Ü!ðIóð ðûðûô& ò Ü!ðWóð ðûðús0   Å$H Æ-H+ È	H(ÈH#È#H(È+	IÈ4I É Ic           
      ój  — t        j                  d| j                  | j                  t	        t        | j                  «      «      «       t        j                  | j                  «      }| j                  | j                  d«      }t        j                  d| j                  |«       t        | j                  d«      r,t        j                  d| j                  «       | j                  S t        j                  d«      }| j                  dk(  s|dk(  r-dd	lm} t        j                  d
| j                  «        |«       S | j                  dk(  s| j                  dk(  s| j                  dk(  r1ddlm} t        j                  d| j                  |«        |||¬«      S | j                  dk(  s| j                  dk(  r2	 ddlm} t        j                  d| j                  |«        |||¬«      S t        j&                  d| j                  «       dd	lm}  |«       S # t$        $ r}t%        d«      |‚d}~ww xY w)zN
        Get the appropriate log exporter based on the configuration.
        ztOpenTelemetry Logger, initializing log exporter 
self.OTEL_EXPORTER: %s
self.OTEL_ENDPOINT: %s
self.OTEL_HEADERS: %sÚlogsz4OpenTelemetry: Log endpoint normalized from %s to %srÒ   zDOpenTelemetry: Using custom log exporter. Value of OTEL_EXPORTER: %sÚOTEL_LOGS_EXPORTERrØ   r   )ÚConsoleLogExporterzEOpenTelemetry: Using console log exporter. Value of OTEL_EXPORTER: %srç   rª  r«  )ÚOTLPLogExporterzPOpenTelemetry: Using HTTP log exporter. Value of OTEL_EXPORTER: %s, endpoint: %sr®  r¯  r°  zOpenTelemetry OTLP gRPC log exporter is not available. Install `opentelemetry-exporter-otlp` and `grpcio` (or `litellm[grpc]`).NzPOpenTelemetry: Using gRPC log exporter. Value of OTEL_EXPORTER: %s, endpoint: %sziOpenTelemetry: Unknown log exporter '%s', defaulting to console. Supported: console, otlp_http, otlp_grpc)r   rÅ   rö   rø   r   r;   rú   r  r  r³  rÓ   rî   rï   r­  rÀ  Ú4opentelemetry.exporter.otlp.proto.http._log_exporterrÁ  Ú4opentelemetry.exporter.otlp.proto.grpc._log_exporterrH  rI  )rñ   r¸  r»  Úotel_logs_exporterrÀ  rÁ  rº  s          r@   r¥  zOpenTelemetry._get_log_exporter  s  € ô 	×Ñð FØ×ÑØ×ÑÜœ#˜d×/Ñ/Ó0Ó1ô		
ô &3×%JÑ%JÈ4×K\ÑK\Ó%]Ðð &*×%BÑ%BÀ4×CUÑCUÐW]Ó%^Ðä×ÑØBØ×ÑØô	
ô �4×%Ñ% xÔ0ä× Ñ ØVØ×"Ñ"ôð ×%Ñ%Ð%ä$&§I¡IÐ.BÓ$CÐØ×Ñ Ò*Ð.@ÀIÒ.MÝIä× Ñ ØWØ×"Ñ"ôñ &Ó'Ð'à×Ñ +Ò-Ø×!Ñ! _Ò4Ø×!Ñ! [Ò0õô × Ñ ØbØ×"Ñ"Ø#ôñ
 #Ð,?ÐI\Ô]Ð]Ø×Ñ ;Ò.°$×2DÑ2DÈÒ2Nðõô × Ñ ØbØ×"Ñ"Ø#ôñ
 #Ð,?ÐI\Ô]Ð]ä×"Ñ"Ø{Ø×"Ñ"ôõ Já%Ó'Ð'øô' ò Ü!ðWóð ðûðús   Æ:H È	H2È!H-È-H2c           
      óô  — ddl m}m} t        j                  d| j
                  | j                  t        t        | j                  «      «      «       t        j                  | j                  «      }| j                  | j                  d«      }| j
                  dk(  r |«       } ||d¬«      S | j
                  dk(  s| j
                  d	k(  s| j
                  d
k(  rddlm}  |||¬«      } ||d¬«      S | j
                  dk(  s| j
                  dk(  r	 ddlm}  |||¬«      } ||d¬«      S t        j"                  d| j
                  «        |«       } ||d¬«      S # t         $ r}t!        d«      |‚d}~ww xY w)a/  
        Get the appropriate metric reader based on the configuration.

        Histograms keep the SDK's default cumulative temporality: Prometheus-backed
        OTLP receivers reject delta histograms and drop the whole batch, while
        backends that prefer delta still accept cumulative.
        r   )ÚConsoleMetricExporterÚPeriodicExportingMetricReaderztOpenTelemetry Logger, initializing metric reader
self.OTEL_EXPORTER: %s
self.OTEL_ENDPOINT: %s
self.OTEL_HEADERS: %sr�  rØ   iˆ  )Úexport_interval_millisrç   rª  r«  )ÚOTLPMetricExporterr®  r¯  r°  z‚OpenTelemetry OTLP gRPC metric exporter is not available. Install `opentelemetry-exporter-otlp` and `grpcio` (or `litellm[grpc]`).NzlOpenTelemetry: Unknown metric exporter '%s', defaulting to console. Supported: console, otlp_http, otlp_grpc)Ú opentelemetry.sdk.metrics.exportrÆ  rÇ  r   rÅ   rö   rø   r   r;   rú   r  r  r³  Ú6opentelemetry.exporter.otlp.proto.http.metric_exporterrÉ  Ú6opentelemetry.exporter.otlp.proto.grpc.metric_exporterrH  rI  )rñ   rÆ  rÇ  r¸  r»  rÐ   rÉ  rº  s           r@   r…  z OpenTelemetry._get_metric_readerb  s‘  € ÷	
ô
 	×Ñð FØ×ÑØ×ÑÜœ#˜d×/Ñ/Ó0Ó1ô		
ô &3×%JÑ%JÈ4×K\ÑK\Ó%]ÐØ%)×%BÑ%BÀ4×CUÑCUÐW`Ó%aÐà×Ñ Ò*Ù,Ó.ˆHÙ0°ÐRVÔWÐWð ×Ñ +Ò-Ø×!Ñ! _Ò4Ø×!Ñ! [Ò0õñ *Ø,Ø+ôˆHñ 1°ÐRVÔWÐWà×Ñ ;Ò.°$×2DÑ2DÈÒ2Nðõñ *Ø,Ø+ôˆHñ 1°ÐRVÔWÐWô ×"Ñ"Ø~Ø×"Ñ"ôñ -Ó.ˆHÙ0°ÐRVÔWÐWøô% ò Ü!ðWóð ðûðús   ÄE Å	E7Å&E2Å2E7rÙ   Úsignal_typec                 ó|  — |s|S h d£}||vrt        j                  d||«       |S |j                  d«      }|dk(  rd|v r|S d|› �}|j                  |«      r|S ||hz
  }|D ]7  }d|› �}|j                  |«      sŒ|j	                  dd«      d   d|› �z   }|c S  |j                  d	«      s||z   }|S |d|› �z   }|S )
aÊ  
        Normalize the endpoint URL for a specific OpenTelemetry signal type.

        The OTLP exporters expect endpoints to use signal-specific paths:
        - traces: /v1/traces
        - metrics: /v1/metrics
        - logs: /v1/logs

        This method ensures the endpoint has the correct path for the given signal type.

        Args:
            endpoint: The endpoint URL to normalize
            signal_type: The telemetry signal type ('traces', 'metrics', or 'logs')

        Returns:
            Normalized endpoint URL with the correct signal path

        Examples:
            _normalize_otel_endpoint("http://collector:4318/v1/traces", "logs")
            -> "http://collector:4318/v1/logs"

            _normalize_otel_endpoint("http://collector:4318", "traces")
            -> "http://collector:4318/v1/traces"

            _normalize_otel_endpoint("http://collector:4318/v1/logs", "metrics")
            -> "http://collector:4318/v1/metrics"
        >   r¾  r­  r�  znInvalid signal_type '%s' provided to _normalize_otel_endpoint. Valid values: %s. Returning endpoint unchanged.ú/r­  z/v2/trace/otlpz/v1/rµ   r   z/v1)r   rI  ÚrstripÚendswithÚrsplit)rñ   rÙ   rÍ  Úvalid_signalsÚtarget_pathÚother_signalsÚother_signalÚ
other_paths           r@   r³  z&OpenTelemetry._normalize_otel_endpoint¥  s  € ñ8 ØˆOò  =ˆØ˜mÑ+Ü×"Ñ"ðBàØô	ð ˆOð —?‘? 3Ó'ˆð ˜(Ò"Ð'7¸8Ñ'CØˆOð  $ K =Ð1ˆØ×Ñ˜[Ô)ØˆOð  -°¨}Ñ<ˆØ)ò 	 ˆLØ ˜~Ð.ˆJØ× Ñ  Õ,Ø#Ÿ?™?¨3°Ó2°1Ñ5¸!¸K¸=Ð8IÑI�Ø’ð		 ð × Ñ  Ô'Ø +Ñ-ˆHð ˆð   A k ]Ð"3Ñ3ˆHàˆr?   rÚ   zstr | Mapping[str, str] | Nonec                 óØ   — i }| ret        | t        «      r4| j                  d«      }|D ]  }|j                  dd«      \  }}|||<   Œ |S t        | t        «      r|j	                  | «       |S )zY
        Convert a string or dictionary of headers into a dictionary of headers.
        r©   ú=rµ   )r–   r;   rª   r   Úupdate)rÚ   r¸  ru  rI  rŠ   r“   s         r@   r  z%OpenTelemetry._get_headers_dictionaryë  s}   € ð /1ÐÙÜ˜'¤3Ô'ð  'Ÿ}™}¨SÓ1�Ø!ò 5�DØ!%§¡¨C°Ó!3‘J�C˜Ø/4Ð'¨Ò,ð5ð
 #Ð"ô ˜G¤WÔ-Ø#×*Ñ*¨7Ô3Ø"Ð"r?   Úlogging_payloadc              ƒ   ó~  K  — ddl m} ddlm}m} d}d}|j
                  }|j                  }	t        |t        «      rt        |dz  «      }n| j                  |«      }t        |	t        «      rt        |	dz  «      }n| j                  |	«      }|��,|j                  }
| j                  j                  |
|j                  |«      |¬«      }|j                  }|�/|j!                  «       D ]  \  }}| j#                  |d|› �|¬«       Œ |j$                  }|�/|j!                  «       D ]  \  }}| j#                  |d|› �|¬«       Œ |j'                   ||j(                  «      «       |j+                  |¬	«       | j-                  |d
«       |j'                   ||j(                  «      «       |j+                  |¬	«       y y ­w)Nr   rm  rÐ  rÓ  ©r4   r7   r5   úrequest.rÄ  z	response.rÕ  rW  )rw  rn  ry  rÑ  rÒ  r5   r³  r–   rÀ   r=   rÖ  Úrouter}  rÈ  rÉ  râ  r¿   rÌ  r
  r×  rØ  rÙ  r÷  )rñ   rÛ  rÁ  rn  rÑ  rÒ  rÚ  rÛ  r5   r³  rû  Úmanagement_endpoint_spanÚ_request_datarŠ   r“   Ú	_responses                   r@   Ú&async_management_endpoint_success_hookz4OpenTelemetry.async_management_endpoint_success_hookÿ  sÉ  è ø€ õ
 	(ß:àˆØˆà+×6Ñ6ˆ
Ø)×2Ñ2ˆä�j¤%Ô(Ü  ¨cÑ!1Ó2‰Nà!Ÿ[™[¨Ó4ˆNä�h¤Ô&Ü˜x¨#™~Ó.‰LàŸ;™; xÓ0ˆLàÑ'Ø /× 5Ñ 5ˆJØ.2¯k©k×.DÑ.DØØ×1Ñ1Ð2BÓCØ)ð /Eó /Ð$ð $3×#?Ñ#?ˆMØÐ(Ø"/×"5Ñ"5Ó"7ò ‘J�C˜Ø×+Ñ+Ø5Ø& s eÐ,Ø#ð ,õ ðð  /×7Ñ7ˆIØÐ$Ø"+§/¡/Ó"3ò ‘J�C˜Ø×+Ñ+Ø5Ø'¨ uÐ-Ø#ð ,õ ðð %×/Ñ/±°z·}±}Ó0EÔFØ$×(Ñ(°,Ð(Ô?ð ×3Ñ3Ð4DÀcÔJØ×'Ñ'©¨z¯}©}Ó(=Ô>Ø× Ñ ¨,Ð Õ7ðA (ùs   ‚F;F=c              ƒ   ó¶  K  — ddl m} ddlm}m} d}d}|j
                  }|j                  }	t        |t        «      rt        t        |«      dz  «      }n| j                  |«      }t        |	t        «      rt        t        |	«      dz  «      }n| j                  |	«      }|��6|j                  }
| j                  j                  |
|j                  |«      |¬«      }|j                  }|�/|j!                  «       D ]  \  }}| j#                  |d|› �|¬«       Œ |j$                  }| j#                  |dt'        |«      ¬«       |j)                   ||j*                  «      «       |j-                  |¬	«       dd
lm} |j3                  |¬«      }|j)                   ||j*                  «      «       | j5                  ||d|idœ¬«       |j-                  |¬	«       y y ­w)Nr   rm  rÐ  rÓ  rÝ  rÞ  rÄ  rî  rÕ  rê  ©rã  rì  rí  rð  )rw  rn  ry  rÑ  rÒ  r5   r³  r–   rÀ   r=   rÖ  rß  r}  rÈ  rÉ  râ  r¿   rÌ  rî  r;   r×  rà  rÙ  rô  rë  rõ  rö  )rñ   rÛ  rÁ  rn  rÑ  rÒ  rÚ  rÛ  r5   r³  rû  rà  rá  rŠ   r“   Ú
_exceptionrë  rì  s                     r@   Ú&async_management_endpoint_failure_hookz4OpenTelemetry.async_management_endpoint_failure_hook9  sí  è ø€ õ
 	(ß:àˆØˆà+×6Ñ6ˆ
Ø)×2Ñ2ˆä�j¤%Ô(Ü ¤ Z£°3Ñ!6Ó7‰Nà!Ÿ[™[¨Ó4ˆNä�h¤Ô&Üœs 8›}¨sÑ2Ó3‰LàŸ;™; xÓ0ˆLàÑ'Ø /× 5Ñ 5ˆJØ.2¯k©k×.DÑ.DØØ×1Ñ1Ð2BÓCØ)ð /Eó /Ð$ð $3×#?Ñ#?ˆMØÐ(Ø"/×"5Ñ"5Ó"7ò ‘J�C˜Ø×+Ñ+Ø5Ø& s eÐ,Ø#ð ,õ ðð !0× 9Ñ 9ˆJØ×#Ñ#Ø-ØÜ˜*“oð $ô ð
 %×/Ñ/±°z×7GÑ7GÓ0HÔIØ$×(Ñ(°,Ð(Ô?õð (C×'XÑ'XØ#-ð (Yó (Ðð ×'Ñ'©¨z×/?Ñ/?Ó(@ÔAØ×*Ñ*Ø%à!+Ø0CÐEVÐ/Wñð +ô ð × Ñ ¨,Ð Õ7ðU (ùs   ‚GGc                 ó®   — | j                   j                  t        | j                  |«      | j	                  |¬«      | j
                  j                  ¬«      S )zF
        Create a span for the received proxy server request.
        r©  )r4   r5   r7   rD   )r}  rÈ  rY   rÖ  rš  r  ÚSERVER)rñ   r5   rÚ   s      r@   Ú)create_litellm_proxy_request_started_spanz7OpenTelemetry.create_litellm_proxy_request_started_span}  sM   € ð �{‰{×%Ñ%Ü0Ø—{‘{ :Ó.Ø×4Ñ4¸WÐ4ÓEØ—‘×&Ñ&ð	 &ó 
ð 	
r?   )Úurl_pathr€  rë  r€  c                ót   — |€y|r| j                  |t        |¬«       |r| j                  |t        |¬«       yy)zê
        Set OTel-standard ``http.route`` / ``url.path`` on the proxy SERVER
        span. Called from the auth path, the only point where both the
        SERVER span and the request are in hand. No-op if span/value missing.
        NrÄ  )rÌ  r\   r[   )rñ   rÅ  rë  r€  s       r@   Ú"set_proxy_request_route_attributesz0OpenTelemetry.set_proxy_request_route_attributes�  sC   € ð ˆ<ØÙØ×#Ñ#¨Ô3EÈXÐ#ÔVÙØ×#Ñ#¨Ô3GÈzÐ#ÕZð r?   Ústatus_codec                 óP   — |�|€y| j                  |t        t        |«      ¬«       y)a½  
        Set OTel-standard ``http.response.status_code`` (int) on the proxy
        SERVER span. The failure path sets this from the error code in
        ``_record_exception_on_span``; this is the success-path counterpart
        so the attribute is present on every SERVER span regardless of
        outcome (required by the HTTP semconv, and needed for error-ratio /
        status-breakdown dashboards). No-op if span/value missing.
        NrÄ  )rÌ  rZ   r=   )rñ   rÅ  rî  s      r@   r÷  z0OpenTelemetry.set_response_status_code_attribute   s2   € ð ˆ<˜;Ð.ØØ×ÑØÜ3Ü�kÓ"ð 	 õ 	
r?   rî  c                 óˆ   — |�|€yddl m} |j                  |¬«      }t        |«      |d<   | j	                  |dd|ii¬«       y)	zàStamp structured ``error.*`` attributes on the SERVER span from the
        exception returned to the client, with ``error.code`` pinned to the real
        response status. Idempotent (overwrites); emits no exception event.Nr   rê  rå  rñ  rï  rì  rð  )rô  rë  rõ  r;   rö  )rñ   rÅ  rî  rî  rë  rì  s         r@   Úrecord_error_attributes_on_spanz-OpenTelemetry.record_error_attributes_on_span±  sb   € ð ˆ<˜9Ð,Øõ	
ð $?×#TÑ#TÐhqÐ#TÓ#rÐÜ*-¨kÓ*:Ð˜,Ñ'Ø×&Ñ&ØØ-Ð0CÐEVÐ/WÐXð 	'õ 	
r?   Ú	containerc                 ó  — |�t        |t        «      syd}|j                  d«      }|j                  d«      }t        |t        «      r|xs i j                  d«      nd|j                  d«      |j                  d«      fD ](  }t        |t        «      sŒ|xs |j                  d«      }Œ* |�|€y	 | j                  |«      }| j                  |«      }|�|€y||z
  dz  }	|	dk  ry| j                  |t        |	¬	«       y# t        $ r Y yw xY w)
a»  
        Set ``litellm.preprocessing.duration_ms`` (proxy-receive -> first
        provider handoff) on the proxy SERVER span. ``litellm_received_at``
        rides request metadata; ``first_api_call_start_time`` is the
        set-once first-handoff instant (retries/backoff excluded). Works
        uniformly for the success (model_call_details) and failure
        (request_data) containers. No-op if span/either anchor is missing.
        NÚfirst_api_call_start_timer  r  rP  Úlitellm_received_atg     @�@r   rÄ  )r–   r—   rš   r®  rÄ   rÌ  r]   )
rñ   rÅ  rò  Úreceived_atÚfirst_handoffÚ_lpÚ_mdÚstart_tsÚend_tsÚduration_mss
             r@   rø  z2OpenTelemetry.set_preprocessing_duration_attributeÇ  s,  € ð ˆ<œz¨)´TÔ:ØØˆà(Ÿ}™}Ð-HÓIˆØ—]‘]Ð#3Ó4ˆä+5°c¼4Ô+@ˆSŠY�B�O‰O˜JÔ'ÀdØ�M‰M˜*Ó%Ø�M‰MÐ,Ó-ð
ò 	LˆCô
 ˜#œtÕ$Ø)ÒK¨S¯W©WÐ5JÓ-K‘ð	Lð Ð -Ð"7Øð	Ø"×0Ñ0°Ó=ˆHØ ×.Ñ.¨}Ó=ˆFð Ð˜v˜~ØØ$ xÑ/°6Ñ9ˆà˜Š?ØØ×ÑØÜ3Øð 	 õ 	
øô ò 	Ùð	ús   Â1"C? Ã?	DÄ
D)r”   r1  )F)NNNN)r"  NNNNr    )r7   r6   r  )rÅ  rþ  rò  rþ  r\  r6   r”   r6   rž   )qr8   r9   r:   rN   r×   r;   Úobjectr=   r%  Ústaticmethodr<  r@  r*  rÏ   rW  rZ  r(  rg  ri  rk  r  r&  r'  r´  r¹  r»  r¿  r    r,   rÍ  r	   rÀ   r—   rÝ  rá  rÄ   r1   rý  rú  r$   r  r/   r  r  r  r-  r   r5  r  r   r  r%   r#  r%  rM  rU  rR  r°  r]  r^  ró  rp  rc  r&   r„  rˆ  r   r’   r  r  r”  ra  r®  r¡  r¢  r£  rÃ  rb  r`  r+   r  r¸  rö  r  r%  r!   r0  r_  rn  rÌ  rX  r]  ra  r`  ro  rÖ  ri  rš  r  rt  r¥  r…  r³  r  r0   rã  rç  rê  rí  r÷  rñ  rø  Ú__classcell__)r0  s   @r@   r  r  d  s“	  ø„ ð .2Ø$(à)-Ø)-Ø(,Ø,Iñ<2à# dÑ*ð<2ð ˜T‘zð<2ð
   $™ð<2ð   $™ð<2ð  ™ð<2ð '*õ<2ð| ð1Ð&9ð 1¸kò 1ó ð1óòAðF !&ñLð ðLð óLð\y $ó yð°s¸T±zó ð.` só `ð"
 $ó 
ð
 4ó 
ò"ò4?
òB
ò4IòIòIòIðÐ+?ð ÐSWð Ðhkð Ðptó ð2 )-Ø.2Ø,0Ø&*ñ3<à%ð3<ð  ™+ð3<ð ˜uÑ$ tÑ+ð	3<ð
 ˜UÑ" TÑ)ð3<ð ˜t™ó3<ðp Ø(,Ø.2Ø,0Ø&*ñ8<à%ð8<ð �T‰zð8<ð  ™+ð	8<ð
 ˜uÑ$ tÑ+ð8<ð ˜(Ñ" TÑ)ð8<ð ˜t™ó8<ð~ %)ñVGàðVGð &ðVGð *ð	VGð
 ˜T‘zóVGðp%Dàð%Dð #ð%Dð 
ó	%DðNàðð *ðð #ó	ð6,°Dð ,¸Vó ,ð\<¸tÀd¹{ó <ð	u¸4ð 	uÐDWÐZ^ÑD^ó 	uðØðØ%<ðà	Eóð$'?àð'?ð ˜Ð0Ð0Ñ1ð'?ð ð	'?ð
 
ó'?ðRMÐ>Qð MÐV_ó Mð MÀÈÈSÈÑ@Qð MÐV_ó MðØ0Mðà	�‰óðØ0Mðà	˜tÑ	#óð"5 ð 5¨vð 5¸$ó 5ðn<°$ð <ÀTó <ð@1¨ð 1¸Dó 1òV;ðpð "óò45ð8àðð �t‘ðð ˜$‘Jð	ð
 
óð6
°Tð 
À4ð 
ÈDó 
ðFÀTð FÈdó Fð($càð$cð #9ð$cð ð	$cð
 
ó$cðLgàðgð #9ðgð 
ó	gð" ð$ 3ð $°d¸3±ið $ÀCÈ$ÁJò $ó ð$ó1ð"¨t°C¸°H©~ð À$ÀsÈCÀxÁ.ó ò4Nðl ðØ˜Ñ Ñ# dÑ*ðà	�‰òó ðð&m¸ð mÈTó mð0CqàðCqð 6ðCqð ð	Cqð
 ðCqð óCqðJ'iàð'ið ˜UÑ"ð'ið ó	'iðR ñ)ó ð)ð"\)¸dó \)ð| ðØðà"ðð 'ðð 
ò	ó ðð(CH¨T°D©[ð CHÀ7ÈTÁ>ó CHòJMAð^Ze¨dð Ze¸Dó Zeðx^¨ó ^ðB°S¸4±ZÀ#Ñ5EÈÑ5Mó ð" ðØÐ6Ñ7ðà	ˆc�6ˆkÑ	òó ðð&ja 4ð ja¸sÀT¹zó jaðX°c¸D±jÀ3Ñ6FÈÑ6Nó ð"1 tð 1°#ð 1¸có 1ð'ÈÈdÉÐVYÑIYð 'Ð^bÐcgÑ^hó 'ðRÀtÈDÁzð ÐVZÐ[_ÑV`ó ð  ð˜ ™ò ó ðð0-¸dð -ÀtÈDÁzó -ð^7¨tó 7òr)ð)¨ó )òñ"5°d¸T±kó 5ðr 59Ø6:ñ]=à   c Ñ*¨TÑ1ð]=ð -¨tÑ3ó]=ò~N(ò`AXðFD°°t±ð DÈ#ð DÐRUÐX\ÑR\ó DðL ð#Ø1ð#à	ˆc�3ˆh‰ò#ó ð#ð, )-ñ88à9ð88ð  ™+ó88ðz )-ñB8à9ðB8ð  ™+óB8ðH
àð
ð ð
ð 
�‰ó	
ð(  $Ø!%ò[à�T‰kð[ð ˜‘*ð	[ð
 ˜$‘Jð[ð 
ó[ð&
°t¸d±{ð 
ÐQTÐW[ÑQ[ð 
Ð`dó 
ð"
à�T‰kð
ð ˜tÑ#ð
ð ð	
ð
 
ó
ð,'
¸À¹ð '
ÐQTð '
ÐY]÷ '
r?   r  )r   )rÆ   rÌ   r”   N)…rî   r  Úcollectionsr   Úcollections.abcr   r   Úconcurrent.futuresr   Údataclassesr   r   r	   Útypingr
   r   r   r   r   rU   Úlitellm._loggingr   r
  r   r   Ú"litellm.integrations.custom_loggerr   Ú7litellm.integrations.opentelemetry_utils.gen_ai_semconvr   r   r   r   Ú+litellm.integrations.otel.model.db_endpointr   Ú'litellm.integrations.otel.model.semconvr   Ú1litellm.litellm_core_utils.internal_call_metadatar   Ú*litellm.litellm_core_utils.safe_json_dumpsr   Ú+litellm.litellm_core_utils.secret_redactionr   Ú-litellm.litellm_core_utils.service_tier_utilsr   r   Úlitellm.secret_managers.mainr   r   Úlitellm.types.servicesr    Úlitellm.types.utilsr!   r"   r#   r$   r%   r&   r4  r'   r1  rx  r)   rÌ   r±  r*   Ú_SpanExporterry  r+   Ú_Contextr,   Ú_Spanr.   rC   r/   r/  r  r0   Ú!_ManagementEndpointLoggingPayloadÚlitellm.proxy.proxy_serverr1   Ú_UserAPIKeyAuthr3   rB   rH   rK   rN   r<   rS   rï   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rd   rf   rh   rj   rl   rn   ro   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@   ú<module>r     sü  ðÜ 	Û Ý #ß -Ý 1ß (Ý ß =Õ =ã Ý +÷õ <÷ó õ KÝ :Ý hÝ AÝ E÷÷ FÝ 7÷÷ ñ ÝAÝLÝLÝ7Ý1Ý9Ý5õõ Mà�3‰;€DØ�s‰]€FØ˜‰n€GØ  3Ñ&€LØ$ sÑ*€NØ'HÈ3Ñ'NÑ$à€DØ€FØ€LØ€NØ'*Ð$Ø€Gô˜yô ôÐ/°uõ ô °%õ ô/˜Y¨eõ /ð
 (+Ð ˜uÓ *ñ &8ÀAÐZpÔ%qÐ ˜UÓ qà&˜RŸY™YÐ'9¸9ÓEÐ �UÓ EØ%˜BŸI™IÐ&:¸IÓFÐ �EÓ FØ&˜RŸY™YÐ'<¸iÓHÐ �UÓ HØ)HÐ  Ó Hà-HÐ # UÓ HØ*Ð �eÓ *Ø&Ð �EÓ &Ø-PÐ # UÓ PØ!8Ð ˜Ó 8Ø4Ð �uÓ 4Ø":Ð ˜%Ó :ð )MÐ  Ó LØ)NÐ  Ó Nà3Ð �uÓ 3Ø#4Ð ˜5Ó 4à!-Ð ˜Ó -Ø +Ð ˜Ó +Ø!-Ð ˜Ó -Ø%5Ð ˜UÓ 5àØØØð	Ð �eó ð0Ð �e˜E # s (™OÑ,ó ð$ $7Ð �e˜C‘jÓ 6á6?ðñ Ñ>Ð)=Ô>Ó>ñ?ó
7Ð ˜e I¨c¡NÑ3ó 
ñ �$Ô÷*ð *ó ð*ð
¨#ð Ð2Kó ðØ)¨DÑ0ðà
ˆ9�S‰>˜DÑ  )¨C¡.°4Ñ"7Ð7Ñ8óð2
F¨ð 
F°°c±ó 
Fð Ð �5Ó à�c‘	˜EÑ! DÑ(¨5Ñ0°4Ñ7¸%Ð@TÑ:UÑUÐXaÐbqÑXrÑr€ñ˜fð ¨cð ¸-ó ó bñ �$˜dÔ#÷ð ó $ðð	+Ð&;ð 	+Àó 	+ð ÷R
ð R
ó ðR
ôjJ2
Ð)¨<õ J2
r?   