
    Ng                        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dS )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<   dS )RoutezOptional[str]destinationDict[str, Any]next_inputsN)__name__
__module____qualname____annotations__     X/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/chains/router/base.pyr   r      s*         r   r   c                  @    e Zd ZdZedd            ZdddZ	 dddZdS )RouterChainzHChain that outputs the name of a destination chain and the inputs to it.return	List[str]c                
    ddgS )Nr   r   r   selfs    r   output_keyszRouterChain.output_keys   s    }--r   Ninputsr   	callbacksr   r   c                T     | ||          }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
        r%   r   r   )r   r"   r$   r%   results       r   routezRouterChain.route   s2     f	222VM*F=,ABBBr   c                x   K   |                      ||           d {V }t          |d         |d                   S )Nr'   r   r   )acallr   r(   s       r   aroutezRouterChain.aroute,   sI       zz&Iz>>>>>>>>VM*F=,ABBBr   r   r   N)r$   r   r%   r   r   r   )r   r   r   __doc__propertyr#   r*   r-   r   r   r   r   r      s|        RR. . . X.C C C C C >BC C 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dS )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extrar   r   c                    | j         j        S )zWWill be whatever keys the router chain prompt expects.

        :meta private:
        )r4   
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   Nr$   r   run_manager$Optional[CallbackManagerForChainRun]c                4   |pt          j                    }|                                }| j                            ||          }|                    t          |j                  dz   t          |j                  z   | j	                   |j        s| 
                    |j        |          S |j        | j        v r" | j        |j                 |j        |          S | j        r| 
                    |j        |          S t          d|j         d          Nr'   z: )verbosez)Received invalid destination chain name '')r   get_noop_manager	get_childr4   r*   on_textstrr   r   rC   r6   r5   r8   
ValueErrorr"   r$   r?   _run_managerr%   r*   s         r   _callzMultiRouteChain._callU   s:   
 #S&@&Q&S&S **,,	!'')'DD!""T)C0A,B,BBDL 	 	
 	
 	
   	%%e&79%MMM$"999=4*5+<=!Y     	%%e&79%MMMPE<MPPP  r   )Optional[AsyncCallbackManagerForChainRun]c                  K   |pt          j                    }|                                }| j                            ||           d {V }|                    t          |j                  dz   t          |j                  z   | j	                   d {V  |j        s'| j
                            |j        |           d {V S |j        | j        v r2| j        |j                                     |j        |           d {V S | j        r'| j
                            |j        |           d {V S t          d|j         d          rB   )r   rE   rF   r4   r-   rG   rH   r   r   rC   r6   r,   r5   r8   rI   rJ   s         r   _acallzMultiRouteChain._acalln   s     
 #X&E&V&X&X **,,	'..v.KKKKKKKK""!""T)C0A,B,BBDL # 
 
 	
 	
 	
 	
 	
 	
 	
   	+11!Y 2          $"99901BCII!Y J           	+11!Y 2          PE<MPPP  r   r.   r/   )r$   r   r?   r@   r   r   )r$   r   r?   rM   r   r   )r   r   r   r0   r   r8   r   model_configr1   r=   r#   rL   rO   r   r   r   r3   r3   3   s         SS9++++4PM : $  L
 , , , X,    X =A    8 BF      r   r3   N)r0   
__future__r   abcr   typingr   r   r   r   r	   r
   langchain_core.callbacksr   r   r   pydanticr   langchain.chains.baser   r   r   r3   r   r   r   <module>rW      sS   % % " " " " " "       A A A A A A A A A A A A A A A A         
        ' ' ' ' ' '         J      
C C C C C% C C C8V V V V Ve V V V V Vr   