
    D_i=                         S r SSKJrJrJrJr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  SSKJrJrJrJrJr  SSKJrJrJrJr  S	r  " S
 S\\\4   5      r!g)z?Runnable that selects which branch to run based on a condition.    )AsyncIterator	AwaitableCallableIteratorMappingSequence)Anycast)	BaseModel
ConfigDict)override)RunnableRunnableLikeRunnableSerializablecoerce_to_runnable)RunnableConfigensure_config%get_async_callback_manager_for_configget_callback_manager_for_configpatch_config)ConfigurableFieldSpecInputOutputget_unique_config_specs   c                   B  ^  \ rS rSr% Sr\\\\\	4   \\\
4   4      \S'    \\\
4   \S'    S\\\\	4   \\/\	4   -  \\/\\	   4   -  \4   \-  SS4U 4S jjr\" SS	9r\S\	4S
 j5       r\\S\\   4S j5       5       r\SS\S-  S\\   4U 4S jjj5       r\\S\\   4S j5       5       r\ SS\S\S-  S\S\
4S j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\$\
   4S jj5       r%Sr&U =r'$ )RunnableBranch*   a  `Runnable` that selects which branch to run based on a condition.

The `Runnable` is initialized with a list of `(condition, Runnable)` pairs and
a default branch.

When operating on an input, the first condition that evaluates to True is
selected, and the corresponding `Runnable` is run on the input.

If no condition evaluates to `True`, the default branch is run on the input.

Examples:
    ```python
    from langchain_core.runnables import RunnableBranch

    branch = RunnableBranch(
        (lambda x: isinstance(x, str), lambda x: x.upper()),
        (lambda x: isinstance(x, int), lambda x: x + 1),
        (lambda x: isinstance(x, float), lambda x: x * 2),
        lambda x: "goodbye",
    )

    branch.invoke("hello")  # "HELLO"
    branch.invoke(None)  # "goodbye"
    ```
branchesdefaultreturnNc           	      L  > [        U5      [        :  a  Sn[        U5      eUS   n[        U[        [
        [        45      (       d  Sn[        U5      e[        S[        [        SU5      5      5      n/ nUSS  H  n[        U[        [        45      (       d  S[        U5       3n[        U5      e[        U5      [        :w  a  S[        U5       3n[        U5      eUu  px[        S	[        U5      5      n[        U5      nUR                  Xx45        M     [        T	U ]=  UUS
9  g)a  A `Runnable` that runs one of two branches based on a condition.

Args:
    *branches: A list of `(condition, Runnable)` pairs.
        Defaults a `Runnable` to run if no condition is met.

Raises:
    ValueError: If the number of branches is less than `2`.
    TypeError: If the default branch is not `Runnable`, `Callable` or `Mapping`.
    TypeError: If a branch is not a `tuple` or `list`.
    ValueError: If a branch is not of length `2`.
z-RunnableBranch requires at least two branchesz=RunnableBranch default must be Runnable, callable or mapping.zRunnable[Input, Output]r   Nz5RunnableBranch branches must be tuples or lists, not zARunnableBranch branches must be tuples or lists of length 2, not zRunnable[Input, bool])r   r    )len_MIN_BRANCHES
ValueError
isinstancer   r   r   	TypeErrorr
   r   tuplelisttypeappendsuper__init__)
selfr   msgr    default_	branches_branch	conditionrunnable	__class__s
            Y/home/james-whalen/.local/lib/python3.13/site-packages/langchain_core/runnables/branch.pyr.   RunnableBranch.__init__J   s>   , x==(ACS/!2,x)
 
 RCC. %'9$~w:W'X
 	smFfudm44,,0L>;   n$6{m+88;F}F  !o%"(I46H6STI)(3Hi23# $& 	 	 	
    T)arbitrary_types_allowedc                     g)z,Return `True` as this class is serializable.T clss    r7   is_lc_serializable!RunnableBranch.is_lc_serializable   s     r9   c                 
    / SQ$ )z_Get the namespace of the LangChain object.

Returns:
    `["langchain", "schema", "runnable"]`
)	langchainschemar5   r<   r=   s    r7   get_lc_namespaceRunnableBranch.get_lc_namespace   s
     32r9   configc                 t  > U R                   /U R                   VVs/ s H  u  p#UPM	     snn-   U R                   VVs/ s H  u  p2UPM	     snn-   nU HF  nUR                  U5      R                  5       R	                  S5       c  M5  UR                  U5      s  $    [
        TU ]	  U5      $ s  snnf s  snnf )Nr+   )r    r   get_input_schemamodel_json_schemagetr-   )r/   rF   _r	runnablesr5   r6   s         r7   rH   RunnableBranch.get_input_schema   s     \\N!]]+]TQq]+,!]]+]TQq]+, 	 "H))&1CCEII&Q  0088 " w'// ,+s
   B.B4c           
          [        S U R                  /U R                   VVs/ s H  u  pUPM	     snn-   U R                   VVs/ s H  u  p!UPM	     snn-    5       5      $ s  snnf s  snnf )Nc              3   N   #    U  H  nUR                     H  nUv   M	     M     g 7fN)config_specs).0stepspecs      r7   	<genexpr>.RunnableBranch.config_specs.<locals>.<genexpr>   s5      '
0 
 ))  * 0s   #%)r   r    r   )r/   rK   rL   s      r7   rR   RunnableBranch.config_specs   sh     ' '
 !%/1/0!%/1/0'
 
 	
 0/s   A"A(inputkwargsc                    [        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 [        U R                  5       Hm  u  pgUu  pUR                  U[        UUR                  SUS-    3S9S9S	9n
U
(       d  M=  U	R                  " U4S
[        UUR                  SUS-    3S9S90UD6n  O6   U R                  R                  " U4S
[        X%R                  SS9S90UD6n UR                  U5        U$ ! [         a  nUR                  U5        e SnAff = f)a&  First evaluates the condition, then delegate to `True` or `False` branch.

Args:
    input: The input to the `Runnable`.
    config: The configuration for the `Runnable`.
    **kwargs: Additional keyword arguments to pass to the `Runnable`.

Returns:
    The output of the branch that was run.
Nrun_namerun_idnamer]   
condition:   tag	callbacksrF   rF   branch:branch:default)r   r   on_chain_startrJ   get_namepop	enumerater   invoker   	get_childr    BaseExceptionon_chain_erroron_chain_endr/   rY   rF   rZ   callback_managerrun_manageridxr3   r4   r5   expression_valueoutputes                r7   rm   RunnableBranch.invoke   s    v&:6B&55J':4==?::h-	 6 
 	(7&,#	#,#3#3'"-"7"7jq	<R"7"S $4 $  $#%__+"&1&;&;'#PQ'@S&;&T  !F )  8, ,,'*?*?DT*?*U
  	  (	  	&&q)	s%    AD- 21D- $5D- -
E7E		Ec                    #    [        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 [        U R                  5       H}  u  pgUu  pUR                  U[        UUR                  SUS-    3S9S9S9I S h  vN n
U
(       d  ME  U	R                  " U4S	[        UUR                  S
US-    3S9S90UD6I S h  vN n  O>   U R                  R                  " U4S	[        X%R                  SS9S90UD6I S h  vN n UR                  U5      I S h  vN   U$  N N Nc N&! [         a   nUR                  U5      I S h  vN    e S nAff = f N;7f)Nr\   r]   r^   r`   ra   rb   rd   rf   rF   rg   rh   )r   r   ri   rJ   rj   rk   rl   r   ainvoker   rn   r    ro   rp   rq   rr   s                r7   r{   RunnableBranch.ainvoke   s     v&@H,;;J':4==?::h-	 < 
 
 	(7&,#	)2):):'"-"7"7jq	<R"7"S *; * $  $##+#3#3$+"&1&;&;'#PQ'@S&;&T $ !$ F )  8,  $||33 '*?*?DT*?*U 
    &&v...Q
$  	,,Q///	 	/s   A"F$E%F*AE 6E7	E 3E 7E8E =F>8E 6E7E ;FFFE E E 
F	)F=F >FF		Fc              +     #    [        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                  5       H  u  pU	u  pU
R                  U[        UUR                  SUS-    3S9S	9S
9nU(       d  M=  UR                  " U4S[        UUR                  SUS-    3S9S	90UD6 H  nUv   U(       d  M  Uc  UnM   Xm-   nM       OW   U R                  R                  " U4S[        UUR                  SS9S	90UD6 H  nUv   U(       d  M  Uc  UnM   Xm-   nM      UR!                  U5        g! [         a    SnSn M  f = f! [         a    SnSn MY  f = f! [         a  nUR                  U5        e SnAff = f7fa%  First evaluates the condition, then delegate to `True` or `False` branch.

Args:
    input: The input to the `Runnable`.
    config: The configuration for the `Runnable`.
    **kwargs: Additional keyword arguments to pass to the `Runnable`.

Yields:
    The output of the branch that was run.
Nr\   r]   r^   Tr`   ra   rb   rd   rf   rF   rg   Frh   )r   r   ri   rJ   rj   rk   rl   r   rm   r   rn   streamr(   r    ro   rp   rq   r/   rY   rF   rZ   rs   rt   final_outputfinal_output_supportedru   r3   r4   r5   rv   chunkrx   s                  r7   r   RunnableBranch.stream'  s%    " v&:6B&55J':4==?::h-	 6 
 '+!%5	(7&,#	#,#3#3'"-"7"7jq	<R"7"S $4 $  $#!)"+"&1&;&;'#PQ'@S&;&T " !" $11+3/4!C3?3GL"$ =  8@ "\\00'"-"7"7<L"7"M E  K--'/+0L?/;/C* 	  .5 (1 !C37L=B$:!C( $- ?/39> 6?  	&&q)	s   A#G&AF 8<F 8F  E3F 	G
AF F FF  G3FF FF FF FF 
F>'F99F>>Gc                  #    [        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                  5       H  u  pU	u  pU
R                  U[        UUR                  SUS-    3S9S	9S
9I Sh  vN nU(       d  ME  UR                  " U4S[        UUR                  SUS-    3S9S	90UD6  Sh  vN nU7v   U(       d  M  Uc  UnM   Xm-   nM%     U R                  R                  " U4S[        UUR                  SS9S	90UD6  Sh  vN nU7v   U(       d  M  Uc  UnM   Xm-   nM%   GN N N! [         a    SnSn M  f = f
   OF N?! [         a    SnSn MW  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   ri   rJ   rj   rk   rl   r   r{   r   rn   astreamr(   r    ro   rp   rq   r   s                  r7   r   RunnableBranch.astream{  sa    " v&@H,;;J':4==?::h-	 < 
 
 '+!%5	(7&,#	)2):):'"-"7"7jq	<R"7"S *; * $  $#'/'7'7(+"&1&;&;'#PQ'@S&;&T ( !( Ce $11+3/4!C3?3GL5  8@ $(<<#7#7$'"-"7"7<L"7"M$ $ ?%  K--'/+0L?/;/Cq
$C (1 !C37L=B$:!C($ ? $- ?/39> 6?$$  	,,Q///	 &&|444s  A"G8$E8%G8.AF0 :E;;	F0 0F0 8F<E==F F0 F0 E?8F0 F.FF.F0 *F0 2F6F0 8G8;F0 =F?FF0 FF0 G8F.F+'F0 *F++F0 /G80
G:GGGGG81G42G8r<   rQ   )(__name__
__module____qualname____firstlineno____doc__r   r)   r   r   boolr   __annotations__r   r   r   r.   r   model_configclassmethodr?   r   r*   strrD   r   r+   r   rH   propertyr   rR   r	   rm   r{   r   r   r   r   __static_attributes____classcell__)r6   s   @r7   r   r   *   st   4 uXeTk2HUF]4KKLMM2eVm$$5?
UD[!w}%&w	$/01 
 ?
 
?
B  $L 4   3c 3  3 0~'< 0Y 0 0  	
d#89 	
  	
 <@88$2T$98LO8	8 8t <@--$2T$9-LO-	- -^  )-Q/Q/ %Q/ *	Q/
 
&	Q/ Q/f  )-Q5Q5 %Q5 *	Q5
 
v	Q5 Q5r9   r   N)"r   collections.abcr   r   r   r   r   r   typingr	   r
   pydanticr   r   typing_extensionsr   langchain_core.runnables.baser   r   r   r   langchain_core.runnables.configr   r   r   r   r   langchain_core.runnables.utilsr   r   r   r   r%   r   r<   r9   r7   <module>r      s\    E 
 + &    c5)%-8 c5r9   