
    .hA                       d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZmZ d dlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZmZ ddlmZ ddlmZmZmZ ddlmZm Z  ddl!m"Z"m#Z#m$Z$ dZ%dZ&dZ'ddiZ(e	 G d d                      Z) G d d          Z* G d d          Z+d+dZ,d,d&Z- G d' d(e"          Z. G d) d*e#          Z/dS )-    )annotationsN)AsyncIterator)	dataclass)Anycast)AsyncOpenAI   )_debug)AgentsException)logger)Span	SpanErrorTranscriptionSpanDatatranscription_span   )STTWebsocketConnectionError)npnpt
websockets)
AudioInputStreamedAudioInput)StreamedTranscriptionSessionSTTModelSTTModelSettingsi  
   typesemantic_vadc                      e Zd ZU ded<   dS )ErrorSentinel	ExceptionerrorN)__name__
__module____qualname____annotations__     [/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/agents/voice/models/openai_stt.pyr   r      s         r'   r   c                      e Zd ZdS )SessionCompleteSentinelNr"   r#   r$   r&   r'   r(   r*   r*   "           Dr'   r*   c                      e Zd ZdS )WebsocketDoneSentinelNr+   r&   r'   r(   r.   r.   &   r,   r'   r.   
audio_data(list[npt.NDArray[np.int16 | np.float32]]returnstrc                :   t          j        |           }|j        t           j        k    r8t          j        |dd          }|dz                      t           j                  }|                                }t          j	        |          
                    d          S )Ng      g      ?i  utf-8)r   concatenatedtypefloat32clipastypeint16tobytesbase64	b64encodedecode)r/   concatenated_audioaudio_bytess      r(   _audio_to_base64rA   *   s    
332:--W%7sCC058@@JJ$,,..KK((//888r'   event_queueasyncio.Queue[dict[str, Any]]expected_types	list[str]timeoutfloatc                |  K   t          j                     }	 |t          j                     |z
  z
  }|dk    rt          d|           t          j        |                                 |           d{V }|                    dd          }||v r|S |dk    r%t          d	|                    d                     )
zj
    Wait for an event from event_queue whose type is in expected_types within the specified timeout.
    Tr   zTimeout waiting for event(s): rF   Nr    r!   Error event: )timeTimeoutErrorasynciowait_forgetr    )rB   rD   rF   
start_time	remainingevtevt_types          r(   _wait_for_eventrU   4   s       J	@ty{{Z78	>>PPPQQQ$[__%6%6	JJJJJJJJJ7762&&~%%J  >CGGG,<,<>>???	@r'   c                  z    e Zd ZdZd#dZd$dZd%dZd$dZd$dZd&dZ	d$dZ
d'dZd$dZd$dZd$dZd(d Zd$d!Zd"S ))OpenAISTTTranscriptionSessionz/A transcription session for OpenAI's STT model.inputr   clientr   modelr2   settingsr   trace_include_sensitive_databool"trace_include_sensitive_audio_datac                   d| _         || _        || _        || _        |j        pt
          | _        || _        || _        |j	        | _
        t          j                    | _        d | _        t          j                    | _        t          j                    | _        g | _        d | _        d | _        d | _        d | _        d | _        d | _        d S )NF)	connected_client_model	_settingsturn_detectionDEFAULT_TURN_DETECTION_turn_detection_trace_include_sensitive_data#_trace_include_sensitive_audio_dataqueue_input_queuerN   Queue_output_queue
_websocket_event_queue_state_queue_turn_audio_buffer_tracing_span_listener_task_process_events_task_stream_audio_task_connection_task_stored_exception)selfrX   rY   rZ   r[   r\   r^   s          r(   __init__z&OpenAISTTTranscriptionSession.__init__J   s      %!'6P:P-I*3U0OT{MOO 	 ?CSZS`SbSb;B=??LNAE 9=>B!<@:>37r'   r1   Nonec                    t          | j        | j        j        | j        j        | j        j        | j        d          | _        | j                                         d S )N)temperaturelanguagepromptrd   )rZ   model_config)	r   rb   rc   r{   r|   r}   rf   rq   startrw   s    r(   _start_turnz)OpenAISTTTranscriptionSession._start_turnl   sc    /+#~9 N3./"&"6	 
 
 
 	  """""r'   _transcriptc                6   t          |          dk     rd S | j        r|| j        r#t          | j                  | j        j        _        d| j        j        _        | j        r|| j        j        _	        | j        
                                 g | _        d | _        d S d S )N   pcm)lenrq   rh   rA   rp   	span_datarX   input_formatrg   outputfinish)rw   r   s     r(   	_end_turnz'OpenAISTTTranscriptionSession._end_turnx   s    {aF 	&7 _5EdF]5^5^",28=D(51 B6A",3%%'''&(D#!%D	& 	&r'   c                  K   | j         
J d            | j         2 3 d {V }	 t          j        |          }|                    d          dk    r%t	          d|                    d                     |                    d          dv r | j                            |           d {V  | j                            |           d {V  # t          $ rB}| j	                            t          |                     d {V  t	          d          |d }~ww xY w6 | j                            t                                 d {V  d S )NWebsocket not initializedr   r!   rK   )session.updatedtranscription_session.updatedsession.createdtranscription_session.createdzError parsing events)rm   jsonloadsrP   r   ro   putrn   r    rl   r   r.   )rw   messageeventes       r(   _event_listenerz-OpenAISTTTranscriptionSession._event_listener   s     **,G***!_ 	Q 	Q 	Q 	Q 	Q 	Q 	Q'Q
7++99V$$//56ZeiiPWFXFX6Z6Z[[[99V$$ )   +//666666666'++E2222222222 Q Q Q(,,]1-=-=>>>>>>>>>12HIIqPQ! -& ##$9$;$;<<<<<<<<<<<s   DB)C
D=DDc           	        K   | j         
J d            | j                             t          j        ddd| j        i| j        dd                     d {V  d S )Nr   ztranscription_session.updatepcm16rZ   )input_audio_formatinput_audio_transcriptionrd   )r   session)rm   sendr   dumpsrb   rf   r   s    r(   _configure_sessionz0OpenAISTTTranscriptionSession._configure_session   s      **,G***o""J:.56=t{5K*.*>    	 	
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r'   wswebsockets.ClientConnectionc                  K   || _         t          j        |                                           | _        	 t          | j        ddgt                     d {V }n# t          $ rD}t          d          }| j
                            t          |                     d {V  ||d }~wt          $ r4}| j
                            t          |                     d {V  |d }~ww xY w|                                  d {V  	 t          | j        ddgt                     d {V }t           j        rt%          j        d           d S t%          j        d|            d S # t          $ rD}t          d          }| j
                            t          |                     d {V  ||d }~wt          $ r3}| j
                            t          |                     d {V   d }~ww xY w)	Nr   r   z7Timeout waiting for transcription_session.created eventr   r   zSession updatedzSession updated: z7Timeout waiting for transcription_session.updated event)rm   rN   create_taskr   rr   rU   ro   SESSION_CREATION_TIMEOUTrM   r   rl   r   r   r    r   SESSION_UPDATE_TIMEOUTr
   DONT_LOG_MODEL_DATAr   debug)rw   r   r   r   wrapped_errs        r(   _setup_connectionz/OpenAISTTTranscriptionSession._setup_connection   s     %1$2F2F2H2HII	)!"$CD(       EE
  	% 	% 	%5I K $(({)C)CDDDDDDDDD1$ 	 	 	$((q)9)9:::::::::G	 %%'''''''''	)!"$CD&       E
 ) :./////88899999 	% 	% 	%5I K $(({)C)CDDDDDDDDD1$ 	 	 	$((q)9)9:::::::::	sN   #A 
C$$?B##C$0/CC$AE  E   
G)*?F))G)6.G$$G)c                "  K   	 	 t          j        | j                                        t                     d {V }t          |t                    rn|                    dd          }|dk    rt          t          |                    dd                    }t          |          dk    rI| 
                    |           |                                  | j                            |           d {V  t          j        d           d {V  nQ# t           j        $ r Y nBt           $ r4}| j                            t#          |                     d {V  |d }~ww xY w_| j                            t%                                 d {V  d S )	NTrI   r   unknownz5conversation.item.input_audio_transcription.completed
transcriptrJ   r   )rN   rO   rn   rP   EVENT_INACTIVITY_TIMEOUT
isinstancer.   r   r2   r   r   r   rl   r   sleeprM   r    r   r*   )rw   r   
event_typer   r   s        r(   _handle_eventsz,OpenAISTTTranscriptionSession._handle_events   s     	%.%))++5M         e%:;; "YYvy99
!XXX!%c599\2+F+F!G!GJ:**z222((***"044Z@@@@@@@@@mA&&&&&&&&&&'      (,,]1-=-=>>>>>>>>>)	.  $$%<%>%>???????????s%   AD B;D E!	E*/EEaudio_queue1asyncio.Queue[npt.NDArray[np.int16 | np.float32]]c           	     z  K   | j         
J d            |                                  	 |                                 d {V }|d S | j                            |           	 | j                             t          j        dt          j	        |
                                                              d          d                     d {V  nR# t          j        $ r Y d S t          $ r4}| j                            t#          |                     d {V  |d }~ww xY wt%          j        d           d {V  )Nr   Tzinput_audio_buffer.appendr4   )r   audior   )rm   r   rP   rp   appendr   r   r   r<   r=   r;   r>   r   ConnectionClosedr    rl   r   r   rN   r   )rw   r   bufferr   s       r(   _stream_audioz+OpenAISTTTranscriptionSession._stream_audio   s      **,G***	#&??,,,,,,,,F~#**6222o**J$?%+%5fnn6F6F%G%G%N%Nw%W%W            .      (,,]1-=-=>>>>>>>>> -"""""""""+	#s   "A,C D!	D*/DDc                  K   	 t          j        dd| j        j         ddd          4 d {V 	 }|                     |           d {V  t          j        |                                           | _        t          j        | 	                    | j
                            | _        d| _        | j        r| j         d {V  n#t          j        d           t!          d          	 d d d           d {V  d S # 1 d {V swxY w Y   d S # t"          $ r4}| j                            t)          |                     d {V  |d }~ww xY w)	Nz5wss://api.openai.com/v1/realtime?intent=transcriptionzBearer zrealtime=v11)AuthorizationzOpenAI-BetazOpenAI-Log-Session)additional_headersTzListener task not initialized)r   connectra   api_keyr   rN   r   r   rs   r   rj   rt   r`   rr   r   r!   r   r    rl   r   r   )rw   r   r   s      r(   _process_websocket_connectionz;OpenAISTTTranscriptionSession._process_websocket_connection  sD     	!)G%Et|/C%E%E#0*-$ $   K K K K K K K K ,,R000000000,3,?@S@S@U@U,V,V)*1*=d>P>PQUQb>c>c*d*d'!%& K---------L!@AAA)*IJJJJ!K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K"  	 	 	$((q)9)9:::::::::G	s;   -D B7C=*D =
DD 
DD 
E/E		Ec                   | j         rP| j                                         r7| j                                         }|rt          |t                    r|| _        | j        rP| j                                        r7| j                                        }|rt          |t                    r|| _        | j        rP| j                                        r7| j                                        }|rt          |t                    r|| _        | j        rR| j                                        r;| j                                        }|r"t          |t                    r|| _        d S d S d S d S d S N)	ru   done	exceptionr   r    rv   rs   rt   rr   )rw   excs     r(   _check_errorsz+OpenAISTTTranscriptionSession._check_errors'  s     	-T%:%?%?%A%A 	-'1133C -z#y11 -),&$ 	-)B)G)G)I)I 	-+5577C -z#y11 -),&" 	-t'>'C'C'E'E 	-)3355C -z#y11 -),& 	-4#6#;#;#=#= 	-%//11C -z#y11 -),&&&	- 	- 	- 	-- - - -r'   c                   | j         r2| j                                         s| j                                          | j        r2| j                                        s| j                                         | j        r2| j                                        s| j                                         | j        r4| j                                        s| j                                         d S d S d S r   )rr   r   cancelrs   rt   ru   r   s    r(   _cleanup_tasksz,OpenAISTTTranscriptionSession._cleanup_tasks<  s     	)t':'?'?'A'A 	)&&((($ 	/T-F-K-K-M-M 	/%,,..." 	-4+B+G+G+I+I 	-#**,,,  	+)>)C)C)E)E 	+!((*****	+ 	+ 	+ 	+r'   AsyncIterator[str]c               `  K   t          j        |                                           | _        	 	 | j                                         d {V }n# t           j        $ r Y niw xY w|*t          |t                    st          |t                    r| j        
                                 n|W V  | j        
                                 | j        r|                     d           | j        r| j                                         d {V  |                                  | j        r| j        d S )NTrJ   )rN   r   r   ru   rl   rP   CancelledErrorr   r   r*   	task_donerq   r   rm   closer   rv   )rw   turns     r(   transcribe_turnsz.OpenAISTTTranscriptionSession.transcribe_turnsI  sd      ' 3D4V4V4X4X Y Y	+!/3355555555)    dM22 d$;<<  ",,...JJJJ((***	+   	NN2? 	*/'')))))))))! 	)((	) 	)s   A A"!A"c                ~   K   | j         r| j                                          d {V  |                                  d S r   )rm   r   r   r   s    r(   r   z#OpenAISTTTranscriptionSession.closef  sN      ? 	*/'')))))))))r'   N)rX   r   rY   r   rZ   r2   r[   r   r\   r]   r^   r]   )r1   ry   )r   r2   r1   ry   )r   r   r1   ry   )r   r   r1   ry   )r1   r   )r"   r#   r$   __doc__rx   r   r   r   r   r   r   r   r   r   r   r   r   r&   r'   r(   rW   rW   G   s$       99 8  8  8  8D
# 
# 
# 
#& & & &"= = = =0
 
 
 
( ( ( (T@ @ @ @4# # # #8   .- - - -*+ + + +) ) ) ):     r'   rW   c                  J    e Zd ZdZddZedd            ZddZddZddZ	dS )OpenAISTTModelz"A speech-to-text model for OpenAI.rZ   r2   openai_clientr   c                "    || _         || _        dS )zCreate a new OpenAI speech-to-text model.

        Args:
            model: The name of the model to use.
            openai_client: The OpenAI client to use.
        N)rZ   ra   )rw   rZ   r   s      r(   rx   zOpenAISTTModel.__init__p  s     
$r'   r1   c                    | j         S r   )rZ   r   s    r(   
model_namezOpenAISTTModel.model_name~  s
    zr'   valuer   c                    ||nd S r   r&   )rw   r   s     r(   _non_null_or_not_givenz%OpenAISTTModel._non_null_or_not_given  s    )uut3r'   rX   r   r[   r   r\   r]   r^   c           
     "  K   t          | j        |r|                                ndd|                     |j                  |                     |j                  |                     |j                  d          5 }	 | j        j        j	        
                    | j        |                                |                     |j                  |                     |j                  |                     |j                             d{V }|r|j        |j        _        |j        cddd           S # t          $ rD}d|j        _        |                    t#          t%          |          i                      |d}~ww xY w# 1 swxY w Y   dS )zTranscribe an audio input.

        Args:
            input: The audio input to transcribe.
            settings: The settings to use for the transcription.

        Returns:
            The transcribed text.
        rJ   r   )r{   r|   r}   )rZ   rX   r   r~   )rZ   filer}   r|   r{   N)r   data)r   rZ   	to_base64r   r{   r|   r}   ra   r   transcriptionscreateto_audio_filetextr   r   r    	set_errorr   r2   )rw   rX   r[   r\   r^   spanresponser   s           r(   
transcribezOpenAISTTModel.transcribe  s        *'IQ%//###r#::8;OPP 778IJJ55hoFF 		
 	
 	
 	 !%!3!B!I!I*,,..66xGG!889JKK $ ; ;H<P Q Q "J " "       0 :,4MDN)})	 	 	 	 	 	 	 	*    (*%yQbAAABBB+	 	 	 	 	 	 	 	 	 	s1   =F?B'D33
F=?E<<FFFFr   r   c                B   K   t          || j        | j        |||          S )a  Create a new transcription session.

        Args:
            input: The audio input to transcribe.
            settings: The settings to use for the transcription.
            trace_include_sensitive_data: Whether to include sensitive data in traces.
            trace_include_sensitive_audio_data: Whether to include sensitive audio data in traces.

        Returns:
            A new transcription session.
        )rW   ra   rZ   )rw   rX   r[   r\   r^   s        r(   create_sessionzOpenAISTTModel.create_session  s0      $ -LJ(.
 
 	
r'   N)rZ   r2   r   r   )r1   r2   )r   r   r1   r   )
rX   r   r[   r   r\   r]   r^   r]   r1   r2   )
rX   r   r[   r   r\   r]   r^   r]   r1   r   )
r"   r#   r$   r   rx   propertyr   r   r   r   r&   r'   r(   r   r   m  s        ,,% % % %    X4 4 4 4( ( ( (T
 
 
 
 
 
r'   r   )r/   r0   r1   r2   )rB   rC   rD   rE   rF   rG   )0
__future__r   rN   r<   r   rL   collections.abcr   dataclassesr   typingr   r   openair   rJ   r
   
exceptionsr   r   tracingr   r   r   r   r   importsr   r   r   rX   r   r   rZ   r   r   r   r   r   r   re   r   r*   r.   rA   rU   rW   r   r&   r'   r(   <module>r      s   " " " " " "     ) ) ) ) ) ) ! ! ! ! ! !                     ) ) ) ) ) )       Q Q Q Q Q Q Q Q Q Q Q Q 4 4 4 4 4 4 ) ) ) ) ) ) ) ) ) ) 2 2 2 2 2 2 2 2 L L L L L L L L L L    .1         	 	 	 	 	 	 	 		 	 	 	 	 	 	 	9 9 9 9@ @ @ @&c c c c c$@ c c cL	[
 [
 [
 [
 [
X [
 [
 [
 [
 [
r'   