
    Cj                       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  S SKJ	r	J
r
  S SKJr  S SKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJrJr  SSKJ r J!r!J"r"  SSK#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-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=  SSKJ>r>  SSKJ?r?J@r@JArAJBrBJCrCJDrDJErEJFrF  SSKGJHrHJIrIJJrJ  SSKKJLrLJMrMJNrN  SSKOJPrPJQrQJRrRJSrSJTrT  \ rUSS jrV " S S\J5      rWg)     )annotationsN)AsyncIterator)Anycast)	BaseModel)assert_never   )%get_function_tool_lookup_key_for_tool)Agent)	UserError)Handoff)ToolApprovalItem)logger)ToolErrorFormatterArgs)RunContextWrapperTContext)"DEFAULT_APPROVAL_REJECTION_MESSAGEFunctionToolinvoke_function_tool)ToolContext)evaluate_needs_approval_setting   )RealtimeAgent)RealtimeRunConfigRealtimeSessionModelSettingsRealtimeUserInput)RealtimeAgentEndEventRealtimeAgentStartEventRealtimeAudioRealtimeAudioEndRealtimeAudioInterruptedRealtimeErrorRealtimeEventInfoRealtimeGuardrailTrippedRealtimeHandoffEventRealtimeHistoryAddedRealtimeHistoryUpdated"RealtimeInputAudioTimeoutTriggeredRealtimeRawModelEventRealtimeSessionEventRealtimeToolApprovalRequiredRealtimeToolEndRealtimeToolStart)realtime_handoff)AssistantAudioAssistantMessageItemAssistantText
InputAudio
InputImage	InputTextRealtimeItemUserMessageItem)RealtimeModelRealtimeModelConfigRealtimeModelListener)RealtimeModelEvent2RealtimeModelInputAudioTranscriptionCompletedEventRealtimeModelToolCallEvent)RealtimeModelSendAudioRealtimeModelSendInterruptRealtimeModelSendSessionUpdateRealtimeModelSendToolOutputRealtimeModelSendUserInputc                *   [        U [        5      (       a  U $ [        U [        5      (       a   U R                  SS9n OG[
        R                  " U 5      (       a,  [        U [        5      (       d   [
        R                  " U 5      n  [        R                  " U SS9$ ! [         a1     U R                  5       n  N3! [         a    [        U 5      s s $ f = ff = f! [         a    [        U 5      s $ f = f! [        [        4 a    [        U 5      s $ f = f)z8Serialize structured tool outputs to JSON when possible.json)modeF)ensure_ascii)
isinstancestrr   
model_dump	Exceptiondataclassesis_dataclasstypeasdictrC   dumps	TypeError
ValueError)outputs    i/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/agents/realtime/session.py_serialize_tool_outputrS   I   s    &#&)$$	#&&F&3F 
	!	!&	)	)*VT2J2J	 ''/Fzz&u55  	##**, #6{"#	#  	v;	 z" 6{sM   B /C C4 
C&B88CCCCC10C14DDc                  :   \ rS rSrSr  S*           S+S jjr\S,S j5       rS-S jrS-S jr	S.S jr
S/S	 jrS0S
 jrS1S jrSS.S2S jjrS0S jrS3S jrS4S jrS5S jr      S6S jr        S7S jr        S8S jr        S9S jrS:S jrSS.S;S jjrSSS.       S<S jjrSS.     S=S jjr\      S>S j5       rS?S jrS@S  jrSAS! jrS0S" jr       SBS# jr!SAS$ jr"S0S% jr#S0S& jr$      SCS' jr%\      SDS( j5       r&S)r'g)ERealtimeSession`   a  A connection to a realtime model. It streams events from the model to you, and allows you to
send messages and audio to the model.

Example:
    ```python
    runner = RealtimeRunner(agent)
    async with await runner.run() as session:
        # Send messages
        await session.send_message("Hello")
        await session.send_audio(audio_bytes)

        # Stream events
        async for event in session:
            if event.type == "audio":
                # Handle audio event
                pass
    ```
Nc                   Xl         X l        [        U5      U l        [	        U R                  S9U l        / U l        U=(       d    0 U l        U=(       d    0 U l        U R                  R                  S5      nU R                  R                  S5      n0 U=(       d    0 EU=(       d    0 EU l
        [        R                  " 5       U l        SU l        SU l        0 U l        [#        5       U l        0 U l        0 U l        U R                  R                  S0 5      R                  SS5      U l        [#        5       U l        [#        5       U l        [1        U R                  R                  S	S
5      5      U l        g)zInitialize the session.

Args:
    model: The model to use.
    agent: The current agent.
    context: The context object.
    model_config: Model configuration.
    run_config: Runtime configuration including guardrails.
)contextinitial_model_settingsmodel_settingsFNguardrails_settingsdebounce_text_lengthd   async_tool_callsT)_model_current_agentr   _context_wrapperr#   _event_info_history_model_config_run_configget_base_model_settingsasyncioQueue_event_queue_closed_stored_exception_pending_tool_callsset_interrupted_response_ids_item_transcripts_item_guardrail_run_counts_debounce_text_length_guardrail_tasks_tool_call_tasksbool_async_tool_calls)selfmodelagentrX   model_config
run_configrY   run_config_settingss           rR   __init__RealtimeSession.__init__t   sV   " # 1' :,T5J5JK,.)/R%+!%!3!3!7!78P!Q"..223CDC
"(bC
%+C
! BI7;  	 
 475&13:<'%)%5%5%9%9:OQS%T%X%X"C&
" 9<8;'+D,<,<,@,@ASUY,Z'[    c                    U R                   $ )zMAccess the underlying model for adding listeners or other direct interaction.)r_   rw   s    rR   rx   RealtimeSession.model   s     {{r   c                  #    U R                   R                  U 5        U R                  R                  5       nU R	                  U R                  R                  SS5      U R                  S9I Sh  vN US'   U R                   R                  U5      I Sh  vN   U R                  [        U R                  U R                  S95      I Sh  vN   U $  Na N= N
7f)zStart the session by connecting to the model. After this, you will be able to stream
events from the model and send messages and audio to the model.
rY   Nstarting_settingsry   )historyinfo)r_   add_listenerrd   copy&_get_updated_model_settings_from_agentrf   r`   connect
_put_eventr'   rc   rb   )rw   rz   s     rR   
__aenter__RealtimeSession.__aenter__   s     
 	  &))..07;7b7b"00445MtT%% 8c 8
 2
-. kk!!,/// oo"%%
 	
 	
 !2
 	0	
s6   A-C/C0%CC4C
CCCCc                >   #    U R                  5       I Sh  vN $  N7f)zEnter the async context manager. We strongly recommend using the async context manager
pattern instead of this method. If you use this, you need to manually call `close()` when
you are done.
N)r   r   s    rR   enterRealtimeSession.enter   s     
 __&&&&s   c                @   #    U R                  5       I Sh  vN   g N7f)zEnd the session.N)close)rw   	_exc_type_exc_val_exc_tbs       rR   	__aexit__RealtimeSession.__aexit__   s     jjl   c               D  #    U R                   (       dm   U R                  b$  U R                  5       I Sh  vN   U R                  eU R                  R	                  5       I Sh  vN nU7v   U R                   (       d  Ml  gg NL N ! [
        R                   a     gf = f7f)z%Iterate over events from the session.N)rk   rl   _cleanuprj   rf   rh   CancelledErrorrw   events     rR   	__aiter__RealtimeSession.__aiter__   s     ,,
))5--/))000"//3355 ,,,
 * 6)) sP   B  B B-B #B$	B -B  B B B BB BB c                @   #    U R                  5       I Sh  vN   g N7f)zClose the session.N)r   r   s    rR   r   RealtimeSession.close   s     mmor   c                d   #    U R                   R                  [        US95      I Sh  vN   g N7f)zSend a message to the model.
user_inputN)r_   
send_eventrA   )rw   messages     rR   send_messageRealtimeSession.send_message   s#     kk$$%?7%STTT   &0.0F)commitc               d   #    U R                   R                  [        XS95      I Sh  vN   g N7f)z$Send a raw audio chunk to the model.)audior   N)r_   r   r=   )rw   r   r   s      rR   
send_audioRealtimeSession.send_audio   s#     kk$$%;%%WXXXr   c                f   #    U R                   R                  [        5       5      I Sh  vN   g N7f)zInterrupt the model.N)r_   r   r>   r   s    rR   	interruptRealtimeSession.interrupt   s!     kk$$%?%ABBBs   '1/1c                   #    Xl         U R                  SU R                   S9I Sh  vN nU R                  R                  [	        US95      I Sh  vN   g N/ N7f)zMUpdate the active agent for this session and apply its settings to the model.Nr   session_settings)r`   r   r_   r   r?   )rw   ry   updated_settingss      rR   update_agentRealtimeSession.update_agent   sd     #!%!L!L"%% "M "
 

 kk$$*<LM
 	
 	


	
s!   $AA)AAAAc           
       ^^#    U R                  [        TU R                  S95      I S h  vN   TR                  S:X  a6  U R                  [	        U R                  TR
                  S95      I S h  vN   g TR                  S:X  aI  U R                  nU R                  (       a  U R                  TU5        g U R                  TUS9I S h  vN   g TR                  S:X  aB  U R                  [        U R                  TTR                  TR                  S95      I S h  vN   g TR                  S:X  aA  U R                  [        U R                  TR                  TR                  S	95      I S h  vN   g TR                  S
:X  aA  U R                  [        U R                  TR                  TR                  S	95      I S h  vN   g TR                  S:X  a  [        U R                   5      n["        R%                  U R                   T5      U l        [        U R                   5      U:  aT  [        U R                   5      S:  a;  U R                   S   nU R                  ['        U R                  US95      I S h  vN   g U R                  [)        U R                  U R                   S95      I S h  vN   g TR                  S:X  a+  U R                  [+        U R                  S95      I S h  vN   g TR                  S:X  Ga  TR                  nXPR,                  ;  a  SU R,                  U'   SU R.                  U'   U R,                  U==   TR0                  -  ss'   U R%                  U R                   [3        U[5        U R,                  U   S9/S95      U l        [        U R,                  U   5      nU R6                  nU R.                  U   S-   U-  nXh:  aA  U R.                  U==   S-  ss'   U R9                  U R,                  U   TR:                  5        g g TR                  S:X  GaN  [=        U4S jU R                    5       5      (       + n	TR>                  m[A        U4S jU R                    5       S 5      n
U
GbQ  U
R                  S:X  Ga@  TR                  S:X  Ga/   U
RB                  n/ n[E        TRB                  5       H  u  pUR                  S;   a  [G        U[H        [4        -  5      (       d   eURJ                  nU(       d  S nU[        U5      :  a:  X   n[G        U[4        5      (       d  [G        U[H        5      (       a  URJ                  nTRL                  S:X  a%  U R,                  RO                  TR                  5      nU(       a  URQ                  SU0S9nURS                  U5        M     U(       a  TRQ                  SU0S9mU R%                  U R                   T5      U l        U	(       aK  [A        U4S# jU R                    5       5      nU R                  ['        U R                  US95      I S h  vN   g U R                  [)        U R                  U R                   S95      I S h  vN   g TR                  S$:X  av  TR                  nU R                    Vs/ s H  nUR                  U:w  d  M  UPM     snU l        U R                  [)        U R                  U R                   S95      I S h  vN   g TR                  S%:X  a  g TR                  S&:X  a6  U R                  [Y        U R                  U R                  S'95      I S h  vN   g TR                  S(:X  aj  U R,                  R[                  5         U R.                  R[                  5         U R                  []        U R                  U R                  S'95      I S h  vN   g TR                  S):X  a  TR^                  U l0        g TR                  S*:X  a  g TR                  S+:X  a  g [c        T5        g  GN GN GNW GN GN GNl GN GN GNM! [T         a    [V        R
                  " S S!S"9   GNf = f GN$ GNs  snf  GNs GN N7f),N)datar   errorr   r   function_callagent_snapshotr   )r   r   item_idcontent_indexaudio_interrupted)r   r   r   
audio_done#input_audio_transcription_completedr   )r   item)r   r   input_audio_timeout_triggered)r   transcript_delta )
transcriptr   contentr   item_updatedc              3  h   >#    U  H'  oR                   TR                  R                   :H  v   M)     g 7fNr   r   .0r   r   s     rR   	<genexpr>+RealtimeSession.on_event.<locals>.<genexpr>G  s"     ZMD\\UZZ-?-??Ms   /2c              3  ^   >#    U  H"  oR                   TR                   :X  d  M  Uv   M$     g 7fr   r   )r   iincoming_items     rR   r   r   N  s"     PMqYY-:O:O-OMs   -	-r   )r   input_audio	assistantr   updater   zError merging transcriptsTexc_infoc              3  r   >#    U  H,  oR                   TR                  R                   :X  d  M(  Uv   M.     g 7fr   r   r   s     rR   r   r   }  s)       %2TllejjFXFX6XDD]s   '7	7item_deletedconnection_statusturn_started)ry   r   
turn_ended	exceptionotherraw_server_event)2r   r)   rb   rL   r"   r   r`   rv   _enqueue_tool_call_task_handle_tool_callr   r   r   r!   r    lenrc   rU   _get_new_historyr&   r'   r(   rp   rq   deltar0   r/   rr   _enqueue_guardrail_taskresponse_idanyr   nextr   	enumeraterF   r2   r   rolerf   
model_copyappendrI   r   r   clearr   r   rl   r   )rw   r   r   prev_lennew_itemr   current_length	thresholdnext_run_thresholdis_newexisting_itemexisting_contentnew_contentidxentryentry_transcript	preservedthis_content
deleted_idr   r   s    `                  @rR   on_eventRealtimeSession.on_event   sK    oo3TEUEUVWWW:: //-T5E5EU[["YZZZZZ?*!00N%%,,UNC,,U>,RRRZZ7"//))!MM"'"5"5	   ZZ..//())5==PUPcPc  
 ZZ<'// ))5==PUPcPc  
 ZZ@@4==)H+<<T]]ERDM 4==!H,T]]1Ca1G==,oo&:@P@PW_&`aaaoo*0@0@$--X   ZZ:://2))  
 ZZ--mmG44424&&w/;<//8""7+u{{:+ 11$#+t7M7Mg7VWXDM !!7!7!@AN22I"&"A"A'"JQ"NR[![3//8A=8,,T-C-CG-LeN_N_` 4 ZZ>)ZDMMZZZF
 "JJM PDMMPRVM
 )!&&)3!&&)3#'4'<'<$"$K&/0E0E&F
 ::)AA#-eZ.5P#Q#QQ#Q/4/?/?,#38<	#&-=)>#>3C3HL'1,'O'OS](4jT& T& 5A4K4K	 $1#5#5#D040F0F0J0J=K`K`0aI#,,1,<,<\S\D],<,^E#**513 'G6 #(5(@(@T_H`(@(a
 !11$--ODM  %)]]   oo&:@P@PW_&`aaaoo*0@0@$--X   ZZ>)J.2mmZmdt||z?YTmZDM//&D,<,<dmmT   ZZ..ZZ>)//'--))   ZZ<'""((*++113//%--))   ZZ;&%*__D"ZZ7"ZZ--W 	X [ S b^ ! LL!<tL b
 [s5  'a.`Aa.0`1Aa.	` 
Aa.`#Aa.,`&-Aa.=`)>B6a.4`,55a.*`/+:a.%`2&F5a.D.`5 
A-a.7a85a.-a./a.a!5a!;8a.3a&4Aa.
a)A9a.a,Aa.a. a.#a.&a.)a.,a./a.2a.5aa.aa.a.!a.)a.,a.c                V   #    U R                   R                  U5      I Sh  vN   g N7f)zPut an event into the queue.N)rj   putr   s     rR   r   RealtimeSession._put_event  s     ##E***s   )')c                *  #    [        USS5      n0 n[        U5      (       a*   [        R                  " UR                  =(       d    S5      n[        UU R                  UUR                  SS9I Sh  vN $ ! [        R
                   a    0 n NAf = f N 7f)zCEvaluate a function tool's needs_approval setting with parsed args.needs_approvalFz{}strictN)	getattrcallablerC   loads	argumentsJSONDecodeErrorr   ra   call_id)rw   function_tool	tool_callneeds_settingparsed_argss        rR   _function_needs_approval(RealtimeSession._function_needs_approval  s       /?G&(M""!"jj)<)<)DE 5!!
 
 	
 '' ! !
s4    B)A5 $B0B1B5BBBBc                    SUR                   UR                  UR                  S.n[        [	        [
        U5      XAR                   S9$ )z0Create a ToolApprovalItem for approval tracking.r   )rL   namer  r  )ry   raw_item	tool_name)r  r  r  r   r   r   )rw   toolr  ry   r  s        rR   _build_tool_approval_item)RealtimeSession._build_tool_approval_item  sC    
 $II ((",,	
  d3&6U^U^__r   c          
       #    U R                  X!U5      nU R                  X!5      I Sh  vN nU(       d  gU R                  R                  UR                  UR
                  5      nUSL a  gUSL a  gUUUU4U R                  UR
                  '   U R                  [        UUUR
                  UR                  U R                  S95      I Sh  vN   g N N7f)zIReturn True/False when approved/rejected, or None when awaiting approval.NTF)ry   r  r  r  r   )r  r  ra   is_tool_approvedr  r  rm   r   r+   r  rb   )rw   r  r  ry   approval_itemr
  approval_statuss          rR   _maybe_request_tool_approval,RealtimeSession._maybe_request_tool_approval  s      66}QVW#<<]VV//@@	 1 1
 d"e# 	7
  !2!23 oo("!))#--%%
 	
 	
 7 W$	
s"   'CCB"CCCCc          
     $  #    U R                  UUR                  S9I Sh  vN nU R                  R                  [	        UUSS95      I Sh  vN   U R                  [        U R                  UUUUR                  S95      I Sh  vN   g Ni N? N	7f)zBSend a rejection response back to the model and emit an end event.)r  r  NTr  rQ   start_responser   r  rQ   ry   r  )	#_resolve_approval_rejection_messager  r_   r   r@   r   r,   rb   r  )rw   r   r  ry   rejection_messages        rR   _send_tool_rejection$RealtimeSession._send_tool_rejection  s      #'"J"JMM #K #
 
 kk$$'(#
 	
 	
 oo%%(//
 	
 	

	
	
s3   BB
+BB7BBBBBc                 #    U R                   R                  UR                  U[        U5      S9nUb  U$ U R                  R                  S5      nUc  [        $  U" [        SSUR                  U[        U R                   S95      n[        R                  " U5      (       a
  UI Sh  vN OUnUc  [        $ [        U[        5      (       d;  [        R                  " SUR                  [        U5      R                   5        [        $ U$  Na! [         a2  n[        R                  " SUR                  U5        [        s SnA$ SnAff = f7f)	z:Resolve model-visible output text for approval rejections.)tool_lookup_keyNtool_error_formatterapproval_rejectedfunction)kind	tool_typer  r  default_messagerun_contextz&Tool error formatter failed for %s: %sz3Tool error formatter returned non-string for %s: %s)ra   get_rejection_messager  r
   re   rf   REJECTION_MESSAGEr   inspectisawaitablerI   r   r   rF   rG   rL   __name__)rw   r  r  explicit_message	formattermaybe_messager   excs           rR   r*  3RealtimeSession._resolve_approval_rejection_message  s1    00FFIIA$G G 

 '##$$(()?@	$$	%%&,("ii#$5 $ 5 5	M .5-@-@-O-OM))UbG
 ?$$'3''LLE		W&&
 %$! * 	%LLA499cR$$	%sJ   AE
AD 'D	(D .AE
	D 
E'E<E=E
EE
)alwaysc                  #    U R                   R                  US5      nUc  gUu  pEpgU R                  R                  XrS9  U R                  (       a  U R                  XE5        gU R                  XES9I Sh  vN   g N7f)z1Approve a pending tool call and resume execution.N)always_approver   )rm   popra   approve_toolrv   r   r   )rw   r  rA  pendingr  r   r  r"  s           rR   approve_tool_call!RealtimeSession.approve_tool_call<  st     **..w=?BI?	=**=*P!!((C(((RRRs   A4A>6A<7A>)rA  r+  c                  #    U R                   R                  US5      nUc  gUu  pVpxU R                  R                  UUUS9  U R	                  XWUS9I Sh  vN   g N7f)z0Reject a pending tool call and notify the model.N)always_rejectr+  r  ry   )rm   rD  ra   reject_toolr,  )	rw   r  rA  r+  rF  r  r   r  r"  s	            rR   reject_tool_call RealtimeSession.reject_tool_callJ  sn      **..w=?BI?	=)) / 	* 	

 ''	^'\\\s   AAAAr   c          
     n  #    U=(       d    U R                   n[        R                  " UR                  U R                  5      U R                  X0R                  5      5      I Sh  vN u  pEU Vs0 s H'  n[        U[        5      (       d  M  UR                  U_M)     nnU Vs0 s H  oR                  U_M     n	nUR                  U;   Ga^  XqR                     n
U R                  XUS9I Sh  vN nUSL a  U R                  XUS9I Sh  vN   gUc  gU R                  [        U R                  U
UUR                  S95      I Sh  vN   [!        U R                  R"                  U R                  R$                  UR                  UR&                  UR                  US9n[)        U
UUR                  S9I Sh  vN nU R*                  R-                  [/        U[1        U5      SS	95      I Sh  vN   U R                  [3        U R                  U
UUUR                  S
95      I Sh  vN   gUR                  U	;   Ga  XR                     n[!        U R                  R"                  U R                  R$                  UR                  UR&                  UR                  US9nUR5                  U R                  UR                  5      I Sh  vN n[        U[6        5      (       d$  [9        SUR                   S[;        U5       35      eUnXl         U R=                  SU R                   S9I Sh  vN nU R                  [?        UU R                   U R                  S95      I Sh  vN   U R*                  R-                  [A        US95      I Sh  vN   URC                  U5      nU R*                  R-                  [/        UUSS	95      I Sh  vN   gU R                  [E        U R                  SSUR                   S30S95      I Sh  vN   g GNs  snf s  snf  GN( GN GN GNg GN5 GN  GNa GN N N Nj N07f)zHandle a tool call event.N)r  ry   FrK  )r   r  ry   r  )rX   usager  tool_call_idtool_argumentsry   )r  rX   r  Tr'  r)  zHandoff z returned invalid result: r   )
from_agentto_agentr   r   r   zTool z
 not foundr   )#r`   rh   gatherget_all_toolsra   _get_handoffsrF   r   r  r  r$  r,  r   r-   rb   r  r   rX   rP  r  r   r_   r   r@   rS   r,   on_invoke_handoffr   r   rL   r   r%   r?   get_transfer_messager"   )rw   r   r   ry   toolshandoffsr  function_maphandoffhandoff_map	func_toolr#  tool_contextresultprevious_agentr   transfer_messages                    rR   r   !RealtimeSession._handle_tool_call^  s     5$"5"5 ' 5 56u&;&;<!
 
 5:\EDZl=[		4E\AIJg(('1J::%$ZZ0I$($E$Ee %F % O %'//U/SSS&//!))"#oo	   '--55++11**"]]$L 0'$// F ++((+#1&9#'   //))"!#oo   ZZ;&!**-G&--55++11**"]]$L #44T5J5JEOO\\Ffm44w0011KDQWL>Z 
 #N #) &*%P%P"&)) &Q &   //$-!00))   ++((.@PQ  
  ';;FC++((+#+#'   //))$ejj\&DE  a
 ]J T
"* ] s  A"P5$P%
P5/PPP5#P94P5-P.P5
P;P5PA0P57P84P5,P!-7P5$P$%B!P5P'A"P5)P**5P5P- )P5	P/
<P5P1;P5P3P5P5P5P5P5!P5$P5'P5*P5-P5/P51P53P5c           	       ^ [        T[        5      (       Ga  / nSnU H  nUR                  TR                  :X  a  UR                  S:X  a  UR                  S:X  a  / nUR
                   HR  nUR                  S:X  a.  UR                  STR                  0S9nUR                  U5        MA  UR                  U5        MT     UR                  UR                  USS.S95        S	nM  UR                  U5        M     USL a5  UR                  [        TR                  [        TR                  S
9/S95        U$ [        U4S j[        U5       5       S 5      n	U	Gb  UR                  5       nTR                  S:X  Ga~  TR
                  Gbp  [        TR
                  5      S:  GaV  X   n
U
R                  S:X  Ga=  TR                  S:X  Ga  U
R                  S:X  Ga  U
R
                  nTR
                  n/ n[        U5       H  u  pU[        U5      :  a  UR                  U5        M'  X   nUR                  S:X  a3  UR                  c  UR                  U5        M[  UR                  U5        Mn  [        U[        5      (       a  UR                   OS nUb   UR                   c  UR                  U5        M  UR                  U5        M     TR                  SU0S9nUX9'   U$ TR                  S:X  Ga1  U
R                  S:X  Ga   U
R
                  nTR
                  n[#        U5      nSS jn[%        5       nU H<  n[        U[&        5      (       d  M  U" U5      nU(       d  M+  UR)                  U5        M>     / nU HD  n[        U[&        5      (       d  M  U" U5      nU(       d  M+  UU;  d  M3  UR                  U5        MF     U(       a  UU-   n/ n[        U5       GH+  u  nnUR                  S:X  at  [+        USS 5      nUcQ  U[        U5      :  aB  UU   n[        U[,        5      (       a(  UR                  b  UR                  SUR                  0S9nUR                  U5        M  UR                  S:X  a  [+        USS 5      nUb  US:X  aU  U[        U5      :  aF  UU   n[        U[        5      (       a,  UR                   (       a  UR                  SUR                   0S9nUR                  U5        GM  UR                  U5        GM.     TR                  SU0S9n U X9'   U$ TR                  S:X  a  U
R                  S:X  a  U
R
                  n!TR
                  n"/ n#[        U"5       Hm  u  nn$U[        U!5      :  a  U#R                  U$5        M(  U!U   n%U%R                   nUb   U$R                   c  U#R                  U%5        M\  U#R                  U$5        Mo     TR                  SU#0S9n&U&X9'   U$ TX9'    U$ TX9'   U$ TR.                  (       aI  [        U4S j[        U5       5       S 5      n'U'b'  UR                  5       nUR1                  U'S-   T5        U$ UT/-   $ )NFr   userr   r   r   	completed)r   statusT)textr   c              3  d   >#    U  H%  u  pUR                   TR                   :X  d  M!  Uv   M'     g 7fr   r   r   r   r   r   s      rR   r   3RealtimeSession._get_new_history.<locals>.<genexpr>  s&     V4718UQQ4    0	0r   r   r   r   c                X    [        U [        5      (       a  U R                  =(       d    S $ g r   )rF   r3   	image_url)vals    rR   _image_url_str8RealtimeSession._get_new_history.<locals>._image_url_str0  s!    )#z::'*}}'< <#'r   
input_textri  r   systemc              3  d   >#    U  H%  u  pUR                   TR                  :X  d  M!  Uv   M'     g 7fr   )r   previous_item_idrk  s      rR   r   rl  ~  s(     c"8wqDLLELbLb<b"8rm  r   )rp  objectreturn
str | None)rF   r;   r   rL   r   r   r   r   r   r6   r4   r   r   r   r   r1   ri  listrn   r3   addr  r2   rv  insert)(clsold_historyr   new_historyexisting_item_foundr   r   r   copied_entryexisting_indexr   assistant_existing_contentassistant_incomingassistant_new_contentr   acassistant_currentcur_textupdated_assistantuser_existing_contentuser_incominguser_new_contentrq  incoming_image_urlspartumissing_imagesmergeducr   prevri  updated_usersystem_existing_contentsystem_incomingsystem_new_contentscsystem_currentupdated_systemprevious_indexs(     `                                     rR   r    RealtimeSession._get_new_history  s1    eOPP.0K"'#<<5==0TYY)5KPTPYPY]cPc<>G!% ::6+0+;+;LRWRbRbCc+;+dL#NN<8#NN51 ".  &&7k/Z[ +/'&&t, $  #e+""# %	uGWGW8X7Y
 
 Vi4VX\
 %%**,KzzY&5==+DU]]I[^_I_ + ; %%2zz[0]5G5G;5V5B5J5J2-2]]*VX-'01C'DGC"c*D&EE 5 < <R @ (0J0O-!ww'1#%==#8$9$@$@AR$S$9$@$@$D (22C]'S'S %6$:$:)- !)
 $,#7BGGO$9$@$@AR$S$9$@$@$D' (E( -2,<,<$-/D#E -= -) 7H3f e v--2D2D2N0=0E0E-(- W[)W(
( 9<+$1D)$
;;$24$8#$1$7$;$;A$>	 %2 <>$9D)$
;;$24$8#$12E)E$2$9$9$$?	 %: */=@P/P, MO'01A'BGC!ww-7-4Rt-L
#-#5#DY@Z:Z+@+ED'1$
'C'CHc-/]]<QUQ`Q`Ba]-b &b 1!#L!8'.r64'@$(LDBJC#$9K" E" ,A+ED'1$	'B'Btyy-/]]6499BU]-V &b 1 &b 1' (C* (-'7'7	6?R'7'S6B30 / x/M4F4F(4R2?2G2G/*/-->@*'0'AGC"c*A&BB 2 9 9" = (-DS-IN'5':':H'3 2 9 9. I 2 9 9" = (B */)9)9)M_A`)9)a6D3 	 7<3  38K/ ##!c)K"8cN ))..0"">A#5u="" eW$$r   c                J  #    U R                   R                  U R                  R                  S/ 5      -   n[	        5       n/ nU H7  n[        U5      nXt;  d  M  UR                  U5        UR                  U5        M9     U(       a  X R                  ;   a  g/ nU Hv  n UR                  U R                  [        [        [           U R                   5      U5      I Sh  vN n	U	R                  R                  (       a  UR                  U	5        Mv  Mx     U(       a  X R                  ;   a  gU R                  R                  U5        U R#                  [%        UUU R&                  S95      I Sh  vN   U R(                  R+                  [-        SS95      I Sh  vN   U V	s/ s H  oR.                  R1                  5       PM     n
n	U R(                  R+                  [3        SSR5                  U
5       3S	95      I Sh  vN   gg GN&! [          a     GMz  f = f N Ns  sn	f  N$7f)
zURun output guardrails on the given text. Returns True if any guardrail was triggered.output_guardrailsFN)guardrail_resultsr   r   T)force_response_cancelzguardrail triggered: z, r   )r`   r  re   rf   rn   idr   r{  ro   runra   r   r   r   rQ   tripwire_triggeredrI   r   r$   rb   r_   r   r>   	guardrailget_namerA   join)rw   ri  r   combined_guardrailsseen_idsr  r  guardrail_idtriggered_resultsra  guardrail_namess              rR   _run_output_guardrails&RealtimeSession._run_output_guardrails  s    "11CCdFVFVFZFZG
 
 !U,Ii=L+!((3\*	 - !K3Q3Q$Q*I(}}))sT%8%89	   ==33%,,V4 4 + <<< **..{; //(&7 ))   ++(()CZ^)_``` J[[IZv//88:IZO[++((*!6tyy7Q6RS   U   a \s   AH#AH#?HH0HAH#-H.)H#HH# #H9H#<H!=H#H
HH#HH#H#H#c                    [         R                  " U R                  X5      5      nU R                  R	                  U5        UR                  U R                  5        g r   )rh   create_taskr  rs   r{  add_done_callback_on_guardrail_task_done)rw   ri  r   tasks       rR   r   'RealtimeSession._enqueue_guardrail_task  sI     ""4#>#>t#QR!!$' 	t;;<r   c                    U R                   R                  U5        UR                  5       (       d^  UR                  5       nU(       aF  [        R
                  " U R                  [        U R                  SS[        U5       30S95      5        ggg)z&Handle completion of a guardrail task.r   zGuardrail task failed: r   N)
rs   discard	cancelledr   rh   r  r   r"   rb   rG   rw   r  r   s      rR   r  'RealtimeSession._on_guardrail_task_done  s     	%%d+ ~~(I##OO%!%!1!1#,0GIGW.X"Y   r   c                    U R                    H*  nUR                  5       (       a  M  UR                  5         M,     U R                   R                  5         g r   )rs   donecancelr   rw   r  s     rR   _cleanup_guardrail_tasks(RealtimeSession._cleanup_guardrail_tasks  :    ))D99;; * 	##%r   c                    [         R                  " U R                  XS95      nU R                  R	                  U5        UR                  U R                  5        g)zFRun tool calls in the background to avoid blocking realtime transport.r   N)rh   r  r   rt   r{  r  _on_tool_call_task_done)rw   r   r   r  s       rR   r   'RealtimeSession._enqueue_tool_call_task  sJ     ""4#9#9%#9#_`!!$'t;;<r   c           
     V   U R                   R                  U5        UR                  5       (       a  g UR                  5       nUc  g [        R                  " SUS9  U R
                  c  X l        [        R                  " U R                  [        U R                  SSU 30S95      5        g )NzRealtime tool call task failedr   r   zTool call task failed: r   )rt   r  r  r   r   rl   rh   r  r   r"   rb   r  s      rR   r  'RealtimeSession._on_tool_call_task_done  s    %%d+>>NN$	9IN!!)%."OO))$(?	{&KL	
r   c                    U R                    H*  nUR                  5       (       a  M  UR                  5         M,     U R                   R                  5         g r   )rt   r  r  r   r  s     rR   _cleanup_tool_call_tasks(RealtimeSession._cleanup_tool_call_tasks  r  r   c                  #    U R                  5         U R                  5         U R                  R                  U 5        U R                  R	                  5       I Sh  vN   U R
                  R                  5         SU l        g N&7f)z2Clean up all resources and mark session as closed.NT)r  r  r_   remove_listenerr   rm   r   rk   r   s    rR   r   RealtimeSession._cleanup  sm      	%%'%%' 	##D) kk!!! 	  &&(  	"s   ABB'Bc                .  #    U R                   R                  5       nUR                  b  UR                  US'   [        R                  " UR                  U R                  5      UR                  U R                  5      U R                  X R                  5      5      I S h  vN u  pEnU=(       d    SUS'   U=(       d    / US'   U=(       d    / US'   U(       a  UR                  U5        U R                  R                  SS5      nU(       a  S US'   U$  Ns7f)	Npromptr   instructionsrZ  r[  tracing_disabledFtracing)rg   r   r  rh   rU  get_system_promptra   rV  rW  r   re   rf   )rw   r   ry   r   r  rZ  r[  disable_tracings           rR   r   6RealtimeSession._get_updated_model_settings_from_agent$  s       4499;<<#).X&.5nn##D$9$9: 5 56u&;&;</
 )
%X
 ,8+=2($)KR!'/~2$ ##$56**../A5I*.Y'#)
s   BDD A4Dc                  ^^^	#    / nTR                    H\  n[        U[        5      (       a  UR                  U5        M+  [        U[        5      (       d  MB  UR                  [        U5      5        M^     SUU4S jjm	[        R                  " U	4S jU 5       6 I S h  vN n[        X5SS9 VVs/ s H  u  pgU(       d  M  UPM     nnnU$  N-s  snnf 7f)Nc                   >#    U R                   n[        U[        5      (       a  U$ U" TT5      n[        R                  " U5      (       a
  UI S h  vN $ U$  N7fr   )
is_enabledrF   ru   r9  r:  )handoff_objattrresry   context_wrappers      rR   _check_handoff_enabled=RealtimeSession._get_handoffs.<locals>._check_handoff_enabledM  sR     ))D$%%.C""3'' y J !s   AAAAc              3  4   >#    U  H  nT" U5      v   M     g 7fr    )r   hr  s     rR   r   0RealtimeSession._get_handoffs.<locals>.<genexpr>V  s     (UHq)?)B)BHs   Fr  )r  z Handoff[Any, RealtimeAgent[Any]]rx  ru   )	r[  rF   r   r   r   r.   rh   rU  zip)
r}  ry   r  r[  handoff_itemresultsr  okenabledr  s
    ``      @rR   rW  RealtimeSession._get_handoffsB  s      <>!NNL,00-L-88 0 >?	 +	 	  (UH(UVV"%h"FM"F"1"FM WMs1   ACACCC/C CCC)rv   rg   rk   ra   r`   rr   rb   rj   rs   rc   ro   rq   rp   r_   rd   rm   re   rl   rt   )NN)rx   r7   ry   r   rX   zTContext | Nonerz   zRealtimeModelConfig | Noner{   zRealtimeRunConfig | Nonerx  None)rx  r7   )rx  rU   )r   r   r   r   r   r   rx  r  )rx  z#AsyncIterator[RealtimeSessionEvent])rx  r  )r   r   rx  r  )r   bytesr   ru   rx  r  )ry   r   rx  r  )r   r:   rx  r  )r   r*   rx  r  )r  r   r  r<   rx  ru   )r  r   r  r<   ry   r   rx  r   )r  r<   r  r   ry   r   rx  zbool | None)r   r<   r  r   ry   r   rx  r  )r  r   r  rG   rx  rG   )r  rG   rA  ru   rx  r  )r  rG   rA  ru   r+  ry  rx  r  )r   r<   r   zRealtimeAgent | Nonerx  r  )r~  list[RealtimeItem]r   zARealtimeModelInputAudioTranscriptionCompletedEvent | RealtimeItemrx  r  )ri  rG   r   rG   rx  ru   )ri  rG   r   rG   rx  r  )r  zasyncio.Task[Any]rx  r  )r   r<   r   r   rx  r  )r   z#RealtimeSessionModelSettings | Nonery   r   rx  r   )ry   zRealtimeAgent[Any]r  zRunContextWrapper[Any]rx  z&list[Handoff[Any, RealtimeAgent[Any]]])(r;  
__module____qualname____firstlineno____doc__r}   propertyrx   r   r   r   r   r   r   r   r   r   r  r   r  r  r$  r,  r*  rG  rM  r   classmethodr   r  r   r  r  r   r  r  r   r   rW  __static_attributes__r  r   rR   rU   rU   `   s   0 48/3/\/\ /\ !	/\
 1/\ -/\ 
/\b  4'U @E YC
l \+
)
6P
	
&
` 
`-G
`P]
`	
`%-% $	%
 % 
%N
)
 	

 
 

<)V GL S$ (,]] 	]
 &] 
]0 04	})} -	}
 
}~ i%'i% Qi% 
	i% i%V?B=&&=/=AN=	=
0&$ >    
&	 < &9O	/ r   rU   )rQ   r   rx  rG   )X
__future__r   rh   rJ   r9  rC   collections.abcr   typingr   r   pydanticr   typing_extensionsr   _tool_identityr
   ry   r   
exceptionsr   r[  r   itemsr   r   r{   r   r6  r   r   r  r   r   r   r`  r   util._approvalsr   r   configr   r   r   eventsr   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   rx   r7   r8   r9   model_eventsr:   r;   r<   model_inputsr=   r>   r?   r@   rA   r8  rS   rU   r  r   rR   <module>r     s    "     )   * B  "  $  / 5 Y Y & =   V V    & '	 	 	 M L 
  7 .x+ xr   