Ë
    tPêj´  ã                   óp   — d Z ddl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 ddlmZmZmZ  G d„ d«      Zy)	aæ  Langfuse OTLP attribute mapper.

Langfuse ingests OTLP spans and reads from its own vendor namespace
(``langfuse.observation.*``, ``langfuse.trace.*``). Compose this mapper after
``GenAIMapper`` to send canonical + Langfuse-flavored spans simultaneously.

Every attribute is declared as a ``key -> extractor`` table entry (one callable
per mapping operation): ``_LLM_CALL_ATTRS`` for scalars and ``_BLOB_ATTRS`` for
the JSON-serialized payloads. ``_llm_call`` just applies both tables.
é    N)ÚCallable)ÚAttributeMapÚ	AttrValueÚSpanData)ÚcollectÚjson_ifÚoutput_messagesÚserialize_messages)ÚLLMCallSpanDataÚLLMRequestParamsÚLLMUsagec                   ó8  — e Zd ZU 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œ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„ d„ d„ d„ dœZeeeegedz  f   f   e	d<   dedefd „Zededefd!„«       Zy)"ÚLangfuseMapperc                  ó   — y)NÚ
generation© ©Úds    úo/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/otel/mappers/langfuse.pyú<lambda>zLangfuseMapper.<lambda>   s   � ó    c                 ó"   — | j                   xs d S ©N)Úrequest_modelr   s    r   r   zLangfuseMapper.<lambda>    s   € °Q·_±_Ò5LÈ€ r   c                 ó"   — | j                   xs d S r   )Úproviderr   s    r   r   zLangfuseMapper.<lambda>!   s   € ¸A¿J¹JÒ<NÈ$€ r   c                 ó6   — | j                   j                  xs d S r   )ÚidentityÚcall_idr   s    r   r   zLangfuseMapper.<lambda>"   s   € ¨Q¯Z©Z×-?Ñ-?Ò-GÀ4€ r   c                 ó6   — | j                   j                  xs d S r   )r   Úteam_idr   s    r   r   zLangfuseMapper.<lambda>#   s   € °Q·Z±Z×5GÑ5GÒ5OÈ4€ r   c                 ó6   — | j                   j                  xs d S r   )r   Ú
team_aliasr   s    r   r   zLangfuseMapper.<lambda>$   s   € ¸¿
¹
×8MÑ8MÒ8UÐQU€ r   )zlangfuse.observation.typezlangfuse.observation.model.namez&langfuse.observation.metadata.providerzlangfuse.observation.idzlangfuse.trace.metadata.team_idz"langfuse.trace.metadata.team_aliasNÚ_LLM_CALL_ATTRSc                 ó   — | j                   S r   )Útemperature©Úrps    r   r   zLangfuseMapper.<lambda>)   s
   €  "§.¡.€ r   c                 ó   — | j                   S r   )Útop_pr'   s    r   r   zLangfuseMapper.<lambda>*   s
   € ˜BŸH™H€ r   c                 ó   — | j                   S r   )Ú
max_tokensr'   s    r   r   zLangfuseMapper.<lambda>+   s
   €  §¡€ r   c                 ó   — | j                   S r   )Úfrequency_penaltyr'   s    r   r   zLangfuseMapper.<lambda>,   s   € ¨×(<Ñ(<€ r   c                 ó   — | j                   S r   )Úpresence_penaltyr'   s    r   r   zLangfuseMapper.<lambda>-   s   €  r×':Ñ':€ r   c                 ó   — | j                   S r   )Úseedr'   s    r   r   zLangfuseMapper.<lambda>.   s
   € ˜2Ÿ7™7€ r   )r&   r*   r,   r.   r0   r2   Ú_MODEL_PARAMSc                 ó   — | j                   S r   )Úinput_tokens©Úus    r   r   zLangfuseMapper.<lambda>1   ó
   € ˜1Ÿ>™>€ r   c                 ó   — | j                   S r   )Úoutput_tokensr6   s    r   r   zLangfuseMapper.<lambda>2   s
   € ˜AŸO™O€ r   c                 ó   — | j                   S r   )Útotal_tokensr6   s    r   r   zLangfuseMapper.<lambda>3   r8   r   )ÚinputÚoutputÚtotalÚ_USAGE_FIELDSc                 ó\   — t        t        t        j                  | j                  «      «      S r   )r   r   r   r3   Úrequest_paramsr   s    r   r   zLangfuseMapper.<lambda>8   s!   € ¼7Ü”N×0Ñ0°!×2BÑ2BÓCó<
€ r   c                 ó,   — t        | j                  «      S r   )r
   Úmessages_inr   s    r   r   zLangfuseMapper.<lambda>;   s   € Ô0BÀ1Ç=Á=Ó0Q€ r   c                 ó*   — t        t        | «      «      S r   )r
   r	   r   s    r   r   zLangfuseMapper.<lambda><   s   € Ô1CÄOÐTUÓDVÓ1W€ r   c                 ó\   — t        t        t        j                  | j                  «      «      S r   )r   r   r   r@   Úusager   s    r   r   zLangfuseMapper.<lambda>=   s   € ¼ÄÌ×HdÑHdÐfg×fmÑfmÓ@nÓ8o€ r   c                 ó`   — | j                   �!t        j                  d| j                   i«      S d S )Nr?   )Úresponse_costÚjsonÚdumpsr   s    r   r   zLangfuseMapper.<lambda>>   s-   € Ø67·o±oÐ6QŒD�J‰J˜ §¡Ð1Ó2ð ØW[ð r   )z%langfuse.observation.model.parameterszlangfuse.observation.inputzlangfuse.observation.outputz"langfuse.observation.usage_detailsz!langfuse.observation.cost_detailsÚ_BLOB_ATTRSÚdataÚreturnc                 óD   — |t         d˜ x�\   | j                  |«      S  	 i S )Nr   )r   Ú	_llm_call)ÚselfrM   s     r   ÚmapzLangfuseMapper.mapC   s'   € ØÜ Õ"Ø—~‘~ dÓ+Ð+ð #àØ�	r   c                 ó^   — i t        | j                  |«      ¥t        | j                  |«      ¥S r   )r   r$   rL   )ÚclsrM   s     r   rP   zLangfuseMapper._llm_callJ   s4   € ð
Ü�c×)Ñ)¨4Ó0ð
ä�c—o‘o tÓ,ð
ð 	
r   )Ú__name__Ú
__module__Ú__qualname__r$   ÚdictÚstrr   r   r   Ú__annotations__r3   r   r@   r   rL   r   r   rR   ÚclassmethodrP   r   r   r   r   r      s*  … á%;Ù+LÙ2NÙ#GÙ+OÙ.UñQ€O�T˜#˜x¨Ð(9¸9ÀtÑ;KÐ(KÑLÐLÑMó ñ 1Ù$Ù.Ù<Ù:Ù"ñP€M�4˜˜XÐ'7Ð&8¸)ÀdÑ:JÐ&JÑKÐKÑLó ñ *Ù+Ù)ñH€M�4˜˜X x j°)¸dÑ2BÐ&BÑCÐCÑDó ñ2
ñ 'RÙ'WÙ.oñ.
ñ
M€K��c˜8 _Ð$5°yÀ4Ñ7GÐ$GÑHÐHÑIó 
ð˜ð  \ó ð ð
˜_ð 
°ò 
ó ñ
r   r   )Ú__doc__rJ   Úcollections.abcr   Ú&litellm.integrations.otel.mappers.baser   r   r   Ú'litellm.integrations.otel.mappers.utilsr   r   r	   r
   Ú(litellm.integrations.otel.model.payloadsr   r   r   r   r   r   r   ú<module>ra      s6   ðñ	ó Ý $ç TÑ T÷ó ÷ñ ÷2
ò 2
r   