U
    ht                     @  s   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 G dd de
ZG d	d
 d
eeZG dd deZdS )zBase classes for chain routing.    )annotations)ABC)AnyDictListMapping
NamedTupleOptional)AsyncCallbackManagerForChainRunCallbackManagerForChainRun	Callbacks)Chainc                   @  s   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__ r   r   @/tmp/pip-unpacked-wheel-bo69hh5q/langchain/chains/router/base.pyr      s   
r   c                   @  sJ   e Zd ZdZeddddZdddd	d
ddZdddd	d
ddZdS )RouterChainzHChain that outputs the name of a destination chain and the inputs to it.	List[str]returnc                 C  s   ddgS )Nr   r   r   selfr   r   r   output_keys   s    zRouterChain.output_keysNr   r   r   )inputs	callbacksr   c                 C  s   | ||d}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    resultr   r   r   route   s    zRouterChain.routec                   s&   | j ||dI d H }t|d |d S )Nr!   r   r   )acallr   r"   r   r   r   aroute+   s    zRouterChain.aroute)N)N)r   r   r   __doc__propertyr   r$   r&   r   r   r   r   r      s    r   c                   @  s   e Zd ZU dZded< ded< ded< dZd	ed
< G dd dZeddddZeddddZ	dddddddZ
dddd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_errorsc                   @  s   e Zd ZdZdZdS )zMultiRouteChain.ConfigTZforbidN)r   r   r   Zarbitrary_types_allowedextrar   r   r   r   Config?   s   r0   r   r   c                 C  s   | j jS )zWWill be whatever keys the router chain prompt expects.

        :meta private:
        )r*   
input_keysr   r   r   r   r1   C   s    zMultiRouteChain.input_keysc                 C  s   g S )z=Will always return text key.

        :meta private:
        r   r   r   r   r   r   K   s    zMultiRouteChain.output_keysNr   z$Optional[CallbackManagerForChainRun])r   run_managerr   c                 C  s   |p
t  }| }| jj||d}|jt|jd t|j | j	d |js^| j
|j|dS |j| jkr| j|j |j|dS | jr| j
|j|dS td|j dd S Nr!   z: )verbosez)Received invalid destination chain name '')r   get_noop_manager	get_childr*   r$   on_textstrr   r   r4   r,   r+   r.   
ValueErrorr   r   r2   Z_run_managerr    r$   r   r   r   _callS   s&     
 zMultiRouteChain._callz)Optional[AsyncCallbackManagerForChainRun]c                   s   |p
t  }| }| jj||dI d H }|jt|jd t|j | j	dI d H  |jsr| j
j|j|dI d H S |j| jkr| j|j j|j|dI d H S | jr| j
j|j|dI d H S td|j dd S r3   )r
   r6   r7   r*   r&   r8   r9   r   r   r4   r,   r%   r+   r.   r:   r;   r   r   r   _acalll   s2        zMultiRouteChain._acall)N)N)r   r   r   r'   r   r.   r0   r(   r1   r   r<   r=   r   r   r   r   r)   2   s   

  r)   N)r'   
__future__r   abcr   typingr   r   r   r   r   r	   Zlangchain_core.callbacksr
   r   r   Zlangchain.chains.baser   r   r   r)   r   r   r   r   <module>   s    