o
    h                     @  sz  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m	Z	 d dl
mZmZmZmZmZmZ d dlZd dlZd dlmZ d dlmZmZ d dlmZ d d	lmZ d d
lm Z! d dl"m#Z$ d dl%m&Z' d dl(m)Z)m*Z*m+Z+ d dl,m-Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z: d dl;m<Z= d dl>m?Z@ d dlAmBZC d dlDmEZF d dlGmHZH d dlImJZK d dlLmMZN d dlOmPZQ d dlRmSZS d dlmTZTmUZU d dlVmWZW d dlXmYZY d d lZm[Z[ d d!l\m]Z] d d"l^m_Z_ d d#l`maZa d d$lbmcZcmdZd d d%lemfZf d&d'lgmhZh d&d(limiZi d&d)ljmkZk d*d+llmmZmmnZn d*d,lompZpmqZq d*d-lrmsZsmtZtmuZumvZvmwZw d*d.lxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZmZmZmZmZmZmZmZmZ d*d/lmZmZmZmZmZmZmZ ejZejZejZd0ek Zd1d2gd3d3d4d5id6d7d8d9Zd:ed;< dMd@dAZeee=f eTdBdCf ZdadDedE< dNdGdHZG dIdJ dJesZG dKdL dLZdS )O    )annotationsN)Mapping)datetime)	AnnotatedAnyCallableLiteralUnioncast)realtime_audio_config)ConversationItemr   )ConversationItemCreateEvent)ConversationItemRetrieveEvent)ConversationItemTruncateEvent)InputAudioBufferAppendEvent)InputAudioBufferCommitEvent)AudioPCM	AudioPCMA	AudioPCMU)RealtimeClientEvent)(RealtimeConversationItemAssistantMessage)*RealtimeConversationItemFunctionCallOutput)%RealtimeConversationItemSystemMessage)Content#RealtimeConversationItemUserMessage)RealtimeFunctionTool)RealtimeServerEvent)RealtimeSessionCreateRequest)TracingConfiguration))RealtimeTranscriptionSessionCreateRequest)ResponseAudioDeltaEvent)ResponseCancelEvent)ResponseCreateEvent)SessionUpdateEvent)ResponsePrompt)FieldTypeAdapter)assert_never)ClientConnection)Handoff)Prompt)ModelAudioTracker)to_realtime_audio_format)FunctionToolTool)MaybeAwaitable   )	UserError)logger)__version__   )RealtimeModelTracingConfigRealtimeSessionModelSettings)RealtimeMessageItemRealtimeToolCallItem)RealtimeModelRealtimeModelConfigRealtimeModelListenerRealtimePlaybackStateRealtimePlaybackTracker)RealtimeModelAudioDoneEventRealtimeModelAudioEvent"RealtimeModelAudioInterruptedEventRealtimeModelErrorEventRealtimeModelEventRealtimeModelExceptionEvent,RealtimeModelInputAudioTimeoutTriggeredEvent2RealtimeModelInputAudioTranscriptionCompletedEventRealtimeModelItemDeletedEventRealtimeModelItemUpdatedEventRealtimeModelRawServerEventRealtimeModelToolCallEvent!RealtimeModelTranscriptDeltaEventRealtimeModelTurnEndedEventRealtimeModelTurnStartedEvent)RealtimeModelSendAudioRealtimeModelSendEventRealtimeModelSendInterruptRealtimeModelSendRawMessageRealtimeModelSendSessionUpdateRealtimeModelSendToolOutputRealtimeModelSendUserInputzAgents/Python ashaudiopcm16modelzgpt-4o-mini-transcribesemantic_vadT)typeinterrupt_response)voice
modalitiesinput_audio_formatoutput_audio_formatinput_audio_transcriptionturn_detectionr6   DEFAULT_MODEL_SETTINGSkey.str | Callable[[], MaybeAwaitable[str]] | Nonereturn
str | Nonec                   s@   t | tr| S t| r|  }t|r|I d H S |S tdS )NOPENAI_API_KEY)
isinstancestrcallableinspectisawaitableosgetenv)rb   result ro   `/var/www/html/openai_agents/venv/lib/python3.10/site-packages/agents/realtime/openai_realtime.pyget_api_key   s   



rq   rY   )discriminatorz+TypeAdapter[AllRealtimeServerEvents] | NoneServerEventTypeAdapter$TypeAdapter[AllRealtimeServerEvents]c                   C  s   t stta t S N)rs   r&   AllRealtimeServerEventsro   ro   ro   rp   get_server_event_type_adapter   s   rw   c                   @  sN  e Zd ZdZdiddZdjdd	ZdkddZdlddZdlddZdmddZ	dd Z
dnddZdoddZdpd!d"Zdqd$d%Zdrd'd(Zdsd*d+Zdtd-d.Zdud0d1Zdvd4d5Zdwd8d9Zdxd<d=Zdid>d?Zdid@dAZdydCdDZdzdGdHZed{dJdKZed|dOdPZed}dRdSZed~dWdXZeddYdZZdd]d^Z dd_d`Z!ddfdgZ"dhS )OpenAIRealtimeWebSocketModelz)A model that uses OpenAI's WebSocket API.rd   Nonec                 C  sJ   d| _ d | _d | _g | _d | _t | _d| _d | _d | _	d | _
t | _d S )Ngpt-realtimeF)rW   
_websocket_websocket_task
_listeners_current_item_idr+   _audio_state_tracker_ongoing_response_tracing_config_playback_tracker_created_sessionrw   _server_event_type_adapterselfro   ro   rp   __init__   s   z%OpenAIRealtimeWebSocketModel.__init__optionsr:   c                   s  | j du s
J d| jdu sJ d|di }|dd| _|d| j| _t|dI dH }d|v r<|d | _nd| _|d	d
| j }i }|ddurZ||d  n|s`td|dd| i t	j
|t|ddI dH | _ t|  | _| |I dH  dS )z6Establish a connection to the model and keep it alive.NzAlready connectedinitial_model_settingsplayback_tracker
model_nameapi_keytracingautourlz'wss://api.openai.com/v1/realtime?model=headersz)API key is required but was not provided.AuthorizationzBearer )user_agent_headeradditional_headersmax_size)r{   r|   getr   rW   rq   r   updater1   
websocketsconnect_USER_AGENTasynciocreate_task_listen_for_messages_update_session_config)r   r   model_settingsr   r   r   ro   ro   rp   r      s2   z$OpenAIRealtimeWebSocketModel.connecttracing_config3RealtimeModelTracingConfig | Literal['auto'] | Nonec                   s@   |durt |}| tt| jd|dddI dH  dS dS )z6Update tracing configuration via session.update event.Nrealtime)rW   rY   r   session.updatesessionrY   )_ConversionHelperconvert_tracing_config_send_raw_messageOpenAISessionUpdateEventOpenAISessionCreateRequestrW   )r   r   converted_tracing_configro   ro   rp   _send_tracing_config   s   
z1OpenAIRealtimeWebSocketModel._send_tracing_configlistenerr;   c                 C  s   || j vr| j | dS dS )zAdd a listener to the model.N)r}   appendr   r   ro   ro   rp   add_listener     
z)OpenAIRealtimeWebSocketModel.add_listenerc                 C  s   || j v r| j | dS dS )z!Remove a listener from the model.N)r}   remover   ro   ro   rp   remove_listener  r   z,OpenAIRealtimeWebSocketModel.remove_listenereventrB   c                   s"   | j D ]
}||I dH  qdS )zEmit an event to the listeners.N)r}   on_event)r   r   r   ro   ro   rp   _emit_event  s   
z(OpenAIRealtimeWebSocketModel._emit_eventc                   sf  | j d us
J dzY| j 2 zQ3 d H W }zt|}| |I d H  W q tjyB } z| t|ddI d H  W Y d }~qd }~w ty_ } z| t|ddI d H  W Y d }~qd }~ww 6 W d S  tj	j
yt   td Y d S  tj	jy } z| t|ddI d H  W Y d }~d S d }~w ty } z| t|ddI d H  W Y d }~d S d }~ww )NNot connectedz)Failed to parse WebSocket message as JSON	exceptioncontextzError handling WebSocket eventz$WebSocket connection closed normallyz(WebSocket connection closed unexpectedlyz#WebSocket error in message listener)r{   jsonloads_handle_ws_eventJSONDecodeErrorr   rC   	Exceptionr   
exceptionsConnectionClosedOKr2   debugConnectionClosed)r   messageparsedero   ro   rp   r     sP   
z1OpenAIRealtimeWebSocketModel._listen_for_messagesrN   c                   s   t |tr#t|}|dur| |I dH  dS td|  dS t |tr2| |I dH  dS t |t	rA| 
|I dH  dS t |trP| |I dH  dS t |tr_| |I dH  dS t |trn| |I dH  dS t| tdt| )zSend an event to the model.NzFailed to convert raw message: zUnknown event type: )rg   rP   r   try_convert_raw_messager   r2   errorrS   _send_user_inputrM   _send_audiorR   _send_tool_outputrO   _send_interruptrQ   _send_session_updater'   
ValueErrorrY   r   r   	convertedro   ro   rp   
send_event5  s$   






z'OpenAIRealtimeWebSocketModel.send_eventOpenAIRealtimeClientEventc                   s8   | j dus
J d|jddd}| j |I dH  dS )z Send a raw message to the model.Nr   T)exclude_noneexclude_unset)r{   model_dump_jsonsend)r   r   payloadro   ro   rp   r   K  s   z.OpenAIRealtimeWebSocketModel._send_raw_messagerS   c                   s6   t |}| |I d H  | tddI d H  d S )Nresponse.createrY   )r   !convert_user_input_to_item_creater   OpenAIResponseCreateEventr   ro   ro   rp   r   Q  s   
z-OpenAIRealtimeWebSocketModel._send_user_inputrM   c                   s@   t |}| |I d H  |jr| tddI d H  d S d S )Nzinput_audio_buffer.commitr   )r   *convert_audio_to_input_audio_buffer_appendr   commit!OpenAIInputAudioBufferCommitEventr   ro   ro   rp   r   V  s   
z(OpenAIRealtimeWebSocketModel._send_audiorR   c              
     s   t |}| |I d H  t|jjpd|jj|jjdd|jj|jj	|j
d}| t|dI d H  |jrB| tddI d H  d S d S )N function_call	completeditem_idprevious_item_idcall_idrY   status	argumentsnameoutputitemr   r   )r   convert_tool_outputr   r8   	tool_callidr   r   r   r   r   r   rG   start_responser   )r   r   r   	tool_itemro   ro   rp   r   ^  s"   


z.OpenAIRealtimeWebSocketModel._send_tool_outputr<   c                 C  sf   | j r| j  S | j  }r-|\}}| j||}|r-t |j  d }|||dS d d d dS )Ni  )current_item_idcurrent_item_content_index
elapsed_ms)r   	get_stater   get_last_audio_itemr   nowinitial_received_timetotal_seconds)r   last_audio_item_idr   item_content_indexaudio_stater   ro   ro   rp   _get_playback_stateq  s"   
z0OpenAIRealtimeWebSocketModel._get_playback_staterO   c           	        s4  |   }|d}|d}|d}|d u s|d u r,td| d| d|  d S |p/d}|dkrR| t||dI d H  t||t|}| 	|I d H  ntd	| d| d|  | j
}|o~|jd uo~|jjd uo~|jjjd uo~|jjjjd
u f}|s|  I d H  | j  | jr| j  d S d S )Nr   r   r   zSkipping interrupt. Item id: z, elapsed ms: z, content index: r   r   content_indexz0Didn't interrupt bc elapsed ms is < 0. Item id: T)r   r   r2   r   r   r@   r   convert_interruptintr   r   rU   inputr`   rZ   _cancel_responser   on_interruptedr   )	r   r   playback_stater   r   r   r   r   'automatic_response_cancellation_enabledro   ro   rp   r     sn   





z,OpenAIRealtimeWebSocketModel._send_interruptrQ   c                   s   |  |jI dH  dS )z#Send a session update to the model.N)r   session_settings)r   r   ro   ro   rp   r     s   z1OpenAIRealtimeWebSocketModel._send_session_updater   r    c                   sP   |j | _t|j}| j|j |j| | t	||j
|j |jdI dH  dS )z:Handle audio delta events and update audio tracking state.)dataresponse_idr   r   N)r   r~   base64	b64decodedeltar   on_audio_deltar   r   r?   r  )r   r   audio_bytesro   ro   rp   _handle_audio_delta  s   z0OpenAIRealtimeWebSocketModel._handle_audio_deltar   r   c              
     s   |j dkrH|jdkrHt|jpdd|jdd|jpd|jpddd}| t|dI dH  | t	|jp3d|jp7d|jp;d|jp?ddI dH  dS |j d	krwt
t|jpUd|j |j|jrdd
d |jD ng dd}| t|dI dH  dS dS )zAHandle response output item events (function calls and messages).r   r   r   Nin_progressr   r   )r   r   r   r   r   c                 S  s   g | ]}|  qS ro   )
model_dump).0contentro   ro   rp   
<listcomp>  s    zDOpenAIRealtimeWebSocketModel._handle_output_item.<locals>.<listcomp>r   rY   roler  r   )rY   r   r8   r   r   r   r   r   rG   rI   r&   r7   validate_pythonr  r  )r   r   r   message_itemro   ro   rp   _handle_output_item  s@   
z0OpenAIRealtimeWebSocketModel._handle_output_itemr   re   c                   s(   t ||}| t|dI dH  dS )z3Handle conversation item creation/retrieval events.r   N)r   *conversation_item_to_realtime_message_itemr   rG   )r   r   r   r  ro   ro   rp   _handle_conversation_item  s
   z6OpenAIRealtimeWebSocketModel._handle_conversation_itemc                   s<   | j r| j  I dH  d| _ | jr| j  d| _dS dS )zClose the session.N)r{   closer|   cancelr   ro   ro   rp   r     s   

z"OpenAIRealtimeWebSocketModel.closec                   s,   | j r| tddI d H  d| _ d S d S )Nzresponse.cancelr   F)r   r   OpenAIResponseCancelEventr   ro   ro   rp   r  	  s
   
z-OpenAIRealtimeWebSocketModel._cancel_responsedict[str, Any]c              
     s  |  t|dI d H  t|tr|ddv r|d}t|tr|ddkr|dp/g }g }|D ]1}t|ts<q4|ddkrS|d|d|dd	 q4|dd
kre|d
|d
d q4|d}|dvr||ddk}|rzdnd}tt}||ddd|dd||d}	|  t	|	dI d H  d S zd|v r|d d u rd|d< | j
|}
W nd tjy } ztjd| dd |  t|dI d H  W Y d }~d S d }~w ty } z/t|tr|ddnd}tjd| dd t|d| d}|  |I d H  W Y d }~d S d }~ww |
jdkr+| |
I d H  d S |
jdkrCt|
j|
jd }|  |I d H  d S |
jd!kr| j }|d ur|\}}|  t||d I d H  | j  | jrq| j  | j}|o|jd uo|jjd uo|jjjd uo|jjjj du f}|s| ! I d H  d S d S d S |
jd"krd| _"|  t# I d H  d S |
jd#krd$| _"|  t$ I d H  d S |
jd%kr| %| j&I d H  | '|
j( d S |
jd&kr| '|
j( d S |
jd'kr|  t|
jdI d H  d S |
jd(kr|  t)|
jd)I d H  d S |
jd*ks,|
jd+ks,|
jd,krL|
jd+kr5|
j*nd }|
j+jdkrJ| ,|
j+|I d H  d S d S |
jd-ksX|
jd.kr| j-ri| .t/d/| j-d0I d H  |
jd-kr|  t0|
j|
j1d1I d H  d S d S |
jd2kr|  t2|
j|
j3|
j4d3I d H  d S |
jd4ks|
jd5ks|
jd6krd S |
jd7ks|
jdkr| 5|
j+I d H  d S |
jd8kr|  t6|
j|
j7|
j8d9I d H  d S d S ):N)r  rY   )response.output_item.addedresponse.output_item.doner   r   r  rU   
transcript)rY   rU   r   textrY   r!  r   )r  r   
incompleter  r   r  r   r   r  	assistantr  r   r   z!Failed to validate server event: T)exc_info)r   unknownr   zresponse.output_audio.deltazresponse.output_audio.doner   z!input_audio_buffer.speech_startedzresponse.createdzresponse.doneFzsession.createdzsession.updatedr   zconversation.item.deleted)r   zconversation.item.addedzconversation.item.createdzconversation.item.retrievedz5conversation.item.input_audio_transcription.completedzconversation.item.truncatedzconversation.item.retrieve)rY   r   )r   r   z&response.output_audio_transcript.delta)r   r
  r  z1conversation.item.input_audio_transcription.deltazresponse.output_text.deltaz&response.function_call_arguments.deltar  z$input_audio_buffer.timeout_triggered)r   audio_start_msaudio_end_ms)9r   rH   rg   dictr   r   r&   r7   r  rG   r   pydanticValidationErrorr2   r   rA   r   rC   rY   r  r>   r   r   r   r   r@   r  r   r   rU   r   r`   rZ   r  r   rL   rK   r   r   _update_created_sessionr   rF   r   r   r  r~   r   #OpenAIConversationItemRetrieveEventrE   r   rJ   r
  r  r  rD   r'  r(  )r   r   r   raw_contentconverted_contentpartr   is_donetype_adapterr  r   r   
event_typeexception_eventaudio_done_event
last_audior   r   r   r  r   ro   ro   rp   r     s(  




	








z-OpenAIRealtimeWebSocketModel._handle_ws_eventr   xOpenAISessionCreateRequest | OpenAIRealtimeTranscriptionSessionCreateRequest | Mapping[str, object] | pydantic.BaseModelc                 C  sT   |  |}|s	d S || _| |}|d u rd S | j| | jr(| j| d S d S ru   )_normalize_session_payloadr   _extract_audio_formatr   set_audio_formatr   )r   r   normalized_sessionnormalized_formatro   ro   rp   r,    s   

z4OpenAIRealtimeWebSocketModel._update_created_session!OpenAISessionCreateRequest | Nonec                 C  s   t | tr| S t | trd S t | tjr ttttf | 	 }n
t | tr(| }nd S t
|r1d S zt|W S  tjyB   Y d S w ru   )rg   r   /OpenAIRealtimeTranscriptionSessionCreateRequestr*  	BaseModelr
   r   rh   objectr  rx   _is_transcription_sessionmodel_validater+  )r   session_payloadro   ro   rp   r8    s    



z7OpenAIRealtimeWebSocketModel._normalize_session_payloadr   Mapping[str, object]boolc                 C  s(   zt |  W dS  tjy   Y dS w )NFT)r>  rB  r*  r+  )r   ro   ro   rp   rA    s   z6OpenAIRealtimeWebSocketModel._is_transcription_sessionr   c                 C  s*   | j }|r|jr|jjsd S t|jjS ru   )rU   r   formatrx   _normalize_audio_format)r   rU   ro   ro   rp   r9    s   z2OpenAIRealtimeWebSocketModel._extract_audio_formatfmtr@  rh   c                 C  sN   t | trdS t | trdS t | trdS t| }t |tr#|r#|S t| S )NrV   	g711_ulaw	g711_alaw)rg   r   r   r   rx   _read_format_typerh   )rH  fmt_typero   ro   rp   rG    s   



z4OpenAIRealtimeWebSocketModel._normalize_audio_formatc                 C  s   t | tr| S t | tr| d}t |tr|S d S t | tjr0|  d}t |tr.|S d S z| j}W n
 ty?   Y d S w t |trG|S d S )NrY   )	rg   rh   r   r   r*  r?  r  rY   AttributeError)rH  
type_valuero   ro   rp   rK    s   



z.OpenAIRealtimeWebSocketModel._read_format_typer   r6   c                   s(   |  |}| t|ddI d H  d S )Nr   r   )_get_session_configr   r   )r   r   session_configro   ro   rp   r     s
   

z3OpenAIRealtimeWebSocketModel._update_session_configc                 C  s  | dp	| jp	d}| dt d}| d}| dt d}| dt d}| dt d}| dt d}| d	t d	}	| d
t d
}
d}tdd ||
||fD rptt|tt|
tt|tt|d}d}tdd |	||fD rtt|	||d}d}|s|rt	||d}d}| ddur|d }| d}t
|d || dd}t|d| d|||tt| dtt| dtt| j| dg | dg dd	S )zGet the session config.r   rz   r[   speedr\   r]   r_   r`   r^   input_audio_noise_reductionNc                 s      | ]}|d uV  qd S ru   ro   r  valuero   ro   rp   	<genexpr>B  s
    
zCOpenAIRealtimeWebSocketModel._get_session_config.<locals>.<genexpr>)rF  noise_reductiontranscriptionr`   c                 s  rS  ru   ro   rT  ro   ro   rp   rV  S  s    )rF  rQ  r[   )r   r   prompt	variablesr   version)r   rZ  r[  r   instructionsmax_output_tokenstool_choicetoolshandoffs)r_  r`  )	rW   rY   r\  rY  output_modalitiesrU   r]  r^  r_  )r   rW   ra   anyOpenAIRealtimeAudioInputr,   r
   r   OpenAIRealtimeAudioOutputOpenAIRealtimeAudioConfigr$   r   _tools_to_session_tools)r   r   r   r[   rQ  r\   r]   r_   r`   r^   rR  input_audio_configoutput_audio_configaudio_configrY  _passed_promptrZ  ro   ro   rp   rO  "  s   
	


z0OpenAIRealtimeWebSocketModel._get_session_configr_  
list[Tool]r`  list[Handoff]list[OpenAISessionFunction]c              	   C  sp   g }|D ]}t |tstd|j d|t|j|j|jdd q|D ]}|t|j|j	|j
dd q%|S )NzTool z) is unsupported. Must be a function tool.function)r   description
parametersrY   )rg   r-   r1   r   r   OpenAISessionFunctionro  params_json_schema	tool_nametool_descriptioninput_json_schema)r   r_  r`  converted_toolstoolhandoffro   ro   rp   rf  ~  s,   
		z4OpenAIRealtimeWebSocketModel._tools_to_session_toolsN)rd   ry   )r   r:   rd   ry   )r   r   rd   ry   )r   r;   rd   ry   )r   rB   rd   ry   )r   rN   rd   ry   )r   r   rd   ry   )r   rS   rd   ry   )r   rM   rd   ry   )r   rR   rd   ry   )rd   r<   )r   rO   rd   ry   )r   rQ   rd   ry   )r   r    rd   ry   )r   r   rd   ry   )r   r   r   re   rd   ry   )r   r  )r   r7  rd   ry   )r   r7  rd   r=  )r   rD  rd   rE  )r   r   rd   re   )rH  r@  rd   rh   )rH  r@  rd   re   )r   r6   rd   ry   )r   r6   rd   r   )r_  rk  r`  rl  rd   rm  )#__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r,  staticmethodr8  rA  r9  rG  rK  r   rO  rf  ro   ro   ro   rp   rx      sL    


&



%






3


'
	
	
 
)

\rx   c                   @  s|   e Zd Zed)ddZed*ddZed+ddZed,ddZed-ddZed.ddZ	ed/dd Z
ed0d&d'Zd(S )1r   r   r   r   re   rd   r7   c              	   C  s   t |tttfstdg }|jD ]}| }|jdkr!d|d< n	|jdkr*d|d< || qt	t
|jp8d||j|j|dd	S )
Nz:Unsupported conversation item type for message conversion.output_textr!  rY   output_audiorU   r   r  )r   r   rY   r  r  r   )rg   r   r   r   r   r  r  rY   r   r&   r7   r  r   r  )clsr   r   r  eachcro   ro   rp   r    s2   



z<_ConversionHelper.conversation_item_to_realtime_message_itemr   rP    OpenAIRealtimeClientEvent | Nonec                 C  sL   zi }|j d |d< ||j di  tt|W S  ty%   Y d S w )NrY   
other_data)r   r   r   r&   r   r  r   )r  r   r  ro   ro   rp   r     s   z)_ConversionHelper.try_convert_raw_messager   r   3OpenAITracingConfiguration | Literal['auto'] | Nonec                 C  s8   |d u rd S |dkrdS t |d|d|ddS )Nr   group_idmetadataworkflow_name)r  r  r  )OpenAITracingConfigurationr   )r  r   ro   ro   rp   r     s   z(_ConversionHelper.convert_tracing_configr   rS   OpenAIConversationItemc              	   C  s4  |j }t|trg }|dg D ]v}zkt|tsW q|d}|dkr;|d}t|tr/|nd }|td|d nA|dkr||d}t|tr||r||d}	ttd	 d B t|	tra|	d	v ra|	nd }
|
d u rr|td|d
 n
|td||
d W q t	y   Y qw t
dd|dS t
ddtd|dgdS )Nr  rY   
input_textr!  r"  input_image	image_urldetail)r   lowhigh)rY   r  )rY   r  r  r   user)rY   r  r  )
user_inputrg   r)  r   rh   r   r   r
   r   r   r   )r  r   r  r  r   t_txttext_valiud
detail_valro   ro   rp   'convert_user_input_to_conversation_item  s`   






z9_ConversionHelper.convert_user_input_to_conversation_itemr   c                 C  s   t d| |dS )Nconversation.item.createrY   r   )!OpenAIConversationItemCreateEventr  r  r   ro   ro   rp   r     s   z3_ConversionHelper.convert_user_input_to_item_createrM   c                 C  s   t |jd}td|dS )Nzutf-8zinput_audio_buffer.append)rY   rU   )r  	b64encoderU   decode!OpenAIInputAudioBufferAppendEvent)r  r   base64_audioro   ro   rp   r     s
   z<_ConversionHelper.convert_audio_to_input_audio_buffer_appendrR   c                 C  s   t dtd|j|jjddS )Nr  function_call_output)rY   r   r   r  )r  r   r   r   r   r  ro   ro   rp   r   #  s   z%_ConversionHelper.convert_tool_outputr   rh   current_audio_content_indexr   elapsed_time_msc                 C  s   t d|||dS )Nzconversation.item.truncate)rY   r   r   r(  )#OpenAIConversationItemTruncateEvent)r  r   r  r  ro   ro   rp   r   .  s   z#_ConversionHelper.convert_interruptN)r   r   r   re   rd   r7   )r   rP   rd   r  )r   r   rd   r  )r   rS   rd   r  )r   rS   rd   r   )r   rM   rd   r   )r   rR   rd   r   )r   rh   r  r   r  r   rd   r   )ry  rz  r{  classmethodr  r   r   r  r   r   r   r   ro   ro   ro   rp   r     s"    !7	
r   )rb   rc   rd   re   )rd   rt   )
__future__r   r   r  rj   r   rl   collections.abcr   r   typingr   r   r   r   r	   r
   r*  r   openai.types.realtimer   _rt_audio_config'openai.types.realtime.conversation_itemr   r  4openai.types.realtime.conversation_item_create_eventr   r  6openai.types.realtime.conversation_item_retrieve_eventr   r-  6openai.types.realtime.conversation_item_truncate_eventr   r  5openai.types.realtime.input_audio_buffer_append_eventr   r  5openai.types.realtime.input_audio_buffer_commit_eventr   r   ,openai.types.realtime.realtime_audio_formatsr   r   r   +openai.types.realtime.realtime_client_eventr   r   Bopenai.types.realtime.realtime_conversation_item_assistant_messager   Eopenai.types.realtime.realtime_conversation_item_function_call_outputr   ?openai.types.realtime.realtime_conversation_item_system_messager   =openai.types.realtime.realtime_conversation_item_user_messager   r   ,openai.types.realtime.realtime_function_toolr   rq  +openai.types.realtime.realtime_server_eventr   OpenAIRealtimeServerEvent5openai.types.realtime.realtime_session_create_requestr   r   -openai.types.realtime.realtime_tracing_configr   r  Copenai.types.realtime.realtime_transcription_session_create_requestr   r>  0openai.types.realtime.response_audio_delta_eventr    +openai.types.realtime.response_cancel_eventr!   r  +openai.types.realtime.response_create_eventr"   r   *openai.types.realtime.session_update_eventr#   r   &openai.types.responses.response_promptr$   r%   r&   typing_extensionsr'   websockets.asyncio.clientr(   agents.handoffsr)   agents.promptsr*    agents.realtime._default_trackerr+   agents.realtime.audio_formatsr,   agents.toolr-   r.   agents.util._typesr/   r   r1   r2   r[  r3   configr5   r6   itemsr7   r8   rW   r9   r:   r;   r<   r=   model_eventsr>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   model_inputsrM   rN   rO   rP   rQ   rR   rS   RealtimeAudioConfigre  RealtimeAudioConfigInputrc  RealtimeAudioConfigOutputrd  r   ra   __annotations__rq   rv   rs   rw   rx   r   ro   ro   ro   rp   <module>   s     D$


     f