o
    Zh                     @  s  d Z ddlmZ ddlZddlm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 eejd Zeed Z eed Z!eed Z"eed Z#	d'd(dd Z$ed!d"d#d$G d%d& d&eZ%dS ))z/Chain for summarization with self-verification.    )annotationsN)Path)AnyDictListOptional)
deprecated)CallbackManagerForChainRun)BaseLanguageModel)PromptTemplate)
ConfigDictmodel_validator)Chain)LLMChain)SequentialChainZpromptszcreate_facts.txtzcheck_facts.txtzrevise_summary.txtzare_all_true_prompt.txtFllmr
   create_assertions_promptr   check_assertions_promptrevised_summary_promptare_all_true_promptverboseboolreturnr   c              
   C  sR   t t| |d|dt| |d|dt| |d|dt| d||dgdgddg|d}|S )	NZ
assertions)r   prompt
output_keyr   Zchecked_assertionsrevised_summaryall_true)r   r   r   r   summary)chainsZinput_variablesZoutput_variablesr   )r   r   )r   r   r   r   r   r   chain r    f/var/www/html/lang_env/lib/python3.10/site-packages/langchain/chains/llm_summarization_checker/base.py_load_sequential_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< dZded< 	 edddZedded4ddZed5d d!Zed5d"d#Z	d6d7d)d*Zed8d+d,Zeeee
ed-fd9d2d3ZdS ):LLMSummarizationCheckerChainaV  Chain for question-answering with self-verification.

    Example:
        .. code-block:: python

            from langchain_community.llms import OpenAI
            from langchain.chains import LLMSummarizationCheckerChain
            llm = OpenAI(temperature=0.0)
            checker_chain = LLMSummarizationCheckerChain.from_llm(llm)
    r   sequential_chainNzOptional[BaseLanguageModel]r   r   r   r   r   r   querystr	input_keyresultr      int
max_checksTZforbid)Zarbitrary_types_allowedextrabefore)modevaluesr   r   r   c              
   C  sn   d|v r5t d d|vr5|d d ur5t|d |dt|dt|dt|dt|dd	d
|d< |S )Nr   zDirectly instantiating an LLMSummarizationCheckerChain with an llm is deprecated. Please instantiate with sequential_chain argument or using the from_llm class method.r%   r   r   r   r   r   Fr   )warningswarnr"   getCREATE_ASSERTIONS_PROMPTCHECK_ASSERTIONS_PROMPTREVISED_SUMMARY_PROMPTARE_ALL_TRUE_PROMPT)clsr0   r    r    r!   raise_deprecationq   s   





z.LLMSummarizationCheckerChain.raise_deprecation	List[str]c                 C     | j gS )z?Return the singular input key.

        :meta private:
        )r(   selfr    r    r!   
input_keys      z'LLMSummarizationCheckerChain.input_keysc                 C  r<   )z@Return the singular output key.

        :meta private:
        )r   r=   r    r    r!   output_keys   r@   z(LLMSummarizationCheckerChain.output_keysinputsDict[str, Any]run_manager$Optional[CallbackManagerForChainRun]Dict[str, str]c           	      C  s   |pt  }d}d}d }|| j }|}|sF|| jk rF| jd|i| d}|d7 }|d  dkr2n| jr;t|d  |d }|sF|| jk s|sLt	d	| j
|d  iS )
NFr   r   )	callbacks   r   Truer   zNo output from chain)r	   Zget_noop_managerr(   r,   r%   Z	get_childstripr   print
ValueErrorr   )	r>   rB   rD   Z_run_managerr   countoutputZoriginal_inputZchain_inputr    r    r!   _call   s(   
z"LLMSummarizationCheckerChain._callc                 C  s   dS )NZllm_summarization_checker_chainr    r=   r    r    r!   _chain_type   s   z(LLMSummarizationCheckerChain._chain_typeFr
   r   r   kwargsc           	      K  s(   t ||||||d}| d||d|S )Nr1   )r%   r   r    )r"   )	r9   r   r   r   r   r   r   rQ   r   r    r    r!   from_llm   s   z%LLMSummarizationCheckerChain.from_llm)r0   r   r   r   )r   r;   )N)rB   rC   rD   rE   r   rF   )r   r'   )r   r
   r   r   r   r   r   r   r   r   r   r   rQ   r   r   r$   )__name__
__module____qualname____doc____annotations__r   r5   r   r6   r   r7   r   r8   r   r(   r   r,   r   Zmodel_configr   classmethodr:   propertyr?   rA   rO   rP   rR   r    r    r    r!   r$   E   sN   
 

r$   )F)r   r
   r   r   r   r   r   r   r   r   r   r   r   r   )&rV   
__future__r   r2   pathlibr   typingr   r   r   r   Zlangchain_core._apir   Zlangchain_core.callbacksr	   Zlangchain_core.language_modelsr
   Zlangchain_core.prompts.promptr   Zpydanticr   r   Zlangchain.chains.baser   Zlangchain.chains.llmr   Zlangchain.chains.sequentialr   __file__parentZPROMPTS_DIR	from_filer5   r6   r7   r8   r"   r$   r    r    r    r!   <module>   s4    	*	