o
    h9                     @  s   d dl m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mZ dd
lmZ ddlmZ G dd deZG dd dZG dd dejZG dd deZG dd dejZdS )    )annotationsN)Callable)NotRequired	TypedDict   )MaybeAwaitable   )calculate_audio_length_ms)RealtimeAudioFormatRealtimeSessionModelSettings)RealtimeModelEvent)RealtimeModelSendEventc                   @  s*   e Zd ZU ded< 	 ded< 	 ded< dS )RealtimePlaybackStatez
str | Nonecurrent_item_idz
int | Nonecurrent_item_content_indexzfloat | None
elapsed_msN)__name__
__module____qualname____annotations__ r   r   V/var/www/html/openai_agents/venv/lib/python3.10/site-packages/agents/realtime/model.pyr      s   
 r   c                   @  sL   e Zd ZdZdddZdddZdddZdddZdddZdddZ	dS ) RealtimePlaybackTrackeraH  If you have custom playback logic or expect that audio is played with delays or at different
    speeds, create an instance of RealtimePlaybackTracker and pass it to the session. You are
    responsible for tracking the audio playback progress and calling `on_play_bytes` or
    `on_play_ms` when the user has played some audio.returnNonec                 C  s   d | _ d | _d | _d S )N)_format_current_item_elapsed_msselfr   r   r   __init__#   s   
z RealtimePlaybackTracker.__init__item_idstritem_content_indexintbytesc                 C  s   t | j|}| ||| dS )a  Called by you when you have played some audio.

        Args:
            item_id: The item ID of the audio being played.
            item_content_index: The index of the audio content in `item.content`
            bytes: The audio bytes that have been fully played.
        N)r	   r   
on_play_ms)r   r!   r#   r%   msr   r   r   on_play_bytes)   s   z%RealtimePlaybackTracker.on_play_bytesr'   floatc                 C  sB   | j ||fkr||f| _ || _dS | jdusJ |  j|7  _dS )a  Called by you when you have played some audio.

        Args:
            item_id: The item ID of the audio being played.
            item_content_index: The index of the audio content in `item.content`
            ms: The number of milliseconds of audio that have been played.
        Nr   r   )r   r!   r#   r'   r   r   r   r&   4   s
   

z"RealtimePlaybackTracker.on_play_msc                 C  s   d| _ d| _dS )zACalled by the model when the audio playback has been interrupted.Nr*   r   r   r   r   on_interruptedC   s   
z&RealtimePlaybackTracker.on_interruptedformatr
   c                 C  s
   || _ dS )zyWill be called by the model to set the audio format.

        Args:
            format: The audio format to use.
        N)r   )r   r,   r   r   r   set_audio_formatH   s   
z(RealtimePlaybackTracker.set_audio_formatr   c                 C  s<   | j du rddddS | jdusJ | j \}}||| jdS )z>Will be called by the model to get the current playback state.N)r   r   r   r*   )r   r!   r#   r   r   r   	get_stateP   s   

z!RealtimePlaybackTracker.get_stateN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   __doc__r    r(   r&   r+   r-   r.   r   r   r   r   r      s    




r   c                   @  s    e Zd ZdZejd	ddZdS )
RealtimeModelListenerz)A listener for realtime transport events.eventr   r   r   c                      dS )z:Called when an event is emitted by the realtime transport.Nr   r   r2   r   r   r   on_evente      zRealtimeModelListener.on_eventN)r2   r   r   r   )r   r   r   r0   abcabstractmethodr5   r   r   r   r   r1   b   s    r1   c                   @  sB   e Zd ZU dZded< 	 ded< 	 ded< 	 ded	< 	 d
ed< dS )RealtimeModelConfigz+Options for connecting to a realtime model.z4NotRequired[str | Callable[[], MaybeAwaitable[str]]]api_keyzNotRequired[str]urlzNotRequired[dict[str, str]]headersz)NotRequired[RealtimeSessionModelSettings]initial_model_settingsz$NotRequired[RealtimePlaybackTracker]playback_trackerN)r   r   r   r0   r   r   r   r   r   r9   k   s   
 r9   c                   @  s`   e Zd ZdZejdddZejdd
dZejdddZejdddZ	ejdddZ
dS )RealtimeModelzJInterface for connecting to a realtime model and sending/receiving events.optionsr9   r   r   c                   r3   )z6Establish a connection to the model and keep it alive.Nr   )r   r@   r   r   r   connect   r6   zRealtimeModel.connectlistenerr1   c                 C     dS )zAdd a listener to the model.Nr   r   rB   r   r   r   add_listener      zRealtimeModel.add_listenerc                 C  rC   )z!Remove a listener from the model.Nr   rD   r   r   r   remove_listener   rF   zRealtimeModel.remove_listenerr2   r   c                   r3   )zSend an event to the model.Nr   r4   r   r   r   
send_event   r6   zRealtimeModel.send_eventc                   r3   )zClose the session.Nr   r   r   r   r   close   r6   zRealtimeModel.closeN)r@   r9   r   r   )rB   r1   r   r   )r2   r   r   r   r/   )r   r   r   r0   r7   r8   rA   rE   rG   rH   rI   r   r   r   r   r?      s    r?   )
__future__r   r7   typingr   typing_extensionsr   r   util._typesr   _utilr	   configr
   r   model_eventsr   model_inputsr   r   r   ABCr1   r9   r?   r   r   r   r   <module>   s    E	$