
    D_i                        S 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Jr  SSKJrJrJr  SSK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JrJr   " S S\5      r " S S\\\4   5      r g)z+Runnable that routes to a set of Runnables.    )annotations)Mapping)TYPE_CHECKINGAnycast)
ConfigDict)	TypedDictoverride)RunnableRunnableSerializablecoerce_to_runnable)RunnableConfigget_config_listget_executor_for_config)ConfigurableFieldSpecInputOutputgather_with_concurrencyget_unique_config_specs)AsyncIteratorCallableIteratorc                  0    \ rS rSr% SrS\S'    S\S'   Srg)	RouterInput%   zRouter input.strkeyr   input N)__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r       Y/home/james-whalen/.local/lib/python3.13/site-packages/langchain_core/runnables/router.pyr   r   %   s    	HJ7r'   r   c                    ^  \ rS rSr% SrS\S'   \\SS j5       5       r    SU 4S jjr	\
" SS9r\\SS	 j5       5       r\\SS
 j5       5       r\ S       SS jj5       r\ S       SS jj5       r\ SSS.         SS jjj5       r\ SSS.         SS jjj5       r\ S       SS jj5       r\ S       SS jj5       rSrU =r$ )RouterRunnable.   a  `Runnable` that routes to a set of `Runnable` based on `Input['key']`.

Returns the output of the selected Runnable.

Example:
    ```python
    from langchain_core.runnables.router import RouterRunnable
    from langchain_core.runnables import RunnableLambda

    add = RunnableLambda(func=lambda x: x + 1)
    square = RunnableLambda(func=lambda x: x**2)

    router = RouterRunnable(runnables={"add": add, "square": square})
    router.invoke({"key": "square", "input": 3})
    ```
z#Mapping[str, Runnable[Any, Output]]	runnablesc                V    [        S U R                  R                  5        5       5      $ )Nc              3  J   #    U  H  oR                     H  o"v   M     M     g 7fN)config_specs).0stepspecs      r(   	<genexpr>.RouterRunnable.config_specs.<locals>.<genexpr>E   s!      '
4TARARDARD4s   !#)r   r,   values)selfs    r(   r0   RouterRunnable.config_specsB   s+     ' '
!^^224'
 
 	
r'   c           
        > [         TU ]  UR                  5        VVs0 s H  u  p#U[        U5      _M     snnS9  gs  snnf )zZCreate a `RouterRunnable`.

Args:
    runnables: A mapping of keys to `Runnable` objects.
r,   N)super__init__itemsr   )r7   r,   r   r	__class__s       r(   r<   RouterRunnable.__init__I   sB     	@I@QR@Qfcs.q11@QR 	 	
Rs   =
T)arbitrary_types_allowedc                    g)z,Return `True` as this class is serializable.Tr   clss    r(   is_lc_serializable!RouterRunnable.is_lc_serializableZ   s     r'   c                
    / SQ$ )z_Get the namespace of the LangChain object.

Returns:
    `["langchain", "schema", "runnable"]`
)	langchainschemarunnabler   rC   s    r(   get_lc_namespaceRouterRunnable.get_lc_namespace`   s
     32r'   c                    US   nUS   nX@R                   ;  a  SU S3n[        U5      eU R                   U   nUR                  XR5      $ Nr   r   z!No runnable associated with key '')r,   
ValueErrorinvoker7   r   configkwargsr   actual_inputmsgrJ   s           r(   rQ   RouterRunnable.invokej   sU     ElW~nn$5cU!<CS/!>>#&|44r'   c                   #    US   nUS   nX@R                   ;  a  SU S3n[        U5      eU R                   U   nUR                  XR5      I S h  vN $  N7frN   )r,   rP   ainvokerR   s           r(   rY   RouterRunnable.ainvokew   s`      ElW~nn$5cU!<CS/!>>#&%%l;;;;s   AAAAF)return_exceptionsc                 ^ ^^ U(       d  / $ U Vs/ s H  oUS   PM	     nnU Vs/ s H  oUS   PM	     nn[        U 4S jU 5       5      (       a  Sn[        U5      e        SUU4S jjn	U V
s/ s H  n
T R                  U
   PM     nn
[        U[	        U5      5      n[        US   5       n[        S[        UR                  XX|5      5      5      sS S S 5        $ s  snf s  snf s  sn
f ! , (       d  f       g = f)	Nr   r   c              3  @   >#    U  H  oTR                   ;  v   M     g 7fr/   r:   r1   r   r7   s     r(   r4   'RouterRunnable.batch.<locals>.<genexpr>        9DS$..(D   5One or more keys do not have a corresponding runnablec                   > T(       a   U R                   " X40 TD6$ U R                   " X40 TD6$ ! [         a  nUs S nA$ S nAff = fr/   )rQ   	ExceptionrJ   input_rS   erT   r[   s       r(   rQ   $RouterRunnable.batch.<locals>.invoke   sN     !#??6DVDD  v@@@ ! Hs   0 
AAAAr   list[Output]rJ   zRunnable[Input, Output]rf   r   rS   r   returnzOutput | Exception)	anyrP   r,   r   lenr   r   listmap)r7   inputsrS   r[   rT   rf   keysactual_inputsrV   rQ   r   r,   configsexecutors   `  ``         r(   batchRouterRunnable.batch   s     I,23F&uF37=>vVv>9D999ICS/!		A-		A7<		AFT		A		A 		A 599DST^^C(D	9!&#f+6$WQZ0HX\\&]LM 10' 4>  :00s   CC#1C(/%C--
C;c          	       ^ ^^#    U(       d  / $ U Vs/ s H  oUS   PM	     nnU Vs/ s H  oUS   PM	     nn[        U 4S jU 5       5      (       a  Sn[        U5      e        SUU4S jjn	U V
s/ s H  n
T R                  U
   PM     nn
[        U[	        U5      5      n[        US   R                  S5      /[        XX|5      Q76 I S h  vN $ s  snf s  snf s  sn
f  N7f)	Nr   r   c              3  @   >#    U  H  oTR                   ;  v   M     g 7fr/   r:   r^   s     r(   r4   (RouterRunnable.abatch.<locals>.<genexpr>   r`   ra   rb   c                   >#    T(       a   U R                   " X40 TD6I S h  vN $ U R                   " X40 TD6I S h  vN $  N! [         a  nUs S nA$ S nAff = f N7fr/   )rY   rd   re   s       r(   rY   &RouterRunnable.abatch.<locals>.ainvoke   se      !!)!1!1&!KF!KKK &--fGGGG	 L  H HsM   AA AA AAAA 
AAAAAAr   max_concurrencyrj   )rl   rP   r,   r   rm   r   getro   )r7   rp   rS   r[   rT   rf   rq   rr   rV   rY   r   r,   rs   s   `  ``        r(   abatchRouterRunnable.abatch   s      I,23F&uF37=>vVv>9D999ICS/!		H-		H7<		HFT		H		H 		H 599DST^^C(D	9!&#f+6,AJNN,-
]<
 
 	
' 4>  :
s2   C$CC$C>C$3CAC$C"C$c              +     #    US   nUS   nX@R                   ;  a  SU S3n[        U5      eU R                   U   nUR                  XR5       S h  vN   g  N7frN   )r,   rP   streamrR   s           r(   r   RouterRunnable.stream   s[      ElW~nn$5cU!<CS/!>>#&??<888s   AAAAc                  #    US   nUS   nX@R                   ;  a  SU S3n[        U5      eU R                   U   nUR                  XR5        S h  vN nU7v   M   N
 g 7frN   )r,   rP   astream)	r7   r   rS   rT   r   rU   rV   rJ   outputs	            r(   r   RouterRunnable.astream   sk      ElW~nn$5cU!<CS/!>>#&$,,\B 	&L	Bs*   AA!AAAA!AA!r   )rk   zlist[ConfigurableFieldSpec])r,   z=Mapping[str, Runnable[Any, Output] | Callable[[Any], Output]]rk   None)rk   bool)rk   z	list[str]r/   )r   r   rS   RunnableConfig | NonerT   r   rk   r   )r   r   rS   r   rT   
Any | Nonerk   r   )
rp   zlist[RouterInput]rS   z,RunnableConfig | list[RunnableConfig] | Noner[   r   rT   r   rk   ri   )r   r   rS   r   rT   r   rk   zIterator[Output])r   r   rS   r   rT   r   rk   zAsyncIterator[Output])r    r!   r"   r#   r$   r%   propertyr
   r0   r<   r   model_configclassmethodrE   rK   rQ   rY   ru   r~   r   r   r&   __classcell__)r?   s   @r(   r*   r*   .   s(   " 32
  


P
 

  $L    3  3 BF
5 
5*?
5RU
5	
5 
5  )-<< &< 	<
 
< <  @D"
 #("!" ="
  " " 
" "H  @D!

 #(!
!!
 =!

  !
 !
 
!
 !
F  )-99 &9 	9
 
9 9  )- & 	
 
 r'   r*   N)!r$   
__future__r   collections.abcr   typingr   r   r   pydanticr   typing_extensionsr	   r
   langchain_core.runnables.baser   r   r   langchain_core.runnables.configr   r   r   langchain_core.runnables.utilsr   r   r   r   r   r   r   r   r   r*   r   r'   r(   <module>r      sn    1 " #    1 
 
  AA8) 8A)+v*=> Ar'   