Ë
    tPêj8  ã                   óŒ   — d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZmZmZmZmZmZmZ ddlmZmZmZ  G d„ d	«      Zy)
ur  OpenInference attribute mapper (Arize + Arize-Phoenix shared vocabulary).

Spec: https://github.com/Arize-ai/openinference/tree/main/spec â€” the standard
both Arize and Phoenix consume. Composing this mapper after ``GenAIMapper``
gives the same span both vocabularies, so a single trace lights up Arize +
Phoenix + any other OpenInference-aware backend simultaneously.
é    N)ÚCallableÚSequence)ÚFinal)ÚAttributeMapÚ	AttrValueÚSpanData)Ú"MAX_TOOL_DEFINITION_ATTRS_PER_SPANÚcollectÚ	drop_noneÚjson_ifÚmessage_contentÚoutput_messagesÚtool_definition_attrs)ÚLLMCallSpanDataÚLLMRequestParamsÚToolDefinitionc            	       ór  — e Zd ZU dZd„ d„ d„ d„ d„ d„ dœZeeeege	d	z  f   f   e
d
<   d„ d„ d„ d„ d„ d„ d„ dœZeeeege	d	z  f   f   e
d<   d„ d„ d„ dœZeeeege	d	z  f   f   e
d<   dd„ iZeeeege	d	z  f   f   e
d<   efdedd	fd„Zdedefd „Zdedefd!„Zed"ed#ed$ee   defd%„«       Zdedefd&„Zy	)'ÚOpenInferenceMapperu  Emits OpenInference attributes for LLM_CALL spans.

    Key families (per the OpenInference spec):
    - ``openinference.span.kind`` â€” discriminator (``"LLM"`` here)
    - ``llm.model_name`` / ``llm.provider`` / ``llm.invocation_parameters``
    - ``llm.input_messages.{i}.message.role`` / ``...content``
    - ``llm.output_messages.{i}.message.role`` / ``...content``
    - ``llm.token_count.prompt`` / ``...completion`` / ``...total``
    - ``input.value`` / ``output.value`` â€” JSON-serialized request / response
    c                  ó   — y)NÚLLM© ©Úds    út/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/otel/mappers/openinference.pyú<lambda>zOpenInferenceMapper.<lambda>+   s   � ó    c                 ó"   — | j                   xs d S ©N)Úrequest_modelr   s    r   r   zOpenInferenceMapper.<lambda>,   s   €  A§O¡OÒ$;°t€ r   c                 ó"   — | j                   xs d S r   )Úproviderr   s    r   r   zOpenInferenceMapper.<lambda>-   s   €  !§*¡*Ò"4°€ r   c                 ó.   — | j                   j                  S r   )ÚusageÚinput_tokensr   s    r   r   zOpenInferenceMapper.<lambda>.   s   € ¨A¯G©G×,@Ñ,@€ r   c                 ó.   — | j                   j                  S r   )r#   Úoutput_tokensr   s    r   r   zOpenInferenceMapper.<lambda>/   s   € °·±×0EÑ0E€ r   c                 ó.   — | j                   j                  S r   )r#   Útotal_tokensr   s    r   r   zOpenInferenceMapper.<lambda>0   s   € ¨1¯7©7×+?Ñ+?€ r   )zopeninference.span.kindzllm.model_namezllm.providerzllm.token_count.promptzllm.token_count.completionzllm.token_count.totalNÚ_LLM_CALL_ATTRSc                 ó   — | j                   S r   )Útemperature©Úrps    r   r   zOpenInferenceMapper.<lambda>5   s
   €  "§.¡.€ r   c                 ó   — | j                   S r   )Útop_pr,   s    r   r   zOpenInferenceMapper.<lambda>6   ó
   € ˜BŸH™H€ r   c                 ó   — | j                   S r   )Útop_kr,   s    r   r   zOpenInferenceMapper.<lambda>7   r0   r   c                 ó   — | j                   S r   )Ú
max_tokensr,   s    r   r   zOpenInferenceMapper.<lambda>8   s
   €  §¡€ r   c                 ó   — | j                   S r   )Úfrequency_penaltyr,   s    r   r   zOpenInferenceMapper.<lambda>9   s   € ¨×(<Ñ(<€ r   c                 ó   — | j                   S r   )Úpresence_penaltyr,   s    r   r   zOpenInferenceMapper.<lambda>:   s   €  r×':Ñ':€ r   c                 ó   — | j                   S r   )Úseedr,   s    r   r   zOpenInferenceMapper.<lambda>;   s
   € ˜2Ÿ7™7€ r   )r+   r/   r2   r4   r6   r8   r:   Ú_INVOCATION_PARAMSc                 ó   — | j                   S r   )Úname©Úts    r   r   zOpenInferenceMapper.<lambda>@   s
   € ˜qŸv™v€ r   c                 ó"   — | j                   xs d S r   )Údescriptionr>   s    r   r   zOpenInferenceMapper.<lambda>A   s   €  a§m¡mÒ&;°t€ r   c                 ó"   — | j                   xs d S r   )Úparameters_jsonr>   s    r   r   zOpenInferenceMapper.<lambda>B   s   €  a×&7Ñ&7Ò&?¸4€ r   )z	tool.nameztool.descriptionztool.json_schemaÚ_TOOL_ATTRSzllm.invocation_parametersc                 ó\   — t        t        t        j                  | j                  «      «      S r   )r   r
   r   r;   Úrequest_paramsr   s    r   r   zOpenInferenceMapper.<lambda>G   s"   € ¬wÜÔ'×:Ñ:¸A×<LÑ<LÓMó0
€ r   Ú_BLOB_ATTRSÚtool_attr_budgetÚreturnc                 ó   — || _         y r   )Ú_tool_attr_budget)ÚselfrH   s     r   Ú__init__zOpenInferenceMapper.__init__L   s
   € Ø!1ˆÕr   Údatac                 óD   — |t         d˜ x�\   | j                  |«      S  	 i S )Nr   )r   Ú	_llm_call©rL   rN   s     r   ÚmapzOpenInferenceMapper.mapO   s'   € ØÜ Õ"Ø—~‘~ dÓ+Ð+ð #àØ�	r   c                 óò   — i t        | j                  |«      ¥t        | j                  |«      ¥| j                  dd|j                  «      ¥| j                  ddt        |«      «      ¥| j                  |«      ¥S )Nzllm.input_messageszinput.valuezllm.output_messageszoutput.value)r
   r)   rG   Ú	_messagesÚmessages_inr   Ú_toolsrQ   s     r   rP   zOpenInferenceMapper._llm_callV   s…   € ð
Ü�d×*Ñ*¨DÓ1ð
ä�d×&Ñ&¨Ó-ð
ð �n‰nÐ1°=À$×BRÑBRÓSð
ð �n‰nÐ2°NÄOÐTXÓDYÓZð	
ð
 �k‰k˜$Óð
ð 	
r   ÚprefixÚ	value_keyÚmessagesc                 óÂ  — |D �cg c]0  }t        |t        «      r|j                  d«      ndt        |«      f‘Œ2 }}t	        t        |«      D �����	ci c]9  \  }\  }}| › d|› d�t        |t        «      r|ndf| › d|› d�|ffD ]  \  }}	||	“Œ
 Œ; c}	}}}}«      }
|r.t        j                  |D ��cg c]
  \  }}||dœ‘Œ c}}«      |
|<   |
S c c}w c c}	}}}}w c c}}w )zGPer-message ``{prefix}.{idx}.message.*`` keys + the ``value_key`` blob.ÚroleNú.z.message.rolez.message.content)r[   Úcontent)	Ú
isinstanceÚdictÚgetr   r   Ú	enumerateÚstrÚjsonÚdumps)rW   rX   rY   ÚmÚparsedÚidxr[   r]   ÚkeyÚvalueÚattrss              r   rT   zOpenInferenceMapper._messages_   s  € ð hpÖpÐbc¬:°a¼Ô+>˜!Ÿ%™% œ-ÀDÌ/ÐZ[ÓJ\Ò]ÐpˆÐpÜ ô -6°fÓ,=÷
ò 
á(�C™˜$ ð "˜( ! C 5¨Ð6Ü *¨4´Ô 5™¸4ðð �x˜q  Ð%5Ð6¸Ð@ð#ò
ñ �C˜ð �U‘
ð
Øö
ó
ˆñ Ü#Ÿz™zÐci×*jÑR_ÐRVÐX_°DÀWÓ+MÓ*jÓkˆE�)ÑØˆùò! qùö
ùó +ks   …5CÁ>CÂ1C
c                 ó\   — t        d„ |j                  | j                  | j                  «      S )Nc                 ó   — d| › d|› �S )Nz
llm.tools.r\   r   )rg   Úsuffixs     r   r   z,OpenInferenceMapper._tools.<locals>.<lambda>v   s   €  *¨S¨E°°6°(Ð ;€ r   )r   ÚtoolsrD   rK   rQ   s     r   rV   zOpenInferenceMapper._toolst   s+   € Ü$Ù;Ø�J‰JØ×ÑØ×"Ñ"ó	
ð 	
r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   r_   rb   r   r   r   Ú__annotations__r;   r   rD   r   rG   r	   ÚintrM   r   r   rR   rP   Ústaticmethodr   ÚobjectrT   rV   r   r   r   r   r      s}  … ñ	ñ $3Ù;Ù4Ù"@Ù&EÙ!?ñQ€O�T˜#˜x¨Ð(9¸9ÀtÑ;KÐ(KÑLÐLÑMó ñ 1Ù$Ù$Ù.Ù<Ù:Ù"ñUÐ˜˜S (Ð,<Ð+=¸yÈ4Ñ?OÐ+OÑ"PÐPÑQó ñ &Ù;Ù?ñL€K��c˜8 ^Ð$4°iÀ$Ñ6FÐ$FÑGÐGÑHó ð 	$ñ &
ðM€K��c˜8 _Ð$5°yÀ4Ñ7GÐ$GÑHÐHÑIó ð 0Rñ 2¨ð 2ÐVZó 2ð˜ð  \ó ð
˜oð 
°,ó 
ð ð˜#ð ¨#ð ¸À&Ñ9Ið Èlò ó ðð(
˜?ð 
¨|ô 
r   r   )rr   rc   Úcollections.abcr   r   Útypingr   Ú&litellm.integrations.otel.mappers.baser   r   r   Ú'litellm.integrations.otel.mappers.utilsr	   r
   r   r   r   r   r   Ú(litellm.integrations.otel.model.payloadsr   r   r   r   r   r   r   ú<module>r|      s@   ðñó ß .Ý ç TÑ T÷÷ ñ ÷ñ ÷\
ò \
r   