ó
    üÞ j‹p  ã            
      óø  • S r SSKJr  SSKrSSKrSSKrSSKrSSKJrJ	r	J
r
Jr  SSKJr  SSK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Jr  SSKJr  \R>                  " \ 5      r!Sr"Sr#Sr$Sr%S#S jr&S#S jr'S$S jr(S\)" 5       4S%S j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r0S,S jr1S-S jr2 " S S5      r3 " S S 5      r4S\"SSSS\SSS!.	                     S.S" jjr5g)/u«  LangSmith tracing for the OpenAI Agents SDK realtime backend.

The Agents SDK's realtime sessions emit no local SDK trace spans (realtime
tracing is server-side only), so the existing batch ``OpenAIAgentsTracingProcessor``
captures nothing here. This is a separate, complementary integration:
:func:`wrap_realtime_session` wraps the ``RealtimeSession`` so the trace is built
from its **semantic event stream**, while the caller's ``async for event in
session`` loop is left untouched.

The conversation is reconstructed from the full ``history`` snapshot the session
delivers on every ``history_updated`` â€” not from the streamed events, which
mis-deliver user messages and emit the assistant transcript as growing partials.
Snapshots are folded into an item map keyed by stable ``item_id`` (latest text
per id wins â†’ partials collapse); each finalized message emits one span (a
curated ``user_message`` or an assistant ``model`` ``llm`` span), grouped into
turns. Each SDK-run tool becomes a single ``tool`` span spanning its
``tool_start``â†’``tool_end`` pair (so the span duration is the real tool latency);
``audio_interrupted`` flags the turn. Token usage â€” which the SDK exposes no
*semantic* event for â€” is recovered from the raw ``response.done`` the SDK still
forwards as a ``raw_model_event`` (``raw_server_event``), then attached to that
turn's assistant ``model`` span so the conversation is priced (audio tokens
included).

Trace shape â€” one conversation = one trace::

    realtime_session                                   (root; transcript + WAV)
    â”œâ”€â”€ turn                                           (latency_ms, was_interrupted)
    â”‚   â”œâ”€â”€ user_message                               (curated user msg, from history)
    â”‚   â”œâ”€â”€ lookup_weather                             (tool â€” args in / output out)
    â”‚   â””â”€â”€ model             (assistant message)      (llm â€” from history)
    â””â”€â”€ turn â€¦
é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚCallableÚOptional)Úget_package_version)Úobserve_safely)ÚDEFAULT_MAX_AUDIO_SECONDSÚEventSessionÚstart_session)Úusage_metadata_from_usage)Útracing_context)ÚSequence)ÚClientÚRunTree)ÚWriteReplicaiÀ]  é   é2   éÈ   c           	     ó€   • U b/  [        U [        [        [        [        [
        [        45      (       a  U $ [        U 5      $ )zIKeep JSON-able values as-is; repr anything exotic so a span never breaks.)Ú
isinstanceÚstrÚintÚfloatÚboolÚdictÚlistÚrepr)Úvalues    Úi/var/www/html/gaurav/venv/lib/python3.13/site-packages/langsmith/integrations/openai_realtime/_session.pyÚ
_stringifyr!   L   s/   € à�}œ
 5¬3´´U¼DÄ$ÌÐ*M×NÑNØˆÜ�‹;Ðó    c                ó¢   • [        U SS5      n[        U[        5      (       a  U$ [        U 5      n[	        U5      [
        ::  a  U$ US[
         S-   $ )z=Last-resort view of a value we won't (or can't) recurse into.ÚnameNõ   â€¦)Úgetattrr   r   r   ÚlenÚ	_MAX_REPR)r   r$   Útexts      r    Ú_shallowr*   S   sM   € ä�5˜& $Ó'€DÜ�$œ×ÑØˆÜ�‹;€DÜ�t“9¤	Ó)ˆ4ÐG¨t°J´YÐ/?À%Ñ/GÐGr"   c           	     óÆ  • [         R                  " U 5      (       aY  [        U [        5      (       dD  [         R                  " U 5       Vs0 sH#  oR
                  [        XR
                  S5      _M%     nnO[        U SS5      nU(       d  gUR                  5        VVs0 sH1  u  p4UR                  S5      (       a  M  [        U5      (       a  M/  X4_M3     snn$ s  snf s  snnf )z?Public, non-callable attributes of a dataclass/object, or None.NÚ__dict__Ú_)
ÚdataclassesÚis_dataclassr   ÚtypeÚfieldsr$   r&   ÚitemsÚ
startswithÚcallable)r   Úfr1   ÚkÚvs        r    Ú_public_fieldsr8   \   s¹   € ô ×Ò ×&Ñ&¬z¸%Ä×/FÑ/Fä:E×:LÒ:LÈUÔ:Só
Ù:S°Q�F‰F”G˜E§6¡6¨4Ó0Ò0Ñ:Sð 	ð 
ˆô ˜ 
¨DÓ1ˆÞØàŸ™œôÙ'‘�¨q¯|©|¸C×/@‹ÌÐRSÏ‹ˆŠ™òð ùò
ùós   Á	)CÂCÂ<CÃCc           
     óN  • U b%  [        U [        [        [        [        45      (       a  U $ [        U [
        [        [        45      (       a  S[        [        U 5      5       S3$ U[        :¼  a  [        U 5      $ [        U 5      U;   a  gU[        U 5      1-  n[        U [        5      (       a—  0 n[        U R                  5       5       Hv  u  nu  pVU[        :¼  a  S[        U 5      [        -
   S3US'     U$ [        U[        5      (       a  UR!                  S5      (       a  M[  [#        XaS	-   U5      U[        U5      '   Mx     U$ [        U [$        [&        [(        45      (       aj  [%        U 5      nUS[          Vs/ sH  n[#        X�S	-   U5      PM     n	n[        U5      [        :”  a%  U	R+                  S
[        U5      [        -
   S35        U	$ [-        U 5      n
U
(       a2  U
R                  5        VVs0 sH  u  p¸U[#        X�S	-   U5      _M     snn$ [        U 5      $ s  snf s  snnf )zùRecursively coerce any value into a compact, JSON-able span payload.

Keeps readable data and strips what would break or bloat a span: raw bytes,
callables, private attributes, and anything past the depth/width caps. Cycles
are broken via ``seen``.
NÚ<z bytes>z
<circular>Ú+z morer%   r-   é   u   â€¦ +)r   r   r   r   r   ÚbytesÚ	bytearrayÚ
memoryviewr'   Ú
_MAX_DEPTHr*   Úidr   Ú	enumerater2   Ú
_MAX_ITEMSr3   Ú_cleanr   ÚtupleÚsetÚappendr8   )r   ÚdepthÚseenÚoutÚiÚkeyÚvalr2   r7   Úcleanedr1   r6   s               r    rD   rD   l   sß  € ð �}œ
 5¬3´´U¼DÐ*A×BÑBØˆÜ�%œ%¤¬JÐ7×8Ñ8Ø”3”u˜U“|Ó$Ð% WÐ-Ð-à”
ÓÜ˜‹ÐÜ	ˆ%ƒy�DÓØØ”2�e“9�+Ñ€Dä�%œ×ÑØ ˆÜ& u§{¡{£}Ö5‰MˆA‰z�Ø”J‹Ø ¤ U£¬jÑ!8Ð 9¸Ð?��E‘
Øð ˆ
ô ˜#œs×#Ñ#¨¯©°s×(;Ñ(;ÙÜ" 3°©	°4Ó8ˆC”�C“‹Mñ 6ð ˆ
ä�%œ$¤¤sÐ+×,Ñ,Ü�U“ˆØ7<¸[¼jÑ7IÓJÑ7I°!”6˜! Q™Y¨Ö-Ñ7IˆÐJÜˆu‹:œ
Ó"Ø�N‰N˜U¤3 u£:´
Ñ#:Ð";¸5ÐAÔBØˆä˜EÓ"€FÞØ:@¿,¹,¼.ÔI¹.±$°!�”6˜! Q™Y¨Ó-Ò-¹.ÒIÐIÜ�E‹?Ðùò Kùó Js   Å9HÇ2H!c                óJ   • [        U SS 5      =(       d    U b  [        U 5      $ S $ )Nr$   )r&   r   )Útools    r    Ú
_tool_namerQ   –   s$   € Ü�4˜ Ó&×T¸Ñ9I¬4°«:ÐTÈtÐTr"   c                ó  • U c  g[        U SS5      n[        U SS5      =(       d    / n/ nU H>  n[        USS5      =(       d    [        USS5      nU(       d  M-  UR                  U5        M@     USR                  U5      =(       d    S4$ )z9Best-effort ``(role, text)`` for a realtime history item.N©NNÚroleÚcontentÚ
transcriptr)   Ú )r&   rG   Újoin)ÚitemrT   rU   ÚpartsÚpartr)   s         r    Ú
_item_textr\   š   s�   € à�|ØÜ�4˜ Ó&€DÜ�d˜I tÓ,×2°€GØ€EÛˆÜ�t˜\¨4Ó0×O´G¸DÀ&È$Ó4Oˆßˆ4Ø�L‰L˜Öñ ð �#—(‘(˜5“/×) TÐ*Ð*r"   c                ó¶   • [        U SS5      n[        USS5      S:w  a  g[        USS5      =(       d    SR                  5       nU(       d  g[        USS5      U4$ )zíExtract the user transcript from a ``raw_model_event``.

Reads a ``raw_model_event`` wrapping an input-audio transcription completion
(the wire-level source ``history`` can omit on a barge-in). Returns
``(item_id, transcript)`` or None.
ÚdataNr0   Ú#input_audio_transcription_completedrV   Ú Úitem_id)r&   Ústrip)Úeventr^   rV   s      r    Úraw_input_transcriptrd   ¨   s]   € ô �5˜& $Ó'€DÜˆt�V˜TÓ"Ð&KÓKØÜ˜$ ¨dÓ3×9°r×@Ñ@ÓB€JÞØÜ�4˜ DÓ)¨:Ð5Ð5r"   c                ó  • [        U SS5      n[        USS5      n[        U[        5      (       a  UR                  S5      S:w  a  gUR                  S5      n[        U[        5      (       d  g[	        UR                  S5      5      $ )u°  Token usage from a ``raw_model_event`` wrapping a ``response.done``.

The Agents SDK emits no semantic usage event, but still forwards the raw
``response.done`` (as a ``raw_server_event``), which carries ``response.usage``
â€” the only place per-turn token counts appear on this backend. Maps it via the
shared Realtime usage mapper (so audio/cached detail is kept). Returns ``None``
for any other event or a payload without usage.
r^   Nr0   zresponse.doneÚresponseÚusage)r&   r   r   Úgetr   )rc   r^   Úrawrf   s       r    Úraw_response_usagerj   ¸   sq   € ô �5˜& $Ó'€DÜ
�$˜ Ó
%€CÜ�cœ4× Ñ  C§G¡G¨F£O°Ó$FØØ�w‰w�zÓ"€HÜ�h¤×%Ñ%ØÜ$ X§\¡\°'Ó%:Ó;Ð;r"   c                óT   • [        U SS5      n[        U5      u  p#[        USS5      X#4$ )zF``(item_id, role, text)`` for a ``history_added`` event's single item.rY   Nra   )r&   r\   )rc   rY   rT   r)   s       r    Úhistory_itemrl   Ë   s0   € ä�5˜& $Ó'€DÜ˜DÓ!�J€DÜ�4˜ DÓ)¨4Ð5Ð5r"   c                óš   • / n[        U SS5      =(       d    /  H.  n[        U5      u  p4UR                  [        USS5      X445        M0     U$ )zK``(item_id, role, text)`` for every item in a ``history_updated`` snapshot.ÚhistoryNra   )r&   r\   rG   )rc   rJ   rY   rT   r)   s        r    Úhistory_messagesro   Ò   sO   € à;=€CÜ˜˜y¨$Ó/×5°2Ò5ˆÜ Ó%‰
ˆØ�
‰
”G˜D )¨TÓ2°DÐ?Ö@ñ 6ð €Jr"   c                ó,  • [        U SS5      =(       d    [        U 5      n[        U 5      n[        U[        5      (       a  UOSU0nXS'   SnUS;   a  [        [        U SS5      SS5      US'   GO£US:X  a6  [        [        U S	S5      5      US	'   [        [        U S
S5      5      US
'   SnGOgUS:X  aM  [        [        U S	S5      5      US	'   [        [        U S
S5      5      US
'   [        [        U SS5      5      US'   GOUS:X  a  [        U SS5      US'   OýUS:X  a(  [        [        U SS5      5      u  pVXVsUS'   US'   US:H  nOÏUS:X  aM  [        U SS5      =(       d    / nU(       a  [        US   5      OSu  pVXVsUS'   US'   [        U5      US'   US:H  nO|US:X  a7  [        [        U SS5      SS5      US'   [        [        U SS5      SS5      US'   O?US:X  a  [        [        U S S5      5      US '   OUS!:X  a  [        [        U S!S5      5      US!'   XU4$ )"z9Map a session event to ``(name, span_payload, inbound)``.r0   Nr   F©Úagent_startÚ	agent_endÚagentr$   Ú
tool_startrP   Ú	argumentsTÚtool_endÚoutputÚaudio_interruptedra   Úhistory_addedrY   rT   r)   ÚuserÚhistory_updatedrn   éÿÿÿÿrS   Ú	last_roleÚ	last_textÚlengthÚhandoffÚ
from_agentÚto_agentÚguardrail_trippedÚmessageÚerror)	r&   r   rD   r   r   rQ   r!   r\   r'   )rc   ÚetypeÚdumpedÚpayloadÚinboundrT   r)   rn   s           r    Údescribe_eventr‹   Û   s8  € ä�E˜6 4Ó(×7¬D°«K€EÜ�E‹]€FÜ(2°6¼4×(@Ñ(@™fÀwÐPVÐFW€GØˆF�OØ€GàÐ,Ó,Ü"¤7¨5°'¸4Ó#@À&È$ÓOˆ�ÓØ	�,Ó	Ü$¤W¨U°F¸DÓ%AÓBˆ�‰Ü)¬'°%¸ÀdÓ*KÓLˆ�ÑØŠØ	�*Ó	Ü$¤W¨U°F¸DÓ%AÓBˆ�‰Ü)¬'°%¸ÀdÓ*KÓLˆ�ÑÜ&¤w¨u°hÀÓ'EÓFˆ�ÓØ	Ð%Ó	%Ü$ U¨I°tÓ<ˆ�	ÒØ	�/Ó	!Ü¤¨¨v°tÓ <Ó=‰
ˆØ+/Ð(ˆ�‰˜ ™Ø˜&‘.‰Ø	Ð#Ó	#Ü˜% ¨DÓ1×7°RˆÞ07”Z ¨¡Ô,¸\‰
ˆØ59Ð2ˆ�Ñ˜g kÑ2Ü ›Lˆ�ÑØ˜&‘.‰Ø	�)Ó	Ü 'Ü�E˜<¨Ó.°¸ó!
ˆ�Ñô &¤g¨e°ZÀÓ&FÈÐPTÓUˆ�
ÒØ	Ð%Ó	%Ü'¬°°yÀ$Ó(GÓHˆ�	ÒØ	�'Ó	Ü%¤g¨e°W¸dÓ&CÓDˆ�Ñà˜7Ð"Ð"r"   c                óÌ   • [        U SS5      n[        U[        5      (       a  U=(       d    S$ S H1  n[        XS5      n[        U[        5      (       d  M&  U(       d  M/  Us  $    g)a  Best-effort model name for a ``RealtimeSession`` (attribution only).

The Agents SDK emits no per-response usage, so this never drives cost; it
just tags the assistant ``llm`` span with ``ls_model_name``. Returns ``None``
when the model can't be read from the session.
ÚmodelN)Ú
model_namer�   )r&   r   r   )Úsessionr�   Úattrr$   s       r    Ú_resolve_modelr‘     sZ   € ô �G˜W dÓ+€EÜ�%œ×ÑØ�}˜ÐÛ'ˆÜ�u DÓ)ˆÜ�dœC× Ó §T TØŠKñ (ð r"   c                  ó”   • \ rS rSrSrSSS.       SS j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)Ú_AgentsRealtimeTraceri  aì  Reconstructs the conversation from history snapshots and emits its spans.

Folds each ``history`` snapshot into a map keyed by stable ``item_id``
(latest non-empty text wins, so partials collapse), emits one span per
finalized message (a ``user_message`` or an assistant ``model`` ``llm`` span)
grouped into per-user-turn ``turn`` spans, and spans ``tool_end`` /
``audio_interrupted`` from the live stream. Optionally notifies an
``on_message`` callback as finalized transcript lines arrive.
N©Ú
on_messager�   c               óœ   • Xl         X l        X0l        0 U l        [	        5       U l        [	        5       U l        S U l        S U l        0 U l	        g ©N)
Ú_traceÚ_on_messageÚ_modelÚ_itemsrF   Ú_emittedÚ	_notifiedÚ_latency_sinceÚ_pending_usageÚ_open_tools)Úselfr�   r•   r�   s       r    Ú__init__Ú_AgentsRealtimeTracer.__init__"  sK   € ð ŒØ%ÔØŒà13ˆŒÜ"%£%ˆŒÜ/2«uˆŒà,0ˆÔð 6:ˆÔð
 PRˆÕr"   c                ó.  • U R                   R                  5       n[        USS5      nUc  gUS:X  a  U R                  U5        gUS:X  aP  [	        U5      =nb  X@l        [        U5      nU(       a)  Uu  pgU R                  USU4/U5        U R                  SS9  gUS:X  a,  U R                  [        U5      /U5        U R                  SS9  gUS	:X  a+  U R                  [        U5      U5        U R                  SS9  gUS
;   a  gUS:X  a  U R                  U5        gUS:X  a  U R                  X5        g[        U5      u  p‰n
US:X  a  U R                   R                  SS9  U R                   R                  X’XŠS9    SSS5        g! , (       d  f       g= f)zBObserve one session event: fold history, emit spans, time latency.r0   NÚaudioÚraw_model_eventr{   T©Ú	hold_lastrz   r|   rq   ru   rw   ry   )Úwas_interrupted)r$   rŠ   )r˜   Únowr&   Úrecord_first_audiorj   rŸ   rd   Ú_observe_itemsÚ_flushrl   ro   Ú_start_toolÚ	_end_toolr‹   Úadd_turn_metadataÚ
event_span)r¡   rc   Úreceived_atr‡   rg   Úrecra   rV   r$   r‰   rŠ   s              r    ÚobserveÚ_AgentsRealtimeTracer.observe;  s—  € à—k‘k—o‘oÓ'ˆÜ˜˜v tÓ,ˆØ‰=Øà�GÓØ×#Ñ# KÔ0ØØÐ%Ó%Ü+¨EÓ2Ð2�Ñ?Ø&+Ô#Ü& uÓ-ˆCÞØ&)Ñ#�Ø×#Ñ# g¨v°zÐ%BÐ$CÀ[ÔQØ—‘ d�Ñ+ØØ�OÓ#Ø×Ñ¤¨eÓ!4Ð 5°{ÔCØ�K‰K $ˆKÑ'ØØÐ%Ó%Ø×ÑÔ 0°Ó 7¸ÔEØ�K‰K $ˆKÑ'ØØÐ0Ó0Øð �LÓ Ø×Ñ˜UÔ#ØØ�JÓØ�N‰N˜5Ô.Øô "0°Ó!6Ñˆ�wØÐ'Ó'Ø�K‰K×)Ñ)¸$Ð)Ñ?ð �[‰[×#Ñ# G¸tÐ#ÒUØ÷ V×UÖUús   Å;FÆ
Fc                ó   • [        [        USS5      5      n[        [        USS5      5      nU R                  R	                  U=(       d    SSSU0S9nU R
                  R                  X#4/ 5      R                  U5        g)z:Open a held-open ``tool`` span for a ``tool_start`` event.rP   Nrv   )r$   Úrun_typeÚinputs)rQ   r&   r!   r˜   Ú	open_spanr    Ú
setdefaultrG   )r¡   rc   r$   ÚargsÚruns        r    r®   Ú!_AgentsRealtimeTracer._start_tooll  sx   € äœ' %¨°Ó6Ó7ˆÜœ' %¨°dÓ;Ó<ˆØ�k‰k×#Ñ#Ø—˜ØØ Ð&ð $ð 
ˆð
 	×Ñ×#Ñ# T L°"Ó5×<Ñ<¸SÕAr"   c           
     óè  • [        [        USS5      5      n[        [        USS5      5      n[        [        USS5      5      nU R                  R	                  X445      nU(       aC  UR                  S5      nU(       d  U R                  X44	 U R                  R                  USU0S9  gU R                  R                  X4US.UU=(       d    SSSSU0SU0S	9    SSS5        g! , (       d  f       g= f)
zçClose the matching open tool span for a ``tool_end`` event.

Matched on ``(tool_name, arguments)`` FIFO. If no open start matches
(e.g. tracing began mid-call), fall back to a point-in-time tool span so
the call is still recorded.
rP   Nrv   rx   r   )Úoutputs)rP   rv   rx   F)r$   r·   rŠ   r¸   r¿   )	rQ   r&   r!   r    rh   Úpopr˜   Ú
close_spanr±   )r¡   rc   r²   r$   r»   rx   Úqueuer¼   s           r    r¯   Ú_AgentsRealtimeTracer._end_toolw  së   € ô œ' %¨°Ó6Ó7ˆÜœ' %¨°dÓ;Ó<ˆÜœG E¨8°TÓ:Ó;ˆØ× Ñ ×$Ñ$ d \Ó2ˆÞØ—)‘)˜A“,ˆCÞØ×$Ñ$ d \Ð2Ø�K‰K×"Ñ" 3°¸6Ð0BÐ"ÑCØØ�[‰[×#Ñ#Ø¸Ñ?ØØ—˜ØØØ Ð&Ø˜vÐ&ð $ò 
ð ÷
÷ 
ö 
ús   ÃC#Ã#
C1c                óî   • U R                  SS9  U R                  R                  5        H.  nU H%  nSUl        U R                  R                  U5        M'     M0     U R                  R                  5         g)a  Emit any messages still pending and close orphaned tool spans.

Called at teardown. A ``tool_start`` whose tool raised (or a session torn
down mid-call) never gets a ``tool_end``; those spans are closed here with
an error so they don't dangle open forever.
Fr§   z.tool did not complete before the session endedN)r­   r    Úvaluesr†   r˜   rÁ   Úclear)r¡   rÂ   r¼   s      r    Úflush_pendingÚ#_AgentsRealtimeTracer.flush_pending“  sb   € ð 	�‰˜eˆÑ$Ø×%Ñ%×,Ñ,Ö.ˆEÛ�ØL�”	Ø—‘×&Ñ& sÖ+ó ñ /ð 	×Ñ×ÑÕ r"   c                ó†  • U H»  u  p4nU(       d  M  X0R                   ;  a5  US:X  a/  U R                  SS9  U R                  R                  5         X l        U R                   R                  U5      nUc  XES.U R                   U'   OU(       a  XFS'   U(       a  XVS'   US;   d  M¡  U(       d  Mª  U R                  XE5        M½     g)	zàFold ``(item_id, role, text)`` tuples into the map.

A brand-new user item begins a turn: the previous turn's messages are
flushed first (so they stay grouped under it), then a new turn opens and
the latency timer is armed.
r{   Fr§   N)rT   r)   rT   r)   ©r{   Ú	assistant)r›   r­   r˜   Ú
start_turnrž   rh   Ú_notify)r¡   Úseqr²   ÚiidrT   r)   Úcurs          r    r¬   Ú$_AgentsRealtimeTracer._observe_items¡  s¡   € ó  #‰OˆC�tÞÙØŸ+™+Ó%¨$°&«.Ø—‘ e�Ñ,Ø—‘×&Ñ&Ô(Ø&1Ô#Ø—+‘+—/‘/ #Ó&ˆCØ‰{Ø,0Ñ#?�—‘˜CÒ æØ"&˜‘KÞØ"&˜‘KØÐ,Õ,·°Ø—‘˜TÖ(ò!  #r"   c                óÞ   • [        U R                  5      nU(       a  [        U5      S-
  O
[        U5      nUS[        SU5        H%  nX@R                  ;  d  M  U R                  U5        M'     g)zˆEmit not-yet-emitted items in order.

Optionally holds back the last (still-streaming) item until it is
superseded or the session ends.
r<   Nr   )r   r›   r'   Úmaxrœ   Ú_record_item)r¡   r¨   ÚidsÚcutoffrÏ   s        r    r­   Ú_AgentsRealtimeTracer._flushº  sW   € ô �4—;‘;ÓˆÞ!*”�S“˜A’´°C³ˆØÐ'œ˜Q ›Ó(ˆCØŸ-™-Õ'Ø×!Ñ! #Ö&ò )r"   c                ó�   • U R                   b9  U R                  R                  [        XR                   -
  S-  5      S9  SU l         gg)zERecord ``latency_to_first_audio_ms`` on the open turn, once per turn.Niè  )Úlatency_to_first_audio_ms)rž   r˜   r°   Úround)r¡   r²   s     r    r«   Ú(_AgentsRealtimeTracer.record_first_audioÆ  sM   € à×ÑÑ*Ø�K‰K×)Ñ)Ü*/Ø ×#6Ñ#6Ñ6¸$Ñ>ó+ð *ñ ð
 #'ˆDÕð +r"   c                óº   • U R                   b  U(       a  U(       d  gX4U R                  ;   a  gU R                  R                  X45        U R                  X5        g)zCSend one finalized transcript line to the on_message callback once.N)r™   r�   Úadd)r¡   rT   r)   s      r    rÍ   Ú_AgentsRealtimeTracer._notifyÐ  sH   € à×ÑÑ#®4¶tØØˆ<˜4Ÿ>™>Ó)ØØ�‰×Ñ˜D˜<Ô(Ø×Ñ˜Õ$r"   c           	     ó�  • U R                   U   S   nU R                   U   S   =(       d    SR                  5       nUS;  a  U R                  R                  U5        gU(       d  gU R                  R                  U5        U R	                  X#5        U R
                  R                  X#5        US:X  aG  U R
                  R                  USUS.U R
                  R                  5       SS	SUS
.S9    SSS5        gU R
                  R                  SUS
.U R                  SU R                  S.S9  SU l
        g! , (       d  f       g= f)z:Emit one message span for a finalized history item (once).rT   r)   r`   rÊ   Nr{   )ra   rT   rU   Úuser_messageT)rT   rU   )r$   rŠ   r¸   rË   Úopenai)Úls_providerÚls_model_name)r¿   Úusage_metadataÚmetadata)r›   rb   rœ   rÝ   rÍ   r˜   Úadd_messager±   rª   Ú
record_llmrŸ   rš   )r¡   rÏ   rT   r)   s       r    rÔ   Ú"_AgentsRealtimeTracer._record_itemÙ  s(  € à�{‰{˜3Ñ Ñ'ˆØ—‘˜CÑ  Ñ(×.¨B×5Ñ5Ó7ˆØÐ,Ó,Ø�M‰M×Ñ˜cÔ"ØÞØØ�‰×Ñ˜#ÔØ�‰�TÔ Ø�‰×Ñ Ô+Ø�6‹>Ø—‘×'Ñ'Ø¨¸DÑAØ—‘—‘Ó!Ø#ØØ &°4Ñ8ð (ò ð ÷ð ð �K‰K×"Ñ"Ø!,¸Ñ>Ø#×2Ñ2Ø)1ÀDÇKÁKÑPð #ñ ð
 #'ˆDÕ÷õ ús   Ã/D7Ä7
E)	rœ   r›   rž   rš   r�   r™   r    rŸ   r˜   )r�   r   r•   ú$Optional[Callable[[str, str], None]]r�   úOptional[str]ÚreturnÚNone)rc   r   rë   rì   )rc   r   r²   r   rë   rì   )rë   rì   )rÎ   zlist[tuple]r²   r   rë   rì   )r¨   r   rë   rì   )r²   r   rë   rì   )rT   ú
str | Noner)   rí   rë   rì   )rÏ   r   rë   rì   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r¢   r´   r®   r¯   rÇ   r¬   r­   r«   rÍ   rÔ   Ú__static_attributes__© r"   r    r“   r“     so   † ñð <@Ø#ñRàðRð 9ð	Rð
 ðRð 
õRô2/ôb	Bôô8!ô)ô2
'ô'ô%÷'r"   r“   c                  ó”   • \ 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S	 jrSS
 jrSrg)Ú_TracedRealtimeSessioni÷  uz  Async-context-manager proxy over a ``RealtimeSession`` that traces events.

Delegates the underlying session's ``async with`` and every attribute
(``send_audio``, â€¦), iterates its events, and observes each. On exit it emits
any pending messages and finalizes the conversation root (transcript + WAV).
Exposes ``record_user_audio`` / ``record_agent_audio`` for the stereo WAV.
c       	        ó   • Xl         U=(       d    [        [        R                  " 5       5      U l        X0l        X@l        XPl        X`l        Xpl	        X€l
        X�l        X l        S U l        S U l        S U l        S U l        g r—   )Ú_sessionr   ÚuuidÚuuid4Ú
_thread_idÚ_sample_rateÚ_project_nameÚ_tagsÚ	_metadatar™   Ú_max_audio_secondsÚ_clientÚ	_replicasr˜   Ú_tracerÚ_ctxÚ_aiter)r¡   r�   Ú	thread_idÚsample_rateÚproject_nameÚtagsrå   r•   Úmax_audio_secondsÚclientÚreplicass              r    r¢   Ú_TracedRealtimeSession.__init__   sj   € ð   ŒØ#×8¤s¬4¯:ª:«<Ó'8ˆŒØ'ÔØ)ÔØŒ
Ø!ŒØ%ÔØ"3ÔØŒØ!Œð /3ˆŒØ8<ˆŒØˆŒ	Øˆ�r"   c                óB   • [        [        R                  U S5      U5      $ )Nrø   )r&   ÚobjectÚ__getattribute__)r¡   r$   s     r    Ú__getattr__Ú"_TracedRealtimeSession.__getattr__!  s   € Ü”v×.Ñ.¨t°ZÓ@À$ÓGÐGr"   c              ƒ  óp  #   • U R                   R                  5       I S h  v•N    [        U R                  U R                  U R
                  U R                  U R                  U R                  U R                  U R                  S[        S5      S9
nXl        [        SU R                  0U R                  U R
                  U R                  S9nUR                  5         X l        [!        XR"                  [%        U R                   5      S9U l        U $  Nð! [(         a–    U R                  bR   U R                  R*                  " [,        R.                  " 5       6   O$! [0         a    [2        R5                  SSS	9   Of = fU R                   R6                  " [,        R.                  " 5       6 I S h  v•N    e f = f7f)
Nzopenai-agents-realtimezopenai-agents)
r  r  r  r	  rå   r
  r  r  ÚintegrationÚintegration_versionr  )rå   r	  r  r  r”   zCvoice tracing: error unwinding context after a failed session enterT©Úexc_info)rø   Ú
__aenter__r   rû   rü   rý   rþ   rÿ   r   r  r  r   r˜   r   Ú	__enter__r  r“   r™   r‘   r  ÚBaseExceptionÚ__exit__Úsysr  Ú	ExceptionÚloggerÚdebugÚ	__aexit__)r¡   ÚtraceÚctxs      r    r  Ú!_TracedRealtimeSession.__aenter__$  sf  é € Ø�m‰m×&Ñ&Ó(×(Ð(ð$	Ü!ØŸ/™/Ø ×-Ñ-Ø!×/Ñ/Ø—Z‘ZØŸ™Ø"&×"9Ñ"9Ø—|‘|ØŸ™Ø4Ü$7¸Ó$HñˆEð  ŒKÜ!Ø% t§¡Ð7Ø—Z‘ZØ!×/Ñ/ØŸ™ñ	ˆCð �M‰MŒOØŒIÜ0Ø×"2Ñ"2¼.ÈÏÉÓ:WñˆDŒLð ˆñS 	)øô: ó 	Ø�y‰yÑ$ðØ—I‘I×&Ò&¬¯ª«Ò7øÜ ó Ü—L‘Lð(à!%ð !ó ðúð —-‘-×)Ò)¬3¯<ª<«>Ð:×:Ñ:Øð	üsW   ‚F6 D¡F6¦C)D ÄF6ÄF3Ä+,EÅF3ÅE9Å6F3Å8E9Å92F3Æ+F.Æ,F3Æ3F6c              ƒ  óJ  #   •  U R                   b  U R                   R                  5         U R                  bG  Ub*  UR                   SU 3U R                  R                  l        U R                  R                  5         U R                  b  U R                  R                  S S S 5        U R                  R                  XU5      I S h  v•N $ ! [         a    [        R                  SSS9   Nnf = f! U R                  b  U R                  R                  S S S 5        f f = f NX7f)Nz: z)voice tracing: failed to finalize sessionTr  )r  rÇ   r˜   rî   r¼   r†   Úfinalizer  r  Úwarningr  r  rø   r   )r¡   Úexc_typeÚexcÚtbs       r    r   Ú _TracedRealtimeSession.__aexit__P  sñ   é € ð	5Ø�|‰|Ñ'Ø—‘×*Ñ*Ô,Ø�{‰{Ñ&Ø‘?Ø/7×/@Ñ/@Ð.AÀÀCÀ5Ð,I�D—K‘K—O‘OÔ)Ø—‘×$Ñ$Ô&ð �y‰yÑ$Ø—	‘	×"Ñ" 4¨¨tÔ4Ø—]‘]×,Ñ,¨X¸BÓ?×?Ð?øô ó 	WÜ�N‰NÐFÐQUˆNÓVð	Wûð �y‰yÑ$Ø—	‘	×"Ñ" 4¨¨tÕ4ð %úá?ùsB   ‚D#„A;C Á?A	D#ÃD!Ã	D#ÃC.Ã+C1 Ã-C.Ã.C1 Ã1-DÄD#c                óD   • U R                   R                  5       U l        U $ r—   )rø   Ú	__aiter__r  )r¡   s    r    r,  Ú _TracedRealtimeSession.__aiter__b  s   € Ø—m‘m×-Ñ-Ó/ˆŒØˆr"   c              ƒ  óú   #   • U R                   nUc   U R                  R                  5       nXl         UR                  5       I S h  v•N nU R                  b   [        U R                  R                  U5        U$  N37fr—   )r  rø   r,  Ú	__anext__r  r	   r´   )r¡   Úaiterrc   s      r    r/  Ú _TracedRealtimeSession.__anext__f  sa   é € Ø—‘ˆØ‰=Ø—M‘M×+Ñ+Ó-ˆEØŒKØ—o‘oÓ'×'ˆØ�<‰<Ñ#Ü˜4Ÿ<™<×/Ñ/°Ô7Øˆñ (ùs   ‚AA;ÁA9Á4A;c                óˆ   • U R                   b5  U R                   R                  U R                   R                  5       U5        gg)zCRecord a chunk of user (mic) PCM16 for the stereo conversation WAV.N)r˜   Úrecord_userrª   ©r¡   Úpcms     r    Úrecord_user_audioÚ(_TracedRealtimeSession.record_user_audiop  s0   € à�;‰;Ñ"Ø�K‰K×#Ñ# D§K¡K§O¡OÓ$5°sÕ;ð #r"   c                óˆ   • U R                   b5  U R                   R                  U R                   R                  5       U5        gg)zGRecord a chunk of agent (played) PCM16 for the stereo conversation WAV.N)r˜   Úrecord_agentrª   r4  s     r    Úrecord_agent_audioÚ)_TracedRealtimeSession.record_agent_audiou  s0   € à�;‰;Ñ"Ø�K‰K×$Ñ$ T§[¡[§_¡_Ó%6¸Õ<ð #r"   )r  r  r  r   rÿ   r™   rý   r  rü   rø   rþ   rû   r˜   r  N)r�   r   r  rê   r  r   r  rê   r	  úOptional[list[str]]rå   úOptional[dict[str, Any]]r•   ré   r
  úOptional[float]r  úOptional[Client]r  ú Optional[Sequence[WriteReplica]]rë   rì   )r$   r   rë   r   )rë   rö   )r'  r   r(  r   r)  r   rë   r   )rë   r   )r5  r=   rë   rì   )rî   rï   rð   rñ   rò   r¢   r  r  r   r,  r/  r6  r:  ró   rô   r"   r    rö   rö   ÷  sŸ   † ñð àð ð !ð	 ð
 ð ð $ð ð "ð ð +ð ð 9ð ð +ð ð !ð ð 3ð ð 
ô ôBHô*ôX@ô$ôô<÷
=r"   rö   ©	r  r  r  r	  rå   r•   r
  r  r  c       	        ó&   • [        U UUUUUUUUU	S9
$ )aa  Trace an OpenAI Agents SDK ``RealtimeSession`` into LangSmith.

Returns an async-context-manager proxy that also enters the underlying
session; iterate and call it exactly as you would the original::

    session = await runner.run()
    async with wrap_realtime_session(session, thread_id=tid) as conn:
        async for event in conn:
            ...

To capture the stereo conversation WAV, feed PCM via the proxy's
``record_user_audio`` / ``record_agent_audio``.

Args:
    session: the ``RealtimeSession`` returned by ``RealtimeRunner.run()``.
    thread_id: LangSmith thread id; a random UUID if omitted.
    sample_rate: PCM sample rate of the audio (for the WAV).
    project_name: LangSmith project; defaults to standard ``LANGSMITH_*`` config.
    tags / metadata: attached to the conversation root span.
    on_message: optional callback ``(role, text)`` invoked once per finalized
        transcript line (e.g. to print to a console).
    max_audio_seconds: per-channel cap on audio retained for the WAV, to
        bound memory on long sessions; pass ``None`` to keep all audio.
    client: LangSmith ``Client`` for tracing writes; ``None`` (default) uses
        the SDK's standard env-based resolution (``LANGSMITH_*``).
    replicas: tracing replicas to mirror the conversation trace to additional
        destinations; ``None`` (default) disables replication.
rA  )rö   )
r�   r  r  r  r	  rå   r•   r
  r  r  s
             r    Úwrap_realtime_sessionrC  {  s0   € ôR "ØØØØ!ØØØØ+ØØñð r"   )r   r   rë   r   )r   r   rë   údict[str, Any] | None)r   r   rH   r   rI   zfrozenset[int]rë   r   )rP   r   rë   rí   )rY   r   rë   ztuple[str | None, str | None])rc   r   rë   ztuple[str | None, str] | None)rc   r   rë   rD  )rc   r   rë   z)tuple[str | None, str | None, str | None])rc   r   rë   z/list[tuple[str | None, str | None, str | None]])rc   r   rë   z tuple[str, dict[str, Any], bool])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ö   )6rò   Ú
__future__r   r.   Úloggingr  rù   Útypingr   r   r   r   Ú$langsmith._internal._package_versionr   Ú!langsmith._internal.voice.helpersr	   Ú!langsmith._internal.voice.sessionr
   r   r   Ú2langsmith.integrations.openai_realtime._connectionr   Úlangsmith.run_helpersr   Úcollections.abcr   Ú	langsmithr   r   Úlangsmith.run_treesr   Ú	getLoggerrî   r  ÚDEFAULT_SAMPLE_RATEr@   rC   r(   r!   r*   r8   Ú	frozensetrD   rQ   r\   rd   rj   rl   ro   r‹   r‘   r“   rö   rC  rô   r"   r    Ú<module>rS     s`  ðñõB #ã Û Û 
Û ß 9Ó 9å DÝ <÷ñ õ
õ 2æÝ(ç)Ý0à	×	Ò	˜8Ó	$€ð Ð à€
Ø€
Ø€	ôôHôð  %&¹i»kö 'ôTUô+ô6ô <ô&6ôô(#ôV÷"]'ñ ]'÷@A=ñ A=ðN  $Ø*Ø"&Ø $Ø)-Ø7;Ø)BØ#Ø15ñ4Øð4ð ð4ð ð	4ð
  ð4ð ð4ð 'ð4ð 5ð4ð 'ð4ð ð4ð /ð4ð ö4r"   