§
    ~ŠtjvH  ã                  óÆ  — d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZmZmZmZmZ ddlmZ dd	lmZmZmZ dd
lmZmZmZ ddlmZ ddlmZ er&ddlm Z  ddl!m"Z" ddl#m$Z$m%Z%m&Z&m'Z' ddl(m)Z) ddl*m+Z+m,Z,  ej-        e.¦  «        Z/dZ0dZ1 G d„ d¦  «        Z2d<d„Z3d=d„Z4 G d„ d ¦  «        Z5 G d!„ d"¦  «        Z6 G d#„ d$¦  «        Z7dde0ddddeddd%œ
d>d;„Z8dS )?uY  LangSmith tracing for a raw Gemini Live WebSocket session.

Gemini Live is exposed by ``google-genai`` as an ``AsyncSession`` over a
bidirectional WebSocket. :func:`wrap_gemini_live` returns a transparent proxy
whose :meth:`receive` generator observes each ``LiveServerMessage`` while
leaving the application's own audio playback and tool loop untouched.

Trace shape -- one live session = one trace::

    realtime_session                         (root; transcript + stereo WAV)
    â”œâ”€â”€ input_transcription                  (curated user message)
    â”œâ”€â”€ lookup_weather                       (tool; args in / response out)
    â”œâ”€â”€ turn_complete                        (llm; assistant text + usage)
    â”œâ”€â”€ interrupted                          (barge-in marker)
    â””â”€â”€ turn_complete                        (turn marker)

Provider events are always passed through the shared ``scrub`` helper before
they become span metadata, replacing raw audio bytes and truncating long text.
Tracing is fail-open: observation and teardown failures are logged but never
break the provider session.
é    )ÚannotationsN)ÚMappingÚSequence)ÚAbstractContextManager)ÚTracebackType)ÚTYPE_CHECKINGÚAnyÚCallableÚOptionalÚcast)Úget_package_version)Ú
dump_eventÚobserve_safelyÚscrub)ÚDEFAULT_MAX_AUDIO_SECONDSÚEventSessionÚstart_session)Únormalize_gemini_usage_metadata)Útracing_context)ÚAsyncIterator)ÚAsyncSession)ÚFunctionCallÚFunctionResponseOrDictÚLiveServerContentÚLiveServerMessage)ÚClient)ÚRunTreeÚWriteReplicaiÀ]  iÐ  c                  óâ   — e Zd ZdZdd„Zedd„¦   «         Zdd„Zedd„¦   «         Zedd„¦   «         Z	edd„¦   «         Z
edd„¦   «         Zedd„¦   «         Zedd„¦   «         Zedd„¦   «         ZdS )Ú_LiveMessageViewz<Readable, dependency-free view over a ``LiveServerMessage``.Úrawr   ÚreturnÚNonec                ó   — || _         d S ©N)r!   )Úselfr!   s     úi/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langsmith/integrations/gemini_live/_session.pyÚ__init__z_LiveMessageView.__init__A   s   € ØˆŒˆˆó    úLiveServerContent | Nonec                ó   — | j         j        S r%   )r!   Úserver_content©r&   s    r'   r,   z_LiveMessageView.server_contentD   s   € àŒxÔ&Ð&r)   ÚattrÚstrú
str | Nonec                óŠ   — | j         }|�t          ||d ¦  «        nd }|�t          |dd ¦  «        nd }|rt          |¦  «        nd S )NÚtext)r,   Úgetattrr/   )r&   r.   ÚcontentÚtxr2   s        r'   Ú_transcriptz_LiveMessageView._transcriptH   sT   € ØÔ%ˆØ-4Ð-@�W�W˜d DÑ)Ô)Ð)ÀdˆØ,.¨N�w�r˜6 4Ñ(Ô(Ð(ÀˆØ Ð*�s�4‰yŒyˆy dÐ*r)   c                ó,   — |                       d¦  «        S )NÚinput_transcription©r6   r-   s    r'   Úuser_transcriptz _LiveMessageView.user_transcriptN   s   € à×ÒÐ 5Ñ6Ô6Ð6r)   Úboolc                ó~   — | j         }|rt          |dd ¦  «        nd }t          |d uot          |dd¦  «        ¦  «        S )Nr8   ÚfinishedF)r,   r3   r;   )r&   r4   r5   s      r'   Úuser_transcript_finishedz)_LiveMessageView.user_transcript_finishedR   sI   € àÔ%ˆØ>EÐO�W�WÐ3°TÑ:Ô:Ð:È4ˆÝ�B˜d�NÐE¥w¨r°:¸uÑ'EÔ'EÑFÔFÐFr)   c                ó,   — |                       d¦  «        S )NÚoutput_transcriptionr9   r-   s    r'   Úagent_transcriptz!_LiveMessageView.agent_transcriptX   s   € à×ÒÐ 6Ñ7Ô7Ð7r)   úlist[FunctionCall]c                óN   — | j         j        }|�t          |j        pg ¦  «        ng S r%   )r!   Ú	tool_callÚlistÚfunction_calls)r&   rD   s     r'   rF   z_LiveMessageView.function_calls\   s-   € à”HÔ&ˆ	Ø7@Ð7L�t�IÔ,Ð2°Ñ3Ô3Ð3ÐRTÐTr)   ú	list[str]c                óH   — | j         j        }|rd„ |j        pg D ¦   «         ng S )Nc                ó,   — g | ]}t          |¦  «        ‘ŒS © )r/   )Ú.0Úvalues     r'   ú
<listcomp>z<_LiveMessageView.cancelled_tool_call_ids.<locals>.<listcomp>d   s   € Ð?Ð?Ð?˜u•�E‘
”
Ð?Ð?Ð?r)   )r!   Útool_call_cancellationÚids)r&   Úcancellations     r'   Úcancelled_tool_call_idsz(_LiveMessageView.cancelled_tool_call_idsa   s4   € à”xÔ6ˆØCOÐWÐ?Ð?¨Ô(8Ð(>¸BÐ?Ñ?Ô?Ð?ÐUWÐWr)   c                óT   — | j         }t          |d uot          |dd¦  «        ¦  «        S )NÚinterruptedF©r,   r;   r3   ©r&   r4   s     r'   rS   z_LiveMessageView.interruptedf   s.   € àÔ%ˆÝ�G 4Ð'ÐR­G°G¸]ÈEÑ,RÔ,RÑSÔSÐSr)   c                óT   — | j         }t          |d uot          |dd¦  «        ¦  «        S )NÚturn_completeFrT   rU   s     r'   rW   z_LiveMessageView.turn_completek   s.   € àÔ%ˆÝ�G 4Ð'ÐT­G°G¸_ÈeÑ,TÔ,TÑUÔUÐUr)   N)r!   r   r"   r#   )r"   r*   )r.   r/   r"   r0   )r"   r0   )r"   r;   )r"   rB   )r"   rG   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r(   Úpropertyr,   r6   r:   r>   rA   rF   rQ   rS   rW   rJ   r)   r'   r    r    >   sX  € € € € € ØFÐFðð ð ð ð ð'ð 'ð 'ñ „Xð'ð+ð +ð +ð +ð ð7ð 7ð 7ñ „Xð7ð ðGð Gð Gñ „XðGð
 ð8ð 8ð 8ñ „Xð8ð ðUð Uð Uñ „XðUð ðXð Xð Xñ „XðXð ðTð Tð Tñ „XðTð ðVð Vð Vñ „XðVð Vð Vr)   r    Úmessager   r"   údict[str, Any] | Nonec                ó*   — t          | j        ¦  «        S )z@Map Gemini Live usage onto LangSmith's canonical token metadata.)r   Úusage_metadata)r]   s    r'   Úusage_metadata_from_messagera   q   s   € õ +¨7Ô+AÑBÔBÐBr)   Úcurrentr/   Úfragmentc                óZ   — t           t          | ¦  «        z
  }|dk    r| n| |d|…         z   S )zBAppend one Gemini transcription delta, retaining the per-turn cap.r   N)ÚMAX_TRANSCRIPT_CHARSÚlen)rb   rc   Ú	remainings      r'   Ú_append_transcriptrh   x   s2   € å$¥s¨7¡|¤|Ñ3€IØ 1’n�nˆ7ˆ7¨'°H¸Z¸i¸ZÔ4HÑ*HÐHr)   c                  óØ   — e Zd ZdZddœd,d„Zd-d„Zed.d„¦   «         Zed/d„¦   «         Z	ed/d„¦   «         Z
ed0d„¦   «         Zd1d„Zd2d„Zd3d!„Zd4d#„Zd5d$„Zd5d%„Zd6d(„Zd7d)„Zd5d*„Zd5d+„ZdS )8Ú_GeminiLiveTracerz?Turn raw Gemini Live server messages into a conversation trace.N)Úis_agent_speakingÚsessionr   Úmodelr0   rk   úOptional[Callable[[], bool]]r"   r#   c               óv   — || _         || _        || _        d| _        d| _        d | _        d | _        i | _        d S ©NÚ )Ú_sessionÚ_modelÚ_is_agent_speakingÚ
_user_textÚ_agent_textÚ_turn_usageÚ_last_messageÚ_open_tools)r&   rl   rm   rk   s       r'   r(   z_GeminiLiveTracer.__init__�   sG   € ð  ˆŒØˆŒØ"3ˆÔØˆŒØˆÔØ26ˆÔØ7;ˆÔØ57ˆÔÐÐr)   r]   r   c                ó`  — || _         t          |¦  «        }| j                             ¦   «         }|j        x}rt          | j        |¦  «        | _        |j        r|                      ||¦  «         |j	        x}rt          | j
        |¦  «        | _
        t          |¦  «        }|�|| _        |j        r[| j        �|                      ¦   «         rddi}nd }| j                             ||ddi |¬¦  «        5  	 d d d ¦  «         n# 1 swxY w Y   |j        r�|                      ||¦  «         |                      ¦   «         }|r| j                             d|¦  «         | j                             ||ddd|rd|d	œni | j        d
| j        dœ¬¦  «        5  	 d d d ¦  «         n# 1 swxY w Y   d | _        |j        }	|	rT| j                             ||ddd|	i¬¦  «        5  	 d d d ¦  «         n# 1 swxY w Y   |	D ]}
|                      |
¦  «         Œ|j        D ]}|                      ||¦  «         Œd S )NÚwas_audibleTrS   F)ÚnameÚinboundÚoutputsÚmetadataÚ	assistantrW   Úllm©Úroler4   Úgoogle)Úls_providerÚls_model_name)r|   r}   Úrun_typer~   r`   r   rN   Úcall_ids)r|   r}   r~   )rx   r    rr   Únowr:   rh   ru   r>   Ú_flush_userrA   rv   ra   rw   rS   rt   Ú
event_spanrW   Ú_take_agent_textÚadd_messagers   rQ   Ú_cancel_toolrF   Ú_start_tool)r&   r]   Úviewr‰   Úuser_fragmentÚagent_fragmentÚusageÚinterruption_metadataÚ
agent_textÚcancelled_idsÚcall_idÚcalls               r'   Úobservez_GeminiLiveTracer.observe‘   s  € Ø$ˆÔÝ Ñ(Ô(ˆØŒm×ÒÑ!Ô!ˆà Ô0Ð0ˆ=ð 	QÝ0°´À-ÑPÔPˆDŒOØÔ(ð 	+Ø×Ò˜W cÑ*Ô*Ð*à!Ô2Ð2ˆ>ð 	TÝ1°$Ô2BÀNÑSÔSˆDÔÝ+¨GÑ4Ô4ˆØÐØ$ˆDÔàÔð 	ØÔ&Ð2°t×7NÒ7NÑ7PÔ7PÐ2Ø)6¸Ð(=Ð%Ð%à(,Ð%Ø”×)Ò)ØØØ"ØØØ.ð *ñ ô ð ð ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð Ôð 	$Ø×Ò˜W cÑ*Ô*Ð*Ø×.Ò.Ñ0Ô0ˆJØð CØ”×)Ò)¨+°zÑBÔBÐBØ”×)Ò)ØØØ$ØØàDNÐV˜[°ZÐ@Ð@Ð@ÐTVà#Ô/à#+Ø%)¤[ðð ð *ñ ô ð ð ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð   $ˆDÔàÔ4ˆØð 
	+Ø”×)Ò)ØØØ-ØØ# ]Ð3ð *ñ ô ð ð ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð )ð +ð +�Ø×!Ò! 'Ñ*Ô*Ð*Ð*ð Ô'ð 	,ð 	,ˆDØ×Ò˜T 7Ñ+Ô+Ð+Ð+ð	,ð 	,s6   Ã4DÄDÄ	DÆFÆF#Æ&F#ÇG)Ç)G-Ç0G-rL   Úobjectr|   r/   c                ó¬   ‡— t          | t          ¦  «        r.t          ˆfd„|                      ¦   «         D ¦   «         d ¦  «        S t	          | ‰d ¦  «        S )Nc              3  ó.   •K  — | ]\  }}|‰k    ¯|V — Œd S r%   rJ   )rK   ÚkeyÚitemr|   s      €r'   ú	<genexpr>z+_GeminiLiveTracer._field.<locals>.<genexpr>Ü   s+   øè è € ÐLÐL¡) # tÀÀtÂÀ˜ÀÀÀÀÐLÐLr)   )Ú
isinstancer   ÚnextÚitemsr3   )rL   r|   s    `r'   Ú_fieldz_GeminiLiveTracer._fieldÙ   sU   ø€ å�e�WÑ%Ô%ð 	TÝÐLÐLÐLÐL¨u¯{ª{©}¬}ÐLÑLÔLÈdÑSÔSÐSÝ�u˜d DÑ)Ô)Ð)r)   ú%FunctionCall | FunctionResponseOrDictc                ó`   — |                       |d¦  «        }t          |t          ¦  «        r|nd S )NÚid©r£   r    r/   )ÚclsrL   r—   s      r'   Ú_tool_idz_GeminiLiveTracer._tool_idß   s.   € à—*’*˜U DÑ)Ô)ˆÝ$ W­cÑ2Ô2Ð<ˆwˆw¸Ð<r)   c                ó`   — |                       |d¦  «        }t          |t          ¦  «        r|nd S )Nr|   r§   )r¨   rL   r|   s      r'   Ú
_tool_namez_GeminiLiveTracer._tool_nameä   s.   € à�zŠz˜% Ñ(Ô(ˆÝ! $­Ñ,Ô,Ð6ˆtˆt°$Ð6r)   c                óZ   — |                       |¦  «        p|                      |¦  «        pdS )NÚtool)r©   r«   )r¨   rL   s     r'   Ú	_tool_keyz_GeminiLiveTracer._tool_keyé   s*   € à�|Š|˜EÑ"Ô"ÐE c§n¢n°UÑ&;Ô&;ÐE¸vÐEr)   r˜   r   c                ó(  — |j         pd}| j                             |dd|j        i|j        t          t          |¦  «        ¦  «        dœ¬¦  «        }| j                             |  	                    |¦  «        g ¦  «         
                    |¦  «         d S )Nr­   Úargs)Úfunction_call_idÚ	raw_event)r|   r‡   Úinputsr   )r|   rr   Ú	open_spanr°   r¦   r   r   ry   Ú
setdefaultr®   Úappend)r&   r˜   r]   r|   Úruns        r'   r�   z_GeminiLiveTracer._start_toolí   s—   € ØŒyÐ"˜FˆØŒm×%Ò%ØØØ˜DœIÐ&à$(¤GÝ"¥:¨gÑ#6Ô#6Ñ7Ô7ðð ð	 &ñ 
ô 
ˆð 	Ô×#Ò# D§N¢N°4Ñ$8Ô$8¸"Ñ=Ô=×DÒDÀSÑIÔIÐIÐIÐIr)   Ú	responsesú9FunctionResponseOrDict | Sequence[FunctionResponseOrDict]c                óÒ   — t          |t          ¦  «        r&t          |t          ¦  «        st          d|¦  «        }nt          d|¦  «        f}|D ]}|                      |¦  «         ŒdS )z4Close tool spans after responses are sent to Gemini.z Sequence[FunctionResponseOrDict]r   N)r    r   r   r   Ú	_end_tool)r&   r¸   r¢   Úresponses       r'   Úobserve_tool_responsesz(_GeminiLiveTracer.observe_tool_responsesú   s|   € õ
 �i¥Ñ*Ô*ð 	Aµ:¸iÍÑ3QÔ3Qð 	AÝÐ;¸YÑGÔGˆEˆEåÐ2°IÑ>Ô>Ð@ˆEØð 	%ð 	%ˆHØ�NŠN˜8Ñ$Ô$Ð$Ð$ð	%ð 	%r)   r¼   r   c           	     ó”  — |                       |¦  «        pd}|                      |d¦  «        }d|i}| j                             |                      |¦  «        ¦  «        }|s/|                      |¦  «        r| j                             |¦  «        }|rW|                     d¦  «        }|                      ¦   «          | j         	                    ||dt          |¦  «        i¬¦  «         d S | j                             || j                             ¦   «         t          |¦  «        ddi |¬¦  «        5  	 d d d ¦  «         d S # 1 swxY w Y   d S )Nr­   r¼   r   Úraw_response)r~   r   F)r|   r‡   r}   r³   r~   )r«   r£   ry   Úgetr®   r©   ÚpopÚ_prune_empty_toolsrr   Ú
close_spanr   r‹   r‰   r/   )r&   r¼   r|   Úresponse_valuer~   Úqueuer·   s          r'   r»   z_GeminiLiveTracer._end_tool  sœ  € Ø�Š˜xÑ(Ô(Ð2¨FˆØŸš X¨zÑ:Ô:ˆØ˜~Ð.ˆØÔ ×$Ò$ T§^¢^°HÑ%=Ô%=Ñ>Ô>ˆØð 	/˜Ÿš xÑ0Ô0ð 	/ØÔ$×(Ò(¨Ñ.Ô.ˆEØð 	Ø—)’)˜A‘,”,ˆCØ×#Ò#Ñ%Ô%Ð%ØŒM×$Ò$ØØØ(­*°XÑ*>Ô*>Ð?ð %ñ ô ð ð
 ˆFØŒ]×%Ò%ØØŒM×ÒÑÔÝ�T‘”ØØØØð &ñ 
ô 
ð 		ð 		ð ð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð 		ð 		s   Ä.D=Ä=EÅEr—   c                ó¢   — | j                              t          |¦  «        g ¦  «        }|D ]#}d|_        | j                             |¦  «         Œ$d S )Nztool call cancelled by Gemini)ry   rÁ   r/   Úerrorrr   rÃ   )r&   r—   rÅ   r·   s       r'   rŽ   z_GeminiLiveTracer._cancel_tool!  sY   € ØÔ ×$Ò$¥S¨¡\¤\°2Ñ6Ô6ˆØð 	*ð 	*ˆCØ7ˆCŒIØŒM×$Ò$ SÑ)Ô)Ð)Ð)ð	*ð 	*r)   c                óV   — d„ | j                              ¦   «         D ¦   «         | _         d S )Nc                ó   — i | ]
\  }}|¯||“ŒS rJ   rJ   )rK   r�   rÅ   s      r'   ú
<dictcomp>z8_GeminiLiveTracer._prune_empty_tools.<locals>.<dictcomp>(  s3   € ð 
ð 
ð 
Ù%˜3 ÀUð
Ø�ð
ð 
ð 
r)   )ry   r¢   r-   s    r'   rÂ   z$_GeminiLiveTracer._prune_empty_tools'  s8   € ð
ð 
Ø)-Ô)9×)?Ò)?Ñ)AÔ)Að
ñ 
ô 
ˆÔÐÐr)   c                ó¼   — | j                              ¦   «         D ](}|D ]#}d|_        | j                             |¦  «         Œ$Œ)| j                              ¦   «          d S )Nz.tool did not complete before the session ended)ry   ÚvaluesrÇ   rr   rÃ   Úclear)r&   rÅ   r·   s      r'   Ú_flush_open_toolsz#_GeminiLiveTracer._flush_open_tools,  sq   € ØÔ%×,Ò,Ñ.Ô.ð 	.ð 	.ˆEØð .ð .�ØL�”	Ø”×(Ò(¨Ñ-Ô-Ð-Ð-ð.ð 	Ô×ÒÑ Ô Ð Ð Ð r)   r‰   Úfloatc           	     ó0  — | j                              ¦   «         }d| _         |sd S | j                             d|¦  «         | j                             |¦  «         | j                             ||ddd|dœ¬¦  «        5  	 d d d ¦  «         d S # 1 swxY w Y   d S )Nrq   Úuserr8   Tr‚   )r|   r}   r³   )ru   Ústriprr   r�   Ú	set_titler‹   )r&   r]   r‰   r2   s       r'   rŠ   z_GeminiLiveTracer._flush_user3  sô   € ØŒ×$Ò$Ñ&Ô&ˆØˆŒØð 	ØˆFØŒ×!Ò! &¨$Ñ/Ô/Ð/ØŒ×Ò Ñ%Ô%Ð%ØŒ]×%Ò%ØØØ&ØØ"¨tÐ4Ð4ð &ñ 
ô 
ð 	ð 	ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   Á<BÂBÂBc                óF   — | j                              ¦   «         }d| _         |S rp   )rv   rÒ   ©r&   r2   s     r'   rŒ   z"_GeminiLiveTracer._take_agent_textC  s#   € ØÔ×%Ò%Ñ'Ô'ˆØˆÔØˆr)   c           
     ó  — |                       ¦   «         }|sd S | j                             d|¦  «         | j                             dd|dœ| j        t          t          | j        ¦  «        ¦  «        d| j        dœ¬¦  «         d | _        d S )Nr€   r@   r‚   r„   )r²   r…   r†   )r|   r~   r`   r   )	rŒ   rr   r�   Ú
record_llmrw   r   r   rx   rs   rÕ   s     r'   Ú_flush_incomplete_agentz)_GeminiLiveTracer._flush_incomplete_agentH  s£   € Ø×$Ò$Ñ&Ô&ˆØð 	ØˆFØŒ×!Ò! +¨tÑ4Ô4Ð4ØŒ× Ò Ø'Ø(°TÐ:Ð:ØÔ+å"¥:¨dÔ.@Ñ#AÔ#AÑBÔBØ'Ø!%¤ðð ð	 	!ñ 		
ô 		
ð 		
ð  ˆÔÐÐr)   c                óÈ   — | j         �2|                      | j         | j                             ¦   «         ¦  «         |                      ¦   «          |                      ¦   «          d S r%   )rx   rŠ   rr   r‰   rØ   rÎ   r-   s    r'   Úfinalizez_GeminiLiveTracer.finalizeY  s\   € ØÔÐ)Ø×Ò˜TÔ/°´×1BÒ1BÑ1DÔ1DÑEÔEÐEØ×$Ò$Ñ&Ô&Ð&Ø×ÒÑ Ô Ð Ð Ð r)   )rl   r   rm   r0   rk   rn   r"   r#   )r]   r   r"   r#   )rL   rš   r|   r/   r"   rš   )rL   r¤   r"   r0   )rL   r¤   r"   r/   )r˜   r   r]   r   r"   r#   )r¸   r¹   r"   r#   )r¼   r   r"   r#   )r—   r/   r"   r#   )r"   r#   )r]   r   r‰   rÏ   r"   r#   )r"   r/   )rX   rY   rZ   r[   r(   r™   Ústaticmethodr£   Úclassmethodr©   r«   r®   r�   r½   r»   rŽ   rÂ   rÎ   rŠ   rŒ   rØ   rÚ   rJ   r)   r'   rj   rj   ~   s¦  € € € € € ØIÐIð ;?ð8ð 8ð 8ð 8ð 8ð 8ð F,ð F,ð F,ð F,ðP ð*ð *ð *ñ „\ð*ð
 ð=ð =ð =ñ „[ð=ð ð7ð 7ð 7ñ „[ð7ð ðFð Fð Fñ „[ðFðJð Jð Jð Jð
%ð 
%ð 
%ð 
%ðð ð ð ð6*ð *ð *ð *ð
ð 
ð 
ð 
ð
!ð !ð !ð !ðð ð ð ð ð ð ð ð
 ð  ð  ð  ð"!ð !ð !ð !ð !ð !r)   rj   c                  óB   — e Zd ZdZdd
„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dS )Ú_TracedGeminiLiveSessionz:Transparent proxy over ``google.genai.live.AsyncSession``.rl   r   Útracerrj   Útracer   r"   r#   c                ó0   — || _         || _        || _        d S r%   )Ú_wrapped_sessionÚ_tracerÚ_trace)r&   rl   rß   rà   s       r'   r(   z!_TracedGeminiLiveSession.__init__c  s   € ð !(ˆÔØˆŒØˆŒˆˆr)   r|   r/   r	   c                óT   — t          t                               | d¦  «        |¦  «        S )Nrâ   )r3   rš   Ú__getattribute__)r&   r|   s     r'   Ú__getattr__z$_TracedGeminiLiveSession.__getattr__j  s#   € Ý•v×.Ò.¨tÐ5GÑHÔHÈ$ÑOÔOÐOr)   ú AsyncIterator[LiveServerMessage]c               óŒ   K  — | j                              ¦   «         2 3 d {V —†}t          | j        j        |¦  «         |W V — Œ'6 d S r%   )râ   Úreceiver   rã   r™   )r&   r]   s     r'   rê   z _TracedGeminiLiveSession.receivem  sj   è è € Ø!Ô2×:Ò:Ñ<Ô<ð 	ð 	ð 	ð 	ð 	ð 	ð 	�'Ý˜4œ<Ô/°Ñ9Ô9Ð9ØˆMˆMˆMˆMˆMð =Ð<Ð<s   œAÚfunction_responsesr¹   c             ƒ  ó€   K  — | j                              |¬¦  «        ƒ d{V —† t          | j        j        |¦  «         dS )zBForward tool responses and use them to finish inferred tool spans.)rë   N)râ   Úsend_tool_responser   rã   r½   )r&   rë   s     r'   rí   z+_TracedGeminiLiveSession.send_tool_responser  sg   è è € ð Ô#×6Ò6Ø1ð 7ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ 	�t”|Ô:Ð<NÑOÔOÐOÐOÐOr)   ÚpcmÚbytesc                ój   — | j                              | j                              ¦   «         |¦  «         dS )z:Record user PCM16 for the bounded stereo conversation WAV.N)rä   Úrecord_userr‰   ©r&   rî   s     r'   Úrecord_user_audioz*_TracedGeminiLiveSession.record_user_audio}  s,   € àŒ×Ò ¤§¢Ñ 1Ô 1°3Ñ7Ô7Ð7Ð7Ð7r)   c                ój   — | j                              | j                              ¦   «         |¦  «         dS )z<Record actually-played agent PCM16 for the conversation WAV.N)rä   Úrecord_agentr‰   rò   s     r'   Úrecord_agent_audioz+_TracedGeminiLiveSession.record_agent_audio�  s,   € àŒ× Ò  ¤§¢Ñ!2Ô!2°CÑ8Ô8Ð8Ð8Ð8r)   N)rl   r   rß   rj   rà   r   r"   r#   )r|   r/   r"   r	   )r"   rè   )rë   r¹   r"   r#   )rî   rï   r"   r#   )
rX   rY   rZ   r[   r(   rç   rê   rí   ró   rö   rJ   r)   r'   rÞ   rÞ   `  sš   € € € € € ØDÐDðð ð ð ðPð Pð Pð Pðð ð ð ð
	Pð 	Pð 	Pð 	Pð8ð 8ð 8ð 8ð9ð 9ð 9ð 9ð 9ð 9r)   rÞ   c                  ó*   — e Zd ZdZd%d„Zd&d„Zd'd#„Zd$S )(Ú_GeminiLiveTracingSessionzCAsync context manager that owns one Gemini Live conversation trace.rl   r   rm   r0   Ú	thread_idúOptional[str]Úsample_rateÚintÚproject_nameÚtagsúOptional[list[str]]r   úOptional[dict[str, Any]]rk   rn   Úmax_audio_secondsúOptional[float]ÚclientúOptional[Client]Úreplicasú Optional[Sequence[WriteReplica]]r"   r#   c       
        ó
  — || _         || _        |pt          t          j        ¦   «         ¦  «        | _        || _        || _        || _        || _	        || _
        |	| _        |
| _        || _        d | _        d | _        d | _        d S r%   )râ   rs   r/   ÚuuidÚuuid4Ú
_thread_idÚ_sample_rateÚ_project_nameÚ_tagsÚ	_metadatart   Ú_max_audio_secondsÚ_clientÚ	_replicasrä   rã   Ú_context)r&   rl   rm   rù   rû   rý   rþ   r   rk   r  r  r  s               r'   r(   z"_GeminiLiveTracingSession.__init__‰  s‚   € ð !(ˆÔØˆŒØ#Ð8¥s­4¬:©<¬<Ñ'8Ô'8ˆŒØ'ˆÔØ)ˆÔØˆŒ
Ø!ˆŒØ"3ˆÔØ"3ˆÔØˆŒØ!ˆŒØ+/ˆŒØ15ˆŒØ=AˆŒˆˆr)   rÞ   c              ƒ  óÜ  K  — t          | j        | j        | j        | j        | j        | j        | j        | j        dt          d¦  «        ¬¦
  «
        | _
        t          | j
        j        d| j        i| j        | j        | j        ¬¦  «        | _        | j                             ¦   «          t          | j
        | j        | j        ¬¦  «        | _        t'          | j        | j        | j
        ¦  «        S )Nzgemini-livezgoogle-genai)
rù   rû   rý   rþ   r   r  r  r  ÚintegrationÚintegration_versionrù   )Úparentr   rþ   rý   r  )rm   rk   )r   r
  r  r  r  r  r  r  r  r   rä   r   r·   r  Ú	__enter__rj   rs   rt   rã   rÞ   râ   r-   s    r'   Ú
__aenter__z$_GeminiLiveTracingSession.__aenter__§  sì   è è € Ý#Ø”oØÔ)ØÔ+Ø”Ø”^Ø"Ô5Ø”<Ø”^Ø%Ý 3°NÑ CÔ Cð
ñ 
ô 
ˆŒõ (Ø”;”?Ø! 4¤?Ð3Ø”ØÔ+Ø”^ð
ñ 
ô 
ˆŒð 	Œ×ÒÑ!Ô!Ð!Ý(ØŒKØ”+Ø"Ô5ð
ñ 
ô 
ˆŒõ
 (ØÔ! 4¤<°´ñ
ô 
ð 	
r)   Úexc_typeútype[BaseException] | NoneÚexcúBaseException | NoneÚtbúTracebackType | Noner;   c              ƒ  óÔ  K  — 	 | j         �| j                              ¦   «          | j        �C|�(t          |¦  «        j        › d|› �| j        j        _        | j                             ¦   «          n,# t          $ r t           	                    dd¬¦  «         Y nw xY w| j
        �| j
                             d d d ¦  «         n)# | j
        �| j
                             d d d ¦  «         w w xY wdS )Nz: z'Gemini Live tracing: failed to finalizeT)Úexc_infoF)rã   rÚ   rä   ÚtyperX   r·   rÇ   Ú	ExceptionÚloggerÚwarningr  Ú__exit__)r&   r  r  r  s       r'   Ú	__aexit__z#_GeminiLiveTracingSession.__aexit__Å  s  è è € ð	9ØŒ|Ð'Ø”×%Ò%Ñ'Ô'Ð'ØŒ{Ð&Ø�?Ý/3°C©y¬yÔ/AÐ,JÐ,JÀSÐ,JÐ,J�D”K”OÔ)Ø”×$Ò$Ñ&Ô&Ð&øøÝð 	Uð 	Uð 	UÝ�NŠNÐDÈtˆNÑTÔTÐTÐTÐTð	Uøøøð Œ}Ð(Ø”×&Ò& t¨T°4Ñ8Ô8Ð8øøð Œ}Ð(Ø”×&Ò& t¨T°4Ñ8Ô8Ð8Ð8ð )øøøàˆus*   „A*A/ Á.B? Á/&BÂB? ÂBÂB? Â?&C%N)rl   r   rm   r0   rù   rú   rû   rü   rý   rú   rþ   rÿ   r   r   rk   rn   r  r  r  r  r  r  r"   r#   )r"   rÞ   )r  r  r  r  r  r  r"   r;   )rX   rY   rZ   r[   r(   r  r&  rJ   r)   r'   rø   rø   †  sZ   € € € € € ØMÐMðBð Bð Bð Bð<
ð 
ð 
ð 
ð<ð ð ð ð ð r)   rø   ©
rm   rù   rû   rý   rþ   r   rk   r  r  r  rl   r   rm   r0   rù   rú   rû   rü   rý   rþ   rÿ   r   r   rk   rn   r  r  r  r  r  r  c       
        ó6   — t          | |||||||||	|
¬¦  «        S )aQ  Trace a Gemini Live ``AsyncSession`` into LangSmith.

    Use the returned async context manager alongside the provider connection::

        async with client.aio.live.connect(model=model, config=config) as raw,                    wrap_gemini_live(raw, model=model) as session:
            async for message in session.receive():
                ...

    The yielded object proxies every provider-session method. Feed PCM16 to
    ``record_user_audio`` and ``record_agent_audio`` to attach a bounded stereo
    WAV, and optionally provide ``is_agent_speaking`` to annotate interruptions.
    r'  )rø   )rl   rm   rù   rû   rý   rþ   r   rk   r  r  r  s              r'   Úwrap_gemini_liver)  Ú  s<   € õ6 %ØØØØØ!ØØØ+Ø+ØØðñ ô ð r)   )r]   r   r"   r^   )rb   r/   rc   r/   r"   r/   )rl   r   rm   r0   rù   rú   rû   rü   rý   rú   rþ   rÿ   r   r   rk   rn   r  r  r  r  r  r  r"   rø   )9r[   Ú
__future__r   Úloggingr  Úcollections.abcr   r   Ú
contextlibr   Útypesr   Útypingr   r	   r
   r   r   Ú$langsmith._internal._package_versionr   Ú!langsmith._internal.voice.helpersr   r   r   Ú!langsmith._internal.voice.sessionr   r   r   Ú$langsmith.integrations._gemini_usager   Úlangsmith.run_helpersr   r   Úgoogle.genai.liver   Úgoogle.genai.typesr   r   r   r   Ú	langsmithr   Úlangsmith.run_treesr   r   Ú	getLoggerrX   r#  ÚDEFAULT_SAMPLE_RATEre   r    ra   rh   rj   rÞ   rø   r)  rJ   r)   r'   ú<module>r;     s
  ððð ð, #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø -Ð -Ð -Ð -Ð -Ð -Ø Ð Ð Ð Ð Ð Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?à DÐ DÐ DÐ DÐ DÐ DØ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ OÐ Oðð ð ð ð ð ð ð ð ð ð
 QÐ PÐ PÐ PÐ PÐ PØ 1Ð 1Ð 1Ð 1Ð 1Ð 1àð :Ø-Ð-Ð-Ð-Ð-Ð-à.Ð.Ð.Ð.Ð.Ð.ðð ð ð ð ð ð ð ð ð ð ð ð !Ð Ð Ð Ð Ð Ø9Ð9Ð9Ð9Ð9Ð9Ð9Ð9à	ˆÔ	˜8Ñ	$Ô	$€àÐ ØÐ ð0Vð 0Vð 0Vð 0Vð 0Vñ 0Vô 0Vð 0VðfCð Cð Cð CðIð Ið Ið Ið_!ð _!ð _!ð _!ð _!ñ _!ô _!ð _!ðD#9ð #9ð #9ð #9ð #9ñ #9ô #9ð #9ðLQð Qð Qð Qð Qñ Qô Qð Qðn Ø#Ø*Ø"&Ø $Ø)-Ø6:Ø)BØ#Ø15ð'ð 'ð 'ð 'ð 'ð 'ð 'ð 'r)   