
    .hs                        d dl mZ d dlZddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
 dd	lmZmZ dd
lmZ ddlmZ ddlmZ  G d d          ZdS )    )annotationsN   )TraceCtxManager)	UserError)logger   )
AudioInputStreamedAudioInput)STTModelTTSModel)VoicePipelineConfig)StreamedAudioResult)VoiceWorkflowBasec                  T    e Zd ZdZddddddZddZddZddZd dZd!dZ	d"dZ
dS )#VoicePipelinezAn opinionated voice agent pipeline. It works in three steps:
    1. Transcribe audio input into text.
    2. Run the provided `workflow`, which produces a sequence of text responses.
    3. Convert the text responses into streaming audio output.
    N)	stt_model	tts_modelconfigworkflowr   r   STTModel | str | Noner   TTSModel | str | Noner   VoicePipelineConfig | Nonec               .   || _         t          |t                    r|nd| _        t          |t                    r|nd| _        t          |t                    r|nd| _        t          |t                    r|nd| _        |pt                      | _
        dS )a  Create a new voice pipeline.

        Args:
            workflow: The workflow to run. See `VoiceWorkflowBase`.
            stt_model: The speech-to-text model to use. If not provided, a default OpenAI
                model will be used.
            tts_model: The text-to-speech model to use. If not provided, a default OpenAI
                model will be used.
            config: The pipeline configuration. If not provided, a default configuration will be
                used.
        N)r   
isinstancer   r   r   r   str_stt_model_name_tts_model_namer   r   )selfr   r   r   r   s        R/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/agents/voice/pipeline.py__init__zVoicePipeline.__init__   s    & !&0H&E&EO4&0H&E&EO4,6y#,F,FPyyD,6y#,F,FPyyD5 3 5 5    audio_inputAudioInput | StreamedAudioInputreturnr   c                  K   t          |t                    r|                     |           d{V S t          |t                    r|                     |           d{V S t          dt          |                     )a  Run the voice pipeline.

        Args:
            audio_input: The audio input to process. This can either be an `AudioInput` instance,
                which is a single static buffer, or a `StreamedAudioInput` instance, which is a
                stream of audio data that you can append to.

        Returns:
            A `StreamedAudioResult` instance. You can use this object to stream audio events and
            play them out.
        NzUnsupported audio input type: )r   r	   _run_single_turnr
   _run_multi_turnr   type)r   r"   s     r   runzVoicePipeline.run0   s       k:.. 	R..{;;;;;;;;;%788 	R--k:::::::::PT+=N=NPPQQQr!   r   c                p    | j         s)| j        j                            | j                  | _         | j         S N)r   r   model_providerget_tts_modelr   r   s    r   _get_tts_modelzVoicePipeline._get_tts_modelC   2    ~ 	\![7EEdFZ[[DN~r!   r   c                p    | j         s)| j        j                            | j                  | _         | j         S r+   )r   r   r,   get_stt_modelr   r.   s    r   _get_stt_modelzVoicePipeline._get_stt_modelH   r0   r!   r	   r   c                   K   |                                  }|                    || j        j        | j        j        | j        j                   d {V S r+   )r3   
transcriber   stt_settingstrace_include_sensitive_data"trace_include_sensitive_audio_data)r   r"   models      r   _process_audio_inputz"VoicePipeline._process_audio_inputM   sh      ##%%%%K$K4K:	
 
 
 
 
 
 
 
 	
r!   c                   K   t           j        j        pdd  j        j         j        j         j        j                  5                       |           d {V t                                            j        j	         j                   fd}
                    t          j         |                                 cd d d            S # 1 swxY w Y   d S )NVoice Agentworkflow_nametrace_idgroup_idmetadatadisabledc                 ~  K   	 j                                       2 3 d {V }                     |            d {V  #6                                  d {V                                   d {V  d S # t
          $ r9}t          j        d|                                |           d {V  |d }~ww xY w)NzError processing single turn: )	r   r)   	_add_text
_turn_done_done	Exceptionr   error
_add_error)
text_evente
input_textoutputr   s     r   stream_eventsz5VoicePipeline._run_single_turn.<locals>.stream_eventsf   s      ,0M,=,=j,I,I ; ; ; ; ; ; ;j$..z:::::::::: -J ++--------- ,,..(((((((((    L!E!!E!EFFF ++A.........Gs"   A9 AAA9 9
B<4B77B<)r   r   r>   r@   trace_metadatatracing_disabledr:   r   r/   tts_settings	_set_taskasynciocreate_task)r   r"   rN   rL   rM   s   `  @@r   r&   zVoicePipeline._run_single_turnV   sI      +3D}[)[/[1
 
 
 	 	  $88EEEEEEEEJ(##%%t{'? F	 	 	 	 	 	 	 W0AABBB3	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   BCCCr
   c                ,   K   t           j        j        pdd  j        j         j        j         j        j                  5  t                                            j        j         j                   	                                
                    | j        j         j        j         j        j                   d {V  fd}                    t          j         |                                 cd d d            S # 1 swxY w Y   d S )Nr<   r=   c                 f  K   	                                  2 3 d {V } j                            |           }|2 3 d {V }                    |           d {V  #6                                  d {V  b6 nF# t
          $ r9}t          j        d|                                |           d {V  |d }~ww xY w	 	                                 d {V  
                                 d {V  d S # 	                                 d {V  
                                 d {V  w xY w)NzError processing turns: )transcribe_turnsr   r)   rD   rE   rG   r   rH   rI   closerF   )rL   resultrJ   rK   rM   r   transcription_sessions       r   process_turnsz4VoicePipeline._run_multi_turn.<locals>.process_turns   s     ),A,R,R,T,T 2 2 2 2 2 2 2j!%!2!2:!>!>06 ? ? ? ? ? ? ?*"("2"2:">">>>>>>>>> 17$//1111111111	 -U,T
 !   L!?A!?!?@@@ ++A.........G -U 055777777777 ,,..((((((((( 055777777777 ,,..((((((((s>   A= A;A= A:A= <C: =
C 4B;;C  C: :6D0)r   r   r>   r@   rO   rP   r   r/   rQ   r3   create_sessionr6   r7   r8   rR   rS   rT   )r   r"   r[   rM   rZ   s   `  @@r   r'   zVoicePipeline._run_multi_turnt   s     +3D}[)[/[1
 
 
 "	 "	 )##%%t{'? F +/*=*=*?*?*N*N(8>	+ + % % % % % %!) ) ) ) ) ) ) W0AABBBE"	 "	 "	 "	 "	 "	 "	 "	 "	 "	 "	 "	 "	 "	 "	 "	 "	 "	s   B8D		DD)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   )__name__
__module____qualname____doc__r    r)   r/   r3   r:   r&   r'    r!   r   r   r      s          ,0+/-16 6 6 6 6 64R R R R&   
   

 
 
 
   <# # # # # #r!   r   )
__future__r   rS   	_run_implr   
exceptionsr   r   inputr	   r
   r9   r   r   pipeline_configr   rY   r   r   r   r   ra   r!   r   <module>rg      s    " " " " " "  ' ' ' ' ' ' " " " " " "       1 1 1 1 1 1 1 1 % % % % % % % % 0 0 0 0 0 0 ' ' ' ' ' ' ' ' ' ' ' 'H H H H H H H H H Hr!   