ó
    üÞ jŸ  ã                  ó„   • S r SSKJr  SSKrSSKJr  SSKJrJr  SSKJ	r	J
r
  SS jrSS jrSS	 jrSS
 jrSS jrSS jrg)u@   Small pure helpers for the Pipecat â†’ LangSmith span processor.é    )ÚannotationsN)Údatetime)ÚAnyÚOptional)Úbuild_assistant_messageÚtry_parse_json_objectc                óþ   •  [         R                  " U 5      n[	        U[
        5      (       d  / $ U Vs/ sH  n[	        U[        5      (       d  M  UPM     sn$ ! [         R                  [        4 a    / s $ f = fs  snf )zHParse a Pipecat ``llm`` span's ``input`` (a JSON message list) to dicts.)ÚjsonÚloadsÚJSONDecodeErrorÚ	TypeErrorÚ
isinstanceÚlistÚdict)Ú
input_dataÚrawÚms      Úa/var/www/html/gaurav/venv/lib/python3.13/site-packages/langsmith/integrations/pipecat/_helpers.pyÚparse_llm_messagesr      sl   € ðÜ�jŠj˜Ó$ˆô �cœ4× Ñ Øˆ	ÙÓ2‘s�!œj¨¬D×1�A‘sÑ2Ð2øô	 × Ñ ¤)Ð,ó ØŠ	ðüò 3s   ‚A ³A:ÁA:ÁA7Á6A7c                óR   • [        U [        [        45      (       a  [        U 5      $ S$ )zHCoerce a numeric span-attribute value to ``int``, or ``None`` otherwise.N)r   ÚintÚfloat)Úvalues    r   Ú_as_intr      s!   € ä# E¬C´¨<×8Ñ8Œ3ˆu‹:ÐB¸dÐBó    c                óx  • 0 n[        U R                  S5      5      =nb  X!S'   [        U R                  S5      5      =nb  X!S'   0 n[        U R                  S5      5      =n b  X#S'   [        U R                  S5      5      =n b  X#S'   U(       a  X1S	'   [        U R                  S
5      5      =nb  SU0US'   U$ )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                óÔ   • [        U 5      n[        U[        5      (       a  UR                  S5      (       a  SS0UE$ [        U [        5      (       a  U O
[	        U 5      n[        U5      $ )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   s\   € ô # ;Ó/€FÜ�&œ$×Ñ F§J¡J¨|×$<Ñ$<Ø˜Ð. vÐ.Ð.Ü'¨´S×9Ñ9‰k¼sÀ;Ó?O€GÜ" 7Ó+Ð+r   c                ó�   •  [        [        R                  " U 5      R                  5       S-  5      $ ! [        [
        4 a     gf = f)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   ‚/2 ²AÁAc                ó¾   • U R                  S5      nU(       a  S[        S U 5       5      4$ U R                  S5      S:X  a  S[        U R                  S5      5      4$ g)	zö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  óT   #   • U H  n[        UR                  S 5      5      v •  M!     g7f)ÚidN)r.   r$   )Ú.0Úcs     r   Ú	<genexpr>Ú#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_keyrE   K   sX   € ð —‘˜\Ó*€JÞØ%¤uÑ,RÁzÓ,RÓ'RÐSÐSØ‡{�{�6Ó˜fÓ$Øœs 7§;¡;¨~Ó#>Ó?Ð@Ð@Ør   )r   r   Úreturnzlist[dict[str, Any]])r   r   rF   r   )r%   údict[str, Any]rF   rG   )r/   r   rF   rG   )r5   r.   rF   r   )rD   rG   rF   zOptional[tuple])Ú__doc__Ú
__future__r   r
   r   Útypingr   r   Ú"langsmith._internal.voice._helpersr   r   r   r   r)   r2   r7   rE   © r   r   Ú<module>rM      s8   ðÙ Få "ã Ý ß  ÷ô3ôCô
ô.
,ôõr   