
    3fi                        d 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 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)Mapping)Any)BaseLanguageModel)PromptTemplate)BaseRetriever)override)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edd              Ze	 	 	 dd	d
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd       Z	y	)MultiRetrievalQAChainzMulti Retrieval QA Chain.

    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    p/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_classic/chains/router/multi_retrieval_qa.pyoutput_keysz!MultiRetrievalQAChain.output_keys)   s     z    N)default_chain_llmc               n   |r|sd}t        |      |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                  |||      }nCt        j                  dd      }t	        |ddg      }|d}t        |      t        ||dd      } | d|||d|S c c}	w )a;  Create a multi retrieval qa chain from an LLM and a default chain.

        Args:
            llm: The language model to use.
            retriever_infos: Dictionaries containing retriever information.
            default_retriever: Optional default retriever to use if no default chain
                is provided.
            default_prompt: Optional prompt template to use for the default retriever.
            default_chain: Optional default chain to use when router doesn't map input
                to one of the destinations.
            default_chain_llm: Optional language model to use if no default chain and
                no default retriever are provided.
            **kwargs: Additional keyword arguments to pass to the chain.

        Returns:
            An instance of the multi retrieval qa chain.
        zf`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
model = ChatOpenAI()r   )llmr+   	input_key
output_key)r   r   r   r   )
ValueErrorjoinr   formatr   r   r   from_llmgetr   r   replaceNotImplementedErrorr
   )clsr.   retriever_infosdefault_retrieverdefault_promptr   r   kwargsmsgrr$   destinations_strrouter_templaterouter_promptr   r   r_infor+   r,   chainr!   _default_chainprompt_templates                          r   from_retrieversz%MultiRetrievalQAChain.from_retrievers.   s   : "3<  S/!DS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%+N /66wHO#(!*G 4F !(+  *#...%!#	N  
%1(
 	
 	
a Us   D2)returnz	list[str])NNN)r.   r   r9   zlist[dict[str, Any]]r:   zBaseRetriever | Noner;   zPromptTemplate | Noner   zChain | Noner   zBaseLanguageModel | Noner<   r   rG   r   )
__name__
__module____qualname____doc____annotations__propertyr	   r   classmethodrF   r   r   r   r   r      s     ! E55GX   
 3704&*W
 7;W
W
 .W
 0	W

 .W
 $W
 4W
 W
 
W
 W
r   r   N) rK   
__future__r   collections.abcr   typingr   langchain_core.language_modelsr   langchain_core.promptsr   langchain_core.retrieversr   typing_extensionsr	   langchain_classic.chainsr
   langchain_classic.chains.baser   ,langchain_classic.chains.conversation.promptr   *langchain_classic.chains.retrieval_qa.baser   r   $langchain_classic.chains.router.baser   *langchain_classic.chains.router.llm_routerr   r   6langchain_classic.chains.router.multi_retrieval_promptr   r   r   r   r   <module>r]      sD    R " #  < 1 3 & 6 / I S @
k
O k
r   