
    9|h                        d 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mZmZ ddlmZ ddlmZ  G d d	e
      Z G d
 dee      Z G d de      Zy)zBase classes for chain routing.    )annotations)ABC)AnyDictListMapping
NamedTupleOptional)AsyncCallbackManagerForChainRunCallbackManagerForChainRun	Callbacks)
ConfigDict)Chainc                  "    e Zd ZU ded<   ded<   y)RoutezOptional[str]destinationDict[str, Any]next_inputsN)__name__
__module____qualname____annotations__     [/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain/chains/router/base.pyr   r      s    r   r   c                  B    e Zd ZdZedd       ZdddZ	 d	 	 	 	 	 ddZy)	RouterChainzHChain that outputs the name of a destination chain and the inputs to it.c                
    ddgS )Nr   r   r   selfs    r   output_keyszRouterChain.output_keys   s    }--r   Nc                :     | ||      }t        |d   |d         S )z
        Route inputs to a destination chain.

        Args:
            inputs: inputs to the chain
            callbacks: callbacks to use for the chain

        Returns:
            a Route object
        	callbacksr   r   )r   r    inputsr$   results       r   routezRouterChain.route   s'     f	2VM*F=,ABBr   c                h   K   | j                  ||       d {   }t        |d   |d         S 7 w)Nr#   r   r   )acallr   r%   s       r   aroutezRouterChain.aroute,   s9      zz&Iz>>VM*F=,ABB ?s   202returnz	List[str]N)r&   r   r$   r   r-   r   )r   r   r   __doc__propertyr!   r(   r+   r   r   r   r   r      sD    R. .C >BC$C1:C	Cr   r   c                      e Zd ZU dZded<   	 ded<   	 ded<   	 dZd	ed
<   	  edd      Zedd       Z	edd       Z
	 d	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZy)MultiRouteChainzIUse a single chain to route an input to one of multiple candidate chains.r   router_chainzMapping[str, Chain]destination_chainsr   default_chainFboolsilent_errorsTforbid)arbitrary_types_allowedextrac                .    | j                   j                  S )zWWill be whatever keys the router chain prompt expects.

        :meta private:
        )r3   
input_keysr   s    r   r<   zMultiRouteChain.input_keysE   s       +++r   c                    g S )z=Will always return text key.

        :meta private:
        r   r   s    r   r!   zMultiRouteChain.output_keysM   s	     	r   Nc                z   |xs t        j                         }|j                         }| j                  j	                  ||      }|j                  t        |j                        dz   t        |j                        z   | j                         |j                  s| j                  |j                  |      S |j                  | j                  v r+ | j                  |j                     |j                  |      S | j                  r| j                  |j                  |      S t        d|j                   d      Nr#   z: )verbosez)Received invalid destination chain name '')r   get_noop_manager	get_childr3   r(   on_textstrr   r   r@   r5   r4   r7   
ValueErrorr    r&   run_manager_run_managerr$   r(   s         r   _callzMultiRouteChain._callU   s*   
 #S&@&Q&Q&S **,	!!'')'D!!"T)C0A0A,BBDLL 	 	
   %%e&7&79%MM$"9"99=4**5+<+<=!!Y  %%e&7&79%MM;E<M<M;NaP r   c                "  K   |xs t        j                         }|j                         }| j                  j	                  ||       d {   }|j                  t        |j                        dz   t        |j                        z   | j                         d {    |j                  s/| j                  j                  |j                  |       d {   S |j                  | j                  v r<| j                  |j                     j                  |j                  |       d {   S | j                  r/| j                  j                  |j                  |       d {   S t        d|j                   d      7 97 7 7 _7 &wr?   )r   rB   rC   r3   r+   rD   rE   r   r   r@   r5   r*   r4   r7   rF   rG   s         r   _acallzMultiRouteChain._acalln   s    
 #X&E&V&V&X **,	''..v.KK""!!"T)C0A0A,BBDLL # 
 	
 	
   ++11!!Y 2    $"9"99001B1BCII!!Y J    ++11!!Y 2    ;E<M<M;NaP % L	
s\   A	FFAFF:FF	AF+F,:F&F'FF	FFFr,   r.   )r&   r   rH   z$Optional[CallbackManagerForChainRun]r-   r   )r&   r   rH   z)Optional[AsyncCallbackManagerForChainRun]r-   r   )r   r   r   r/   r   r7   r   model_configr0   r<   r!   rJ   rL   r   r   r   r2   r2   3   s    S9++4PM4  $L
 , ,   =A : 
	8 BF ? 
	r   r2   N)r/   
__future__r   abcr   typingr   r   r   r   r	   r
   langchain_core.callbacksr   r   r   pydanticr   langchain.chains.baser   r   r   r2   r   r   r   <module>rT      sP    % "  A A 
   ' J  
C% C8Ve Vr   