a
    ag                     @  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 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)
ConfigDict)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   j/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/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
< e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_errorsTZforbid)Zarbitrary_types_allowedextrar   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   E   s    zMultiRouteChain.input_keysc                 C  s   g S )z=Will always return text key.

        :meta private:
        r   r   r   r   r   r   M   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v 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   _callU   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v 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   _acalln   s*    zMultiRouteChain._acall)N)N)r   r   r   r(   r   r/   r   Zmodel_configr)   r1   r   r<   r=   r   r   r   r   r*   3   s"   

  r*   N)r(   
__future__r   abcr   typingr   r   r   r   r   r	   Zlangchain_core.callbacksr
   r   r   Zpydanticr   Zlangchain.chains.baser   r   r   r*   r   r   r   r   <module>   s    