U
    hH                     @  s   d Z ddlmZ ddlZddl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 ddlmZmZmZmZ ddlmZ dddddddddZe
ddddG dd deZdS )z4Chain for question-answering with self-verification.    )annotationsN)AnyDictListOptional)
deprecated)CallbackManagerForChainRun)BaseLanguageModel)PromptTemplate)root_validator)Chain)LLMChain)CHECK_ASSERTIONS_PROMPTCREATE_DRAFT_ANSWER_PROMPTLIST_ASSERTIONS_PROMPTREVISED_ANSWER_PROMPT)SequentialChainr	   r
   r   )llmcreate_draft_answer_promptlist_assertions_promptcheck_assertions_promptrevised_answer_promptreturnc                 C  s\   t | |dd}t | |dd}t | |dd}t | |dd}||||g}	t|	dgdgdd}
|
S )	NZ	statement)r   prompt
output_keyZ
assertionsZchecked_assertionsrevised_statementquestionT)chainsZinput_variablesZoutput_variablesverbose)r   r   )r   r   r   r   r   Zcreate_draft_answer_chainZlist_assertions_chainZcheck_assertions_chainZrevised_answer_chainr   $question_to_checked_assertions_chain r    E/tmp/pip-unpacked-wheel-bo69hh5q/langchain/chains/llm_checker/base.py*_load_question_to_checked_assertions_chain   s@    r"   z0.2.13zSee LangGraph guides for a variety of self-reflection and corrective strategies for question-answering and other tasks: https://langchain-ai.github.io/langgraph/tutorials/rag/langgraph_self_rag/z1.0)ZsincemessageZremovalc                
   @  s  e Zd ZU dZded< dZded< eZded< eZ	ded	< e
Zded
< eZded< dZded< dZded< G dd dZedddddddZeddddZeddddZd,dd d!d"d#d$Zeddd%d&Zeeee
efd'ddddd(d d)d*d+ZdS )-LLMCheckerChaina<  Chain for question-answering with self-verification.

    Example:
        .. code-block:: python

            from langchain_community.llms import OpenAI
            from langchain.chains import LLMCheckerChain
            llm = OpenAI(temperature=0.7)
            checker_chain = LLMCheckerChain.from_llm(llm)
    r   r   NzOptional[BaseLanguageModel]r   r
   r   r   r   r   querystr	input_keyresultr   c                   @  s   e Zd ZdZdZdS )zLLMCheckerChain.ConfigTZforbidN)__name__
__module____qualname__Zarbitrary_types_allowedextrar    r    r    r!   Configg   s   r-   T)prer   )valuesr   c              	   C  sf   d|krbt d d|krb|d d k	rbt|d |dt|dt|dt|dt}||d< |S )Nr   zDirectly instantiating an LLMCheckerChain with an llm is deprecated. Please instantiate with question_to_checked_assertions_chain or using the from_llm class method.r   r   r   r   r   )warningswarnr"   getr   r   r   r   )clsr/   r   r    r    r!   raise_deprecationk   s,    
 


z!LLMCheckerChain.raise_deprecationz	List[str])r   c                 C  s   | j gS )z?Return the singular input key.

        :meta private:
        )r'   selfr    r    r!   
input_keys   s    zLLMCheckerChain.input_keysc                 C  s   | j gS )z@Return the singular output key.

        :meta private:
        )r   r5   r    r    r!   output_keys   s    zLLMCheckerChain.output_keyszDict[str, Any]z$Optional[CallbackManagerForChainRun]zDict[str, str])inputsrun_managerr   c                 C  s:   |p
t  }|| j }| jd|i| d}| j|d iS )Nr   )	callbacksr   )r   Zget_noop_managerr'   r   Z	get_childr   )r6   r9   r:   Z_run_managerr   outputr    r    r!   _call   s    
 zLLMCheckerChain._callc                 C  s   dS )NZllm_checker_chainr    r5   r    r    r!   _chain_type   s    zLLMCheckerChain._chain_typer	   r   )r   r   r   r   r   kwargsr   c                 K  s"   t |||||}| f d|i|S )Nr   )r"   )r3   r   r   r   r   r   r?   r   r    r    r!   from_llm   s    	zLLMCheckerChain.from_llm)N)r)   r*   r+   __doc____annotations__r   r   r   r   r   r   r   r   r   r'   r   r-   r   r4   propertyr7   r8   r=   r>   classmethodr@   r    r    r    r!   r$   C   s4   


 r$   ) rA   
__future__r   r0   typingr   r   r   r   Zlangchain_core._apir   Zlangchain_core.callbacksr   Zlangchain_core.language_modelsr	   Zlangchain_core.promptsr
   Zlangchain_core.pydantic_v1r   Zlangchain.chains.baser   Zlangchain.chains.llmr   Z#langchain.chains.llm_checker.promptr   r   r   r   Zlangchain.chains.sequentialr   r"   r$   r    r    r    r!   <module>   s&   *	