ó
    üÞ jvH  ã                  óø  • S r SSKJr  SSKrSSKrSSKJrJr  SSKJ	r	  SSK
Jr  SSKJrJrJrJrJr  SSKJr  SS	KJrJrJr  SS
KJrJrJr  SSKJr  SSKJr  \(       a&  SSKJ r   SSK!J"r"  SSK#J$r$J%r%J&r&J'r'  SSK(J)r)  SSK*J+r+J,r,  \RZ                  " \.5      r/Sr0Sr1 " S S5      r2    S S jr3S!S jr4 " S S5      r5 " S S5      r6 " S S5      r7SS\0SSSS\SSS.
                       S"S jjr8g)#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                  óÌ   • \ rS rSrSrSS jr\SS j5       rSS jr\SS j5       r	\SS j5       r
\SS j5       r\SS	 j5       r\SS
 j5       r\SS j5       r\SS j5       rSrg)Ú_LiveMessageViewé>   z<Readable, dependency-free view over a ``LiveServerMessage``.c                ó   • Xl         g ©N©Úraw)Úselfr%   s     Úe/var/www/html/gaurav/venv/lib/python3.13/site-packages/langsmith/integrations/gemini_live/_session.pyÚ__init__Ú_LiveMessageView.__init__A   s   € Ø�ó    c                ó.   • U R                   R                  $ r#   )r%   Úserver_content©r&   s    r'   r,   Ú_LiveMessageView.server_contentD   s   € à�x‰x×&Ñ&Ð&r*   c                óˆ   • U R                   nUb  [        X!S 5      OS nUb  [        USS 5      OS nU(       a  [        U5      $ S $ )NÚtext)r,   ÚgetattrÚstr)r&   ÚattrÚcontentÚtxr0   s        r'   Ú_transcriptÚ_LiveMessageView._transcriptH   sE   € Ø×%Ñ%ˆØ-4Ñ-@ŒW�W DÔ)ÀdˆØ,.©NŒw�r˜6 4Ô(ÀˆÞ Œs�4‹yÐ* dÐ*r*   c                ó$   • U R                  S5      $ )NÚinput_transcription©r6   r-   s    r'   Úuser_transcriptÚ _LiveMessageView.user_transcriptN   s   € à×ÑÐ 5Ó6Ð6r*   c                óˆ   • U R                   nU(       a  [        USS 5      OS n[        US L=(       a    [        USS5      5      $ )Nr9   ÚfinishedF)r,   r1   Úbool)r&   r4   r5   s      r'   Úuser_transcript_finishedÚ)_LiveMessageView.user_transcript_finishedR   s=   € à×%Ñ%ˆÞ>EŒW�WÐ3°TÔ:È4ˆÜ�B˜d�N×E¤w¨r°:¸uÓ'EÓFÐFr*   c                ó$   • U R                  S5      $ )NÚoutput_transcriptionr:   r-   s    r'   Úagent_transcriptÚ!_LiveMessageView.agent_transcriptX   s   € à×ÑÐ 6Ó7Ð7r*   c                ót   • U R                   R                  nUb  [        UR                  =(       d    / 5      $ / $ r#   )r%   Ú	tool_callÚlistÚfunction_calls)r&   rG   s     r'   rI   Ú_LiveMessageView.function_calls\   s2   € à—H‘H×&Ñ&ˆ	Ø7@Ñ7LŒt�I×,Ñ,×2°Ó3ÐTÐRTÐTr*   c                ó¦   • U R                   R                  nU(       a.  UR                  =(       d    /  Vs/ sH  n[        U5      PM     sn$ / $ s  snf r#   )r%   Útool_call_cancellationÚidsr2   )r&   ÚcancellationÚvalues      r'   Úcancelled_tool_call_idsÚ(_LiveMessageView.cancelled_tool_call_idsa   sE   € à—x‘x×6Ñ6ˆÞCO¨×(8Ñ(8×(>¸BÐ(>Ó?Ñ(>˜u”�E–
Ñ(>Ñ?ÐWÐUWÐWùÒ?s   µAc                ó\   • U R                   n[        US L=(       a    [        USS5      5      $ )NÚinterruptedF©r,   r?   r1   ©r&   r4   s     r'   rS   Ú_LiveMessageView.interruptedf   s+   € à×%Ñ%ˆÜ�G 4Ð'×R¬G°G¸]ÈEÓ,RÓSÐSr*   c                ó\   • U R                   n[        US L=(       a    [        USS5      5      $ )NÚturn_completeFrT   rU   s     r'   rX   Ú_LiveMessageView.turn_completek   s+   € à×%Ñ%ˆÜ�G 4Ð'×T¬G°G¸_ÈeÓ,TÓUÐUr*   r$   N)r%   r   ÚreturnÚNone)rZ   zLiveServerContent | None)r3   r2   rZ   ú
str | None)rZ   r\   )rZ   r?   )rZ   zlist[FunctionCall])rZ   z	list[str])Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r(   Úpropertyr,   r6   r;   r@   rD   rI   rP   rS   rX   Ú__static_attributes__© r*   r'   r    r    >   s¹   † ÙFôð ó'ó ð'ô+ð ó7ó ð7ð óGó ðGð
 ó8ó ð8ð óUó ðUð óXó ðXð óTó ðTð óVó óVr*   r    c                ó,   • [        U R                  5      $ )z@Map Gemini Live usage onto LangSmith's canonical token metadata.)r   Úusage_metadata)Úmessages    r'   Úusage_metadata_from_messagerh   q   s   € ô +¨7×+AÑ+AÓBÐBr*   c                óD   • [         [        U 5      -
  nUS::  a  U $ XSU -   $ )zBAppend one Gemini transcription delta, retaining the per-turn cap.r   N)ÚMAX_TRANSCRIPT_CHARSÚlen)ÚcurrentÚfragmentÚ	remainings      r'   Ú_append_transcriptro   x   s+   € ä$¤s¨7£|Ñ3€IØ 1“nˆ7ÐH¨'¸Z¸iÐ4HÑ*HÐHr*   c                  óþ   • \ rS rSrSrSS.       SS jjrSS jr\SS j5       r\	SS j5       r
\	SS	 j5       r\	SS
 j5       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S S jrS!S jrSS jrSS jrSrg)"Ú_GeminiLiveTraceré~   z?Turn raw Gemini Live server messages into a conversation trace.N)Úis_agent_speakingc               ón   • Xl         X l        X0l        SU l        SU l        S U l        S U l        0 U l        g ©NÚ )Ú_sessionÚ_modelÚ_is_agent_speakingÚ
_user_textÚ_agent_textÚ_turn_usageÚ_last_messageÚ_open_tools)r&   ÚsessionÚmodelrs   s       r'   r(   Ú_GeminiLiveTracer.__init__�   s;   € ð  ŒØŒØ"3ÔØˆŒØˆÔØ26ˆÔØ7;ˆÔØ57ˆÕr*   c                óð  • Xl         [        U5      nU R                  R                  5       nUR                  =n(       a  [        U R                  U5      U l        UR                  (       a  U R                  X5        UR                  =n(       a  [        U R                  U5      U l
        [        U5      nUb  X`l        UR                  (       aQ  U R                  b  U R                  5       (       a  SS0nOS nU R                  R                  UUSS0 US9    S S S 5        UR                   (       a˜  U R                  X5        U R#                  5       nU(       a  U R                  R%                  SU5        U R                  R                  UUSSSU(       a  SUS	.O0 U R                  S
U R&                  S.S9    S S S 5        S U l        UR(                  n	U	(       aC  U R                  R                  UUSSSU	0S9    S S S 5        U	 H  n
U R+                  U
5        M     UR,                   H  nU R/                  X±5        M     g ! , (       d  f       GN3= f! , (       d  f       N¢= f! , (       d  f       Np= f)NÚwas_audibleTrS   F)ÚnameÚinboundÚoutputsÚmetadataÚ	assistantrX   Úllm©Úroler4   Úgoogle)Úls_providerÚls_model_name)r„   r…   Úrun_typer†   rf   r‡   rL   Úcall_ids)r„   r…   r†   )r}   r    rw   Únowr;   ro   rz   r@   Ú_flush_userrD   r{   rh   r|   rS   ry   Ú
event_spanrX   Ú_take_agent_textÚadd_messagerx   rP   Ú_cancel_toolrI   Ú_start_tool)r&   rg   Úviewr‘   Úuser_fragmentÚagent_fragmentÚusageÚinterruption_metadataÚ
agent_textÚcancelled_idsÚcall_idÚcalls               r'   ÚobserveÚ_GeminiLiveTracer.observe‘   s=  € Ø$ÔÜ Ó(ˆØ�m‰m×ÑÓ!ˆà ×0Ñ0Ð0ˆ=Õ0Ü0°·±À-ÓPˆDŒOØ×(×(Ø×Ñ˜WÔ*à!×2Ñ2Ð2ˆ>Õ2Ü1°$×2BÑ2BÀNÓSˆDÔÜ+¨GÓ4ˆØÑØ$Ôà××Ø×&Ñ&Ñ2°t×7NÑ7N×7PÑ7PØ)6¸Ð(=Ñ%à(,Ð%Ø—‘×)Ñ)ØØØ"ØØØ.ð *ò ð ÷ð ××Ø×Ñ˜WÔ*Ø×.Ñ.Ó0ˆJÞØ—‘×)Ñ)¨+°zÔBØ—‘×)Ñ)ØØØ$ØØæDN˜[°ZÒ@ÐTVà#×/Ñ/à#+Ø%)§[¡[ñð *ò ð ÷ð   $ˆDÔà×4Ñ4ˆÞØ—‘×)Ñ)ØØØ-ØØ# ]Ð3ð *ò ð ÷ó )�Ø×!Ñ! 'Ö*ñ )ð
 ×'Ô'ˆDØ×Ñ˜TÖ+ò (÷aö ú÷õ ú÷(õ ús$   ÄIÆ8IÇ;I'É
IÉ
I$É'
I5c                ó�   ^• [        U [        5      (       a$  [        U4S jU R                  5        5       S 5      $ [	        U TS 5      $ )Nc              3  ó:   >#   • U H  u  pUT:X  d  M  Uv •  M     g 7fr#   rd   )Ú.0ÚkeyÚitemr„   s      €r'   Ú	<genexpr>Ú+_GeminiLiveTracer._field.<locals>.<genexpr>Ü   s   øé € ÐL©}¡) #ÀÀtÁŸ™ª}ùs   ƒ’	)Ú
isinstancer   ÚnextÚitemsr1   )rO   r„   s    `r'   Ú_fieldÚ_GeminiLiveTracer._fieldÙ   s8   ø€ ä�eœW×%Ñ%ÜÔL¨u¯{©{¬}ÓLÈdÓSÐSÜ�u˜d DÓ)Ð)r*   c                óX   • U R                  US5      n[        U[        5      (       a  U$ S $ )NÚid©r­   rª   r2   )ÚclsrO   rŸ   s      r'   Ú_tool_idÚ_GeminiLiveTracer._tool_idß   s)   € à—*‘*˜U DÓ)ˆÜ$ W¬c×2Ñ2ˆwÐ<¸Ð<r*   c                óX   • U R                  US5      n[        U[        5      (       a  U$ S $ )Nr„   r±   )r²   rO   r„   s      r'   Ú
_tool_nameÚ_GeminiLiveTracer._tool_nameä   s)   € à�z‰z˜% Ó(ˆÜ! $¬×,Ñ,ˆtÐ6°$Ð6r*   c                óf   • U R                  U5      =(       d    U R                  U5      =(       d    S$ )NÚtool)r³   r¶   )r²   rO   s     r'   Ú	_tool_keyÚ_GeminiLiveTracer._tool_keyé   s$   € à�|‰|˜EÓ"×E c§n¡n°UÓ&;×E¸vÐEr*   c                ó0  • UR                   =(       d    SnU R                  R                  USSUR                  0UR                  [        [        U5      5      S.S9nU R                  R                  U R                  U5      / 5      R                  U5        g )Nr¹   Úargs)Úfunction_call_idÚ	raw_event)r„   r�   Úinputsr‡   )r„   rw   Ú	open_spanr½   r°   r   r   r~   Ú
setdefaultrº   Úappend)r&   r    rg   r„   Úruns        r'   r—   Ú_GeminiLiveTracer._start_toolí   s€   € Ø�y‰y×"˜FˆØ�m‰m×%Ñ%ØØØ˜DŸI™IÐ&à$(§G¡GÜ"¤:¨gÓ#6Ó7ñð	 &ð 
ˆð 	×Ñ×#Ñ# D§N¡N°4Ó$8¸"Ó=×DÑDÀSÕIr*   c                óÀ   • [        U[        5      (       a"  [        U[        5      (       d  [        SU5      nO[        SU5      4nU H  nU R	                  U5        M     g)z4Close tool spans after responses are sent to Gemini.z Sequence[FunctionResponseOrDict]r   N)rª   r   r   r   Ú	_end_tool)r&   Ú	responsesr¬   Úresponses       r'   Úobserve_tool_responsesÚ(_GeminiLiveTracer.observe_tool_responsesú   sP   € ô
 �i¤×*Ñ*´:¸iÌ×3QÑ3QÜÐ;¸YÓG‰EäÐ2°IÓ>Ð@ˆEÛˆHØ�N‰N˜8Ö$ò r*   c           
     ó|  • U R                  U5      =(       d    SnU R                  US5      nSU0nU R                  R                  U R	                  U5      5      nU(       d1  U R                  U5      (       a  U R                  R                  U5      nU(       aH  UR                  S5      nU R                  5         U R                  R                  UUS[        U5      0S9  g U R                  R                  UU R                  R                  5       [        U5      SS0 US9    S S S 5        g ! , (       d  f       g = f)Nr¹   rÉ   r   Úraw_response)r†   r‡   F)r„   r�   r…   rÀ   r†   )r¶   r­   r~   Úgetrº   r³   ÚpopÚ_prune_empty_toolsrw   Ú
close_spanr   r“   r‘   r2   )r&   rÉ   r„   Úresponse_valuer†   ÚqueuerÄ   s          r'   rÇ   Ú_GeminiLiveTracer._end_tool  s  € Ø�‰˜xÓ(×2¨FˆØŸ™ X¨zÓ:ˆØ˜~Ð.ˆØ× Ñ ×$Ñ$ T§^¡^°HÓ%=Ó>ˆÞ˜Ÿ™ x×0Ñ0Ø×$Ñ$×(Ñ(¨Ó.ˆEÞØ—)‘)˜A“,ˆCØ×#Ñ#Ô%Ø�M‰M×$Ñ$ØØØ(¬*°XÓ*>Ð?ð %ñ ð
 Ø�]‰]×%Ñ%ØØ�M‰M×ÑÓÜ�T“ØØØØð &ò 
ð ÷
÷ 
ö 
ús   Ä"D-Ä-
D;c                ó¤   • U R                   R                  [        U5      / 5      nU H%  nSUl        U R                  R                  U5        M'     g )Nztool call cancelled by Gemini)r~   rÏ   r2   Úerrorrw   rÑ   )r&   rŸ   rÓ   rÄ   s       r'   r–   Ú_GeminiLiveTracer._cancel_tool!  sA   € Ø× Ñ ×$Ñ$¤S¨£\°2Ó6ˆÛˆCØ7ˆCŒIØ�M‰M×$Ñ$ SÖ)ò r*   c                óˆ   • U R                   R                  5        VVs0 sH  u  pU(       d  M  X_M     snnU l         g s  snnf r#   )r~   r¬   )r&   r¦   rÓ   s      r'   rÐ   Ú$_GeminiLiveTracer._prune_empty_tools'  s;   € à)-×)9Ñ)9×)?Ñ)?Ô)Aô
Ù)A™:˜3ÄU‹JˆCŠJÑ)Aò
ˆÕùó 
s   ž>®>c                óÐ   • U R                   R                  5        H.  nU H%  nSUl        U R                  R	                  U5        M'     M0     U R                   R                  5         g )Nz.tool did not complete before the session ended)r~   ÚvaluesrÖ   rw   rÑ   Úclear)r&   rÓ   rÄ   s      r'   Ú_flush_open_toolsÚ#_GeminiLiveTracer._flush_open_tools,  sR   € Ø×%Ñ%×,Ñ,Ö.ˆEÛ�ØL�”	Ø—‘×(Ñ(¨Ö-ó ñ /ð 	×Ñ×ÑÕ r*   c           	     ó:  • U R                   R                  5       nSU l         U(       d  g U R                  R                  SU5        U R                  R	                  U5        U R                  R                  UUSSSUS.S9    S S S 5        g ! , (       d  f       g = f)Nrv   Úuserr9   TrŠ   )r„   r…   rÀ   )rz   Ústriprw   r•   Ú	set_titler“   )r&   rg   r‘   r0   s       r'   r’   Ú_GeminiLiveTracer._flush_user3  s‡   € Ø�‰×$Ñ$Ó&ˆØˆŒÞØØ�‰×!Ñ! &¨$Ô/Ø�‰×Ñ Ô%Ø�]‰]×%Ñ%ØØØ&ØØ"¨tÑ4ð &ò 
ð ÷
÷ 
ö 
ús   ÂBÂ
Bc                óH   • U R                   R                  5       nSU l         U$ ru   )r{   rá   ©r&   r0   s     r'   r”   Ú"_GeminiLiveTracer._take_agent_textC  s#   € Ø×Ñ×%Ñ%Ó'ˆØˆÔØˆr*   c           
     ó   • U R                  5       nU(       d  g U R                  R                  SU5        U R                  R                  SSUS.U R                  [        [        U R                  5      5      SU R                  S.S9  S U l        g )Nrˆ   rC   rŠ   rŒ   )r¿   r�   rŽ   )r„   r†   rf   r‡   )	r”   rw   r•   Ú
record_llmr|   r   r   r}   rx   rå   s     r'   Ú_flush_incomplete_agentÚ)_GeminiLiveTracer._flush_incomplete_agentH  s�   € Ø×$Ñ$Ó&ˆÞØØ�‰×!Ñ! +¨tÔ4Ø�‰× Ñ Ø'Ø(°TÑ:Ø×+Ñ+ä"¤:¨d×.@Ñ.@Ó#AÓBØ'Ø!%§¡ñð	 	!ñ 		
ð  ˆÕr*   c                óÆ   • U R                   b4  U R                  U R                   U R                  R                  5       5        U R	                  5         U R                  5         g r#   )r}   r’   rw   r‘   ré   rÝ   r-   s    r'   ÚfinalizeÚ_GeminiLiveTracer.finalizeY  sI   € Ø×ÑÑ)Ø×Ñ˜T×/Ñ/°·±×1BÑ1BÓ1DÔEØ×$Ñ$Ô&Ø×ÑÕ r*   )r{   ry   r}   rx   r~   rw   r|   rz   )r   r   r€   r\   rs   úOptional[Callable[[], bool]]rZ   r[   )rg   r   rZ   r[   )rO   Úobjectr„   r2   rZ   rï   )rO   ú%FunctionCall | FunctionResponseOrDictrZ   r\   )rO   rð   rZ   r2   )r    r   rg   r   rZ   r[   )rÈ   ú9FunctionResponseOrDict | Sequence[FunctionResponseOrDict]rZ   r[   )rÉ   r   rZ   r[   )rŸ   r2   rZ   r[   )rZ   r[   )rg   r   r‘   ÚfloatrZ   r[   )rZ   r2   )r]   r^   r_   r`   ra   r(   r¡   Ústaticmethodr­   Úclassmethodr³   r¶   rº   r—   rÊ   rÇ   r–   rÐ   rÝ   r’   r”   ré   rì   rc   rd   r*   r'   rq   rq   ~   sÓ   † ÙIð ;?ñ8àð8ð ð	8ð
 8ð8ð 
õ8ô F,ðP ó*ó ð*ð
 ó=ó ð=ð ó7ó ð7ð óFó ðFôJð
%àLð
%ð 
ô
%ôô6*ô
ô
!ôô ô
 ÷"!r*   rq   c                  ól   • \ rS rSrS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
S	rg
)Ú_TracedGeminiLiveSessioni`  z:Transparent proxy over ``google.genai.live.AsyncSession``.c                ó(   • Xl         X l        X0l        g r#   )Ú_wrapped_sessionÚ_tracerÚ_trace)r&   r   ÚtracerÚtraces       r'   r(   Ú!_TracedGeminiLiveSession.__init__c  s   € ð !(ÔØŒØ�r*   c                óB   • [        [        R                  U S5      U5      $ )Nrø   )r1   rï   Ú__getattribute__)r&   r„   s     r'   Ú__getattr__Ú$_TracedGeminiLiveSession.__getattr__j  s   € Ü”v×.Ñ.¨tÐ5GÓHÈ$ÓOÐOr*   c               ó¦   #   • U R                   R                  5         S h  v•N n[        U R                  R                  U5        U7v •  M0   N+
 g 7fr#   )rø   Úreceiver   rù   r¡   )r&   rg   s     r'   r  Ú _TracedGeminiLiveSession.receivem  s?   é € Ø!×2Ñ2×:Ñ:Ô<÷ 	�'Ü˜4Ÿ<™<×/Ñ/°Ô9Ø�Mñ	Ñ<ùs%   ‚A�A¡A¢A¥(AÁAÁAc             ƒ  ó’   #   • U R                   R                  US9I Sh  v•N   [        U R                  R                  U5        g N%7f)zBForward tool responses and use them to finish inferred tool spans.)Úfunction_responsesN)rø   Úsend_tool_responser   rù   rÊ   )r&   r  s     r'   r  Ú+_TracedGeminiLiveSession.send_tool_responser  sI   é € ð ×#Ñ#×6Ñ6Ø1ð 7ð 
÷ 	
ð 	
ô 	�t—|‘|×:Ñ:Ð<NÕOñ	
ùs   ‚AŸA &Ac                ól   • U R                   R                  U R                   R                  5       U5        g)z:Record user PCM16 for the bounded stereo conversation WAV.N)rú   Úrecord_userr‘   ©r&   Úpcms     r'   Úrecord_user_audioÚ*_TracedGeminiLiveSession.record_user_audio}  s!   € à�‰×Ñ §¡§¡Ó 1°3Õ7r*   c                ól   • U R                   R                  U R                   R                  5       U5        g)z<Record actually-played agent PCM16 for the conversation WAV.N)rú   Úrecord_agentr‘   r  s     r'   Úrecord_agent_audioÚ+_TracedGeminiLiveSession.record_agent_audio�  s!   € à�‰× Ñ  §¡§¡Ó!2°CÕ8r*   )rú   rù   rø   N)r   r   rû   rq   rü   r   rZ   r[   )r„   r2   rZ   r	   )rZ   z AsyncIterator[LiveServerMessage])r  rñ   rZ   r[   )r  ÚbytesrZ   r[   )r]   r^   r_   r`   ra   r(   r   r  r  r  r  rc   rd   r*   r'   rö   rö   `  s\   † ÙDðØ#ðØ->ðØGSðà	ôôPôð
	Pð Vð	Pð 
ô		Pô8÷9r*   rö   c                  óv   • \ rS rSrSr                        SS jrS	S jr        S
S jrSrg)Ú_GeminiLiveTracingSessioni†  zCAsync context manager that owns one Gemini Live conversation trace.c       
        óþ   • Xl         X l        U=(       d    [        [        R                  " 5       5      U l        X@l        XPl        X`l        Xpl	        X€l
        X�l        X l        X°l        S U l        S U l        S U l        g r#   )rø   rx   r2   ÚuuidÚuuid4Ú
_thread_idÚ_sample_rateÚ_project_nameÚ_tagsÚ	_metadatary   Ú_max_audio_secondsÚ_clientÚ	_replicasrú   rù   Ú_context)r&   r   r€   Ú	thread_idÚsample_rateÚproject_nameÚtagsr‡   rs   Úmax_audio_secondsÚclientÚreplicass               r'   r(   Ú"_GeminiLiveTracingSession.__init__‰  sg   € ð !(ÔØŒØ#×8¤s¬4¯:ª:«<Ó'8ˆŒØ'ÔØ)ÔØŒ
Ø!ŒØ"3ÔØ"3ÔØŒØ!ŒØ+/ˆŒØ15ˆŒØ=Aˆ�r*   c              ƒ  óp  #   • [        U R                  U R                  U R                  U R                  U R
                  U R                  U R                  U R                  S[        S5      S9
U l
        [        U R                  R                  SU R                  0U R                  U R                  U R                  S9U l        U R                  R                  5         [        U R                  U R                   U R"                  S9U l        ['        U R(                  U R$                  U R                  5      $ 7f)Nzgemini-livezgoogle-genai)
r"  r#  r$  r%  r‡   r&  r'  r(  ÚintegrationÚintegration_versionr"  )Úparentr‡   r%  r$  r(  )r€   rs   )r   r  r  r  r  r  r  r  r   r   rú   r   rÄ   r!  Ú	__enter__rq   rx   ry   rù   rö   rø   r-   s    r'   Ú
__aenter__Ú$_GeminiLiveTracingSession.__aenter__§  sï   é € Ü#Ø—o‘oØ×)Ñ)Ø×+Ñ+Ø—‘Ø—^‘^Ø"×5Ñ5Ø—<‘<Ø—^‘^Ø%Ü 3°NÓ Cñ
ˆŒô (Ø—;‘;—?‘?Ø! 4§?¡?Ð3Ø—‘Ø×+Ñ+Ø—^‘^ñ
ˆŒð 	�‰×ÑÔ!Ü(Ø�K‰KØ—+‘+Ø"×5Ñ5ñ
ˆŒô
 (Ø×!Ñ! 4§<¡<°·±ó
ð 	
ùs   ‚D4D6c              ƒ  ó  #   •  U R                   b  U R                   R                  5         U R                  bP  Ub3  [        U5      R                   SU 3U R                  R
                  l        U R                  R                  5         U R                  b  U R                  R                  S S S 5        g! [         a    [        R                  SSS9   NKf = f! U R                  b  U R                  R                  S S S 5        f f = f7f)Nz: z'Gemini Live tracing: failed to finalizeT)Úexc_infoF)rù   rì   rú   Útyper]   rÄ   rÖ   Ú	ExceptionÚloggerÚwarningr!  Ú__exit__)r&   Úexc_typeÚexcÚtbs       r'   Ú	__aexit__Ú#_GeminiLiveTracingSession.__aexit__Å  sÙ   é € ð	9Ø�|‰|Ñ'Ø—‘×%Ñ%Ô'Ø�{‰{Ñ&Ø‘?Ü/3°C«y×/AÑ/AÐ.BÀ"ÀSÀEÐ,J�D—K‘K—O‘OÔ)Ø—‘×$Ñ$Ô&ð �}‰}Ñ(Ø—‘×&Ñ& t¨T°4Ô8Øøô ó 	UÜ�N‰NÐDÈtˆNÓTð	Uûð �}‰}Ñ(Ø—‘×&Ñ& t¨T°4Õ8ð )üs5   ‚D„BB3 Â+DÂ3CÃC ÃCÃC Ã-DÄD)r  r!  ry   r  r  rx   r  r   r  r  r  rú   rù   rø   N)r   r   r€   r\   r"  úOptional[str]r#  Úintr$  r=  r%  úOptional[list[str]]r‡   úOptional[dict[str, Any]]rs   rî   r&  úOptional[float]r'  úOptional[Client]r(  ú Optional[Sequence[WriteReplica]]rZ   r[   )rZ   rö   )r8  ztype[BaseException] | Noner9  zBaseException | Noner:  zTracebackType | NonerZ   r?   )	r]   r^   r_   r`   ra   r(   r/  r;  rc   rd   r*   r'   r  r  †  s½   † ÙMðBàðBð ð	Bð
 !ðBð ðBð $ðBð "ðBð +ðBð 8ðBð +ðBð !ðBð 3ðBð 
ôBô<
ð<à,ðð "ðð !ð	ð
 
÷r*   r  ©
r€   r"  r#  r$  r%  r‡   rs   r&  r'  r(  c       
        ó(   • [        U UUUUUUUUU	U
S9$ )a1  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.
rD  )r  )r   r€   r"  r#  r$  r%  r‡   rs   r&  r'  r(  s              r'   Úwrap_gemini_liverF  Ú  s2   € ô6 %ØØØØØ!ØØØ+Ø+ØØñð r*   )rg   r   rZ   zdict[str, Any] | None)rl   r2   rm   r2   rZ   r2   )r   r   r€   r\   r"  r=  r#  r>  r$  r=  r%  r?  r‡   r@  rs   rî   r&  rA  r'  rB  r(  rC  rZ   r  )9ra   Ú
__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   Ú	getLoggerr]   r5  ÚDEFAULT_SAMPLE_RATErj   r    rh   ro   rq   rö   r  rF  rd   r*   r'   Ú<module>rX     sb  ðñõ, #ã Û ß -Ý -Ý ß ?Õ ?å Dß OÑ O÷ñ õ
 QÝ 1æÝ-å.÷ó õ !ß9à	×	Ò	˜8Ó	$€àÐ ØÐ ÷0Vñ 0VðfCØðCàôCôI÷_!ñ _!÷D#9ñ #9÷LQñ Qðn Ø#Ø*Ø"&Ø $Ø)-Ø6:Ø)BØ#Ø15ñ'Øð'ð ð'ð ð	'ð
 ð'ð  ð'ð ð'ð 'ð'ð 4ð'ð 'ð'ð ð'ð /ð'ð ö'r*   