o
    i                     @  s  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ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Zd dl 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+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9 ddl:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZCmDZD ddlEmFZFmGZG ddlHmIZI ddlJmKZK ddlLmMZMmNZN ddlOmPZP ddl>mQZQmRZRmSZS ddlTmUZUmVZV dZWerd dlXZYejZej[fZ\G d d! d!e]Z^G d"d# d#e]Z_ed$ Z`d%ZaG d&d' d'eGjbZcG d(d) d)eGjdZeG d*d+ d+Zfd,d-gZgG d.d/ d/ZhG d0d1 d1e	jiZjdd8d9ZkG d:d; d;e	jlZmdd<d=Znd>d-gZodd?d@ddIdJZpeeqe4B dB gdf ZredKdLdMdNdOddXdYZsddZd[Ztg d\Zud]evd^< ddadbZwdddfdgZxddjdkZyddodpZzG dqdr drZ{ddxdyZ|ddd~dZ}G dd deqej~ZdddZdddZdS )    )annotationsN)CallableIterator)contextmanager)	FrameType)TYPE_CHECKING	AnnotatedAnyLiteralColumns)ConsoleConsoleRenderableGroupRenderableType)Live)Segment)Spinner)Style)ColumnTable)Text)Theme)apirtc   )CLIError)JobExecutorTypeloggerPlugin)aio	shortuuid)AgentSessionio)RunEvent)TranscriptSynchronizer)AgentServerWorkerOptions   )proto)JsonFormatter_merge_record_extra_silence_noisy_loggers)keyreadkey   c                   @     e Zd ZdS )_ToggleModeN__name__
__module____qualname__ r8   r8   X/var/www/html/livekit_bhavya/venv/lib/python3.10/site-packages/livekit/agents/cli/cli.pyr3   A       r3   c                   @  r2   )_ExitCliNr4   r8   r8   r8   r9   r;   E   r:   r;   )textaudio]  c                      sF   e Zd Zd fddZdd	d
ZdddZdddZdddZ  ZS )ConsoleAudioInputloopasyncio.AbstractEventLoopreturnNonec                   s(   t  jdd || _t | _d| _d S )Nr   labelT)super__init___loopr"   Chan	_audio_ch	_attachedselfr@   	__class__r8   r9   rG   l   s   

zConsoleAudioInput.__init__framertc.AudioFramec                 C  s   | j sd S | j| d S N)rK   rJ   send_nowaitrM   rP   r8   r8   r9   
push_framer   s   zConsoleAudioInput.push_framec                   s   | j  I d H S rR   )rJ   	__anext__rM   r8   r8   r9   rV   x   s   zConsoleAudioInput.__anext__c                 C  
   d| _ d S NTrK   rW   r8   r8   r9   on_attached{      
zConsoleAudioInput.on_attachedc                 C  rX   NFrZ   rW   r8   r8   r9   on_detached~   r\   zConsoleAudioInput.on_detachedr@   rA   rB   rC   rP   rQ   rB   rC   )rB   rQ   rB   rC   )	r5   r6   r7   rG   rU   rV   r[   r^   __classcell__r8   r8   rN   r9   r?   k   s    


r?   c                      s   e Zd Zd  fddZed!dd	Zed"ddZed#ddZd$ddZd% fddZ	d$ fddZ
d$ddZd$ fddZd$ fddZd$ddZ  ZS )&ConsoleAudioOutputr@   rA   rB   rC   c                   st   t  jdd ttjddd || _d| _d| _d | _t	 | _
t | _t | _| j  t | _d | _d| _d S )Nr   T)pause)rE   next_in_chainsample_ratecapabilities        )rF   rG   SAMPLE_RATEr%   AudioOutputCapabilitiesrH   _pushed_duration_capture_start_flush_task	bytearray_output_buf	threadingLock_audio_lockasyncioEvent_output_buf_emptyset_interrupted_ev
_paused_at_paused_durationrL   rN   r8   r9   rG      s"   





zConsoleAudioOutput.__init__threading.Lockc                 C     | j S rR   )rr   rW   r8   r8   r9   
audio_lock      zConsoleAudioOutput.audio_lockrn   c                 C  r{   rR   )ro   rW   r8   r8   r9   audio_buffer   r}   zConsoleAudioOutput.audio_bufferboolc                 C  s
   | j d uS rR   )rx   rW   r8   r8   r9   paused      
zConsoleAudioOutput.pausedc                 C     | j   d S rR   )ru   rv   rW   r8   r8   r9   mark_output_empty      z$ConsoleAudioOutput.mark_output_emptyrP   rQ   c                   s   t  |I d H  | jr| j std | jI d H  | js-t | _	| j
t d |  j|j7  _| j |  j|j7  _| j  W d    d S 1 sQw   Y  d S )Nz8capture_frame called while previous flush is in progress)
created_at)rF   capture_framerm   doner   errorrk   time	monotonicrl   on_playback_starteddurationrr   ro   dataru   clearrT   rN   r8   r9   r      s   

"z ConsoleAudioOutput.capture_framec                   sL   t    | jr$| jr| j std | j  t	| 
 | _d S d S )Nz0flush called while previous flush is in progress)rF   flushrk   rm   r   r   r   cancelrs   create_task_wait_for_playoutrW   rN   r8   r9   r      s   


zConsoleAudioOutput.flushc                 C  sR   | j  | j  | j  W d    n1 sw   Y  | jr'| j  d S d S rR   )rr   ro   r   ru   rv   rk   rw   rW   r8   r8   r9   clear_buffer   s   
zConsoleAudioOutput.clear_bufferc                   s&   t    | jd u rt | _d S d S rR   )rF   rd   rx   r   r   rW   rN   r8   r9   rd      s   

zConsoleAudioOutput.pausec                   s:   t    | jd ur|  jt | j 7  _d | _d S d S rR   )rF   resumerx   ry   r   r   rW   rN   r8   r9   r      s
   


zConsoleAudioOutput.resumec                   s0  d	 fdd}t  j }t | }zt j||gt jdI d H  | }W |  |  n	|  |  w  jd urO  jt	
  j 7  _d  _|ret	
  j  j }ttd| j}n j} j||d d _d  _d _ j   j  j  W d    d S 1 sw   Y  d S )
NrB   rC   c                     sF   t  jdkr! j I d H  tdI d H  t  jdksd S d S )Nr   )lenro   ru   waitrs   sleepr8   rW   r8   r9   _wait_buffered_audio   s
   zBConsoleAudioOutput._wait_for_playout.<locals>._wait_buffered_audio)return_whenr   )playback_positioninterruptedrh   ra   )rs   r   rw   r   FIRST_COMPLETEDr   r   rx   ry   r   r   rl   minmaxrk   on_playback_finishedr   rr   ru   rv   )rM   r   wait_for_interruptionwait_for_playoutr   played_durationr8   rW   r9   r      s:   




"z$ConsoleAudioOutput._wait_for_playoutr_   )rB   rz   )rB   rn   rB   r   ra   r`   )r5   r6   r7   rG   propertyr|   r~   r   r   r   r   r   rd   r   r   rb   r8   r8   rN   r9   rc      s    

	rc   c                   @  st  e Zd ZU dZded< dZedcddZddd	d
ZdeddZ	e
dfddZejdgddZe
dfddZejdgddZe
dhddZe
dfddZe
diddZe
djd d!Ze
dkd#d$Zddd%d&Ze
dld(d)Ze
dld*d+Ze
dmd-d.Zejdnd0d.Zdod8d9Zd:dd;dpdBdCZd:dddDdqdHdIZddJdrdNdOZddJdrdPdQZdsdTdUZdtd]d^ZdudadbZdS )vAgentsConsoleNAgentsConsole | None	_instancezconsole-recordingsrB   c                 C  s   | j d u r	|  | _ | j S rR   )r   )clsr8   r8   r9   get_instance   s   
zAgentsConsole.get_instancerC   c                 C  s(  ddddt  t ddt ddt ddt d	dt d
dt ddt dddt ddddd}d| _tt|d| _tjddddd| _d| _	d | _
d | _d| _d | _d | _t | _tjdtjd| _d| _t | _d| _t | _d| _d| _t | _t| | _ t!"| j#dt$j$% &d | _'d S )Nzblack on #1fd5f9z#8f83ffred#1fd5f9T)dimcyan)colorgreenyellowbluer   bold)r   r   reverse)tagrE   r   zlk-fglog.name	log.extrazlogging.level.notsetzlogging.level.debugzlogging.level.infozlogging.level.warningzlogging.level.devzlogging.level.errorzlogging.level.critical   )theme)echo_cancellationnoise_suppressionhigh_pass_filterauto_gain_controlrh      dtyper=   Fzsession-z%m-%d-%H%M%S)(r   null	tag_widthr   r   consoler   AudioProcessingModule_apm_input_delay_input_name_input_stream_output_delay_output_name_output_streamrp   rq   _input_locknpzerosfloat32_input_levels_console_mode_lock_io_acquiredrt   _io_acquired_event_enabled_recordTextModeLogFilter_text_mode_log_filterRichLoggingHandler_log_handlerpathlibPath_console_directorydatetimenowstrftime_session_directory)rM   r   r8   r8   r9   rG     sT   





zAgentsConsole.__init__r@   rA   sessionr$   c                C  s   | j > | jrtdt |krtdd| _|| _t | _t	|| _
t|| _t| jd d| _| j  || _W d    n1 sDw   Y  |r\| || j| j
| jj| jj d S d S )Nz5the ConsoleIO was already acquired by another sessionzFthe ConsoleIO must be acquired in the same asyncio loop as the sessionT)next_in_chain_audionext_in_chain_text)r   r   RuntimeErrorrs   get_running_loop_io_loopcontextvarscopy_context_io_contextr?   _io_audio_inputrc   _io_audio_outputr'   _io_transcription_syncr   rv   _io_session_update_sess_ioconsole_modeaudio_outputtext_output)rM   r@   r   r8   r8   r9   
acquire_io<  s8   



zAgentsConsole.acquire_ior   c                 C  r{   rR   r   rW   r8   r8   r9   enabled[  r}   zAgentsConsole.enabledvalc                 C  
   || _ d S rR   r   rM   r   r8   r8   r9   r   _  r   c                 C  r{   rR   r   rW   r8   r8   r9   recordc  r}   zAgentsConsole.recordc                 C  r   rR   r   r   r8   r8   r9   r   g  r   pathlib.Pathc                 C  r{   rR   )r   rW   r8   r8   r9   session_directoryk  r}   zAgentsConsole.session_directoryc                 C  s0   | j  | jW  d    S 1 sw   Y  d S rR   )r   r   rW   r8   r8   r9   io_acquiredo  s   $zAgentsConsole.io_acquiredc                 C     | j std| jS NzAgentsConsole is not acquired)r   r   r   rW   r8   r8   r9   
io_sessiont     zAgentsConsole.io_sessionc                 C  r   r   )r   r   r   rW   r8   r8   r9   io_loop{  r  zAgentsConsole.io_loopcontextvars.Contextc                 C  r   r   )r   r   r   rW   r8   r8   r9   
io_context  r  zAgentsConsole.io_contextc                 C  r   rR   )r   r   rW   r8   r8   r9   wait_for_io_acquisition  r   z%AgentsConsole.wait_for_io_acquisition
str | Nonec                 C  r{   rR   )r   rW   r8   r8   r9   
input_name  r}   zAgentsConsole.input_namec                 C  r{   rR   )r   rW   r8   r8   r9   output_name  r}   zAgentsConsole.output_nameConsoleModec                 C  r{   rR   )r   rW   r8   r8   r9   r     r}   zAgentsConsole.console_modemodec              	   C  sn   | j * || _| js	 W d    d S | j| j| j|| j| jj	| jj
 W d    d S 1 s0w   Y  d S rR   )r   r   r   r  call_soon_threadsafer   r   r   r   r   r   )rM   r
  r8   r8   r9   r     s   "sessaudio_inputr?   r   io.AudioOutputr   io.TextOutputc                 C  s   t  | jkrtd| j[ | js	 W d    d S | j|ks%| j|kr.	 W d    d S |dkrFd |j_	d |j
_	d |j
_| j| j n||j_	||j
_	||j
_| j| j W d    d S W d    d S 1 slw   Y  d S )Nz/_update_sess_io must be executed on the io_loopr<   )rs   r   r  r   r   r   r   r   inputr=   outputtranscriptionr   	addFilterr   removeFilter)rM   r  r
  r  r   r   r8   r8   r9   r     s*   "zAgentsConsole._update_sess_io r   	tag_stylechildr   r   strr  Style | Nonec                C  s   | j | j|||d d S )Nr  )r   print_render_tag)rM   r  r   r  r8   r8   r9   r    s   zAgentsConsole.print)r   r   r  r   
int | Noner   c          
      C  s   |rd| d}|p| j }tjt|d ddtddddddd	}|t| }td
|}|p3| jd}t||dg}td| g|}	|	t
|	 t
| |S )N r   Twidthno_wrapFfoldr!  overflowr   r   r   r   paddingcollapse_paddingpad_edger   r   style)r   r   gridr   r   r   r   	get_styler   add_rowr   )
rM   r  r   r   r  tableleft_paddingr+  tag_segmentsleftr8   r8   r9   r    s"   


zAgentsConsole._render_tagdeviceenabler4  int | str | Nonec                C  s   | j r| j   d  | _ | _|sd S dd l}|d u r |jj\}}z	|j|dd}W n ty5   tdd w t	|t
s?J d|dd| _|j| jdd	|d
dd| _ | j   d S )Nr   r  kindUnable to access the microphone. 
Please ensure a microphone is connected and recognized by your system. To see available input devices, run: lk-agents console --list-devicesdevice_info is dictnamezUnnamed microphoneint16r*   r>   `	  callbackr   channelsr4  
samplerate	blocksize)r   closer   sounddevicedefaultr4  query_devices	Exceptionr   
isinstancedictgetInputStream_sd_input_callbackstartrM   r5  r4  sd_device_infor8   r8   r9   set_microphone_enabled  8   
z$AgentsConsole.set_microphone_enabledc                C  s   | j r| j   d  | _ | _|sd S dd l}|d u r |jj\}}z	|j|dd}W n ty5   tdd w t	|t
s?J d|dd| _|j| jdd	|d
dd| _ | j   d S )Nr   r  r7  Unable to access the speaker. 
Please ensure a speaker is connected and recognized by your system. To see available output devices, run: lk-agents console --list-devicesr:  r;  zUnnamed speakerr<  r*   r>   r=  r>  )r   rC  r   rD  rE  r4  rF  rG  r   rH  rI  rJ  OutputStream_sd_output_callbackrM  rN  r8   r8   r9   set_speaker_enabled  rS  z!AgentsConsole.set_speaker_enabledinput_deviceoutput_devicec                C  sp   dd l }z|r|j|dd W n ty   tdd w z|r)|j|dd W d S W d S  ty7   tdd w )Nr   r  r7  r9  r  rT  )rD  rF  rG  r   )rM   rX  rY  rO  r8   r8   r9   _validate_device_or_raise/  s.   z'AgentsConsole._validate_device_or_raiseindata
np.ndarrayframe_countintr   r	   rP  c           $      G  s0  |j |j | _| j| j }z| jt|d  W n	 ty"   Y nw d}|d d df t	j
d }|j}|t	|t	j
9 }t	jj||d}	t	|	t	j
d|  }
|
d  d9  < |
d  d	dt|d
 dk  9  < t	jj|d	| d}t| j}t	d|d d |d t	j
}t	t	||d d|d }|
|
 t	j
}t	j|||d}t	t	j||dd}|| }dt	|d  }d\}}t	|| ||  t	j
dd	}t	|d d d}t| }|t	d|d  dd9 }t	|dd	}tt	||  d }| j | jt	j
}t	||| | _W d    n	1 s+w   Y  | js6d S d}|| }t|D ]U}|| }|| }||| }tj |! |ddd} | j"|  t	j#| j$t	j%d}!t	&t	'|!t	j
d
 }"t	(t	j%j}#dt	|"|# d  | _)| j*+| j,j-|  q@d S )Ni  r>   r   g      @)ng       @g      ?g      ?r   )dg      4@gQ?r*   )weights	minlength)rc  g      $@g-q=)g     Qirh   g      ?g{Gz?gffffff?gư>g      @皙?   r   samples_per_channelrf   num_channelsr   ).currentTimeinputBufferAdcTimer   r   r   set_stream_delay_msr^  r   astyper   r   sizehanningfftrfftabsfloatrfftfreqr   r   	geomspaceclipdigitizebincountmaximumlog10r   expr   r   ranger   
AudioFrametobytesprocess_stream
frombufferr   r<  sqrtmeaniinfo	_micro_dbr   r  r   rU   )$rM   r[  r]  r   rP  total_delaysrxr_  Xmagfreqsnbedgesbpsumpcntspmeandbfloor_dbhot_dblevpeakdecayprevFRAME_SAMPLES
num_framesirM  endcapture_chunkrP   in_data_aecrms	max_int16r8   r8   r9   rL  H  sp   $
""z AgentsConsole._sd_input_callbackoutdataframesc                 G  s  | j sd|d d < d S |j|j | _d}| jjr | jjr$d|d d < n_|d }t| jj|k ret| jj}t	j
| jjt	j|d d|d |d df< d||d d df< | jjd |= | j| jj n| jjd | }t	j
|t	j|d|d d df< | jjd |= W d    n1 sw   Y  || }	t|	D ]#}
|
| }|| }|||df }tj| |ddd}| j| qd S )Nr   re  r   )r   countr>   r*   rf  )r   outputBufferDacTimeri  r   r   r|   r   r   r~   r   r  r<  r  r  r   r{  r   r|  r}  r   process_reverse_stream)rM   r  r  r   rP  r  bytes_neededavailable_byteschunk
num_chunksr  rM  r  render_chunkrender_frame_for_aecr8   r8   r9   rV    sJ   
z!AgentsConsole._sd_output_callback)rB   r   ra   )r@   rA   r   r$   rB   rC   r   )r   r   rB   rC   )rB   r   )rB   r$   )rB   rA   )rB   r  )rB   r  )rB   r	  )r
  r	  rB   rC   )r  r$   r
  r	  r  r?   r   r  r   r  rB   rC   )r  r   r   r  r  r  rB   rC   )
r  r   r   r  r   r  r  r  rB   r   )r5  r   r4  r6  rB   rC   )rX  r  rY  r  rB   rC   )
r[  r\  r]  r^  r   r	   rP  r	   rB   rC   )
r  r\  r  r^  r   r	   rP  r	   rB   rC   )r5   r6   r7   r   __annotations__r   classmethodr   rG   r   r   r   setterr   r   r   r   r  r  r  r  r  r   r   r  r  rR  rW  rZ  rL  rV  r8   r8   r8   r9   r      s\   
 

6

	#
#
Dr   )Ctrl+Tz	text mode)zCtrl+Cexitc                   @  s0   e Zd ZdddddZdddZdddZdS )FrequencyVisualizerzUnlabeled microphonerD   agents_consoler   rE   r  c                C  s    || _ g d| _|| _d| _d S )N)u   ▁u   ▂u   ▃u   ▄u   ▅u   ▆u   ▇   █F)rE   height_charscshow_shortcuts)rM   r  rE   r8   r8   r9   rG     s   

zFrequencyVisualizer.__init__rB   rC   c                 C  sJ   | j j t| j j}dd |D | _W d    d S 1 sw   Y  d S )Nc              
   S  s(   g | ]}t d tdtt|d qS )r      )r   r   r^  round).0vr8   r8   r9   
<listcomp>  s   ( z.FrequencyVisualizer.update.<locals>.<listcomp>)r  r   listr   _levels_idx)rM   lvr8   r8   r9   update  s   
"zFrequencyVisualizer.updater   c           	   	     s   t jdd}|  d j d}t jtt|ddtdddd	dd
d} jjd}t	||d}d
 fdd jD }|t|t| || |t	d  jrrtD ]\}}|t	d|dfd| df qZ|S |t	ddd |S )Nr   r'       Tr  r"  r#  r%  Fr&  rE   r*  r  c                 3  s     | ]}d  j |  V  qdS )r  N)r  )r  r  rW   r8   r9   	<genexpr>  s    z/FrequencyVisualizer.__rich__.<locals>.<genexpr>)r  r  dim boldr   z   ? for shortcuts)r   r,  
add_columnrE   r   r   r  r   r-  r   joinr  r.  r   r  AUDIO_SHORTCUTSassemble)	rM   r/  rE   inner_tabler+  	label_segbarshortcut_keydescr8   rW   r9   __rich__  s0   

zFrequencyVisualizer.__rich__N)r  r   rE   r  ra   )rB   r   )r5   r6   r7   rG   r  r  r8   r8   r8   r9   r    s    
r  c                      s2   e Zd Zd fddZdd	d
ZdddZ  ZS )r   r  r   c                   s   t    || _d | _d S rR   )rF   rG   r  
_last_time)rM   r  rN   r8   r9   rG     s   

zRichLoggingHandler.__init__r   logging.LogRecordrB   rC   c           #   	   C  sL  d(dd}t |jr|jdkp|j}|r8|j|j}}d |_d |_z| |}W |||_|_n|||_|_w | |}d	}tjd
d}|jdd |jdddd |jd|ddd |jddd |jddd g }	| jd u rsd n| jj}
t	j	
|j}|p| jj }|
rt||
n
t|dd d }|| jkr|j}|	tdt|  n|	| || _t|jdd|j  }|	| ||j|}t|}|	| t|}|	| | jjj}d}t|| d d }|j}d}t|jd!}|j}i }t|| d"}d#}|rtj |t!j"d$d%}t|}|j}d&}|| | | | | }t |o5||k}|rC|	t|dd n|	td |j#|	  | jj$||d'}z>| jj%| |r|s|| d | d | d } d| d  }!t|!| dd}"| jj%|" |r| &| W d S W d S  t'y   | (| Y d S w ))Nsr  	max_widthr^  rB   c                 S  sZ   t | |kr| S |dkrdd | S |d }|d }|| }| d | d | | d   S )Nr*   u   …r   )r   )r  r  visibler2  rightr8   r8   r9   middle_truncate  s   z0RichLoggingHandler.emit.<locals>.middle_truncate)NNN   r   r*   r  zlog.timer*  z	log.level   T)r+  r   r!  r   ellipsis)r+  r   r!  r$  r*   zlog.message)ratior+  r   )r+  r!  z%H:%M:%S.%fr     zlogging.level.r         r  r   F)r   ensure_ascii   )r   )r  r  r  r^  rB   r  ))r   exc_infoexc_textformatr   r,  r  	formatterdatefmtr   fromtimestampcreatedr  r   get_datetimer   r   r  plainappendr   styled	levelnameljustlowerr;  r   r   cell_lenr   r-   jsondumpsr,   JsonEncoderr.  r  r  _print_plain_tracebackrG  handleError)#rM   r   r  has_excr  r  messageMAX_NAME_WIDTHr  rowtime_formatlog_timelog_time_displaytime_str
level_textlogger_name	name_textmsg_textconsole_widthr   available_widthtime_len	level_lenname_lenmsg_lenextra	extra_str	extra_len
extra_textspaces_between_columnstotal_len_with_extrainline_extraindent_widthindent
extra_liner8   r8   r9   emit  s   

 









zRichLoggingHandler.emitc                 C  s~   z/|j r|j }n|j\}}}dt|||}t|dd}| jjj|dd | jj  W d S  t	y>   | 
| Y d S w )Nr  r   r*  )r  )r  r  r  	tracebackformat_exceptionr   r  r   r  rG  r  )rM   r   tb_strexc_type	exc_valueexc_tbtb_textr8   r8   r9   r  e  s   z)RichLoggingHandler._print_plain_traceback)r  r   )r   r  rB   rC   )r5   r6   r7   rG   r  r  rb   r8   r8   rN   r9   r     s    
ur   r  r   	log_level	int | strrB   rC   c                   s   t td t  }| r|| j nt tj}|| |	t
  |  t  ddlm} |jt jkr=|  ddlm} d fd	d
}|jD ]}|| qM|jd| d S )NTRACEr   r   r    pluginr!   rB   rC   c                   s0   | j d ur| j jtjkr| j   d S d S d S rR   )r   levelloggingNOTSETsetLevel)r  r  r8   r9   _configure_plugin_logger  s   z3_configure_logger.<locals>._configure_plugin_loggerplugin_registered)r  r!   rB   rC   )r  addLevelNameTRACE_LOG_LEVEL	getLogger
addHandlerr   StreamHandlersysstdoutsetFormatterr,   r  r.   logr   r  r  r  r!   registered_pluginsemitteron)r  r  roothandlerr   r!   r!  r  r8   r   r9   _configure_loggeru  s"   




r1  c                   @  s2   e Zd ZedejedejgZd
ddZd	S )r   z\bexecuting tool\bz\btools execution completed\br   r  rB   r   c                   s0   |j dkrdS |  t fdd| jD  S )Nzlivekit.agentsTc                 3  s    | ]}|  V  qd S rR   )search)r  rxmsgr8   r9   r    s    z+TextModeLogFilter.filter.<locals>.<genexpr>)r;  
getMessageany	_patterns)rM   r   r8   r4  r9   filter  s   
zTextModeLogFilter.filterN)r   r  rB   r   )r5   r6   r7   recompile
IGNORECASEr8  r9  r8   r8   r8   r9   r     s
    r   c                  C  s  dd l } t }|  }| jj\}}tddd d}|jdddd |jd	d
dd |jdd
d |jddd t|D ]L\}}|d }|d dk}	|d dk}
|	rj||krZtdddnd}|	t
|tddd|| |
r||krvtdddnd}|	t
|tddd|| q:|| d S )Nr   TF)show_header
show_linesboxIDr   r  )r+  justifyTyper   centerNamer*  Default)rA  r;  max_input_channelsmax_output_channelsyesz#23de6br  Inputz#6c7a89Output)rD  r   rF  rE  r4  r   r  	enumerater   r.  r  r  )rO  r   devicesdefault_inputdefault_outputr/  idxdevr;  	has_input
has_outputrE  r8   r8   r9   _print_audio_devices  s*   rS  )r  z
audio moder  )key_read_cbplaceholderr  
str | Textr   r   rT  Callable[[str], Any] | NonerU  r  c                  s  g  |j jddd fdd}t| |ddd	`}	 t }|r)|| |tjkr/nH|d
kr? s? ||  q|tjkrOrNd||  q|tjkra r` 	  ||  qt
|dkrv| rv | ||  q W d    n1 sw   Y  d S )Nu   ─FrB   r   c               	     s   t jdd} |   | t dd d }|r)| td|dfd n| tdddd	f | t dd r]tD ]\}}| td
|dfd| df qE| S  sh| tddd | S )Nr   r  r   r*  r  )u   ❯ r   )r  white)r  r  z
dim italic)r  r  r  r  z  ? for shortcuts)r   r,  r  r.  r   r  r  TEXT_SHORTCUTS)r/  
input_textr  r  buffer	line_charrU  r  r   r8   r9   render_prompt  s*   
zprompt.<locals>.render_promptT   )r   	transientrefresh_per_second?r*   r  )rB   r   )rm  r   r   r0   r/   ENTERr  ESC	BACKSPACEpopr   isprintabler  r  )r  r   rT  rU  r^  livechr8   r[  r9   prompt  sB   




 rj  linez	bold blue   T)spinnerspinner_stylera  r`  r<   rm  rn  ra  r^  r`  r   Iterator[UpdateFn]c                #  s    t |tr|ntt|t||ddfdd t  | ||ddd fd
d}|V  W d    d S 1 s>w   Y  d S )Nr*  rB   r   c                     s   t  gddddS )NFr  )expandequalr'  r   r8   )r5  spinr8   r9   _render#  s   zlive_status.<locals>._renderr   ra  r`  new_textstr | Text | NonerC   c                   s6   | d urt | tr| ntt|    d S d S rR   )rH  r   r  r  )ru  )rs  rh  r5  r8   r9   r  -  s   zlive_status.<locals>.update)rB   r   rR   )ru  rv  rB   rC   )rH  r   r  r   r   )r   r<   rm  rn  ra  r`  r  r8   )rs  rh  r5  rr  r9   live_status  s   
"rw  c                   s(  ddd}	 zt td j|d	d
}W n
 ty   Y d S w | s) j  qd fdd}t } j	j
||| jd  j   jtdd |dD ]} jtd|  qSt jtd | sxtd | roW d    n1 sw   Y  | D ]}t | qq)Nri  r  rB   rC   c                 S  s   | t jkrt d S rR   )r/   CTRL_Tr3   ri  r8   r8   r9   	_key_read7  s   
z_text_mode.<locals>._key_readTz  [bold]User input[/bold]: zType to talk to your agent)r   rT  rU  r<   
result_futasyncio.Future[list[RunEvent]]c                   s8   dfdd}d fd
d}t || }|| d S )Nr<   r  rB   list[RunEvent]c                   s     j j| dI d H }|j S )N)
user_input)r   runeventscopy)r<   r  r  r8   r9   	_generateK  s   
z=_text_mode.<locals>._generate_with_context.<locals>._generatetaskasyncio.Task[list[RunEvent]]rC   c                   s,   |    }r | d S  |   d S rR   )	exceptionset_exception
set_resultresult)r  r  r{  r8   r9   _done_callbackO  s   zB_text_mode.<locals>._generate_with_context.<locals>._done_callback)r<   r  rB   r}  )r  r  rB   rC   )rs   r   add_done_callback)r<   r{  r  r  r  r  r  r9   _generate_with_contextJ  s   z*_text_mode.<locals>._generate_with_context)context)     ● #1FD5F9)Youbold #1FD5F9
    z  [dim]Thinking...[/dim]rd  )ri  r  rB   rC   )r<   r  r{  r|  rB   rC   )rj  r   from_markupr   KeyboardInterruptstripbellrs   Futurer  r  r  r  r  splitrw  r   r   r   r  _print_run_event)r  rz  r<   r  hrk  eventr8   r  r9   
_text_mode6  sH   




r  )r  z#09C338z#1F5DF9z#BA1FF9z#F9AE1Fz#FA4C39z	list[str]AGENT_PALETTEr;  r   c                 C  s<   t j| ddd }t|dtt }tt| ddS )Nzutf-8r   )digest_sizebigTr   )	hashlibblake2bencodedigestr^  
from_bytesr   r  r   )r;  r  rO  r8   r8   r9   _agent_stylew  s   r  P   	max_linesr   c                 C  sX   t j| |d}t||krd|S |d }|d | }|dd  }d|dg | S )N)r   r  r   r`  z...)textwrapwrapr   r  )r<   r  r   wrapped
head_countheadtailr8   r8   r9   _truncate_text}  s   
r  r  r&   c                 C  sZ  |j dkr| j  | jtd|jjdf d S |j dkr|jj}|}| 	dp2| 	d}|szOdd l
}|d}|dkr||d  }||}t|trg }	| D ]\}
}|d uro|
d	kro|	|
 d
|  qYd|	d d }t|	dkr|d7 }W n |jttfy   t|dd}Y nw |r| jtdt|dddf d S | jtd|df d S |j dkr|j}|j}t|jj}t|jj}| jtddt|jj |ddt|jj |d d S |j dkr"|jjr| j  | jtdd |jjdD ]}| jtd|  qd S d S td|j   d S )Nfunction_call)u     ➜ r  r  function_call_outputr   r  r   {type=z,    z, ...r   )r  )u       ✗ #EF4444r  )u       ✓ #6BCB77r   agent_handoff)r  z#FFD93D)z	Handoff: zbold #FFD93Dr*  )u    → r   r  )r  r  )Agentzbold #6BCB77r  r  zunknown RunEvent type ) r  r   r  r   r  itemr;  r  r  
startswithr  findloadsrH  rI  itemsr  r  r   JSONDecodeError	TypeError
ValueErrorr  	old_agent	new_agentr  rO   r5   text_contentr  r   warning)r  r  r  display_outputis_errorr  
json_startjson_strr   summary_partskr  r  r  	old_style	new_stylerk  r8   r8   r9   r    s   










r  rX  r  rY  c                  s   t   d d fdd}t j|dd}|  | jd|d | jd|d t| | jp-dd	  t	| j
d
dd   sO  td   rBW d    n1 sYw   Y  | d | d   rot d S )NrB   rC   c                    sh      s2t } | tjkr   d S | dkr d ur j _n| tjkr,d ur,d_   rd S d S )Nrb  F)is_setr0   r/   rx  rv   r  rd  ry  ctrl_t_e
visualizerr8   r9   _listen_for_keys  s   
z%_audio_mode.<locals>._listen_for_keysT)targetdaemonr3  unknownrD   rl  rt  g?Fra   )rp   rt   ThreadrM  rR  rW  r  r  r  r   r   r  r   r   r3   )r  rX  rY  r  listenerr8   r  r9   _audio_mode  s*   


r  c                   @  s>   e Zd ZdddZdd	d
ZdddZdddZdddZdS )_ConsoleWorkerserverr(   shutdown_cbr   rB   rC   c                C  s*   t  | _|| _|| _t | _d| _d S r]   )	rs   new_event_looprH   _server_shutdown_cbrp   rq   r   _closed)rM   r  r  r8   r8   r9   rG     s
   


z_ConsoleWorker.__init__c                 C  s   t j| jd| _| j  d S )N)r  )rp   r  _worker_thread_threadrM  rW   r8   r8   r9   rM    s   z_ConsoleWorker.startc                 C  r   rR   )r  r  rW   r8   r8   r9   r    r   z_ConsoleWorker.joinc                 C  s@   | j  t| j | j W d    d S 1 sw   Y  d S rR   )r   rs   run_coroutine_threadsafer  acloserH   rW   r8   r8   r9   shutdown  s   "z_ConsoleWorker.shutdownc                   s,   t  j d fdd} j|  d S )NrB   rC   c                    s    j   jr   	 W d    d S W d    n1 sw   Y  tj j_ jdd fdd}  jjdddI d H     d S )	Nworker_startedrB   rC   c                     s    t  jjdddd j d S )Nzconsole-roomr   T)agent_identityfake_job)rs   r  r  simulate_jobrH   r8   rW   r8   r9   _simulate_job  s   zI_ConsoleWorker._worker_thread.<locals>._async_main.<locals>._simulate_jobTdevmodeunregisteredra   )	r   r  r  r   THREADr  _job_executor_typeoncer  )r  rW   r8   r9   _async_main  s   

z2_ConsoleWorker._worker_thread.<locals>._async_mainra   )rs   set_event_looprH   run_until_complete)rM   r  r8   rW   r9   r    s   z_ConsoleWorker._worker_threadN)r  r(   r  r   rB   rC   ra   )r5   r6   r7   rG   rM  r  r  r  r8   r8   r8   r9   r    s    



r  r  r(   r
  r	  r   c           
   
     s  t  }||_d|_||_t|tj |jddd |jr,|jd|j	 dt
dd |d	 z}|j||d
 dddd}d fdd}tD ]}t|| qJt| |d    zHz2|  	 z|jdkrot| n|jdkr{t|||d
 W n ty   |jdkrdnd|_Y nw qd ty   Y nw W       W d S       w  ttfy }	 z|d	 |d|	  |d	 tjddd d }	~	ww )NTu   Starting console mode 🚀Agents)r   z#Session recording will be saved to 	Recordingzblack on redr  r  )rX  rY  FrB   rC   c                   S  sN   z	t t j W d S  ty&   z
t t j W Y d S  ty%   Y Y d S w w rR   )signalraise_signalSIGTERMrG  SIGINTr8   r8   r8   r9   _on_worker_shutdownM  s   z)_run_console.<locals>._on_worker_shutdownsigr^  rP   FrameType | Nonec                   s   sdt     d S rY   )r;   r  r  rP   console_workerexit_triggeredr8   r9   _handle_exitV  s   z"_run_console.<locals>._handle_exit)r  r  r<   r=   [error]r*   codera   r  r^  rP   r  rB   rC   )r   r   r   r   r   r1  r  DEBUGr  r   r   parserZ  HANDLED_SIGNALSr  r  rM  r  r  r  r3   r;   r  r  r   r  typerExit)
r  rX  rY  r
  r   r  r  r  r  er8   r  r9   _run_console)  sd   


	






r  Fargsproto.CliArgsjupyterc                   s  d } j r	t }dsdfdd	}tD ]}t|| qt| j t }t	| d
|_
d fdd}d } jrPddlm}	 |	 |d}|  z|j|dd}
z||
 W n	 tyj   Y nw zd j sx|  |  |r||  W n ty   std dd l}|d Y nw W r|  d S ttJ z-t|}|D ]}|  q|tj|ddi W ||  ||  |  n||  ||  |  w W d    d S 1 sw   Y  d S r|  w ttJ z.t|}|D ]}|  q|tj|ddi W ||  ||  |  n||  ||  |  w W d    w 1 s`w   Y  w )NFr  r^  rP   r  rB   rC   c                   s    sd t  d S rY   )r;   r  )r   r8   r9   r    s   z!_run_worker.<locals>._handle_exitrd  workerr(   c                   s>   zj  jdI d H  W d S  ty   td Y d S w )Nr  zworker failed)r  r  rG  r   r  )r  )r  r  r  r8   r9   _worker_run  s   z _run_worker.<locals>._worker_runr*   )WatchClientr@   worker_main_task_clir;  exiting forcefullyr   return_exceptionsTr  )r  r(   rB   rC   ) r  r   r   r  r  r1  r  rs   r  r  slow_callback_durationreloadwatcherr  rM  r   r  r;   drainr  r   r  os_exitrC  
contextlibsuppress	all_tasksr   gathershutdown_asyncgensshutdown_default_executor)r  r  r  r  r  r  r@   r  watch_clientr  	main_taskr  tasksr  r8   )r  r   r  r  r9   _run_worker  s   





"

 r'  c                   @  s$   e Zd ZdZdZdZdZdZdZdS )LogLevelr  r  INFOWARNERRORCRITICALN)	r5   r6   r7   tracedebuginfowarnr   criticalr8   r8   r8   r9   r(    s    r(  typer.Typerc                   s   t jdd}| d d ddddd/ fdd}| tjd d d d dd0 fdd}| tjd d d d d!d1 fd$d%}| tjd d d d d&d2 fd+d,}| d3d-d.}|S )4Nrich)rich_markup_modeFrX  rY  list_devicesr<   r   rX  eAnnotated[str | None, typer.Option(help='Numeric input device ID or input device name substring(s)')]rY  gAnnotated[str | None, typer.Option(help='Numeric output device ID or output device name substring(s)')]r6  XAnnotated[bool, typer.Option(help='List all available input and output audio devices.')]r<   OAnnotated[bool, typer.Option(help='Whether to start the console in text mode')]r   HAnnotated[bool, typer.Option(help='Whether to record the AgentSession')]rB   rC   c                   sX   |r	t   t | r|  rt| } |r| rt|}t | ||r%dnd|d dS )zU
        Run a [bold]LiveKit Agents[/bold] in [yellow]console[/yellow] mode.
        r<   r=   )r  rX  rY  r
  r   N)rS  r	  r
  isdigitr^  r  r5  r  r8   r9   r     s   

z_build_cli.<locals>.consoler  urlapi_key
api_secretdrain_timeoutr  QAnnotated[LogLevel, typer.Option(help='Set the log level', case_sensitive=False)]r?  |Annotated[str | None, typer.Option(help='The WebSocket URL of your LiveKit server or Cloud project.', envvar='LIVEKIT_URL')]r@  Annotated[str | None, typer.Option(help='API key for authenticating with your LiveKit server or Cloud project.', envvar='LIVEKIT_API_KEY')]rA  Annotated[str | None, typer.Option(help='API secret for authenticating with your LiveKit server or Cloud project.', envvar='LIVEKIT_API_SECRET')]rB  lAnnotated[int | None, typer.Option(help='Time in seconds to wait for jobs to finish before shutting down.')]c                   s4   |d ur
 j |d t tj| j|||dd d S )N)rB  )r  r?  r@  rA  r  r  )update_optionsr'  r+   CliArgsvaluer>  r=  r8   r9   rM  	  s   #
z_build_cli.<locals>.startT)r  r  r?  r@  rA  r  `Annotated[bool, typer.Option(help='Enable auto-reload of the server when (code) files change.')]c                   s4  t j| j|||d|d}t }t|| j tjd}|dkr+|j	r+|
d d|_	|j	s6t|d d S dd	lm} ttjd
 j}	t  t  |t|	| dd fdd}
tD ]}t||
 qadfdd}z	 |  W d S  ty   t d  ty   td td Y d S w )NT)r  r?  r@  rA  r  r  TERM_PROGRAMz	iTerm.appzH[error]Auto-reload is not supported on the iTerm2 terminal, disabling...FrH  r*   )WatchServerr   r  r  r^  rP   r  rB   rC   c                   s   t j  d d S )Nr  )rs   r  r  r  r@   watch_serverr8   r9   r  y  s   z-_build_cli.<locals>.dev.<locals>._handle_exitc                     s      I d H  d S rR   )r  r8   )rP  r8   r9   	_run_loop  s   z*_build_cli.<locals>.dev.<locals>._run_loopr  r  ra   ) r+   rJ  rK  r   r   r1  r  environrJ  r  r  r'  r  rN  r   r   r(  argvparentrs   r  r  r  r  r  r;   r	  r
  r  r   r  r  )r  r  r?  r@  rA  r  r  term_programrN  	main_filer  r  rQ  r=  rO  r9   rP  9  sD   !	



z_build_cli.<locals>.dev)r  r?  r@  rA  participant_identityroom<Annotated[str, typer.Option(help='Room name to connect to')]rW  @Annotated[str | None, typer.Option(help='Participant identity')]c           
   
     s  d u rt dt }t|| j t }t| d  dd fdd}z|	j
ddd W d S  tyH   t d  ty[   td	 td
 Y d S  ttfy }	 z|d |d|	  |d tjd
dd d }	~	ww )Nzagent-r  rB   rC   c                    s(   dfdd} t |   d S )NrB   rC   c               	     s   t  4 I d H 1} t jgd}| j|I d H }|js.| jt jdI d H }n|jd }W d   I d H  n1 I d H sCw   Y  jd|dI d H  d S )N)namesr  r   F)rX  r  	room_infor  )	r   
LiveKitAPIListRoomsRequestrX  
list_roomsroomscreate_roomCreateRoomRequestr  )lk_apiroom_requestactive_roomr\  )r@  rA  rW  rX  r  r?  r8   r9   r    s   (	zH_build_cli.<locals>.connect.<locals>._simulate_job.<locals>.simulate_jobra   )rs   r   )r  )_taskr@  rA  rW  rX  r  r?  r8   r9   r    s   z2_build_cli.<locals>.connect.<locals>._simulate_jobTr  r  r*   r  r  r  ra   )r#   r   r   r1  rK  rs   r  r  r  r  r  r;   r	  r
  r  r   r  r  r  r   r  r  )
r  r?  r@  rA  rX  rW  r  r@   r  r  r=  )rf  r@  rA  rW  rX  r?  r9   connect  s.   %




z_build_cli.<locals>.connectc               
   S  s   t  } d| _t| tj ztjD ]}t	d|j
  |  t	d|j
  qW d S  tyQ } z| d | d|  | d tjddd d }~ww )NTzDownloading files for zFinished downloading files for r  r  r*   r  )r   r   r   r1  r  r  r!   r,  r   r/  packagedownload_filesr   r  r	  r
  )r  r  r  r8   r8   r9   ri    s    


z"_build_cli.<locals>.download_files)rX  r7  rY  r8  r6  r9  r<   r:  r   r;  rB   rC   )r  rC  r?  rD  r@  rE  rA  rF  rB  rG  rB   rC   )r  rC  r  rL  r?  rD  r@  rE  rA  rF  rB   rC   )r  rC  r?  rD  r@  rE  rA  rF  rX  rY  rW  rZ  rB   rC   ra   )r	  Typercommandr(  r/  r.  )r  appr   rM  rP  rg  ri  r8   r=  r9   
_build_cli  s@   //PRrm  AgentServer | WorkerOptionsc                 C  s"   t | tr
t| } t|   d S rR   )rH  r)   r(   from_server_optionsrm  r=  r8   r8   r9   run_app  s   

rp  )r  r   r  r  rB   rC   ra   )
r  rV  r   r   rT  rW  rU  r  rB   r  )r   r   r<   rV  rm  r  rn  r  ra  r^  r`  r   rB   ro  )r  r   rB   rC   )r;  r  rB   r   )r   r  )r<   r  r  r^  r   r^  rB   r  )r  r   r  r&   rB   rC   )r  r   rX  r  rY  r  rB   rC   )r  r(   rX  r  rY  r  r
  r	  r   r   rB   rC   )F)r  r(   r  r  r  r   rB   rC   )r  r(   rB   r2  )r  rn  rB   rC   )
__future__r   rs   r  r   r   enumr  r  r  r  r   r:  r  r(  r  rp   r   r  collections.abcr   r   r   typesr   typingr   r   r	   r
   numpyr   r	  rich.columnsr   rich.consoler   r   r   r   	rich.liver   rich.segmentr   rich.spinnerr   
rich.styler   
rich.tabler   r   	rich.textr   
rich.themer   livekitr   r   _exceptionsr   jobr   r+  r   r  r!   utilsr"   r#   voicer$   r%   voice.run_resultr&   voice.transcriptionr'   r  r(   r)   r  r+   r,   r-   r.   readcharr/   r0   r$  rD  rO  r  r  r  rG  r3   r;   r	  ri   
AudioInputr?   AudioOutputrc   r   r  r  Handlerr   r1  Filterr   rS  rY  rj  r  UpdateFnrw  r  r  r  r  r  r  r  r  r  r'  Enumr(  rm  rp  r8   r8   r8   r9   <module>   s    !z   >, 
 

K
7



N$
-VN
	  #