o
    Zh                     @  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 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)
ConfigDict)RouterChainc                   @  sz   e Zd ZU dZded< dgZded< eddd	Zed#ddZ		d$d%ddZ
	d$d&ddZed'dd Zed'd!d"ZdS )(EmbeddingRouterChainz4Chain that uses embeddings to route between options.r   vectorstorequery	List[str]routing_keysTZforbid)Zarbitrary_types_allowedextrareturnc                 C  s   | j S )zTWill be whatever keys the LLM chain prompt expects.

        :meta private:
        )r   )self r   _/var/www/html/lang_env/lib/python3.10/site-packages/langchain/chains/router/embedding_router.py
input_keys   s   zEmbeddingRouterChain.input_keysNinputsDict[str, Any]run_manager$Optional[CallbackManagerForChainRun]c                   s>   d  fdd| jD }| jj|dd} |d jd dS )	N, c                      g | ]} | qS r   r   .0kr   r   r   
<listcomp>)       z.EmbeddingRouterChain._call.<locals>.<listcomp>   r$   r   nameZnext_inputsdestination)joinr   r   Zsimilarity_searchmetadatar   r   r   _inputresultsr   r%   r   _call$   s   zEmbeddingRouterChain._call)Optional[AsyncCallbackManagerForChainRun]c                   sF   d  fdd| jD }| jj|ddI d H } |d jd dS )	Nr    c                   r!   r   r   r"   r%   r   r   r&   2   r'   z/EmbeddingRouterChain._acall.<locals>.<listcomp>r(   r)   r   r*   r+   )r-   r   r   Zasimilarity_searchr.   r/   r   r%   r   _acall-   s   zEmbeddingRouterChain._acallnames_and_descriptions#Sequence[Tuple[str, Sequence[str]]]vectorstore_clsType[VectorStore]
embeddingsr   kwargsr   c           
      K  sP   g }|D ]\}}|D ]}| t|d|id q
q|||}	| dd|	i|S )Convenience constructor.r*   Zpage_contentr.   r   Nr   )appendr   Zfrom_documents
clsr5   r7   r9   r:   Z	documentsr*   Zdescriptionsdescriptionr   r   r   r   from_names_and_descriptions6   s   	z0EmbeddingRouterChain.from_names_and_descriptionsc           
        sX   g }|D ]\}}|D ]}| t|d|id qq|||I dH }	| dd|	i|S )r;   r*   r<   Nr   r   )r=   r   Zafrom_documentsr>   r   r   r   afrom_names_and_descriptionsH   s   	z1EmbeddingRouterChain.afrom_names_and_descriptions)r   r   )N)r   r   r   r   r   r   )r   r   r   r3   r   r   )
r5   r6   r7   r8   r9   r   r:   r   r   r   )__name__
__module____qualname____doc____annotations__r   r   Zmodel_configpropertyr   r2   r4   classmethodrA   rB   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pydanticr   Zlangchain.chains.router.baser   r   r   r   r   r   <module>   s    $