+
    ~j1*                    f   ^ RI Ht ^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RIH	t	H
t
Ht ^RIHtHt ^RIHt ^RIHtHtHtHt ^R	IHt ^R
IHtHtHt ^RIHtHt ]! ^ ]P>                  R7      t ] ! R R4      4       t!] ! R R4      4       t" ! R R]]R,          ,          4      t# ! R R]4      t$R# )    )annotationsN)AsyncIterable)	dataclass)AnyClassVarLiteral)APIConnectionErrorAPIError)logger)DEFAULT_API_CONNECT_OPTIONS	NOT_GIVENAPIConnectOptions
NotGivenOr)ChatContext)LLM	ChatChunk	LLMStream)Tool
ToolChoice)	max_retrytimeoutc                  ,    ] tR t^t$ R]R&   R]R&   RtR# )
_LLMStatusbool	availablezasyncio.Task[None] | Nonerecovering_task N__name__
__module____qualname____firstlineno____annotations____static_attributes__r       x/Users/mitch_tango/dev/rabbit-r1-livekit/agent/.venv/lib/python3.14/site-packages/livekit/agents/llm/fallback_adapter.pyr   r      s    O..r%   r   c                  ,    ] tR t^t$ R]R&   R]R&   RtR# )AvailabilityChangedEventr   llmr   r   r   Nr   r   r%   r&   r(   r(      s    	HOr%   r(   c            
         a  ] tR t^"tRtRRR^ RRRR/R	 V 3R
 lllt]R R l4       t]R R l4       tRRR]	R]
R]
R]
/R R lltR R ltR R ltRtV ;t# )FallbackAdapterzxAgent Fallback Adapter for LLM. Manages multiple STT instances with automatic fallback
when the primary provider fails.
attempt_timeoutg      @max_retry_per_llmretry_intervalg      ?retry_on_chunk_sentFc               0    V ^8  d   QhRRRRRRRRRR	R
R/# )   r)   z	list[LLM]r,   floatr-   intr.   r/   r   returnNoner   )formats   "r&   __annotate__FallbackAdapter.__annotate__)   sN     (M (M(M 	(M (M (M "(M 
(Mr%   c               V  < \        V4      ^8  d   \        R4      h\        SV `  4        Wn        W n        W0n        W@n        WPn        V P                   Uu. uF  p\        RRR7      NK  	  upV n
        V P                   F  pVP                  RV P                  4       K!  	  R# u upi )a  FallbackAdapter is an LLM that can fallback to a different LLM if the current LLM fails.

Args:
    llm (list[LLM]): List of LLM instances to fallback to.
    attempt_timeout (float, optional): Timeout for each LLM attempt. Defaults to 5.0.
    max_retry_per_llm (int, optional): Internal retries per LLM. Defaults to 0, which means no
        internal retries, the failed LLM will be skipped and the next LLM will be used.
    retry_interval (float, optional): Interval between retries. Defaults to 0.5.
    retry_on_chunk_sent (bool, optional): Whether to retry when a LLM failed after chunks
        are sent. Defaults to False.

Raises:
    ValueError: If no LLM instances are provided.
z+at least one LLM instance must be provided.TN)r   r   metrics_collected)len
ValueErrorsuper__init___llm_instances_attempt_timeout_max_retry_per_llm_retry_interval_retry_on_chunk_sentr   _statuson_on_metrics_collected)	selfr)   r,   r-   r.   r/   _llm_instance	__class__s	   &&$$$$  r&   r>   FallbackAdapter.__init__)   s    0 s8a<JKK! /"3-$7! GKFYFY
FYJt<FY
 !//LOO/1K1KL 0	
s   B&c                   V ^8  d   QhRR/# r1   r4   strr   )r6   s   "r&   r7   r8   T   s     ! !s !r%   c                	    R # )r+   r   rG   s   &r&   modelFallbackAdapter.modelS   s     r%   c                   V ^8  d   QhRR/# rM   r   )r6   s   "r&   r7   r8   X   s      # r%   c                	    R # )livekitr   rP   s   &r&   providerFallbackAdapter.providerW   s    r%   toolsNconn_optionsparallel_tool_callstool_choiceextra_kwargsc               4    V ^8  d   QhRRRRRRRRR	R
RRRR/# )r1   chat_ctxr   rX   zlist[Tool] | NonerY   r   rZ   NotGivenOr[bool]r[   NotGivenOr[ToolChoice]r\   NotGivenOr[dict[str, Any]]r4   r   r   )r6   s   "r&   r7   r8   [   sR     
 
 
 !	

 (
 .
 ,
 1
 

r%   c          
     	:    \        T TTT;'       g    . VVVR 7      # ))r)   rY   r^   rX   rZ   r[   r\   )FallbackLLMStream)rG   r^   rX   rY   rZ   r[   r\   s   &$$$$$$r&   chatFallbackAdapter.chat[   s,     !%++2 3#%
 	
r%   c                   V ^8  d   QhRR/# r1   r4   r5   r   )r6   s   "r&   r7   r8   o   s     N Nd Nr%   c                	l   "   V P                    F  pVP                  R V P                  4       K!  	  R# 5ir:   N)r?   offrF   )rG   rI   s   & r&   acloseFallbackAdapter.acloseo   s,      //L0$2L2LM 0s   24c               $    V ^8  d   QhRRRRRR/# )r1   argsr   kwargsr4   r5   r   )r6   s   "r&   r7   r8   s   s!     8 83 8# 8$ 8r%   c                	2    V P                   ! R .VO5/ VB  R# ri   )emit)rG   rn   ro   s   &*,r&   rF   %FallbackAdapter._on_metrics_collecteds   s    		%777r%   )r@   r?   rA   rB   rC   rD   )r   r    r!   r"   __doc__r>   propertyrQ   rV   $DEFAULT_FALLBACK_API_CONNECT_OPTIONSr   rd   rk   rF   r$   __classcell__rJ   s   @r&   r+   r+   "   s    (M "%	(M "#(M !$(M %*(M (MT ! !  
 $(	

 +O
 1:
 /8
 4=
(N8 8r%   r+   llm_availability_changedc                     a  ] tR t^wt$ RtR]R&   R]R]R]/R V 3R lllt]R	 R
 l4       t	]R R l4       t
RR/R R lltR R ltR R ltR R ltRtV ;t# )rc   llm_fallback_adapterzClassVar[str]_llm_request_span_namerZ   r[   r\   c               8    V ^8  d   QhRRRRRRRRR	R
RRRRRR/# )r1   r)   r+   r^   r   rX   
list[Tool]rY   r   rZ   r_   r[   r`   r\   ra   r4   r5   r   )r6   s   "r&   r7   FallbackLLMStream.__annotate__z   sZ     6 66 	6
 6 (6 .6 ,6 16 
6r%   c               	h   < \         SV `  WW4R 7       Wn        WPn        W`n        Wpn        RV n        R# ))r^   rX   rY   N)r=   r>   _fallback_adapter_parallel_tool_calls_tool_choice_extra_kwargs_current_stream)	rG   r)   r^   rX   rY   rZ   r[   r\   rJ   s	   &&$$$$$$r&   r>   FallbackLLMStream.__init__z   s7     	uX!$$7!')15r%   c                   V ^8  d   QhRR/# )r1   r4   r   r   )r6   s   "r&   r7   r~      s     - -+ -r%   c                	b    V P                   f   V P                  # V P                   P                  # N)r   	_chat_ctxr^   rP   s   &r&   r^   FallbackLLMStream.chat_ctx   s*    '>>!##,,,r%   c                   V ^8  d   QhRR/# )r1   r4   r}   r   )r6   s   "r&   r7   r~      s     * *z *r%   c                	b    V P                   f   V P                  # V P                   P                  # r   )r   _toolsrX   rP   s   &r&   rX   FallbackLLMStream.tools   s*    ';;##)))r%   check_recoveryFc               $    V ^8  d   QhRRRRRR/# )r1   r)   r   r   r   r4   AsyncIterable[ChatChunk]r   )r6   s   "r&   r7   r~      s)     B BB+/B	!Br%   c                "    VP                  V P                  V P                  V P                  V P                  V P
                  \        P                  ! V P                  V P                  P                  V P                  P                  V P                  P                  R7      R7      ;_uu_4       GRj  xL
 pV'       * pV  Rj  xL
  pV'       d	   RpW0n        V5x  K!   L. LDRRR4      GRj  xL 
  R#   + GRj  xL 
 '       g   i     R# ; i  \        P                   dR    T'       d%   \         P"                  ! TP$                   R24       h \         P"                  ! TP$                   R24       h \&         dZ   pT'       d'   \         P"                  ! TP$                   R2TR7       h \         P"                  ! TP$                   R	2TR7       h Rp?i\(         dR    T'       d%   \         P*                  ! TP$                   R
24       h \         P*                  ! TP$                   R24       h i ; i5i)a7  
Try to generate with the given LLM.

Args:
    llm: The LLM instance to generate with
    check_recovery: When True, indicates this is a background recovery check and the
                  result will not be used. Recovery checks verify if a previously
                  failed LLM has become available again.
)r   r   r.   )r^   rX   rZ   r[   r\   rY   NFz recovery timed outz! timed out, switching to next LLMz recovery failed)exc_infoz failed, switching to next LLMz recovery unexpected errorz( unexpected error, switching to next LLM)rd   r   r   r   r   r   dataclassesreplace_conn_optionsr   rA   r@   rB   r   asyncioTimeoutErrorr   warninglabelr
   	Exception	exception)rG   r)   r   streamshould_set_currentchunkes   &$$    r&   _try_generateFallbackLLMStream._try_generate   s    6	xxkk$($=$= --!//(00&&"44GG 22CC#'#9#9#I#I	      )7%7"#)    %)-2*/5,K% 6     ( ## 		#)),?@ANN99+>?  	yyk!12 NN99+;<  
	  yyk!;< 99+EF 
	s   I B3D 7C&8D ;
C>C*	C(

C*C>&D (C**C>+D 6C97D <I >D	D
D	D	D I D H=8AH=	H=
AGH=+H=4A	H==I c                    V ^8  d   QhRRRR/# r1   r)   r   r4   r5   r   )r6   s   "r&   r7   r~      s     U U U Ur%   c                	@  a a S P                   P                  S P                   P                  P                  V4      ,          oSP                  e!   SP                  P                  4       '       d.   R VV 3R llp\        P                  ! V! V4      4      Sn        R # R # )Nc                    V ^8  d   QhRRRR/# r   r   )r6   s   "r&   r7   5FallbackLLMStream._try_recovery.<locals>.__annotate__   s      S T r%   c                  <"    SP                  V R R7        Rj  xL
  pK   LDR Sn        \        P                  ! RT P                   R24       SP
                  P                  R\        T R R7      4       R#   \         d     R# i ; i5i)Tr)   r   Nzllm.FallbackAdapter, z
 recoveredrx   r)   r   )	r   r   r   infor   r   rq   r(   r   )r)   rH   
llm_statusrG   s   & r&   _recover_llm_task:FallbackLLMStream._try_recovery.<locals>._recover_llm_task   s     #'#5#5#d#5#S  a#S ,0J(KK"7		{* MN**//20SDI ! sC   BA; &$&A; &AA; 9B;B
B	B

B)r   rD   r?   indexr   doner   create_task)rG   r)   r   r   s   f& @r&   _try_recoveryFallbackLLMStream._try_recovery   s    ++33""1177<

 %%-1K1K1P1P1R1R  *1)<)<=Ns=S)TJ&! 2Sr%   c                   V ^8  d   QhRR/# rg   r   )r6   s   "r&   r7   r~      s     2
 2
D 2
r%   c           
     	  "   \         P                   ! 4       p\        ;QJ d0    R  V P                  P                   4       F  '       d   K   RM%	  RM!! R  V P                  P                   4       4      pV'       d   \        P
                  ! R4       \        V P                  P                  4       EF  w  r4V P                  P                  V,          pVP                  '       g	   V'       d   Rp. p V P                  VRR7        Rj  xL
  pVP                  '       dq   VP                  P                  '       d   WhP                  P                  ,          pVP                  P                   F  p	VP                  V	P                  4       K   	  V P                  P!                  V4       K  V P/                  V4       EK  	  \1        RV P                  P                   Uu. uF  qDP*                  NK  	  up R\         P                   ! 4       V,
           R24      h ELED R#   \"         d    TP                  '       d/   RTn        T P                  P%                  R\'        TRR7      4       T'       g	   T'       dn   R	TR
T/p
T P                  P(                  '       g'   \        P
                  ! TP*                   R2T
R7       h \        P,                  ! TP*                   R2T
R7        ELBi ; iu upi 5i)c              3  B   "   T F  qP                   '       * x  K  	  R # 5ir   )r   ).0r   s   & r&   	<genexpr>)FallbackLLMStream._run.<locals>.<genexpr>   s     cDbj1111Dbs   FTz$all LLMs are unavailable, retrying.. r   Nrx   r   	text_senttool_calls_sentzy failed after sending chunk, skip retrying. Set `retry_on_chunk_sent` to `True` to enable retrying after chunks are sent.)extraz' failed after sending chunk, retrying..zall LLMs failed (z) after z seconds)timeallr   rD   r   error	enumerater?   r   r   deltacontent
tool_callsappendname	_event_chsend_nowaitr   rq   r(   rC   r   r   r   r	   )rG   
start_time
all_failedir)   r   r   r   result	tool_callr   s   &          r&   _runFallbackLLMStream._run   sc    YY[
ScDDZDZDbDbcSSScDDZDZDbDbcc
LL?@ 6 6 E EFFA//77:J###z!#	-/ (,(:(:sSX(:(Y ; ;f!<<<%||333 )\\-A-A A	-3\\-D-D	 / 6 6y~~ F .E 226:4 s#O GR !d6L6L6[6[ \6[s6[ \]]efjfofofqt~f~e  @H  I
 	
G;(Y   !+++/4
,..3364N
 !O!,i9JO \#55JJJ"LL#&99+ .p !p&+
 ""yyk)PQ"'%4 !]s   AK:0K:<A1K:.K:3H&H!
HH!/H&>A1H&/4K:#K5
7'K:H!!H&#K:&K25K29K2!K2#AK2.K:1K22K:c                    V ^8  d   QhRRRR/# )r1   event_aiterr   r4   r5   r   )r6   s   "r&   r7   r~   '  s      7O TX r%   c                	   "   R # 5ir   r   )rG   r   s   &&r&   _metrics_monitor_task'FallbackLLMStream._metrics_monitor_task'  s     s   )r   r   r   r   r   )r   r    r!   r"   r{   r#   r   r>   rt   r^   rX   r   r   r   r   r$   rv   rw   s   @r&   rc   rc   w   s    ,BMB6 1:6 /86 4=6 6& - -
 * *
B27BHU,2
h r%   rc   )%
__future__r   r   r   r   collections.abcr   r   typingr   r   r   _exceptionsr	   r
   logr   typesr   r   r   r   chat_contextr   r)   r   r   r   tool_contextr   r   r   ru   r   r(   r+   rc   r   r%   r&   <module>r      s    "    ) ! ) ) 6  Y Y % * * *'84<<( $
 / / /
   
R8*+,R8jq	 qr%   