
    Cj4                       % S SK r S SKJrJr  S SKJr  S SKJrJrJrJ	r	J
r
JrJrJrJrJr  S SKrS SKJr  S SKJrJr  S SKJr  S SKJrJrJrJr  S S	KJr  S S
KJ r J!r!  S SK"J#r#  S SK$J%r%J&r&J'r'J(r(J)r)J*r*  \(       aO  S SK+J,r-  S SK.J/r0  S SK.J1r2  S SK.J3r4  S SK5J6r7  S SK8J9r:  \\2\4   r1\\4\4   r3\\0\4   r/\\-\4   r,\\:\4   r9\\7\4   r6O\r1\r3\r,\r9\r6\r/\ Rv                  " SS5      r<\ Rv                  " SS5      r=\ Rv                  " SS5      r>Sr?Sr@SrASrBSrCSrDSrESrFSrGS rHS!rIS"rJS#rKS$rL\I\J\K\L1rMS%rN\\OS&4   \PS''   S(rQ\O\PS)'   \R" S*\S" S+ \N 5       5      -   5      rT\	\O   \PS,'   \" S-S.9 " S/ S05      5       rUS1\S2\U4S3 jrVS4\\U   S2\\\	\O      \\	\O      4   4S5 jrWS1\S2\
\O   4S6 jrX\ " S7 S85      5       rY " S9 S:\\5      rZg);    N)	dataclassfield)datetime)
TYPE_CHECKINGAnyDict	FrozenSetListOptionalSetTupleUnioncast)verbose_logger)OpenInferenceSpanKindValuesSpanAttributes)CustomLogger)!OTEL_SEMCONV_STABILITY_OPT_IN_ENVOTELGenAISemconvMixinOTELSemconvCategoryparse_semconv_opt_in)
safe_dumps)get_secret_boolstr_to_bool)ServiceLoggerPayload)ChatCompletionMessageToolCallCostBreakdownFunctionLLMResponseTypesStandardCallbackDynamicParamsStandardLoggingPayload)SpanExporter)Context)Span)Tracer) ManagementEndpointLoggingPayload)UserAPIKeyAuthOTEL_TRACER_NAMElitellmLITELLM_METER_NAMELITELLM_LOGGER_NAMEzReceived Proxy Server Requestzhttp.response.status_codez
http.routezurl.pathz!litellm.preprocessing.duration_mszlitellm.team.metadatazlitellm.model_groupzlitellm.provider.modelraw_gen_ai_requestlitellm_request
NO_CONTENT	SPAN_ONLY
EVENT_ONLYSPAN_AND_EVENT)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.systemgen_ai.request.modelgen_ai.frameworkhidden_paramsc              #   ,   #    U  H
  nS U 3v   M     g7f)	metadata.N ).0keys     t/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/litellm/integrations/opentelemetry.py	<genexpr>rN   |   s     >)=#iu)=s   VALID_METRIC_ATTRIBUTE_NAMEST)frozenc                   J    \ rS rSr% Sr\\\      \S'   Sr	\\\      \S'   Sr
g)OTELMetricAttributeFilter   Ninclude_listexclude_listrJ   )__name__
__module____qualname____firstlineno__rT   r   r
   str__annotations__rU   __static_attributes__rJ       rM   rR   rR      s(    (,L(49%,(,L(49%,r]   rR   valuereturnc                     [        U [        5      (       a  U $ [        U [        5      (       d!  [        S[	        U 5      R
                   35      e[        U R                  S5      U R                  S5      S9$ )NzUotel.attributes must be a mapping with optional 'include_list' / 'exclude_list', got rT   rU   )rT   rU   )
isinstancerR   dict
ValueErrortyperV   get)r^   s    rM   _build_metric_attribute_filterrf      sp    %233eT""##';#7#7"8:
 	
 %YY~.YY~. r]   
attributesc                    U c  gU R                   =(       d    S nU R                  =(       d    S nU(       a  U(       a  [        S5      eU=(       d    U=(       d    / n[        U;   a  [        S[         S35      e[	        S U 5       5      nU(       a  [        SU S[	        [
        5       35      eU(       a  [        U5      OS U(       a  [        U5      4$ S 4$ )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   <   #    U  H  o[         ;  d  M  Uv   M     g 7fN)rO   )rK   names     rM   rN   3_resolve_metric_attribute_filter.<locals>.<genexpr>   s      "2N&Ns   	z+otel.attributes: unknown attribute name(s) z. Valid names: )rT   rU   rc   rB   sortedrO   	frozenset)rg   includeexclude	requestedunknowns        rM    _resolve_metric_attribute_filterrt      s     %%-G%%-G7S
 	
 (7(bIy( 45 63 3
 	
  " G 9' C"#?@AC
 	

 &	'4%	' +/ r]   c                 j   U c  / $ [        U [        5      (       aF  U R                  S5       Vs/ s H)  oR                  5       (       d  M  UR                  5       PM+     sn$ U  Vs/ s H<  n[        U5      R                  5       (       d  M#  [        U5      R                  5       PM>     sn$ s  snf s  snf )zCoerce 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.
,)ra   rZ   splitstrip)r^   items     rM   _normalize_team_metadata_keysrz      s     }	%).S)9J)9ZZ\

)9JJ*/E%$3t9??3DCIOO%EE KEs   B+
B+%"B0B0c                   J   \ rS rSr% Sr\\\4   \S'   Sr	\
\   \S'   Sr\
\   \S'   Sr\\S'   Sr\\S	'   Sr\
\   \S
'   Sr\
\   \S'   Sr\
\   \S'   Sr\
\   \S'   Sr\\S'   Sr\
\   \S'   \" \S9r\\   \S'   \" \S9r\\   \S'   Sr\
\   \S'   SS jr\ S 5       r!Sr"g)OpenTelemetryConfig   consoleexporterN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_keysrg   c                    U R                   (       a6  [        U R                  [        5      (       a  U R                  S:X  a  SU l        U R                  (       d  [
        R                  " SS5      U l        U R                  (       d  [
        R                  " SS5      U l        U R                  (       d&  [
        R                  " SU R                  5      U l        U R                  c$  [        [
        R                  " S5      5      U l	        U =R                  [        [
        R                  " [        5      5      -  sl        [        U R                  5      =(       d    [        [
        R                  " S	5      5      U l        g )
Nr~   	otlp_httpOTEL_SERVICE_NAMEr)   OTEL_ENVIRONMENT_NAME
productionOTEL_MODEL_IDOTEL_IGNORE_CONTEXT_PROPAGATION'LITELLM_OTEL_BAGGAGE_TEAM_METADATA_KEYS)r   ra   r   rZ   r   osgetenvr   r   r   r   r   r   r   rz   r   selfs    rM   __post_init__!OpenTelemetryConfig.__post_init__   s    MM4==#..*'DM   "		*=y ID***,))'+D' }}IIot7H7HIDM**2.9		;</D+
 	%%)=II78*
 	
% +H+++
 +
*II?@
 	'r]   c                 x   SSK Jn  [        R                  " S[        R                  " SS5      5      n[        R                  " S[        R                  " S5      5      n[        R                  " S[        R                  " S	5      5      n[        R                  " S
S5      R	                  5       S:H  n[        R                  " SS5      R	                  5       S:H  n[        R                  " SS5      n[        R                  " SS5      n[        R                  " SU5      n	US:X  a  U " U" 5       S9$ U " UUUUUUUU	S9$ )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   r)   r   r   r   	in_memory)r   )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
             rM   from_envOpenTelemetryConfig.from_env   s   	
 99)299_i+P
 99:BIIo<VW))("))N*C
 II?IOOQ 	
 II>HNNP 	 yy!4i@!#+BL!Q99_l;{" 4 677)'%#9	
 		
r]   )r   r   r   r   r   r   r_   N)#rV   rW   rX   rY   r   r   rZ   r"   r[   r   r   r   r   boolr   r   r   r   r   r   r   r   setr   r   r   listr   r
   rg   rR   r   classmethodr   r\   rJ   r]   rM   r|   r|      s    )2HeC%&2"Hhsm"!GXc]! ND M4"&L(3-&,0HSM0"Hhsm"155!OT! .2Xc]19>s9Sc"56S -2$,GS	G 7;J23:!
F *
 *
r]   r|   c                   f  ^  \ rS rSr     SS\\   S\\   S\\   S\\   S\\   4
U 4S jjjr\	S\4S	 j5       r
S
 r SS\S\4S jjrS\4S jrS\\   4S jrS\4S jrS\4S jrS\4S jrS rS rS rS rS rS rS r    SS\S\\   S\\\\4      S\\\\4      S\\   4
S  jjr      SS\S!\\   S\\   S\\\\4      S\\\\4      S\\   4S" jjr! SS#\S$\"S%\#S&\\   4S' jjr$S#\S(\\   SS4S) jr%S*\S%\#S+\&4S, jr'S-\S\(4S. jr)S\\   4S/ jr*S0\4S1 jr+S2\,S\\   4S3 jr-S-\S4\.S\4S5 jr/S-\SS4S6 jr0S7\SS4S8 jr1S9 r2S: r3S; r4S7\S<\\   S=\\   SS4S> jr5S7\S-\SS4S? jr6S-\SS4S@ jr7S7\SA\8SB\SS4SC jr9\	SD\SE\:\   S\\   4SF j5       r;SSG jr<SH\=\\4   S\=\\4   4SI jr>SJ r?\	SK\\\\\4      S\\   4SL j5       r@S-\SM\4SN jrAS-\SO\\   S\SP\SM\4
SQ jrBS-\S\\\4   SM\4SR jrC\	SS 5       rDS7\4ST jrE\	S7\\   S(\\   SU\\   S\\   4SV j5       rFS-\\   SW\\G   4SX jrHSY rIS7\S-\4SZ jrJS7\4S[ jrKS\\\\L\4   4S\ jrM\	S]\:\N   S\=\\4   4S^ j5       rOS7\SO\\   4S_ jrPS\\\\L\4   4S` jrQS7\Sa\SD\4Sb jrRSc\\:\   \4   S\:\   4Sd jrSSe\:\   S\:\   4Sf jrT\	S\\   4Sg j5       rUSh\:S\:\   4Si jrVS7\4Sj jrWSk rXSl rYSm rZSSn\\   4So jjr[SS0\\   4Sp jjr\Sq r]Sr r^Ss\\   St\S\\   4Su jr_\	Sv\\\\4      S\=\\4   4Sw j5       r` SSx\aS\\   4Sy jjrb SSx\aS\\   4Sz jjrcS\Sv\S\\   4S{ jrdSSS|.S7\\   S}\\   S~\\   SS4S jjreS7\\   S\\L   SS4S jrfS7\\   S\\"   S\LSS4S jrgS7\\   S\SS4S jrhSriU =rj$ )OpenTelemetryi*  Nconfigcallback_nametracer_providerlogger_providermeter_providerc                   > UR                  SS 5      nUR                  SS 5      nUc  [        R                  5       nUb  [        U5      Ul        Ub  [        U5      Ul        Xl        X l        S U l	        S U l
        SU l        UR                  b  U R                  5         U R                  R                  U l        U R                  R                  U l        U R                  R"                  U l        0 U l        U R)                  U5        [+        [,        R.                  " SS5      5      R1                  5       n	U	S:X  a^  SS Kn
U
R5                  U
R6                  S9  U
R9                  [:        5        U
R9                  S	5      nUR=                  U
R6                  5        [>        TU ]  " S
0 UD6  U RC                  U5        U RE                  U5        U RG                  5       U l$        U RK                  5         g )Nr   rg   F
DEBUG_OTELFalser   r   )levelzopentelemetry.sdk.trace.exportrJ   )&popr|   r   rz   r   rf   rg   r   r   _metric_attr_include_metric_attr_exclude_metric_attr_filter_resolved_ensure_metric_attribute_filterr   r   r   r   r   r   _tracer_provider_cache_init_tracingrZ   r   r   r   loggingbasicConfigDEBUG	getLoggerrV   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   kwargsteam_metadata_keys_overridemetric_attributes_override_debug_otelr   otel_exporter_logger	__class__s               rM   r   OpenTelemetry.__init__+  s    '-jj1Mt&T#%+ZZd%C">(113F&20M+1F- &1 >*!F *
 ?C!>B!,1)(002![[11![[11 KK//68#?+"))L':;AAC& gmm4h' $+#4#45U#V  ))'--8 	"6">*( %)$N$N$P!//1r]   c                     SSK JnJn  U R                  U R                  U R
                  =(       d    U R                  S.nUR                  U5      nU" 5       nUR                  5       nUR                  U5      $ )z>Create an OpenTelemetry Resource using config-driven defaults.r   )OTELResourceDetectorResource)zservice.namezdeployment.environmentr   )	opentelemetry.sdk.resourcesr   r   r   r   r   createdetectmerge)r   r   r   base_attributesbase_resourceotel_resource_detectorenv_resources          rM   _get_litellm_resource#OpenTelemetry._get_litellm_resourcei  sm     	O #//&,&C&C>6+>+>5
 !8!5!7-446""<00r]   c                 F    SSK Jn  S[
        R                  ;  aD  [        S [
        R                   5       5      (       a  [
        R                  R                  U 5        [        USS5      c  [        USU 5        gg! [         a    [        R                  " S5         gf = f)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   L   #    U  H  n[        U[        5      (       + v   M     g 7frk   )ra   r   )rK   cbs     rM   rN   COpenTelemetry._init_otel_logger_on_litellm_proxy.<locals>.<genexpr>  s!      :
8P"
2}---8Ps   "$open_telemetry_logger)litellm.proxyr   ImportErrorr   warningr)   service_callbackallappendgetattrsetattr)r   r   s     rM   r   0OpenTelemetry._init_otel_logger_on_litellm_proxyy  s    	2 111c :
8?8P8P:
 7
 7
 $$++D1 <!8$?GL"94@ H#  	""W 		s   A= = B B provider_namer   c                 p   Ub,  [         R                  " S[        U5      R                  5        U$  U" 5       n[	        X5      (       aX  U(       a!  [         R                  " SUU5        U" 5       nU$ [         R                  " SU[        U5      R                  5        Un U$ [         R                  " SU5        U" 5       nU(       d
  U" U5        U$ [         R
                  " SU5         U$ ! [         aB  n	[         R                  " SU[        U	5      5        U" 5       nU(       d  U" U5         Sn	A	U$ Sn	A	ff = f)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   debugrd   rV   ra   info	ExceptionrZ   )
r   providerr   get_existing_provider_fnsdk_provider_classcreate_new_provider_fnset_provider_fnr   existing_provideres
             rM   _get_or_create_provider%OpenTelemetry._get_or_create_provider  s;   2    BX'' O&	* 8 :+@@""((v%%
  67H< 9 #((>%./88
  1H. ) $$%E}U13&#H-"  #''x%   		*  UA
 ./H")		*s)   =C) 0-C)  -C) C) )
D537D00D5r_   c                     U R                   R                  =(       d"    [        U S5      =(       a    U R                  S:H  $ )Nr   langfuse_otel)r   r   hasattrr   r   s    rM   _skip_set_globalOpenTelemetry._skip_set_global  s3    {{** 
D/*Tt/A/A_/T	
r]   c                     U R                   R                  =(       d    [        R                  " S5      nU(       d  gUR	                  5       nUS;   a  [
        $ US;   a  [        $ U[        ;   a  U$ g)aK  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   upperCAPTURE_MODE_EVENT_ONLYCAPTURE_MODE_NO_CONTENT_VALID_CAPTURE_MODES)r   explicit
normalizeds      rM   r   3OpenTelemetry._compute_capture_mode_from_init_state  sh     ;;66 
"))@;
 ^^%
&**'**--r]   c                     [         R                  (       a  [        $ U R                  b  U R                  $ U R                  (       a  [
        $ [        $ )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).
)r)   turn_off_message_loggingr  r   message_loggingCAPTURE_MODE_SPAN_AND_EVENTr   s    rM   _resolve_capture_mode#OpenTelemetry._resolve_capture_mode  sJ     ++**$$0,,, ## (	
 )	
r]   c                 <    U R                  5       [        [        4;   $ rk   )r  CAPTURE_MODE_SPAN_ONLYr  r   s    rM   _capture_in_spanOpenTelemetry._capture_in_span  s#    ))+"'0
 
 	
r]   c                 <    U R                  5       [        [        4;   $ rk   )r  r  r  r   s    rM   _capture_in_eventOpenTelemetry._capture_in_event  s#    ))+#'0
 
 	
r]   c           
         ^ ^ SSK Jn  SSKJm  SSKJn  UU 4S jnT R                  USUR                  TUUR                  T R                  5       S9nUR                  [        5      T l        UT l        UT l        g )Nr   traceTracerProvider)SpanKindc                     > T" TR                  TR                  5      S9n U R                  TR                  5       5        U $ Nresource)r   r   add_span_processor_get_span_processor)r   r%  r   s    rM   create_tracer_provider;OpenTelemetry._init_tracing.<locals>.create_tracer_provider'  s8    %t/I/I$++/VWH''(@(@(BCOr]   r%  r   r   r   r   r   r   r   )opentelemetryr#  opentelemetry.sdk.tracer%  opentelemetry.tracer&  r   get_tracer_providerset_tracer_providerr  
get_tracerLITELLM_TRACER_NAMEtracer_tracer_provider	span_kind)r   r   r#  r&  r-  r%  s   `    @rM   r   OpenTelemetry._init_tracing"  sv    ':0	
 66$*%*%>%>-#9!55 113 7 
 &001DE /!r]   c           
      v  ^ ^ T R                   R                  (       d2  S T l        S T l        S T l        S T l        S T l        S T l        S T l        g SSK	J
n  SSKJm  UU 4S jnT R                  USUR                  TUUR                  T R!                  5       S9nUT l        UR#                  [$        5      nUR'                  SSS	S
9T l        UR'                  SSSS
9T l        UR'                  SSSS
9T l        UR'                  SSS	S
9T l        UR'                  SSS	S
9T l        UR'                  SSS	S
9T l        g )Nr   )metrics)MeterProviderc                  f   > TR                  5       n T" U /TR                  TR                  5      S9$ )N)metric_readersr*  )_get_metric_readerr   r   )metric_readerr=  r   s    rM   create_meter_provider:OpenTelemetry._init_metrics.<locals>.create_meter_providerJ  s5     335M  -33DKK@ r]   r=  r/  z gen_ai.client.operation.durationzGenAI operation durations)rl   descriptionunitzgen_ai.client.token.usagezGenAI token usagez{token}zgen_ai.client.token.costzGenAI request costUSDz*gen_ai.client.response.time_to_first_tokenz*Time to first token for streaming requestsz,gen_ai.client.response.time_per_output_tokenzCAverage time per output token (generation time / completion tokens)zgen_ai.client.response.durationz9Total 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_histogramr0  r<  opentelemetry.sdk.metricsr=  r   get_meter_providerset_meter_providerr  	get_meterrV   create_histogram)r   r   r<  rB  meterr=  s   `    @rM   r   OpenTelemetry._init_metrics<  s   {{))#'D 15D.*.D'#'D 26D/48D104D-);	 55#)%,%?%?,#8#66 113 6 
  .((2-2-C-C32 .D .
*
 ',&<&<,+ '= '
#
  %55+,  6  

 /4.D.D=D /E /
+
 160F0F?] 1G 1
-
 -2,B,B2S -C -
)r]   c           
         ^ ^^ T R                   R                  (       d  S T l        g SSKJnJn  SSKJm  SSKJ	m  UUU 4S jnT R                  USUTUUT R                  5       S9T l        g )Nr   )get_logger_providerset_logger_provider)LoggerProvider)BatchLogRecordProcessorc                     > T" TR                  TR                  5      S9n TR                  5       nU R                  T" U5      5        U $ r(  )r   r   _get_log_exporteradd_log_record_processor)r   log_exporterrZ  OTLoggerProviderr   s     rM   create_logger_provider8OpenTelemetry._init_logs.<locals>.create_logger_provider  sL    '33DKK@H  113L--'5 Or]   rY  r/  )r   r   _logger_provideropentelemetry._logsrW  rX  opentelemetry.sdk._logsrY  opentelemetry.sdk._logs.exportrZ  r   r  )r   r   rW  rX  r`  rZ  r_  s   `    @@rM   r   OpenTelemetry._init_logs}  sa    {{(($(D!PNJ	 !% < <$*%8/#9/ 113 != !
r]   c                 (    U R                  XX45        g rk   _handle_successr   r   response_obj
start_timeend_times        rM   log_success_eventOpenTelemetry.log_success_event      V:Hr]   c                 (    U R                  XX45        g rk   _handle_failurerj  s        rM   log_failure_eventOpenTelemetry.log_failure_event  rp  r]   c                 0   #    U R                  XX45        g 7frk   rh  rj  s        rM   async_log_success_event%OpenTelemetry.async_log_success_event       V:H   c                 0   #    U R                  XX45        g 7frk   rr  rj  s        rM   async_log_failure_event%OpenTelemetry.async_log_failure_event  ry  rz  payloadparent_otel_spanrl  rm  event_metadatac                 *  #    SSK Jn  SSKJnJn  Sn	Sn
[        U[        5      (       a  [        US-  5      n	OU R                  U5      n	[        U[        5      (       a  [        US-  5      n
OU R                  U5      n
Ub  UR                  nU R                  R                  UUR                  U5      U	S9nU R                  USUR                  S9  U R                  USUR                  R                  S9  U(       aP  UR!                  5        H<  u  pUc  S	n[        U["        5      (       a   [%        U5      nU R                  UUUS9  M>     UR)                  U" UR*                  5      5        UR-                  U
S9  g g ! [&         a    S
n NUf = f7f)Nr   r"  Status
StatusCode    eArl   contextrl  	call_typespanrL   r^   serviceNonez0litellm logging error - could_not_json_serializerm  )r0  r#  r2  r  r  ra   floatint_to_nsr  r7  
start_spanset_span_in_contextsafe_set_attributer  r^   itemsrb   rZ   r   
set_statusOKend)r   r~  r  rl  rm  r  r#  r  r  _start_time_ns_end_time_ns
_span_nameservice_logging_spanrL   r^   s                  rM   async_service_success_hook(OpenTelemetry.async_service_success_hook  s     	(:j%(( c!12N![[4Nh&&x#~.L;;x0L' J#';;#9#9112BC) $: $ 
 ##)'' $ 
 ##)oo++ $  "0"6"6"8JC} &!%..W$'JE ++1# ,  #9 !++F:==,AB $$l$;C (2  ) W$VEWs+   D,F/F:AFFFFFerrorc                 v  #    SSK Jn  SSKJnJn	  Sn
Sn[        U[        5      (       a  [        [        U5      S-  5      n
OU R                  U5      n
[        U[        5      (       a  [        [        U5      S-  5      nOU R                  U5      nUGb  UR                  nU R                  R                  UUR                  U5      U
S9nU R                  USUR                  S9  U R                  USUR                  R                  S9  U(       a  U R                  US	US9  U(       aK  UR!                  5        H7  u  p[        U["        5      (       a   [%        U5      nU R                  UUUS9  M9     UR)                  U" U	R*                  5      5        UR-                  US9  g g ! [&         a    S
n NUf = f7f)Nr   r"  r  r  r  r  r  r  r  z/litllm logging error - could_not_json_serializer  )r0  r#  r2  r  r  ra   r  r  r  r  r7  r  r  r  r  r^   r  rb   rZ   r   r  ERRORr  )r   r~  r  r  rl  rm  r  r#  r  r  r  r  r  r  rL   r^   s                   rM   async_service_failure_hook(OpenTelemetry.async_service_failure_hook  s     	(:j%(( Z3!67N![[4Nh&&s8}s23L;;x0L' J#';;#9#9112BC) $: $ 
 ##)'' $ 
 ##)oo++ $ 
 ''- ( 
 "0"6"6"8JC!%..V$'JE ++1# ,  #9 !++F:3C3C,DE $$l$;K (8  ) V$UEVs+   EF9F' AF9'F63F95F66F9request_dataoriginal_exceptionuser_api_key_dicttraceback_strc                   #    SSK Jn  SSKJnJn  UR
                  nUGb  UR                  U" UR                  5      5        U R                  UUR                  UR                  S9  SSKJn	  U	R                  UUS9n
U R                  UUSU
0S.S	9  U
(       a  U
R                  S
5      OS nU(       d  U R!                  US5        U R#                  X5        SnU R$                  R'                  UUR)                  U5      S9nU R+                  US[-        U5      S9  U R                  UUR                  UR                  S9  UR                  U" UR                  5      5        UR/                  U R1                  [2        R4                  " 5       5      S9  U R7                  UUS9  UR/                  U R1                  [2        R4                  " 5       5      S9  g g 7f)Nr   r"  r  r  team_id
team_aliasStandardLoggingPayloadSetup)r  r  error_information	exceptionstandard_logging_objectr  r   
error_codei  zFailed Proxy Server Request)rl   r  r  r  r  )r  parent_span)r0  r#  r2  r  r  r  r  r  _set_team_attributes_on_spanr  r  *litellm.litellm_core_utils.litellm_loggingr  get_error_information_record_exception_on_spanre   "set_response_status_code_attribute$set_preprocessing_duration_attributer7  r  r  r  rZ   r  r  r   now'_emit_guardrail_spans_from_request_data)r   r  r  r  r  r#  r  r  r  r  r  r  r  exception_logging_spans                 rM   async_post_call_failure_hook*OpenTelemetry.async_post_call_failure_hook"  s     	(:,=='''z/?/?(@A
 --%)11,77 .  !< Q Q#5+ !R ! **%!30CEV/W +  8I!%%l3d  778H#N 556FU6J &*[[%;%;112BC &< &" ##+,- $ 
 --+)11,77 . 
 #--fZ5E5E.FG"&&HLLN0K&L 88), 9    $++hlln*E F[ (s   GGr  c                     SSK Jn  U=(       d    0 R                  S5      =(       d    0 nUR                  S5      nU(       d  gSU0UUS.S.nUb  UR                  U5      OSnU R	                  XgS9  g)	u%  Emit ``guardrail`` spans from ``request_data["metadata"]
["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   r"  metadata&standard_logging_guardrail_informationN)guardrail_informationr  )litellm_paramsr  r   r  )r0  r#  re   r  _create_guardrail_span)r   r  r  _tracer  r  r   r  s           rM   r  5OpenTelemetry._emit_guardrail_spans_from_request_data|  s     	2 &B++J7=2 (-U V$  *84)>$("
 8C7NF&&{3TX 	 	##6#Cr]   dataresponsec                    #    SSK Jn  UR                  S5      nUbY  [        XT5      (       aI  UR                  nUR
                  nU R                  XgS9u  pU R                  Xv5        U R                  XhS9  U$ 7f)Nr   )Logginglitellm_logging_obj)default_spanr  )	r  r  re   ra   model_call_detailsr  _get_span_contextr  r  )
r   r  r  r  LiteLLMLoggingr  r   r  ctx_s
             rM   async_post_call_success_hook*OpenTelemetry.async_post_call_success_hook  s      	Y"hh'<=*z0
 0
 );;F+<<K++F+MFC 55kJ ''v'Cs   A6A8r   c                    U R                  U5      nUb*  U R                  U5      n[        R                  " SU5        U$ [	        U S5      (       a  U R
                  S:X  a  U R                  (       a  U R                  U R                  5      O0 nU(       a)  U R                  U5      n[        R                  " S5        U$ U R                  n[        R                  " S5         U$ U R                  n[        R                  " S5        U$ )z
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
z2[OTEL DEBUG] Using DYNAMIC tracer with headers: %sr   r  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_headers_from_kwargs _get_tracer_with_dynamic_headersr   r   r  r   r   _get_headers_dictionaryr7  )r   r   dynamic_headerstracer_to_useenv_var_headerss        rM   get_tracer_to_use_for_request+OpenTelemetry.get_tracer_to_use_for_request  s    DDVL& AA/RM  Do> 5 t_--$2D2D2W (( 001B1BC  
 #$($I$I'%M #((g  %)KKM"((Q  !%$$K r]   c                 h    UR                  S5      nU(       d  gU R                  US9nU(       a  U$ S$ )z1Extract dynamic headers from kwargs if available. standard_callback_dynamic_paramsN)r  )re   construct_dynamic_otel_headers)r   r   r  r  s       rM   r  3OpenTelemetry._get_dynamic_otel_headers_from_kwargs  sE     JJ9: 	) 0==-M > 
 #2;t;r]   r  c                 t   SSK Jn  [        [        UR	                  5       5      5      nX0R
                  ;   a"  U R
                  U   R                  [        5      $ U" U R                  U R                  5      S9nUR                  U R                  US95        X@R
                  U'   UR                  [        5      $ )zECreate a temporary tracer with dynamic headers for this request only.r   r$  r)  )r  )r1  r%  rZ   rn   r  r   r5  r6  r   r   r+  r,  )r   r  r%  	cache_keytemp_providers        rM   r  .OpenTelemetry._get_tracer_with_dynamic_headers  s    : 44678	333..y9DD# 
 '0J0J4;;0WX(($$_$E	

 2?##I.''(;<<r]   r  c                     g)z
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
NrJ   )r   r  s     rM   r  ,OpenTelemetry.construct_dynamic_otel_headers  s     r]   scopec                    UR                  S5      n[        U[        5      (       d  0 nX1S'   UR                  S5      n[        U[        5      (       d  0 nXCS'   UR                  S5      n[        U[        5      (       d  0 nXTS'   UR                  S5      n[        U[        5      (       d  0 nXeS'   U R                  R                  [        U 5      /UQ7nUR                  U5      SL a  gSXg'   g)aF  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 can be any hashable identity. 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_loggedTF)re   ra   rb   r   rV   id)r   r   r  r  	_metadatar  r  
dedupe_keys           rM   
_emit_onceOpenTelemetry._emit_once#  s    ,  $45.$//N'5#$"&&z2	)T**I)2:&"'78.$//N*8&'%)).9,--L-9>*nn--r$x@%@
J'4/#' r]   c                    UR                  S0 5      =(       d    0 nUR                  S0 5      =(       d    0 nUR                  SS5      nUc-  UR                  S0 5      =(       d    0 nUR                  SS5      nUbP  [        USS5      [        :X  a:  [        US5      (       a(  UR	                  5       (       a  U R                  XR5        ggggg)u  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_metadatarl   is_recording)re   r   LITELLM_PROXY_REQUEST_SPAN_NAMEr  r  _close_proxy_span_ok)r   r   rm  r  r  
proxy_span_litellm_metadatas          rM   _end_proxy_span_from_kwargs)OpenTelemetry._end_proxy_span_from_kwargsT  s      $4b9?R"&&z26<"	]]#=tD
  . 2 23Er J Pb*../I4PJ "
FD15TT
N33''))%%j; * 4 U #r]   r  c                     SSK JnJn  U R                  US5        UR	                  U" UR
                  5      5        UR                  U R                  U5      S9  g)zCStamp http.response.status_code=200 + status=OK, then end the span.r   r     r  N)r2  r  r  r  r  r  r  r  )r   r  rm  r  r  s        rM   r  "OpenTelemetry._close_proxy_span_okt  sA    ://c:z}}-.$++h/0r]   c                 p   [         R                  " SUU R                  5        U R                  US5      (       d=  [         R                  " SU R                  R
                  5        U R                  X5        gU R                  U5      u  pVU R                  R                  (       a  SnSnUSL =(       d    [        S5      nU(       a'  U R                  XX4U5      nU R                  XX4U5        OaSSKJn	Jn
  Sn[        US5      (       a3  UR!                  U	" U
R"                  5      5        U R%                  XaU5        U R                  XX4U5        U R'                  XUS	9nU R)                  XS
9  U R+                  XX45        U R                  R,                  (       a  Ub  UOUnUb  U R/                  XU5        Ub\  [        US5      (       aK  UR0                  [2        :X  a7  [        US5      (       a&  UR5                  5       (       a  U R7                  Xd5        U R9                  U5        U R                  X5        g)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  rl   r  )r   r   r   r  r   rV   r  r  r   r   _start_primary_span_maybe_log_raw_requestr2  r  r  r  r  r  set_attributes_resolve_guardrail_contextr  _record_metricsr   _emit_semantic_logsrl   r  r  r  ._set_team_attributes_on_proxy_span_from_kwargs)r   r   rk  rl  rm  r  r  should_create_primary_spanr  r  r  guardrail_ctxlog_spans                rM   ri  OpenTelemetry._handle_success|  s   OKK	
 vy11  O'' ,,V>11&9;;11KC
 &1D%8 &
O+=
" &++jCD ''jD ?D {L11&&vjmm'<=##KF''jK 77S 8 
 	##6#I 	V:H ;;$$#/t[H#((xH #V,,  $CC^44((**%%k< 	;;FC
 	((:r]   c                    SSK JnJn  U R                  U5      nU R	                  U5      U R                  U5      US.n	U R                  (       a  U R                  R                  U	S'   UR                  " S0 U	D6n
U
R                  U" UR                  5      5        U R                  XU5        U
R                  U R                  U5      S9  U
$ )Nr   r  rl   rl  r  kindr  rJ   )r2  r  r  r  _get_span_namer  #_gen_ai_semconv_latest_experimentalr9  CLIENTr  r  r  r  r  )r   r   rk  rl  rm  r  r  r  otel_tracerspan_kwargsr  s              rM   r  !OpenTelemetry._start_primary_span  s     	;"@@H ''/++j1'

 33"&.."7"7K%%44z}}-.D,7$++h/0r]   c                 L   SSK Jn  SSKJnJn  U R
                  (       a  g U R                  5       (       d  g UR                  S0 5      n	U	R                  S5      =(       d    0 n
U
R                  S5      nU(       a  UO[        nU R                  U5      nUR                  UU R                  U5      UR                  U5      S9nUR                  U" UR                  5      5        U R                  XU5        U R!                  X5        UR#                  U R                  U5      S9  g )	Nr   r"  r  r  r  generation_namer  r  )r0  r#  r2  r  r  r  r  re   RAW_REQUEST_SPAN_NAMEr  r  r  r  r  r  set_raw_request_attributes _set_team_attributes_from_kwargsr  )r   r   rk  rl  rm  r  r#  r  r  r  r  r  raw_span_namer  raw_spans                  rM   r  $OpenTelemetry._maybe_log_raw_request  s     	(: 33$$&&$4b9!%%j17R",,'89+:@U"@@H)){{:.--k: * 

 	F:==12'',G--h?dkk(34r]   r  r  c                 f    U(       a  U R                  USUS9  U(       a  U R                  USUS9  gg)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       rM   r  *OpenTelemetry._set_team_attributes_on_span  sI     ##3 $ 
 ##6  $  r]   c                    UR                  S5      n0 n[        U[        5      (       a  UR                  S5      =(       d    0 nOUb  [        USS5      =(       d    0 nU R	                  UUR                  S5      UR                  S5      S9  g)z`Pull team_id / team_alias from the standard logging metadata in kwargs and stamp them onto span.r  r  Nr4   r7   r  )re   ra   rb   r   r  )r   r  r   std_logmds        rM   r  .OpenTelemetry._set_team_attributes_from_kwargs1  s    **67gt$$Z(.BB *d39rB))FF12vv78 	* 	
r]   c                 4   UR                  S5      =(       d    0 nUR                  S5      =(       d    0 nUR                  S5      nUbP  [        USS5      [        :X  a:  [        US5      (       a(  UR	                  5       (       a  U R                  XA5        ggggg)au  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  r  Nrl   r  )re   r   r  r  r  r  )r   r   r  r  r  s        rM   r	  <OpenTelemetry._set_team_attributes_on_proxy_span_from_kwargs?  s      $45;!%%j17R\\"<=
"
FD15TT
N33''))11*E * 4 U #r]   standard_logging_payloadr  c                    UR                  S5      =(       d    0 nUR                  S5      nU(       a  U R                  U[        US9  UR                  S5      =(       d    UR                  S5      =(       d    0 nU R                  UR                  S5      U R                  R
                  5      nU(       a  U R                  U[        US9  UR                  S5      nU(       a  U R                  U[        US9  UR                  S5      =(       d    0 n	U	R                  S5      =(       d    UR                  S	5      n
U
(       a  U R                  U[        U
S9  g
g
)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  r  user_api_key_team_metadatamodel_grouprG   litellm_model_namemodelN)	re   r  HTTP_ROUTE_ATTRIBUTE_team_metadata_jsonr   r   TEAM_METADATA_ATTRIBUTEMODEL_GROUP_ATTRIBUTEPROVIDER_MODEL_ATTRIBUTE)r   r  r'  r  r  
http_routeraw_metadatateam_metadatar+  rG   provider_models              rM   "_set_inference_identity_attributes0OpenTelemetry._set_inference_identity_attributesS  sZ    ,//
;Ar\\">?
##3: $  z* !!"45 	
 009:KK22
 ##6m $  /22=A##4K $  144_EK&** 
 3%))'2 	 ##7~ $  r]   r^   allowed_keysc                     [        U [        5      (       a  U (       a  U(       d  gU Vs0 s H  o"U ;   d  M
  X U   _M     nnU(       d  g[        U5      $ s  snf )aW  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)ra   rb   r   )r^   r9  rL   filtereds       rM   r/  !OpenTelemetry._team_metadata_json  sO     %&&e</;L|e|OCsO|L(## Ms
   	A	Ac                    U R                   (       a  gU R                  R                  nUcw  U R                  S;   ag  [        R
                  =(       d    0 R                  S5      =(       d    0 n[        U[        5      (       a  UR                  S5      OSnUb  [        U5      n[        U5      u  U l        U l        SU l         g)zResolve the include/exclude filter once, falling back to the proxy's
callback_settings.otel.attributes when no explicit config was passed.N)Nr   r   rg   T)r   r   rg   r   r)   callback_settingsre   ra   rb   rf   rt   r   r   )r   rg   otel_settingsraws       rM   r   -OpenTelemetry._ensure_metric_attribute_filter  s     ,,[[++
$"4"4"F$66<"AA&IORM mT22 !!,/ 
 ;C@
 -Z8	
%%,0)r]   attrsc                 l   U R                   (       d  U R                  5         U R                  b6  UR                  5        VVs0 s H  u  p#X R                  ;   d  M  X#_M     snn$ U R                  b6  UR                  5        VVs0 s H  u  p#X R                  ;  d  M  X#_M     snn$ U$ s  snnf s  snnf rk   )r   r   r   r  r   )r   rB  kvs       rM   _filter_metric_attributes'OpenTelemetry._filter_metric_attributes  s    00002$$0%*[[]U]TQa;T;T6TDAD]UU$$0!&!.!;T;T2T   Vs   B*B*B0B0c                 \   XC-
  R                  5       nUR                  S5      =(       d    0 nUR                  SS5      nU R                  (       a  U R                  U5      OSUUR                  S5      SS.nUR                  S5      n	[	        U	S	S 5      =(       d    U	=(       d    0 R                  S	0 5      n
[
         HX  nU
R                  U5      nUc  M  [        U[        [        45      (       a  [        U5      US
U 3'   MG  [        U5      US
U 3'   MZ     [	        U	SS 5      =(       d    U	=(       d    0 R                  S0 5      nU(       a  [        U5      US'   U R                  U5      nU R                  (       a  U R                  R                  XXS9  U(       a  UR                  S5      =n(       a}  U R                  (       al  0 UE[        S0En0 UE[        S0EnU R                  R                  UR                  SS5      US9  U R                  R                  UR                  SS5      US9  UR                  S5      nU R                   (       a!  U(       a  U R                   R                  UUS9  U R#                  X5        U R%                  XXEU5        U R'                  XU5        g )Nr  custom_llm_providerUnknownchatr-  r)   )rC   rD   rE   rF   r  r  rI   rG   rg   usageinputoutputprompt_tokensr   completion_tokensresponse_cost)total_secondsre   r  _gen_ai_operation_namer   rA   ra   rb   r   r   rZ   rF  rI  recordrJ  rB   rK  "_record_time_to_first_token_metric$_record_time_per_output_token_metric _record_response_duration_metric)r   r   rk  rl  rm  
duration_sparamsr   common_attrsr"  r#  rL   r^   rG   rM  in_attrs	out_attrscosts                     rM   r  OpenTelemetry._record_metrics  s}   +::<
,-3::3Y?
 ;; ++F3%$*JJw$7 )	
 **67Wj$/VGMr3F3FzSU3V'CFF3KE}%$..2<U2Cy./25e*y./ (  $? 
GMrCVCVRD
 ,6},EL)55lC--..55 6  *..w77U7//JlJ,@'JL|L-A8L	++22IIoq1h 3  ++22II115) 3  zz/*D  '''F 	//E11(	
 	--fMr]   valc                 z   U c  g[        U [        5      (       a  U R                  5       $ [        U [        [        45      (       a  [	        U 5      $  [        R
                  " U S5      R                  5       $ ! [         a:     [        R
                  " U S5      R                  5       s $ ! [         a      gf = ff = f)z+Convert datetime/float/string to timestamp.Nz%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%S)ra   r   	timestampr  r  strptimerc   )r`  s    rM   _to_timestampOpenTelemetry._to_timestamp  s    
 ;c8$$==?"cC<((:	$$S*@AKKMM 	((.ABLLNN 	s0   $A6 6
B:$B(%B:(
B62B:5B66B:r[  c                 b   UR                  S0 5      nUR                  SS5      nU R                  (       a  U(       d  gUR                  SS5      nUR                  SS5      nUbK  UbG  U R                  U5      nU R                  U5      nUb  Uc  gX-
  n	U R                  R                  XS9  ggg)z@Record Time to First Token (TTFT) metric for streaming requests.optional_paramsstreamFNapi_call_start_timecompletion_start_timerL  )re   rL  rd  rU  )
r   r   r[  rg  is_streamingri  rj  api_call_start_tscompletion_start_tstime_to_first_token_secondss
             rM   rV  0OpenTelemetry._record_time_to_first_token_metric  s     **%6;&**8U;33 %jj)>E &

+BD I*/D/P $ 2 23F G"&"4"45J"K (,?,G*=*Q'//66+ 7  0Q*r]   rk  rY  c                 $   U R                   (       d  gSnU(       a)  UR                  S5      =n(       a  UR                  S5      nUb  US::  a  gUR                  SS5      nUR                  SS5      n	U R                  U5      n
U
c&  UnUS:  a  X-  nU R                   R                  XS9  gUb  U R                  U5      nUc  UnO&X-
  nO!U	b  U R                  U	5      nUc  UnOX-
  nOUnUS:  a  X-  nU R                   R                  XS9  gg)a  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)
NrM  rQ  r   rj  ri  rL  )rM  re   rd  rU  )r   r   rk  rm  rY  r[  rQ  rM  rj  ri  end_time_tsgeneration_time_secondstime_per_output_token_secondsrm  rl  s                  rM   rW  2OpenTelemetry._record_time_per_output_token_metric&  sa    44 !l&6&6w&??U? %		*= >$(9Q(> !'

+BD I$jj)>E ((2&0#&*+? . 55<<1 =   , #'"4"45J"K"**4'*5*K' , $ 2 23F G (*4'*5*I' '1#"Q&,C,W)1188- 9  'r]   c                 R   U R                   (       d  gUR                  SS5      nUc  gUR                  S5      =(       d    UnUc  [        R                  " 5       nU R	                  U5      nU R	                  U5      nUb  Uc  gXv-
  nUS:  a  U R                   R                  XS9  gg)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.
Nri  rm  r   rL  )rN  re   r   r  rd  rU  )	r   r   rm  r[  ri  	_end_timerl  rq  response_duration_secondss	            rM   rX  .OpenTelemetry._record_response_duration_metricl  s     00$jj)>E&
 JJz*6h	 I !../BC((3$(;$/$C!$q(--44) 5  )r]   c                  R    SSK Jn    SSKJn  X4$ ! [         a    SSKJn   X4$ f = f)zResolve ``(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)rc  rz  rd  r{  r   !opentelemetry.sdk._logs._internal)rz  r{  s     rM   _otel_log_typesOpenTelemetry._otel_log_types  s;     	7	9
 ((	  	 ((		s    &&c                 
   U R                   R                  (       d  g U R                  5       u  pEU R                  R	                  [
        5      nUR                  5       nUR                  S5      =(       d    0 R                  SS5      nU R                  (       a  U R                  UUUUUS9  g UR                  S/ 5       GH  n	U	R                  SS5      n
SUS	.nU
S
:X  a  U	R                  S5      (       a  U	S   US'   U R                  5       nU(       a  U	R                  S5      (       a  U	S   US'   U	R                  5       nU(       d  UR                  SS 5        U" U R                  [        R                  " 5       5      UR                   UR"                  UR$                  UR&                  SUUS9nUR)                  U5        GM     [+        UR                  S/ 5      5       GH  u  nnSUUUR                  S5      S.nUR                  S0 5      nU R                  5       nU(       a  UR                  S5      (       a  US   US'   UUR                  S5      SUR                  SS5      0S.nU(       a!  UR                  S5      (       a  US   US   S'   U" U R                  [        R                  " 5       5      UR                   UR"                  UR$                  UR&                  SUUS9nUR)                  U5        GM     g )Nr  rI  rJ  )r   rk  r   otel_logger
parent_ctxmessagesroleuserzgen_ai.content.prompt)
event_namerD   toolr  contentzgen_ai.promptINFO)rb  trace_idspan_idtrace_flagsseverity_numberseverity_textbodyrg   choiceszgen_ai.content.completionfinish_reason)r  rD   indexr  messagezmessage.content	assistant)r  r  r  )r   r   r}  rb  
get_loggerr+   get_span_contextre   r  _emit_inference_details_eventr  copyr   r  r   r  r  r  r  r  emit	enumerate)r   r   rk  r  SdkLogRecordrz  r  r  r   msgr  rB  capture_event_contentr  
log_recordidxchoicebody_msgs                     rM   r  !OpenTelemetry._emit_semantic_logs  s   {{(( (,';';'=$
 ++667JK**,
JJ/06B;;!9
 33..)!'% /   ::j"-C7766*D5!)E v~#''$--!$id$($:$:$<!$););),Yo&88:D(D)%++hlln5#,,"**&22 . 3 3$ 	J Z(5 .: %\%5%5i%DEKC9!)!'O!<	E zz)R0H$($:$:$<!$i)@)@+3I+>'(!'O!<"HLL$EFD
 %i)@)@-5i-@Y	*%++hlln5#,,"**&22 . 3 3$ 	J Z(; Fr]   r  c                 b    SSK Jn  U b  UR                  U 5      $ Ub  UR                  U5      $ U$ )u  
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   r"  )r0  r#  r  )r  r  r  r  s       rM   r  (OpenTelemetry._resolve_guardrail_context	  s;     	2--d33"--k::r]   r  c           
         U=(       d    0 nUR                  S5      nUc  gUR                  S5      nU(       d  gU Vs/ s H  n[        U[        5      (       d  M  UPM     nnU(       d  gU R                  U5      nU GH]  nUR                  S5      n	UR                  S5      n
U R	                  USUR                  S5      U	UR                  S5      5      (       d  M`  [
        R                  " 5       nU	b  [
        R                  " U	5      n[
        R                  " 5       nU
b  [
        R                  " U
5      nUR                  SU R                  U5      US	9nU R                  U[        R                  [        R                  R                  S
9  U R                  USUR                  S5      S
9  U R                  USUR                  S5      S
9  UR                  S5      nUb  UR!                  S[#        U5      5        UR                  S5      nUb  UR!                  S[#        U5      5        U R                  USUR                  S5      S
9  UR                  S5      nU(       a  UR!                  SU5        UR                  S5      nU(       a  UR!                  S[#        U5      5        U R%                  X5        UR'                  U R                  U5      S9  GM`     gs  snf )zb
Creates a span for Guardrail, if any guardrail information is present in standard_logging_object
r  Nr  rl  rm  	guardrailguardrail_nameguardrail_moder  r  masked_entity_countguardrail_responseguardrail_statusguardrail_actionviolation_categoriesguardrail_violation_categoriesr  )re   ra   rb   r  r  r   r  fromtimestampr  r  r  r   OPENINFERENCE_SPAN_KINDr   	GUARDRAILr^   set_attributer   r  r  )r   r   r  r'  guardrail_information_datainformationguardrail_information_listr  r  start_time_floatend_time_floatstart_time_datetimeend_time_datetimeguardrail_spanr  r  r  r  s                     rM   r  $OpenTelemetry._create_guardrail_span  s    2EKZZ%F
  $+%=%A%A#&
" *  :&
9+t, 9 	# &
 *"@@H%?!488F266zBN ??%))*:; %))*:;  "*,,.+&.&<&<=M&N# ()$,$:$:>$J!(33 ;;':; 4 N ###"::1;;AA $  ###$+//0@A $  ###$+//0@A $  #8";";<Q"R".,,):6I+J "7!:!:;O!P!-,,(*5G*H ###&+//0BC $   5889KL,,-?AQR $9#<#<=S#T # ,,4jAU6V 11.I4E(FG} &@&
s   K!K!c                    SSK JnJn  [        R                  " SUU R
                  5        U R                  US5      (       d,  [        R                  " SU R                  R                  5        g U R                  U5      u  pxU R
                  R                  (       a  S nS nUS L =(       d    [        S5      n	S n
U	(       a  U R                  U5      nU R                  U5      U R                  U5      US.nU R                  (       a  U R                   R"                  US'   UR$                  " S0 UD6n
U
R'                  U" UR(                  5      5        U R+                  XU5        U R-                  XS	9  U
R/                  U R                  U5      S
9  OWUR1                  5       (       aB  UR'                  U" UR(                  5      5        U R+                  XU5        U R-                  XS	9  U R3                  XUS9nU R5                  XS9  UbF  [7        US5      (       a4  UR8                  [:        :X  a  UR/                  U R                  U5      S
9  g g g g )Nr   r  zPOpenTelemetry Logger: Failure HandlerLogging kwargs: %s, OTEL config settings=%sfailurez=OpenTelemetry: skipping duplicate failure span for handler=%sr   r  r  r  r  r  r  rl   rJ   )r2  r  r  r   r   r   r  r   rV   r  r   r   r  r  r  r  r9  r  r  r  r  r  r  r  r  r  r  r  rl   r  )r   r   rk  rl  rm  r  r  _parent_contextr  r
  r  r  r  r  s                 rM   rs  OpenTelemetry._handle_failure  s*   :^KK	
 vy11  O'' ,0,B,B6,J);;11#"O
 &6%= &
+B
" %"&"D"DV"LK++F3"kk*5*+K
 77&*nn&;&;F#))8K8DOOF:#3#345l; ***DHHdkk(3H4  ,,.. ++F:3C3C,DE##$4lK..4D.T 77/ 8 
 	##6#I ((&11 %%)HH  $++h*? @ I 2 )r]   c                     SSK Jn  UR                  S5      nUb  UR                  U5        UR                  S5      nUc  gUR                  S5      nUc4  UR                  S5      nU(       a  U R	                  UUR
                  US9  gUR                  S	5      (       aE  U R	                  UUR                  US	   S9  US	   nUb   U R	                  U[        [        U5      S9  UR                  S
5      (       a  U R	                  UUR                  US
   S9  UR                  S5      (       a  U R	                  UUR
                  US   S9  UR                  S5      (       a  U R	                  UUR                  US   S9  UR                  S5      (       a  U R	                  UUR                  US   S9  gg! [        [        4 a     Nf = f! [         a*  n	[        R                   " S[#        U	5      5         Sn	A	gSn	A	ff = f)a)  
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  re   record_exceptionr  ERROR_MESSAGE
ERROR_CODE#HTTP_RESPONSE_STATUS_CODE_ATTRIBUTEr  rc   	TypeError
ERROR_TYPEERROR_LLM_PROVIDERERROR_STACK_TRACEr   r   r  rZ   )
r   r  r   r  r  r'  r  r  _error_code_valr   s
             rM   r  'OpenTelemetry._record_exception_on_span  sN   V	
 

;/I $%%i0 JP)J$ (/ !9 < <=P Q (488E	++!+99' , 
  !$$\22'''22+L9 (  #4L"A".//!% C"%o"6 0  !$$]33'''22+M: (  !$$_55'''55+O< (  !$$^44'''::+N; (  !$$[11'''99+K8 (  21 '	2 >  	$$FA 	sI   ?G AG 
<G F7 %CG 7G
G 	G

G 
H G<<Hc           
         SS K nSSKJn  U(       d  g  [        U5       H  u  pVUR	                  S5      nU(       d  M  UR
                  R                   SU 3nU R                  UU S3UR	                  S5      S9  U R                  UU S3UR	                  S	5      S9  U R                  UU S
3UR                  UR	                  S5      5      S9  M     g ! [         a*  n	[        R                  " S[        U	5      5         S n	A	g S n	A	ff = f)Nr   r   function.z.namerl   r  z.descriptionrE  z.parameters
parametersz1OpenTelemetry: Error setting tools attributes: %s)jsonlitellm.proxy._typesr   r  re   LLM_REQUEST_FUNCTIONSr^   r  dumpsr   r   r  rZ   )
r   r  toolsr  r   ir  r  prefixr   s
             rM   set_tools_attributes"OpenTelemetry.set_tools_attributesN  s   7	$U+88J/*@@FFGqL''!(%(",,v. ( 
 ''!(,/",,}5 ( 
 ''!(+.**X\\,%?@ ( ! ,*  	  CSV 		s   CC 
D
  DD
c                     Uc  g[        U[        [        [        [        45      (       a  U$  [        U5      $ ! [
         a     gf = f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
 ra   rZ   r   r  r  r   r   r^   s     rM   cast_as_primitive_value_type*OpenTelemetry.cast_as_primitive_value_typer  H     =ec4e455L	u: 		   
8 
AA
tool_callsc           	      6   SSK Jn  0 n[        U 5       H  u  p4UR                  S5      nU(       d  M  [        R
                  R                  5       nU H>  nUR                  U5      nU(       d  M  UUUR                  R                   SU SU 3'   M@     M     U$ )Nr   r  r  r  z.function_call.)	r  r   r  re   r   r[   keysLLM_COMPLETIONSr^   )	r  r   kv_pairsr  	tool_call	_functionr  rL   _values	            rM   _tool_calls_kv_pair!OpenTelemetry._tool_calls_kv_pair  s     	8#%'
3NC!j1I++002D"s+6  )99??@#oVYUZ[  4 r]   c           
          U R                   S:X  a  SSKJn  U" 5       R                  XU5        g U R                   S:X  a  SSKJn  UR                  XU5        g U R                   S:X  a  SSKJn  U" XU5        g SSK	J
n  UR                  S	0 5      nUR                  S
0 5      =(       d    0 n	UR                  S5      n
U
c  [        S5      eU
S   nUR                  5        H%  u  pU R                  USR                  U5      US9  M'     [!        U
SS 5      =(       d    U
=(       d    0 R                  S0 5      nU(       a  U R                  US[#        U5      S9  U R%                  UU
U	S9  U
R                  S5      nU(       a2  UR                  5        H  u  pUc  M
  U R                  USU 3US9  M      UR                  S5      (       a4  U R                  UUR&                  R(                  UR                  S5      S9  U R                  UUR*                  R(                  U
S   S9  U	R                  SS5      nU R,                  (       a  U R                  USUS9  O%U R                  UUR.                  R(                  US9  UR                  S5      (       a4  U R                  UUR0                  R(                  UR                  S5      S9  UR                  S5      (       a4  U R                  UUR2                  R(                  UR                  S5      S9  UR                  S5      (       a4  U R                  UUR4                  R(                  UR                  S5      S9  U R,                  (       a#  U R7                  X5        U R9                  X5        O>U R                  UUR:                  R(                  [=        UR                  SS5      5      S9  UR                  S5      (       a4  U R                  UUR>                  R(                  UR                  S5      S9  U(       a  UR                  S5      OS =(       d    U
R                  S5      nU(       a  U R                  US US9  U
R                  S!5      nU(       a  U R                  US"US9  U(       aJ  UR                  S5      (       a4  U R                  UUR@                  R(                  UR                  S5      S9  U=(       a    UR                  S#5      nU(       a  U R                  UURB                  R(                  UR                  S$5      S9  U R                  UURD                  R(                  UR                  S%5      S9  U R                  UURF                  R(                  UR                  S&5      S9  U RI                  5       (       d  g UR                  S'5      (       a  US'   nU RK                  UU5        UR                  S(5      (       aN  U RM                  UR                  S(5      5      nU R                  UURN                  R(                  [#        U5      S9  UR                  S)5      b  UR                  S)5      O3UR                  S*5      b  UR                  S*5      OUR                  S+5      nU(       az  [Q        U[<        5      (       a&  U R                  UURR                  R(                  US9  O?U RM                  U5      nU R                  UURR                  R(                  [#        U5      S9  U R,                  (       a  U RU                  U5      nO1U
R                  S5      S,:X  a  S-OU
R                  S5      =(       d    S-nU R                  UURV                  R(                  US9  U
R                  S.5      (       a4  U R                  UURX                  R(                  U
R                  S.5      S9  UGb  UR                  S/5      (       Ga  U R[                  UR                  S/5      5      nU R                  UUR\                  R(                  [#        U5      S9  / n[_        UR                  S/5      5       H>  u  nnUR                  S05      (       d  M  URa                  UR                  S05      5        M@     U(       a.  U R                  UURb                  R(                  [#        U5      S9  [_        UR                  S/5      5       H  u  nnUR                  S05      (       d  M  UR                  S15      nUR                  S25      nU(       d  MI  [d        Rg                  U5      nUR                  5        H  u  pU R                  UUUS9  M     M     g UR                  S35      (       GaX  UR                  S35      n U Ri                  U 5      n!U!(       a.  U R                  UUR\                  R(                  [#        U!5      S9  / nU  Hj  n"U Rk                  U"5      n#U#(       d  M  U#R                  S45      S5:X  d  M4  URa                  S6U#R                  S7S85      U#R                  S9S85      S:.05        Ml     U(       a?  [d        Rg                  U5      nUR                  5        H  u  pU R                  UUUS9  M     UR                  S;5      n$U$(       a0  U R                  UURb                  R(                  [#        U$/5      S9  g g g g ! [l         aL  n%U Ro                  U R                   =(       d    S<S=9  [p        Rr                  " S>[=        U%5      5         S n%A%g S n%A%ff = f)?N	langtracer   )LangtraceAttributesr  )LangfuseOtelLogger
weave_otel)set_weave_otel_attributesr  rg  r  r  z+standard_logging_object not found in kwargsr  zmetadata.{}r  rG   )r  r'  r  cost_breakdownzgen_ai.cost.r-  r  rI  rJ  zgen_ai.provider.name
max_tokenstemperaturetop_prh  Fr  r  zgen_ai.response.idlitellm_call_idzlitellm.call_idrM  total_tokensrQ  rP  r  r  system_instructionsinstructionssystem
completionrK  
request_idr  r  r  r  rO  rd   function_callr  rl   r  	arguments)rl   r  statusr0  )r   z0OpenTelemetry logging error in set_attributes %s):r   litellm.integrations.langtracer  set_langtrace_attributes+litellm.integrations.langfuse.langfuse_otelr  set_langfuse_otel_attributes%litellm.integrations.weave.weave_otelr  r  r   re   rc   r  r  formatr   r   r7  LLM_REQUEST_MODELr^   LLM_REQUEST_TYPEr  
LLM_SYSTEMLLM_REQUEST_MAX_TOKENSLLM_REQUEST_TEMPERATURELLM_REQUEST_TOP_P_set_semconv_request_attributes#_set_semconv_cache_token_attributesLLM_IS_STREAMINGrZ   LLM_USERLLM_RESPONSE_MODELGEN_AI_USAGE_TOTAL_TOKENSGEN_AI_USAGE_OUTPUT_TOKENSGEN_AI_USAGE_INPUT_TOKENSr  r  0_transform_messages_to_otel_semantic_conventionsGEN_AI_INPUT_MESSAGESra   GEN_AI_SYSTEM_INSTRUCTIONSrT  GEN_AI_OPERATION_NAMEGEN_AI_REQUEST_ID/_transform_choices_to_otel_semantic_conventionsGEN_AI_OUTPUT_MESSAGESr  r   GEN_AI_RESPONSE_FINISH_REASONSr   r  '_transform_responses_api_output_to_otel_to_dictr   handle_callback_failurer   r  )&r   r  r   rk  r  r  r  r   rg  r  r'  r  rL   r^   rG   r  r   response_idr  rM  r  transformed_messagesr  transformed_system_instructionsoperation_nametransformed_choicesfinish_reasonsr  r  r  r  r  output_itemsoutput_messagesout_itemitem_dr  r   s&                                         rM   r  OpenTelemetry.set_attributes  s   ~	!![0N#%>>, ##6 #??, ##|3 *$E;$jj):B?O#ZZ(8"=CNIO)J$ (/ !NOO 0
;H&nn.
''=#7#7#<E (  / $(/4 K*0b55orJ  '''$]3 (  33)A- 4  7O6R6R 7N "0"6"6"8JC(//!%".se 4"' 0  #9 zz'""''&88>> **W- (  ##"3399.{; $  +../DiPM 77''.' (  ''&1177' (  ""<00''&==CC)--l; (  ""=11''&>>DD)--m< (  ""7++''&88>>)--g6 (  77 44TK88X''&77==o11(EBC (  ""6**''&//55)--f5 (  +7  &D4)--d3  '',% (  7::;LMO'')) (   0 0 9 9''&99??&**73 (  !>\%5%5g%>E''&@@FF))N3 (  ''&AAGG))$78 (  ''&@@FF))O4 (  ((**""7++'0))$6zz*%%II

:. %
 ''&<<BB$%9: (  ::34@ 

01 zz.1= JJ~.H-   #1377++!*EEKK1 ,  MM/ 4
 ++!*EEKK()HI ,  77!%!<!<V!D 033K@LP 155kBLf 
 ##"88>>$ $  (++L99''&88>>266|D (  '##I..LL(,,Y7 (
 ++!*AAGG()<= ,  &(N'01A1A)1L'MV!::o66*11&**_2MN (N &//!% . M M S S",^"< 0  (11A1A)1L'MV!::o66&,jj&;G)0\)BJ)z+8+L+LZ+X2:..2BJC$($;$;-1,/.3 %< %& 3C (N "%%h//
 $0#3#3H#=L&*&R&R$'O '//!% . E E K K",_"= 0  "$J$0!%x!8!6fjj&8O&K&--$.06

620F5;ZZR5P1&!" %1 "#0#D#DZ#P*2..*:JC 33%)$'&+ 4  +; *--h7F//!% . M M S S",fX"6 0  Y 0M (r  	(("00CO )  $$BCF 		s`   -k1 (k1 k1 9Dk1 Pk1 1Kk1  Bk1 'k1 <Ak1  Bk1 k1 &Ck1 1
m;Ammc                     Uc  g[        U[        [        [        [        45      (       a  U$  [        U5      $ ! [
         a     gf = fr  r  r  s     rM   _cast_as_primitive_value_type+OpenTelemetry._cast_as_primitive_value_type
  r  r  rL   c                 H    U R                  U5      nUR                  X$5        g)zO
Safely sets an attribute on the span, ensuring the value is a primitive type.
N)r1  r  )r   r  rL   r^   primitive_values        rM   r   OpenTelemetry.safe_set_attribute+
  s"     <<UC30r]   r  c                 >   [        U[        5      (       a
  SSUS./S./$ / nU H  nUR                  SS5      nUR                  SS5      n/ n[        U[        5      (       a  UR                  SUS.5        Oc[        U[        5      (       aN  U HH  n[        U[
        5      (       a  UR                  U5        M+  UR                  S[        U5      S.5        MJ     XFS.nS	U;   a  US	   US	'   S
U;   a  US
   US
'   SU;   a  US   US'   UR                  U5        M     U$ )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rd   r  r  partsr  r  r  r  r  r  tool_call_id)ra   rZ   re   r   r   rb   )	r   r  transformedr  r  r  r:  parttransformed_msgs	            rM   r  >OpenTelemetry._transform_messages_to_otel_semantic_conventions2
  s,    h$$ %'-(CD  C7766*Dggi,GE'3''fABGT**#D!$--T*fT%KL	 $ (,<Os{(+D	%s"03L0A-$25n2E//- 0 r]   r  c                     / nU H_  nUR                  S5      =(       d    0 nUR                  S5      nU R                  U/5      S   nU(       a  XVS'   UR                  U5        Ma     U$ )zO
Transforms choices into OTEL GenAI 1.38 compliant format for output.messages.
r  r  r   )re   r  r   )r   r  r<  r  r  r  r>  s          rM   r  =OpenTelemetry._transform_choices_to_otel_semantic_conventions]
  st     Fjj+1rG"JJ7M"SS	O 3@0/  r]   c                     [        U [        5      (       a  U $ [        U S5      (       a  U $ [        U S5      (       a  U R                  5       $ g)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.
re   
model_dumpN)ra   rb   r  rC  )objs    rM   r#  OpenTelemetry._to_dictq
  sE     c4  J3J3%%>>##r]   rO  c                    / nU GHF  nU R                  U5      nUc  M  UR                  S5      S:X  a  UR                  SS5      n/ nUR                  S/ 5       H_  nU R                  U5      nUc  M  UR                  S5      S:X  d  M0  UR                  SS5      n	U	(       d  MK  UR                  SU	S	.5        Ma     U(       a  UR                  XVS
.5        M  M  UR                  S5      S:X  d  M  SUR                  SS5      UR                  SS5      S.n
UR                  S5      (       a  US   U
S'   UR                  SU
/S
.5        GMI     U$ )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``.
rd   r  r  r  r  output_textr7  r  r8  r9  r  r  rl   r  )rd   rl   r  call_idr  )r#  re   r   )r   rO  r<  raw_itemry   r  r:  raw_contentr  r7  r=  s              rM   r"  5OpenTelemetry._transform_responses_api_output_to_otel
  s@   " H==*D|xx9,xx4#'88Ir#:K"mmK8G {{6*m;&{{6264!LL&T)JK $; &&'EF &!_4 ( HHVR0!%+r!:
 88I&&!%iDJ""K4&#IJ5 6 r]   c                 H    UR                  S0 5      =(       d    0 nUR                  SS5      nUR                  S5      nUR                  S0 5      =(       d    0 nUR                  S5      nU(       aE  [        U[        5      (       a0  UR                  5        H  u  pU R	                  USU SU	 3U
S	9  M     U(       a]  [        U[
        5      (       aG  S
S Kn UR                  U5      nUR                  5        H  u  pU R	                  USU SU	 3U
S	9  M     g g g ! UR                   a=    [        R                  " SR                  U5      5        U R	                  USU S3US	9   g f = f! [         a*  n[        R                  " S[        U5      5         S nAg S nAff = f)Nr  rI  rJ  original_responseadditional_argscomplete_input_dictzllm.r  r  r   zglitellm.integrations.opentelemetry.py::set_raw_request_attributes() - raw_response not json string - {}z.stringified_raw_responsez<OpenTelemetry logging error in set_raw_request_attributes %s)re   ra   rb   r  r  rZ   r  loadsJSONDecodeErrorr   r   r  r   r  )r   r  r   rk  r  rI  _raw_response_additional_argsrO  paramr`  r  r   s                rM   r  (OpenTelemetry.set_raw_request_attributes
  s   7	
 $ZZ(8"=CN"0"4"45JI"V"JJ':;M%zz*;R@FB"2"6"67L"M #z2Et'L'L"5";";"=JE++!"#6"7q@! ,  #> M3!?!?$(JJ}$=M&3&9&9&;
//!%"&':&;1UG D"% 0  '< "@} ++ "(( B  I  I) ++!"#6"77PQ+ ,   	$$NA 	s8   CE- AD A
E*'E- )E**E- -
F!7 FF!c                     Uc/  [        [        R                  " 5       R                  5       S-  5      $ [	        U[         [
        45      (       a  [        US-  5      $ [        UR                  5       S-  5      $ )Nr  )r  r   r  rb  ra   r  )r   dts     rM   r  OpenTelemetry._to_ns
  s[    :x||~//1C788b3,''rCx= 2<<>C'((r]   c                    UR                  S0 5      nUR                  S5      =(       d    0 nUR                  S5      nU(       a  U$ U R                  (       a0  UR                  S5      =(       d    SnU R                  U5       SU 3$ [        $ )Nr  r  r  r-  rs    )re   r  rT  LITELLM_REQUEST_SPAN_NAME)r   r   r  r  r  r-  s         rM   r  OpenTelemetry._get_span_name
  s    $4b9!%%j17R",,'89""33JJw'49E11&9:!E7CC((r]   c                 z    Uc  g UR                  SS 5      nUc  g SSKJn  U" 5       nSU0nUR                  US9nU$ )Ntraceparentr   TraceContextTextMapPropagatorcarrier)re   ,opentelemetry.trace.propagation.tracecontextr`  extract)r   r   _traceparentr`  
propagatorrb  r  s          rM   get_traceparent_from_header)OpenTelemetry.get_traceparent_from_header  sU    ?{{=$7	
 34
 ,/$,,W,=r]   r  c           	      &   SSK JnJn  SSKJn  UR                  S0 5      =(       d    0 nUR                  S0 5      =(       d    0 nUR                  S0 5      =(       d    0 nUR                  SS 5      n	UR                  S0 5      =(       d    0 n
U
R                  S	S 5      nUc-  UR                  S
0 5      =(       d    0 nUR                  S	S 5      nUb)  [        R                  " S5        UR                  U5      S 4$ U	b0  [        R                  " S5        SU	0nU" 5       R                  US9S 4$  UR                  5       nUb  UR                  5       nUR                  (       ab  [        R                  " SU[        UR                  S5      [        UR                  S5      UR!                  5       5        UR#                  5       U4$ [        R                  " S5        g! [$         a*  n[        R                  " S['        U5      5         S nANFS nAff = f)Nr   )r  r#  r_  r  proxy_server_requestr   r^  r  r  r  z7OpenTelemetry: Using explicit parent span from metadataz?OpenTelemetry: Using traceparent header for context propagationra  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 spanri   )r0  r  r#  rc  r`  re   r   r   r  rd  get_current_spanr  is_validr  r  r  r  get_currentr   rZ   )r   r   r  r  r#  r`  r  rj  r   r^  r  r  r  rb  current_spanspan_contextr   s                    rM   r  OpenTelemetry._get_span_context  s   0	
  $4b9?R-112H"MSQS&**9b9?Rkk-6"&&z26<"	$==)CTJ
 # . 2 23Er J Pb0445OQUV '  I ,,-=>DD "  Q %k2G-/777H 	 113L'+<<>(("((}$|44f=|33V<$113 #..0,>> 	H	
   	  ?Q 	s   /BG 
H& HHc                    SSK JnJnJnJn  [
        R                  " SU R                  U R                  U R                  5        [        R                  U=(       d    U R                  S9nU(       a\  [
        R                  " SUR                  5        VVs0 s H(  u  pxU[        [        U5      5      S:  a  US S S-   OU_M*     snn5        O[
        R                  " S5        [        U R                  S	5      (       a<  [
        R                  " S
U R                  5        U" [!        XPR                  5      5      $ U R                  S:X  a.  [
        R                  " SU R                  5        U" U" 5       5      $ U R                  S:X  d   U R                  S:X  d  U R                  S:X  aP   SSKJn	  [
        R                  " SU R                  5        U R)                  U R                  S5      nU" U	" XS95      $ U R                  S:X  d  U R                  S:X  aP   SSKJn  [
        R                  " SU R                  5        U R)                  U R                  S5      nU" U" XS95      $ [
        R                  " SU R                  5        U" U" 5       5      $ s  snnf ! [&         a  n
['        S5      U
eS n
A
ff = f! [&         a  n
['        S5      U
eS n
A
ff = f)Nr   )BatchSpanProcessorConsoleSpanExporterSimpleSpanProcessorr"   zvOpenTelemetry Logger, initializing span processor 
self.OTEL_EXPORTER: %s
self.OTEL_ENDPOINT: %s
self.OTEL_HEADERS: %sr   z=[OTEL DEBUG] Creating span processor with DYNAMIC headers: %s   z...z8[OTEL DEBUG] Creating span processor with GLOBAL headersexportzDOpenTelemetry: 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.exportrt  ru  rv  r"   r   r   r   r   r   r   r  r  lenrZ   r  r   5opentelemetry.exporter.otlp.proto.http.trace_exporterr|  r   _normalize_otel_endpoint5opentelemetry.exporter.otlp.proto.grpc.trace_exporter)r   r  rt  ru  rv  r"   _split_otel_headersrD  rE  OTLPSpanExporterHTTPexcnormalized_endpointOTLPSpanExporterGRPCs                rM   r,  !OpenTelemetry._get_span_processorX  s   	
 	
 	 H		
 ,CC#8t'8'8 D 
   O !4 9 9 ; ; SVr)9q"v~q@ ;   J 
 
   V"" 'tL:L:L'MNN*  Z"" &&9&;<<+-!!_4!![0   W"" #'"?"?""H# &$0 
 ;.$2D2D2N   W"" #'"?"?""H# &$0    Z"" &&9&;<<aD  !I .  !W s6   /J)J J: 
J7&J22J7:
KKKc                 `   [         R                  " SU R                  U R                  U R                  5        [
        R                  U R                  5      nU R                  U R                  S5      n[         R                  " SU R                  U5        [        U R                  S5      (       a-  [         R                  " SU R                  5        U R                  $ [        R                  " S5      nU R                  S:X  d  US:X  a.  SS	KJn  [         R                  " S
U R                  5        U" 5       $ U R                  S:X  d   U R                  S:X  d  U R                  S:X  a.  SSKJn  [         R                  " SU R                  U5        U" X!S9$ U R                  S:X  d  U R                  S:X  a/   SSKJn  [         R                  " SU R                  U5        U" X!S9$ [         R"                  " SU R                  5        SS	KJn  U" 5       $ ! [          a  n[!        S5      UeSnAff = f)z>
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 %sry  zDOpenTelemetry: Using custom log exporter. Value of OTEL_EXPORTER: %sOTEL_LOGS_EXPORTERr~   r   )ConsoleLogExporterzEOpenTelemetry: Using console log exporter. Value of OTEL_EXPORTER: %sr   rz  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   re  r  4opentelemetry.exporter.otlp.proto.http._log_exporterr  4opentelemetry.exporter.otlp.proto.grpc._log_exporterr   r   )r   r  r  otel_logs_exporterr  r  r  s          rM   r\  OpenTelemetry._get_log_exporter  s    	 F		
 ,CCDDUDUV #;;D<N<NPVWB	
 4%%x00  V"" %%%YY';<*.@I.MI  W"" &''+-!!_4!![0   b""#
 #,  ;.$2D2D2N   b""#
 #,  ""{"" J%''+  !W s   6H 
H-H((H-c                    SSK Jn  SSKJnJnJn  [        R                  " SU R                  U R                  U R                  5        [        R                  U R                  5      nU R                  U R                  S5      nU R                  S:X  a  U" 5       nU" USS9$ U R                  S	:X  d   U R                  S
:X  d  U R                  S:X  a   SSKJn  U" UUXR                   0S9nU" USS9$ U R                  S:X  d  U R                  S:X  a!   SSKJn  U" UUXR                   0S9nU" USS9$ [        R&                  " SU R                  5        U" 5       nU" USS9$ ! [$         a  n	[%        S5      U	eSn	A	ff = f)z?
Get the appropriate metric reader based on the configuration.
r   )	Histogram)AggregationTemporalityConsoleMetricExporterPeriodicExportingMetricReaderztOpenTelemetry Logger, initializing metric reader
self.OTEL_EXPORTER: %s
self.OTEL_ENDPOINT: %s
self.OTEL_HEADERS: %sr<  r~   i  )export_interval_millisr   rz  r{  )OTLPMetricExporter)r   r   preferred_temporalityr  r  zOpenTelemetry 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)rO  r   opentelemetry.sdk.metrics.exportr  r  r  r   r   r   r   r   r   r  r  6opentelemetry.exporter.otlp.proto.http.metric_exporterr  DELTA6opentelemetry.exporter.otlp.proto.grpc.metric_exporterr   r   )
r   r  r  r  r  r  r  r   r  r  s
             rM   r@   OpenTelemetry._get_metric_reader  s    	8	
 	
 	 F		
 ,CCDDUDUV";;	
 *,.H0RVWW +-!!_4!![0 *,+'02N2N&OH
 1RVWW;.$2D2D2N *,+'02N2N&OH
 1RVWW ""~"" -.H0RVWW'  !W s   E! !
E<+E77E<r   signal_typec                    U(       d  U$ 1 SknX#;  a  [         R                  " SUU5        U$ UR                  S5      nUS:X  a  SU;   a  U$ SU 3nUR                  U5      (       a  U$ X21-
  nU H=  nSU 3nUR                  U5      (       d  M   UR	                  SS5      S   SU 3-   nUs  $    UR                  S	5      (       d  X-   nU$ USU 3-   nU$ )
a2  
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   z/v1)r   r   rstripendswithrsplit)r   r   r  valid_signalstarget_pathother_signalsother_signal
other_paths           rM   r  &OpenTelemetry._normalize_otel_endpointX  s   < O 6+""B	 O ??3' ("'78'CO [M*[))O &5)L~.J  ,,#??3215!K=8II	 *   ''-H   Ak]"33Hr]   r   c                     0 nU (       a`  [        U [        5      (       a4  U R                  S5      nU H  nUR                  SS5      u  pEXQU'   M     U$ [        U [        5      (       a  U nU$ )zI
Convert a string or dictionary of headers into a dictionary of headers.
rv   =r  )ra   rZ   rw   rb   )r   r  r:  r=  rL   r^   s         rM   r  %OpenTelemetry._get_headers_dictionary  sq     /1'3''  c*!D!%C!3JC/4, "
 #" GT**&-#""r]   logging_payloadc                 ~  #    SSK Jn  SSKJnJn  SnSnUR
                  nUR                  n	[        U[        5      (       a  [        US-  5      nOU R                  U5      n[        U	[        5      (       a  [        U	S-  5      nOU R                  U	5      nUGb!  UR                  n
U R                  R                  U
UR                  U5      US9nUR                  nUb-  UR!                  5        H  u  pU R#                  USU 3US9  M     UR$                  nUb-  UR!                  5        H  u  pU R#                  USU 3US9  M     UR'                  U" UR(                  5      5        UR+                  US	9  U R-                  US
5        UR'                  U" UR(                  5      5        UR+                  US	9  g g 7f)Nr   r"  r  r  r  request.r  z	response.r  r  )r0  r#  r2  r  r  rl  rm  ra   r  r  r  router7  r  r  r  r  r  r  r  r  r  r  )r   r  r  r#  r  r  r  r  rl  rm  r  management_endpoint_span_request_datarL   r^   	_responses                   rM   &async_management_endpoint_success_hook4OpenTelemetry.async_management_endpoint_success_hook  s    
 	(:$//
"++j%(( c!12N![[4Nh&&x#~.L;;x0L'(..J'+{{'='=112BC) (> ($ ,88M("/"5"5"7JC++5&se,# ,  #8 (00I$"+//"3JC++5'u-# ,  #4 %//z}}0EF$((,(? 334DcJ''z}}(=>  , 7A (s   F;F=c                   #    SSK Jn  SSKJnJn  SnSnUR
                  nUR                  n	[        U[        5      (       a  [        [        U5      S-  5      nOU R                  U5      n[        U	[        5      (       a  [        [        U	5      S-  5      nOU R                  U	5      nUGb#  UR                  n
U R                  R                  U
UR                  U5      US9nUR                  nUb-  UR!                  5        H  u  pU R#                  USU 3US9  M     UR$                  nU R#                  US['        U5      S9  UR)                  U" UR*                  5      5        UR-                  US	9  SS
KJn  UR3                  US9nUR)                  U" UR*                  5      5        U R5                  UUSU0S.S9  UR-                  US	9  g g 7f)Nr   r"  r  r  r  r  r  r  r  r  r  r  r  r  )r0  r#  r2  r  r  rl  rm  ra   r  r  r  r  r7  r  r  r  r  r  r  rZ   r  r  r  r  r  r  r  )r   r  r  r#  r  r  r  r  rl  rm  r  r  r  rL   r^   
_exceptionr  r  s                     rM   &async_management_endpoint_failure_hook4OpenTelemetry.async_management_endpoint_failure_hook  s    
 	(:$//
"++j%(( Z3!67N![[4Nh&&s8}s23L;;x0L'(..J'+{{'='=112BC) (> ($ ,88M("/"5"5"7JC++5&se,# ,  #8 )22J##-*o $ 
 %//z7G7G0HI$((,(? !< Q Q#- !R ! ''z/?/?(@A**%!+0CEV/W +    , 7U (s   GGc                     U R                   R                  [        U R                  U5      U R	                  US9U R
                  R                  S9$ )z6
Create a span for the received proxy server request.
rw  )rl   rl  r  r  )r7  r  r  r  rg  r9  SERVER)r   rl  r   s      rM   )create_litellm_proxy_request_started_span7OpenTelemetry.create_litellm_proxy_request_started_span2  sM     {{%%0{{:.44W4E&&	 & 
 	
r]   )url_pathr3  r  r3  c                ~    Uc  gU(       a  U R                  U[        US9  U(       a  U R                  U[        US9  gg)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  URL_PATH_ATTRIBUTEr.  )r   r  r  r3  s       rM   "set_proxy_request_route_attributes0OpenTelemetry.set_proxy_request_route_attributesB  sH     <##3EX#V##3: $  r]   status_codec                 N    Ub  Uc  gU R                  U[        [        U5      S9  g)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  r  r  )r   r  r  s      rM   r  0OpenTelemetry.set_response_status_code_attributeW  s2     <;.3k" 	  	
r]   r  c                     Ub  Uc  gSSK Jn  UR                  US9n[        U5      US'   U R	                  USSU00S9  g)	zStamp 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  rZ   r  )r   r  r  r  r  r  s         rM   record_error_attributes_on_span-OpenTelemetry.record_error_attributes_on_spanj  sk     <9,	
 8MM( N 
 +.k*:,'&&),?AR+S 	' 	
r]   	containerc                 Z   Ub  [        U[        5      (       d  gSnUR                  S5      nUR                  S5      n[        U[        5      (       a  U=(       d    0 R                  S5      OSUR                  S5      UR                  S5      4 H4  n[        U[        5      (       d  M  U=(       d    UR                  S5      nM6     Ub  Uc  g U R                  U5      nU R                  U5      nUb  Uc  gX-
  S-  n	U	S:  a  gU R                  U[        U	S	9  g! [         a     gf = f)
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  r  litellm_received_atg     @@r   r  )ra   rb   re   rd  r   r  #PREPROCESSING_DURATION_MS_ATTRIBUTE)
r   r  r  received_atfirst_handoff_lp_mdstart_tsend_tsduration_mss
             rM   r  2OpenTelemetry.set_preprocessing_duration_attribute  s,    <z)T::!&ABmm,-+5c4+@+@SYBOOJ'dMM*%MM,-
C
 #t$$)KSWW5J-K
 -"7	))+6H''6F v~(F2?3 	  	
  		s   "D 
D*)D*)r   r   r   r   rK  rb  rH  r   r   r   rI  rN  rM  rL  rJ  r8  r   r   r   r9  r7  )NNNNN)F)NNNN)r  NNNNrk   r   )krV   rW   rX   rY   r   r|   rZ   r   r   staticmethodr   r   r   r   r  r   r  r  r  r   r   r   rn  rt  rw  r|  r   r$   r   r   r  rb   r  r  r   r'   r  r  r   r  r%   r  r  r  r    r  objectr  r  r  ri  r  r  r  r  r	  r!   r7  r
   r/  r   r   rF  r  rd  rV  rW  rX  r}  r  r  r#   r  rs  r  r  r  r  r   r  r  r1  r  r  r  r#  r"  r  r  r  rg  r  r,  r\  r@  r  r  r&   r  r  r  r  r  r  r  r\   __classcell__)r   s   @rM   r   r   *  sl    15'+)-)-(,<2,-<2  }<2
 "#<2 "#<2 !<2 <2| 1&9 1 1AJ !&L L L\
$ 
x} .
s 
*
$ 

4 
"4?
B
<IIII ,07;59)-9<%9< #4.9< U8U?34	9<
 55129< !9<|  "+/7;59)-><%>< }>< #4.	><
 U8U?34>< 512>< !><J (,XGXG &XG *	XG
  }XGt"D"D c]"D 
	"DH * #	:.D .V .`<x~ <= =,0M	$"/ /v /$ /b<$ <T <@1 1D 1`;D45< # SM	
 
6
T 
4 
D 
FT Fd F(22 #92 	2
 
2h $3 $d3i $HSM $ $1*	tCH~ 	$sCx. 	?NB eHeS012	% & T 4DD smD 	D
 D DL)) %() 	)V ) )"^)d ^)@ smc] sm 
#	 (}Htn}H/7/@}H~OAb^d ^D ^@" "HU3c5;P5Q " 67	c3h *4 x} BeCsE<Q6R "1t 1# 1c 1)d4j#o.)	d)VDz	d( $  0-d -tDz -^8t 8t))"=htn =~e=8D> e=NR(hCXJF F47F	#FP #%T	*+#	c3h# #, ,088988 #4.88z ,0B89B8 #4.B8H

 
 
$	
( #'$(tn 3-	
 SM 
*
TN
19#
	
&
tn
 I&
 	

 

4)
TN)
/2)
	)
 )
r]   r   )[r   dataclassesr   r   r   typingr   r   r   r	   r
   r   r   r   r   r   r)   litellm._loggingr   r  r   r   "litellm.integrations.custom_loggerr   7litellm.integrations.opentelemetry_utils.gen_ai_semconvr   r   r   r   *litellm.litellm_core_utils.safe_json_dumpsr   litellm.secret_managers.mainr   r   litellm.types.servicesr   litellm.types.utilsr   r   r   r   r    r!   r  r"   _SpanExporterr2  r#   _Contextr$   _Spanr%   _Tracerr  r&   !_ManagementEndpointLoggingPayloadlitellm.proxy.proxy_serverr'   _UserAPIKeyAuthr   r6  r*   r+   r  r  r.  r  r  r0  r1  r2  r  r[  r  r  r  r  r  rA   rZ   r[   rB   ro   tuplerO   rR   rf   rt   rz   r|   r   rJ   r]   rM   <module>r     s   	 (     + <  B E 7  L715 MD7C< FHcM"G+,L?C/0N',-NPS-S'T$DFLN'*$Gii 2I> YY3Y? ii 5yA "A &A ##  &I #1 - 3 , - & $ & . 	 ) eCHo $ 0 c //8 >)=>>?	0 in 	 $- - -
# 2K 23
8IcN#Xin%==>>
F 
Fc 
F f
 f
 f
RC2
)< C2
r]   