o
    io                     @  s  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mZm	Z	m
Z
m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mZmZm Z mZ! d	dl"m#Z# d	dl$m%Z%m&Z& d	dl'm(Z(m)Z)m*Z* d	dlm+Z+m,Z, d	dl-m.Z. ddlm/Z/ ddl0m1Z1 ddl2m3Z3 erddl4m5Z5m6Z6 ddl7m8Z8 ddl2m9Z9 eG dd deZ:eG dd dZ;dwd&d'Z<ej=e#de&>d(dxd+d,Z?eG d-d. d.Z@dyd5d6ZAej=e#ddzd7d8ZBeG d9d: d:ZCd{d@dAZDej=e#dd|dDdEZEeG dFdG dGZFd}dMdNZGej=e#dd~dOdPZHeG dQdR dRZIdd`daZJej=e#dddcddZKeG dedf dfZLddmdnZMdoZN	 ddsdtZOddudvZPdS )    )annotationsN)AsyncGeneratorAsyncIterableCallableSequence)	dataclassfield)TYPE_CHECKINGAnyProtocolruntime_checkable)trace)ValidationError)rtc   )llmutils)	ChatChunkChatContextStopResponseToolContextr   )logger)trace_typestracer)USERDATA_TIMED_TRANSCRIPTFlushSentinel
NotGivenOr)aiois_given)	itertools   )io)SpeechHandle)apply_text_transforms)AgentModelSettings)AgentSession)TextTransformsc                   @  s   e Zd ZdddZdS )_ACloseablereturnr
   c                   s   d S N )selfr+   r+   a/var/www/html/livekit_bhavya/venv/lib/python3.10/site-packages/livekit/agents/voice/generation.pyaclose*   s    z_ACloseable.acloseN)r)   r
   )__name__
__module____qualname__r.   r+   r+   r+   r-   r(   (   s    r(   c                   @  sr   e Zd ZU ded< ded< dZded< eedZd	ed
< edd dZded< ee	j
dZded< dZded< dS )_LLMGenerationDatazaio.Chan[str | FlushSentinel]text_chzaio.Chan[llm.FunctionCall]function_ch strgenerated_text)default_factoryzlist[llm.FunctionCall]generated_functionsc                   C  s
   t dS )Nitem_)r   	shortuuidr+   r+   r+   r-   <lambda>3      
 z_LLMGenerationData.<lambda>idasyncio.Future[None]started_futNfloat | Nonettft)r/   r0   r1   __annotations__r7   r   listr9   r>   asyncioFuturer@   rB   r+   r+   r+   r-   r2   -   s   
 r2   node
io.LLMNodechat_ctxr   tool_ctxr   model_settingsr%   r)   -tuple[asyncio.Task[bool], _LLMGenerationData]c                   s   t jttB   t jtj  td tt	| ||| }|
fdd |
fdd d fd	d
}|
| | fS )N)r3   r4   c                         S r*   close_)r3   r+   r-   r<   E       z'perform_llm_inference.<locals>.<lambda>c                   rM   r*   rN   rP   )r4   r+   r-   r<   F   rR   rQ   asyncio.Task[bool]r)   Nonec                   s    j  s j d  d S d S r*   )r@   done
set_resultrP   )datar+   r-   _cleanupH   s   
z'perform_llm_inference.<locals>._cleanuprQ   rS   r)   rT   )r   Chanr6   r   r   FunctionCallr2   rE   create_task_llm_inference_taskadd_done_callback)rG   rI   rJ   rK   llm_taskrX   r+   )rW   r4   r3   r-   perform_llm_inference8   s   
r`   llm_noderW   boolc                   s  t  }t }|jd  |j|j}}| }	|	t
jt|jdddddt
jt|j t
jdd |jD t
jdd |jD i | ||	|}
t|
rV|
I d H }
||	 t|
trr|
|_||
 |t
j|j dS t|
t sydS z|
2 z3 d H W }|j!d u rt  | |_!t|tr| j|7  _|| q|t|t"r|j#sq||j#j$r|j#j$D ],}|j%dkrqt&j'|j( dt)|j* |j+|j,|j-|j.pi d	}|j*/| || q|j#j0r| j|j#j07  _||j#j0 q|t|t1r|| q|t23d
t%|  q|6 W t|
t4r|
5 I d H  nt|
t4r'|
5 I d H  w w |t
j|j |t
j6tdd |j*D  dS )NT)exclude_audioexclude_imageexclude_timestampexclude_metricsc                 S     g | ]}t |jqS r+   typer/   ).0toolr+   r+   r-   
<listcomp>l   s    
z'_llm_inference_task.<locals>.<listcomp>c                 S  rg   r+   rh   )rj   tool_setr+   r+   r-   rl   o   s    Ffunctionz/fnc_)r>   call_idname	argumentsextraz&LLM node returned an unexpected type: c                 S  s   g | ]
}|j d dhdqS )ri   
created_at)exclude)
model_dump)rj   fncr+   r+   r-   rl      s    )7timeperf_counterr   get_current_spanr@   rV   r3   r4   flattenset_attributesr   ATTR_CHAT_CTXjsondumpsto_dictATTR_FUNCTION_TOOLSrD   function_toolskeysATTR_PROVIDER_TOOLSprovider_toolsATTR_TOOL_SETStoolsetsrE   iscoroutineupdate_tools
isinstancer6   r7   send_nowaitset_attributeATTR_RESPONSE_TEXTr   rB   r   delta
tool_callsri   r   r[   r>   lenr9   ro   rp   rq   rr   appendcontentr   r   warningr(   r.   ATTR_RESPONSE_FUNCTION_CALLS)rG   rI   rJ   rK   rW   
start_timecurrent_spanr3   r4   toolsra   chunkrk   fnc_callr+   r+   r-   r]   Q   s   	











'r]   c                   @  s*   e Zd ZU ded< ded< dZded< dS )_TTSGenerationDatazaio.Chan[rtc.AudioFrame]audio_chz/asyncio.Future[aio.Chan[io.TimedString] | None]timed_texts_futNrA   ttfb)r/   r0   r1   rC   r   r+   r+   r+   r-   r      s   
 r   
io.TTSNodeinput"AsyncIterable[str | FlushSentinel]text_transformsSequence[TextTransforms] | None-tuple[asyncio.Task[bool], _TTSGenerationData]c                   sj   t jtj   tjt jtj d B   t d}t	t
| ||||}d fdd}|| ||fS )	Nr   r   rQ   rS   r)   rT   c                   s(     r  }r|     d S r*   )rU   resultrO   )rQ   timed_text_chr   r+   r-   _inference_done   s   z.perform_tts_inference.<locals>._inference_donerY   )r   rZ   r   
AudioFramerE   rF   r!   TimedStringr   r\   _tts_inference_taskr^   )rG   r   rK   r   rW   tts_taskr   r+   r   r-   perform_tts_inference   s   
r   c              	     s  d j j tdd fdd}t|d	d
dfdd}dfdd}t| }d}	d }
z0sP| }
|	||
|	I d H 7 }	rAW t	|I d H  |
d urd|

 I d H  
 I d H  |	dkS t	|I d H  |
d ur|

 I d H  
 I d H  w )Ntts_noder   AsyncIterable[str]pushed_durationfloatr)   c                   s*  rt | } | }t|r|I d H }d}t|ts) s'd  |S  r2 }ntj	t
j  }| |2 zQ3 d H W }d urVjd u rVt  _|d ur|jtg D ]%}t|t
jrt|jru| j|7  _t|jr| j|7  _|| qa | ||j7 }q@6 |S )N        )r#   rE   r   r   r   rU   rV   r   r   rZ   r!   r   r   rw   rx   userdatagetr   r   r   end_timer   duration)r   r   r   audio_durationr   audio_frametext)r   rW   rK   rG   r   r   r   r+   r-   _tts_node_inference   s>   











z0_tts_inference_task.<locals>._tts_node_inferencer   FrT   c                    s6    d 2 z3 d H W } t | tst  d S q6 d S )Nr   )r   r   rw   rx   r   )	input_teer   r+   r-   _get_start_time  s   
z,_tts_inference_task.<locals>._get_start_timeAsyncGenerator[str, None]c                   s8   d 2 z3 d H W } t | tr d S | V  q6 d d S )Nr    T)r   r   r   )finishedr   r+   r-   _input_segment  s   
z+_tts_inference_task.<locals>._input_segmentr   r   )r   r   r   r   r)   r   )r)   rT   )r)   r   )r   r   r   start_as_current_spanr   teerE   r\   r   gracefully_cancelr.   )rG   r   rK   rW   r   r   r   r   _start_time_taskr   input_segmentr+   )	r   rW   r   r   rK   rG   r   r   r   r-   r      s6   %	r   c                   @     e Zd ZU ded< ded< dS )_TextOutputr6   r   r?   first_text_futNr/   r0   r1   rC   r+   r+   r+   r-   r   0     
 r   text_outputio.TextOutput | Nonesourcer   &tuple[asyncio.Task[None], _TextOutput]c                 C  s*   t dt d}tt| ||}||fS )Nr5   )r   r   )r   rE   rF   r\   _text_forwarding_task)r   r   outtaskr+   r+   r-   perform_text_forwarding6  s   r   r   rT   c              	     s   zA|2 z$3 d H W }| j |7  _ | d ur| |I d H  |j s(|jd  q6 W t|tr7| I d H  | d urA|   d S d S t|trO| I d H  | d urX|   w w r*   )	r   capture_textr   rU   rV   r   r(   r.   flush)r   r   r   r   r+   r+   r-   r   >  s(   



r   c                   @  r   )_AudioOutputzlist[rtc.AudioFrame]audiozasyncio.Future[float]first_frame_futNr   r+   r+   r+   r-   r   T  s   
 r   audio_outputio.AudioOutput
tts_outputAsyncIterable[rtc.AudioFrame]'tuple[asyncio.Task[None], _AudioOutput]c                 C  s*   t g t d}tt| ||}||fS )N)r   r   )r   rE   rF   r\   _audio_forwarding_task)r   r   r   r   r+   r+   r-   perform_audio_forwarding[  s   r   c                   s  d }d fdd}z|  d| |   |2 zF3 d H W } j|  j sB| jd urB|j| jkrB|d u rBtj|j| j|j	d}|rU|
|D ]
}| |I d H  qIq| |I d H  q6 |rp| D ]
}| |I d H  qeW | d|  j s j  t|trz	| I d H  W n ty } ztjd	|d
 W Y d }~nd }~ww |   d S | d|  j s j  t|trz	| I d H  W n ty } ztjd	|d
 W Y d }~nd }~ww |   w )Nevio.PlaybackStartedEventr)   rT   c                   s     j  s j | j d S d S r*   )r   rU   rV   rs   )r   r   r+   r-   _on_playback_startedm  s   
z4_audio_forwarding_task.<locals>._on_playback_startedplayback_started)
input_rateoutput_ratenum_channelszerror while closing tts output)exc_info)r   r   r)   rT   )onresumer   r   r   rU   sample_rater   AudioResamplerr   pushcapture_framer   offcancelr   r(   r.   	Exceptionr   error)r   r   r   	resamplerr   framefer+   r   r-   r   e  sd   







r   c                   @  r   )_ToolOutputzlist[ToolExecutionOutput]outputr?   first_tool_started_futNr   r+   r+   r+   r-   r     r   r   sessionr&   speech_handler"   tool_choiceNotGivenOr[llm.ToolChoice]function_streamAsyncIterable[llm.FunctionCall]tool_execution_started_cb!Callable[[llm.FunctionCall], Any]tool_execution_completed_cb$Callable[[ToolExecutionOutput], Any]&tuple[asyncio.Task[None], _ToolOutput]c           	      C  s:   t g t d}tjt| |||||||ddd}||fS )N)r   r   )r   r   rJ   r   r   tool_outputr   r   execute_tools_taskrp   )r   rE   rF   r\   _execute_tools_task)	r   r   rJ   r   r   r   r   r  r   r+   r+   r-   perform_tool_executions  s   

r  r  c                   s  ddl m} ddlm}	 d8fdd	 g zzj|2 zU3 d
H W }
|dkr5tjd|
jjdd q|j	|
j }d
u rRtj
d|
j d|
jjdd qt|tjtjfsmtjdt| |
jjdd qz|
jprd}tj|||	| |
dd\}}W n0 ttfy } z"tjd|
j d|
j|
jjdd  t|
d
|d W Y d
}~qd
}~ww j sjd
 ||
 zddlm} |	i 	t| ji }|	|
j }rtjd|
j|
jjdd d9d d!}tj||g|R i |}ntjd"|
j|
jjdd tj|g|R i |}t !d#d: fd'd(}t"j#|||
d)|
j d*}|||
d+d, $| |%fd-d. W q t&ys } ztjd/|
jjdd  t|
d
|d W Y d
}~qd
}~ww 6 t"'t"j(d0d+iI d
H  W n, t"j)y   t*d1krd2d3 D }tjd4|jd5d t"j( I d
H  Y nw W t+j,j- I d
H  t*j.d1krtjd6d7jid d
S d
S t+j,j- I d
H  t*j.d1krtjd6d7jid w w );zUexecute tools, when cancelled, stop executing new tools but wait for the pending onesr    )_set_activity_task_info)
RunContextr   ToolExecutionOutputr)   rT   c                   s    |  j |  d S r*   )r   r   r   )r   r  r+   r-   _tool_completed  s   z,_execute_tools_task.<locals>._tool_completedNnonez=received a tool call with tool_choice set to 'none', ignoringrn   	speech_idrr   zunknown AI function ``zunknown tool type: z{})r   r   function_call)rv   json_argumentscall_ctxztried to call AI function `z` with invalid arguments)rn   rq   r  r   r   	exception)_MockToolsContextVarzexecuting mock toolmockr   fnc_argsr
   
fnc_kwargsc           	        s   t | }dd |j D }t|}|d | }dd |j D   fdd| D }|j|i |}|  t | rL| |ji |j	I d H S | |ji |j	S )Nc                 S  *   g | ]\}}|j tjjtjjfv r|qS r+   )kindinspect	ParameterPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORDrj   rp   paramr+   r+   r-   rl   &      z:_execute_tools_task.<locals>._run_mock.<locals>.<listcomp>c                 S  r  r+   )r  r  r  KEYWORD_ONLYr  r  r+   r+   r-   rl   1  r!  c                   s   i | ]\}}| v r||qS r+   r+   )rj   kvkw_param_namesr+   r-   
<dictcomp>:  s    z:_execute_tools_task.<locals>._run_mock.<locals>.<dictcomp>)
r  	signature
parametersitemsr   bind_partialapply_defaultsiscoroutinefunctionargskwargs)	r  r  r  sigpos_param_namesmax_positionaltrimmed_argstrimmed_kwargsboundr+   r%  r-   	_run_mock#  s$   
	
	
z&_execute_tools_task.<locals>._run_mockzexecuting toolfunction_toolfunction_callabler   llm.FunctionCallc              
     s   t  }|tj|jtj|jtj|j	i z|  I d H }t
||d d}W n* tyO } zt|ts>tjd|jjdd t
|d |d}W Y d }~nd }~ww |j }re|tj|j |tj|j  | d S )Nr  'exception occurred while executing toolr  r  )r   ry   r{   r   ATTR_FUNCTION_TOOL_IDro   ATTR_FUNCTION_TOOL_NAMErp   ATTR_FUNCTION_TOOL_ARGSrq   make_tool_outputBaseExceptionr   r   r   r  r>   fnc_call_outr   ATTR_FUNCTION_TOOL_OUTPUTr   ATTR_FUNCTION_TOOL_IS_ERRORis_error)r8  r   r   valr   r   r@  )r
  r   r+   r-   _traceable_fnc_toolR  s8   

	z0_execute_tools_task.<locals>._traceable_fnc_tool
func_exec_r  T)r   r  inline_taskc                   s
     | S r*   )remove)r   )tasksr+   r-   r<   ~  r=   z%_execute_tools_task.<locals>.<lambda>r:  return_exceptionsr   c                 S  s   g | ]}|  qS r+   )get_name)rj   r   r+   r+   r-   rl     s    z'_execute_tools_task.<locals>.<listcomp>z;waiting for function call to finish before fully cancelling)	functionsr  ztools execution completedr  )r   r	  r)   rT   )r  r   r  r
   r  r
   r)   r
   )r8  r   r   r9  r)   rT   )/agentr  eventsr  r   r   rp   r>   r   r   r   r   r   FunctionToolRawFunctionToolri   rq   	llm_utilsprepare_function_argumentsr   
ValueErrorr  r>  r   rU   rV   
run_resultr  current_agentdebug	functoolspartialr   r   rE   r\   r   r^   r   shieldgatherCancelledErrorr   r   r   cancel_and_waitr   )r   r   rJ   r   r   r   r   r  r  r  r   r7  	json_argsr  r  r   r  
mock_toolsr  r6  r8  rE  r   namesr+   )r
  r   rI  r   r  r-   r    s
  





	##

   9
r  c                   @  sH   e Zd ZU ded< ded< ded< ded< d	ed
< eddZded< dS )r	  r9  r   zllm.FunctionCallOutput | Noner@  zAgent | None
agent_taskr
   
raw_outputBaseException | Noneraw_exceptionT)defaultrb   reply_requiredN)r/   r0   r1   rC   r   re  r+   r+   r+   r-   r	    s   
 r	  r   r9  r   r
   r  rb  c                   s`  ddl m  t|tr|}d }|d ur'tj| d |d}t|  |jd ||dS d }|}t|t	s?t|t
s?t|ts?t|tr fdd|D } fdd|D }t|dkrrtjd| j d	| j|d
d t|  d d ||dS tt|d }|d u r|n|sd nt|dkr|d n|}n	t| r|}d }tj| |d d}t|  |j|d u|||dS )Nr    r$   r  )r   r@  r`  ra  rc  c                   s   g | ]	}t | r|qS r+   r   rj   itemrf  r+   r-   rl         z$make_tool_output.<locals>.<listcomp>c                   s   g | ]	}t | s|qS r+   rg  rh  rf  r+   r-   rl     rj  zAI function `z<` returned multiple AgentTask instances, ignoring the output)ro   r   r  r   )r   r@  re  r`  ra  rc  )rM  r$   r   r?  rQ  make_function_call_outputr	  
model_copyr@  rD   set	frozensettupler   r   r   rp   ro   nextiter)r   r   r  base_resultr   fnc_outagent_tasksother_outputsr+   rf  r-   r>    sv   


r>  zlk.agent_task.instructionsinstructionsr6   add_if_missingc                C  sx   |  t}|dur(| j| jdkr$tjtd|g| j| jd| j|< dS td|r:| jdtjtd|gd dS dS )a?  
    Update the instruction message in the chat context or insert a new one if missing.

    This function looks for an existing instruction message in the chat context using the identifier
    'INSTRUCTIONS_MESSAGE_ID'.

    Raises:
        ValueError: If an existing instruction message is not of type "message".
    Nmessagesystem)r>   roler   rs   zEexpected the instructions inside the chat_ctx to be of type 'message'r   )r>   rz  r   )	index_by_idINSTRUCTIONS_MESSAGE_IDr*  ri   r   ChatMessagers   rS  insert)rI   rv  rw  idxr+   r+   r-   update_instructions  s$   


r  c                 C  s$   	 |  t }r| j| nd S qr*   )	get_by_idr|  r*  rH  )rI   msgr+   r+   r-   remove_instructions  s
   r  )
rG   rH   rI   r   rJ   r   rK   r%   r)   rL   )rG   rH   rI   r   rJ   r   rK   r%   rW   r2   r)   rb   )
rG   r   r   r   rK   r%   r   r   r)   r   )rG   r   r   r   rK   r%   rW   r   r   r   r)   rb   )r   r   r   r   r)   r   )r   r   r   r   r   r   r)   rT   )r   r   r   r   r)   r   )r   r   r   r   r   r   r)   rT   )r   r&   r   r"   rJ   r   r   r   r   r   r   r   r   r   r)   r  )r   r&   r   r"   rJ   r   r   r   r   r   r   r   r   r   r  r   r)   rT   )r   r9  r   r
   r  rb  r)   r	  )rI   r   rv  r6   rw  rb   r)   rT   )rI   r   r)   rT   )Q
__future__r   rE   rW  r  r}   rw   collections.abcr   r   r   r   dataclassesr   r   typingr	   r
   r   r   opentelemetryr   pydanticr   livekitr   r5   r   r   r   r   r   r   rQ  logr   	telemetryr   r   typesr   r   r   r   r   	utils.aior   r!   r   r"   transcription.filtersr#   rM  r$   r%   agent_sessionr&   r'   r(   r2   r`   log_exceptionsr   r]   r   r   r   r   r   r   r   r   r   r   r  r  r	  r>  r|  r  r  r+   r+   r+   r-   <module>   s|    


h

S




7

 f
	I
 