
    /j<                    H   S SK Jr  S SKrS SKrS SKrS SKJrJr  S SKJ	r	J
r
  S SKJrJr  S SKJr  S SKJrJrJrJrJr  S SKJr  S S	KJr  S S
KJrJrJr  S SKJr  S SKJ r   SSK!J"r"  SSK#J$r$J%r%J&r&  SSK'J(r(  SSK)J*r*  SSK+J,r,J-r-J.r.J"r/  SSKJ0r0J1r1J2r2J3r3  SSK"J4r4  SSK5J6r6J7r7  SSK8J9r9J:r:   " S S\5      r; " S S\5      r< " S S\5      r= " S S\5      r> " S  S!\5      r? " S" S#\5      r@\" S$5      rA " S% S&\\R                  \S'   \A-     \\A   5      rC " S( S)\5      rDg)*    )annotationsN)ABCabstractmethod)AsyncIterableAsyncIterator)datetimetimezone)TracebackType)AnyClassVarGenericLiteralTypeVar)trace)AttributeValue)	BaseModel
ConfigDictField)rtc)Metadata   )utils)APIConnectionErrorAPIErrorAPIStatusErrorlogger)
LLMMetrics)_chat_ctx_to_otel_eventstrace_typestracerr   )DEFAULT_API_CONNECT_OPTIONS	NOT_GIVENAPIConnectOptions
NotGivenOr)aio   )ChatContextChatRole)Tool
ToolChoicec                  x    \ rS rSr% S\S'    S\S'    SrS\S'    SrS\S'    SrS\S'    S\S	'    S
rS\S'   Sr	g
)CompletionUsage#   intcompletion_tokensprompt_tokensr   prompt_cached_tokenscache_creation_tokenscache_read_tokenstotal_tokensN
str | Noneservice_tier )
__name__
__module____qualname____firstlineno____annotations__r2   r3   r4   r7   __static_attributes__r8       G/app/agent/.venv/lib/python3.13/site-packages/livekit/agents/llm/llm.pyr-   r-   #   sW    1C !#!1!"3"8s3G#L*#Kr?   r-   c                  P    \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S	rS
\S'   Srg	)FunctionToolCall5   functionzLiteral['function']typestrname	argumentscall_idNdict[str, Any] | Noneextrar8   )r9   r:   r;   r<   rE   r=   rK   r>   r8   r?   r@   rB   rB   5   s*     *D
*
INL#'E 'Ir?   rB   c                  ^    \ rS rSr% SrS\S'   \" \S9rS\S'   Sr	S	\S
'   \" \
S9rS\S'   Srg)CollectedResponse>    rF   textdefault_factorylist[FunctionToolCall]
tool_callsNCompletionUsage | Noneusagezdict[str, Any]rK   r8   )r9   r:   r;   r<   rP   r=   r   listrT   rV   dictrK   r>   r8   r?   r@   rM   rM   >   s;    D#N).t)DJ&D$(E!(!$7E>7Cr?   rM   c                  V    \ rS rSr% SrS\S'   SrS\S'   \" \S9r	S\S	'   Sr
S
\S'   Srg)ChoiceDeltaG   NzChatRole | Noneroler6   contentrQ   rS   rT   rJ   rK   r8   )r9   r:   r;   r<   r\   r=   r]   r   rW   rT   rK   r>   r8   r?   r@   rZ   rZ   G   s4     D/ GZ).t)DJ&D#'E 'Ir?   rZ   c                  <    \ rS rSr% S\S'   SrS\S'   SrS\S'   S	rg)
	ChatChunkO   rF   idNzChoiceDelta | NonedeltarU   rV   r8   )r9   r:   r;   r<   r=   rb   rV   r>   r8   r?   r@   r_   r_   O   s    G $E$$(E!(r?   r_   c                  f    \ rS rSr% \" SS9rSrS\S'   S\S'   S	\S
'   \" SSS9r	S\S'   S\S'   Sr
g)LLMErrorU   T)arbitrary_types_allowed	llm_errorzLiteral['llm_error']rE   float	timestamprF   label.)exclude	Exceptionerrorboolrecoverabler8   N)r9   r:   r;   r<   r   model_configrE   r=   r   rm   r>   r8   r?   r@   rd   rd   U   s9    d;L!,D
,JS$/E9/r?   rd   TEventc                     ^  \ rS rSrSU 4S jjr\SS j5       r\SS j5       r\SS j5       r\	S\
\\\S.             SS jj5       rSS	 jrSS
 jrSS jr        SS jrSrU =r$ )LLMa   c                   > [         TU ]  5         [        U 5      R                   S[        U 5      R                   3U l        g )N.)super__init__rE   r:   r9   _label)self	__class__s    r@   rx   LLM.__init__f   s6    d../qd1D1D0EFr?   c                    U R                   $ Nry   rz   s    r@   rj   	LLM.labelj       {{r?   c                    g)zGet the model name/identifier for this LLM instance.

Returns:
    The model name if available, "unknown" otherwise.

Note:
    Plugins should override this property to provide their model information.
unknownr8   r   s    r@   model	LLM.modeln        r?   c                    g)zGet the provider name/identifier for this LLM instance.

Returns:
    The provider name if available, "unknown" otherwise.

Note:
    Plugins should override this property to provide their provider information.
r   r8   r   s    r@   providerLLM.providerz   r   r?   N)toolsconn_optionsparallel_tool_callstool_choiceextra_kwargsc                   g r~   r8   )rz   chat_ctxr   r   r   r   r   s          r@   chatLLM.chat   s     r?   c                    g)z&Pre-warm connection to the LLM serviceNr8   r   s    r@   prewarmLLM.prewarm   s    r?   c                   #    g 7fr~   r8   r   s    r@   aclose
LLM.aclose   s     C   c                   #    U $ 7fr~   r8   r   s    r@   
__aenter__LLM.__aenter__   
        c                @   #    U R                  5       I S h  vN   g  N7fr~   r   rz   exc_typeexcexc_tbs       r@   	__aexit__LLM.__aexit__         kkm   r   returnNone)r   rF   )r   r(   r   zlist[Tool] | Noner   r$   r   zNotGivenOr[bool]r   zNotGivenOr[ToolChoice]r   zNotGivenOr[dict[str, Any]]r   	LLMStream)r   rs   r   ztype[BaseException] | Noner   zBaseException | Noner   zTracebackType | Noner   r   )r9   r:   r;   r<   rx   propertyrj   r   r   r   r"   r#   r   r   r   r   r   r>   __classcell__)r{   s   @r@   rs   rs   a   s    
G   	 	 	 	 
 $(*E09.73<	 	 !		
 (	 .	 ,	 1	 
	 	 (, " %	
 
 r?   rs   )metrics_collectedrm   c                     \ rS rSr% SrS\S'             SS jr\SS j5       rSS jr	SS jr
\R                  " \S	9SS
 j5       r\SS j5       r\SS j5       rSS jrSS jrSS jrSS jr        SS jrS S jrS!S jrSrg)"r      llm_requestzClassVar[str]_llm_request_span_namec                  ^  UT l         UT l        UT l        UT l        [        R
                  [           " 5       T l        [        R                  R                  T R                  S5      T l
        T R                  u  T l        nST l        [        R                  " T R                  U5      SS9T l        SU 4S jjn[        R                  " U" 5       SS9T l        T R"                  R%                  U 4S j5        S T l        g )	Nr   FzLLM._metrics_task)rG   c                   >#    [         R                  " TR                  SS9 n [        TR                  5       H  u  pU R                  X5        M     TR                  5       I S h  vN   S S S 5        g  N! , (       d  f       g = f7f)NF)end_on_exit)r!   start_as_current_spanr   r   	_chat_ctx	add_event
_main_task)spanrG   
attributesrz   s      r@   _traceable_main_task0LLMStream.__init__.<locals>._traceable_main_task   sn     --++(@(P$DNN44 )Qoo''' 
 ( s/    BAA6&A4'A6+	B4A66
B BzLLM._main_taskc                8   > TR                   R                  5       $ r~   )	_event_chclose)_rz   s    r@   <lambda>$LLMStream.__init__.<locals>.<lambda>   s    t~~/C/C/Er?   r   )_llmr   _tools_conn_optionsr&   Chanr_   r   	itertoolstee
_tee_aiter_event_aiter_current_attempt_has_errorasynciocreate_task_metrics_monitor_task_metrics_task_taskadd_done_callback_llm_request_span)rz   llmr   r   r   monitor_aiterr   s   `      r@   rx   LLMStream.__init__   s     	!)),.--++DNNA>+/??(=*/'$00&&}5<O
	( (()=)?FVW


$$%EF48r?   c                   #    g 7fr~   r8   r   s    r@   _runLLMStream._run   s     "%r   c           	       #    [         R                  " 5       U l        U R                  R                  [        R
                  S[        R                  U R                  R                  [        R                  U R                  R                  05        [        U R                  R                  S-   5       H]  n [        R                  " S5       nUR!                  [        R"                  U5         U R%                  5       I S h  vN sS S S 5        s  $    g  N! [&         a  n[(        R*                  " X#5        e S nAff = f! , (       d  f       M  = f! [,         GaP  n[/        U[0        5      (       a  UR2                  S:X  a   S nA  g U R                  R5                  U5      nU R                  R                  S:X  d  UR6                  (       d  U R9                  USS9  e XR                  R                  :X  a7  U R9                  USS9  [;        SU R                  R                  S-    S	35      UeU R9                  US
S9  [<        R>                  " SU SU S3U R                  R@                  US-   S.S9  US:  a  [B        RD                  " U5      I S h  vN    SU l#         S nAGM  S nAf[&         a  nU R9                  USS9  e S nAff = f7f)Nr   r'   llm_request_runi  r   F)ro   z(failed to generate LLM completion after z	 attemptsTz#failed to generate LLM completion: z, retrying in s)r   attempt)rK   )$r   get_current_spanr   set_attributesr    ATTR_GEN_AI_OPERATION_NAMEATTR_GEN_AI_PROVIDER_NAMEr   r   ATTR_GEN_AI_REQUEST_MODELr   ranger   	max_retryr!   r   set_attributeATTR_RETRY_COUNTr   rl   telemetry_utilsrecord_exceptionr   
isinstancer   status_code_interval_for_retry	retryable_emit_errorr   r   warningry   r   sleepr   )rz   iattempt_spaneretry_intervals        r@   r   LLMStream._main_task   sV    !&!7!7!9--6655tyy7I7I55tyy	
 t))33a78A*112CD ..{/K/KQO%)YY[0 ED 9
  1$ '88I	 ED  8a00Q]]c5I!%!3!3!G!G!J%%//14AKK$$QE$:,,666$$QE$:,B4CUCUC_C_bcCcBddmn
 $$QD$9NN=aS~N^^_`#'99#3#3'(1u "A%!--777 38//    6s   B3K6E!D?.DDD	EKD
D< D77D<<D??
E		EKEK
%J'KDJ'JJ' K'K
4KK

Kc           
         SU l         U R                  R                  S[        [        R                  " 5       U R                  R
                  UUS95        g )NTrm   )ri   rj   rm   ro   )r   r   emitrd   timery   )rz   	api_errorro   s      r@   r   LLMStream._emit_error  sA    *.'		))+ii&&'		
r?   r   c                @  #    [         R                  " 5       nSnSnS nSn/ nS nU  S h  vN n	U	R                  nUS:X  aJ  [         R                  " 5       U-
  n[        R                  " [
        R                  5      R                  5       nU	R                  (       as  U	R                  R                  (       a  XiR                  R                  -  nU	R                  R                  (       a%  UR                  U	R                  R                  5        U	R                  c  M  U	R                  nGM   GN
 [         R                  " 5       U-
  n
U R                  (       d  US:  a  g [        [         R                   " 5       UUU
U R                  R!                  5       U R"                  R$                  U(       a  UR&                  OSU(       a  UR(                  OSU(       a  UR*                  OSU(       a  UR,                  OSU(       a  UR&                  U
-  OS[/        U R"                  R0                  U R"                  R2                  S9S9nU R4                  (       Ga  U R4                  R7                  [8        R:                  UR=                  5       5        U R4                  R?                  [8        R@                  S[8        RB                  U R"                  R0                  [8        RD                  U R"                  R2                  [8        RF                  UR(                  [8        RH                  UR&                  05        U(       a.  U R4                  R7                  [8        RJ                  SU S35        S	S
0nU(       a  XlS'   U(       aU  U Vs/ s H>  n[L        RN                  " URP                  URR                  S.URT                  SS.5      PM@     Os  snf snUS'   U R4                  RW                  [8        RX                  U5        U R"                  R[                  SU5        g 7f)Ng      rO   r   g        )
model_namemodel_provider)ri   
request_idttftduration	cancelledrj   r0   r1   r2   r5   tokens_per_secondmetadatar   "r\   	assistantr]   )rG   rH   rD   )rD   ra   rE   rT   r   ).r   perf_counterra   r   nowr	   utc	isoformatrb   r]   rT   extendrV   r   r   r   r  r   ry   r0   r1   r2   r5   r   r   r   r   r   r    ATTR_LLM_METRICSmodel_dump_jsonr   r   r   r   ATTR_GEN_AI_USAGE_INPUT_TOKENSATTR_GEN_AI_USAGE_OUTPUT_TOKENS#ATTR_LANGFUSE_COMPLETION_START_TIMEjsondumpsrG   rH   rI   r   EVENT_GEN_AI_CHOICEr   )rz   event_aiter
start_timer  r   rV   response_contentrT   completion_start_timeevr  metricscompletion_event_body	tool_calls                 r@   r   LLMStream._metrics_monitor_task  s$    &&(

(,-/
,0# 	!"Jt|((*Z7(0X\\(B(L(L(N%xx88##$(8(88$88&&%%bhh&9&9:xx#	! $$&3 **dQhiik!jj**,))""9>e55A16%--A?D!;!;!/4++!DIe55@s99??#yy11
" !!!""00,,g.E.E.G
 ""11::F99499??99499;M;M>>@U@U??AZAZ %&&44CCqI^H__`Ea AG?T!3Ci0 &0	7 &0	 JJ1:iNaNa(b"+"3"3$. &0	7%l3 "",,[-L-LNcd		*G4s;   $PD0D-D0C,PP-D00IPAOAPc                    U R                   $ r~   )r   r   s    r@   r   LLMStream.chat_ctxg  s    ~~r?   c                    U R                   $ r~   )r   r   s    r@   r   LLMStream.toolsk  r   r?   c                8  #    [         R                  " U R                  5      I S h  vN   U R                  I S h  vN   U R                  (       a!  U R                  R                  5         S U l        U R                  R                  5       I S h  vN   g  Nm N[ N	7fr~   )r&   cancel_and_waitr   r   r   endr   r   r   s    r@   r   LLMStream.acloseo  sr     !!$**---    !!""&&(%)D"oo$$&&& 	. 
 	's2   $BBBBABBBBBc                  #     U R                   R                  5       I S h  vN nU$  N! [         aJ    U R                  R	                  5       (       d#  U R                  R                  5       =n(       a  Ue[        S ef = f7fr~   )r   	__anext__StopAsyncIterationr   r  	exception)rz   valr   s      r@   r'  LLMStream.__anext__x  sr     	/))3355C 
 6! 	/::''))djj6J6J6L/Ls/L	$$.		/s&   B* (* B* AA>>Bc                    U $ r~   r8   r   s    r@   	__aiter__LLMStream.__aiter__  s    r?   c                   #    U $ 7fr~   r8   r   s    r@   r   LLMStream.__aenter__  r   r   c                @   #    U R                  5       I S h  vN   g  N7fr~   r   r   s       r@   r   LLMStream.__aexit__  r   r   c                "   ^  SU 4S jjnU" 5       $ )zi
Convert the LLMStream to an async iterable of strings.
This assumes the stream will not call any tools.
c                0  >#    T IS h  vN   T  S h  vN n U R                   (       d  M  U R                   R                  (       d  M9  U R                   R                  7v   MT   NZ NQ
 S S S 5      IS h  vN    g ! , IS h  vN  (       d  f       g = f7fr~   )rb   r]   )chunkrz   s    r@   	_iterable,LLMStream.to_str_iterable.<locals>._iterable  sX     t#' 2%{{{u{{':':':#kk111 24 tttttso   BA%BA<A)A'A)A<A<
A<%B'A))A<*B5A86B<BBBBr   zAsyncIterable[str]r8   )rz   r6  s   ` r@   to_str_iterableLLMStream.to_str_iterable  s    	2 {r?   c                  #    / n/ nSn0 nU  ISh  vN   U   Sh  vN nUR                   (       a  UR                   R                  (       a%  UR                  UR                   R                  5        UR                   R                  (       a%  UR	                  UR                   R                  5        UR                   R
                  (       a%  UR                  UR                   R
                  5        UR                  c  M  UR                  nM   N N
 SSS5      ISh  vN    O! , ISh  vN  (       d  f       O= f[        SR                  U5      R                  5       UUUS9$ 7f)a  Collect the entire stream into a single response.

Example:
    ```python
    from livekit.agents import llm

    response = await my_llm.chat(chat_ctx=ctx, tools=tools).collect()

    for tc in response.tool_calls:
        result = await llm.execute_function_call(tc, tool_ctx)
        ctx.insert(result.fnc_call)
        if result.fnc_call_out:
            ctx.insert(result.fnc_call_out)
    ```
NrO   )rP   rT   rV   rK   )rb   r]   appendrT   r  rK   updaterV   rM   joinstrip)rz   
text_partsrT   rV   rK   r5  s         r@   collectLLMStream.collect  s       !#
-/
(, "4# 	(e;;{{**"))%++*=*=>{{--"))%++*@*@A{{((U[[%6%67;;*!KKE 	(t 44444 !$**,!	
 	
sk   E)DE)D&DDDCD&D&E)DD&E)D" E)&D=,D/-D=90E))r   r   r   r   r   r   r   r   r   r   r   N)
r   rs   r   r(   r   
list[Tool]r   r$   r   r   r   )r   rl   ro   rn   r   r   )r  zAsyncIterable[ChatChunk]r   r   )r   r(   )r   rC  )r   r_   )r   zAsyncIterator[ChatChunk])r   r   r   r8  )r   rM   )r9   r:   r;   r<   r   r=   rx   r   r   r   r   r   log_exceptionsr   r   r   r   r   r   r'  r-  r   r   r9  rA  r>   r8   r?   r@   r   r      s    ,9M9 9 9 	 9
  9 ( 9 
 9D % %5n

 (U5 )U5n    '	, " %	
 
&
r?   r   )E
__future__r   r   r  r   abcr   r   collections.abcr   r   r   r	   typesr
   typingr   r   r   r   r   opentelemetryr   opentelemetry.util.typesr   pydanticr   r   r   livekitr   livekit.agents.metrics.baser   rO   r   _exceptionsr   r   r   logr   r  r   	telemetryr   r    r!   r   r"   r#   r$   r%   r&   chat_contextr(   r)   tool_contextr*   r+   r-   rB   rM   rZ   r_   rd   rq   EventEmitterrs   r   r8   r?   r@   <module>rU     s    "    # 8 '  ; ;  3 1 1  0  F F    _ _   / *Ki K$Jy JC	 CJ) J)	 )y  
	@W9:VCDFO@Fa
 a
r?   