Ë
    ³ŒjvH  ã                  óæ  — 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jZ                  e.«      Z/dZ0dZ1 G d„ d«      Z2	 	 	 	 d 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„Z8y)#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y)Ú_LiveMessageViewz<Readable, dependency-free view over a ``LiveServerMessage``.c                ó   — || _         y ©N)Úraw)Úselfr#   s     úu/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langsmith/integrations/gemini_live/_session.pyÚ__init__z_LiveMessageView.__init__A   s	   € Øˆ�ó    c                ó.   — | j                   j                  S r"   )r#   Úserver_content©r$   s    r%   r)   z_LiveMessageView.server_contentD   s   € à�x‰x×&Ñ&Ð&r'   c                ó|   — | j                   }|�t        ||d «      nd }|�t        |dd «      nd }|rt        |«      S d S )NÚtext)r)   ÚgetattrÚstr)r$   ÚattrÚcontentÚtxr,   s        r%   Ú_transcriptz_LiveMessageView._transcriptH   sG   € Ø×%Ñ%ˆØ-4Ð-@ŒW�W˜d DÔ)ÀdˆØ,.¨NŒw�r˜6 4Ô(ÀˆÙ Œs�4‹yÐ* dÐ*r'   c                ó$   — | j                  d«      S )NÚinput_transcription©r2   r*   s    r%   Úuser_transcriptz _LiveMessageView.user_transcriptN   s   € à×ÑÐ 5Ó6Ð6r'   c                ót   — | j                   }|rt        |dd «      nd }t        |d uxr t        |dd«      «      S )Nr4   ÚfinishedF)r)   r-   Úbool)r$   r0   r1   s      r%   Úuser_transcript_finishedz)_LiveMessageView.user_transcript_finishedR   s=   € à×%Ñ%ˆÙ>EŒW�WÐ3°TÔ:È4ˆÜ�B˜d�NÒE¤w¨r°:¸uÓ'EÓFÐFr'   c                ó$   — | j                  d«      S )NÚoutput_transcriptionr5   r*   s    r%   Úagent_transcriptz!_LiveMessageView.agent_transcriptX   s   € à×ÑÐ 6Ó7Ð7r'   c                óh   — | j                   j                  }|�t        |j                  xs g «      S g S r"   )r#   Ú	tool_callÚlistÚfunction_calls)r$   r?   s     r%   rA   z_LiveMessageView.function_calls\   s2   € à—H‘H×&Ñ&ˆ	Ø7@Ð7LŒt�I×,Ñ,Ò2°Ó3ÐTÐRTÐTr'   c                óŽ   — | j                   j                  }|r'|j                  xs g D �cg c]  }t        |«      ‘Œ c}S g S c c}w r"   )r#   Útool_call_cancellationÚidsr.   )r$   ÚcancellationÚvalues      r%   Úcancelled_tool_call_idsz(_LiveMessageView.cancelled_tool_call_idsa   sE   € à—x‘x×6Ñ6ˆÙCO¨×(8Ñ(8Ò(>¸BÐ(>Ó?Ñ(>˜u”�E•
Ð(>Ñ?ÐWÐUWÐWùÒ?s   «Ac                óR   — | j                   }t        |d uxr t        |dd«      «      S )NÚinterruptedF©r)   r9   r-   ©r$   r0   s     r%   rI   z_LiveMessageView.interruptedf   s+   € à×%Ñ%ˆÜ�G 4Ð'ÒR¬G°G¸]ÈEÓ,RÓSÐSr'   c                óR   — | j                   }t        |d uxr t        |dd«      «      S )NÚturn_completeFrJ   rK   s     r%   rM   z_LiveMessageView.turn_completek   s+   € à×%Ñ%ˆÜ�G 4Ð'ÒT¬G°G¸_ÈeÓ,TÓUÐUr'   N)r#   r   ÚreturnÚNone)rN   zLiveServerContent | None)r/   r.   rN   ú
str | None)rN   rP   )rN   r9   )rN   zlist[FunctionCall])rN   z	list[str])Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   Úpropertyr)   r2   r6   r:   r=   rA   rG   rI   rM   © r'   r%   r    r    >   s¹   „ ÙFóð ò'ó ð'ó+ð ò7ó ð7ð òGó ðGð
 ò8ó ð8ð òUó ðUð òXó ðXð òTó ðTð òVó ñVr'   r    c                ó,   — t        | j                  «      S )z@Map Gemini Live usage onto LangSmith's canonical token metadata.)r   Úusage_metadata)Úmessages    r%   Úusage_metadata_from_messagerZ   q   s   € ô +¨7×+AÑ+AÓBÐBr'   c                óD   — t         t        | «      z
  }|dk  r| S | |d| z   S )zBAppend one Gemini transcription delta, retaining the per-turn cap.r   N)ÚMAX_TRANSCRIPT_CHARSÚlen)ÚcurrentÚfragmentÚ	remainings      r%   Ú_append_transcriptra   x   s-   € ä$¤s¨7£|Ñ3€IØ 1’nˆ7ÐH¨'°H¸Z¸iÐ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dd	„«       Zdd
„Z	 	 	 	 dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zy) Ú_GeminiLiveTracerz?Turn raw Gemini Live server messages into a conversation trace.N)Úis_agent_speakingc               ót   — || _         || _        || _        d| _        d| _        d | _        d | _        i | _        y ©NÚ )Ú_sessionÚ_modelÚ_is_agent_speakingÚ
_user_textÚ_agent_textÚ_turn_usageÚ_last_messageÚ_open_tools)r$   ÚsessionÚmodelrd   s       r%   r&   z_GeminiLiveTracer.__init__�   sA   € ð  ˆŒØˆŒØ"3ˆÔØˆŒØˆÔØ26ˆÔØ7;ˆÔØ57ˆÕr'   c                óˆ  — || _         t        |«      }| j                  j                  «       }|j                  x}rt        | j                  |«      | _        |j                  r| j                  ||«       |j                  x}rt        | j                  |«      | _
        t        |«      }|�|| _        |j                  rN| j                  �| j                  «       rddi}nd }| j                  j                  ||ddi |¬«      5  	 d d d «       |j                   r’| j                  ||«       | j#                  «       }|r| j                  j%                  d|«       | j                  j                  ||ddd|rd|d	œni | j                  d
| j&                  dœ¬«      5  	 d d d «       d | _        |j(                  }	|	rD| j                  j                  ||ddd|	i¬«      5  	 d d d «       |	D ]  }
| j+                  |
«       Œ |j,                  D ]  }| j/                  ||«       Œ y # 1 sw Y   �ŒxY w# 1 sw Y   Œ“xY w# 1 sw Y   Œ^xY w)NÚwas_audibleTrI   F)ÚnameÚinboundÚoutputsÚmetadataÚ	assistantrM   Úllm©Úroler0   Úgoogle)Úls_providerÚls_model_name)rt   ru   Úrun_typerv   rX   rw   rC   Úcall_ids)rt   ru   rv   )rn   r    rh   Únowr6   ra   rk   r:   Ú_flush_userr=   rl   rZ   rm   rI   rj   Ú
event_spanrM   Ú_take_agent_textÚadd_messageri   rG   Ú_cancel_toolrA   Ú_start_tool)r$   rY   Úviewr�   Úuser_fragmentÚagent_fragmentÚusageÚinterruption_metadataÚ
agent_textÚcancelled_idsÚcall_idÚcalls               r%   Úobservez_GeminiLiveTracer.observe‘   sD  € Ø$ˆÔÜ Ó(ˆØ�m‰m×ÑÓ!ˆà ×0Ñ0Ð0ˆ=Ð0Ü0°·±À-ÓPˆDŒOØ×(Ò(Ø×Ñ˜W cÔ*à!×2Ñ2Ð2ˆ>Ð2Ü1°$×2BÑ2BÀNÓSˆDÔÜ+¨GÓ4ˆØÐØ$ˆDÔà×ÒØ×&Ñ&Ð2°t×7NÑ7NÔ7PØ)6¸Ð(=Ñ%à(,Ð%Ø—‘×)Ñ)ØØØ"ØØØ.ð *õ ð ÷ð ×ÒØ×Ñ˜W cÔ*Ø×.Ñ.Ó0ˆJÙØ—‘×)Ñ)¨+°zÔBØ—‘×)Ñ)ØØØ$ØØáDN˜[°ZÒ@ÐTVà#×/Ñ/à#+Ø%)§[¡[ñð *õ ð ÷ð   $ˆDÔà×4Ñ4ˆÙØ—‘×)Ñ)ØØØ-ØØ# ]Ð3ð *õ ð ÷ó )�Ø×!Ñ! 'Õ*ð )ð
 ×'Ô'ˆDØ×Ñ˜T 7Õ+ñ (÷añ ú÷ð ú÷(ð ús$   ÄHÆH,ÇH8ÈH)È,H5È8Ic                ó„   ‡— t        | t        «      r#t        ˆfd„| j                  «       D «       d «      S t	        | ‰d «      S )Nc              3  ó4   •K  — | ]  \  }}|‰k(  sŒ|–— Œ y ­wr"   rV   )Ú.0ÚkeyÚitemrt   s      €r%   Ú	<genexpr>z+_GeminiLiveTracer._field.<locals>.<genexpr>Ü   s   øè ø€ ÐL©}¡) # tÀÀtÃœ©}ùs   ƒ‘)Ú
isinstancer   ÚnextÚitemsr-   )rF   rt   s    `r%   Ú_fieldz_GeminiLiveTracer._fieldÙ   s5   ø€ ä�eœWÔ%ÜÓL¨u¯{©{¬}ÓLÈdÓSÐSÜ�u˜d DÓ)Ð)r'   c                óN   — | j                  |d«      }t        |t        «      r|S d S )NÚid©r›   r˜   r.   )ÚclsrF   r�   s      r%   Ú_tool_idz_GeminiLiveTracer._tool_idß   s&   € à—*‘*˜U DÓ)ˆÜ$ W¬cÔ2ˆwÐ<¸Ð<r'   c                óN   — | j                  |d«      }t        |t        «      r|S d S )Nrt   rž   )rŸ   rF   rt   s      r%   Ú
_tool_namez_GeminiLiveTracer._tool_nameä   s&   € à�z‰z˜% Ó(ˆÜ! $¬Ô,ˆtÐ6°$Ð6r'   c                óR   — | j                  |«      xs | j                  |«      xs dS )NÚtool)r    r¢   )rŸ   rF   s     r%   Ú	_tool_keyz_GeminiLiveTracer._tool_keyé   s$   € à�|‰|˜EÓ"ÒE c§n¡n°UÓ&;ÒE¸vÐEr'   c                ó,  — |j                   xs d}| j                  j                  |dd|j                  i|j                  t        t        |«      «      dœ¬«      }| j                  j                  | j                  |«      g «      j                  |«       y )Nr¤   Úargs)Úfunction_call_idÚ	raw_event)rt   r   Úinputsrw   )rt   rh   Ú	open_spanr§   r�   r   r   ro   Ú
setdefaultr¥   Úappend)r$   r�   rY   rt   Úruns        r%   r‡   z_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                ó¨   — t        |t        «      rt        |t        «      st        d|«      }nt        d|«      f}|D ]  }| j	                  |«       Œ y)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_responsesz(_GeminiLiveTracer.observe_tool_responsesú   sJ   € ô
 �i¤Ô*´:¸iÌÔ3QÜÐ;¸YÓG‰EäÐ2°IÓ>Ð@ˆEÛˆHØ�N‰N˜8Õ$ñ r'   c           	     óV  — | j                  |«      xs d}| j                  |d«      }d|i}| j                  j                  | j	                  |«      «      }|s,| j                  |«      r| j                  j                  |«      }|rK|j                  d«      }| j                  «        | j                  j                  ||dt        |«      i¬«       y | j                  j                  || j                  j                  «       t        |«      ddi |¬«      5  	 d d d «       y # 1 sw Y   y xY w)Nr¤   r²   r   Úraw_response)rv   rw   F)rt   r   ru   rª   rv   )r¢   r›   ro   Úgetr¥   r    ÚpopÚ_prune_empty_toolsrh   Ú
close_spanr   rƒ   r�   r.   )r$   r²   rt   Úresponse_valuerv   Úqueuer®   s          r%   r°   z_GeminiLiveTracer._end_tool  s  € Ø�‰˜xÓ(Ò2¨FˆØŸ™ X¨zÓ:ˆØ˜~Ð.ˆØ× Ñ ×$Ñ$ T§^¡^°HÓ%=Ó>ˆÙ˜Ÿ™ xÔ0Ø×$Ñ$×(Ñ(¨Ó.ˆEÙØ—)‘)˜A“,ˆCØ×#Ñ#Ô%Ø�M‰M×$Ñ$ØØØ(¬*°XÓ*>Ð?ð %ô ð
 Ø�]‰]×%Ñ%ØØ�M‰M×ÑÓÜ�T“ØØØØð &õ 
ð ÷
÷ 
ñ 
ús   ÄDÄD(c                ó    — | j                   j                  t        |«      g «      }|D ]$  }d|_        | j                  j                  |«       Œ& y )Nztool call cancelled by Gemini)ro   r·   r.   Úerrorrh   r¹   )r$   r�   r»   r®   s       r%   r†   z_GeminiLiveTracer._cancel_tool!  sA   € Ø× Ñ ×$Ñ$¤S¨£\°2Ó6ˆÛˆCØ7ˆCŒIØ�M‰M×$Ñ$ SÕ)ñ r'   c                ó|   — | j                   j                  «       D ��ci c]  \  }}|sŒ	||“Œ c}}| _         y c c}}w r"   )ro   rš   )r$   r•   r»   s      r%   r¸   z$_GeminiLiveTracer._prune_empty_tools'  s=   € à)-×)9Ñ)9×)?Ñ)?Ô)Aô
Ù)A™:˜3 ÂUˆC�‰JÐ)Aò
ˆÕùó 
s   ž
8©8c                óÈ   — | j                   j                  «       D ]+  }|D ]$  }d|_        | j                  j	                  |«       Œ& Œ- | j                   j                  «        y )Nz.tool did not complete before the session ended)ro   Úvaluesr½   rh   r¹   Úclear)r$   r»   r®   s      r%   Ú_flush_open_toolsz#_GeminiLiveTracer._flush_open_tools,  sR   € Ø×%Ñ%×,Ñ,Ö.ˆEÛ�ØL�”	Ø—‘×(Ñ(¨Õ-ñ ð /ð 	×Ñ×ÑÕ r'   c           	     ó,  — | j                   j                  «       }d| _         |sy | j                  j                  d|«       | j                  j	                  |«       | j                  j                  ||ddd|dœ¬«      5  	 d d d «       y # 1 sw Y   y xY w)Nrg   Úuserr4   Trz   )rt   ru   rª   )rk   Ústriprh   r…   Ú	set_titlerƒ   )r$   rY   r�   r,   s       r%   r‚   z_GeminiLiveTracer._flush_user3  s‡   € Ø�‰×$Ñ$Ó&ˆØˆŒÙØØ�‰×!Ñ! &¨$Ô/Ø�‰×Ñ Ô%Ø�]‰]×%Ñ%ØØØ&ØØ"¨tÑ4ð &õ 
ð ÷
÷ 
ñ 
ús   Á?B
Â
Bc                óH   — | j                   j                  «       }d| _         |S rf   )rl   rÅ   ©r$   r,   s     r%   r„   z"_GeminiLiveTracer._take_agent_textC  s#   € Ø×Ñ×%Ñ%Ó'ˆØˆÔØˆr'   c           
     ó  — | j                  «       }|sy | j                  j                  d|«       | j                  j                  dd|dœ| j                  t        t        | j                  «      «      d| j                  dœ¬«       d | _        y )Nrx   r<   rz   r|   )r©   r}   r~   )rt   rv   rX   rw   )	r„   rh   r…   Ú
record_llmrm   r   r   rn   ri   rÈ   s     r%   Ú_flush_incomplete_agentz)_GeminiLiveTracer._flush_incomplete_agentH  s�   € Ø×$Ñ$Ó&ˆÙØØ�‰×!Ñ! +¨tÔ4Ø�‰× Ñ Ø'Ø(°TÑ:Ø×+Ñ+ä"¤:¨d×.@Ñ.@Ó#AÓBØ'Ø!%§¡ñð	 	!ô 		
ð  ˆÕr'   c                óÄ   — | j                   �4| j                  | j                   | j                  j                  «       «       | j	                  «        | j                  «        y r"   )rn   r‚   rh   r�   rË   rÂ   r*   s    r%   Úfinalizez_GeminiLiveTracer.finalizeY  sI   € Ø×ÑÐ)Ø×Ñ˜T×/Ñ/°·±×1BÑ1BÓ1DÔEØ×$Ñ$Ô&Ø×ÑÕ r'   )rp   r   rq   rP   rd   úOptional[Callable[[], bool]]rN   rO   )rY   r   rN   rO   )rF   Úobjectrt   r.   rN   rÏ   )rF   ú%FunctionCall | FunctionResponseOrDictrN   rP   )rF   rÐ   rN   r.   )r�   r   rY   r   rN   rO   )r±   ú9FunctionResponseOrDict | Sequence[FunctionResponseOrDict]rN   rO   )r²   r   rN   rO   )r�   r.   rN   rO   )rN   rO   )rY   r   r�   ÚfloatrN   rO   )rN   r.   )rQ   rR   rS   rT   r&   r‘   Ústaticmethodr›   Úclassmethodr    r¢   r¥   r‡   r³   r°   r†   r¸   rÂ   r‚   r„   rË   rÍ   rV   r'   r%   rc   rc   ~   sÓ   „ ÙIð ;?ñ8àð8ð ð	8ð
 8ð8ð 
ó8ó F,ðP ò*ó ð*ð
 ò=ó ð=ð ò7ó ð7ð òFó ðFóJð
%àLð
%ð 
ó
%óó6*ó
ó
!óó ó
 ô"!r'   rc   c                  óX   — e Zd ZdZ	 	 	 	 	 	 	 	 d	d„Zd
d„Zdd„Z	 	 	 	 dd„Zdd„Zdd„Z	y)Ú_TracedGeminiLiveSessionz:Transparent proxy over ``google.genai.live.AsyncSession``.c                ó.   — || _         || _        || _        y r"   )Ú_wrapped_sessionÚ_tracerÚ_trace)r$   rp   ÚtracerÚtraces       r%   r&   z!_TracedGeminiLiveSession.__init__c  s   € ð !(ˆÔØˆŒØˆ�r'   c                óB   — t        t        j                  | d«      |«      S )NrØ   )r-   rÏ   Ú__getattribute__)r$   rt   s     r%   Ú__getattr__z$_TracedGeminiLiveSession.__getattr__j  s   € Ü”v×.Ñ.¨tÐ5GÓHÈ$ÓOÐOr'   c               ó¤   K  — | j                   j                  «       2 3 d {  –—† }t        | j                  j                  |«       |­–— Œ/7 Œ*6 y ­wr"   )rØ   Úreceiver   rÙ   r‘   )r$   rY   s     r%   rá   z _TracedGeminiLiveSession.receivem  sA   è ø€ Ø!×2Ñ2×:Ñ:Ô<÷ 	�'Ü˜4Ÿ<™<×/Ñ/°Ô9ØŒMð	øÑ<ùs%   ‚A�A¡A¢A¥'AÁAÁAc             ƒ  ó˜   K  — | j                   j                  |¬«      ƒ d{  –—†  t        | j                  j                  |«       y7 Œ%­w)zBForward tool responses and use them to finish inferred tool spans.)Úfunction_responsesN)rØ   Úsend_tool_responser   rÙ   r³   )r$   rã   s     r%   rä   z+_TracedGeminiLiveSession.send_tool_responser  sJ   è ø€ ð ×#Ñ#×6Ñ6Ø1ð 7ó 
÷ 	
ð 	
ô 	�t—|‘|×:Ñ:Ð<NÕOð	
ús   ‚ A
¢A£&A
c                ól   — | j                   j                  | j                   j                  «       |«       y)z:Record user PCM16 for the bounded stereo conversation WAV.N)rÚ   Úrecord_userr�   ©r$   Úpcms     r%   Úrecord_user_audioz*_TracedGeminiLiveSession.record_user_audio}  s!   € à�‰×Ñ §¡§¡Ó 1°3Õ7r'   c                ól   — | j                   j                  | j                   j                  «       |«       y)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°CÕ8r'   N)rp   r   rÛ   rc   rÜ   r   rN   rO   )rt   r.   rN   r	   )rN   z AsyncIterator[LiveServerMessage])rã   rÑ   rN   rO   )rè   ÚbytesrN   rO   )
rQ   rR   rS   rT   r&   rß   rá   rä   ré   rì   rV   r'   r%   rÖ   rÖ   `  s\   „ ÙDðØ#ðØ->ðØGSðà	óóPóð
	Pð Vð	Pð 
ó		Pó8ô9r'   rÖ   c                  óh   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Zdd„Z	 	 	 	 	 	 	 	 dd„Zy)	Ú_GeminiLiveTracingSessionzCAsync context manager that owns one Gemini Live conversation trace.c       
        ó  — || _         || _        |xs t        t        j                  «       «      | _        || _        || _        || _        || _	        || _
        |	| _        |
| _        || _        d | _        d | _        d | _        y r"   )rØ   ri   r.   ÚuuidÚuuid4Ú
_thread_idÚ_sample_rateÚ_project_nameÚ_tagsÚ	_metadatarj   Ú_max_audio_secondsÚ_clientÚ	_replicasrÚ   rÙ   Ú_context)r$   rp   rq   Ú	thread_idÚsample_rateÚproject_nameÚtagsrw   rd   Úmax_audio_secondsÚclientÚreplicass               r%   r&   z"_GeminiLiveTracingSession.__init__‰  s{   € ð !(ˆÔØˆŒØ#Ò8¤s¬4¯:©:«<Ó'8ˆŒØ'ˆÔØ)ˆÔØˆŒ
Ø!ˆŒØ"3ˆÔØ"3ˆÔØˆŒØ!ˆŒØ+/ˆŒØ15ˆŒØ=Aˆ�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                  j                  «        t        | j                  | j                   | j"                  ¬«      | _        t'        | j(                  | j$                  | j                  «      S ­w)Nzgemini-livezgoogle-genai)
rü   rý   rþ   rÿ   rw   r   r  r  ÚintegrationÚintegration_versionrü   )Úparentrw   rÿ   rþ   r  )rq   rd   )r   ró   rô   rõ   rö   r÷   rø   rù   rú   r   rÚ   r   r®   rû   Ú	__enter__rc   ri   rj   rÙ   rÖ   rØ   r*   s    r%   Ú
__aenter__z$_GeminiLiveTracingSession.__aenter__§  sð   è ø€ Ü#Ø—o‘oØ×)Ñ)Ø×+Ñ+Ø—‘Ø—^‘^Ø"×5Ñ5Ø—<‘<Ø—^‘^Ø%Ü 3°NÓ Cô
ˆŒô (Ø—;‘;—?‘?Ø! 4§?¡?Ð3Ø—‘Ø×+Ñ+Ø—^‘^ô
ˆŒð 	�‰×ÑÔ!Ü(Ø�K‰KØ—+‘+Ø"×5Ñ5ô
ˆŒô
 (Ø×!Ñ! 4§<¡<°·±ó
ð 	
ùs   ‚D=D?c              ƒ  ó  K  — 	 | j                   �| j                   j                  «        | j                  �O|�3t        |«      j                  › d|› �| j                  j
                  _        | j                  j                  «        | j                  �| j                  j                  d d d «       y# t        $ r t        j                  dd¬«       Y ŒLw xY w# | j                  �| j                  j                  d d d «       w w xY w­w)Nz: z'Gemini Live tracing: failed to finalizeT)Úexc_infoF)rÙ   rÍ   rÚ   ÚtyperQ   r®   r½   Ú	ExceptionÚloggerÚwarningrû   Ú__exit__)r$   Úexc_typeÚexcÚtbs       r%   Ú	__aexit__z#_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B/ Â*DÂ/ CÃC ÃCÃC Ã,DÄDN)rp   r   rq   rP   rü   úOptional[str]rý   Úintrþ   r  rÿ   úOptional[list[str]]rw   úOptional[dict[str, Any]]rd   rÎ   r   úOptional[float]r  úOptional[Client]r  ú Optional[Sequence[WriteReplica]]rN   rO   )rN   rÖ   )r  ztype[BaseException] | Noner  zBaseException | Noner  zTracebackType | NonerN   r9   )rQ   rR   rS   rT   r&   r  r  rV   r'   r%   rï   rï   †  s½   „ ÙMðBàðBð ð	Bð
 !ðBð ðBð $ðBð "ðBð +ðBð 8ðBð +ðBð !ðBð 3ðBð 
óBó<
ð<à,ðð "ðð !ð	ð
 
ôr'   rï   ©
rq   rü   rý   rþ   rÿ   rw   rd   r   r  r  c       
        ó.   — 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ï   )rp   rq   rü   rý   rþ   rÿ   rw   rd   r   r  r  s              r%   Úwrap_gemini_liver  Ú  s2   € ô6 %ØØØØØ!ØØØ+Ø+ØØôð r'   )rY   r   rN   zdict[str, Any] | None)r^   r.   r_   r.   rN   r.   )rp   r   rq   rP   rü   r  rý   r  rþ   r  rÿ   r  rw   r  rd   rÎ   r   r  r  r  r  r  rN   rï   )9rT   Ú
__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   Ú	getLoggerrQ   r  ÚDEFAULT_SAMPLE_RATEr\   r    rZ   ra   rc   rÖ   rï   r  rV   r'   r%   Ú<module>r/     sd  ðñõ, #ã Û ß -Ý -Ý ß ?Õ ?å 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'   