o
    iB                     @  s
  d dl mZ d dlZd dlmZmZ d dlmZmZm	Z	m
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 ddlmZmZ ddlmZ e
eej egeejeB  dB e	eejeB  dB  B f Ze
eje ej! egeej"eB eB  eB ej"B dB e	eej"eB eB  eB ej"B dB  B f Z#e
ee egeej dB e	eej dB  B f Z$G dd dZ%G dd dZ&eG dd dZ'eG dd dZ(eG dd dZ)G dd deej*ed  Z+G dd deZ,G dd deZ-G dd  d Z.G d!d" d"Z/dS )#    )annotationsN)ABCabstractmethod)AsyncIterableAsyncIterator	AwaitableCallable)	dataclass)Literal)rtc   )llmstt)logger)FlushSentinelTimedString   )ModelSettingsc                   @  j   e Zd Zdddd	d
ZdddZedddZedddZdddZd ddZ	d ddZ
dddZdS )!
AudioInputNsourcelabelstrr   AudioInput | NonereturnNonec                C     || _ || _d S N)_AudioInput__label_AudioInput__sourceselfr   r    r#   Y/var/www/html/livekit_bhavya/venv/lib/python3.10/site-packages/livekit/agents/voice/io.py__init__*      
zAudioInput.__init__AsyncIterator[rtc.AudioFrame]c                 C     | S r   r#   r"   r#   r#   r$   	__aiter__.      zAudioInput.__aiter__c                 C     | j S r   )r   r)   r#   r#   r$   r   1      zAudioInput.labelc                 C  r,   r   )r    r)   r#   r#   r$   r   5   r-   zAudioInput.sourcertc.AudioFramec                      | j r| j  I d H S tr   r   	__anext__NotImplementedErrorr)   r#   r#   r$   r1   9      zAudioInput.__anext__c                 C     | j r
| j   d S d S r   r   on_attachedr)   r#   r#   r$   r6   ?      zAudioInput.on_attachedc                 C  r4   r   r   on_detachedr)   r#   r#   r$   r9   C   r7   zAudioInput.on_detachedc                 C     | j j d| jd| jdS N(label=z	, source=)	__class____name__r   r   r)   r#   r#   r$   __repr__G      zAudioInput.__repr__)r   r   r   r   r   r   )r   r'   r   r   r   r   )r   r.   r   r   r@   
__module____qualname__r%   r*   propertyr   r   r1   r6   r9   rA   r#   r#   r#   r$   r   )       



r   c                   @  r   )!
VideoInputNr   r   r   r   VideoInput | Noner   r   c                C  s   || _ || _d S r   )_VideoInput__source_VideoInput__labelr!   r#   r#   r$   r%   L   r&   zVideoInput.__init__AsyncIterator[rtc.VideoFrame]c                 C  r(   r   r#   r)   r#   r#   r$   r*   P   r+   zVideoInput.__aiter__c                 C  r,   r   )rN   r)   r#   r#   r$   r   S   r-   zVideoInput.labelc                 C  r,   r   )rM   r)   r#   r#   r$   r   W   r-   zVideoInput.sourcertc.VideoFramec                   r/   r   r0   r)   r#   r#   r$   r1   [   r3   zVideoInput.__anext__c                 C  r4   r   r5   r)   r#   r#   r$   r6   a   r7   zVideoInput.on_attachedc                 C  r4   r   r8   r)   r#   r#   r$   r9   e   r7   zVideoInput.on_detachedc                 C  r:   r;   r>   r)   r#   r#   r$   rA   i   rB   zVideoInput.__repr__)r   r   r   rL   r   r   )r   rO   rC   r   rL   )r   rP   rE   rF   r#   r#   r#   r$   rK   K   rJ   rK   c                   @  s.   e Zd ZU ded< 	 ded< 	 dZded< dS )PlaybackFinishedEventfloatplayback_positionboolinterruptedN
str | Nonesynchronized_transcript)r@   rG   rH   __annotations__rX   r#   r#   r#   r$   rR   m   s   
 rR   c                   @     e Zd ZU ded< dS )PlaybackStartedEventrS   
created_atNr@   rG   rH   rY   r#   r#   r#   r$   r[   x   s   
 r[   c                   @  rZ   )AudioOutputCapabilitiesrU   pauseNr]   r#   r#   r#   r$   r^   ~   s   
 r^   c                      s   e Zd Zdddd: fddZed;ddZed<ddZd=ddZddd>ddZd?d d!Z	d@d"d#Z
edAd$d%ZedBd&d'ZedCd*d+Zed@d,d-Zed@d.d/Zd@d0d1Zd@d2d3Zd@d4d5Zd@d6d7Zd;d8d9Z  ZS )DAudioOutputN)next_in_chainsample_rater   r   capabilitiesr^   ra   AudioOutput | Nonerb   
int | Noner   r   c                  s   t    | _| _| _d _t  _| _	d _
d _tddd _ jrA jd fdd  jd fdd d	S d	S )
z
        Args:
            sample_rate: The sample rate required by the audio sink, if None, any sample rate is accepted
        Fr   )rT   rV   playback_finishedc                   s    j | j| j| jdS )N)rV   rT   rX   )on_playback_finishedrV   rT   rX   evr)   r#   r$   <lambda>   s
    z&AudioOutput.__init__.<locals>.<lambda>playback_startedc                   s    j | jdS )Nr\   )on_playback_startedr\   rh   r)   r#   r$   rj      s    N)superr%   _AudioOutput__next_in_chain_sample_rate_AudioOutput__label_AudioOutput__capturingasyncioEvent%_AudioOutput__playback_finished_event_capabilities%_AudioOutput__playback_segments_count%_AudioOutput__playback_finished_countrR   _AudioOutput__last_playback_evra   on)r"   r   rc   ra   rb   r?   r)   r$   r%      s*   


zAudioOutput.__init__c                 C  r,   r   )rq   r)   r#   r#   r$   r      r-   zAudioOutput.labelc                 C  r,   r   )ro   r)   r#   r#   r$   ra      r-   zAudioOutput.next_in_chainr\   rS   c                C  s   |  dt|d d S )Nrk   rl   )emitr[   )r"   r\   r#   r#   r$   rm      s   zAudioOutput.on_playback_started)rX   rT   rV   rU   rX   rW   c                C  sV   | j | jkrtd dS |  j d7  _ | j  t|||d}|| _| d| dS )z
        Developers building audio sinks must call this method when a playback/segment is finished.
        Segments are segmented by calls to flush() or clear_buffer()
        zHplayback_finished called more times than playback segments were capturedNr   )rT   rV   rX   rf   )	rx   rw   r   warningru   setrR   ry   r|   )r"   rT   rV   rX   ri   r#   r#   r$   rg      s   
z AudioOutput.on_playback_finishedrR   c                   s<   | j }| j|k r| j I dH  | j  | j|k s	| jS )z
        Wait for the past audio segments to finish playing out.

        Returns:
            PlaybackFinishedEvent: The event that was emitted when the audio finished playing out
            (only the last segment information)
        N)rw   rx   ru   waitclearry   )r"   targetr#   r#   r$   wait_for_playout   s   


zAudioOutput.wait_for_playoutc                 C  s   d| _ d| _d S )Nr   )rw   rx   r)   r#   r#   r$   _reset_playback_count   r&   z!AudioOutput._reset_playback_countc                 C  r,   )zPThe sample rate required by the audio sink, if None, any sample rate is accepted)rp   r)   r#   r#   r$   rb      s   zAudioOutput.sample_ratec                 C  s   | j jo| j p| jjS r   )rv   r_   ra   	can_pauser)   r#   r#   r$   r      s   zAudioOutput.can_pauseframer.   c                   s$   | j sd| _ |  jd7  _dS dS )zOCapture an audio frame for playback, frames can be pushed faster than real-timeTr   N)rr   rw   )r"   r   r#   r#   r$   capture_frame   s
   zAudioOutput.capture_framec                 C  s
   d| _ dS )zJFlush any buffered audio, marking the current playback/segment as completeFN)rr   r)   r#   r#   r$   flush   s   
zAudioOutput.flushc                 C     dS )z/Clear the buffer, stopping playback immediatelyNr#   r)   r#   r#   r$   clear_buffer       zAudioOutput.clear_bufferc                 C  r4   r   ra   r6   r)   r#   r#   r$   r6      r7   zAudioOutput.on_attachedc                 C  r4   r   ra   r9   r)   r#   r#   r$   r9     r7   zAudioOutput.on_detachedc                 C     | j r
| j   dS dS )zPause the audio playbackN)ra   r_   r)   r#   r#   r$   r_        zAudioOutput.pausec                 C  r   )zResume the audio playbackN)ra   resumer)   r#   r#   r$   r     r   zAudioOutput.resumec                 C  r:   Nr<   z, next=r=   r?   r@   r   ra   r)   r#   r#   r$   rA     rB   zAudioOutput.__repr__)
r   r   rc   r^   ra   rd   rb   re   r   r   rC   r   rd   )r\   rS   r   r   )rT   rS   rV   rU   rX   rW   r   r   )r   rR   rE   )r   re   r   rU   )r   r.   r   r   )r@   rG   rH   r%   rI   r   ra   rm   rg   r   r   rb   r   r   r   r   r   r6   r9   r_   r   rA   __classcell__r#   r#   r{   r$   r`      s8    '






r`   )rf   rk   c                   @  sl   e Zd ZdddZedd	d
ZedddZedddZedddZ	dddZ
dddZdddZdS )
TextOutputr   r   ra   TextOutput | Noner   r   c                C  r   r   )_TextOutput__label_TextOutput__next_in_chainr"   r   ra   r#   r#   r$   r%     r&   zTextOutput.__init__c                 C  r,   r   )r   r)   r#   r#   r$   r     r-   zTextOutput.labelc                 C  r,   r   )r   r)   r#   r#   r$   ra     r-   zTextOutput.next_in_chaintextc                   s   dS )z8Capture a text segment (Used by the output of LLM nodes)Nr#   r"   r   r#   r#   r$   capture_text#  s    zTextOutput.capture_textc                 C  r   )zJMark the current text segment as complete (e.g LLM generation is complete)Nr#   r)   r#   r#   r$   r   '  r   zTextOutput.flushc                 C  r4   r   r   r)   r#   r#   r$   r6   +  r7   zTextOutput.on_attachedc                 C  r4   r   r   r)   r#   r#   r$   r9   /  r7   zTextOutput.on_detachedc                 C  r:   r   r   r)   r#   r#   r$   rA   3  rB   zTextOutput.__repr__N)r   r   ra   r   r   r   rC   r   r   )r   r   r   r   rE   )r@   rG   rH   r%   rI   r   ra   r   r   r   r6   r9   rA   r#   r#   r#   r$   r     s    


r   c                   @  sl   e Zd ZdddZedd	d
ZedddZedddZedddZ	dddZ
dddZdddZdS )VideoOutputr   r   ra   VideoOutput | Noner   r   c                C  r   r   )_VideoOutput__label_VideoOutput__next_in_chainr   r#   r#   r$   r%   9  r&   zVideoOutput.__init__c                 C  r,   r   )r   r)   r#   r#   r$   r   =  r-   zVideoOutput.labelc                 C  r,   r   )r   r)   r#   r#   r$   ra   A  r-   zVideoOutput.next_in_chainr   rP   c                   s   d S r   r#   r   r#   r#   r$   r   E  s   zVideoOutput.capture_framec                 C  s   d S r   r#   r)   r#   r#   r$   r   H  r+   zVideoOutput.flushc                 C  r4   r   r   r)   r#   r#   r$   r6   K  r7   zVideoOutput.on_attachedc                 C  r4   r   r   r)   r#   r#   r$   r9   O  r7   zVideoOutput.on_detachedc                 C  r:   r   r   r)   r#   r#   r$   rA   S  rB   zVideoOutput.__repr__N)r   r   ra   r   r   r   rC   r   r   )r   rP   r   r   rE   )r@   rG   rH   r%   rI   r   ra   r   r   r   r6   r9   rA   r#   r#   r#   r$   r   8  s    


r   c                   @  s   e Zd ZdddZdd
dZdddZedddZedddZedddZ	e	j
d ddZ	ed!ddZej
d"ddZdS )#
AgentInputvideo_changedCallable[[], None]audio_changedr   r   c                 C  s(   d | _ d | _|| _|| _d| _d| _d S NT)_video_stream_audio_stream_video_changed_audio_changed_audio_enabled_video_enabled)r"   r   r   r#   r#   r$   r%   X  s   
zAgentInput.__init__enablerU   c                 C  R   |r
| j s
td || jkrd S || _| j sd S |r"| j   d S | j   d S )Nz+Cannot enable audio input when it's not set)r   r   r}   r   r6   r9   r"   r   r#   r#   r$   set_audio_enabledd     


zAgentInput.set_audio_enabledc                 C  r   )Nz+Cannot enable video input when it's not set)r   r   r}   r   r6   r9   r   r#   r#   r$   set_video_enabledu  r   zAgentInput.set_video_enabledc                 C  r,   r   r   r)   r#   r#   r$   audio_enabled  r-   zAgentInput.audio_enabledc                 C  r,   r   r   r)   r#   r#   r$   video_enabled  r-   zAgentInput.video_enabledrL   c                 C  r,   r   )r   r)   r#   r#   r$   video  r-   zAgentInput.videostreamc                 C  X   || j u rd S | j r| j   || _ |   | j r*| jr#| j   d S | j   d S d S r   )r   r9   r   r   r6   r"   r   r#   r#   r$   r        

r   c                 C  r,   r   )r   r)   r#   r#   r$   audio  r-   zAgentInput.audioc                 C  r   r   )r   r9   r   r   r6   r   r#   r#   r$   r     r   N)r   r   r   r   r   r   )r   rU   r   r   r   rQ   )r   rL   r   r   rD   )r   r   r   r   )r@   rG   rH   r%   r   r   rI   r   r   r   setterr   r#   r#   r#   r$   r   W  s     


r   c                   @  s   e Zd Zd%ddZd&ddZd&ddZd&ddZed'ddZed'ddZ	ed'ddZ
ed(ddZejd)ddZed*ddZejd+ddZed,d!d"Zejd-d#d"Zd$S ).AgentOutputr   r   r   transcription_changedr   r   c                 C  s:   d | _ d | _d | _|| _|| _|| _d| _d| _d| _d S r   )	_video_sink_audio_sink_transcription_sinkr   r   _transcription_changedr   r   _transcription_enabled)r"   r   r   r   r#   r#   r$   r%     s   
zAgentOutput.__init__enabledrU   c                 C  r   )Nz,Cannot enable video output when it's not set)r   r   r}   r   r6   r9   r"   r   r#   r#   r$   r     r   zAgentOutput.set_video_enabledc                 C  r   )Nz,Cannot enable audio output when it's not set)r   r   r}   r   r6   r9   r   r#   r#   r$   r     r   zAgentOutput.set_audio_enabledc                 C  r   )Nz4Cannot enable transcription output when it's not set)r   r   r}   r   r6   r9   r   r#   r#   r$   set_transcription_enabled  r   z%AgentOutput.set_transcription_enabledc                 C  r,   r   r   r)   r#   r#   r$   r     r-   zAgentOutput.audio_enabledc                 C  r,   r   r   r)   r#   r#   r$   r     r-   zAgentOutput.video_enabledc                 C  r,   r   )r   r)   r#   r#   r$   transcription_enabled  r-   z!AgentOutput.transcription_enabledr   c                 C  r,   r   )r   r)   r#   r#   r$   r   
  r-   zAgentOutput.videosinkc                 C  r   r   )r   r9   r   r   r6   r"   r   r#   r#   r$   r     r   rd   c                 C  r,   r   )r   r)   r#   r#   r$   r     r-   zAgentOutput.audioc                 C  r   r   )r   r9   r   r   r6   r   r#   r#   r$   r   #  r   r   c                 C  r,   r   )r   r)   r#   r#   r$   transcription4  r-   zAgentOutput.transcriptionc                 C  r   r   )r   r9   r   r   r6   r   r#   r#   r$   r   8  r   N)r   r   r   r   r   r   r   r   )r   rU   r   r   r   r   )r   r   r   r   r   )r   rd   r   r   r   )r   r   r   r   )r@   rG   rH   r%   r   r   r   rI   r   r   r   r   r   r   r   r#   r#   r#   r$   r     s.    



r   )0
__future__r   rs   abcr   r   collections.abcr   r   r   r   dataclassesr	   typingr
   livekitr    r   r   logr   typesr   r   agentr   
AudioFrameSpeechEventr   STTNodeChatContextlistTool	ChatChunkLLMNodeTTSNoder   rK   rR   r[   r^   EventEmitterr`   r   r   r   r   r#   r#   r#   r$   <module>   sn    "
""
 "b