Ë
    tPêj´  ã            
       óR  — d dl Z d dlmZ d dlmZmZmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ d d	lmZmZmZ erd d
lmZ d dlmZmZmZmZmZmZmZm Z m!Z!  G d„ de«      Z"dFd„Z#dFd„Z$dFd„Z%dFd„Z&dFd„Z'dFd„Z(dGd„Z)dFd„Z*de+dz  de+fd„Z,ddde-dz  de-dz  fd„Z.ddde/e   fd„Z0d e1dz  de1fd!„Z2ddd"edz  ddfd#„Z3d"edz  de-dz  fd$„Z4d e1de-dz  fd%„Z5ddd&ed e1d'e1fd(„Z6ddd)e1dz  ddfd*„Z7d+e+ddfd,„Z8ddd-e1ddfd.„Z9d/„ Z:de+dz  fd0„Z;d1„ Z<de-dz  fd2„Z=de1e+ef   dz  fd3„Z>de+fd4„Z?ddd5e+ddfd6„Z@ddd5e+d7e1ddfd8„ZAddd-e1ddfd9„ZBdHd:„ZCde+dz  deDfd;„ZEddd-e1ddfd<„ZFdHd=„ZGddd>e1ddfd?„ZHd@„ ZIddd-ee+eJf   d&edz  dAeJddf
dB„ZKdCeJdeDfdD„ZLdddAeJddfdE„ZMy)Ié    N)ÚMapping)ÚTYPE_CHECKINGÚAnyÚFinal)Úoverride)Úverbose_logger)ÚBaseLLMObsOTELAttributesÚsafe_set_attribute)Úshould_redact_message_logging)Ú
safe_dumps)Ú	CallTypesÚStandardLoggingMCPToolCallÚStandardLoggingPayload)ÚSpan)	ÚAudioAttributesÚEmbeddingAttributesÚImageAttributesÚMessageAttributesÚMessageContentAttributesÚOpenInferenceMimeTypeValuesÚOpenInferenceSpanKindValuesÚSpanAttributesÚToolCallAttributesc                   ó:   — e Zd Zeedddeeef   fd„«       «       Zy)ÚArizeOTELAttributesÚspanr   Úkwargsc           	      óÈ  — |j                  d«      }|rÏ|d   }t        | t        j                  |j                  dd«      «       t	        |«      D ]�  \  }}t        j
                  › d|› �}t        | |› dt        j                  › �|j                  d«      «       t        | |› dt        j                  › �|j                  dd«      «       t        d|› d�t        | ||«       Œ’ y y )	NÚmessageséÿÿÿÿÚcontentÚ ú.Úrolezinput message extras (idx=ú))Úgetr
   r   ÚINPUT_VALUEÚ	enumerateÚLLM_INPUT_MESSAGESr   ÚMESSAGE_ROLEÚMESSAGE_CONTENTÚ
_safe_emitÚ_emit_input_message_extras)r   r   r   Úlast_messageÚidxÚmsgÚprefixs          úf/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/arize/_utils.pyÚset_messagesz ArizeOTELAttributes.set_messages"   s÷   € ð !Ÿ*™* ZÓ0ˆñ Ø"*¨2¡,ˆLÜØÜ×*Ñ*Ø× Ñ  ¨BÓ/ôô & hÓ/ò ‘��SÜ*×=Ñ=Ð>¸aÀ¸uÐE�ä" 4¨F¨8°1Ô5F×5SÑ5SÐ4TÐ)UÐWZ×W^ÑW^Ð_eÓWfÔgä"ØØ�h˜aÔ 1× AÑ AÐBÐCØ—G‘G˜I rÓ*ôô Ø0°°°QÐ7Ü.ØØØõñ!ð ó    N)	Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr   ÚdictÚstrr   r3   © r4   r2   r   r   !   s2   „ ØØð$˜6ð $¨4°°S°©>ò $ó ó ñ$r4   r   r   r   c                 ó  — t        |d«      syt        | |t        t        «       t	        | |t
        t        «       t        | |t        t        «       t        | |t        t        «       t        | |t        t        «       t        | |t        «       y)zAHelper to set response output and token usage attributes on span.r&   N)ÚhasattrÚ_set_choice_outputsr   r   Ú_set_image_outputsr   Ú_set_audio_outputsr   Ú_set_embedding_outputsr   Ú_set_structured_outputsÚ_set_usage_outputs©r   Úresponse_objs     r2   Ú_set_response_attributesrF   Q   sf   € ô �< Ô'Øä˜˜lÔ,=¼~ÔNÜ�t˜\¬?¼NÔKÜ�t˜\¬?¼NÔKÜ˜4 Ô/BÄNÔSÜ˜D ,Ô0AÄ>ÔRÜ�t˜\¬>Õ:r4   c                 óÖ  — t        |j                  dg «      «      D ]Ë  \  }}|j                  di «      }|j                  dd«      }|}|st        |«      }	|	rt        |	«      }t	        | |j
                  |«       |j                  › d|› �}
t	        | |
› d|j                  › �|j                  d«      «       t	        | |
› d|j                  › �|«       t        d|› d�t        | |
|«       ŒÍ y )	NÚchoicesÚmessager!   r"   r#   r$   zoutput tool_calls (idx=r%   )r(   r&   Ú_get_tool_callsÚ _summarize_tool_calls_for_outputr
   ÚOUTPUT_VALUEÚLLM_OUTPUT_MESSAGESr*   r+   r,   Ú_emit_message_tool_calls)r   rE   Ú	msg_attrsÚ
span_attrsr/   ÚchoiceÚresponse_messager!   Úoutput_valueÚ
tool_callsr1   s              r2   r>   r>   _   s
  € Ü  ×!1Ñ!1°)¸RÓ!@ÓAò "
‰ˆˆVØ!Ÿ:™: i°Ó4ÐØ"×&Ñ& y°"Ó5ˆð ˆÙÜ(Ð)9Ó:ˆJÙÜ?À
ÓK�ä˜4 ×!8Ñ!8¸,ÔGØ×2Ñ2Ð3°1°S°EÐ:ˆÜØØˆh�a˜	×.Ñ.Ð/Ð0Ø× Ñ  Ó(ô	
ô
 	ØØˆh�a˜	×1Ñ1Ð2Ð3Øô	
ô 	Ø% c U¨!Ð,Ü$ØØØõ	
ñ9"
r4   c                 ó4  — |j                  dg «      }t        |«      D ]x  \  }}|j                  d«      }|€%|j                  d«      rd|j                  d«      › �}|sŒA|dk(  rt        | |j                  |«       t        | |j                  › d|› �|«       Œz y )NÚdataÚurlÚb64_jsonzdata:image/png;base64,r   r#   )r&   r(   r
   rL   Ú	IMAGE_URL)r   rE   Úimage_attrsrP   ÚimagesÚiÚimageÚimg_urls           r2   r?   r?   …   sŸ   € Ø ×$Ñ$ V¨RÓ0€FÜ˜fÓ%ò J‰ˆˆ5Ø—)‘)˜EÓ"ˆØˆ?˜uŸy™y¨Ô4Ø.¨u¯y©y¸Ó/DÐ.EÐFˆGáØà�Š6Ü˜t Z×%<Ñ%<¸gÔFä˜4 K×$9Ñ$9Ð#:¸!¸A¸3Ð!?ÀÕIñJr4   c                 óð  — |j                  dg «      }t        |«      D ]Ö  \  }}|j                  d«      }|€%|j                  d«      rd|j                  d«      › �}|r8|dk(  rt        | |j                  |«       t        | |j                  › d|› �|«       |j                  d«      }|rt        | |j
                  › d|› �|«       |j                  d«      }	|	sŒ»t        | |j                  › d|› �|	«       ŒØ y )	NÚaudiorW   rX   zdata:audio/wav;base64,r   r#   Ú	mime_typeÚ
transcript)r&   r(   r
   rL   Ú	AUDIO_URLÚAUDIO_MIME_TYPEÚAUDIO_TRANSCRIPT)
r   rE   Úaudio_attrsrP   r`   r\   Ú
audio_itemÚ	audio_urlÚ
audio_mimeÚaudio_transcripts
             r2   r@   r@   •   sý   € Ø×#Ñ# G¨RÓ0€EÜ" 5Ó)ò ^‰ˆˆ:Ø—N‘N 5Ó)ˆ	ØÐ §¡°
Ô!;Ø0°·±À
Ó1KÐ0LÐMˆIáØ�AŠvÜ" 4¨×)@Ñ)@À)ÔLÜ˜t¨×(=Ñ(=Ð'>¸aÀ¸sÐ%CÀYÔOà—^‘^ KÓ0ˆ
ÙÜ˜t¨×(CÑ(CÐ'DÀAÀaÀSÐ%IÈ:ÔVà%Ÿ>™>¨,Ó7ÐÚÜ˜t¨×(DÑ(DÐ'EÀQÀqÀcÐ%JÐL\Õ]ñ!^r4   c                 óz  — |j                  dg «      }t        |«      D ]›  \  }}|j                  d«      }|rJ|dk(  r t        | |j                  t	        |«      «       t        | |j
                  › d|› �t	        |«      «       |j                  d«      }|sŒwt        | |j                  › d|› �t	        |«      «       Œ� y )NrV   Ú	embeddingr   r#   Útext)r&   r(   r
   rL   r:   ÚEMBEDDING_VECTORÚEMBEDDING_TEXT)	r   rE   Úembedding_attrsrP   Ú
embeddingsr\   Úembedding_itemÚembedding_vectorÚembedding_texts	            r2   rA   rA   ª   sÍ   € Ø$×(Ñ(¨°Ó4€JÜ& zÓ2ò Ñˆˆ>Ø)×-Ñ-¨kÓ:ÐÙØ�AŠvÜ"ØØ×+Ñ+ÜÐ(Ó)ôô ØØ"×3Ñ3Ð4°A°a°SÐ9ÜÐ$Ó%ôð (×+Ñ+¨FÓ3ˆÚÜØØ"×1Ñ1Ð2°!°A°3Ð7Ü�NÓ#õñ%r4   c                 ó�  — |j                  dg «      }t        |«      D �]%  \  }}|j                  › d|› �}t        |d«      sŒ%|j                  }|dk(  rQt        |d«      rE|j
                  D ]5  }	t        |	d«      sŒt        | |› d|j                  › �|	j                  «       Œ7 Œ‡|dk(  sŒ�t        |d«      sŒšd	}
|j                  }|r t        |«      d
kD  r|d
   }t        |dd	«      }
t        |dd«      }t        | |j                  |
«       t        | |› d|j                  › �|
«       t        | |› d|j                  › �|«       �Œ( y )NÚoutputr#   ÚtypeÚ	reasoningÚsummaryrm   rI   r!   r"   r   r$   Ú	assistant)r&   r(   rM   r=   rw   ry   r
   ÚMESSAGE_REASONING_SUMMARYrm   r!   ÚlenÚgetattrrL   r+   r*   )r   rE   rO   rP   Úoutput_itemsr\   Úitemr1   Ú	item_typery   Úmessage_contentÚcontent_listÚfirst_contentÚmessage_roles                 r2   rB   rB   Å   sS  € Ø&×*Ñ*¨8°RÓ8€LÜ˜\Ó*ó Y‰ˆˆ4Ø×2Ñ2Ð3°1°Q°CÐ8ˆÜ�t˜VÔ$Øà—I‘Iˆ	Ø˜Ò#¬°°iÔ(@ØŸ<™<ò �Ü˜7 FÕ+Ü&ØØ!˜( ! I×$GÑ$GÐ#HÐIØŸ™õñð ˜)Ó#¬°°iÕ(@Ø ˆOØŸ<™<ˆLÙ¤ LÓ 1°AÒ 5Ø ,¨Q¡�Ü")¨-¸ÀÓ"D�Ü" 4¨°Ó=ˆLÜ˜t Z×%<Ñ%<¸oÔNÜ˜t¨ x¨q°×1JÑ1JÐ0KÐ%LÈoÔ^Ü˜t¨ x¨q°×1GÑ1GÐ0HÐ%IÈ<ÖXñ/Yr4   c                 ó†   — | €|S t        | dd«      }t        |«      r
	  |||«      S t        | ||«      S # t        $ r Y Œw xY w)u	  Read ``key`` from a dict-like or Pydantic-model-like object.

    The arize/langfuse_otel logger receives ``usage`` objects from many sources:
    plain dicts, litellm ``Usage`` (which exposes ``.get``), and raw OpenAI
    Pydantic models (e.g. ``openai.types.completion_usage.CompletionUsage`` and
    nested ``CompletionTokensDetails`` / ``OutputTokensDetails``) which do NOT
    expose ``.get``. Calling ``.get`` on the latter raised ``AttributeError`` â€”
    see https://github.com/BerriAI/litellm/issues/13672.
    Nr&   )r}   ÚcallableÚ	TypeError)ÚobjÚkeyÚdefaultÚgetters       r2   Ú	_safe_getrŒ   á   s[   € ð €{ØˆÜ˜C ¨Ó-€FÜ�Ôð	Ù˜#˜wÓ'Ð'ô �3˜˜WÓ%Ð%øô ò 	áð	ús   ž4 ´	A ¿A c                 óð  — |xr |j                  d«      }|sy t        | |j                  t        |d«      «       t        |d«      xs t        |d«      }|rt        | |j                  |«       t        |d«      xs t        |d«      }|rt        | |j
                  |«       t        |d«      xs t        |d«      }t        |d	«      }|rt        | |j                  |«       t        |d
«      xs t        |d«      }t        |d«      xs t        |d«      }	|	rt        | |j                  |	«       t        |d«      }
|
rt        | |j                  |
«       t        |d«      }|rt        | |j                  |«       y y )NÚusageÚtotal_tokensÚcompletion_tokensÚoutput_tokensÚprompt_tokensÚinput_tokensÚcompletion_tokens_detailsÚoutput_tokens_detailsÚreasoning_tokensÚprompt_tokens_detailsÚinput_tokens_detailsÚcached_tokensÚcache_read_input_tokensÚcache_creation_input_tokensÚaudio_tokens)
r&   r
   ÚLLM_TOKEN_COUNT_TOTALrŒ   ÚLLM_TOKEN_COUNT_COMPLETIONÚLLM_TOKEN_COUNT_PROMPTÚ,LLM_TOKEN_COUNT_COMPLETION_DETAILS_REASONINGÚ)LLM_TOKEN_COUNT_PROMPT_DETAILS_CACHE_READÚ*LLM_TOKEN_COUNT_PROMPT_DETAILS_CACHE_WRITEÚ$LLM_TOKEN_COUNT_PROMPT_DETAILS_AUDIO)r   rE   rP   rŽ   r�   r’   Útoken_detailsr–   Úprompt_token_detailsÚ
cache_readÚcache_writeÚaudio_prompt_tokenss               r2   rC   rC   ÷   s‡  € ØÒ= L×$4Ñ$4°WÓ$=€EÙØä�t˜Z×=Ñ=¼yÈÐP^Ó?_Ô`Ü(¨Ð0CÓDÒiÌ	ÐRWÐYhÓHiÐÙÜ˜4 ×!FÑ!FÐHYÔZÜ$ U¨OÓ<Ò`Ä	È%ÐQ_Ó@`€MÙÜ˜4 ×!BÑ!BÀMÔRô % UÐ,GÓHÒuÌIÐV[Ð]tÓLu€MÜ'¨Ð7IÓJÐÙÜØØ×CÑCØô	
ô #,¨EÐ3JÓ"KÒ"wÌyÐY^Ð`vÓOwÐÜ!Ð"6¸ÓHÒwÌIÐV[Ð]vÓLw€JÙÜØØ×@Ñ@Øô	
ô # 5Ð*GÓH€KÙÜØØ×AÑAØô	
ô "+Ð+?ÀÓ!PÐÙÜØØ×;Ñ;Øõ	
ð r4   Ú	call_typeÚreturnc                 ó  ‡— | st         j                  j                  S t        | «      j	                  «       Šd‰v rt         j
                  j                  S d‰v rt         j                  j                  S d‰v rt         j                  j                  S d‰v sd‰v rt         j                  j                  S ‰dk(  s‰dk(  s‰j                  d«      rt         j                  j                  S d	‰v sd
‰v sd‰v rt         j                  j                  S t        ˆfd„dD «       «      rt         j                  j                  S t        ˆfd„dD «       «      rt         j                  j                  S t         j                  j                  S )z=
    Map LiteLLM call types to OpenInference span kinds.
    ÚembedÚrerankÚsearchÚ
moderationÚ	guardrailÚcall_mcp_toolÚmcpÚtoolÚasend_messageÚa2arz   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©Nr;   ©Ú.0ÚkeywordÚlowereds     €r2   ú	<genexpr>z2_infer_open_inference_span_kind.<locals>.<genexpr>O  s   øè ø€ ò àð 	�7Ôñùó   ƒ)Ú
completionÚchatr]   r`   ÚspeechÚtranscriptionÚgenerate_contentÚresponseÚvideosÚrealtimeÚpass_throughÚpassthroughÚanthropic_messagesÚocrc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr·   r;   r¸   s     €r2   r¼   z2_infer_open_inference_span_kind.<locals>.<genexpr>g  s   øè ø€ Ò
_ 'ˆ7�gÔÑ
_ùr½   )ÚfileÚbatchÚ	containerÚfine_tuning_job)r   ÚUNKNOWNÚvaluer:   ÚlowerÚ	EMBEDDINGÚRERANKERÚ	RETRIEVERÚ	GUARDRAILÚendswithÚTOOLÚAGENTÚanyÚLLMÚCHAIN©r©   r»   s    @r2   Ú_infer_open_inference_span_kindrÝ   3  sO  ø€ ñ
 Ü*×2Ñ2×8Ñ8Ð8ä˜“^×)Ñ)Ó+€Gà�'ÑÜ*×4Ñ4×:Ñ:Ð:à�7ÑÜ*×3Ñ3×9Ñ9Ð9à�7ÑÜ*×4Ñ4×:Ñ:Ð:à�wÑ +°Ñ"8Ü*×4Ñ4×:Ñ:Ð:à�/Ò! W°Ò%5¸×9IÑ9IÈ&Ô9QÜ*×/Ñ/×5Ñ5Ð5à˜'Ñ! U¨gÑ%5¸ÈÑ9OÜ*×0Ñ0×6Ñ6Ð6ä
ó ð
ôô ô, +×.Ñ.×4Ñ4Ð4ä
Ó
_Ð-^Ô
_Ô_Ü*×0Ñ0×6Ñ6Ð6ä&×.Ñ.×4Ñ4Ð4r4   Úoptional_toolsÚmetadata_toolsc                 ó^  — |�r	t        |«      D ]û  \  }}t        |t        «      sŒt        |j                  d«      t        «      r|j                  d«      nd}|sŒL|j                  d«      }|r!t	        | t
        j                  › d|› d�|«       |j                  d«      }|r!t	        | t
        j                  › d|› d�|«       |j                  d«      }|€ŒÈt	        | t
        j                  › d|› d	�t        j                  |«      «       Œý |rŸt        |t        «      rŽt        |«      D ]  \  }}t        |t        «      sŒ|j                  d«      }|r!t	        | t
        j                  › d
|› d�|«       |j                  d«      }|sŒ_t	        | t
        j                  › d
|› d�|«       Œ� yyy)zFset tool attributes on span from optional_params or tool call metadataÚfunctionNÚnamer#   z.nameÚdescriptionz.descriptionÚ
parametersz.parametersz.tools.)r(   Ú
isinstancer9   r&   r
   r   Ú	LLM_TOOLSÚjsonÚdumpsÚlistÚLLM_INVOCATION_PARAMETERS)	r   rÞ   rß   r/   r³   rá   Ú	tool_nameÚtool_descriptionÚparamss	            r2   Ú_set_tool_attributesrî   m  sª  € âÜ" >Ó2ò 	‰IˆC�Ü˜d¤DÔ)ØÜ/9¸$¿(¹(À:Ó:NÔPTÔ/U�t—x‘x 
Ô+Ð[_ˆHÙØØ Ÿ™ VÓ,ˆIÙÜ" 4¬N×,DÑ,DÐ+EÀQÀsÀeÈ5Ð)QÐS\Ô]Ø'Ÿ|™|¨MÓ:ÐÙÜ"ØÜ%×/Ñ/Ð0°°#°°lÐCØ$ôð
 —\‘\ ,Ó/ˆFØÑ!Ü"ØÜ%×/Ñ/Ð0°°#°°kÐBÜ—J‘J˜vÓ&õð%	ñ0 œ* ^´TÔ:Ü" >Ó2ò 	‰IˆC�Ü˜d¤DÔ)ØØŸ™ Ó(ˆIÙÜ"ØÜ%×?Ñ?Ð@ÀÈÀuÈEÐRØôð  $Ÿx™x¨Ó6ÐÚÜ"ØÜ%×?Ñ?Ð@ÀÈÀuÈLÐYØ$õñ	ð ;€~r4   Ú
attributesc           	      ót  — t        |«      }t        dt        | |«       	 t        |j	                  d«      «      }|j	                  di «      xs i }|j	                  d«      }|€t        d«      ‚|r|j	                  d«      nd}t        | |t        «       t        |«      }	t        |«      }
t        | |||||t        ¬«       t        | |
|	«       |j                  | |«       |r|j	                  d	«      nd}t        | |t        «       t        | |¬
«       |j	                  d«      }t        dt(        | ||«       t        dt*        | |«       t        dt,        | ||||«       t        dt.        | |||«       y# t        $ r=}t!        j"                  d|«       t%        | d«      r| j'                  |«       Y d}~Œ¡d}~ww xY w)zc
    Populates span with OpenInference-compliant LLM attributes for Arize and Phoenix tracing.
    zearly span kindÚoptional_paramsÚlitellm_paramsÚstandard_logging_objectNz+standard_logging_object not found in kwargsÚmetadata©r   r   Ústandard_logging_payloadrñ   rò   rE   rP   Úmodel_parametersrD   z?[Arize/Phoenix] Failed to set OpenInference span attributes: %sÚrecord_exceptionzsession/user attrszresponse costzpassthrough normalizationzmcp tool attrs)Ú_coerce_response_obj_for_attrsr,   Ú_set_early_span_kindÚ_sanitize_optional_paramsr&   Ú
ValueErrorÚ_set_metadata_attributesr   Ú_extract_metadata_toolsÚ_extract_optional_toolsÚ_set_request_attributesrî   r3   Ú_set_model_paramsrF   Ú	Exceptionr   Úerrorr=   rø   Ú_set_session_and_user_attrsÚ_set_response_cost_attrÚ_maybe_normalize_passthroughÚ_maybe_set_mcp_tool_attrs)r   r   rE   rï   Úresponse_obj_for_attrsrñ   rò   rö   rô   rß   rÞ   Úmodel_paramsÚeÚslps                 r2   Úset_attributesr  �  s·  € ô %CÀ<Ó$PÐô Ð Ô"6¸¸fÔEð'%Ü!:¸6¿:¹:ÐFWÓ;XÓ!YˆØ &§
¡
Ð+;¸RÓ @Ò FÀBˆØIOÏÉÐTmÓInÐ Ø#Ð+ÜÐJÓKÐKáF^Ð2×6Ñ6°zÔBÐdhˆÜ   x´Ô@ä 7¸Ó AˆÜ 7¸Ó HˆäØØØ%=Ø+Ø)Ø/Ü%õ	
ô 	˜T >°>ÔBØ×Ñ  fÔ-áRjÐ6×:Ñ:Ð;MÔNÐptˆÜ˜$ ¬nÔ=ä  dÐ9OÕPð —‘Ð5Ó6€CÜÐ#Ô%@À$ÈÐPSÔTÜˆÔ 7¸¸sÔCÜØ#Ü$ØØØØØôô ÐÔ!:¸DÀ&È#ÐOeÕføô) ò %Ü×ÑÐ^Ð`aÔbÜ�4Ð+Ô,Ø×!Ñ! !Ô$ÿøð%ús   ŸC2E1 Å1	F7Å:3F2Æ2F7rñ   c                 óN   — t        | t        «      si S | j                  dd «       | S )NÚsecret_fields)rå   r9   Úpop©rñ   s    r2   rû   rû   è  s'   € Ü�o¤tÔ,Øˆ	Ø×Ñ˜¨Ô.ØÐr4   rô   c                 óJ   — |�!t        | |j                  t        |«      «       y y r·   )r
   ÚMETADATAr   )r   rô   rP   s      r2   rý   rý   ï  s$   € ØÐÜ˜4 ×!4Ñ!4´jÀÓ6JÕKð r4   c                 óŠ   — t        | t        «      sy | j                  d«      }t        |t        «      r|j                  d«      S y )NÚllmÚtools©rå   r9   r&   )rô   Úllm_objs     r2   rþ   rþ   ô  s9   € Ü�h¤Ô%ØØ—\‘\ %Ó(€GÜ�'œ4Ô Ø�{‰{˜7Ó#Ð#Ør4   c                 óH   — t        | t        «      r| j                  d«      S d S )Nr  r  r  s    r2   rÿ   rÿ   ý  s"   € Ü+5°oÄtÔ+Lˆ?×Ñ˜wÓ'ÐVÐRVÐVr4   rö   rò   c           
      ó|  — |j                  d«      r&t        | |j                  |j                  d«      «       t        | d|j                  d«      «       t        | |j                  |j                  dd«      «       |j                  d«      rt        | d|j                  d«      «       |j                  d«      rt        | d	|j                  d«      «       |j                  d
«      rt        | d|j                  d
«      «       t        | dt	        |j                  dd«      «      «       |j                  d«      rt        | d|j                  d«      «       t        |d«      sy |j                  d«      rt        | d|j                  d«      «       |j                  d«      rt        | d|j                  d«      «       y y )NÚmodelzllm.request.typer©   Úcustom_llm_providerÚUnknownÚ
max_tokenszllm.request.max_tokensÚtemperaturezllm.request.temperatureÚtop_pzllm.request.top_pzllm.is_streamingÚstreamFÚuserzllm.userr&   Úidzllm.response.idzllm.response.model)r&   r
   ÚLLM_MODEL_NAMEÚLLM_PROVIDERr:   r=   rõ   s          r2   r   r     s�  € ð ‡z�z�'ÔÜ˜4 ×!:Ñ!:¸F¿J¹JÀwÓ<OÔPä�tÐ/Ð1I×1MÑ1MÈkÓ1ZÔ[ÜØØ×ÑØ×ÑÐ0°)Ó<ôð ×Ñ˜<Ô(Ü˜4Ð!9¸?×;NÑ;NÈ|Ó;\Ô]Ø×Ñ˜=Ô)Ü˜4Ð!:¸O×<OÑ<OÐP]Ó<^Ô_Ø×Ñ˜7Ô#Ü˜4Ð!4°o×6IÑ6IÈ'Ó6RÔSä�tÐ/´°_×5HÑ5HÈÐSXÓ5YÓ1ZÔ[à×Ñ˜6Ô"Ü˜4 ¨_×-@Ñ-@ÀÓ-HÔIä�< Ô'Øà×Ñ˜ÔÜ˜4Ð!2°L×4DÑ4DÀTÓ4JÔKØ×Ñ˜Ô Ü˜4Ð!5°|×7GÑ7GÈÓ7PÕQð !r4   r	  c                 óÄ   — |sy t        | |j                  t        |«      «       |j                  d«      r,|j                  d«      }|�t        | |j                  |«       y y y )Nr!  )r
   rê   r   r&   ÚUSER_ID)r   r	  rP   Úuser_ids       r2   r  r  )  s_   € ÙØä�t˜Z×AÑAÄ:ÈlÓC[Ô\Ø×Ñ˜ÔØ%×)Ñ)¨&Ó1ˆØÐÜ˜t Z×%7Ñ%7¸ÕAð ð  r4   Úlabelc                 óp   — 	  ||i |¤Ž y# t         $ r!}t        j                  d| |«       Y d}~yd}~ww xY w)z—Run an additive attribute emitter, swallowing any error so it cannot
    blank attributes set elsewhere on the span. Failures are logged at debug.
    z[Arize] %s skipped: %sN)r  r   Údebug)r(  ÚfnÚargsr   r
  s        r2   r,   r,   :  s=   € ðAÙ
ˆDÐ�FÓøÜò AÜ×ÑÐ5°u¸a×@Ñ@ûðAús   ‚ ‹	5”0°5r   c                 ó¶   — |j                  d«      }t        |t        «      r|j                  d«      nd}t        | t        j
                  t        |¬«      «       y)zDDefensively set OPENINFERENCE_SPAN_KIND before any other logic runs.ró   r©   N)r©   )r&   rå   r9   r
   r   ÚOPENINFERENCE_SPAN_KINDrÝ   )r   r   r  r©   s       r2   rú   rú   D  sF   € à—‘Ð5Ó6€CÜ/9¸#¼tÔ/D�s—w‘w˜{Ô+È$€IÜØÜ×.Ñ.Ü'°)Ô<õr4   c                 ó  — | �t        | d«      r| S t        | «      }t        |t        «      r|S t	        | dd«      }t        |t
        «      r-|r+	 t        j                  |«      }t        |t        «      r|S 	 | S | S # t        $ r Y | S w xY w)a©  Return a `.get`-compatible view of `response_obj` when possible.

    - dicts and Pydantic models that already expose `.get` are returned
      unchanged (preserves all current behavior, including the Responses API
      flow which relies on Pydantic attribute access).
    - Pydantic models without `.get` (e.g. the MCP SDK's `CallToolResult`,
      logged for `call_mcp_tool` spans) are dumped to a dict.
    - `httpx.Response` and other text-only responses (passthrough routes)
      are JSON-decoded so the standard extraction paths can read fields like
      `id`, `model`, and `usage`. On failure the original object is returned
      so behavior is no worse than today.
    Nr&   rm   )	r=   Ú_to_plain_dictrå   r9   r}   r:   rç   Úloadsr  )rE   Údumpedrm   Úparseds       r2   rù   rù   O  sš   € ð Ðœw |°UÔ;ØÐÜ" <Ó0€FÜ�&œ$ÔØˆÜ˜,¨°Ó5€DÜ�$œÔ¡ð	Ü ŸJ™J tÓ,ˆFÜ˜&¤$Ô'Ø�ð (ð Ðˆ<Ðøô ò 	ØØÐð	ús   Á&A: Á:	BÂBc                 óx  — | €yt        | t        «      r| S t        | t        «      r•g }| D ]{  }t        |t        «      r|j                  |«       Œ%t        |t        «      sŒ6|j                  d«      xs |j                  d«      }t        |t        «      sŒk|j                  |«       Œ} |rdj                  |«      S y)ag  Best-effort text extraction from a message-content value.

    Returns None when no textual portion can be derived. Handles:
      - plain strings
      - lists of OpenAI-style content parts (`{"type": "text", "text": ...}`)
      - lists of Anthropic-style content parts (`{"type": "text", "text": ...}`
        or `{"type": "input_text", "text": ...}`)
    Nrm   Ú
input_textú
)rå   r:   ré   Úappendr9   r&   Újoin)rÐ   ÚpartsÚpartrm   s       r2   Ú_coerce_textr;  l  s¢   € ð €}ØÜ�%œÔØˆÜ�%œÔØˆØò 	'ˆDÜ˜$¤Ô$Ø—‘˜TÕ"Ü˜D¤$Õ'Ø—x‘x Ó'ÒA¨4¯8©8°LÓ+A�Ü˜d¤CÕ(Ø—L‘L Õ&ð	'ñ Ø—9‘9˜UÓ#Ð#Ør4   c                 óŽ   — | �t        | t        «      r| S t        | dd«      }t        |«      r	  |«       S | S # t        $ r Y | S w xY w)zäBest-effort: coerce a value (Pydantic model / dict / None) to a dict.

    Returns the original value when no safe conversion exists. Used to bridge
    OpenAI Pydantic message/tool_call objects into the dict-based helpers.
    NÚ
model_dump)rå   r9   r}   r†   r  )rÐ   r=  s     r2   r0  r0  ‡  sZ   € ð €}œ
 5¬$Ô/ØˆÜ  |°TÓ:€JÜ�
Ôð	Ù“<Ðð €Løô ò 	ØØ€Lð	ús   ®7 ·	AÁAc                 óF   — t        | d«      }t        |t        «      r|r|S dS )zˆReturn ``message.tool_calls`` only when it's a non-empty list.

    Works for dicts and Pydantic message objects via ``_safe_get``.
    rT   N)rŒ   rå   ré   )rI   rT   s     r2   rJ   rJ   ˜  s&   € ô
 " '¨<Ó8€JÜ# J´Ô5¹*ˆ:ÐNÈ$ÐNr4   c                 óÎ  — t        | «      }t        |t        «      syt        |j                  d«      «      }t        |t        «      r|j                  d«      nd}t        |t        «      r|j                  d«      nd}|�&t        |t        «      s	 t        j                  |«      }|j                  d«      |j                  dd«      ||dœdœS # t        $ r t	        |«      }Y Œ>w xY w)	a3  Normalize a single tool_call (dict or Pydantic) into a stable shape:

        {"id": str|None, "type": str, "function": {"name": str|None, "arguments": str|None}}

    Arguments are coerced to a JSON string per OpenInference convention.
    Returns ``None`` when ``raw_tc`` cannot be coerced to a dict.
    Nrá   râ   Ú	argumentsr"  rw   )râ   r@  )r"  rw   rá   )r0  rå   r9   r&   r:   rç   rè   r  )Úraw_tcÚtcrá   râ   r,  s        r2   Ú_normalize_tool_callrC  ¡  sÉ   € ô ˜vÓ&€BÜ�bœ$ÔØÜ$ R§V¡V¨JÓ%7Ó8€HÜ*4°X¼tÔ*D�(—,‘,˜vÔ&È$€DÜ(2°8¼TÔ(Bˆ8�<‰<˜Ô$È€DØÐ¤
¨4´Ô 5ð	Ü—:‘:˜dÓ#ˆDð �f‰f�T‹lØ—‘�v˜zÓ*Ø!°Ñ5ñð øô ò 	Ü�t“9ŠDð	ús   ÂC ÃC$Ã#C$c                 ó¢   — 	 d„ | D «       D �cg c]  }|sŒ|‘Œ	 }}t        j                  d|i«      S c c}w # t        $ r t        | «      cY S w xY w)zÒRender a tool_calls list as a compact JSON string for OUTPUT_VALUE.

    Best-effort: returns ``str(tool_calls)`` if anything unexpected happens
    so OUTPUT_VALUE is never blanked on a malformed payload.
    c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr·   )rC  )r¹   rB  s     r2   r¼   z3_summarize_tool_calls_for_output.<locals>.<genexpr>Â  s   è ø€ Ò(WÀbÔ)=¸b×)AÑ(Wùs   ‚rT   )rç   rè   r  r:   )rT   ÚnÚ
normalizeds      r2   rK   rK   »  sU   € ðÙ(WÈJÔ(WÖ] 1Ò[\šQÐ]ˆ
Ð]Ü�z‰z˜<¨Ð4Ó5Ð5ùò ^øäò Ü�:‹Òðús   ‚7 �2•2™7 ²7 ·AÁAr1   c                 óŽ  — t        |«      }|syt        |«      D ]©  \  }}t        |«      }|€Œ|› dt        j                  › d|› �}|d   r#t        | |› dt        j                  › �|d   «       |d   }|d   r#t        | |› dt        j                  › �|d   «       |d   €Œ‡t        | |› dt        j                  › �|d   «       Œ« y)a  Emit ``MESSAGE_TOOL_CALLS.*`` for an assistant message that requested
    tool calls. Pure addition: only writes when ``tool_calls`` is non-empty.

    Accepts dicts or Pydantic message objects (e.g. ``litellm.Message``); the
    same applies to each tool_call entry.
    Nr#   r"  rá   râ   r@  )
rJ   r(   rC  r   ÚMESSAGE_TOOL_CALLSr
   r   ÚTOOL_CALL_IDÚTOOL_CALL_FUNCTION_NAMEÚ!TOOL_CALL_FUNCTION_ARGUMENTS_JSON)	r   r1   rI   rT   Útc_idxrA  rB  Ú	tc_prefixr+  s	            r2   rN   rN   È  sõ   € ô (¨Ó0€JÙØÜ# JÓ/ò ‰ˆ�Ü! &Ó)ˆØˆ:ØØ�h˜aÔ 1× DÑ DÐEÀQÀvÀhÐOˆ	ØˆdŠ8Ü˜t¨	 {°!Ô4F×4SÑ4SÐ3TÐ%UÐWYÐZ^ÑW_Ô`Ø�
‰^ˆØˆfŠ:ÜØØ�+˜QÔ1×IÑIÐJÐKØ�6‘
ôð
 ˆk‰?Ñ&ÜØØ�+˜QÔ1×SÑSÐTÐUØ�;‘õñr4   rI   c                 ó²  — t        |t        «      sy|j                  d«      }|r t        | |› dt        j
                  › �|«       |j                  d«      }|r t        | |› dt        j                  › �|«       t        | ||«       |j                  d«      }t        |t        «      �r±|› dt        j                  › �}t        |«      D �]Œ  \  }}t        |t        «      sŒ|› d|› �}	|j                  d«      }
|
dv rc|j                  d«      }t        |t        «      sŒVt        | |	› dt        j                  › �d«       t        | |	› dt        j                  › �|«       Œ—|
d	v sŒœd}|j                  d
«      }t        |t        «      r|j                  d«      }nt        |t        «      r|}|st|j                  d«      }t        |t        «      r/|j                  d«      r|j                  dd«      }d|› d|d   › �}n$t        |j                  d«      t        «      r|d   }|s�Œ]t        | |	› dt        j                  › �d«       t        | |	› d�|«       �Œ� yy)a  Emit additive attributes for an input message:

    - `MESSAGE_NAME` and `MESSAGE_TOOL_CALL_ID` (commonly set on tool-result
      messages so traces show which tool produced which result).
    - `MESSAGE_TOOL_CALLS.*` when an assistant message requested tools.
    - `MESSAGE_CONTENTS.*` structured content for list-shaped content
      (multimodal text + image parts). The plain `MESSAGE_CONTENT` write is
      still performed by the caller, so renderers that only read the legacy
      key continue to work.
    Nrâ   r#   Útool_call_idr!   rw   )rm   r5  rm   )Ú	image_urlr]   Úinput_imagerQ  rW   ÚsourcerV   Ú
media_typez
image/jpegzdata:z;base64,r]   z .message_content.image.image.url)rå   r9   r&   r
   r   ÚMESSAGE_NAMEÚMESSAGE_TOOL_CALL_IDrN   ré   ÚMESSAGE_CONTENTSr(   r:   r   ÚMESSAGE_CONTENT_TYPEÚMESSAGE_CONTENT_TEXT)r   r1   rI   râ   rP  r!   Úcontents_prefixÚpart_idxr:  Úpart_prefixÚ	part_typerm   rW   r]   rS  rT  s                   r2   r-   r-   è  sX  € ô �gœtÔ$Øà—+‘+˜fÓ%€DÙÜ˜4 F 8¨1Ô->×-KÑ-KÐ,LÐ!MÈtÔTà!Ÿ+™+ nÓ5€LÙÜØØˆh�aÔ)×>Ñ>Ð?Ð@Øô	
ô ˜T 6¨7Ô3à—[‘[ Ó+€GÜ�'œ4Õ Ø$* 8¨1Ô->×-OÑ-OÐ,PÐ!QˆÜ'¨Ó0ó +	‰NˆH�dÜ˜d¤DÔ)ØØ,Ð-¨Q¨x¨jÐ9ˆKØŸ™ Ó(ˆIØÐ2Ñ2Ø—x‘x Ó'�Ü˜d¤CÕ(Ü&ØØ&˜- qÔ)A×)VÑ)VÐ(WÐXØôô
 'ØØ&˜- qÔ)A×)VÑ)VÐ(WÐXØõð
 ÐCÒCØ�ØŸ™ Ó-�Ü˜e¤TÔ*ØŸ)™) EÓ*‘CÜ ¤sÔ+Ø�CÙà!ŸX™X hÓ/�FÜ! &¬$Ô/°F·J±J¸vÔ4FØ%+§Z¡Z°¸lÓ%K˜
Ø % j \°¸&À¹.Ð9IÐJ™Ü# D§H¡H¨U£O´SÔ9Ø" 5™k˜ÛÜ&ØØ&˜- qÔ)A×)VÑ)VÐ(WÐXØôô
 'ØØ&˜-Ð'GÐHØöñO+	ð !r4   c                 ó’  — t        |t        «      sy|j                  d«      xs i }t        |t        «      sy|j                  d«      }|r$t        | t        j
                  t        |«      «       |j                  d«      }|rt        | dt        |«      «       |j                  d«      xs i }|j                  d«      xs i }t        t        |t        «      xr |j                  d«      xs# t        |t        «      xr |j                  d«      «      }|s7|j                  d	«      }	|	r$t        | t        j                  t        |	«      «       |j                  d
«      }
|
rt        | dt        |
«      «       |j                  d«      }|rt        | dt        |«      «       |j                  d«      }|rt        | dt        |«      «       yy)a¿  Emit `SESSION_ID` / `USER_ID` / team metadata when source data exists.

    `SESSION_ID` is emitted only when an explicit end-user identifier exists
    (`metadata.user_api_key_end_user_id`). We deliberately do NOT fall back
    to `trace_id`, because that would create a distinct "session" for every
    single request and distort Arize's Session-grouping analytics. The
    `trace_id` is still emitted under its own `litellm.trace_id` key so
    spans remain filterable by trace.

    USER_ID is *only* emitted when no upstream path (model_params.user or
    optional_params.user) has already set it, to avoid overwriting an
    existing value with a possibly-different one from API-key metadata.
    Nrô   Úuser_api_key_end_user_idÚtrace_idzlitellm.trace_idrñ   r÷   r!  Úuser_api_key_user_idÚuser_api_key_team_idzlitellm.team_idÚuser_api_key_team_aliaszlitellm.team_aliasÚuser_api_key_aliaszlitellm.key_alias)	rå   r9   r&   r
   r   Ú
SESSION_IDr:   Úboolr&  )r   r   rö   rô   Ú
session_idr`  rñ   r	  Úhas_user_alreadyr'  Úteam_idÚ
team_aliasÚ	key_aliass                r2   r  r  5  sŠ  € ô Ð.´Ô5ØØ.×2Ñ2°:Ó>ÒDÀ"€HÜ�h¤Ô%Øà Ÿ™Ð%?Ó@€JÙÜ˜4¤×!:Ñ!:¼CÀ
»OÔLà.×2Ñ2°:Ó>€HÙÜ˜4Ð!3´S¸³]ÔCà#ŸZ™ZÐ(9Ó:Ò@¸b€OØ2×6Ñ6Ð7IÓJÒPÈb€LÜ"Ü	�O¤TÓ	*Ò	J¨×/BÑ/BÀ6Ó/Jò 	IÜ�|¤TÓ*ÒG¨|×/?Ñ/?ÀÓ/GóÐñ Ø!Ÿ™Ð&<Ó=ˆÙÜ˜t¤^×%;Ñ%;¼SÀ»\ÔJà—\‘\Ð"8Ó9€GÙÜ˜4Ð!2´C¸³LÔAØ Ÿ™Ð%>Ó?€JÙÜ˜4Ð!5´s¸:³ÔGØ—|‘|Ð$8Ó9€IÙÜ˜4Ð!4´c¸)³nÕEð r4   c                 óÄ   — t        |t        «      sy|j                  d«      }|€y	 t        |«      }t        | d|«       t        | d|«       y# t        t
        f$ r Y yw xY w)a©  Emit cost attributes from the StandardLoggingPayload when present.

    Uses the OpenInference `llm.cost.total` key so Arize / Phoenix can
    surface the cost in their "Total Cost" column. LiteLLM only tracks a
    single total in `StandardLoggingPayload.response_cost`, so we cannot
    split it into prompt/completion. We also keep the legacy
    `llm.response.cost` key for back-compat with any consumer querying it.
    NÚresponse_costzllm.cost.totalzllm.response.cost)rå   r9   r&   Úfloatr‡   rü   r
   )r   rö   ÚcostÚ
cost_values       r2   r  r  g  sm   € ô Ð.´Ô5ØØ*×.Ñ.¨Ó?€DØ€|ØðÜ! $›Kˆ
ô �tÐ-¨zÔ:Ü�tÐ0°*Õ=øô ”zÐ"ò Ùðús   §A ÁAÁAc                 óN   — | syt        | «      j                  «       }d|v xs d|v S )NFrÇ   rÆ   )r:   rÑ   rÜ   s     r2   Ú_is_passthrough_call_typerr  }  s/   € ÙØÜ˜“^×)Ñ)Ó+€GØ˜GÐ#Ò@ ~¸Ð'@Ð@r4   c                 ó”  — t        |t        «      r|j                  d«      nd}t        |«      syt	        |«      ry|j                  d«      xs i }t        |t        «      r|j                  d«      nd}t        |t        «      rt        | |j                  d«      «       t        |||«      }t        |t        «      syt        | |«       y)am  Surface input/output text for passthrough routes (e.g. Bedrock
    InvokeModel) so the parent span renders as more than `usage` numbers.

    Only runs when `call_type` is a passthrough variant. Reads from:
      - `kwargs["additional_args"]["complete_input_dict"]` for input
      - the coerced response (or `kwargs["original_response"]`) for output

    All emits are best-effort: if the provider shape isn't recognized the
    helper exits silently. Existing chat/completion paths never enter this
    helper because their call_type doesn't contain "passthrough".

    TEMPORARY BRIDGE: passthrough handlers don't populate the
    StandardLoggingPayload `messages` field today (they call
    `transform_response(messages=[])`), so the input is only available via
    `additional_args.complete_input_dict`. The proper fix is upstream in
    `base_passthrough_logging_handler._create_response_logging_payload()`:
    once that populates SLP `messages`/`response`, every callback gets
    passthrough I/O (with central redaction) for free and this helper's
    `complete_input_dict` fallback can be deleted. See follow-up issue.
    r©   NÚadditional_argsÚcomplete_input_dictr   )rå   r9   r&   rr  r   Ú!_set_passthrough_input_attributesÚ_parse_passthrough_responseÚ"_set_passthrough_output_attributes)	r   r   Úraw_response_objÚcoerced_response_objrö   r©   rt  ru  Úparsed_responses	            r2   r  r  „  s¾   € ô6 EOÐOgÔimÔDnÐ/×3Ñ3°KÔ@Ðtx€IÜ$ YÔ/Øô % VÔ,Øð $ŸZ™ZÐ(9Ó:Ò@¸b€OÜHRÐSbÔdhÔHi˜/×-Ñ-Ð.CÔDÐosÐÜÐ%¤tÔ,Ü)¨$Ð0C×0GÑ0GÈ
Ó0SÔTô 9Ð9IÐK_ÐagÓh€OÜ�o¤tÔ,Øä& t¨_Õ=r4   c                 ó8  — t        |t        «      r|syd}t        |«      D ]1  }t        |t        «      sŒt	        |j                  d«      «      }|sŒ1 n |rt        | t        j                  |«       t        |«      D ]›  \  }}t        |t        «      sŒt        j                  › d|› �}|j                  d«      }|r t        | |› dt        j                  › �|«       t	        |j                  d«      «      }|€Œ|t        | |› dt        j                  › �|«       Œ� y)zJRender passthrough request messages into INPUT_VALUE + LLM_INPUT_MESSAGES.Nr!   r#   r$   )rå   ré   Úreversedr9   r;  r&   r
   r   r'   r(   r)   r   r*   r+   )r   r   Ú	last_textr0   r/   r1   r$   rm   s           r2   rv  rv  º  s  € ä�x¤Ô&©8Øà€IÜ˜Ó!ò ˆÜ�cœ4Õ Ü$ S§W¡W¨YÓ%7Ó8ˆIÚÙð	ñ
 Ü˜4¤×!;Ñ!;¸YÔGä˜hÓ'ò ‰ˆˆSÜ˜#œtÔ$ØÜ"×5Ñ5Ð6°a¸°uÐ=ˆØ�w‰w�v‹ˆÙÜØØ�(˜!Ô-×:Ñ:Ð;Ð<Øôô
 ˜CŸG™G IÓ.Ó/ˆØÑÜØØ�(˜!Ô-×=Ñ=Ð>Ð?Øõñr4   r{  c                 ó  — |j                  d«      }t        |t        «      rè|ræg }|D ]G  }t        |t        «      sŒt        |j                  d«      t        «      sŒ4|j                  |d   «       ŒI dj                  d„ |D «       «      }|r~t        | t        j                  |«       t        j                  › d�}t        | |› dt        j                  › �|j                  dd«      «       t        | |› dt        j                  › �|«       |j                  d	«      }t        |t        «      r×|rÔ|d
   }t        |t        «      r¾|j                  d«      }	t        |	t        «      rœt        |	j                  d«      «      }
|
rt        | t        j                  |
«       t        j                  › d�}t        | |› dt        j                  › �|	j                  dd«      «       t        | |› dt        j                  › �|
«       yyyyyy)zDRender passthrough response into OUTPUT_VALUE + LLM_OUTPUT_MESSAGES.r!   rm   z

c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­wr·   r;   )r¹   Úts     r2   r¼   z5_set_passthrough_output_attributes.<locals>.<genexpr>å  s   è ø€ Ò#:¨!º¤AÑ#:ùs   ‚Šz.0r#   r$   rz   rH   r   rI   N)r&   rå   ré   r9   r:   r7  r8  r
   r   rL   rM   r   r*   r+   r;  )r   r{  r‚   Útextsr:  Újoinedr1   rH   Úfirstr0   rm   s              r2   rx  rx  Ü  så  € ð *×-Ñ-¨iÓ8€LÜ�,¤Ô%©,ØˆØ ò 	+ˆDÜ˜$¤Õ%¬*°T·X±X¸fÓ5EÄsÕ*KØ—‘˜T &™\Õ*ð	+ð Ÿ™Ñ#:¨uÔ#:Ó:ˆÙÜ˜t¤^×%@Ñ%@À&ÔIÜ&×:Ñ:Ð;¸2Ð>ˆFÜØØ�(˜!Ô-×:Ñ:Ð;Ð<Ø×#Ñ# F¨KÓ8ôô
 ØØ�(˜!Ô-×=Ñ=Ð>Ð?Øôð %×(Ñ(¨Ó3€GÜ�'œ4Ô ¡WØ˜q‘zˆÜ�eœTÔ"ØŸ™ 9Ó-ˆCÜ˜#œtÔ$Ü*¨3¯7©7°9Ó+=Ó>�ÙÜ& t¬^×-HÑ-HÈ$ÔOÜ .× BÑ BÐCÀ2ÐF�FÜ&ØØ!˜( !Ô$5×$BÑ$BÐ#CÐDØŸ™ ¨Ó4ôô
 'ØØ!˜( !Ô$5×$EÑ$EÐ#FÐGØõð ð %ð #ð &-Ð r4   c                 óœ  — g }t        |t        «      r|j                  |«       t        | t        «      r| |ur|j                  | «       |D ]r  }d|v rid|vred|vra|j                  d«      }t        |t        «      r+	 t        j                  |«      }t        |t        «      r|c S 	 t        |t        «      sŒl|c S |c S  t        |t        «      r|j                  d«      nd}t        |t        «      r|S t        |t        «      r*	 t        j                  |«      }t        |t        «      r|S 	 yy# t        $ r Y Œðw xY w# t        $ r Y yw xY w)zCReturn a dict view of the provider response for passthrough routes.rÃ   r!   rH   Úoriginal_responseN)rå   r9   r7  r&   r:   rç   r1  r  )ry  rz  r   Ú
candidatesÚ	candidateÚinnerr3  Úoriginals           r2   rw  rw    sL  € ð €JÜÐ&¬Ô-Ø×ÑÐ.Ô/ÜÐ"¤DÔ)Ð.>ÐFZÑ.ZØ×ÑÐ*Ô+àò ˆ	à˜Ñ" y¸	Ñ'AÀiÐW`ÑF`Ø—M‘M *Ó-ˆEÜ˜%¤Ô%ðÜ!ŸZ™Z¨Ó.�FÜ! &¬$Ô/Ø%šð 0ô ˜%¤Õ&Ø’àÒðô" :DÀFÌDÔ9Q�f—j‘jÐ!4Ô5ÐW[€HÜ�(œDÔ!ØˆÜ�(œCÔ ð	Ü—Z‘Z Ó)ˆFÜ˜&¤$Ô'Ø�ð (ñ øô% !ò Ùðûô  ò 	Ùð	ús$   Á<&D0Ä&D? Ä0	D<Ä;D<Ä?	EÅ
Erz  c                 ó<  — |€y|j                  d«      t        j                  j                  k7  ry|j                  d«      }|r|j                  d«      nd}|€y|j                  d«      xs |j                  d«      }|rt	        | t
        j                  |«       t        |«      ry|j                  d«      }|�Wt	        | t
        j                  t        |«      «       t	        | t
        j                  t        j                  j                  «       t        | |«       y)aW  Render `call_mcp_tool` spans as OpenInference TOOL spans.

    MCP tool calls carry neither `messages` nor `choices`, so the generic
    extraction paths leave Input/Output blank. The tool name and arguments live
    in `metadata.mcp_tool_call_metadata`; the result is an MCP `CallToolResult`
    whose `content` is a list of typed parts.
    Nr©   rô   Úmcp_tool_call_metadatarâ   Únamespaced_tool_namer@  )r&   r   r±   rÐ   r
   r   Ú	TOOL_NAMEr   r'   r   ÚINPUT_MIME_TYPEr   ÚJSONÚ_set_mcp_tool_output)r   r   rö   rz  rô   Úmcp_metarë   r@  s           r2   r  r  2  sî   € ð  Ð'ØØ×#Ñ# KÓ0´I×4KÑ4K×4QÑ4QÒQØà.×2Ñ2°:Ó>€HÙck¸¿¹ÐF^Ô9_Ðqu€HØÐØà—|‘| FÓ+ÒS¨x¯|©|Ð<RÓ/S€IÙÜ˜4¤×!9Ñ!9¸9ÔEä$ VÔ,Øà'Ÿ|™|¨KÓ8€IØÐÜ˜4¤×!;Ñ!;¼ZÈ	Ó=RÔSÜ˜4¤×!?Ñ!?ÔA\×AaÑAa×AgÑAgÔhä˜Ð3Õ4r4   r!   c                 óL   — t        | t        «       xs t        d„ | D «       «      S )Nc              3   ó8   K  — | ]  }t        |g«      d u–— Œ y ­wr·   )r;  )r¹   r:  s     r2   r¼   z'_has_only_text_parts.<locals>.<genexpr>Y  s   è ø€ Ò/eÐUY´¸d¸VÓ0DÈDÔ0PÑ/eùs   ‚)rå   ré   Úall)r!   s    r2   Ú_has_only_text_partsr–  X  s#   € Ü˜'¤4Ó(Ð(Òe¬CÑ/eÐ]dÔ/eÓ,eÐer4   c                 ó   — t        |t        «      sy |j                  d«      }t        |«      }|rZt	        |«      rOt        | t        j                  |«       t        | t        j                  t        j                  j                  «       y |j                  d«      }|r|n|�|n|}|€y t        | t        j                  t        |«      «       t        | t        j                  t        j                  j                  «       y )Nr!   ÚstructuredContent)rå   r   r&   r;  r–  r
   r   rL   ÚOUTPUT_MIME_TYPEr   ÚTEXTrÐ   r   r�  )r   rz  r!   rm   Ú
structuredÚpayloads         r2   r‘  r‘  \  sÉ   € ÜÐ*¬GÔ4Øà1×5Ñ5°iÓ@€GÜ*¨7Ó3€DÙÔ$ WÔ-Ü˜4¤×!<Ñ!<¸dÔCÜ˜4¤×!@Ñ!@ÔB]×BbÑBb×BhÑBhÔiØà 4× 8Ñ 8Ð9LÓ M€JÙ(/™WÀ:ÐCY±ZÐ_f€GØ€Øä�tœ^×8Ñ8¼*ÀWÓ:MÔNÜ�tœ^×<Ñ<Ô>Y×>^Ñ>^×>dÑ>dÕer4   )r   r   r·   )r   r   rª   N)Nrç   Úcollections.abcr   Útypingr   r   r   Útyping_extensionsr   Úlitellm._loggingr   ÚElitellm.integrations.opentelemetry_utils.base_otel_llm_obs_attributesr	   r
   Ú*litellm.litellm_core_utils.redact_messagesr   Ú*litellm.litellm_core_utils.safe_json_dumpsr   Úlitellm.types.utilsr   r   r   Úopentelemetry.tracer   Ú*litellm.integrations._types.open_inferencer   r   r   r   r   r   r   r   r   r   rF   r>   r?   r@   rA   rB   rŒ   rC   r:   rÝ   ré   rî   rw   r  r9   rû   rý   rþ   rÿ   r   r  r,   rú   rù   r;  r0  rJ   rC  rK   rN   r-   r  r  rf  rr  r  rv  rx  rw  Úobjectr  r–  r‘  r;   r4   r2   ú<module>r¨     s\  ðÛ Ý #ß ,Ñ ,å &å +÷õõ Bß ]Ñ ]áÝ(÷
÷ 
õ 
ô'Ð2ô 'ó`;ó#
óLJó ^ó*ó6Yó8&ó,9
ðx75¨s°T©zð 75¸có 75ðt-˜vð -°t¸d±{ð -ÐTXÐ[_ÑT_ó -ð`Hg˜ð HgÀ4ÐH`ÑCaó HgðV¨t°d©{ð ¸tó ðL 6ð L°S¸4±Zð LÐPTó Lð
 c¨D¡jð °T¸D±[ó ðW¨Tð W°d¸T±kó Wð%RØ
ð%Rð 5ð%Rð ð	%Rð
 ó%RðPB˜Fð B°$¸±+ð BÈdó Bð"A�cð A°4ó Að˜vð ¨tð ¸ó òð:˜3 ™:ó ò6ð"O  t¡ó Oð D¨¨c¨¡N°TÑ$9ó ð4
°Có 
ð 6ð °3ð ÀDó ð@J Vð J°Sð JÀ4ð JÈDó JðZ/F fð /F°dð /FÐY]ó /Fód>ð,A¨¨t©ð A¸ó Að3>Ø
ð3>àð3>ð 
ó3>ólðD,¨Vð ,Àdð ,Ètó ,ò^$ðN#5Ø
ð#5à�C˜�KÑ ð#5ð 5°tÑ;ð#5ð !ð	#5ð
 
ó#5ðLf &ð f¨Tó fðf˜vð f¸Vð fÈô fr4   