
    h                        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
 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)Mapping)Any
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__     Z/var/www/html/eduruby.in/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      sG    R. .C"  $CC 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:
        )r1   
input_keysr   s    r   r:   zMultiRouteChain.input_keysH   s       +++r   c                    g S )z=Will always return text key.

        :meta private:
        r   r   s    r   r   zMultiRouteChain.output_keysP   s	     	r   Nc                ~   |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 d|j                   d}t        |      Nr!   z: )verbosez)Received invalid destination chain name '')r
   get_noop_manager	get_childr1   r&   on_textstrr   r   r>   r3   r2   r5   
ValueErrorr   r$   run_manager_run_managerr"   r&   msgs          r   _callzMultiRouteChain._callX   s+   
 #S&@&Q&Q&S **,	!!'')'D!!"T)C0A0A,BBLL 	 	
   %%e&7&79%MM 7 77=4**5+<+<=!!#  %%e&7&79%MM9%:K:K9LANo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 d|j                   d}t        |      7 ;7 7 7 a7 (wr=   )r	   r@   rA   r1   r)   rB   rC   r   r   r>   r3   r(   r2   r5   rD   rE   s          r   _acallzMultiRouteChain._acallq   s    
 #X&E&V&V&X **,	''..v.KK""!!"T)C0A0A,BBLL # 
 	
 	
   ++11!!# 2     7 77001B1BCII!!# J    ++11!!# 2    :%:K:K9LANo- L	



s\   A	FFAFF	:FFAF+F,:F&F' F	FFFFr*   r,   )r$   r   rF   z$Optional[CallbackManagerForChainRun]r+   r   )r$   r   rF   z)Optional[AsyncCallbackManagerForChainRun]r+   r   )r   r   r   r-   r   r5   r   model_configr.   r:   r   rI   rK   r   r   r   r0   r0   6   s    S9++4PM4  $L
 , ,   =A : 
	8 BF ? 
	r   r0   N)r-   
__future__r   abcr   collections.abcr   typingr   r   r   langchain_core.callbacksr	   r
   r   pydanticr   langchain.chains.baser   r   r   r0   r   r   r   <module>rT      sS    % "  # , , 
   ' J  
C% C<Xe Xr   