
    ghE                    
   d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZmZ ddlmZmZmZ dd	lmZmZmZ dd
lmZmZmZmZm Z  erddlm!Z!m"Z"  G d de          Z# G d dee#ef                   Z$dS )z+Runnable that routes to a set of Runnables.    )annotations)Mapping)starmap)TYPE_CHECKINGAnyCallableOptionalUnion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Iteratorc                  (    e Zd ZU dZded<   ded<   dS )RouterInputzRouter input.

    Attributes:
        key: The key to route on.
        input: The input to pass to the selected Runnable.
    strkeyr   inputN)__name__
__module____qualname____doc____annotations__     \/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/langchain_core/runnables/router.pyr   r   )   s.           HHHJJJJJr'   r   c                  t    e Zd ZU dZded<   eed(d                        Zd) fd	Z e	d
          Z
eed*d                        Zeed+d                        Ze	 d,d-d            Ze	 d,d.d            Ze	 d,ddd/d"            Ze	 d,ddd/d#            Ze	 d,d0d%            Ze	 d,d1d'            Z xZS )2RouterRunnablea'  Runnable that routes to a set of Runnables based on Input['key'].

    Returns the output of the selected Runnable.

    Example:

        .. code-block:: 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]]	runnablesreturnlist[ConfigurableFieldSpec]c                b    t          d | j                                        D                       S )Nc              3  .   K   | ]}|j         D ]}|V  d S N)config_specs).0stepspecs      r(   	<genexpr>z.RouterRunnable.config_specs.<locals>.<genexpr>M   sJ       '
 '
AR'
 '
9=D'
 '
 '
 '
 '
 '
 '
r'   )r   r+   values)selfs    r(   r1   zRouterRunnable.config_specsJ   s@     ' '
 '
!^2244'
 '
 '
 
 
 	
r'   CMapping[str, Union[Runnable[Any, Output], Callable[[Any], Output]]]Nonec                    t                                          d |                                D                        dS )zgCreate a RouterRunnable.

        Args:
            runnables: A mapping of keys to Runnables.
        c                4    i | ]\  }}|t          |          S r&   )r   )r2   r   rs      r(   
<dictcomp>z+RouterRunnable.__init__.<locals>.<dictcomp>[   s'    RRRfc1s.q11RRRr'   r+   N)super__init__items)r7   r+   	__class__s     r(   r@   zRouterRunnable.__init__Q   sK     	RR	@Q@QRRR 	 	
 	
 	
 	
 	
r'   T)arbitrary_types_allowedboolc                    dS )z*Return whether this class is serializable.Tr&   clss    r(   is_lc_serializablez!RouterRunnable.is_lc_serializableb   s	     tr'   	list[str]c                
    g dS )z*Get the namespace of the langchain object.)	langchainschemarunnabler&   rF   s    r(   get_lc_namespacezRouterRunnable.get_lc_namespaceh   s     3222r'   Nr    r   configOptional[RunnableConfig]kwargsr   r   c                    |d         }|d         }|| j         vrd| d}t          |          | j         |         }|                    ||          S Nr   r    z!No runnable associated with key '')r+   
ValueErrorinvoker7   r    rO   rQ   r   actual_inputmsgrM   s           r(   rV   zRouterRunnable.invoken   s_     ElW~dn$$<c<<<CS//!>#&|V444r'   Optional[Any]c                   K   |d         }|d         }|| j         vrd| d}t          |          | j         |         }|                    ||           d {V S rS   )r+   rU   ainvokerW   s           r(   r\   zRouterRunnable.ainvoke{   sw       ElW~dn$$<c<<<CS//!>#&%%lF;;;;;;;;;r'   F)return_exceptionsinputslist[RouterInput]5Optional[Union[RunnableConfig, list[RunnableConfig]]]r]   list[Output]c                   |sg S d |D             }d |D             }t           fd|D                       rd}t          |          dfd} fd|D             }	t          |t          |                    }
t	          |
d                   5 }t          dt          |                    ||	||
                              cd d d            S # 1 swxY w Y   d S )Nc                    g | ]
}|d          S r   r&   r2   r    s     r(   
<listcomp>z(RouterRunnable.batch.<locals>.<listcomp>       111e111r'   c                    g | ]
}|d          S r    r&   re   s     r(   rf   z(RouterRunnable.batch.<locals>.<listcomp>       <<<Ew<<<r'   c              3  *   K   | ]}|j         vV  d S r0   r>   r2   r   r7   s     r(   r5   z'RouterRunnable.batch.<locals>.<genexpr>   *      99Ss$.(999999r'   5One or more keys do not have a corresponding runnablerM   r   r    r   rO   r   r,   Union[Output, Exception]c                x    r)	  | j         ||fi S # t          $ r}|cY d }~S d }~ww xY w | j         ||fi S r0   )rV   	ExceptionrM   r    rO   erQ   r]   s       r(   rV   z$RouterRunnable.batch.<locals>.invoke   s{     ! @*8?5&CCFCCC    HHHHHH 'xuf?????s    
*%**c                *    g | ]}j         |         S r&   r>   rl   s     r(   rf   z(RouterRunnable.batch.<locals>.<listcomp>        999ST^C(999r'   r   ra   rM   r   r    r   rO   r   r,   ro   )anyrU   r   lenr   r   listmap)r7   r^   rO   r]   rQ   keysactual_inputsrY   rV   r+   configsexecutors   `  ``       r(   batchzRouterRunnable.batch   sj     	I11&111<<V<<<9999D99999 	"ICS//!		@ 		@ 		@ 		@ 		@ 		@ 		@ :999D999	!&#f++66$WQZ00 	HX\\&)]GLLMM 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   3CCCc                  K   |sg S d |D             }d |D             }t           fd|D                       rd}t          |          dfd} fd|D             }	t          |t          |                    }
t	          |
d                             d          gt          |t          |	||
                    R   d {V S )Nc                    g | ]
}|d          S rd   r&   re   s     r(   rf   z)RouterRunnable.abatch.<locals>.<listcomp>   rg   r'   c                    g | ]
}|d          S ri   r&   re   s     r(   rf   z)RouterRunnable.abatch.<locals>.<listcomp>   rj   r'   c              3  *   K   | ]}|j         vV  d S r0   r>   rl   s     r(   r5   z(RouterRunnable.abatch.<locals>.<genexpr>   rm   r'   rn   rM   r   r    r   rO   r   r,   ro   c                   K   r/	  | j         ||fi  d {V S # t          $ r}|cY d }~S d }~ww xY w | j         ||fi  d {V S r0   )r\   rq   rr   s       r(   r\   z&RouterRunnable.abatch.<locals>.ainvoke   s       ! G!1!1%!J!J6!J!JJJJJJJJ    HHHHHH .X-eVFFvFFFFFFFFFs    
2-22c                *    g | ]}j         |         S r&   r>   rl   s     r(   rf   z)RouterRunnable.abatch.<locals>.<listcomp>   ru   r'   r   max_concurrencyrv   )rw   rU   r   rx   r   getr   zip)r7   r^   rO   r]   rQ   r{   r|   rY   r\   r+   r}   s   `  ``      r(   abatchzRouterRunnable.abatch   s5       	I11&111<<V<<<9999D99999 	"ICS//!		G 		G 		G 		G 		G 		G 		G :999D999	!&#f++66,AJNN,--
Wc)]GDDEE
 
 
 
 
 
 
 
 
 	
r'   Iterator[Output]c              +     K   |d         }|d         }|| j         vrd| d}t          |          | j         |         }|                    ||          E d {V  d S rS   )r+   rU   streamrW   s           r(   r   zRouterRunnable.stream   s{       ElW~dn$$<c<<<CS//!>#&??<88888888888r'   AsyncIterator[Output]c                  K   |d         }|d         }|| j         vrd| d}t          |          | j         |         }|                    ||          2 3 d {V }|W V  6 d S rS   )r+   rU   astream)	r7   r    rO   rQ   r   rX   rY   rM   outputs	            r(   r   zRouterRunnable.astream   s       ElW~dn$$<c<<<CS//!>#&$,,\6BB 	 	 	 	 	 	 	&LLLLL CBBs   A!)r,   r-   )r+   r8   r,   r9   )r,   rD   )r,   rI   r0   )r    r   rO   rP   rQ   r   r,   r   )r    r   rO   rP   rQ   rZ   r,   r   )
r^   r_   rO   r`   r]   rD   rQ   rZ   r,   ra   )r    r   rO   rP   rQ   rZ   r,   r   )r    r   rO   rP   rQ   rZ   r,   r   )r!   r"   r#   r$   r%   propertyr   r1   r@   r   model_configclassmethodrH   rN   rV   r\   r   r   r   r   __classcell__)rB   s   @r(   r*   r*   5   s         $ 3222
 
 
 X X


 
 
 
 
 
 : $  L    X [ 3 3 3 X [3 EI
5 
5 
5 
5 X
5  ,0< < < < X<  IM"
 #(" " " " " X"H  IM!

 #(!
 !
 !
 !
 !
 X!
F  ,09 9 9 9 X9  ,0    X    r'   r*   N)%r$   
__future__r   collections.abcr   	itertoolsr   typingr   r   r   r	   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(   <module>r      s   1 1 " " " " " " # # # # # #                             1 1 1 1 1 1 1 1         
         
               877777777	 	 	 	 	) 	 	 	~ ~ ~ ~ ~)+v*=> ~ ~ ~ ~ ~r'   