U
    h                     @  s   d dl mZ d dlmZmZmZmZmZmZm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZ d dlmZ G dd	 d	eZd
S )    )annotations)AnyDictListOptionalSequenceTupleType)AsyncCallbackManagerForChainRunCallbackManagerForChainRun)Document)
Embeddings)VectorStore)RouterChainc                   @  s   e Zd ZU dZded< dgZded< G 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
eddddd dddZeddddd dddZdS ) EmbeddingRouterChainz4Chain that uses embeddings to route between options.r   vectorstorequeryz	List[str]routing_keysc                   @  s   e Zd ZdZdZdS )zEmbeddingRouterChain.ConfigTZforbidN)__name__
__module____qualname__Zarbitrary_types_allowedextra r   r   L/tmp/pip-unpacked-wheel-bo69hh5q/langchain/chains/router/embedding_router.pyConfig   s   r   )returnc                 C  s   | j S )zTWill be whatever keys the LLM chain prompt expects.

        :meta private:
        )r   )selfr   r   r   
input_keys   s    zEmbeddingRouterChain.input_keysNzDict[str, Any]z$Optional[CallbackManagerForChainRun])inputsrun_managerr   c                   s>   d  fdd| jD }| jj|dd} |d jd dS )	N, c                   s   g | ]} | qS r   r   .0kr   r   r   
<listcomp>'   s     z.EmbeddingRouterChain._call.<locals>.<listcomp>   r#   r   nameZnext_inputsZdestination)joinr   r   Zsimilarity_searchmetadatar   r   r   _inputresultsr   r$   r   _call"   s    zEmbeddingRouterChain._callz)Optional[AsyncCallbackManagerForChainRun]c                   sD   d  fdd| jD }| jj|ddI d H } |d jd dS )	Nr    c                   s   g | ]} | qS r   r   r!   r$   r   r   r%   0   s     z/EmbeddingRouterChain._acall.<locals>.<listcomp>r&   r'   r   r(   r)   )r*   r   r   Zasimilarity_searchr+   r,   r   r$   r   _acall+   s    zEmbeddingRouterChain._acallz#Sequence[Tuple[str, Sequence[str]]]zType[VectorStore]r   r   )names_and_descriptionsvectorstore_cls
embeddingskwargsr   c           
      K  sP   g }|D ](\}}|D ]}| t|d|id qq|||}	| f d|	i|S )Convenience constructor.r(   Zpage_contentr+   r   )appendr   Zfrom_documents
clsr1   r2   r3   r4   Z	documentsr(   Zdescriptionsdescriptionr   r   r   r   from_names_and_descriptions4   s    	z0EmbeddingRouterChain.from_names_and_descriptionsc           
        sV   g }|D ](\}}|D ]}| t|d|id qq|||I dH }	| f d|	i|S )r5   r(   r6   Nr   )r7   r   Zafrom_documentsr8   r   r   r   afrom_names_and_descriptionsF   s    	z1EmbeddingRouterChain.afrom_names_and_descriptions)N)N)r   r   r   __doc____annotations__r   r   propertyr   r/   r0   classmethodr;   r<   r   r   r   r   r      s   

  	r   N)
__future__r   typingr   r   r   r   r   r   r	   Zlangchain_core.callbacksr
   r   Zlangchain_core.documentsr   Zlangchain_core.embeddingsr   Zlangchain_core.vectorstoresr   Zlangchain.chains.router.baser   r   r   r   r   r   <module>   s   $