
    /jU                      % S SK Jr  S SKrS SKrS SKrS SK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  S SKJrJrJr  S SKJrJrJrJr  S SKrS SKJrJr  S SKJr  S S	KJrJrJ r J!r!J"r"  S S
K#J$r$  S SK%J&r&  S SK'J(r(J)r)J*r*J+r+  S SK,J-r-  S SK.J/r/  S SK0J1r1  S SK2J3r3J4r4J5r5  S SK6J7r8J9r:J;r<J=r>J?r@  S SKAJBrBJCrCJDrDJErEJFrFJGrGJHrHJIrIJJrJJKrKJLrLJMrMJNrNJOrOJPrPJQrQJRrRJSrSJTrTJUrUJVrVJWrWJXrXJYrYJZrZJ[r[J\r\J]r]J^r^J_r_J`r`JaraJbrbJcrcJdrdJ?r?  S SKeJfrf  S SKgJhrh  S SKiJjrj  SSKkJlrl  SSKmJnrn  SSK"JoroJprpJqrqJrrrJsrsJtrtJuruJvrvJwrwJxrxJyry  SrzSr{Sr|Sr}\~" \R                  " SS 5      5      rSS S!S"S#S$S%S&.rS'\S('   S8S) jrS9S* jrS:S+ jr\ " S, S-5      5       r\ " S. S/5      5       r\ " S0 S15      5       r " S2 S3\!GR                  5      r   S;           S<S4 jjr " S5 S6\!GR                  \S7      5      rg)=    )annotationsN)Iterator)	dataclass)AnyLiteraloverload)parse_qs	urlencodeurlparse
urlunparse)	BaseModelValidationError)rtc)APIConnectionErrorAPIErroriollmutils)RealtimeModelMetrics)Metadata)DEFAULT_API_CONNECT_OPTIONS	NOT_GIVENAPIConnectOptions
NotGivenOr)is_given)remove_instructions)realtime)InputAudioNoiseReductionInputAudioTranscriptionTurnDetection)SessionSessionInputAudioNoiseReductionSessionInputAudioTranscriptionSessionTurnDetectionSessionUpdateEvent)$AudioTranscriptionConversationItemAddedConversationItemCreateEventConversationItemDeletedEventConversationItemDeleteEvent5ConversationItemInputAudioTranscriptionCompletedEvent2ConversationItemInputAudioTranscriptionFailedEventConversationItemTruncateEventInputAudioBufferAppendEventInputAudioBufferClearEventInputAudioBufferCommitEvent"InputAudioBufferSpeechStartedEvent"InputAudioBufferSpeechStoppedEventNoiseReductionTypeRealtimeAudioConfigRealtimeAudioConfigInputRealtimeAudioConfigOutputRealtimeAudioInputTurnDetectionRealtimeClientEvent$RealtimeConversationItemFunctionCallRealtimeErrorEventRealtimeFunctionToolRealtimeResponseCreateParamsRealtimeSessionCreateRequestResponseAudioDeltaEventResponseAudioDoneEventResponseCancelEventResponseContentPartAddedEventResponseCreatedEventResponseCreateEventResponseDoneEventResponseOutputItemAddedEventResponseOutputItemDoneEventResponseTextDeltaEventResponseTextDoneEventr%   )NoiseReduction)Tracing)RealtimeTruncation   logger)RealtimeModels   )'AZURE_DEFAULT_INPUT_AUDIO_TRANSCRIPTIONAZURE_DEFAULT_TURN_DETECTION"DEFAULT_MAX_RESPONSE_OUTPUT_TOKENSDEFAULT_MAX_SESSION_DURATION"calculate_confidence_from_logprobslivekit_item_to_openai_itemopenai_item_to_livekit_itemto_audio_transcriptionto_noise_reductionto_oai_tool_choiceto_turn_detectioni]  zhttps://api.openai.com/v1marinLK_OPENAI_DEBUGresponse.output_text.deltaresponse.output_text.done&response.output_audio_transcript.deltaz%response.output_audio_transcript.doneresponse.output_audio.deltaresponse.output_audio.doneconversation.item.added)zresponse.text.deltazresponse.text.donezresponse.audio_transcript.deltazresponse.audio_transcript.donezresponse.audio.deltazresponse.audio.donezconversation.item.createdzdict[str, str]_AZURE_EVENT_MAPPINGc                B    UR                  U R                  SSSS95      $ )zKConvert a Pydantic model to a different type with the same field structure.Tby_aliasexclude_unsetexclude_defaults)model_validate
model_dump)obj
target_clss     _/app/agent/.venv/lib/python3.13/site-packages/livekit/plugins/openai/realtime/realtime_model.py_convert_modelro      s'    $$D4P     c                   0 nU R                   b:  SU R                   ;   a  SS/US'   O[        U R                   5      US'   SUS'   SUS'   U R                  b  U R                  R                  nU R                  R                  nUb~  UR
                  b  [        UR
                  [        5      US'   UR                  b  [        UR                  [        5      US'   UR                  b  [        UR                  [        5      US	'   Ub8  UR                  b  UR                  US
'   UR                  b  UR                  US'   U R                  b  U R                  US'   U R                  b  U R                  US'   U R                   b  U R                   US'   U R"                  b  U R"                  US'   U R$                  b  U R$                  US'   U R&                  b  U R&                  US'   [(        R*                  " S0 UD6$ )a=  Convert a new-style OpenAI RealtimeSessionCreateRequest to Azure's old-style flat format.

Azure OpenAI Realtime API doesn't support the newer nested `audio` config or
`output_modalities` / `type` fields.  Instead it uses flat top-level fields like
`modalities`, `voice`, `input_audio_format`, `turn_detection`, etc.
audiotext
modalitiespcm16input_audio_formatoutput_audio_formatinput_audio_noise_reductioninput_audio_transcriptionturn_detectionvoicespeedmodelinstructionstoolstool_choicemax_response_output_tokenstracing )output_modalitieslistrr   inputoutputnoise_reductionro   AzureNoiseReductiontranscriptionAzureInputAudioTranscriptionrz   AzureTurnDetectionr{   r|   r}   r~   r   r   max_output_tokensr   AzureSessionmodel_construct)sessionmappedinpouts       rn   _oai_session_to_azurer      s     F   ,g///$+V#4F< #'(A(A#BF< '.#$(/$% }} mm!!mm""?"".8F'')<945   ,6D%%'C723 !!-+9#:L:LN`+a'(?yy$"%))wyy$"%))w }} !--w'!(!5!5~}} !--w& ' 3 3}  ,/6/H/H+,"#OOy''1&11rp   c                    U R                  S5      nUc  gUR                  SS5       H  nUR                  S5      S:X  d  M  SUS'   M!     g)zIn-place normalization of client event dicts for legacy Azure compatibility.

The legacy Azure Realtime API uses "text" for assistant content parts,
while the newer OpenAI API uses "output_text".
itemNcontentr   typeoutput_textrs   )get)eventr   content_parts      rn   _normalize_azure_client_eventr      sL     99VD|B/F#}4#)L  0rp   c                      \ rS rSr% S\S'   S\S'   S\S'   S\S'   S	\S
'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'    S\S '   S!rS"\S#'   S$rg%)&_RealtimeOptions   strr}   r{   zllm.ToolChoice | Noner   zAudioTranscription | Nonery   zNoiseReduction | Nonerx   z&RealtimeAudioInputTurnDetection | Nonerz   zint | Literal['inf'] | Noner   zTracing | Noner   zRealtimeTruncation | None
truncation
str | Noneapi_keybase_urlboolis_azureazure_deploymententra_tokenapi_versionlist[Literal['text', 'audio']]rt   float | Nonemax_session_durationr   conn_options      ?floatr|   r   N)__name__
__module____qualname____firstlineno____annotations__r|   __static_attributes__r   rp   rn   r   r      sw    JJ&&88!66:: ;;))MN  ..&&B##E5rp   r   c                  L    \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
rS\S'   Srg)_MessageGeneration   r   
message_idzutils.aio.Chan[str]text_chzutils.aio.Chan[rtc.AudioFrame]audio_chz.asyncio.Future[list[Literal['text', 'audio']]]rt    audio_transcriptr   N)r   r   r   r   r   r   r   r   rp   rn   r   r      s$    O  ,,>>crp   r   c                  X    \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
\S'    SrS\S'   Srg)_ResponseGeneration   z%utils.aio.Chan[llm.MessageGeneration]
message_chz utils.aio.Chan[llm.FunctionCall]function_chzdict[str, _MessageGeneration]messageszasyncio.Future[None]	_done_futr   _created_timestampNr   _first_token_timestampr   )r   r   r   r   r   r   r   r   rp   rn   r   r      s1    5511++##1+/L/5rp   r   c                    ^  \ rS rSr\S\\\\\\\\\S\S\\\S.                                 SS jj5       r\SSSS\\\\\\\\\\S\\\S.                                     SS jj5       rS\\\\\\\\\\SSSS\\\S.                                       SU 4S	 jjjr\	SS
 j5       r
\	SS j5       r\SSSS\\\S\\\S\\S.                                 SS jj5       r\\\\\\\\\\S.
                     SS jjrSS jrSS jrSS jrSrU =r$ )RealtimeModeli  zgpt-realtimeN)r}   r{   rt   ry   rx   rz   r   r|   r   r   r   r   http_sessionr   r   temperaturec                   g Nr   )selfr}   r{   rt   ry   rx   rz   r   r|   r   r   r   r   r   r   r   r   s                    rn   __init__RealtimeModel.__init__	  s    4 rp   )r   r   r   r   r   r{   rt   ry   rx   rz   r   r|   r   r   r   r   r   r   c                   g r   r   )r   r   r   r   r   r   r{   rt   ry   rx   rz   r   r|   r   r   r   r   r   r   s                      rn   r   r   %  s    8 rp   )r}   r{   rt   r   r   ry   rx   rz   r|   r   r   r   r   r   r   r   r   r   c                 > UR                  S5      =(       d    [        R                  " S5      nUR                  S5      (       a  [        R                  " S5        O1[        R                  " S5      (       a  [        R                  " S5        [        U5      (       a  UOSS/n[        TU ]  [        R                  " SUSLUSLS	SU;   SSSSSS
9
S9  USL=(       d    USL=(       d    USLnU=(       d    [        R                  R                  S5      nUc  U(       d  [        S5      e[        U5      (       a  UnOFU(       a9  [        R                  " S5      nUc  [        S5      eUR                  S5       S3nO[        n[        S&0 SU_SU_SU=(       d    S_SU_S[        U5      _S[!        U5      _S[#        U5      _SU_SU_SU_SU_SU_SU_S[$        _S[        U	5      (       a  U	OS _S![        U
5      (       a  U
OS_S"[        U5      (       a  UOS_S#[        U5      (       a  UO[&        _S$U_6U l        Xl        S	U l        [.        R0                  [2           " 5       U l        S%U l        g)'aD
  
Initialize a Realtime model client for OpenAI or Azure OpenAI.

Args:
    model (str): Realtime model name, e.g., "gpt-realtime".
    voice (str): Voice used for audio responses. Defaults to "marin".
    modalities (list[Literal["text", "audio"]] | NotGiven): Modalities to enable. Defaults to ["text", "audio"] if not provided.
    tool_choice (llm.ToolChoice | None | NotGiven): Tool selection policy for responses.
    base_url (str | NotGiven): HTTP base URL of the OpenAI/Azure API. If not provided, uses OPENAI_BASE_URL for OpenAI; for Azure, constructed from AZURE_OPENAI_ENDPOINT.
    input_audio_transcription (AudioTranscription | None | NotGiven): Options for transcribing input audio.
    input_audio_noise_reduction (NoiseReductionType | NoiseReduction | InputAudioNoiseReduction | None | NotGiven): Input audio noise reduction settings.
    turn_detection (RealtimeAudioInputTurnDetection | None | NotGiven): Server-side turn-detection options.
    speed (float | NotGiven): Audio playback speed multiplier.
    tracing (Tracing | None | NotGiven): Tracing configuration for OpenAI Realtime.
    truncation (RealtimeTruncation | None | NotGiven): Truncation configuration for OpenAI Realtime.
    api_key (str | None): OpenAI API key. If None and not using Azure, read from OPENAI_API_KEY.
    http_session (aiohttp.ClientSession | None): Optional shared HTTP session.
    azure_deployment (str | None): Azure deployment name. Presence of any Azure-specific option enables Azure mode.
    entra_token (str | None): Azure Entra token auth (alternative to api_key).
    max_session_duration (float | None | NotGiven): Seconds before recycling the connection.
    conn_options (APIConnectOptions): Retry/backoff and connection settings.
    temperature (float | NotGiven): Deprecated; ignored by Realtime v1.

Raises:
    ValueError: If OPENAI_API_KEY is missing in non-Azure mode, or if Azure endpoint cannot be determined when in Azure mode.

Examples:
    Basic OpenAI usage:

    ```python
    from livekit.plugins.openai.realtime import RealtimeModel
    from openai.types import realtime

    model = RealtimeModel(
        voice="marin",
        modalities=["audio"],
        input_audio_transcription=realtime.AudioTranscription(
            model="gpt-4o-transcribe",
        ),
        input_audio_noise_reduction="near_field",
        turn_detection=realtime.realtime_audio_input_turn_detection.SemanticVad(
            type="semantic_vad",
            create_response=True,
            eagerness="auto",
            interrupt_response=True,
        ),
    )
    session = AgentSession(llm=model)
    ```
r   OPENAI_API_VERSIONzPThe `api_version` parameter is deprecated and will be removed on April 30, 2026.`The OPENAI_API_VERSION environment variable is deprecated and will be removed on April 30, 2026.rs   rr   TNF)
message_truncationrz   user_transcriptionauto_tool_reply_generationaudio_outputmanual_function_callsmutable_chat_contextmutable_instructionsmutable_toolsper_response_tool_choice)capabilitiesOPENAI_API_KEYzThe api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variableAZURE_OPENAI_ENDPOINTz_Missing Azure endpoint. Please pass base_url or set AZURE_OPENAI_ENDPOINT environment variable.//openair}   r{   r   rt   ry   rx   rz   r   r   r   r   r   r   r|   r   r   r   r   r   zOpenAI Realtime APIr   )r   osgetenvrN   warningr   superr   r   RealtimeCapabilitiesenviron
ValueErrorrstripOPENAI_BASE_URLr   rX   rY   r[   rS   rT   _opts_http_session_http_session_ownedweakrefWeakSetRealtimeSession	_sessions_provider_label)r   r}   r{   rt   r   r   ry   rx   rz   r|   r   r   r   r   r   r   r   r   r   kwargsr   r   base_url_valazure_endpoint	__class__s                           rn   r   r   C  s   ^ #)**]";"^ryyI]?^::m$$NNb YY+,,NN%
 $,J#7#7Zfg=N
11#'-T9#<D#H+0$
2&*%)%)")- 	 	
  t#^{$'>^BRZ^B^ 	 =RZZ^^,<=?8V 
 H#L!#+B!C!)$M  #1"7"7"<!=WE.% 


 $+t
 "	

 '==V&W
 );;V(W
 -^<
 
 "
 
 .
 $
 $
 (J
 $E??%
   (00Gd!
" &.j%9%9zt#
& ,-- "6-)
* &+

. *#(  9;4rp   c                .    U R                   R                  $ r   )r   r}   r   s    rn   r}   RealtimeModel.model  s    zzrp   c                Z    SSK Jn  U" U R                  R                  5      R                  $ )Nr   )r   )urllib.parser   r   r   netloc)r   r   s     rn   providerRealtimeModel.provider  s     )

++,333rp   )r   r   r   r   r{   rt   ry   rx   rz   r|   r   r   r   r   c                  UR                  S5      (       a  [        R                  " S5        O1[        R                  " S5      (       a  [        R                  " S5        U=(       d    [        R                  " S5      nUc  Uc  [        S5      eUR                  S5      =(       d    [        R                  " S5      nUcB  U=(       d    [        R                  " S5      nUc  [        S5      eUR                  S	5       S
3nOUb  [        S5      e[        U5      (       d  [        n[        U
5      (       d  [        n
[        UUUU	U
UUUUUUUUUS9$ )a  
Create a RealtimeModel configured for Azure OpenAI.

Args:
    azure_deployment (str): Azure OpenAI deployment name.
    azure_endpoint (str | None): Azure endpoint URL; if None, taken from AZURE_OPENAI_ENDPOINT.
    api_key (str | None): Azure API key; if None, taken from AZURE_OPENAI_API_KEY. Omit if using `entra_token`.
    entra_token (str | None): Azure Entra token for AAD auth. Provide instead of `api_key`.
    base_url (str | None): Explicit base URL. Mutually exclusive with `azure_endpoint`. If provided, used as-is.
    voice (str): Voice used for audio responses.
    modalities (list[Literal["text", "audio"]] | NotGiven): Modalities to enable. Defaults to ["text", "audio"] if not provided.
    input_audio_transcription (AudioTranscription | InputAudioTranscription | None | NotGiven): Transcription options; defaults to Azure-optimized values when not provided.
    input_audio_noise_reduction (NoiseReductionType | InputAudioNoiseReduction | None): Input noise reduction settings. Defaults to None.
    turn_detection (RealtimeAudioInputTurnDetection | TurnDetection | None | NotGiven): Server-side VAD; defaults to Azure-optimized values when not provided.
    speed (float | NotGiven): Audio playback speed multiplier.
    tracing (Tracing | None | NotGiven): Tracing configuration for OpenAI Realtime.
    http_session (aiohttp.ClientSession | None): Optional shared HTTP session.
    max_session_duration (float | None | NotGiven): Seconds before recycling the connection.
    temperature (float | NotGiven): Deprecated; ignored by Realtime v1.

Returns:
    RealtimeModel: Configured client for Azure OpenAI Realtime.

Raises:
    ValueError: If credentials are missing, Azure endpoint cannot be determined, or both `base_url` and `azure_endpoint` are provided.

Examples:
    Azure usage with api-version 2024-10-01-preview:

    ```python
    from livekit.plugins.openai.realtime import RealtimeModel
    from openai.types.beta import realtime

    model = openai.realtime.RealtimeModel.with_azure(
        azure_deployment="gpt-realtime",
        azure_endpoint="https://yourendpoint.azure.com",
        api_version="2024-10-01-preview",
        api_key="your-api-key",
        modalities=["text", "audio"],
        input_audio_transcription=realtime.session.InputAudioTranscription(
            model="gpt-4o-transcribe",
        ),
        input_audio_noise_reduction=realtime.session.InputAudioNoiseReduction(
            type="near_field",
        ),
        turn_detection=realtime.session.TurnDetection(
            type="semantic_vad",
            create_response=True,
            eagerness="auto",
            interrupt_response=True,
        ),
    )
    ```

    Azure usage with api-version 2025-08-28:
    ```python
    from livekit.plugins.openai.realtime import RealtimeModel
    from openai.types import realtime

    model = RealtimeModel(
        azure_deployment="gpt-realtime",
        azure_endpoint="https://yourendpoint.azure.com",
        api_version="2024-10-01-preview",
        api_key="your-api-key",
        input_audio_transcription=realtime.AudioTranscription(
            model="gpt-4o-transcribe",
        ),
        input_audio_noise_reduction="near_field",
        turn_detection=realtime.realtime_audio_input_turn_detection.SemanticVad(
            type="semantic_vad",
            create_response=True,
            eagerness="auto",
            interrupt_response=True,
        ),
    )
    ```
r   z`The `api_version` parameter in `with_azure` is deprecated and will be removed on April 30, 2026.r   r   AZURE_OPENAI_API_KEYzuMissing credentials. Please pass one of `api_key`, `entra_token`, or the `AZURE_OPENAI_API_KEY` environment variable.r   z{Missing Azure endpoint. Please pass the `azure_endpoint` parameter or set the `AZURE_OPENAI_ENDPOINT` environment variable.r   r   z2base_url and azure_endpoint are mutually exclusive)r{   rt   ry   rx   rz   r|   r   r   r   r   r   r   r   r   )r   rN   r   r   r   r   r   r   rQ   rR   r   )clsr   r   r   r   r   r{   rt   ry   rx   rz   r|   r   r   r   r   r   r   s                     rn   
with_azureRealtimeModel.with_azure  sR   L ::m$$NN% YY+,,NN%
 >RYY'=>?{2F 
 #)**]";"^ryyI]?^+Qryy9P/QN% Y 
 )//45W=H'QRR122(O%''9N!&?(C)%-##!5
 	
rp   )
r{   rz   r   ry   rx   r   r|   r   r   r   c       
        L   [        U5      (       a  XR                  l        [        U5      (       a  [        U5      U R                  l        [        U5      (       a  X0R                  l        [        U5      (       a  [        U5      U R                  l        [        U5      (       a  [        U5      U R                  l	        [        U5      (       a  X`R                  l
        [        U5      (       a  XpR                  l        [        U5      (       a  XR                  l        [        U	5      (       a  XR                  l        U R                   HV  nUR                  UU R                  R                  UU R                  R                  U R                  R                  UUUU	S9	  MX     g )N)	r{   rz   r   ry   rx   r   r|   r   r   )r   r   r{   r[   rz   r   rX   ry   rY   rx   r   r|   r   r   r   update_options)r   r{   rz   r   ry   rx   r   r|   r   r   r   sesss               rn   r  RealtimeModel.update_options  s1   ( E??$JJN##(9.(IDJJ%K  %0JJ"-..3IJc3dDJJ0/005GHc5dDJJ2.//4NJJ1E??$JJG!(JJJ$.JJ!NND#zz88'*.***N*N,0JJ,R,R+E%   
 #rp   c                   U R                   (       d0   [        R                  R                  5       U l         U R                   $ U R                   $ ! [         a/    [
        R                  " 5       U l         SU l         U R                   $ f = f)NT)r   r   http_contextr   RuntimeErroraiohttpClientSessionr   r   s    rn   _ensure_http_session"RealtimeModel._ensure_http_session  sv    !!0%*%7%7%D%D%F"
 !!!t!!!	   0%,%:%:%<"+/(!!!	0s   #A +BBc                R    [        U 5      nU R                  R                  U5        U$ r   )r   r   add)r   r  s     rn   r   RealtimeModel.session  s#    t$4 rp   c                   #    U R                   (       a5  U R                  (       a#  U R                  R                  5       I S h  vN   g g g  N7fr   )r   r   closer   s    rn   acloseRealtimeModel.aclose  s9     ##(:(:$$**,,, );#,s   A AA
A)r   r   r   r   r   )"r}   zRealtimeModels | strr{   r   rt   *NotGivenOr[list[Literal['text', 'audio']]]ry   ?NotGivenOr[AudioTranscription | InputAudioTranscription | None]rx   QNotGivenOr[NoiseReductionType | NoiseReduction | InputAudioNoiseReduction | None]rz   BNotGivenOr[RealtimeAudioInputTurnDetection | TurnDetection | None]r   !NotGivenOr[llm.ToolChoice | None]r|   NotGivenOr[float]r   NotGivenOr[Tracing | None]r   %NotGivenOr[RealtimeTruncation | None]r   r   r   NotGivenOr[str]r   aiohttp.ClientSession | Noner   NotGivenOr[float | None]r   r   r   r  returnNone)&r   r   r   r   r   r   r   r   r   r  r{   r   rt   r  ry   r  rx   r  rz   r  r   r  r|   r  r   r  r   r  r   r   r   r!  r   r   r   r  r"  r#  )(r}   r   r{   r   rt   r  r   r  r   r  ry   r  rx   r  rz   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"  r   )"r   r   r   r   r   r   r   r   r   r   r{   r   rt   r  ry   r  rx   z4NoiseReductionType | InputAudioNoiseReduction | Nonerz   r  r|   r  r   r  r   r   r   r!  r   r  r   r   r"  r   )r{   r  rz   r  r   r  ry   z?NotGivenOr[InputAudioTranscription | AudioTranscription | None]rx   zQNotGivenOr[NoiseReduction | NoiseReductionType | InputAudioNoiseReduction | None]r   'NotGivenOr[int | Literal['inf'] | None]r|   r  r   r  r   r  r   r  r"  r#  )r"  zaiohttp.ClientSession)r"  r   r"  r#  )r   r   r   r   r   DEFAULT_VOICEr   r   r   propertyr}   r   classmethodr  r  r  r   r  r   __classcell__r   s   @rn   r   r     s	    '5"AJ   9B#,.7<E"$-599B*E)21 $ 	
 ?$
&

 7  !!" ,#$ :%& '( ")* 3+, 7-. (/0 '12 
3 6  (,"&""&$-"AJ   9B#,.7<E599B*E)25 %  	
    "  ?$
&
 
!& 7'( !)* ,+, :-. 3/0 712 (34 '56 
7 @ $"AJ9B$-   #,.7<E"59'+"&9B*E)25]5 ]5 	]5
 ?]5 7]5 "]5$
]5&
]5
]5" !#]5$ ,%]5& :']5( )]5* 3+]5, %-]5.  /]50 71]52 (3]54 '5]56 7]58 
9]5 ]5~     4 4
 
 &*""&#"AJ \` #,.7599B)2+Z
 Z
 #	Z

 Z
  Z
 Z
 Z
 ?Z
$
Z
 &ZZ

Z
" !#Z
$ ,%Z
& 3'Z
( 7)Z
* '+Z
, -Z
. 
/Z
 Z
~ "+ 9B  NW#,.7<E)2%: :
	: 7:$
:&
: %L: !:  ,!:" :#:$ '%:& 
':x"
- -rp   r   c                   U R                  S5      (       a  U R                  SSS5      n [        U 5      n[        UR                  5      nUR
                  R                  S5      nU(       a*  US;   a  Xt(       d  SOS-   nO?US:X  a  S	nO6UR
                  nO)UR
                  (       a  US
;   a  US-   nOUR
                  nU(       aA  UR                  SS 5        U(       a  U/US'   U(       a  U/US'   O SU;  a  U(       a  U/US'   OSU;  a  U/US'   [        USS9n	[        UR                  UR                  USU	S45      n
U
$ )NhttpwsrP   r   )r   r   z/v1/realtimez	/realtime
/openai/v1z/openai/v1/realtime)r   z/v1r   r.  zapi-version
deploymentr}   T)doseqr   )
startswithreplacer   r	   querypathr   popr
   r   schemer   )urlr}   r   r   r   
parsed_urlquery_paramspath_strippedr4  	new_querynew_urls              rn   process_base_urlr=    s<    ~~fkk&$*#JJ,,-LOO**3/MO+ +N;WDl*(D??D-3W"W ;.D??D-+6-L'.>-?\* l*/?)9(:W% ,&%*GL!,d3I*++Z->->b)UWXYGNrp   c            
        ^  \ rS rSrSrS7U 4S jjrS8S jr\R                  " \	S9S9S j5       r
S:S jrS;S jr      S<S	 jrS=S
 jr\S>S j5       r\S?S j5       r\\\\\\\\\S.	                   S@S jjrSAS jr    SBS jrSCS jrSDS jrSES jrSFS jrSGS jrSHS jrS9S jrS9S jr\\\S.       SIS jjr\SJS j5       rS9S jr \S.         SKS jjr!S9S jr"SLSMS  jjr#SNS! jr$    SOS" jr%    SPS# jr&SQS$ jr'SRS% jr(SSS& jr)STS' jr*SUS( jr+    SVS) jr,    SWS* jr-SXS+ jr.SYS, jr/SZS- jr0S[S. jr1S\S/ jr2S]S0 jr3S^S1 jr4S_S2 jr5S_S3 jr6S`S4 jr7SaS5 jr8S6r9U =r:$ )br   i  a  
A session for the OpenAI Realtime API.

This class is used to interact with the OpenAI Realtime API.
It is responsible for sending events to the OpenAI Realtime API and receiving events from it.

It exposes two more events:
- openai_server_event_received: expose the raw server events from the OpenAI Realtime API
- openai_client_event_queued: expose the raw client events sent to the OpenAI Realtime API
c                  > [         TU ]  U5        Xl        [        R                  R                  5       U l        [        R                  R                  [        [        [        [        4   -     " 5       U l        S U l        S U l        ["        R$                  " U R'                  5       SS9U l        U R+                  U R-                  5       5        0 U l        0 U l        0 U l        S U l        [        R6                  R9                  5       U l        ["        R<                  " 5       U l        ["        R<                  " 5       U l         [        RB                  RE                  [F        [H        [F        S-  S9U l%        SU l&        g )NzRealtimeSession._main_taskname
   )samples_per_channelr   )'r   r   _realtime_modelr   ToolContextempty_toolsr   aioChanr8   dictr   r   _msg_ch_input_resampler_instructionsasynciocreate_task
_main_task_main_atask
send_event_create_session_update_event_response_created_futures_item_delete_future_item_create_future_current_generationremote_chat_contextRemoteChatContext_remote_chat_ctxLock_update_chat_ctx_lock_update_fnc_ctx_lockrr   AudioByteStreamSAMPLE_RATENUM_CHANNELS_bstream_pushed_duration_s)r   realtime_modelr   s     rn   r   RealtimeSession.__init__  s   (.<oo++-yy~~&9DcN&JKM;?)-"..t/@Gcd99;<`b&>@ >@ ?C  # 7 7 I I K%,\\^"$+LLN! 33;";L 4 
 *+rp   c                    [         R                  " [        R                  R                  R
                  5         U R                  R                  U5        S S S 5        g ! , (       d  f       g = fr   )
contextlibsuppressr   rH  channel
ChanClosedrK  send_nowaitr   r   s     rn   rR  RealtimeSession.send_event4  s>      !2!2!=!=>LL$$U+ ?>>s   A
A,rM   c                  ^ ^#    SnT R                   R                  R                  R                  nSU U4S jjnSnT R                  R
                  (       dj   T R                  5       I S h  vN mU(       a  U" 5       I S h  vN   SnT R                  T5      I S h  vN   SnT R                  R
                  (       d  Mi  g g  NV NB N)! [         Ga  nUS:X  d  UR                  (       d  T R                  USS9  e X:X  a6  T R                  USS9  [        T R                   R                   SU S35      UeT R                  USS9  T R                   R                  R                  R                  U5      n[        R                  " T R                   R                   SU S	3UXS
.S9  [         R"                  " U5      I S h  vN    US-  n S nAGN0S nAf[$         a  nT R                  USS9  e S nAff = f7f)Nr   c                   >#    [         R                  " STR                  R                   3STR                  R                  R
                  0S9  / n U R                  TR                  5       5        TR                  R                  5       nU(       a   U R                  TR                  U5      5        TR                  R                  SSSSSS9nTR                  n[        R                  R!                  5       Tl        U R#                  TR%                  U5      5         U  H  n['        U[(        5      (       a  UR+                  SSSS9nTR                  R                  R,                  (       a0  TR                  R                  R.                  (       a  [1        U5        TR3                  SU5        TR5                  [6        R8                  " U5      5      I S h  vN   M     TR>                  RA                  5        H?  nURC                  5       (       a  M  URE                  [        RF                  " S5      5        MA     TR>                  RI                  5         TRK                  S5        [         R                  " STR                  R                   35        TR3                  S[        RL                  " 5       5        g  N! [:         a.  nUTl        [=        S	TR                  R                   S
3S9UeS nAff = f7f)Nzreconnecting to r   extraT)exclude_function_callexclude_instructionsexclude_empty_messageexclude_handoffexclude_config_updateFrf   openai_client_event_queuedzFailed to send message to z during session re-connectionmessagez6pending response discarded due to session reconnectionzsession reconnectionzreconnected to session_reconnected)'rN   debugrD  r   r   r   appendrS  rG  flatten_create_tools_update_eventchat_ctxcopyrZ  r   rX  rY  extend_create_update_chat_ctx_events
isinstancer   rk   r   r   r   emitsend_strjsondumps	Exceptionr   rT  valuesdoneset_exceptionRealtimeErrorclear_close_current_generationRealtimeSessionReconnectedEvent)	eventsr   r~  old_chat_ctxevefutr   ws_conns	          rn   
_reconnect.RealtimeSession._main_task.<locals>._reconnect=  sr    LL"4#7#7#G#G"HI-t/C/C/I/I/^/^_
 BDF MM$;;=> KK'')Ed==eDE }}))&*%)&* $&* * H  00L$'$;$;$M$M$OD!MM$==hGH B!"i00]]%)PU + 
 ,,22;; 0066BB5b9II:B?!**4::b>::: !. 55<<>xxzz%%))*bc ?
 **002**+ABLL?4+?+?+O+O*PQRII+S-P-P-RS% ; (4%(4T5I5I5Y5Y4ZZwx 	sD   DK:B:J? J=J? "0K:B'K:=J? ?
K7	)K22K77K:Frecoverablez connection failed after z	 attemptsTz  connection failed, retrying in s)attemptmax_retries)exc_inforp  rP   r%  )rD  r   r   	max_retryrK  closed_create_ws_conn_run_wsr   	retryable_emit_errorr   r   _interval_for_retryrN   r   rN  sleepr  )r   num_retriesr  r  reconnectingr  retry_intervalr  s   `      @rn   rP  RealtimeSession._main_task8  s    **00==GG=	T =	T~ ,,%%  $ 4 4 66$,&&"#Kll7+++:  LG ,,%%%6&+ !!#1;;$$QE$: /$$QE$:,//??@@YZeYffop $$QD$9%)%9%9%?%?%L%L%`%`#&N NN//??@@`ao`ppqr!"*5R
 "--777q     6s   AG7C +C,C CC CC !G7 G7C C C G4C-G G
GG7G4G//G44G7c                  #    SS0nU R                   R                  R                  (       a  U R                   R                  R                  (       a&  SU R                   R                  R                   3US'   U R                   R                  R                  (       a#  U R                   R                  R                  US'   O&SU R                   R                  R                   3US'   [        U R                   R                  R                  U R                   R                  R                  U R                   R                  R                  U R                   R                  R                  U R                   R                  R                  S9n[        (       a  [        R                  " SU 35        [        R                  " 5       n [        R                   " U R                   R#                  5       R%                  X!S9U R                   R                  R&                  R(                  5      I S h  vN nU R+                  [        R                  " 5       U-
  5        U$  N-! [,        R.                   a(  n[1        U R                   R2                   S	35      UeS nAf[        R4                   a&  n[1        U R                   R2                   S
3S9UeS nAff = f7f)Nz
User-AgentzLiveKit AgentszBearer Authorizationzapi-key)r   r   r   zconnecting to Realtime API: )r7  headersz client connection errorz connection timed outrw  )rD  r   r   r   r   r=  r   r}   r   r   lk_oai_debugrN   rz  timeperf_counterrN  wait_forr  
ws_connectr   timeout_report_connection_acquiredr  ClientErrorr   r   TimeoutError)r   r  r7  t0r-  r  s         rn   r  RealtimeSession._create_ws_conn  sE    !12%%..##))55-4T5I5I5O5O5[5[4\+](##))11%)%9%9%?%?%G%G	")01E1E1K1K1S1S0T'UGO$  &&//  &&,,))//88,,22>>!1177HH
 <LL7u=> 	''$$99;FF3F`$$**77?? B ,,T->->-@2-EFI "" 	$''7788PQ ## 	$//??@@UV	sI   G KA'I *I+,I KI K.#JK(!K		KKc                0  ^ ^^	#    Sm	[         R                  " [        S9SU	U U4S jj5       n[         R                  " [        S9SU	U U4S jj5       n[        R                  " U" 5       SS9[        R                  " U" 5       SS9/nS nT R
                  R                  R                  bX  [        R                  " [        R                  " T R
                  R                  R                  5      SS9nUR                  U5         [        R                  " U[        R                  S	9I S h  vN u  pgU H  nX:w  d  M
  UR                  5         M     U(       a6  XV;   a1  T R                  (       a   T R                  R                  I S h  vN   S
m	[         R                  R                   " U6 I S h  vN   TR#                  5       I S h  vN   g  N NF N! N! [         R                  R                   " U6 I S h  vN    TR#                  5       I S h  vN    f = f7f)NFrM   c                   >#    TR                     S h  vN n  [        U [        5      (       a  U R                  SSSS9n TR                  R
                  R                  (       a0  TR                  R
                  R                  (       a  [        U 5        TR                  SU 5        TR                  [        R                  " U 5      5      I S h  vN   [        (       a=  U R                  5       nUS   S:X  a  0 UESS0En[        R                   " S	U 35        GM  GM   GN NR! ["         a    [        R$                  " S
5         GM8  f = f
 SmTR'                  5       I S h  vN    g 7f)NTFrf   rv  r   input_audio_buffer.appendrr   ...z>>> zfailed to send event)rK  r  r   rk   rD  r   r   r   r   r  r  r  r  r  r  rN   rz  r  	exceptionr  )msgmsg_copyclosingr   r  s     rn   
_send_task+RealtimeSession._run_ws.<locals>._send_task  s1     "\\ =c=!#y11!nn%)PU -  ,,22;; 0066BB5c:II:C@!**4::c?;;;#|#&88:#F+/JJ'C('CGU'CHtH:%67 $%=  < ! =$$%;<<=1 *6 G--/!!sb   E)EDEE)B5D$D"A	D$E)E"D$$ E	E)E		E)"E%#E)c                 J
  >#     TR                  5       I S h  vN n U R                  [        R                  R                  [        R                  R
                  [        R                  R                  4;   a(  T(       a  g [        TR                  R                   S3S9eU R                  [        R                  R                  :w  a  M  [        R                  " U R                  5      nTR                  R                  R                  (       a.  UR!                  SS5      n["        R!                  U5      nUb  X1S'   TR%                  SU5         [&        (       a:  UR)                  5       nUS   S:X  a  0 UESS0En[*        R,                  " S	U 35        US   S
:X  a'  TR/                  [0        R2                  " S 0 UD65        GOUS   S:X  a'  TR5                  [6        R2                  " S 0 UD65        GOUS   S:X  a'  TR9                  [:        R2                  " S 0 UD65        GOUS   S:X  a'  TR=                  [>        R2                  " S 0 UD65        GOUS   S:X  a'  TRA                  [B        R2                  " S 0 UD65        GOZUS   S:X  a'  TRE                  [F        R2                  " S 0 UD65        GO*US   S:X  a'  TRI                  [J        R2                  " S 0 UD65        GOUS   S:X  a  GOUS   S:X  a'  TRM                  [N        R2                  " S 0 UD65        GOUS   S:X  a'  TRQ                  [R        R2                  " S 0 UD65        GOUS   S:X  a'  TRU                  [V        R2                  " S 0 UD65        GO_US   S:X  a'  TRY                  [Z        R2                  " S 0 UD65        GO/US   S:X  a  TR]                  U5        GOUS   S:X  a&  TR_                  [`        R2                  " S 0 UD65        OUS   S:X  a&  TRc                  [d        R2                  " S 0 UD65        OUS   S:X  a&  TRg                  [h        R2                  " S 0 UD65        OUS   S:X  a&  TRk                  [l        R2                  " S 0 UD65        OWUS   S:X  a&  TRo                  [p        R2                  " S 0 UD65        O([&        (       a  [*        R,                  " SUS    3SU0S9  GM   GN! [r         a1    US   S:X  a  US   S S S-   US'   [*        Rt                  " SSU0S9   N@f = f7f)!Nz connection closed unexpectedlyrw  r   r   openai_server_event_receivedra   deltar  z<<< z!input_audio_buffer.speech_startedz!input_audio_buffer.speech_stoppedzresponse.createdzresponse.output_item.addedzresponse.content_part.addedrc   zconversation.item.deletedz1conversation.item.input_audio_transcription.deltaz5conversation.item.input_audio_transcription.completedz2conversation.item.input_audio_transcription.failedr^   r_   r`   rb   zresponse.output_item.donezresponse.doneerrorzunhandled event: r   ro  rB  zfailed to handle eventr   );receiver   r  	WSMsgTypeCLOSEDCLOSECLOSINGr   rD  r   TEXTr  loadsdatar   r   r   rd   r  r  r  rN   rz  )_handle_input_audio_buffer_speech_startedr1   	construct)_handle_input_audio_buffer_speech_stoppedr2   _handle_response_createdrB   "_handle_response_output_item_addedrE   #_handle_response_content_part_addedrA   _handle_conversion_item_addedr'   _handle_conversion_item_deletedr)   ;_handle_conversion_item_input_audio_transcription_completedr+   8_handle_conversion_item_input_audio_transcription_failedr,   _handle_response_text_deltarG   _handle_response_text_donerH   '_handle_response_audio_transcript_delta_handle_response_audio_deltar>   _handle_response_audio_doner?   !_handle_response_output_item_donerF   _handle_response_donerD   _handle_errorr:   r  r  )r  r   
event_type
normalized
event_copyr  r   r  s        rn   
_recv_task+RealtimeSession._run_ws.<locals>._recv_task  s    #OO--88%%,,%%++%%--  
  -#'#7#7#G#G"HHg h  88w00555

388,
 ''--66!&62!6J!5!9!9*!EJ!-(2f 		8%@FW#|%*ZZ\
%f-1NN)GJ)G)GJtJ<%89V}(KKFF>HHQ5Q v*MMFF>HHQ5Q v*<<556J6T6T6]W\6]^v*FF??8BBKUK v*GG@@9CCLeL v*CC::;P;Z;Z;c]b;cdv*EE<<8BBKUK v*]] v*aaXXQ[[d^cd v*^^UUNXXa[`a v*FF889O9Y9Y9b\a9bcv*EE778M8W8W8`Z_8`av*RRDDUKv*GG993==FF v*FF889O9Y9Y9b\a9bcv*EE>>7AAJEJ v/9223D3N3N3WQV3WXv'1**+=+G+G+P%+PQ%'8v%HQXZ_P`aG -F ! WV}(EE).w)<u)Dg$$%=guEUVWs  T#S"D6T#A3S% T#.S% 3T#5.S% #T#%.S% T#.S% T#.S% 3T#5.S% #T#%	S% .T#0.S% T# .S% T#.S% >T# .S% .T#0S% 
T#.S% :T#;.S% )T#*.S% T#.S% T#.S% 6T#7(S% T#%8T T#T  T#r  r@  r  _timeout_task)return_whenTr%  )r   log_exceptionsrN   rN  rO  rD  r   r   r  r{  waitFIRST_COMPLETEDresultrW  r   rH  cancel_and_waitr  )
r   r  r  r  taskswait_reconnect_taskr  _taskr  s
   ``       @rn   r  RealtimeSession._run_ws  s    			V	,	" 	" 
-	"@ 
		V	,h	W h	W 
-h	WV 
<@
<@
 48%%::F")"5"5d2288MMN$# LL,-	"#LLG<S<STTGD .KKM  #':'BtG_G_..8888 ))++U333--/!! U 9 4! ))++U333--/!!s   C<H&G (G
)G ;A
G GG  H,G-HGH
G G HH!H3G64HHHHc                    U R                   R                  R                  (       aH  U R                   R                  R                  (       a#  [	        S[        U5      US9R                  SSSS9$ [        SUUS9$ )zWrap a session object in the appropriate event type.

For Azure, converts the new-style session to the old flat format
and returns a dict (since AzureSessionUpdateEvent is not part of
the RealtimeClientEvent union).
zsession.update)r   r   event_idTFrf   )rD  r   r   r   AzureSessionUpdateEventr   rk   r%   )r   r  r   s      rn   _wrap_session_update$RealtimeSession._wrap_session_updatet  ss     %%..43G3G3M3M3Y3Y*%-g6! j$dUjS	T "!
 	
rp   c                   [         R                  R                  [        SS9nSU R                  R
                  R                  ;   a  SOSnU R                  R
                  n[        SUR                  U/[        [        UUR                  UR                  UR                  S9[        UUR                  UR                   S9S9UR"                  [%        UR&                  5      UR(                  S	9nU R*                  b  U R*                  Ul        UR.                  b  UR.                  Ul        U R1                  [2        R4                  " S
5      US9$ )Nz	audio/pcm)rater   rr   rs   r   )formatr   r   rz   )r  r|   r{   )r   r   )r   r}   r   rr   r   r   r   session_update_r  r   )r   realtime_audio_formatsAudioPCMr_  rD  r   rt   r=   r}   r4   r5   rx   ry   rz   r6   r|   r{   r   rZ   r   r   rM  r~   r   r  r   	shortuuid)r   audio_formatmodalityoptsr   s        rn   rS  ,RealtimeSession._create_session_update_event  s+   66??[Wb?c%)=)=)C)C)N)NN7TZ##)).**'j%.'$($D$D"&"@"@#'#6#6	 1'**** #==*4+;+;<LL'
* )#'#5#5G ??&!%G((__%67 ) 
 	
rp   c                6    U R                   R                  5       $ r   )rZ  to_chat_ctxr   s    rn   r~  RealtimeSession.chat_ctx  s    $$0022rp   c                6    U R                   R                  5       $ r   )rG  r  r   s    rn   r   RealtimeSession.tools  s    {{!!rp   )	r   r{   rz   r   ry   rx   r|   r   r   c       	        B   [        SS9n
Sn[        U5      (       a[  [        U R                  R                  R
                  5      n[        U5      nXR                  R                  l        X:w  a  Xl        Sn[        U5      (       aF  U R                  R                  R                  U:w  a  XJl        SnX@R                  R                  l        [        U5      (       aF  U R                  R                  R                  U:w  a  Xl        SnXR                  R                  l        [        U	5      (       aF  U R                  R                  R                  U	:w  a  Xl	        SnXR                  R                  l	        Sn[        5       n[        5       n[        UUS9n[        U5      (       aF  U R                  R                  R                  U:w  a  X/l        SnX R                  R                  l        [        U5      (       aG  U R                  R                  R                  U:w  a	  UUl        SnX0R                  R                  l        [        U5      (       aG  U R                  R                  R                  U:w  a	  UUl        SnXPR                  R                  l        [        U5      (       aR  [#        U5      nU R                  R                  R$                  U:w  a	  UUl        SnX`R                  R                  l        [        U5      (       aF  U R                  R                  R(                  U:w  a  Xl        SnXpR                  R                  l        U(       a	  UU
l        SnU(       a4  U R-                  U R/                  [0        R2                  " S5      U
S95        g g )Nr   r   FT)r   r   options_update_r  )r=   r   rZ   rD  r   r   r   r   r   r   r6   r5   r4   r{   rz   ry   r   rY   rx   r   r|   rr   rR  r  r   r  )r   r   r{   rz   r   ry   rx   r|   r   r   r   has_changescurrent_oainext_oaihas_audio_configr   audio_inputaudio_configs                     rn   r  RealtimeSession.update_options  s    /J?K  ,T-A-A-G-G-S-STK)+6H5@  &&2&&.#".//##))DDHbb,F)"D^  &&AG##))11W<")"18  &&.J##))44
B%/""4>  &&1 02.0*,kRE??##))//58%*"#' /4  &&,N####))88NJ-;*#' 8F  &&5-..##))CCG``,E)#' C\  &&@/00*<=X*Y'$$**FF./ /J+#' E`  &&BE??##))//58%*"#' /4  &&,(GMKOO))"__->? *  rp   c                  #    U R                    IS h  vN   UR                  SSS9n[        U5        U R                  U5      n/ nU H  nUR	                  [
        R                  S    " 5       =n5        [        U[        5      (       a  XPR                  UR                  '   OP[        U[        5      (       a;  UR                  R                  c   eXPR                  UR                  R                  '   U R                  U5        M     U(       d   S S S 5      IS h  vN   g  [
        R                   " [
        R"                  " USS06SS9I S h  vN   S S S 5      IS h  vN   g  GNP NK N! [
        R$                   a    U H  n[        U[        5      (       a(  U R                  R'                  UR                  S 5        M@  [        U[        5      (       d  MW  UR                  R                  c   eU R                  R'                  UR                  R                  S 5        M     [(        R*                  " S5      S ef = f N! , IS h  vN  (       d  f       g = f7f)NTrt  ru  return_exceptionsg      @)r  zupdate_chat_ctx timed out.)r\  r  r   r  r{  rN  Futurer  r*   rU  item_idr(   r   idrV  rR  r  gatherr  r5  r   r  )r   r~  r  futsr  fs         rn   update_chat_ctxRealtimeSession.update_chat_ctx  s    ---}} $&* % H
  )88BF/1D!5!77A8b"=>>;<,,RZZ8$?@@77::111;<,,RWWZZ8#  + .--,P&&w~~t'Tt'T^abbb/ .--. c'' 	P !B!"&ABB0044RZZF#B(CDD!wwzz5550044RWWZZF ! ''(DE4O	P1 .---s   IE#IC8IIE&I!,E*E(E*IH?I&I(E**A)H<A%H<<I?III
IIc                  ^^^	 / mU R                   R                  5       m	[        R                  R	                  T	T5      nSU4S jjnSUU4S jjnSU	4S jjnUR
                   H  nU" U5      (       a  M  U" U5        M     UR                   H  u  pvU" Xv5        M     UR                   H$  u  pvU" U5      (       a  M  U" U5        U" Xv5        M&     T$ )Nc           	     b   > TR                  [        SU [        R                  " S5      S95        g )Nzconversation.item.deletechat_ctx_delete_)r   r  r  )r{  r*   r   r  )msg_idr  s    rn   _delete_itemDRealtimeSession._create_update_chat_ctx_events.<locals>._delete_item@  s*    MM+3""__-?@rp   c           
        > TR                  U5      nUc   eTR                  [        S[        U5      U c  SOU [        R
                  " S5      S95        g )Nconversation.item.createrootchat_ctx_create_)r   r   previous_item_idr  )	get_by_idr{  r(   rV   r   r  )previous_msg_idr  	chat_itemr~  r  s      rn   _create_itemDRealtimeSession._create_update_chat_ctx_events.<locals>._create_itemI  sU     **62I(((MM+34Y?0?0Gf_"__-?@	rp   c                z   > TR                  U 5      nU(       a"  UR                  S:X  a  UR                  (       d  gg)Nrx  TF)r&  r   r   )r  remote_item
remote_ctxs     rn   _is_content_emptyIRealtimeSession._create_update_chat_ctx_events.<locals>._is_content_emptyU  s1    $..v6K{//9<[EXEXrp   )r  r   r"  r#  )r'  r   r  r   r"  r#  )r  r   r"  r   )rZ  r  r   r   compute_chat_ctx_diff	to_remove	to_create	to_update)
r   r~  diff_opsr  r)  r.  r  r'  r  r-  s
    `      @@rn   r  .RealtimeSession._create_update_chat_ctx_events9  s     SU**668
9922:xH	
	 
		 ((F !((  ) (0'9'9#O1 (: (0'9'9#O !(( 1 (: rp   c           	       #    U R                    IS h  vN   U R                  U5      nU R                  U5        [        5       nUS   S    H.  nUR	                  S5      =n(       d  M  UR                  U5        M0     U Vs/ s Ho  n[        U[        R                  [        R                  45      (       a  UR                  R                  U;   d!  [        U[        R                  5      (       d  Mm  UPMq     nn[        R                  " U5      U l        S S S 5      IS h  vN   g  GNs  snf  N! , IS h  vN  (       d  f       g = f7f)Nr   r   rA  )r]  r}  rR  setr   r  r  r   FunctionToolRawFunctionToolinforA  ProviderToolrE  rG  )r   r   r  retained_tool_namestrA  toolretained_toolss           rn   update_toolsRealtimeSession.update_toolsq  s     ,,,007BOOB,/E	]7+55=(4('++D1 , "!Dtc&6&68K8K%LMM		*==dC$4$45 !   //.9DK% -,, -,,,sd   E
D&E
AD0)D0A,D)2D)8D0E
 D.!E
)D0.E
0E6D97EE
c                   / nU GH  n[        U[        R                  5      (       a  [        R                  R	                  USS9nO[        U[        R
                  5      (       a7  [        UR                  R                  5      nUR                  SS 5        SUS'   OQ[        U[        R                  5      (       a  M  [        R                  " U R                  R                   S3SU0S9  M   [        R                   " U5      nUR#                  U5        GM     U$ ! [$         a3    [        R                  " U R                  R                   S	3SU0S9   GMT  f = f)
NT)internally_taggedmetafunctionr   z doesn't support this tool typer>  ro  z doesn't support this tool)r  r   r8  r   build_legacy_openai_schemar9  rJ  r:  
raw_schemar5  r;  rN   r  rD  r   r;   rj   r{  r   )r   r   	oai_toolsr>  	tool_descsession_tools         rn   _convert_tools_to_oai%RealtimeSession._convert_tools_to_oai  s0   02	D$ 0 011II@@Y]@^	D#"5"566 !5!56	fd+$.	&!D#"2"233++;;<<[\!4. 3BB9M  .' 6  # ++;;<<VW!9- s   /'D8EEc           	         U R                  U5      nU R                  [        R                  " S5      [        R
                  " SU R                  R                  R                  US9S9n[        U[        5      (       a  U$ UR                  SSSS9$ )Ntools_update_r   )r   r}   r   r  TFrf   )rK  r  r   r  r=   r   rD  r   r}   r  rJ  rk   )r   r   rH  r   s       rn   r}  *RealtimeSession._create_tools_update_event  s    ..u5	))___50@@**0066 * 
 eT""LTTYZZrp   c           
        #    U R                  U R                  [        R                  " S5      [        R
                  " SUS9S95        Xl        g 7f)Ninstructions_update_r   )r   r~   r  )rR  r  r   r  r=   r   rM  )r   r~   s     rn   update_instructions#RealtimeSession.update_instructions  sM     %%)?@4DD#!- & 	
 *s   AAc           
     v   U R                  U5       H  nUR                  R                  5       nU R                  R	                  U5       Hh  nU R                  [        S[        R                  " UR                  5      R                  S5      S95        U =R                  UR                  -  sl
        Mj     M     g )Nr  zutf-8)r   rr   )_resample_audior  tobytesra  writerR  r.   base64	b64encodedecoderb  duration)r   framer  r  nfs        rn   
push_audioRealtimeSession.push_audio  s    %%e,A66>>#Dmm))$//8$..rww7>>wG ''2;;6' 0 -rp   c           	         [         R                  " S[         R                  " US9/S9n[        U5      nU R	                  [        SU[        R                  " S5      S95        g )Nuser)image)roler   r"  video_)r   r   r  )r   ChatMessageImageContentrV   rR  r(   r   r  )r   r\  rx  oai_items       rn   
push_videoRealtimeSession.push_video  sV    //%%E23
 /w7'/2	
rp   c                d    U R                   S:  a   U R                  [        SS95        SU l         g g )Ng?zinput_audio_buffer.commitr  r   )rb  rR  r0   r   s    rn   commit_audioRealtimeSession.commit_audio  s0    ""S(OO7=XYZ&'D# )rp   c                B    U R                  [        SS95        SU l        g )Nzinput_audio_buffer.clearr  r   )rR  r/   rb  r   s    rn   clear_audioRealtimeSession.clear_audio  s    28RST"#rp   )r~   r   r   c               z  ^ ^^^ [         R                  " S5      m[        R                  [        R
                     " 5       mTT R                  T'   [        U5      (       a"  T R                  (       a  T R                   SU 3n[        U=(       d    S ST0S9n[        U5      (       a  [        U5      Ul        [        U5      (       a  T R                  U5      Ul        T R                  [        STUS95        S
UUU 4S jjn[        R                   " 5       R#                  SU5      mTR%                  U4S	 j5        T$ )Nresponse_create_
client_event_id)r~   metadatazresponse.create)r   r  responsec                    > TR                   R                  T S 5        T(       a<  TR                  5       (       d&  TR                  [        R
                  " S5      5        g g g )Nzgenerate_reply timed out.)rT  r5  r  r  r   r  )r  r  r   s   rn   _on_timeout3RealtimeSession.generate_reply.<locals>._on_timeout  sG    **..x>388::!!#"3"34O"PQ &srp   g      $@c                $   > TR                  5       $ r   )cancel)r  handles    rn   <lambda>0RealtimeSession.generate_reply.<locals>.<lambda>  s    rp   r%  )r   r  rN  r  r   GenerationCreatedEventrT  r   rM  r<   rZ   r   rK  r   rR  rC   get_event_loop
call_lateradd_done_callback)	r   r~   r   r   paramsrw  r  r  r{  s	   `     @@@rn   generate_replyRealtimeSession.generate_reply  s    ??#56nnS778:36&&x0L!!d&8&8 #001L>BL-%-'2
 K  !3K!@FE??55e<FL%6TZ[	
	R 	R
 '')44T;G78
rp   c                \    U R                   S L=(       d    [        U R                  5      S:  $ )Nr   )rW  lenrT  r   s    rn   has_active_generation%RealtimeSession.has_active_generation  s)    ''t3^s4;Y;Y7Z]^7^^rp   c                X    U R                   (       d  g U R                  [        SS95        g )Nzresponse.cancelr  )r  rR  r@   r   s    rn   	interruptRealtimeSession.interrupt  s!    ))+1BCDrp   )r   c          	        SU;   a  U R                  [        SSUUS95        g [        R                  " U5      (       a  U R                  R                  SSS9nUR                  U5      =nbw  [
        R
                  " UR                  U   5      nUR                  S:X  d   eU/Ul	        XuR                  U'   U R                  U5      nU H  n	U R                  U	5        M     g g g )Nrr   zconversation.item.truncater   )r   content_indexr  audio_end_msTr  rx  )rR  r-   r   r   r~  r  index_by_iditemsr   r   r  )
r   r   rt   r  r   r~  idxnew_itemr  r  s
             rn   truncateRealtimeSession.truncate  s     j OO-5"#&!-	 ^^,--}})) $&* * H  ++J77D99X^^C%89}}	111$4#5 &.s#<<XF BOOB' ! E .rp   c                   #    U R                  S5        U R                  R                  5         U R                  I S h  vN   g  N7f)Nzsession closed)r  rK  r  rQ  r   s    rn   r  RealtimeSession.aclose5  s3     &&'78s   ;AAAc                   U R                   b)  U R                   R                  R                  5       (       a  gU R                   R                  R	                  5        H  nUR
                  R                  5         UR                  R                  5         UR                  R                  5       (       a  MX  UR                  R                  U R                  R                  R                  5        M     U R                   R                  R                  5         U R                   R                  R                  5         [        R                  " [         R"                  5         U R                   R                  R                  S5        SSS5        SU l         U(       a  [$        R&                  " SU 35        gg! , (       d  f       N7= f)zClose all channels and resolve _done_fut for the current generation.

This prevents consumers from hanging indefinitely when a generation is
interrupted by a reconnection or session close.
Nz(in-progress generation discarded due to )rW  r   r  r   r  r   r  r   rt   
set_resultrD  r   r   r   rf  rg  rN  InvalidStateErrorrN   r   )r   reason
generations      rn   r  )RealtimeSession._close_current_generation:  s>    ##+t/G/G/Q/Q/V/V/X/X22;;BBDJ$$&%%'((--//%%001E1E1K1K1V1VW	 E 	  ,,224  ++113  !:!:;$$..99$? <#' NNEfXNO 	 <;s   &F44
Gc              #    #    U R                   (       a+  UR                  U R                   R                  :w  a  S U l         U R                   cU  UR                  [        :w  d  UR                  [
        :w  a-  [        R                  " UR                  [        [
        S9U l         U R                   (       a$  U R                   R                  U5       S h  vN   g Uv   g  N
7f)N)
input_rateoutput_ratenum_channels)	rL  sample_rate_input_rater_  r  r`  r   AudioResamplerpush)r   r\  s     rn   rU  RealtimeSession._resample_audioS  s         D$9$9$E$EE(,%  (,0B0Bl0R$'$6$6 ,,')%D!   ,,11%888K 9s   CCCCc                N    U R                  S[        R                  " 5       5        g )Ninput_speech_started)r  r   InputSpeechStartedEventr   r  s     rn   r  9RealtimeSession._handle_input_audio_buffer_speech_startedh  s     			(#*E*E*GHrp   c                    U R                   R                  R                  S LnU R                  S[        R
                  " US95        g )Ninput_speech_stopped)user_transcription_enabled)rD  r   ry   r  r   InputSpeechStoppedEvent)r   r  r  s      rn   r  9RealtimeSession._handle_input_audio_buffer_speech_stoppedm  sC       &&@@L 	# 			"''C]^	
rp   c                b   UR                   R                  c   S5       e[        [        R                  R                  5       [        R                  R                  5       0 [        R                  " 5       [        R                  " 5       S9U l	        [        R                  " U R                  R                  U R                  R                  SUR                   R                  S9n[        UR                   R                  [         5      (       a  UR                   R                  R#                  S5      =n(       ag  U R$                  R'                  US 5      =n(       aD  UR)                  5       (       d  SUl        UR-                  U5        O[.        R0                  " S5        U R3                  SU5        g )	Nzresponse.id is None)r   r   r   r   r   F)message_streamfunction_streamuser_initiatedresponse_idrs  Tz9response of generate_reply received after it's timed out.generation_created)ru  r  r   r   rH  rI  r  rN  r  rW  r   r~  r   r   r  rt  rJ  r   rT  r5  r  r  r  rN   r   r  )r   r   generation_evrs  r  s        rn   r  (RealtimeSession._handle_response_createdx  s0   ~~  ,C.CC,#6yy~~'		(#yy{nn&$
  2233>> 44@@ ))	
 u~~..55$)NN$;$;$?$?@Q$RRR66::?DQQQ88::/3,}-Z[		&6rp   c           	         U R                   c   S5       eUR                  R                  =nc   S5       eUR                  R                  =nc   S5       eUS:X  Ga#  [	        U[
        R                  R                  5       [
        R                  R                  5       [        R                  " 5       S9nU R                  R                  R                  (       d6  UR                  R                  5         UR                  R!                  S/5        U R                   R"                  R%                  [&        R(                  " UUR*                  UR                  UR                  S95        X@R                   R,                  U'   g g )Ncurrent_generation is Noneitem.id is Noneitem.type is Nonerx  )r   r   r   rt   rs   )r   text_streamaudio_streamrt   )rW  r   r  r   r   r   rH  rI  rN  r  rD  r   r   r   r  rt   r  r   rj  r   MessageGenerationr   r   r   r   r  	item_typeitem_generations        rn   r  2RealtimeSession._handle_response_output_item_added  s4   ''3Q5QQ3 ::==(5H7HH5"ZZ__,	9N;NN9	!0"		()">>+	O ''44AA((..0**55vh?$$//;;%%& / 7 7!0!9!9.99	 :I$$--g6' "rp   c                @   U R                   c   S5       eUR                  =nc   S5       eUR                  R                  =nc   S5       eUS:X  aS  U R                  R
                  R                  (       a.  [        R                  " SU R                  R                   S35        [        R                  " [        R                  5         U R                   R                  U   R                  R!                  US:X  a  S/OSS/5        S S S 5        g ! , (       d  f       g = f)Nr  item_id is Nonezpart.type is Noners   zText response received from z in audio modality.rr   )rW  r  partr   rD  r   r   rN   r   r   rf  rg  rN  r  r   rt   r  )r   r   r  r  s       rn   r  3RealtimeSession._handle_response_content_part_added  s    ''3Q5QQ3 ==(5H7HH5"ZZ__,	9N;NN94#7#7#D#D#Q#QNN.t/C/C/S/S.TTgh   !:!:;$$--g6AALL%/gv5F <;;s   >D
Dc           	        UR                   R                  c   S5       e [        UR                   5      nU R                  R	                  UR
                  U5        U R                  S[        R                  " UR
                  US95        U R                  R                  UR                   R                  S 5      =n(       aV  UR                  5       (       a/  [        R                   " SUR                   R                   S35        g UR#                  S 5        g g ! [         aC  n[        R                  " SUR                   R                   S[        U5       35         S nANS nAff = f)Nr  remote_item_added)r%  r   zfailed to insert item ``: zitem create future for `` was already cancelled)r   r  rW   rZ  insertr%  r  r   RemoteItemAddedEventr   rN   r   r   rV  r5  	cancelledr  r  )r   r   lk_itemr  r  s        rn   r  -RealtimeSession._handle_conversion_item_added  s   zz}}(;*;;(
	1%**=G!!(()?)?III#((%:P:PW^_ **..uzz}}dCC3C}}7

F]^_t$	 D  	NN)%**--CF8D 	s   A*D 
E%"9E  E%c           	        UR                   c   S5       e U R                  R                  UR                   5        U R                  R                  UR                   S 5      =n(       aL  UR                  5       (       a%  [        R                  " SUR                    S35        g UR                  S 5        g g ! [         a9  n[        R
                  " SUR                    S[        U5       35         S nANS nAff = f)Nr  zfailed to delete item `r  zitem delete future for `r  )r  rZ  deleter   rN   r   r   rU  r5  r  r  r  )r   r   r  r  s       rn   r  /RealtimeSession._handle_conversion_item_deleted  s    }}(;*;;(	!!((7 **..u}}dCC3C}}7F]^_t$	 D  	NN)%--CF8D 	s   %B5 5
C8?/C33C8c           
        [        UR                  5      nU R                  R                  UR                  5      =n(       aj  [        UR                  [        R                  5      (       d   eUR                  R                  R                  UR                  5        X#R                  l        U R                  S[        R                  " UR                  UR                  SUS95        g )N#input_audio_transcription_completedT)r  
transcriptis_final
confidence)rU   logprobsrZ  r   r  r  r   r   re  r   r{  r  transcript_confidencer  InputTranscriptionCompleted)r   r   r  r,  s       rn   r  KRealtimeSession._handle_conversion_item_input_audio_transcription_completed  s     8G
//33EMMBB;Bk..@@@@$$++E,<,<=5?2		1++ ++%		
rp   c                t    [         R                  " U R                  R                   S3SUR                  0S9  g )Nz! failed to transcribe input audior  ro  )rN   r  rD  r   rk  s     rn   r  HRealtimeSession._handle_conversion_item_input_audio_transcription_failed  s4     	##3344UVEKK(	
rp   c                   U R                   c   S5       eU R                   R                  UR                     nUR                  R                  (       a;  U R                   R
                  c$  [        R                  " 5       U R                   l        UR                  R                  UR                  5        U=R                  UR                  -  sl
        g Nr  )rW  r   r  r   r  r   r  r   rj  r  r   )r   r   r  s      rn   r  +RealtimeSession._handle_response_text_delta  s    ''3Q5QQ322;;EMMJ$$++((??G ?CiikD$$;++EKK8((EKK7(rp   c                ,    U R                   c   S5       eg r  rW  rk  s     rn   r  *RealtimeSession._handle_response_text_done      ''3Q5QQ3rp   c                "   U R                   c   S5       eUS   nUS   nUR                  S5      =nb  [        R                  " X4S9nU R                   R                  U   nUR
                  R                  U5        U=R                  U-  sl        g )Nr  r  r  
start_time)r  )rW  r   r   TimedStringr   r   rj  r   )r   r   r  r  r  r  s         rn   r  7RealtimeSession._handle_response_audio_transcript_delta  s    ''3Q5QQ3	"g))L11J>NN5@E22;;GD++E2((E1(rp   c           
     (   U R                   c   S5       eU R                   R                  UR                     nU R                   R                  c$  [        R                  " 5       U R                   l        UR
                  R                  5       (       d  UR
                  R                  SS/5        [        R                  " UR                  5      nUR                  R                  [        R                  " U[        [         [#        U5      S-  S95        g )Nr  rr   rs   rL   )r  r  r  rC  )rW  r   r  r   r  rt   r  r  rX  	b64decoder  r   rj  r   
AudioFramer_  r`  r  )r   r   r  r  s       rn   r  ,RealtimeSession._handle_response_audio_delta  s    ''3Q5QQ322;;EMMJ##::B>BiikD$$;))..00&&117F2CD,  ,,NN')$'IN		
rp   c                ,    U R                   c   S5       eg r  r  r  s     rn   r  +RealtimeSession._handle_response_audio_done1  r  rp   c                   U R                   c   S5       eUR                  R                  =nc   S5       eUR                  R                  =nc   S5       eUS:X  a;  [	        UR                  [
        5      (       a  U R                  UR                  5        g US:X  a  U R                   R                  U   nUR                  R                  5         UR                  R                  5         UR                  R                  5       (       d:  UR                  R                  U R                  R                  R                  5        g g g )Nr  r  r  function_callrx  )rW  r   r  r   r  r9   _handle_function_callr   r   r  r   rt   r  r  rD  r   r  s        rn   r  1RealtimeSession._handle_response_output_item_done4  s   ''3Q5QQ3 ::==(5H7HH5"ZZ__,	9N;NN9'JJJ<-
 -
 &&uzz2)#"66??HO##))+$$**,"--2244**55d6J6J6P6P6[6[\ 5	 $rp   c           	        U R                   c   S5       eUR                  c   S5       eUR                  c   S5       eUR                  c   S5       eUR                  c   S5       eU R                   R
                  R                  [        R                  " UR                  UR                  UR                  UR                  S95        g )Nr  r  zcall_id is Nonezname is Nonezarguments is None)r  call_idrA  	arguments)	rW  r  r  rA  r  r   rj  r   FunctionCall)r   r   s     rn   r  %RealtimeSession._handle_function_callF  s    ''3Q5QQ3ww"5$55"||':)::'yy$4n4$~~)>+>>)  ,,8877YY..		
rp   c                V   U R                   c  g U R                   c   S5       eU R                   R                  nU R                   R                  nU R                   R                  R	                  5        H  nUR
                  R                  (       d  UR
                  R                  5         UR                  R                  (       d  UR                  R                  5         UR                  R                  5       (       a  M  UR                  R                  U R                  R                  R                  5        M     U R                   R                  R                  5         U R                   R                  R                  5         U R                   R                  R!                  5        H  u  pVU R"                  R%                  U5      =n(       d  M)  ['        UR(                  [*        R,                  5      (       d  MT  UR(                  R.                  R1                  UR2                  5        M     [4        R6                  " [8        R:                  5         U R                   R<                  R                  S 5        S S S 5        S U l         UR>                  R@                  (       a#  UR>                  R@                  RC                  SS9O0 nU(       a  X2-
  OSn	[D        RD                  " 5       U-
  n
[G        UUR>                  RH                  =(       d    SU	U
UR>                  RJ                  S:H  U R                  RL                  UR%                  SS5      UR%                  S	S5      UR%                  S
S5      U
S:  a  UR%                  S	S5      U
-  OS[F        RN                  " UR%                  S0 5      R%                  SS5      UR%                  S0 5      R%                  SS5      UR%                  S0 5      R%                  SS5      [F        RP                  " UR%                  S0 5      R%                  S0 5      R%                  SS5      UR%                  S0 5      R%                  S0 5      R%                  SS5      UR%                  S0 5      R%                  S0 5      R%                  SS5      S9UR%                  S0 5      R%                  SS5      S9[F        RR                  " UR%                  S0 5      R%                  SS5      UR%                  S0 5      R%                  SS5      UR%                  S0 5      R%                  SS5      S9[U        U R                  RV                  U R                  RX                  S9S9nU R[                  SU5        U R]                  U5        g ! , (       d  f       GN%= f)Nr  T)ri   r   r  input_tokensr   output_tokenstotal_tokensinput_token_detailsaudio_tokenscached_tokenstext_tokenscached_tokens_detailsimage_tokens)r   r  r  )r  r  r   r  r  output_token_details)
model_namemodel_provider)	timestamp
request_idttftr[  r  labelr  r  r  tokens_per_secondr  r  rt  metrics_collected)/rW  r   r   r   r  r   r  r  r   rt   r  r  rD  r   r   r   r  rZ  r   r  r   r   re  r   r{  r   rf  rg  rN  r  r   ru  usagerk   r  r   r  statusr	  InputTokenDetailsCachedTokenDetailsOutputTokenDetailsr   r}   r   r  &_handle_response_done_but_not_complete)r   r   created_timestampfirst_token_timestampr  r  r  r,  r  r  r[  metricss               rn   r  %RealtimeSession._handle_response_doneW  s|   ##+''3Q5QQ3 44GG $ 8 8 O O22;;BBDJ%%,,""((*&&--##))+((--//%%001E1E1K1K1V1VW E 	  ,,224  ++113(,(@(@(I(I(O(O(Q$G#4488AAAz  #//H H   ((//0P0PQ	 )R   !:!:;$$..99$? <#'  GLnnFZFZENN  ++T+B`b 	 =R$8WY99;!22&'~~((.Bnn++{:&&,,>15))OQ7>15JRUV,eii;hF\] 4 F F"YY'<bAEEnVWX#ii(=rBFFXYZ!II&;R@DD]TUV&:&M&M %		*? DS0"5S*!&+@"!ES0"5S+!&+@"!ES0"5S+
' #YY'<bAEEnVWX!" "6!H!H!II&<bAEEmUVW"YY'=rBFF~WXY"YY'=rBFF~WXY"
 //55dFZFZFcFcC$
J 			%w/33E:a <;s   &V
V(c                :   UR                   R                  S:X  a  gU R                  R                  nUR                   R                  S:X  a  UR                   R                  (       ax  [        UR                   R                  S5      (       aS  [        UR                   R                  R                  SS5      nUR                   R                  R                  nU SU 3nOSnU S3nU R                  [        UUS	S
9S	S9  gUR                   R                  S;   aW  [        R                  " SUUR                   R                  UR                   R                  UR                   R                  S.S9  g[        R                  " SUR                   R                  5        g)a!  Handle response done but not complete, i.e. cancelled, incomplete or failed.

For example this method will emit an error if we receive a "failed" status, e.g.
with type "invalid_request_error" due to code "inference_rate_limit_exceeded".

In other failures it will emit a debug level log.
	completedNfailedr  r   unknownz" response failed with error type: z# response failed with unknown errorTrx  bodyr  r  >   r  
incompletez1%s response done but not complete with status: %s)r  event_response_statusro  zUnknown response status: %s)ru  r  rD  r   status_detailshasattrgetattrr  r  r   rN   rz  r  )r   r   provider_label
error_type
error_bodyrx  s         rn   r  6RealtimeSession._handle_response_done_but_not_complete  sP    >>  K/--==>>  H,~~,,9V9VX_1`1`$U^^%B%B%H%H&R[\
"^^::@@
+,,Nzl[!
+,,OP##" !  	 ^^""&AALLC%% % 1 1-2^^-B-B	 LL68M8MNrp   c                2   UR                   R                  R                  S5      (       a  g U R                  R                  n[
        R                   " U SUR                    3SUR                   0S9  U R                  [        U S3UR                   SS9SS9  g )	NzCancellation failedz returned an error: r  ro  z returned an errorTr  r  )r  rx  r1  rD  r   rN   r  r   )r   r   r!  s      rn   r  RealtimeSession._handle_error  s    ;;))*?@@--==25;;-@EKK(	
 	)**<=[[
  	 	
rp   c           
         U R                  S[        R                  " [        R                  " 5       U R                  R
                  UUS95        g )Nr  )r  r	  r  r  )r  r   RealtimeModelErrorr  rD  _label)r   r  r  s      rn   r  RealtimeSession._emit_error  s=    		""))+**11'		
rp   )ra  rW  rL  rM  rV  rU  rQ  rK  rb  rD  rZ  rT  rG  r\  r]  )rc  r   r"  r#  )r   z$RealtimeClientEvent | dict[str, Any]r"  r#  r%  )r"  aiohttp.ClientWebSocketResponse)r  r+  r"  r#  )r  r   r   r=   r"  #SessionUpdateEvent | dict[str, Any])r"  r,  )r"  llm.ChatContext)r"  zllm.ToolContext)r   r  r{   r  rz   z2NotGivenOr[RealtimeAudioInputTurnDetection | None]r   r$  ry   z%NotGivenOr[AudioTranscription | None]rx   r  r|   r  r   r  r   r  r"  r#  )r~  r-  r"  r#  )r~  r-  r"  z?list[ConversationItemCreateEvent | ConversationItemDeleteEvent])r   list[llm.Tool]r"  r#  )r   r.  r"  zlist[RealtimeFunctionTool])r   r.  r"  dict[str, Any])r~   r   r"  r#  )r\  rtc.AudioFramer"  r#  )r\  zrtc.VideoFramer"  r#  )r~   r  r   zNotGivenOr[llm.ToolChoice]r   zNotGivenOr[list[llm.Tool]]r"  z*asyncio.Future[llm.GenerationCreatedEvent])r"  r   )
r   r   rt   r   r  intr   r  r"  r#  r   )r  r   r"  r#  )r\  r0  r"  zIterator[rtc.AudioFrame])r  r1   r"  r#  )r  r2   r"  r#  )r   rB   r"  r#  )r   rE   r"  r#  )r   rA   r"  r#  )r   r'   r"  r#  )r   r)   r"  r#  )r   r+   r"  r#  )r   r,   r"  r#  )r   rG   r"  r#  )r   rH   r"  r#  r   r/  r"  r#  )r   r>   r"  r#  )r  r?   r"  r#  )r   rF   r"  r#  )r   r9   r"  r#  )r   rD   r"  r#  )r   r:   r"  r#  )r  r  r  r   r"  r#  );r   r   r   r   __doc__r   rR  r   r  rN   rP  r  r  r  rS  r'  r~  r   r   r  r  r  r@  rK  r}  rR  r^  rh  rk  rn  r  r  r  r  r  r  rU  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r)  r*  s   @rn   r   r     s   	+6, (g  )g R%Ni"V

&B
	,
."
H 3 3 " " :C!*MVNWKT #,.7<E\ 7\ 	\
 K\ %L\ $I\&
\ !\ ,\ :\ 
\|"PH6'6	H6p:,@[
*
7
(
$ )22;,5$ &$ 0	$
 *$ 
4$L _ _E -6( ( 3	(
 ( *( 
(B
P2*I3I	I
	
3	
		
7>I4%*% 
J
	
(
G
	
8R2
&R]$
"J;X)OV
(	
 	
rp   r   )r  rv  )rl   r   rm   ztype[BaseModel]r"  r   )r   r=   r"  r   r2  )FNN)r7  r   r}   r   r   r   r   r   r   r   r"  r   )
__future__r   rN  rX  rf  r  r  r   r  r   collections.abcr   dataclassesr   typingr   r   r   r   r	   r
   r   r   r  pydanticr   r   livekitr   livekit.agentsr   r   r   r   r   livekit.agents.metricsr   livekit.agents.metrics.baser   livekit.agents.typesr   r   r   r   livekit.agents.utilsr   livekit.agents.voice.generationr   openai.typesr   "openai.types.beta.realtime.sessionr   r   r    /openai.types.beta.realtime.session_update_eventr!   r   r"   r   r#   r   r$   r   r%   r  openai.types.realtimer&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   1openai.types.realtime.realtime_audio_config_inputrI   6openai.types.realtime.realtime_session_create_responserJ   )openai.types.realtime.realtime_truncationrK   logrN   modelsrO   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r_  r`  r   r&  r1  r   r  rd   r   ro   r   r   r   r   r   r   r=  r   r   rp   rn   <module>rI     s   "      	   $ ! ) ) B B  /  G G 7 0  * ? ! 
 % % % % % % % % % %L M I  #   8 -299.23 85'O&M97!:( n 62r*   .    
6 
6 
6N-C%% N-h #'"/	// / !	/
 / 	/d`
 \]^`
rp   