
    ihj                       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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Z e
ddd       G d de             Z y)z4Chain for question-answering with self-verification.    )annotationsN)AnyDictListOptional)
deprecated)CallbackManagerForChainRun)BaseLanguageModel)PromptTemplate)
ConfigDictmodel_validator)Chain)LLMChain)CHECK_ASSERTIONS_PROMPTCREATE_DRAFT_ANSWER_PROMPTLIST_ASSERTIONS_PROMPTREVISED_ANSWER_PROMPT)SequentialChainc                    t        | |d      }t        | |d      }t        | |d      }t        | |d      }||||g}	t        |	dgdgd      }
|
S )	N	statement)llmprompt
output_key
assertionschecked_assertionsrevised_statementquestionT)chainsinput_variablesoutput_variablesverbose)r   r   )r   create_draft_answer_promptlist_assertions_promptcheck_assertions_promptrevised_answer_promptcreate_draft_answer_chainlist_assertions_chaincheck_assertions_chainrevised_answer_chainr   $question_to_checked_assertions_chains              _/var/www/html/dev/engine/venv/lib/python3.12/site-packages/langchain/chains/llm_checker/base.py*_load_question_to_checked_assertions_chainr,      s     !))!
 %%
 &&'
 $$& 	"	F ,;#-.	,( 0/    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)sincemessageremovalc                  H   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<    edd      Z ed      edd              Zedd       Zedd       Z	 d	 	 	 	 	 ddZed d       Zeeee
ef	 	 	 	 	 	 	 	 	 	 	 	 	 d!d       Zy)"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   Tforbid)arbitrary_types_allowedextrabefore)modec           
        d|v rt        j                  d       d|vrl|d   gt        |d   |j                  dt              |j                  dt
              |j                  dt              |j                  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   )clsvaluesr*   s      r+   raise_deprecationz!LLMCheckerChain.raise_deprecationl   s     F?MM6 7fD5M- ?u

8:T 

#;=ST

#<>UV

#:<QR 5 9 => r-   c                    | j                   gS )z?Return the singular input key.

        :meta private:
        )r5   selfs    r+   
input_keyszLLMCheckerChain.input_keys   s     r-   c                    | j                   gS )z@Return the singular output key.

        :meta private:
        )r   rD   s    r+   output_keyszLLMCheckerChain.output_keys   s       r-   c                    |xs t        j                         }|| j                     }| j                  d|i|j	                               }| j
                  |d   iS )Nr   )	callbacksr   )r	   get_noop_managerr5   r*   	get_childr   )rE   inputsrun_manager_run_managerr   outputs         r+   _callzLLMCheckerChain._call   se    
 #S&@&Q&Q&S$..)::"l.D.D.F ; 
 (;!<==r-   c                     y)Nllm_checker_chain rD   s    r+   _chain_typezLLMCheckerChain._chain_type   s    "r-   c                4    t        |||||      } | dd|i|S )Nr*   rT   )r,   )r@   r   r"   r#   r$   r%   kwargsr*   s           r+   from_llmzLLMCheckerChain.from_llm   s?     7*&'% 	-  
1U

 	
r-   )rA   r   returnr   )rY   z	List[str])N)rM   zDict[str, Any]rN   z$Optional[CallbackManagerForChainRun]rY   zDict[str, str])rY   r4   )r   r
   r"   r   r#   r   r$   r   r%   r   rW   r   rY   r2   )__name__
__module____qualname____doc____annotations__r   r   r"   r   r#   r   r$   r   r%   r5   r   r   model_configr   classmethodrB   propertyrF   rH   rQ   rU   rX   rT   r-   r+   r2   r2   C   sd   	 +:9'+C	$+*1KK-CNC.E^E,A>ADIsJ $L
 (#  $6     ! ! =A>> :> 
	> # #  6P1G2I0E

 %3
 !/	

 "0
  .
 
 

 
r-   r2   )r   r
   r"   r   r#   r   r$   r   r%   r   rY   r   )!r]   
__future__r   r=   typingr   r   r   r   langchain_core._apir   langchain_core.callbacksr	   langchain_core.language_modelsr
   langchain_core.promptsr   pydanticr   r   langchain.chains.baser   langchain.chains.llmr   #langchain.chains.llm_checker.promptr   r   r   r   langchain.chains.sequentialr   r,   r2   rT   r-   r+   <module>rm      s    : "  , , * ? < 1 0 ' )  8'0	'0 .'0 +'0 ,	'0
 *'0 '0T 
	U t
e t
t
r-   