o
    i}-                     @   s  d dl Z d dlZd dlmZ d dlZd dlm  mZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 zd dl8m9Z9 W n e:y   d dlm9Z9 Y nw dej;dej;fdd Z<ej=e%e#e-ee7e+ee3eeeeee5e>f Z?G d!d" d"e
Z@G d#d$ d$e
ZAdS )%    N)JSONDecodeError   )EventEmitterMixin	EventType)construct_type   )AgentV1AgentAudioDone)AgentV1AgentStartedSpeaking)AgentV1AgentThinking)AgentV1ConversationText)AgentV1Error)AgentV1FunctionCallRequest)AgentV1InjectAgentMessage)AgentV1InjectUserMessage)AgentV1InjectionRefused)AgentV1KeepAlive)AgentV1PromptUpdated)"AgentV1ReceiveFunctionCallResponse)AgentV1SendFunctionCallResponse)AgentV1Settings)AgentV1SettingsApplied)AgentV1SpeakUpdated)AgentV1UpdatePrompt)AgentV1UpdateSpeak)AgentV1UserStartedSpeaking)AgentV1Warning)AgentV1Welcome)WebSocketClientProtocolobjreturnc                 C   sR   t | trdd |  D S t | trdd | D S t | tr'|  r't| S | S )a  
    Recursively convert float values that are whole numbers to int.

    Workaround for Fern-generated models that type integer API fields
    (like sample_rate) as float, causing JSON serialization to produce
    values like 44100.0 instead of 44100. The Deepgram API rejects
    float representations of integer fields.

    See: https://github.com/deepgram/internal-api-specs/issues/205
    c                 S   s   i | ]	\}}|t |qS  _sanitize_numeric_types).0kvr    r    S/home/ubuntu/.local/lib/python3.10/site-packages/deepgram/agent/v1/socket_client.py
<dictcomp>2   s    z+_sanitize_numeric_types.<locals>.<dictcomp>c                 S   s   g | ]}t |qS r    r!   )r#   itemr    r    r&   
<listcomp>4   s    z+_sanitize_numeric_types.<locals>.<listcomp>)
isinstancedictitemslistfloat
is_integerint)r   r    r    r&   r"   &   s   

r"   c                       s   e Zd Zdef fddZdd Zdd Zded	d
fddZde	d	d
fddZ
ded	d
fddZded	d
fddZded	d
fddZd"deje d	d
fddZded	d
fddZded	d
fddZd	efddZdejd	d
fddZdejd	d
fd d!Z  ZS )#AsyncV1SocketClient	websocketc                      t    || _d S Nsuper__init__
_websocketselfr2   	__class__r    r&   r7   N      

zAsyncV1SocketClient.__init__c                 C  sB   | j 2 z3 d H W }t|tr|V  qttt|dV  q6 d S Ntype_object_r8   r*   bytesr   V1SocketClientResponsejsonloadsr:   messager    r    r&   	__aiter__R   s   
zAsyncV1SocketClient.__aiter__c              
      s   |  tjdI dH  zaz*| j2 z#3 dH W }t|tr|}nt|}tt	|d}|  tj
|I dH  q6 W n tyR } z|  tj|I dH  W Y d}~nd}~ww W |  tjdI dH  dS W |  tjdI dH  dS |  tjdI dH  w aH  
        Start listening for messages on the websocket connection.

        Emits events in the following order:
        - EventType.OPEN when connection is established
        - EventType.MESSAGE for each message received
        - EventType.ERROR if an error occurs
        - EventType.CLOSE when connection is closed
        Nr?   )_emit_asyncr   OPENr8   r*   rC   rE   rF   r   rD   MESSAGE	ExceptionERRORCLOSEr:   raw_messageparsed	json_dataexcr    r    r&   start_listeningY   s$   


 
.z#AsyncV1SocketClient.start_listeningrH   r   Nc                       |  |I dH  dS zt
        Send a message to the websocket connection.
        The message will be sent as a AgentV1Settings.
        N_send_modelrG   r    r    r&   send_settingsq      z!AsyncV1SocketClient.send_settingsc                    rW   zw
        Send a message to the websocket connection.
        The message will be sent as a AgentV1UpdateSpeak.
        NrY   rG   r    r    r&   send_update_speakx   r\   z%AsyncV1SocketClient.send_update_speakc                    rW   z}
        Send a message to the websocket connection.
        The message will be sent as a AgentV1InjectUserMessage.
        NrY   rG   r    r    r&   send_inject_user_message   r\   z,AsyncV1SocketClient.send_inject_user_messagec                    rW   z~
        Send a message to the websocket connection.
        The message will be sent as a AgentV1InjectAgentMessage.
        NrY   rG   r    r    r&   send_inject_agent_message   r\   z-AsyncV1SocketClient.send_inject_agent_messagec                    rW   z
        Send a message to the websocket connection.
        The message will be sent as a AgentV1SendFunctionCallResponse.
        NrY   rG   r    r    r&   send_function_call_response   r\   z/AsyncV1SocketClient.send_function_call_responsec                    s   |  |pt I dH  dS zu
        Send a message to the websocket connection.
        The message will be sent as a AgentV1KeepAlive.
        NrZ   r   rG   r    r    r&   send_keep_alive   s   z#AsyncV1SocketClient.send_keep_alivec                    rW   zx
        Send a message to the websocket connection.
        The message will be sent as a AgentV1UpdatePrompt.
        NrY   rG   r    r    r&   send_update_prompt   r\   z&AsyncV1SocketClient.send_update_promptc                    rW   zj
        Send a message to the websocket connection.
        The message will be sent as a bytes.
        N_sendrG   r    r    r&   
send_media   r\   zAsyncV1SocketClient.send_mediac                    s6   | j  I dH }t|tr|S t|}tt|dS )B
        Receive a message from the websocket connection.
        Nr?   r8   recvr*   rC   rE   rF   r   rD   r:   datarT   r    r    r&   rp      s   

zAsyncV1SocketClient.recvrr   c                    s,   t |trt|}| j|I dH  dS z=
        Send a message to the websocket connection.
        Nr*   r+   rE   dumpsr8   sendr:   rr   r    r    r&   rl      s   

zAsyncV1SocketClient._sendc                    s   |  t| I dH  dS zD
        Send a Pydantic model to the websocket connection.
        Nrl   r"   r+   rw   r    r    r&   rZ      s   zAsyncV1SocketClient._send_modelr4   )__name__
__module____qualname__r   r7   rI   rV   r   r[   r   r^   r   r`   r   rb   r   rd   typingOptionalr   rg   r   ri   rC   rm   rD   rp   Anyrl   rZ   __classcell__r    r    r;   r&   r1   M   s    
r1   c                       s  e Zd Zdejf fddZdd Zdd Zded	d
fddZ	de
d	d
fddZded	d
fddZded	d
fddZded	d
fddZd"deje d	d
fddZded	d
fddZded	d
fddZd	efddZdejd	d
fddZdejd	d
fd d!Z  ZS )#V1SocketClientr2   c                   r3   r4   r5   r9   r;   r    r&   r7      r=   zV1SocketClient.__init__c                 c   s8    | j D ]}t|tr|V  qttt|dV  qd S r>   rB   rG   r    r    r&   __iter__   s   

zV1SocketClient.__iter__c              
   C   s   |  tjd zPz"| jD ]}t|tr|}nt|}tt	|d}|  tj
| qW n tyC } z|  tj| W Y d}~nd}~ww W |  tjd dS W |  tjd dS |  tjd w rJ   )_emitr   rL   r8   r*   rC   rE   rF   r   rD   rM   rN   rO   rP   rQ   r    r    r&   rV      s"   




"zV1SocketClient.start_listeningrH   r   Nc                 C      |  | dS rX   rY   rG   r    r    r&   r[         zV1SocketClient.send_settingsc                 C   r   r]   rY   rG   r    r    r&   r^      r   z V1SocketClient.send_update_speakc                 C   r   r_   rY   rG   r    r    r&   r`      r   z'V1SocketClient.send_inject_user_messagec                 C   r   ra   rY   rG   r    r    r&   rb      r   z(V1SocketClient.send_inject_agent_messagec                 C   r   rc   rY   rG   r    r    r&   rd     r   z*V1SocketClient.send_function_call_responsec                 C   s   |  |pt  dS re   rf   rG   r    r    r&   rg   	  s   zV1SocketClient.send_keep_alivec                 C   r   rh   rY   rG   r    r    r&   ri     r   z!V1SocketClient.send_update_promptc                 C   r   rj   rk   rG   r    r    r&   rm     r   zV1SocketClient.send_mediac                 C   s.   | j  }t|tr|S t|}tt|dS )rn   r?   ro   rq   r    r    r&   rp     s
   


zV1SocketClient.recvrr   c                 C   s$   t |tr
t|}| j| dS rs   rt   rw   r    r    r&   rl   (  s   

zV1SocketClient._sendc                 C   s   |  t|  dS rx   ry   rw   r    r    r&   rZ   0  s   zV1SocketClient._send_modelr4   ) rz   r{   r|   websockets_sync_connection
Connectionr7   r   rV   r   r[   r   r^   r   r`   r   rb   r   rd   r}   r~   r   rg   r   ri   rC   rm   rD   rp   r   rl   rZ   r   r    r    r;   r&   r      s    
r   )BrE   r}   json.decoderr   
websocketswebsockets.sync.connectionsync
connectionr   core.eventsr   r   core.unchecked_base_modelr   types.agent_v1agent_audio_doner   $types.agent_v1agent_started_speakingr	   types.agent_v1agent_thinkingr
   types.agent_v1conversation_textr   types.agent_v1errorr   #types.agent_v1function_call_requestr   "types.agent_v1inject_agent_messager   !types.agent_v1inject_user_messager   types.agent_v1injection_refusedr   types.agent_v1keep_aliver   types.agent_v1prompt_updatedr   ,types.agent_v1receive_function_call_responser   )types.agent_v1send_function_call_responser   types.agent_v1settingsr   types.agent_v1settings_appliedr   types.agent_v1speak_updatedr   types.agent_v1update_promptr   types.agent_v1update_speakr   #types.agent_v1user_started_speakingr   types.agent_v1warningr   types.agent_v1welcomer   websockets.legacy.clientr   ImportErrorr   r"   UnionrC   rD   r1   r   r    r    r    r&   <module>   sl   u