
    j                    
   d dl Z d dlmZ d dlmZ d dlmZmZmZmZm	Z	m
Z
mZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZmZ erOd d
lmZ d dlmZ  d dlm!Z" d dlm#Z$ d dl%m&Z' d dl(m)Z* e
e"ef   Z!e
e$ef   Z#e
e ef   Ze
eef   Ze
e*ef   Z)e
e'ef   Z&neZ!eZ#eZeZ)eZ&eZ e jV                  dd      Z, e jV                  dd      Z- e jV                  dd      Z.dZ/dZ0d Z1e G d d             Z2 G d de      Z3y)    N)	dataclass)datetime)TYPE_CHECKINGAnyDictListOptionalUnioncast)verbose_logger)CustomLogger)
safe_dumps)ServiceLoggerPayload)ChatCompletionMessageToolCallCostBreakdownFunctionStandardCallbackDynamicParamsStandardLoggingPayload)SpanExporter)Context)Span)Tracer) ManagementEndpointLoggingPayload)UserAPIKeyAuthOTEL_TRACER_NAMElitellmLITELLM_METER_NAMELITELLM_LOGGER_NAMEraw_gen_ai_requestlitellm_requestc            	      4   ddl m} m} t        j                  dd      t        j                  dd      t        j                  dt        j                  dd            d}|j                  |      } |        }|j                         }|j                  |      }|S )	z
    Create a proper OpenTelemetry Resource that respects OTEL_RESOURCE_ATTRIBUTES
    while maintaining backward compatibility with LiteLLM-specific environment variables.
    r   )OTELResourceDetectorResourceOTEL_SERVICE_NAMEr   OTEL_ENVIRONMENT_NAME
productionOTEL_MODEL_ID)zservice.namezdeployment.environmentmodel_id)opentelemetry.sdk.resourcesr"   r#   osgetenvcreatedetectmerge)r"   r#   base_attributesbase_resourceotel_resource_detectorenv_resourcemerged_resources          {/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/litellm/integrations/opentelemetry.py_get_litellm_resourcer5   6   s    
 K
 		"5yA"$)),C\"RIIRYY':IF
	1O OOO4M 23)002L $)),7O    c                   z    e Zd ZU dZeeef   ed<   dZe	e   ed<   dZ
e	e   ed<   dZeed<   dZeed<   ed	        Zy)
OpenTelemetryConfigconsoleexporterNendpointheadersFenable_metricsenable_eventsc                    ddl m} t        j                  dt        j                  dd            }t        j                  dt        j                  d            }t        j                  dt        j                  d	            }t        j                  d
d      j	                         dk(  }t        j                  dd      j	                         dk(  }|dk(  r |  |             S  | |||||      S )z
        OTEL_HEADERS=x-honeycomb-team=B85YgLm9****
        OTEL_EXPORTER="otlp_http"
        OTEL_ENDPOINT="https://api.honeycomb.io/v1/traces"

        OTEL_HEADERS gets sent as headers = {"x-honeycomb-team": "B85YgLm96******"}
        r   )InMemorySpanExporterOTEL_EXPORTER_OTLP_PROTOCOLOTEL_EXPORTERr9   OTEL_EXPORTER_OTLP_ENDPOINTOTEL_ENDPOINTOTEL_EXPORTER_OTLP_HEADERSOTEL_HEADERS'LITELLM_OTEL_INTEGRATION_ENABLE_METRICSfalsetrue&LITELLM_OTEL_INTEGRATION_ENABLE_EVENTS	in_memory)r:   )r:   r;   r<   r=   r>   )6opentelemetry.sdk.trace.export.in_memory_span_exporterr@   r*   r+   lower)clsr@   r:   r;   r<   r=   r>   s          r4   from_envzOpenTelemetryConfig.from_env^   s    	
 99)299_i+P
 99:BIIo<VW))("))N*C
 II?IOOQ 	
 II>HNNP 	
 {" 4 677)'
 	
r6   )__name__
__module____qualname__r:   r
   strr   __annotations__r;   r	   r<   r=   boolr>   classmethodrO    r6   r4   r8   r8   V   sX    )2HeC%&2"Hhsm"!GXc]! ND M4$
 $
r6   r8   c                   n    e Zd Z	 	 	 	 	 dHdee   dee   dee   dee   dee   f
 fdZd Zd Z	d	 Z
d
 Zd Zd Zd Zd Z	 	 	 	 dIdedee   deeeef      deeeef      dee   f
dZ	 	 	 	 	 dJdedee   dee   deeeef      deeeef      dee   fdZ	 dKdedededee   fdZdedefdZdee   fdZd efd!Zd"edee   fd#Z d$ Z!d% Z"d& Z#d' Z$d(efd)Z%dee   d*ee&   fd+Z'd, Z(d(edefd-Z)d(efd.Z*deee+e,ef   fd/Z-e.d0e/e0   de1eef   fd1       Z2d(ed2ee   fd3Z3deee+e,ef   fd4Z4d(ed5ed6efd7Z5d(efd8Z6d9 Z7d: Z8d; Z9d< Z:dKd ee   fd=Z;d> Z<d?ee   d@edee   fdAZ=e.dBeeeef      de1eef   fdC       Z>	 dKdDe?dee   fdEZ@	 dKdDe?dee   fdFZAdedBedee   fdGZB xZCS )LOpenTelemetryconfigcallback_nametracer_providerlogger_providermeter_providerc                    |t         j                         }|| _        || _        | j                  j                  | _        | j                  j                  | _        | j                  j                  | _	        | j                  |       t        t        j                  dd            j                         }|dk(  radd l}|j!                  |j"                         |j%                  t&               |j%                  d      }	|	j)                  |j"                         t+        
| X  di | | j/                  |       | j1                  |       | j3                          y )N
DEBUG_OTELFalserI   r   )levelzopentelemetry.sdk.trace.exportrW   )r8   rO   rZ   r[   r:   rB   r;   rD   r<   rF   _init_tracingrS   r*   r+   rM   loggingbasicConfigDEBUG	getLoggerrP   setLevelsuper__init___init_metrics
_init_logs"_init_otel_logger_on_litellm_proxy)selfrZ   r[   r\   r]   r^   kwargs_debug_otelrd   otel_exporter_logger	__class__s             r4   rj   zOpenTelemetry.__init__   s    >(113F*![[11![[11 KK//?+"))L':;AAC& gmm4h' $+#4#45U#V  ))'--8 	"6">*(//1r6   c                    	 ddl m} dt
        j                  vr?t        d t
        j                  D              rt
        j                  j                  |        t        |d|        y# t        $ r t        j                  d       Y yw xY w)z
        Initializes OpenTelemetry for litellm proxy server

        - Adds Otel as a service callback
        - Sets `proxy_server.open_telemetry_logger` to self
        r   )proxy_serverzEProxy Server is not installed. Skipping OpenTelemetry initialization.Notelc              3   >   K   | ]  }t        |t                 y wN)
isinstancerY   ).0cbs     r4   	<genexpr>zCOpenTelemetry._init_otel_logger_on_litellm_proxy.<locals>.<genexpr>   s      :
8P"
2}--8Ps   open_telemetry_logger)
litellm.proxyrt   ImportErrorr   warningr   service_callbackallappendsetattr)rn   rt   s     r4   rm   z0OpenTelemetry._init_otel_logger_on_litellm_proxy   s~    	2 111c :
8?8P8P:
 7
 $$++D15t<  	""W 		s   A' 'BBc                    ddl m} ddlm} ddlm} |	 ddlm} |j                         }t        ||      s,t        j                  dt        |      j                         |}nVt        j                  d        |t                     }|j                  | j                                |j!                  |       n:t        j                  d
t        |      j                         |j!                  |       |j'                  t(              | _        || _        y # t"        $ rj}t        j                  d	t%        |              |t                     }|j                  | j                                |j!                  |       Y d }~d }~ww xY w)Nr   traceTracerProvider)SpanKind)ProxyTracerProviderz0OpenTelemetry: Using existing TracerProvider: %sz*OpenTelemetry: Creating new TracerProviderresourcezIOpenTelemetry: Exception checking existing provider, creating new one: %sz0OpenTelemetry: Using provided TracerProvider: %s)opentelemetryr   opentelemetry.sdk.tracer   opentelemetry.tracer   r   get_tracer_providerrx   r   debugtyperP   r5   add_span_processor_get_span_processorset_tracer_provider	ExceptionrS   
get_tracerLITELLM_TRACER_NAMEtracer	span_kind)rn   r\   r   r   r   r   existing_provideres           r4   rc   zOpenTelemetry._init_tracing   sS   ':0 ";C$)$=$=$?! ""35HI"((J./88 '8O #(()UV&4>S>U&VO#66t7O7O7QR--o>   B_%.. %%o6 &&':;!'  ;$$_F #1:O:Q"R2243K3K3MN))/::;s   B$D 	F
 A FF
c                    | j                   j                  sd | _        d | _        d | _        y ddlm} ddlm}m	} |ddl
m} ddlm}m} | j                  | j                   j                   d      } ||t"        j%                  | j                   j&                        ||j(                  i      }	 ||	d	      }
 ||
gt+               
      }|j-                  t.              }n|j-                  t.              }|j1                  |       |j3                  ddd      | _        |j3                  ddd      | _        |j3                  ddd      | _        y )Nr   )metrics)	HistogramMeterProvider)OTLPMetricExporter)AggregationTemporalityPeriodicExportingMetricReaderr   )r;   r<   preferred_temporalityi'  )export_interval_millis)metric_readersr   z gen_ai.client.operation.durationzGenAI operation durations)namedescriptionunitzgen_ai.client.token.usagezGenAI token usagez{token}zgen_ai.client.token.costzGenAI request costUSD)rZ   r=   _operation_duration_histogram_token_usage_histogram_cost_histogramr   r   opentelemetry.sdk.metricsr   r   6opentelemetry.exporter.otlp.proto.grpc.metric_exporterr    opentelemetry.sdk.metrics.exportr   r   _normalize_otel_endpointr;   rY   _get_headers_dictionaryr<   DELTAr5   	get_meterrP   set_meter_providercreate_histogram)rn   r^   r   r   r   r   r   r   normalized_endpoint_metric_exporter_metric_readermeters               r4   rk   zOpenTelemetry._init_metrics   s^   {{))15D.*.D'#'D )F !
 #'"?"?$$i#  2,%==dkk>Q>QR'02H2N2N&O 
 ; N + ./:O:QN #,,X6E #,,X6E"">2-2-C-C32 .D .
*
 ',&<&<,+ '= '
#
  %55+,  6  
r6   c                     | j                   j                  sy ddlm} ddlm} ddlm} |<t               } ||      }| j                         }|r|j                   ||              ||       y )Nr   )set_logger_provider)LoggerProvider)BatchLogRecordProcessorr   )rZ   r>   opentelemetry._logsr   opentelemetry.sdk._logsr   opentelemetry.sdk._logs.exportr   r5   _get_log_exporteradd_log_record_processor)rn   r]   r   OTLoggerProviderr   litellm_resourcelog_exporters          r4   rl   zOpenTelemetry._init_logs.  sh    {{((;NJ "46.8HIO113L88+L9 	O,r6   c                 ,    | j                  ||||       y rw   _handle_successrn   ro   response_obj
start_timeend_times        r4   log_success_eventzOpenTelemetry.log_success_eventD      V\:xHr6   c                 ,    | j                  ||||       y rw   _handle_failurer   s        r4   log_failure_eventzOpenTelemetry.log_failure_eventG  r   r6   c                 4   K   | j                  ||||       y wrw   r   r   s        r4   async_log_success_eventz%OpenTelemetry.async_log_success_eventJ       V\:xH   c                 4   K   | j                  ||||       y wrw   r   r   s        r4   async_log_failure_eventz%OpenTelemetry.async_log_failure_eventM  r   r   payloadparent_otel_spanr   r   event_metadatac                   K   ddl m} ddlm}m} d}	d}
t        |t              rt        |dz        }	n| j                  |      }	t        |t              rt        |dz        }
n| j                  |      }
||j                  }| j                  j                  ||j                  |      |	      }| j                  |d|j                         | j                  |d|j                  j                         |rL|j!                         D ]9  \  }}|d	}t        |t"              r	 t%        |      }| j                  |||       ; |j)                   ||j*                               |j-                  |
       y y # t&        $ r d
}Y Xw xY ww)Nr   r   Status
StatusCode    eAr   contextr   	call_typespankeyvalueserviceNonez0litellm logging error - could_not_json_serializer   )r   r   r   r   r   rx   floatint_to_nsr   r   
start_spanset_span_in_contextsafe_set_attributer   r   itemsdictrS   r   
set_statusOKend)rn   r   r   r   r   r   r   r   r   _start_time_ns_end_time_ns
_span_nameservice_logging_spanr   r   s                  r4   async_service_success_hookz(OpenTelemetry.async_service_success_hookP  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$E:/AF:FFFFerrorc                 b  K   ddl m} ddlm}m}	 d}
d}t        |t              rt        t        |      dz        }
n| j                  |      }
t        |t              rt        t        |      dz        }n| j                  |      }||j                  }| j                  j                  ||j                  |      |
      }| j                  |d|j                         | j                  |d|j                  j                         |r| j                  |d	|       |rH|j!                         D ]5  \  }}t        |t"              r	 t%        |      }| j                  |||       7 |j)                   ||	j*                               |j-                  |       y y # t&        $ r d
}Y Xw xY ww)Nr   r   r   r   r   r   r   r   r   z/litllm logging error - could_not_json_serializer   )r   r   r   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   r   rS   r   r   ERRORr   )rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                   r4   async_service_failure_hookz(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F/FAF/F,)F/+F,,F/request_dataoriginal_exceptionuser_api_key_dicttraceback_strc                 ,  K   ddl m} ddlm}m} |j
                  }||j                   ||j                               d}	| j                  j                  |	|j                  |            }
| j                  |
dt        |             |
j                   ||j                               |
j                  | j                  t        j                                       |j                  | j                  t        j                                       y y w)	Nr   r   r   zFailed Proxy Server Request)r   r   	exceptionr   r   )r   r   r   r   r   r   r   r   r   r   r   r   rS   r   r   r   now)rn   r  r  r  r  r   r   r   r   r   exception_logging_spans              r4   async_post_call_failure_hookz*OpenTelemetry.async_post_call_failure_hook  s      	(:,=='''z/?/?(@A6J &*[[%;%;112BC &< &" ##+,- $ 
 #--fZ5E5E.FG"&&HLLN0K&L   $++hlln*E F% (s   DDro   returnc                     | j                  |      }|)| j                  |      }t        j                  d|       |S | j                  }|S )a  
        Get the tracer to use for this request

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

        Returns:
            Tracer: The tracer to use for this request
        z*Using dynamic headers for this request: %s)%_get_dynamic_otel_headers_from_kwargs _get_tracer_with_dynamic_headersr   r   r   )rn   ro   dynamic_headerstracer_to_uses       r4   get_tracer_to_use_for_requestz+OpenTelemetry.get_tracer_to_use_for_request  sV     DDVL& AA/RM  <o  !KKMr6   c                 Z    |j                  d      }|sy| j                  |      }|r|S dS )z1Extract dynamic headers from kwargs if available. standard_callback_dynamic_paramsN)r  )getconstruct_dynamic_otel_headers)rn   ro   r  r  s       r4   r  z3OpenTelemetry._get_dynamic_otel_headers_from_kwargs  sE     JJ9: 	) 0==-M > 
 #2;t;r6   r  c                     ddl m}  |t                     }|j                  | j	                  |             |j                  t              S )zECreate a temporary tracer with dynamic headers for this request only.r   r   r   )r  )r   r   r5   r   r   r   r   )rn   r  r   temp_providers       r4   r  z.OpenTelemetry._get_tracer_with_dynamic_headers  sH    : '0E0GH(($$_$E	
 ''(;<<r6   r  c                      y)a  
        Construct dynamic headers from standard callback dynamic params

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

        Returns:
            dict: A dictionary of dynamic headers
        NrW   )rn   r  s     r4   r  z,OpenTelemetry.construct_dynamic_otel_headers  s     r6   c                    t        j                  d|| j                         | j                  |      \  }}| j	                  |||||      }| j                  |||||       | j                  ||       | j                  ||||       | j                  j                  r| j                  |||       |4|j                  | j                  t        j                                      y y )NzAOpenTelemetry Logger: Logging kwargs: %s, OTEL config settings=%sro   r   r   )r   r   rZ   _get_span_context_start_primary_span_maybe_log_raw_request_create_guardrail_span_record_metricsr>   _emit_semantic_logsr   r   r   r  )rn   ro   r   r   r   ctxparent_spanr   s           r4   r   zOpenTelemetry._handle_success0  s    OKK	

  11&9[ ''j(TWX 	##FL*hPTU 	##63#? 	V\:xH ;;$$$$V\4@ "OOT[[%@OA #r6   c                 F   ddl m}m} | j                  |      }|j	                  | j                  |      | j                  |      |      }	|	j                   ||j                               | j                  |	||       |	j                  | j                  |             |	S )Nr   r   r   r   r   r   )r   r   r   r  r   _get_span_namer   r   r   set_attributesr   )
rn   ro   r   r   r   r   r   r   otel_tracerr   s
             r4   r  z!OpenTelemetry._start_primary_spanL  s    :"@@H%%$$V,{{:. & 

 	z}}-.D&,7$++h/0r6   c                    ddl m} ddlm}m} t
        j                  s| j                  sy |j                  di       }	|	j                  d      xs i }
|
j                  d      }|r|nt        }| j                  |      }|j                  || j                  |      |j                  |            }|j                   ||j                               | j!                  |||       |j#                  | j                  |             y )	Nr   r   r   litellm_paramsmetadatageneration_namer#  r   )r   r   r   r   r   r   turn_off_message_loggingmessage_loggingr  RAW_REQUEST_SPAN_NAMEr  r   r   r   r   r   set_raw_request_attributesr   )rn   ro   r   r   r   r!  r   r   r   r(  r)  r*  raw_span_namer&  raw_spans                  r4   r  z$OpenTelemetry._maybe_log_raw_requestZ  s     	(: ++43G3G$4b9!%%j17R",,'89+:@U"@@H)){{:.--k: * 

 	F:==12''&,Gdkk(34r6   c                    ||z
  j                         }|j                  d      xs i }|j                  dd      }d||j                  d      dd}|j                  d      }	t        |	d	d       xs |	xs i j                  d	i       }
d
D ](  }|
j                  |      t        |
|         |d| <   * t        |	dd       xs |	xs i j                  di       }|rt	        |      |d<   | j
                  r| j
                  j                  ||       |r|j                  d      x}rv| j                  rji |ddi}i |ddi}| j                  j                  |j                  dd      |       | j                  j                  |j                  dd      |       |j                  d      }| j                  r!|r| j                  j                  ||       y y y )Nr(  custom_llm_providerUnknownchatmodelr   )zgen_ai.operation.namegen_ai.systemzgen_ai.request.modelzgen_ai.frameworkstandard_logging_objectr)  )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_metadataz	metadata.hidden_params)
attributesusagezgen_ai.token.typeinput
completionprompt_tokensr   completion_tokensresponse_cost)	total_secondsr  getattrrS   r   r   recordr   r   )rn   ro   r   r   r   
duration_sparamsprovidercommon_attrsstd_logmdr   rG  rI  in_attrs	out_attrscosts                    r4   r  zOpenTelemetry._record_metricst  s   +::<
,-3::3Y? &,%$*JJw$7 )	
 **67Wj$/VGMr3F3FzSU3V
C" vvc{&25bg,y./%
*  $? 
GMrCVCVRD
 ,6},EL)--..55| 6  *..w77U7//IlI,?IO|O-@,O	++22IIoq1h 3  ++22II115) 3  zz/*D  '''F %)r6   r   c                 @   | j                   j                  sy ddlm}m}m} ddlm}  |t              } |       }	t        |	dd       xs
 t               }
|j                         }|j                  d      xs i j                  dd      }|j                  dg       D ]  }|j                  d	d
      }d|d}|dk(  r|j                  d      r|d   |d<   | j                  r|j                  d      r|d   |d<    || j                  t        j                                |j"                  |j$                  |j&                  |j(                  d|j+                         |
|	      }|j-                  |        t/        |j                  dg             D ]  \  }}d|||j                  d      d}|j                  di       }| j                  r|j                  d      r|d   |d<   ||j                  d      d	|j                  d	d      id}| j                  r|j                  d      r|d   |d   d<    || j                  t        j                                |j"                  |j$                  |j&                  |j(                  d||
|	      }|j-                  |        y )Nr   )SeverityNumber
get_loggerget_logger_provider)	LogRecord	_resourcer(  r2  r3  messagesroleuserzgen_ai.content.prompt)
event_namer6  toolidcontentzgen_ai.promptINFO)		timestamptrace_idspan_idtrace_flagsseverity_numberseverity_textbodyr   rH  choiceszgen_ai.content.completionfinish_reason)rd  r6  indexrq  messagezmessage.content	assistant)rr  rq  rs  )rZ   r>   r   r\  r]  r^  r   r_  r   rP  r5   get_span_contextr  r,  r   r   r  rj  rk  rl  rh  copyemit	enumerate)rn   ro   r   r   r\  r]  r^  SdkLogRecordotel_loggerr]   r   
parent_ctxrT  msgrb  attrs
log_recordidxchoicebody_msgro  s                        r4   r  z!OpenTelemetry._emit_semantic_logs  st   {{((WWE !45 ./O[$7R;P;R 	 **,
JJ/06B;;!9

 ::j"-C7766*D#:XVEv~#''$-!$id##	(:),Yo&%++hlln5#,,"**&22 . 3 3$XXZ! 
J Z(' ., %\%5%5i%DEKC9!)!'O!<	E zz)R0H##Y(?+3I+>'(!'O!<"HLL$EFD
 ##Y(?-5i-@Y	*%++hlln5#,,"**&22 . 3 3$! 
J Z(; Fr6   r   c                    |xs i }|j                  d      }|y|j                  d      }|sy|D cg c]  }t        |t              r| }}|sy| j                  |      }|D ]V  }|j                  d      }	|j                  d      }
t	        j
                         }|	t	        j                  |	      }t	        j
                         }|
t	        j                  |
      }|j                  d| j                  |      |      }| j                  |d|j                  d      	       | j                  |d
|j                  d
      	       |j                  d      }||j                  dt        |             | j                  |d|j                  d      	       |j                  | j                  |             Y yc c}w )zr
        Creates a span for Guardrail, if any guardrail information is present in standard_logging_object
        r7  Nguardrail_informationr   r   	guardrailr#  guardrail_namer   guardrail_modemasked_entity_countguardrail_responser   )r  rx   r   r  r   r  fromtimestampr   r   r   set_attributer   r   )rn   ro   r   standard_logging_payloadguardrail_information_datainformationguardrail_information_listr&  r  start_time_floatend_time_floatstart_time_datetimeend_time_datetimeguardrail_spanr  s                  r4   r  z$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 ###$+//0@A $  ###$+//0@A $  #8";";<Q"R".,,):6I+J ###(+//0DE $  4E(FGQ &@&
s   F?c                 f   ddl m}m} t        j                  d|| j
                         | j                  |      \  }}| j                  |      }	|	j                  | j                  |      | j                  |      |      }
|
j                   ||j                               | j                  |
||       | j                  |
|       |
j                  | j                  |             | j!                  ||       |4|j                  | j                  t#        j$                                      y y )Nr   r   zPOpenTelemetry Logger: Failure HandlerLogging kwargs: %s, OTEL config settings=%sr#  )r   ro   r   r  )r   r   r   r   r   rZ   r  r  r   r$  r   r   r   r%  _record_exception_on_spanr   r  r   r  )rn   ro   r   r   r   r   r   _parent_contextr   r&  r   s              r4   r   zOpenTelemetry._handle_failureE  s   :^KK	

 -1,B,B6,J)) #@@H%%$$V,{{:.# & 

 	z//01D&,7 	&&D&@$++h/0 	##6?#K'  $++hlln*E F (r6   c                 l   	 ddl m} |j                  d      }||j                  |       |j                  d      }|y|j                  d      }|2|j                  d      }|r| j	                  ||j
                  |       y|j                  d	      r!| j	                  ||j                  |d	          |j                  d
      r!| j	                  ||j                  |d
          |j                  d      r!| j	                  ||j
                  |d          |j                  d      r!| j	                  ||j                  |d          |j                  d      r"| j	                  ||j                  |d          yy# t        $ r)}t        j                  dt        |             Y d}~yd}~ww xY w)aQ  
        Record exception information on the span using OTEL standard methods.

        This extracts error information from StandardLoggingPayload and:
        1. Uses span.record_exception() for the actual exception object (OTEL standard)
        2. Sets structured error attributes from StandardLoggingPayloadErrorInformation
        r   )ErrorAttributesr  Nr7  error_information	error_strr   
error_codeerror_classerror_messagellm_provider	tracebackz4OpenTelemetry: Error recording exception on span: %s)*litellm.integrations._types.open_inferencer  r  record_exceptionr   ERROR_MESSAGE
ERROR_CODE
ERROR_TYPEERROR_LLM_PROVIDERERROR_STACK_TRACEr   r   r  rS   )	rn   r   ro   r  r  r  r  r  r   s	            r4   r  z'OpenTelemetry._record_exception_on_spand  s   G	R 

;/I $%%i0 JP)J$ (/ !9 < <=P Q (488E	++!+99' , 
  !$$\2'''22+L9 (  !$$]3'''22+M: (  !$$_5'''55+O< (  !$$^4'''::+N; (  !$$[1'''99+K8 (  2  	$$FA 	s%   =F  AF C:F 	F3
F..F3c           
         dd l }ddlm} |sy 	 t        |      D ]  \  }}|j	                  d      }|s|j
                  j                   d| }| j                  || d|j	                  d             | j                  || d|j	                  d	             | j                  || d
|j                  |j	                  d                    y # t        $ r)}	t        j                  dt        |	             Y d }	~	y d }	~	ww xY w)Nr   SpanAttributesfunction.z.namer   r   z.descriptionr   z.parameters
parametersz1OpenTelemetry: Error setting tools attributes: %s)jsonlitellm.proxy._typesr  rx  r  LLM_REQUEST_FUNCTIONSr   r   dumpsr   r   r   rS   )
rn   r   toolsr  r  ire  r  prefixr   s
             r4   set_tools_attributesz"OpenTelemetry.set_tools_attributes  s   7	$U+488J/*@@FFGqL''!(%(",,v. ( 
 ''!(,/",,}5 ( 
 ''!(+.**X\\,%?@ ( ! ,*  	  CSV 		s   CC 	DD  Dc                     |yt        |t        t        t        t        f      r|S 	 t        |      S # t
        $ r Y yw xY wz
        Casts the value to a primitive OTEL type if it is not already a primitive type.

        OTEL supports - str, bool, int, float

        If it's not a primitive type, then it's converted to a string
         rx   rS   rU   r   r   r   rn   r   s     r4   cast_as_primitive_value_typez*OpenTelemetry.cast_as_primitive_value_type  E     =ec4e45L	u: 		   
2 	>>
tool_callsc           	         ddl m} i }t        |       D ]s  \  }}|j                  d      }|st        j
                  j                         }|D ]7  }|j                  |      }|s|||j                  j                   d| d| <   9 u |S )Nr   r  r  r  z.function_call.)	r  r  rx  r  r   rT   keysLLM_COMPLETIONSr   )	r  r  kv_pairsr  	tool_call	_functionr  r   _values	            r4   _tool_calls_kv_pairz!OpenTelemetry._tool_calls_kv_pair  s     	8#%'
3NC!j1I++002D"s+  )99??@#oVYUZ[  4 r6   r   c           
      D   	 | j                   dk(  rddlm} |j                  |||       y | j                   dk(  rddlm}  |       j                  |||       y | j                   dk(  rddlm} |j                  |||       y ddl
m} |j                  d	i       }|j                  d
i       xs i }	|j                  d      }
|
t        d      |
d   }|j                         D ](  \  }}| j                  |dj!                  |      |       * t#        |
dd       xs |
xs i j                  di       }|r| j                  |dt%        |             |
j                  d      }|r2|j                         D ]  \  }}|	| j                  |d| |       ! |j                  d      r7| j                  ||j&                  j(                  |j                  d             | j                  ||j*                  j(                  |
d          | j                  ||j,                  j(                  |	j                  dd             |j                  d      r7| j                  ||j.                  j(                  |j                  d             |j                  d      r7| j                  ||j0                  j(                  |j                  d             |j                  d      r7| j                  ||j2                  j(                  |j                  d             | j                  ||j4                  j(                  t7        |j                  dd                   |j                  d      r7| j                  ||j8                  j(                  |j                  d             |r4|j                  d      r#| j                  |d|j                  d             |rH|j                  d      r7| j                  ||j:                  j(                  |j                  d             |xr |j                  d      }|r| j                  ||j<                  j(                  |j                  d              | j                  ||j>                  j(                  |j                  d!             | j                  ||j@                  j(                  |j                  d"             tB        jD                  d#u ry | jF                  d#ury |j                  d$      r|d$   }| jI                  ||       |j                  d%      rtK        |j                  d%            D ]  \  }}|j                  d&      r=| j                  ||jL                  j(                   d'| d(|j                  d&             |j                  d)      sftO        |j                  d)      t6              st7        |j                  d)            |d)<   | j                  ||jL                  j(                   d'| d*|j                  d)              |4|j                  d+      r!tK        |j                  d+            D ]  \  }}|j                  d,      r=| j                  ||jP                  j(                   d'| d-|j                  d,             |j                  d.      sg|j                  d.      j                  d&      rL| j                  ||jP                  j(                   d'| d(|j                  d.      j                  d&             |j                  d.      j                  d)      rtO        |j                  d.      j                  d)      t6              s/t7        |j                  d.      j                  d)            |d.   d)<   | j                  ||jP                  j(                   d'| d*|j                  d.      j                  d)             |j                  d.      }|j                  d/      }|stR        jU                  |      }|j                         D ]  \  }}| j                  |||         y y y # tV        $ r)}tY        jZ                  d0t7        |             Y d }~y d }~ww xY w)1Narize_phoenixr   )ArizePhoenixLogger	langtrace)LangtraceAttributeslangfuse_otel)LangfuseOtelLoggerr  optional_paramsr(  r7  z+standard_logging_object not found in kwargsr)  zmetadata.{}r   rG  cost_breakdownzgen_ai.cost.r5  r   r2  r3  
max_tokenstemperaturetop_pstreamFrc  rf  zgen_ai.response.idrI  total_tokensrM  rL  Tr  ra  rb  r  z.rolerg  z.contentrp  rq  z.finish_reasonrs  r  z0OpenTelemetry logging error in set_attributes %s).r[   (litellm.integrations.arize.arize_phoenixr  set_arize_phoenix_attributeslitellm.integrations.langtracer  set_langtrace_attributes+litellm.integrations.langfuse.langfuse_otelr  set_langfuse_otel_attributesr  r  r  
ValueErrorr   r   formatrP  r   LLM_REQUEST_MODELr   LLM_REQUEST_TYPE
LLM_SYSTEMLLM_REQUEST_MAX_TOKENSLLM_REQUEST_TEMPERATURELLM_REQUEST_TOP_PLLM_IS_STREAMINGrS   LLM_USERLLM_RESPONSE_MODELLLM_USAGE_TOTAL_TOKENSLLM_USAGE_COMPLETION_TOKENSLLM_USAGE_PROMPT_TOKENSr   r+  r,  r  rx  LLM_PROMPTSrx   r  rY   r  r   r   r  )rn   r   ro   r   r  r  r  r  r  r(  r  r)  r   r   rG  r  rI  r  r  promptr  rs  r  r  r   s                            r4   r%  zOpenTelemetry.set_attributes   ss   n	!!_4W"??&, ##{2N#%>>&, ##6 #??&, ;$jj):B?O#ZZ(8"=CNIO)J$ (/ !NOO 0
;H&nn.
U''=#7#7#<E (  / $(/4 K*0b55orJ  ''?*]:S (  7O6R6RSc6dN"0"6"6"8JC(//!%".se 4"' 0  #9 zz'"''&88>> **W- (  ##"3399.{; $  ##"--33$(()>	J $  ""<0''&==CC)--l; (  ""=1''&>>DD)--m< (  ""7+''&88>>)--g6 (  ##"3399/--h>? $  ""6*''&//55)--f5 (   0 0 6''#7|?O?OPT?U ( 
  0 0 9''&99??&**73 (  !>\%5%5g%>E''&==CC))N3 (  ''&BBHH))$78 (  ''&>>DD))O4 (  //47##4/""7+'0))$6zz*%#,VZZ
-C#DKCzz&)//!%#1#=#=#C#C"DAcU% P"(**V"4 0  zz),)&**Y*?E03FJJy4I0JF9-//!%#1#=#=#C#C"DAcU( S"(**Y"7 0  $E& '##I.'01A1A)1L'MV!::o6 33%)'5'E'E'K'K&LAcUR`$a&,jj&A 4 
 "::i0%zz)488@ $ 7 7)-+9+I+I+O+O*PPQRUQVV[(\*0**Y*?*C*CF*K !8 !"
  &zz)488C'1$*JJy$9$=$=i$H#(" DG(.

9(=(A(A)(LD&F9$5i$@ !% 7 7)-+9+I+I+O+O*PPQRUQVV^(_*0**Y*?*C*CI*N !8 !" '-jj&;G)0\)BJ)+8+L+LZ+X2:..2BJC$($;$;-1,/.3 %< %& 3C? (N / (P  	$$BCF 	sR   (a- -a- (a- C;a- >M3a- 2a- B8a- :Da- Ea- &Aa- -	b6bbc                     |yt        |t        t        t        t        f      r|S 	 t        |      S # t
        $ r Y yw xY wr  r  r  s     r4   _cast_as_primitive_value_typez+OpenTelemetry._cast_as_primitive_value_type  r  r  r   r   c                 J    | j                  |      }|j                  ||       y)z_
        Safely sets an attribute on the span, ensuring the value is a primitive type.
        N)r  r  )rn   r   r   r   primitive_values        r4   r   z OpenTelemetry.safe_set_attribute  s$     <<UC30r6   c                 6   	 |j                  di        |j                  di       xs i }|j                  dd      }|j                  d      }|j                  di       xs i }|j                  d      }|rBt        |t              r2|j                         D ]  \  }	}
| j	                  |d| d	|	 |

       ! |rZt        |t
              rIdd l}	 |j                  |      }|j                         D ]  \  }	}
| j	                  |d| d	|	 |

       ! y y y # |j                  $ r? t        j                  dj                  |             | j	                  |d| d|
       Y y w xY w# t        $ r)}t        j                  dt        |             Y d }~y d }~ww xY w)Nr  r(  r2  r3  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)r  rx   r   r   r   rS   r  loadsJSONDecodeErrorr   r   r  r   r  )rn   r   ro   r   r(  r2  _raw_response_additional_argsr  paramvalr  r   s                r4   r.  z(OpenTelemetry.set_raw_request_attributes  s   1	JJ("-#ZZ(8"=CN"0"4"45JI"V"JJ':;M%zz*;R@FB"2"6"67L"M #z2Et'L"5";";"=JE3++!.A-B!E7'KSV ,  #> M3!?$(JJ}$=M&3&9&9&;
s//!%"&':&;1UG D"% 0  '< "@} ++ "(( B  I  I) ++!"#6"77PQ+ ,   	$$NPSTUPV 	s8   CE& AD AE# E& "E##E& &	F/FFc                 :    t        |j                         dz        S )Nr   )r   ri  )rn   dts     r4   r   zOpenTelemetry._to_ns?  s    2<<>C'((r6   c                     |j                  di       }|j                  d      xs i }|j                  d      }|r|S t        S )Nr(  r)  r*  )r  LITELLM_REQUEST_SPAN_NAME)rn   ro   r(  r)  r*  s        r4   r$  zOpenTelemetry._get_span_nameB  sF    $4b9!%%j17R",,'89""((r6   c                 |    |y |j                  dd       }|y ddlm}  |       }d|i}|j                  |      }|S )Ntraceparentr   TraceContextTextMapPropagatorcarrier)r  ,opentelemetry.trace.propagation.tracecontextr  extract)rn   r<   _traceparentr  
propagatorr  r  s          r4   get_traceparent_from_headerz)OpenTelemetry.get_traceparent_from_headerL  sU    ?{{=$7	
 34
 ,/$,,W,=r6   c           	         ddl m}m} ddlm} |j                  di       xs i }|j                  di       xs i }|j                  di       xs i }|j                  dd       }|j                  di       xs i }	|	j                  d	d       }
|
(t        j                  d
       |j                  |
      |
fS |2t        j                  d       d|i} |       j                  |      d fS 	 |j                         }|}|j                         }|j                  rat        j                  d|t        |j                  d      t        |j                  d      |j!                                |j#                         |fS t        j                  d       y# t$        $ r)}t        j                  dt'        |             Y d }~Cd }~ww xY w)Nr   )r   r   r  r(  proxy_server_requestr<   r  r)  litellm_parent_otel_spanz7OpenTelemetry: Using explicit parent span from metadataz?OpenTelemetry: Using traceparent header for context propagationr   zcOpenTelemetry: Using active span from global context: %s (trace_id=%s, span_id=%s, is_recording=%s)032x016xz-OpenTelemetry: Error getting current span: %sz:OpenTelemetry: No parent context found, creating root span)NN)r   r   r   r  r  r  r   r   r   r  get_current_spanru  is_validr  rj  rk  is_recordingget_currentr   rS   )rn   ro   r   r   r  r(  r  r<   r  	_metadatar   r  current_spanspan_contextr   s                  r4   r  zOpenTelemetry._get_span_context]  s   0	
  $4b9?R-112H"MSQS&**9b9?Rkk-6"&&z26<"	$==)CTJ '  I ,,-=>@PPP "  Q %k2G02::7:KTQQ	 113L'+<<>(("((}$|44f=|33V<$113 #..0,>> 	H	
   	  ?Q 	s   *BF 	GF<<Gc                 "   ddl m} ddlm} ddlm}m}m}m} t        j                  d| j                  | j                  | j                         t        j                  |xs | j                        }t        | j                  d      r<t        j                  d| j                          |t!        || j                              S | j                  dk(  r-t        j                  d	| j                          | |             S | j                  d
k(  s| j                  dk(  s| j                  dk(  rLt        j                  d| j                         | j#                  | j                  d      }	 | ||	|            S | j                  dk(  s| j                  dk(  rLt        j                  d| j                         | j#                  | j                  d      }	 | ||	|            S t        j                  d	| j                          | |             S )Nr   )OTLPSpanExporter)BatchSpanProcessorConsoleSpanExporterSimpleSpanProcessorr   zvOpenTelemetry Logger, initializing span processor 
self.OTEL_EXPORTER: %s
self.OTEL_ENDPOINT: %s
self.OTEL_HEADERS: %sr<   exportzDOpenTelemetry: intiializing SpanExporter. Value of OTEL_EXPORTER: %sr9   zHOpenTelemetry: intiializing console exporter. Value of OTEL_EXPORTER: %s	otlp_httphttp/protobuf	http/jsonzEOpenTelemetry: intiializing http exporter. Value of OTEL_EXPORTER: %stracesr;   r<   	otlp_grpcgrpczEOpenTelemetry: intiializing grpc exporter. Value of OTEL_EXPORTER: %s)5opentelemetry.exporter.otlp.proto.grpc.trace_exporterr  5opentelemetry.exporter.otlp.proto.http.trace_exporteropentelemetry.sdk.trace.exportr  r  r  r   r   r   rB   rD   rF   rY   r   hasattrr   r   )
rn   r  OTLPSpanExporterGRPCOTLPSpanExporterHTTPr  r  r  r   _split_otel_headersr   s
             r4   r   z!OpenTelemetry._get_span_processor  s   	
	
	
 	
 	 H		
 ,CC#8t'8'8 D 
 
   V"" 'tL$:L:L'MNN*  Z"" &&9&;<<+-!!_4!![0  W"" #'"?"?""H# &$0:M 
 ;.$2D2D2N  W"" #'"?"?""H# &$0:M    Z"" &&9&;<<r6   c                    t        j                  d| j                  | j                  | j                         t
        j                  | j                        }| j                  | j                  d      }t        j                  d| j                  |       t        | j                  d      r,t        j                  d| j                         | j                  S | j                  dk(  r-ddl	m
} t        j                  d	| j                          |       S | j                  d
k(  s| j                  dk(  s| j                  dk(  r1ddlm} t        j                  d| j                  |        |||      S | j                  dk(  s| j                  dk(  r1ddlm} t        j                  d| j                  |        |||      S t        j                  d| j                         ddl	m
}  |       S )zN
        Get the appropriate log exporter based on the configuration.
        ztOpenTelemetry Logger, initializing log exporter 
self.OTEL_EXPORTER: %s
self.OTEL_ENDPOINT: %s
self.OTEL_HEADERS: %slogsz4OpenTelemetry: Log endpoint normalized from %s to %sr  zDOpenTelemetry: Using custom log exporter. Value of OTEL_EXPORTER: %sr9   r   )ConsoleLogExporterzEOpenTelemetry: Using console log exporter. Value of OTEL_EXPORTER: %sr  r  r  )OTLPLogExporterzPOpenTelemetry: Using HTTP log exporter. Value of OTEL_EXPORTER: %s, endpoint: %sr  r  r   zPOpenTelemetry: 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   rB   rD   rF   rY   r   r   r$  r   r*  4opentelemetry.exporter.otlp.proto.http._log_exporterr+  4opentelemetry.exporter.otlp.proto.grpc._log_exporterr   )rn   r'  r   r*  r+  s        r4   r   zOpenTelemetry._get_log_exporter  s    	 F		
 ,CCDDUDUV #;;D<N<NPVWB	
 4%%x0  V"" %%%*I  W"" &''+-!!_4!![0   b""#
 #,6I  ;.$2D2D2N   b""#
 #,6I  ""{"" J%''r6   r;   signal_typec                 f   |s|S h d}||vrt        j                  d||       |S |j                  d      }d| }|j                  |      r|S ||hz
  }|D ]7  }d| }|j                  |      s|j	                  dd      d   d| z   }|c S  |j                  d      s||z   }|S |d| z   }|S )a  
        Normalize the endpoint URL for a specific OpenTelemetry signal type.

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

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

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

        Returns:
            Normalized endpoint URL with the correct signal path

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

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

            _normalize_otel_endpoint("http://collector:4318/v1/logs", "metrics")
            -> "http://collector:4318/v1/metrics"
        >   r)  r  r   znInvalid signal_type '%s' provided to _normalize_otel_endpoint. Valid values: %s. Returning endpoint unchanged./z/v1/   r   z/v1)r   r   rstripendswithrsplit)rn   r;   r.  valid_signalstarget_pathother_signalsother_signal
other_paths           r4   r   z&OpenTelemetry._normalize_otel_endpoint+  s    < O 6m+""B	 O ??3' [M*[)O &5)L~.J  ,#??3215!K=8II	 *   '+-H   Ak]"33Hr6   r<   c                     i }| rVt        | t              r4| j                  d      }|D ]  }|j                  dd      \  }}|||<    |S t        | t              r| }|S )zY
        Convert a string or dictionary of headers into a dictionary of headers.
        ,=r1  )rx   rS   splitr   )r<   r'  partspartr   r   s         r4   r   z%OpenTelemetry._get_headers_dictionaryo  sp    
 /1'3'  c*!D!%C!3JC/4', "
 #" GT*&-#""r6   logging_payloadc                   K   ddl m} ddlm}m} d}d}|j
                  }|j                  }	t        |t              rt        |dz        }n| j                  |      }t        |	t              rt        |	dz        }n| j                  |	      }||j                  }
| j                  j                  |
|j                  |      |      }|j                  }|/|j!                         D ]  \  }}| j#                  |d| |        |j$                  }|/|j!                         D ]  \  }}| j#                  |d| |        |j'                   ||j(                               |j+                  |	       y y w)
Nr   r   r   r   r   request.r   z	response.r   )r   r   r   r   r   r   r   rx   r   r   r   router   r   r   r  r   r   responser   r   r   )rn   r@  r   r   r   r   r   r   r   r   r   management_endpoint_span_request_datar   r   	_responses                   r4   &async_management_endpoint_success_hookz4OpenTelemetry.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$((,(?7 (s   E5E7c                   K   ddl m} ddlm}m} d}d}|j
                  }|j                  }	t        |t              rt        t        |      dz        }n| j                  |      }t        |	t              rt        t        |	      dz        }n| j                  |	      }||j                  }
| j                  j                  |
|j                  |      |      }|j                  }|/|j!                         D ]  \  }}| j#                  |d| |        |j$                  }| j#                  |dt'        |             |j)                   ||j*                               |j-                  |	       y y w)
Nr   r   r   r   r   rB  r   r  r   )r   r   r   r   r   r   r   rx   r   r   r   rC  r   r   r   r  r   r   r  rS   r   r   r   )rn   r@  r   r   r   r   r   r   r   r   r   rE  rF  r   r   
_exceptions                   r4   &async_management_endpoint_failure_hookz4OpenTelemetry.async_management_endpoint_failure_hook  so    
 	(:$//
"++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$((,(?1 (s   E3E5c                     | j                   j                  d| j                  |      | j                  |      | j                  j
                        S )zF
        Create a span for the received proxy server request.
        zReceived Proxy Server Requestr  )r   r   r   kind)r   r   r   r  r   SERVER)rn   r   r<   s      r4   )create_litellm_proxy_request_started_spanz7OpenTelemetry.create_litellm_proxy_request_started_span  sM     {{%%0{{:.44W4E&&	 & 
 	
r6   )NNNNN)NNNN)r  NNNNrw   )DrP   rQ   rR   r	   r8   rS   r   rj   rm   rc   rk   rl   r   r   r   r   r   r   r
   r   r   r   r   r   r   r   r	  r   r  r  r  r   r  r   r  r  r  r  r   r  r   r  r  rU   r   r  staticmethodr   r   r   r  r%  r  r   r.  r   r$  r  r  r   r   r   r   r   rH  rK  rO  __classcell__)rr   s   @r4   rY   rY      s    15'+)-)-(,%2,-%2  }%2
 "#%2 "#%2 !%2N=,."`8
t-,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 (,GG &G *	G
  }GDD V .<x~ <
= 
=0M	$"B854=G~H)d H)TFHtnFH/7/@FHPG>Od OD Ob" "HU3c5;P5Q " 67	c3h *qq08qfeCsE<Q6R "1t 1# 1c 12t 2h))"3jJ=8D> J=XK(ZB B47B	#BH #%T	2B)C #SRUX # #( ,03@93@ #4.3@p ,00@90@ #4.0@d

 
 
$	
r6   rY   )4r*   dataclassesr   r   typingr   r   r   r   r	   r
   r   r   litellm._loggingr   "litellm.integrations.custom_loggerr   *litellm.litellm_core_utils.safe_json_dumpsr   litellm.types.servicesr   litellm.types.utilsr   r   r   r   r   r#  r   _SpanExporterr   r   _Contextr   _Spanr   _Tracerr  r   !_ManagementEndpointLoggingPayloadlitellm.proxy.proxy_serverr   _UserAPIKeyAuthr+   r   r   r   r-  r  r5   r8   rY   rW   r6   r4   <module>r`     s;   	 !  H H H  + ; A 7  L715 MD7C< FHcM"G+,L?C/0N',-NPS-S'T$DFLN'*$Gbii 2I> RYY3Y? bii 5yA , - @ ,
 ,
 ,
^o
L o
r6   