
    3fi                        d Z ddlmZ ddl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 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)
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   s
             g/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_classic/chains/llm_checker/base.py*_load_question_to_checked_assertions_chainr(      s     !))!
 %%
 &&'
 $$& 	"	F #-.	     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:
        ```python
        from langchain_openai import OpenAI
        from langchain_classic.chains import LLMCheckerChain

        model = OpenAI(temperature=0.7)
        checker_chain = LLMCheckerChain.from_llm(model)
        ```
    r   $question_to_checked_assertions_chainNzBaseLanguageModel | Noner   r   r   r    r!   r"   querystr	input_keyresultr   Tforbid)arbitrary_types_allowedextrabefore)modec           
        d|v rt        j                  d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.   )
stacklevelr/   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6 

#;=ST

#<>UV

#:<QR	 5 9 => r)   c                    | j                   gS )zReturn the singular input key.)r2   selfs    r'   
input_keyszLLMCheckerChain.input_keys   s     r)   c                    | j                   gS )zReturn the singular output key.)r   rC   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_managerr2   r/   	get_childr   )rD   inputsrun_manager_run_managerr   outputs         r'   _callzLLMCheckerChain._call   sf    
 #S&@&Q&Q&S$..)::"",,. ; 
 (;!<==r)   c                     y)Nllm_checker_chain rC   s    r'   _chain_typezLLMCheckerChain._chain_type   s    "r)   c                4    t        |||||      } | dd|i|S )a  Create an LLMCheckerChain from a language model.

        Args:
            llm: a language model
            create_draft_answer_prompt: prompt to create a draft answer
            list_assertions_prompt: prompt to list assertions
            check_assertions_prompt: prompt to check assertions
            revised_answer_prompt: prompt to revise the answer
            **kwargs: additional arguments
        r/   rS   )r(   )r?   r   r   r    r!   r"   kwargsr/   s           r'   from_llmzLLMCheckerChain.from_llm   s?    * 7*&'% 	-  
1U

 	
r)   )r@   dictreturnr   )rY   z	list[str])N)rL   zdict[str, Any]rM   z!CallbackManagerForChainRun | NonerY   zdict[str, str])rY   r1   )r   r   r   r   r    r   r!   r   r"   r   rV   r   rY   r.   )__name__
__module____qualname____doc____annotations__r   r   r   r   r    r   r!   r   r"   r2   r   r	   model_configr
   classmethodrA   propertyrE   rG   rP   rT   rW   rS   r)   r'   r.   r.   B   sc   
 +:9$(C	!(*1KK-CNC.E^E,A>ADIsJ $L
 (#  $:     ! ! :>>> 7> 
	> # #  6P1G2I0E

 %3
 !/	

 "0
  .
 
 

 
r)   r.   )r   r   r   r   r    r   r!   r   r"   r   rY   r   )r]   
__future__r   r<   typingr   langchain_core._apir   langchain_core.callbacksr   langchain_core.language_modelsr   langchain_core.promptsr   pydanticr	   r
   langchain_classic.chains.baser   langchain_classic.chains.llmr   +langchain_classic.chains.llm_checker.promptr   r   r   r   #langchain_classic.chains.sequentialr   r(   r.   rS   r)   r'   <module>rm      s    : "   * ? < 1 0 / 1  @&	& .& +& ,	&
 *& &R 
	U |
e |
|
r)   