§
    ~ŠtjŸ  ã                  óz   — 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dS ) u@   Small pure helpers for the Pipecat â†’ LangSmith span processor.é    )ÚannotationsN)Údatetime)ÚAnyÚOptional)Úbuild_assistant_messageÚtry_parse_json_objectÚ
input_datar   Úreturnúlist[dict[str, Any]]c                ó°   — 	 t          j        | ¦  «        }n# t           j        t          f$ r g cY S w xY wt	          |t
          ¦  «        sg S d„ |D ¦   «         S )zHParse a Pipecat ``llm`` span's ``input`` (a JSON message list) to dicts.c                ó<   — g | ]}t          |t          ¦  «        ¯|‘ŒS © )Ú
isinstanceÚdict)Ú.0Úms     úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langsmith/integrations/pipecat/_helpers.pyú
<listcomp>z&parse_llm_messages.<locals>.<listcomp>   s'   € Ð2Ð2Ð2�!�j¨­DÑ1Ô1Ð2ˆAÐ2Ð2Ð2ó    )ÚjsonÚloadsÚJSONDecodeErrorÚ	TypeErrorr   Úlist)r	   Úraws     r   Úparse_llm_messagesr      so   € ðÝŒj˜Ñ$Ô$ˆˆøÝÔ ¥)Ð,ð ð ð Øˆ	ˆ	ˆ	ðøøøå�c�4Ñ Ô ð Øˆ	Ø2Ð2�sÐ2Ñ2Ô2Ð2s   ‚ —2±2Úvaluec                ó\   — t          | t          t          f¦  «        rt          | ¦  «        ndS )zHCoerce a numeric span-attribute value to ``int``, or ``None`` otherwise.N)r   ÚintÚfloat)r   s    r   Ú_as_intr!      s%   € å# E­Cµ¨<Ñ8Ô8ÐB�3ˆu‰:Œ:ˆ:¸dÐBr   Ú
attributesúdict[str, Any]c                ó¾  — i }t          |                      d¦  «        ¦  «        x}�||d<   t          |                      d¦  «        ¦  «        x}�||d<   i }t          |                      d¦  «        ¦  «        x}	 �||d<   t          |                      d¦  «        ¦  «        x}	 �||d	<   |r||d
<   t          |                      d¦  «        ¦  «        x}�d|i|d<   |S )zFRead Pipecat's ``gen_ai.usage.*`` span keys into ``set_usage`` kwargs.zgen_ai.usage.input_tokensNÚ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)r"   ÚusageÚvÚinput_details       r   Úextract_llm_usager0      s  € à€EÝ�Z—^’^Ð$?Ñ@Ô@ÑAÔAÐAˆÐNØ !ˆˆnÑÝ�Z—^’^Ð$@ÑAÔAÑBÔBÐBˆÐOØ!"ˆˆoÑØ#%€Lå�Z—^’^Ð$JÑKÔKÑLÔLÐLˆØðð &'ˆ�\Ñ"å�Z—^’^Ð$NÑOÔOÑPÔPÐPˆØðð *+ˆÐ%Ñ&Øð 4Ø'3ˆÐ#Ñ$Ý�Z—^’^Ð$CÑDÔDÑEÔEÐEˆÐRØ)4°aÐ(8ˆÐ$Ñ%Ø€Lr   Úoutput_datac                óê   — t          | ¦  «        }t          |t          ¦  «        r|                     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   )r1   ÚparsedÚcontents      r   Úbuild_completion_messager9   6   st   € õ # ;Ñ/Ô/€FÝ�&�$ÑÔð / F§J¢J¨|Ñ$<Ô$<ð /Ø˜Ð. vÐ.Ð.Ý'¨µSÑ9Ô9ÐOˆkˆk½sÀ;Ñ?OÔ?O€GÝ" 7Ñ+Ô+Ð+r   Ú	timestampr6   r   c                ó    — 	 t          t          j        | ¦  «                             ¦   «         dz  ¦  «        S # t          t
          f$ r Y dS w xY w)zDParse an ISO 8601 timestamp to epoch nanoseconds (0 if unparseable).g    eÍÍAr   )r   r   Úfromisoformatr:   Ú
ValueErrorr   )r:   s    r   Ú	iso_to_nsr>   C   sX   € ðÝ•8Ô)¨)Ñ4Ô4×>Ò>Ñ@Ô@À3ÑFÑGÔGÐGøÝ�	Ð"ð ð ð Øˆqˆqðøøøs   ‚58 ¸AÁAÚmessageúOptional[tuple]c                óä   — |                       d¦  «        }|rdt          d„ |D ¦   «         ¦  «        fS |                       d¦  «        dk    r$dt          |                       d¦  «        ¦  «        fS dS )	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.
    r3   Úassistant_tool_callc              3  óZ   K  — | ]&}t          |                     d ¦  «        ¦  «        V — Œ'dS )ÚidN)r6   r,   )r   Úcs     r   ú	<genexpr>z#tool_message_key.<locals>.<genexpr>T   s4   è è € Ð,RÐ,RÀ!­S°·²°t±´Ñ-=Ô-=Ð,RÐ,RÐ,RÐ,RÐ,RÐ,Rr   r4   ÚtoolÚtool_resultÚtool_call_idN)r,   Útupler6   )r?   r3   s     r   Útool_message_keyrK   K   s{   € ð —’˜\Ñ*Ô*€JØð TØ%¥uÐ,RÐ,RÀzÐ,RÑ,RÔ,RÑ'RÔ'RÐSÐSØ‡{‚{�6ÑÔ˜fÒ$Ð$Ø�s 7§;¢;¨~Ñ#>Ô#>Ñ?Ô?Ð@Ð@Øˆ4r   )r	   r   r
   r   )r   r   r
   r   )r"   r#   r
   r#   )r1   r   r
   r#   )r:   r6   r
   r   )r?   r#   r
   r@   )Ú__doc__Ú
__future__r   r   r   Útypingr   r   Ú"langsmith._internal.voice._helpersr   r   r   r!   r0   r9   r>   rK   r   r   r   ú<module>rP      sþ   ðØ FÐ Fà "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  ðð ð ð ð ð ð ð ð3ð 3ð 3ð 3ðCð Cð Cð Cð
ð ð ð ð.
,ð 
,ð 
,ð 
,ðð ð ð ðð ð ð ð ð r   