o
    Jjgf
                     @  sZ   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dZdS )    )annotations)LanguageModelLike)StrOutputParser)BasePromptTemplate)RetrieverLikeRetrieverOutputLike)RunnableBranchllmr   	retrieverr   promptr   returnr   c                 C  sN   d|j vrtd|j  tdd dd |B f|| B t B |B jdd}|S )a  Create a chain that takes conversation history and returns documents.

    If there is no `chat_history`, then the `input` is just passed directly to the
    retriever. If there is `chat_history`, then the prompt and LLM will be used
    to generate a search query. That search query is then passed to the retriever.

    Args:
        llm: Language model to use for generating a search term given chat history
        retriever: RetrieverLike object that takes a string as input and outputs
            a list of Documents.
        prompt: The prompt used to generate the search query for the retriever.

    Returns:
        An LCEL Runnable. The runnable input must take in `input`, and if there
        is chat history should take it in the form of `chat_history`.
        The Runnable output is a list of Documents

    Example:
        .. code-block:: python

            # pip install -U langchain langchain-community

            from langchain_community.chat_models import ChatOpenAI
            from langchain.chains import create_history_aware_retriever
            from langchain import hub

            rephrase_prompt = hub.pull("langchain-ai/chat-langchain-rephrase")
            llm = ChatOpenAI()
            retriever = ...
            chat_retriever_chain = create_history_aware_retriever(
                llm, retriever, rephrase_prompt
            )

            chain.invoke({"input": "...", "chat_history": })

    inputz2Expected `input` to be a prompt variable, but got c                 S  s   |  dd S )Nchat_historyF)getx r   `/var/www/html/zoom/venv/lib/python3.10/site-packages/langchain/chains/history_aware_retriever.py<lambda><   s    z0create_history_aware_retriever.<locals>.<lambda>c                 S  s   | d S )Nr   r   r   r   r   r   r   >   s    chat_retriever_chain)run_name)input_variables
ValueErrorr   r   with_config)r	   r
   r   retrieve_documentsr   r   r   create_history_aware_retriever
   s   
)
	
r   N)r	   r   r
   r   r   r   r   r   )
__future__r   langchain_core.language_modelsr   langchain_core.output_parsersr   langchain_core.promptsr   langchain_core.retrieversr   r   langchain_core.runnablesr   r   r   r   r   r   <module>   s    