§
    ~Štj‘  ã                  ó”   — d Z ddlmZ ddlZddlmZ ddlmZ ddlmZm	Z	 ddl
mZmZ ddlmZ dd„Ze G d„ d¦  «        ¦   «         ZdS )u‹  ``TranslatedSpan`` â€” the mutable draft handlers rewrite before export.

Split out of :mod:`langsmith._internal.voice.base_span_processor` so the base
processor stays focused on span lifecycle and export wiring. The framework
subclasses (Pipecat, LiveKit) rewrite one of these per span while translating
``lk.*`` / ``pipecat.*`` data into LangSmith's ``gen_ai.*`` / ``langsmith.*``
namespaces.
é    )ÚannotationsN)Úcopy)Ú	dataclass)ÚAnyÚOptional)ÚEventÚReadableSpan)Úrebuild_readable_spanÚdetailsúOptional[dict[str, Any]]Úreturnúdict[str, int]c                óF   — | si S d„ |                       ¦   «         D ¦   «         S )zFKeep only the int-valued detail keys, dropping ``None`` / non-numeric.c                ól   — i | ]1\  }}t          |t          t          f¦  «        ¯!|t          |¦  «        “Œ2S © )Ú
isinstanceÚintÚfloat)Ú.0ÚkÚvs      úg/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langsmith/_internal/voice/translated_span.pyú
<dictcomp>z(_clean_token_details.<locals>.<dictcomp>   s7   € ÐQÐQÐQ™$˜!˜QµZÀÅCÍÀ<Ñ5PÔ5PÐQˆA�s�1‰vŒvÐQÐQÐQó    )Úitems)r   s    r   Ú_clean_token_detailsr      s+   € àð Øˆ	ØQÐQ '§-¢-¡/¤/ÐQÑQÔQÐQr   c                  óÐ   — e Zd ZU dZded<   ded<   ded<   ed6d	„¦   «         Zd7d
„Zd8d„Zd9d„Z	d:d„Z
d;d„Zd<d„Zd=d„Zd>d„Zd?d„Zd@d"„Zd#d#d#d#d#d$œdAd,„Zd#d#d-œdBd1„ZdCd3„ZdDd5„Zd#S )EÚTranslatedSpanuÑ  A span being translated into LangSmith's namespaces before export.

    Wraps a shallow copy of the original read-only OTel ``ReadableSpan`` with
    mutable ``attributes`` and ``events`` seeded from it. Handlers rewrite the
    draft while translating; :meth:`finalize` builds a fresh ``ReadableSpan``
    from it â€” so the original span is never mutated.

    Created per span in :meth:`BaseLangSmithSpanProcessor.on_end` and threaded
    through dispatch â€” no global state. A processor that defers a span (see
    :meth:`BaseLangSmithSpanProcessor._dispatch`) simply holds the
    ``TranslatedSpan`` itself until it exports it later, so the in-progress
    translation outlives the originating ``on_end`` call.
    r	   Úspanzdict[str, Any]Ú
attributeszlist[Event]Úeventsr   c                ó†   —  | t          |¦  «        t          |j        pi ¦  «        t          |j        pg ¦  «        ¦  «        S )z>Seed a draft from a span's own fields, attributes, and events.)r   Údictr    Úlistr!   )Úclsr   s     r   ÚofzTranslatedSpan.of1   sE   € ð ˆsÝ�‰JŒJÝ�”Ð& BÑ'Ô'Ý�”Ð" Ñ#Ô#ñ
ô 
ð 	
r   c                óD   — t          | j        | j        | j        ¬¦  «        S )zDBuild the export span from the draft and its rewritten attrs/events.)r    r!   )r
   r   r    r!   ©Úselfs    r   ÚfinalizezTranslatedSpan.finalize:   s&   € å$ØŒI $¤/¸$¼+ð
ñ 
ô 
ð 	
r   ÚnameÚstrÚNonec                ó   — || j         _        dS )z6Set the exported span's name (the LangSmith run name).N)r   Ú_name)r)   r+   s     r   Úset_namezTranslatedSpan.set_name@   s   € àˆŒ	Œˆˆr   Úend_time_nsr   c                ó   — || j         _        dS )uÒ   Set the exported span's end time (epoch ns).

        Lets a span merged from two sources report a duration that runs past its
        own end â€” e.g. a tool span spanning from the call to the result.
        N)r   Ú	_end_time)r)   r1   s     r   Úset_end_timezTranslatedSpan.set_end_timeD   s   € ð *ˆŒ	ÔÐÐr   Úkindc                ó   — || j         d<   dS )uC   Set ``langsmith.span.kind`` (``llm`` / ``chain`` / ``tool`` / â€¦).zlangsmith.span.kindN©r    )r)   r5   s     r   Úset_kindzTranslatedSpan.set_kindL   s   € à15ˆŒÐ-Ñ.Ð.Ð.r   Ú	thread_idc                ó   — || j         d<   dS )zBSet ``langsmith.metadata.thread_id`` (the conversation/thread id).zlangsmith.metadata.thread_idNr7   )r)   r9   s     r   Úset_thread_idzTranslatedSpan.set_thread_idP   s   € à:CˆŒÐ6Ñ7Ð7Ð7r   ÚproviderúOptional[str]c                ó6   — |r|| j         d<   || j         d<   dS dS )uS  Set ``provider`` on both gen_ai.* provider keys (no-op if empty).

        LangSmith maps either ``gen_ai.provider.name`` (newer) or the legacy
        ``gen_ai.system`` to ``ls_provider``; writing both is version-agnostic.
        The caller passes an already-resolved slug â€” normalization is the
        integration's concern.
        zgen_ai.provider.namezgen_ai.systemNr7   )r)   r<   s     r   Úset_providerzTranslatedSpan.set_providerT   s5   € ð ð 	8Ø6>ˆDŒOÐ2Ñ3Ø/7ˆDŒO˜OÑ,Ð,Ð,ð	8ð 	8r   Úmodelc                ój   — |r0t          |¦  «        | j        d<   t          |¦  «        | j        d<   dS dS )zJSet the request model on ``gen_ai.request.model`` and its metadata mirror.zgen_ai.request.modelzlangsmith.metadata.model_nameN)r,   r    )r)   r@   s     r   Ú	set_modelzTranslatedSpan.set_model`   sC   € àð 	JÝ69¸%±j´jˆDŒOÐ2Ñ3Ý?BÀ5¹z¼zˆDŒOÐ;Ñ<Ð<Ð<ð	Jð 	Jr   c                ó   — d| j         d<   dS )u@  Drop this span from the conversation Messages view (still in the tree).

        That view reconstructs the chat from ``llm``/``tool`` runs. STT/TTS spans
        are tagged ``llm``-kind for the tree but would otherwise add fake turns
        (raw transcripts, "Generated audio for: â€¦"), so they opt out here.
        Tz*langsmith.metadata.ls_message_view_excludeNr7   r(   s    r   Úexclude_from_message_viewz(TranslatedSpan.exclude_from_message_viewf   s   € ð IMˆŒÐDÑEÐEÐEr   Úis_rootÚboolc                ó   — || j         d<   dS )z:Mark the span as the trace root (``langsmith.root_span``).zlangsmith.root_spanNr7   )r)   rE   s     r   Úset_root_spanzTranslatedSpan.set_root_spano   s   € à18ˆŒÐ-Ñ.Ð.Ð.r   ÚkeyÚvaluer   c                ó    — || j         d|› �<   dS )u[  Set ``langsmith.metadata.<key>`` to the given value.

        LangSmith surfaces everything under ``langsmith.metadata.*`` as run
        metadata. Note ``langsmith.root_span`` and ``langsmith.span.kind`` are NOT
        metadata â€” they live in the top-level ``langsmith.*`` namespace and have
        their own setters / direct writes.
        zlangsmith.metadata.Nr7   )r)   rI   rJ   s      r   Úset_metadatazTranslatedSpan.set_metadatas   s   € ð 8=ˆŒÐ3¨cÐ3Ð3Ñ4Ð4Ð4r   N)Úinput_tokensÚoutput_tokensÚtotal_tokensÚinput_token_detailsÚoutput_token_detailsrM   úOptional[int]rN   rO   rP   úOptional[dict[str, int]]rQ   c               ó  — i }|�t          |¦  «        |d<   |�t          |¦  «        |d<   |�t          |¦  «        |d<   t          |¦  «        x}r||d<   t          |¦  «        x}r||d<   |rt          j        |¦  «        | j        d<   dS dS )uÑ   Write the given token usage as ``langsmith.usage_metadata`` (JSON).

        Callers pass the complete usage â€” it replaces the flat ``gen_ai.usage.*``
        at ingest. No-op when nothing is given.
        NrM   rN   rO   rP   rQ   zlangsmith.usage_metadata)r   r   ÚjsonÚdumpsr    )r)   rM   rN   rO   rP   rQ   Úusager   s           r   Ú	set_usagezTranslatedSpan.set_usage}   sÅ   € ð !#ˆØÐ#Ý$'¨Ñ$5Ô$5ˆE�.Ñ!ØÐ$Ý%(¨Ñ%7Ô%7ˆE�/Ñ"ØÐ#Ý$'¨Ñ$5Ô$5ˆE�.Ñ!Ý*Ð+>Ñ?Ô?Ð?ˆ7ð 	3Ø+2ˆEÐ'Ñ(Ý*Ð+?Ñ@Ô@Ð@ˆ7ð 	4Ø,3ˆEÐ(Ñ)Øð 	LÝ:>¼*ÀUÑ:KÔ:KˆDŒOÐ6Ñ7Ð7Ð7ð	Lð 	Lr   )ÚpromptÚ
completionrY   úOptional[list[dict]]rZ   c               óŠ   — |�t          j        d|i¦  «        | j        d<   |� t          j        d|i¦  «        | j        d<   dS dS )zIWrite ``gen_ai.prompt``/``gen_ai.completion`` as ``{"messages": [...]}``.NÚmessagesúgen_ai.promptúgen_ai.completion)rU   rV   r    )r)   rY   rZ   s      r   Úset_messageszTranslatedSpan.set_messages™   sU   € ð ÐÝ/3¬z¸:ÀvÐ:NÑ/OÔ/OˆDŒO˜OÑ,ØÐ!Ý37´:¸zÈ:Ð>VÑ3WÔ3WˆDŒOÐ/Ñ0Ð0Ð0ð "Ð!r   Ú
tool_inputc                ól   — t          |t          ¦  «        r|nt          j        |¦  «        | j        d<   dS )z¢Write a tool run's input to ``gen_ai.prompt`` as raw I/O (not messages).

        A ``str`` is passed through unchanged; any other value is JSON-encoded.
        r^   N©r   r,   rU   rV   r    )r)   ra   s     r   Úset_tool_inputzTranslatedSpan.set_tool_input¥   s6   € õ % ZµÑ5Ô5ÐQˆJˆJ½4¼:ÀjÑ;QÔ;Qð 	Œ˜Ñ(Ð(Ð(r   Útool_outputc                ól   — t          |t          ¦  «        r|nt          j        |¦  «        | j        d<   dS )z§Write a tool run's output to ``gen_ai.completion`` as raw I/O (not messages).

        A ``str`` is passed through unchanged; any other value is JSON-encoded.
        r_   Nrc   )r)   re   s     r   Úset_tool_outputzTranslatedSpan.set_tool_output®   s7   € õ & kµ3Ñ7Ô7ÐTˆKˆK½T¼ZÈÑ=TÔ=Tð 	ŒÐ+Ñ,Ð,Ð,r   )r   r	   r   r   )r   r	   )r+   r,   r   r-   )r1   r   r   r-   )r5   r,   r   r-   )r9   r,   r   r-   )r<   r=   r   r-   )r@   r=   r   r-   )r   r-   )rE   rF   r   r-   )rI   r,   rJ   r   r   r-   )rM   rR   rN   rR   rO   rR   rP   rS   rQ   rS   r   r-   )rY   r[   rZ   r[   r   r-   )ra   r   r   r-   )re   r   r   r-   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__Úclassmethodr&   r*   r0   r4   r8   r;   r?   rB   rD   rH   rL   rX   r`   rd   rg   r   r   r   r   r      sÁ  € € € € € € ðð ð ÐÐÑØÐÐÑØÐÐÑàð
ð 
ð 
ñ „[ð
ð
ð 
ð 
ð 
ðð ð ð ð*ð *ð *ð *ð6ð 6ð 6ð 6ðDð Dð Dð Dð
8ð 
8ð 
8ð 
8ðJð Jð Jð JðMð Mð Mð Mð9ð 9ð 9ð 9ð=ð =ð =ð =ð '+Ø'+Ø&*Ø8<Ø9=ðLð Lð Lð Lð Lð Lð> (,Ø+/ð	
Xð 
Xð 
Xð 
Xð 
Xð 
Xð
ð 
ð 
ð 
ð
ð 
ð 
ð 
ð 
ð 
r   r   )r   r   r   r   )rk   Ú
__future__r   rU   r   Údataclassesr   Útypingr   r   Úopentelemetry.sdk.tracer   r	   Ú$langsmith._internal.otel._span_utilsr
   r   r   r   r   r   ú<module>rs      sò   ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7à FÐ FÐ FÐ FÐ FÐ FðRð Rð Rð Rð ðW
ð W
ð W
ð W
ð W
ñ W
ô W
ñ „ðW
ð W
ð W
r   