
    }h                        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e      Zy)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                      e Zd ZU dZded<   	 ded<   	 ded<   	 edd       Ze	 	 	 dd	d
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Zy	)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_chainc                    dgS )Nresult )selfs    d/var/www/html/engine/venv/lib/python3.12/site-packages/langchain/chains/router/multi_retrieval_qa.pyoutput_keysz!MultiRetrievalQAChain.output_keys!   s
    z    N)default_chain_llmc               f   |r|st        d      |D cg c]  }|d    d|d     }	}dj                  |	      }
t        j                  |
      }t	        |dgt        d	      
      }t        j                  ||      }i }|D ]:  }|j                  d      }|d   }t        j                  |||      }|d   }|||<   < |r|}n\|rt        j                  |||      }nAt        j                  dd      }t	        |ddg      }|t        d      t        ||dd      } | d|||d|S c c}w )Nzf`default_retriever` must be specified if `default_prompt` is provided. Received only `default_prompt`.namez: description
)destinationsinputquery)next_inputs_inner_key)templateinput_variablesoutput_parserprompt	retriever)r-   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   )llmr-   	input_key
output_key)r   r   r   r   )
ValueErrorjoinr   formatr
   r   r   from_llmgetr   r   replaceNotImplementedErrorr   )clsr0   retriever_infosdefault_retrieverdefault_promptr   r!   kwargsrr&   destinations_strrouter_templaterouter_promptr   r   r_infor-   r.   chainr#   _default_chainprompt_templates                         r   from_retrieversz%MultiRetrievalQAChain.from_retrievers%   s    "3<  ETTq1V9+R-(8'9:TT99\29@@)
 '$$I,7K

 &..sMB% 	-FZZ)F{+I((VyQE&>D',t$	- *N(11N6GN /66wHO#(9g:NF !())  /%!#	N  
%1(
 	
 	
Y Us   D.)returnz	List[str])NNN)r0   r	   r;   zList[Dict[str, Any]]r<   zOptional[BaseRetriever]r=   zOptional[PromptTemplate]r   zOptional[Chain]r!   zOptional[BaseLanguageModel]r>   r   rH   r   )	__name__
__module____qualname____doc____annotations__propertyr   classmethodrG   r   r    r   r   r      s     ! E55GX  
 6:37)-A
 :>A
A
 .A
 3	A

 1A
 'A
 7A
 A
 
A
 A
r    r   N) rL   
__future__r   typingr   r   r   r   r   langchain_core.language_modelsr	   langchain_core.promptsr
   langchain_core.retrieversr   langchain.chainsr   langchain.chains.baser   $langchain.chains.conversation.promptr   "langchain.chains.retrieval_qa.baser   r   langchain.chains.router.baser   "langchain.chains.router.llm_routerr   r   .langchain.chains.router.multi_retrieval_promptr   r   r   r    r   <module>r\      s?    R " 5 5 < 1 3 . ' A K 8 Q
Q
O Q
r    