o
    h[                     @  s   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 dZdS )    )annotationsN   )TraceCtxManager)	UserError)logger   )
AudioInputStreamedAudioInput)STTModelTTSModel)VoicePipelineConfig)StreamedAudioResult)VoiceWorkflowBasec                   @  s`   e Zd ZdZdddd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)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                C  sf   || _ 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    r   V/var/www/html/openai_agents/venv/lib/python3.10/site-packages/agents/voice/pipeline.py__init__   s   zVoicePipeline.__init__audio_inputAudioInput | StreamedAudioInputreturnr   c                   sH   t |tr| |I dH S t |tr| |I dH 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   r   r   r   run0   s   

zVoicePipeline.runr   c                 C     | j s| jj| j| _ | j S N)r   r   model_providerget_tts_modelr   r   r   r   r   _get_tts_modelC      zVoicePipeline._get_tts_modelr
   c                 C  r&   r'   )r   r   r(   get_stt_modelr   r*   r   r   r   _get_stt_modelH   r,   zVoicePipeline._get_stt_modelr   r   c                   s,   |   }||| jj| jj| jjI d H S r'   )r.   
transcriber   stt_settingstrace_include_sensitive_data"trace_include_sensitive_audio_data)r   r   modelr   r   r   _process_audio_inputM   s   
z"VoicePipeline._process_audio_inputc                   s   t jjpdd jjjjjjd. |I d H  t jj	j fdd}
t|  W  d    S 1 sEw   Y  d S )NVoice Agentworkflow_nametrace_idgroup_idmetadatadisabledc               
     s   z'j  2 z3 d H W } | I d H  q6  I d H   I d H  W d S  tyF } ztd|  |I d H  |d }~ww )NzError processing single turn: )	r   r%   	_add_text
_turn_done_done	Exceptionr   error
_add_error)
text_evente
input_textoutputr   r   r   stream_eventsf   s   z5VoicePipeline._run_single_turn.<locals>.stream_events)r   r   r7   r9   trace_metadatatracing_disabledr4   r   r+   tts_settings	_set_taskasynciocreate_task)r   r   rG   r   rD   r   r"   V   s    
$zVoicePipeline._run_single_turnr	   c                   s  t jjpdd jjjjjjdk t jjj zj	
 2 z3 d H W } |I d H  q&6 W n tyQ } ztd|  W Y d }~nd }~ww  |jjjjjjI d H  fdd} t|   W  d    S 1 sw   Y  d S )Nr5   r6   zon_start() failed: c               
     s   z]z-  2 z%3 d H W } j| }|2 z3 d H W } |I d H  q6   I d H  q6 W n tyM } ztd|   |I d H  |d }~ww W 	 I d H   
 I d H  d S 	 I d H   
 I d H  w )NzError processing turns: )transcribe_turnsr   r%   r<   r=   r?   r   r@   rA   closer>   )rE   resultrB   rC   rF   r   transcription_sessionr   r   process_turns   s(   
z4VoicePipeline._run_multi_turn.<locals>.process_turns)r   r   r7   r9   rH   rI   r   r+   rJ   r   on_startr<   r?   r   warningr.   create_sessionr0   r1   r2   rK   rL   rM   )r   r   
intro_textrC   rS   r   rQ   r   r#   t   s:   

$zVoicePipeline._run_multi_turn)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+   r.   r4   r"   r#   r   r   r   r   r      s    





	r   )
__future__r   rL   	_run_implr   
exceptionsr   r   inputr   r	   r3   r
   r   pipeline_configr   rP   r   r   r   r   r   r   r   r   <module>   s    