Ë
    ³ŒjŸ  ã                  óx   — d Z ddlmZ ddlZddlmZ ddlmZmZ ddlm	Z	m
Z
 dd„Zdd„Zdd	„Zdd
„Zdd„Zdd„Zy)u@   Small pure helpers for the Pipecat â†’ LangSmith span processor.é    )ÚannotationsN)Údatetime)ÚAnyÚOptional)Úbuild_assistant_messageÚtry_parse_json_objectc                óà   — 	 t        j                  | «      }t	        |t
        «      sg S |D �cg c]  }t	        |t        «      sŒ|‘Œ c}S # t         j                  t        f$ r g cY S w xY wc c}w )zHParse a Pipecat ``llm`` span's ``input`` (a JSON message list) to dicts.)ÚjsonÚloadsÚJSONDecodeErrorÚ	TypeErrorÚ
isinstanceÚlistÚdict)Ú
input_dataÚrawÚms      úq/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langsmith/integrations/pipecat/_helpers.pyÚparse_llm_messagesr      si   € ðÜ�j‰j˜Ó$ˆô �cœ4Ô Øˆ	ÙÓ2‘s�!œj¨¬DÕ1ŠA�sÑ2Ð2øô	 × Ñ ¤)Ð,ò ØŠ	ðüò 3s   ‚A
 ­A+ÁA+Á
A(Á'A(c                óH   — t        | t        t        f«      rt        | «      S dS )zHCoerce a numeric span-attribute value to ``int``, or ``None`` otherwise.N)r   ÚintÚfloat)Úvalues    r   Ú_as_intr      s   € ä# E¬C´¨<Ô8Œ3ˆu‹:ÐB¸dÐBó    c                ón  — i }t        | j                  d«      «      x}�||d<   t        | j                  d«      «      x}�||d<   i }t        | j                  d«      «      x}	 �||d<   t        | j                  d«      «      x}	 �||d<   |r||d	<   t        | j                  d
«      «      x}�d|i|d<   |S )zFRead Pipecat's ``gen_ai.usage.*`` span keys into ``set_usage`` kwargs.zgen_ai.usage.input_tokensÚinput_tokenszgen_ai.usage.output_tokensÚoutput_tokensz$gen_ai.usage.cache_read.input_tokensÚ
cache_readz(gen_ai.usage.cache_creation.input_tokensÚcache_creationÚinput_token_detailszgen_ai.usage.reasoning_tokensÚ	reasoningÚoutput_token_details)r   Úget)Ú
attributesÚusageÚvÚinput_details       r   Úextract_llm_usager)      sè   € à€EÜ�Z—^‘^Ð$?Ó@ÓAÐAˆÐNØ !ˆˆnÑÜ�Z—^‘^Ð$@ÓAÓBÐBˆÐOØ!"ˆˆoÑØ#%€Lä�Z—^‘^Ð$JÓKÓLÐLˆØðð &'ˆ�\Ñ"ä�Z—^‘^Ð$NÓOÓPÐPˆØðð *+ˆÐ%Ñ&ÙØ'3ˆÐ#Ñ$Ü�Z—^‘^Ð$CÓDÓEÐEˆÐRØ)4°aÐ(8ˆÐ$Ñ%Ø€Lr   c                ó¶   — t        | «      }t        |t        «      r|j                  d«      rddi|¥S t        | t        «      r| n
t	        | «      }t        |«      S )zÄBuild the assistant completion for a Pipecat ``llm`` span.

    A structured response carrying ``tool_calls`` is forwarded in its OpenAI
    shape; anything else becomes plain assistant text.
    Ú
tool_callsÚroleÚ	assistant)r   r   r   r$   Ústrr   )Úoutput_dataÚparsedÚcontents      r   Úbuild_completion_messager2   6   sS   € ô # ;Ó/€FÜ�&œ$Ô F§J¡J¨|Ô$<Ø˜Ð. vÐ.Ð.Ü'¨´SÔ9‰k¼sÀ;Ó?O€GÜ" 7Ó+Ð+r   c                óŒ   — 	 t        t        j                  | «      j                  «       dz  «      S # t        t
        f$ r Y yw xY w)zDParse an ISO 8601 timestamp to epoch nanoseconds (0 if unparseable).g    eÍÍAr   )r   r   ÚfromisoformatÚ	timestampÚ
ValueErrorr   )r5   s    r   Ú	iso_to_nsr7   C   sB   € ðÜ”8×)Ñ)¨)Ó4×>Ñ>Ó@À3ÑFÓGÐGøÜœ	Ð"ò Ùðús   ‚.1 ±AÁAc                ó²   — | j                  d«      }|rdt        d„ |D «       «      fS | j                  d«      dk(  rdt        | j                  d«      «      fS y)	a  Dedup identity for a tool-round-trip message, or ``None`` otherwise.

    Only assistant tool-call messages and tool-result messages carry one;
    user turns and plain assistant replies (owned by other sources) return
    ``None`` so they are ignored here.
    r+   Úassistant_tool_callc              3  óP   K  — | ]  }t        |j                  d «      «      –— Œ  y­w)ÚidN)r.   r$   )Ú.0Úcs     r   Ú	<genexpr>z#tool_message_key.<locals>.<genexpr>T   s   è ø€ Ð,RÁzÀ!¬S°·±°t³×-=Ázùs   ‚$&r,   ÚtoolÚtool_resultÚtool_call_idN)r$   Útupler.   )Úmessager+   s     r   Útool_message_keyrD   K   sX   € ð —‘˜\Ó*€JÙØ%¤uÑ,RÁzÓ,RÓ'RÐSÐSØ‡{�{�6Ó˜fÒ$Øœs 7§;¡;¨~Ó#>Ó?Ð@Ð@Ør   )r   r   Úreturnzlist[dict[str, Any]])r   r   rE   r   )r%   údict[str, Any]rE   rF   )r/   r   rE   rF   )r5   r.   rE   r   )rC   rF   rE   zOptional[tuple])Ú__doc__Ú
__future__r   r
   r   Útypingr   r   Ú"langsmith._internal.voice._helpersr   r   r   r   r)   r2   r7   rD   © r   r   Ú<module>rL      s8   ðÙ Få "ã Ý ß  ÷ó3óCó
ó.
,óôr   