a
    ag                     @  s   d Z ddlmZ ddlmZmZmZ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 dd	lmZ dd
lmZmZ ddlmZ ddlmZmZ ddlmZ G dd deZdS )zLUse a single chain to route an input to one of multiple retrieval qa chains.    )annotations)AnyDictListMappingOptional)BaseLanguageModel)PromptTemplate)BaseRetriever)ConversationChain)Chain)DEFAULT_TEMPLATE)BaseRetrievalQARetrievalQA)MultiRouteChain)LLMRouterChainRouterOutputParser)MULTI_RETRIEVAL_ROUTER_TEMPLATEc                   @  sd   e Zd ZU dZded< ded< ded< edd	d
dZeddddddddddd dddZdS )MultiRetrievalQAChainz\A multi-route chain that uses an LLM router chain to choose amongst retrieval
    qa chains.r   router_chainzMapping[str, BaseRetrievalQA]destination_chainsr   default_chainz	List[str])returnc                 C  s   dgS )Nresult )selfr   r   x/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain/chains/router/multi_retrieval_qa.pyoutput_keys!   s    z!MultiRetrievalQAChain.output_keysN)default_chain_llmr   zList[Dict[str, Any]]zOptional[BaseRetriever]zOptional[PromptTemplate]zOptional[Chain]zOptional[BaseLanguageModel]r   )llmretriever_infosdefault_retrieverdefault_promptr   r   kwargsr   c                K  s  |r|st ddd |D }d|}	tj|	d}
t|
dgtddd	}t||}i }|D ]6}|d
}|d }t	j|||d}|d }|||< q^|r|}nR|rt	j|||d}n<t
dd}t|ddgd}|d u rtdt||ddd}| f |||d|S )Nzf`default_retriever` must be specified if `default_prompt` is provided. Received only `default_prompt`.c                 S  s"   g | ]}|d   d|d  qS )namez: descriptionr   ).0rr   r   r   
<listcomp>6       z9MultiRetrievalQAChain.from_retrievers.<locals>.<listcomp>
)destinationsinputquery)Znext_inputs_inner_key)templateinput_variablesZoutput_parserprompt	retriever)r0   r1   r$   history)r.   r/   zconversation_llm must be provided if default_chain is not specified. This API has been changed to avoid instantiating default LLMs on behalf of users.You can provide a conversation LLM like so:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()r   )r   r0   Z	input_keyZ
output_key)r   r   r   )
ValueErrorjoinr   formatr	   r   r   Zfrom_llmgetr   r   replaceNotImplementedErrorr   )clsr   r    r!   r"   r   r   r#   r+   Zdestinations_strZrouter_templateZrouter_promptr   r   Zr_infor0   r1   chainr$   Z_default_chainZprompt_templater   r   r   from_retrievers%   sb    


z%MultiRetrievalQAChain.from_retrievers)NNN)	__name__
__module____qualname____doc____annotations__propertyr   classmethodr;   r   r   r   r   r      s   
   r   N) r?   
__future__r   typingr   r   r   r   r   Zlangchain_core.language_modelsr   Zlangchain_core.promptsr	   Zlangchain_core.retrieversr
   Zlangchain.chainsr   Zlangchain.chains.baser   Z$langchain.chains.conversation.promptr   Z"langchain.chains.retrieval_qa.baser   r   Zlangchain.chains.router.baser   Z"langchain.chains.router.llm_routerr   r   Z.langchain.chains.router.multi_retrieval_promptr   r   r   r   r   r   <module>   s   