
    D_ia_                     .   S r SSKrSSKrSSKrSSKJrJrJr  SSKJ	r	  SSKJ
r
JrJr  SSKJrJr  SSKJr  SSKJrJr  SS	KJrJr  SS
KJrJrJrJrJrJrJr  SSK J!r!J"r"J#r#J$r$J%r%  \
(       a  SSKJ&r&   " S S\\"\#4   5      r'S\S\(4S jr)S\S\(4S jr*g)z:Runnable that can fallback to other Runnables if it fails.    N)AsyncIteratorIteratorSequence)wraps)TYPE_CHECKINGAnycast)	BaseModel
ConfigDict)override)AsyncCallbackManagerCallbackManager)RunnableRunnableSerializable)RunnableConfigensure_config%get_async_callback_manager_for_configget_callback_manager_for_configget_config_listpatch_configset_config_context)ConfigurableFieldSpecInputOutputcoro_with_contextget_unique_config_specs)AsyncCallbackManagerForChainRunc                   x   \ rS rSr% Sr\\\4   \S'    \	\\\4      \S'    \
4r\\\   S4   \S'    Sr\S-  \S'    \" S	S
9r\\S\\   4S j5       5       r\\S\\   4S j5       5       r\S$S\S-  S\\   4S jj5       r\ S$S\S-  S\\   4S jj5       r\\S\\   4S j5       5       r\\S\4S j5       5       r \\S\\   4S j5       5       r!\S\"\\\4      4S j5       r#\ S$S\S\S-  S\$S\4S jj5       r%\ S$S\S\S-  S\$S-  S\4S jj5       r&\ S$SS.S\\   S\\\   -  S-  S\S\$S-  S\\   4
S jjj5       r'\ S$SS.S\\   S\\\   -  S-  S\S\$S-  S\\   4
S jjj5       r(\ S$S\S\S-  S\$S-  S\"\   4S jj5       r)\ S$S\S\S-  S\$S-  S\*\   4S  jj5       r+S!\S\$4S" jr,S#r-g)%RunnableWithFallbacks$   u  `Runnable` that can fallback to other `Runnable`s if it fails.

External APIs (e.g., APIs for a language model) may at times experience
degraded performance or even downtime.

In these cases, it can be useful to have a fallback `Runnable` that can be
used in place of the original `Runnable` (e.g., fallback to another LLM provider).

Fallbacks can be defined at the level of a single `Runnable`, or at the level
of a chain of `Runnable`s. Fallbacks are tried in order until one succeeds or
all fail.

While you can instantiate a `RunnableWithFallbacks` directly, it is usually
more convenient to use the `with_fallbacks` method on a `Runnable`.

Example:
    ```python
    from langchain_core.chat_models.openai import ChatOpenAI
    from langchain_core.chat_models.anthropic import ChatAnthropic

    model = ChatAnthropic(model="claude-3-haiku-20240307").with_fallbacks(
        [ChatOpenAI(model="gpt-3.5-turbo-0125")]
    )
    # Will usually use ChatAnthropic, but fallback to ChatOpenAI
    # if ChatAnthropic fails.
    model.invoke("hello")

    # And you can also use fallbacks at the level of a chain.
    # Here if both LLM providers fail, we'll fallback to a good hardcoded
    # response.

    from langchain_core.prompts import PromptTemplate
    from langchain_core.output_parser import StrOutputParser
    from langchain_core.runnables import RunnableLambda


    def when_all_is_lost(inputs):
        return (
            "Looks like our LLM providers are down. "
            "Here's a nice 🦜️ emoji for you instead."
        )


    chain_with_fallback = (
        PromptTemplate.from_template("Tell me a joke about {topic}")
        | model
        | StrOutputParser()
    ).with_fallbacks([RunnableLambda(when_all_is_lost)])
    ```
runnable	fallbacks.exceptions_to_handleNexception_keyT)arbitrary_types_allowedreturnc                 .    U R                   R                  $ N)r!   	InputTypeselfs    \/home/james-whalen/.local/lib/python3.13/site-packages/langchain_core/runnables/fallbacks.pyr)   RunnableWithFallbacks.InputTypen   s     }}&&&    c                 .    U R                   R                  $ r(   )r!   
OutputTyper*   s    r,   r0    RunnableWithFallbacks.OutputTypes   s     }}'''r.   configc                 8    U R                   R                  U5      $ r(   )r!   get_input_schemar+   r2   s     r,   r4   &RunnableWithFallbacks.get_input_schemax   s    }}--f55r.   c                 8    U R                   R                  U5      $ r(   )r!   get_output_schemar5   s     r,   r8   'RunnableWithFallbacks.get_output_schema|   s     }}..v66r.   c                 T    [        S U R                  /U R                  Q 5       5      $ )Nc              3   N   #    U  H  nUR                     H  nUv   M	     M     g 7fr(   )config_specs).0stepspecs      r,   	<genexpr>5RunnableWithFallbacks.config_specs.<locals>.<genexpr>   s*      '
8)) ) 8s   #%)r   r!   r"   r*   s    r,   r<   "RunnableWithFallbacks.config_specs   s.     ' '
88'
 
 	
r.   c                     g)z,Return `True` as this class is serializable.T clss    r,   is_lc_serializable(RunnableWithFallbacks.is_lc_serializable   s     r.   c                 
    / SQ$ )z_Get the namespace of the LangChain object.

Returns:
    `["langchain", "schema", "runnable"]`
)	langchainschemar!   rD   rE   s    r,   get_lc_namespace&RunnableWithFallbacks.get_lc_namespace   s
     32r.   c              #   T   #    U R                   v   U R                   Sh  vN   g N7f)z`Iterator over the `Runnable` and its fallbacks.

Yields:
    The `Runnable` then its fallbacks.
Nr!   r"   r*   s    r,   	runnablesRunnableWithFallbacks.runnables   s      mm>>!!s   (&(inputkwargsc           	      T   U R                   b/  [        U[        5      (       d  S[        U5       S3n[	        U5      e[        U5      n[        U5      nUR                  S UUR                  S5      =(       d    U R                  5       UR                  SS 5      S9nS nS nU R                   H  n	 U R                   (       a  Ub  XU R                   '   [        X&R                  5       S9n
[        U
5       nUR                  " U	R                   UU40 UD6nS S S 5        UR#                  W5        Us  $    Uc  Sn[	        U5      eUR)                  U5        Ue! , (       d  f       NH= f! U R$                   a  nUc  UnUn S nAM  S nAf[&         a  nUR)                  U5        e S nAff = fNXIf 'exception_key' is specified then input must be a dictionary.However found a type of 
 for inputrun_namerun_idnamerY   	callbacksz$No error stored at end of fallbacks.)r$   
isinstancedicttype
ValueErrorr   r   on_chain_startgetget_namepoprP   r   	get_childr   runinvokeon_chain_endr#   BaseExceptionon_chain_error)r+   rR   r2   rS   msgcallback_managerrun_managerfirst_error
last_errorr!   child_configcontextoutputes                 r,   rh   RunnableWithFallbacks.invoke   s    )*UD2I2I++/;-zC  S/!v&:6B&55J':4==?::h-	 6 
 
H%%**@0:$,,-+F>S>S>UV'5$[[  !	F 6 ((0+ ', 8CS/!"";/+ 65 ,, &"#K
  **1-s=   /AE&3 EE&
E#	E&&F'6FF'F""F'c           	        #    U R                   b/  [        U[        5      (       d  S[        U5       S3n[	        U5      e[        U5      n[        U5      nUR                  S UUR                  S5      =(       d    U R                  5       UR                  SS 5      S9I S h  vN nS nS nU R                   H  n	 U R                   (       a  Ub  XU R                   '   [        X&R                  5       S9n
[        U
5       nUR                  " U	R                   X40 UD6n[#        X5      I S h  vN nS S S 5        UR%                  W5      I S h  vN   Us  $    Uc  Sn[	        U5      eUR+                  U5      I S h  vN   Ue N NX! , (       d  f       N\= f NJ! U R&                   a  nUc  UnUn S nAGM  S nAf[(         a   nUR+                  U5      I S h  vN    e S nAff = f Nk7frU   )r$   r^   r_   r`   ra   r   r   rb   rc   rd   re   rP   r   rf   r   rg   ainvoker   ri   r#   rj   rk   )r+   rR   r2   rS   rl   rm   rn   ro   rp   r!   rq   rr   corors   rt   s                  r,   rw   RunnableWithFallbacks.ainvoke   s     )*UD2I2I++/;-zC  S/!v&@H,;;J':4==?::h-	 < 
 
 
H%%**@0:$,,-+F>S>S>UV'5";;x'7'7Q&QD#4T#CCF 6 "..v666# '$ 8CS/!((555?
  D 65 7 ,, &"#K
  !00333 	6s   BG( F!G(9AF=-F*F+F/F7G(F.G(:G&;G(F
F	FG(G#(F6/G(6G#GGGG##G(F)return_exceptionsinputsrz   c                d   U R                   b4  [        S U 5       5      (       d  S[        US   5       S3n[        U5      eU(       d  / $ [	        U[        U5      5      nU Vs/ s HJ  n[        R                  " UR                  S5      S SUR                  S5      S UR                  S5      S S	9PML     nn[        XqUSS
9 VV	Vs/ s Hg  u  pnUR                  S [        U	[        5      (       a  U	OSU	0UR                  S5      =(       d    U R                  5       UR                  SS 5      S9PMi     n
n	nn0 n[        [        U5      5      n0 nS nU R                    GH  nUR"                  " [%        UR'                  5       5       VV	s/ s H  u  noPM	     sn	n[%        U5       Vs/ s H!  n[)        UU   U
U   R+                  5       S9PM#     sn4SS0UD6n[        [%        UR-                  5       R'                  5       5      USS
9 H  u  u  nn	n[        U[.        5      (       aF  [        UU R0                  5      (       d+  U(       d  U=(       d    UnOUUU'   UR                  U5        Md  [        UU R0                  5      (       a&  U R                   (       a  UXR                   '   UUU'   M  U
U   R3                  U5        UUU'   UR                  U5        UR                  US 5        M     U(       a  UeU(       a  GM    O   [%        UR'                  5       5      nU H  u  nnU
U   R5                  U5        M     U(       d  U(       a  US   S   eUR7                  U5        [%        UR'                  5       5       VVs/ s H  u  nnUPM
     snn$ s  snf s  snn	nf s  sn	nf s  snf s  snnf )Nc              3   B   #    U  H  n[        U[        5      v   M     g 7fr(   r^   r_   r=   input_s     r,   r@   .RunnableWithFallbacks.batch.<locals>.<genexpr>        6
39Jvt$$6   YIf 'exception_key' is specified then inputs must be dictionaries.However found a type of r   rW   r]   Ftagsmetadatainheritable_callbackslocal_callbacksverboseinheritable_tags
local_tagsinheritable_metadatalocal_metadatastrictrR   rX   rY   rZ   r\   rz   T   )r$   allr`   ra   r   lenr   	configurerc   ziprb   r^   r_   rd   re   	enumeraterP   batchsorteditemsr   rf   copyrj   r#   ri   rk   update)r+   r{   r2   rz   rS   rl   configscallback_managerscmr   run_managers	to_return	run_againhandled_exceptionsfirst_to_raiser!   _ioutputsrs   sorted_handled_exceptionserrors                         r,   r   RunnableWithFallbacks.batch	  s    )# 6
396
 3
 3
++/q	?*;:G  S/!I "&#f+6 "
 " %%&,jj&= $!'F!3%+ZZ
%;# " 	 
( '*!75'

'"F $VT22&8IZZ
+>t}}zz(D1	  ' 	 

 %'	6*+	79Hnn)/	0A)BC)BIAv)BC $I. / !|A7P7P7RS.	 #'	 	G (+y~~'--/0'%(#FV fm44ZD55> > -)7)A606*1-MM!$(A(ABB))5;112,2&q) O008#)IaLMM!$&**1d3'(( $$9E 'H %++=+C+C+E$F!1HAuO**51 2 %>+A.q11+,(.y/@(AB(A91f(ABBO


$ DN Cs    $ANA.N
N!((N'N,c                  ^ ^#    T R                   b4  [        S U 5       5      (       d  S[        US   5       S3n[        U5      eU(       d  / $ [	        U[        U5      5      nU Vs/ s HJ  n[        R                  " UR                  S5      S SUR                  S5      S UR                  S5      S S	9PML     nn[        R                  " U 4S
 j[        XqUSS9 5       6 I S h  vN m0 n[        [        U5      5      n	0 n
S nT R                   GH  nUR                  " [!        U	R#                  5       5       VVs/ s H  u  pUPM	     snn[!        U	5       Vs/ s H   n[%        Xo   TU   R'                  5       S9PM"     sn4SS0UD6I S h  vN n[        [!        U	R)                  5       R#                  5       5      USS9 H  u  u  pn[+        U[,        5      (       aE  [+        UT R.                  5      (       d*  U(       d  U=(       d    UnOUX'   U	R1                  U5        Mb  [+        UT R.                  5      (       a&  T R                   (       a  UUT R                   '   UX'   M  UX'   TU   R3                  U5      I S h  vN   U	R1                  U5        U
R1                  US 5        M     U(       a  UeU	(       a  GM    O   [!        U
R#                  5       5      n[        R                  " U4S jU 5       6 I S h  vN   U(       d  U(       a  US   S   eUR5                  U
5        [!        UR#                  5       5       VVs/ s H  u  nn[7        SU5      PM     snn$ s  snf  GNs  snnf s  snf  GN N N|s  snnf 7f)Nc              3   B   #    U  H  n[        U[        5      v   M     g 7fr(   r~   r   s     r,   r@   /RunnableWithFallbacks.abatch.<locals>.<genexpr>r  r   r   r   r   rW   r]   Fr   r   r   c           
   3      >#    U  HP  u  pnUR                  S UUR                  S5      =(       d    TR                  5       UR                  SS 5      S9v   MR     g 7f)NrX   rY   rZ   )rb   rc   rd   re   )r=   r   r   r2   r+   s       r,   r@   r     s\      
+&B !!J/B4==?!::h5	 " +s   AAr   r\   rz   Tc              3   P   >#    U  H  u  pTU   R                  U5      v   M     g 7fr(   )rk   )r=   r   r   r   s      r,   r@   r     s,       9HA Q..u55 9s   #&r   r   )r$   r   r`   ra   r   r   r   r   rc   asynciogatherr   r_   r   rP   abatchr   r   r   rf   r   r^   rj   r#   re   ri   r   r	   )r+   r{   r2   rz   rS   rl   r   r   r   r   r   r   r!   r   r   r   r   rs   r   r   s   `                  @r,   r   RunnableWithFallbacks.abatchi  sv     )# 6
396
 3
 3
++/q	?*;:G  S/!I "&#f+6 "
 " !**&,jj&= $!'F!3%+ZZ
%;# " 	 
 ELNN
 +.%wu+
E
 ?
 8:	6*+	79H$OO)/	0A)BC)BIA)BC $I. / !|A7P7P7RS.	 #'	 	 	G (+y~~'--/0'%(#V fm44ZD55> > -)7)A606*-MM!$(A(ABB))5;t112,2&)#)IL&q/66v>>>MM!$&**1d3'(* $$9I 'L %++=+C+C+E$F!nn 9
 	
 	
 !%>+A.q11+,8>y?P8QR8Q91fXv&8QRR_
?
( D	8 ?	
 Ss   A$N(AM!9+N$M&%AN;M)	N'M/ NM4C2N M79N?=N<M9=ANM;
N)N7N9N;Nc           	   +     #    U R                   b/  [        U[        5      (       d  S[        U5       S3n[	        U5      e[        U5      n[        U5      nUR                  S UUR                  S5      =(       d    U R                  5       UR                  SS 5      S9nS nS nU R                   H  n	 U R                   (       a  Ub  XU R                   '   [        X&R                  5       S9n
[        U
5       nUR                  " U	R                   U40 UD6nUR                  ["        U5      nS S S 5        S n  O   U(       a  UR)                  U5        UeWv   Un W H  nUv    X-   nM     UR-                  U5        g ! , (       d  f       NY= f! U R$                   a  nUc  UOUnUn S nAGM  S nAf[&         a  nUR)                  U5        e S nAff = f! [*         a    S n M  f = f! [&         a  nUR)                  U5        e S nAff = f7fNrV   rW   rX   rY   rZ   r\   )r$   r^   r_   r`   ra   r   r   rb   rc   rd   re   rP   r   rf   r   rg   streamnextr#   rj   rk   	TypeErrorri   r+   rR   r2   rS   rl   rm   rn   ro   rp   r!   rq   rr   r   chunkrt   rs   s                   r,   r   RunnableWithFallbacks.stream  s	     )*UD2I2I++/;-zC  S/!v&:6B&55J':4==?::h-	 6 
 
H%%**@0:$,,-+F>S>S>UV'5$[[  !F
 %,KKf$=E 6 #) '* &&{3 %		"#^F   	  (A 65 ,, #.#6aK
  **1-" ! "!F" 	&&q)	s   B.H1AF55E=*F2&H	G( #G'G( +H=
F	FG	F.'H.G;GGHG%!G( $G%%G( (
H	2HH		Hc           	       #    U R                   b/  [        U[        5      (       d  S[        U5       S3n[	        U5      e[        U5      n[        U5      nUR                  S UUR                  S5      =(       d    U R                  5       UR                  SS 5      S9I S h  vN nS nS nU R                   H  n	 U R                   (       a  Ub  XU R                   '   [        X&R                  5       S9n
[        U
5       nU	R                  " UU
40 UD6n[!        [#        U5      U5      I S h  vN nS S S 5        S n  O   U(       a  UR)                  U5      I S h  vN   UeW7v   Un W  S h  vN nU7v    X-   nM   N NU! , (       d  f       NY= f! U R$                   a  nUc  UOUnUn S nAM  S nAf[&         a   nUR)                  U5      I S h  vN    e S nAff = f N Nv! [*         a    S n M  f = f
 O-! [&         a   nUR)                  U5      I S h  vN    e S nAff = fUR-                  U5      I S h  vN    g 7fr   )r$   r^   r_   r`   ra   r   r   rb   rc   rd   re   rP   r   rf   r   astreamr   anextr#   rj   rk   r   ri   r   s                   r,   r   RunnableWithFallbacks.astream  sF     )*UD2I2I++/;-zC  S/!v&@H,;;J':4==?::h-	 < 
 
 
H%%**@0:$,,-+F>S>S>UV'5%--$ !F
 #4E&M7"KKE 6 #) '* ,,[999 %		% "e"#^FO
& L 65 ,, #.#6aK
  !00333 :" ! "!F"	  &  	,,Q///	 &&v...s  BI E>!I9AF=-F*F +F/F7!IG"I'G; )G9-G$.G91G; 8G&<G; >I F
F	FG#	F2,I2G?GGGGI$G9&G62G; 5G66G; :I;
H%H HH  H%%I<H?=Ir[   c                    ^ ^^ [        T R                  T5      m[        T5      (       a,  [        T5      S[        S[        S[        4UUU 4S jj5       nU$ T$ )a  Get an attribute from the wrapped `Runnable` and its fallbacks.

Returns:
    If the attribute is anything other than a method that outputs a `Runnable`,
    returns `getattr(self.runnable, name)`. If the attribute is a method that
    does return a new `Runnable` (e.g. `model.bind_tools([...])` outputs a new
    `RunnableBinding`) then `self.runnable` and each of the runnables in
    `self.fallbacks` is replaced with `getattr(x, name)`.

Example:
    ```python
    from langchain_openai import ChatOpenAI
    from langchain_anthropic import ChatAnthropic

    gpt_4o = ChatOpenAI(model="gpt-4o")
    claude_3_sonnet = ChatAnthropic(model="claude-sonnet-4-5-20250929")
    model = gpt_4o.with_fallbacks([claude_3_sonnet])

    model.model_name
    # -> "gpt-4o"

    # .bind_tools() is called on both ChatOpenAI and ChatAnthropic
    # Equivalent to:
    # gpt_4o.bind_tools([...]).with_fallbacks([claude_3_sonnet.bind_tools([...])])
    model.bind_tools([...])
    # -> RunnableWithFallbacks(
        runnable=RunnableBinding(bound=ChatOpenAI(...), kwargs={"tools": [...]}),
        fallbacks=[RunnableBinding(bound=ChatAnthropic(...), kwargs={"tools": [...]})],
    )
    ```
argsrS   r&   c                     > T" U 0 UD6n/ nTR                    H&  n[        UT5      nUR                  U" U 0 UD65        M(     TR                  " S0 0 TR	                  5       EUUS.ED6$ )NrO   rD   )r"   getattrappend	__class__
model_dump)	r   rS   new_runnablenew_fallbacksfallbackfallback_attrattrr[   r+   s	         r,   wrapped2RunnableWithFallbacks.__getattr__.<locals>.wrappedt  s    #T4V4 " $H$+Hd$;M!(()G)GH !/ ~~ //+$0%2 r.   )r   r!   _returns_runnabler   r   )r+   r[   r   r   s   `` @r,   __getattr__!RunnableWithFallbacks.__getattr__Q  s]    @ t}}d+T""4[s c c    Nr.   rD   r(   ).__name__
__module____qualname____firstlineno____doc__r   r   r   __annotations__r   	Exceptionr#   tupler`   rj   r$   strr   model_configpropertyr   r)   r0   r   r
   r4   r8   listr   r<   classmethodboolrG   rL   r   rP   r   rh   rw   r   r   r   r   r   r   __static_attributes__rD   r.   r,   r   r   $   s   1f uf}%%&/00)=FL%] 3S 89H !%M3:$  $L '4; '  ' (DL (  ( 6~'< 6Y 6 6 .27$t+7	i7 7
 
d#89 
  
 4    3c 3  3 "8HUF]$;< " " <@//$2T$9/LO/	/ /b  )-// %/ *	/
 
/ /b  @D]C
 #(]CU]C n!55<]C
  ]C *]C 
f]C ]C~  @DeS
 #(eSUeS n!55<eS
  eS *eS 
feS eSN  )-=)=) %=) *	=)
 
&	=) =)~  )-=/=/ %=/ *	=/
 
v	=/ =/~5 5 5r.   r   r   r&   c                     [        U 5      (       d  g[        R                  " U 5      R                  S5      n[	        U=(       a    [        U5      5      $ )NFr&   )callabletypingget_type_hintsrc   r   _is_runnable_type)r   return_types     r,   r   r     s?    D>>''-11(;K> 1+ >??r.   type_c                 (   [         R                  " U 5      (       a  [        U [        5      $ [	        U SS 5      n[         R                  " U5      (       a  [        U[        5      $ U[
        R                  L a  [        S U R                   5       5      $ g)N
__origin__c              3   8   #    U  H  n[        U5      v   M     g 7fr(   )r   )r=   ts     r,   r@   $_is_runnable_type.<locals>.<genexpr>  s     @A$Q''s   F)	inspectisclass
issubclassr   r   r   Unionr   __args__)r   origins     r,   r   r     sl    u%**UL$/Fv&(++@@@@r.   )+r   r   r   r   collections.abcr   r   r   	functoolsr   r   r   r	   pydanticr
   r   typing_extensionsr    langchain_core.callbacks.managerr   r   langchain_core.runnables.baser   r   langchain_core.runnables.configr   r   r   r   r   r   r   langchain_core.runnables.utilsr   r   r   r   r   r   r   r   r   r   rD   r.   r,   <module>r      s    @    = =  + + * & R H    Pb	0? b	J@C @D @S T r.   