a
    dg`                     @  s   d 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 dd	lmZ dd
lmZ ddlmZmZ G dd de	ZdS )z1Chain for applying removals of logical fallacies.    )annotations)AnyDictListOptional)ChainLLMChain)BasePromptTemplate)CallbackManagerForChainRun)BaseLanguageModel	FALLACIES)LogicalFallacy)FALLACY_CRITIQUE_PROMPTFALLACY_REVISION_PROMPTc                	   @  s   e Zd ZU dZded< ded< ded< ded< dZd	ed
< ed&dddddZeee	fdd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$d%ZdS )(FallacyChaina  Chain for applying logical fallacy evaluations.

    It is modeled after Constitutional AI and in same format, but
    applying logical fallacies as generalized rules to remove in output.

    Example:
        .. code-block:: python

            from langchain_community.llms import OpenAI
            from langchain.chains import LLMChain
            from langchain_experimental.fallacy import FallacyChain
            from langchain_experimental.fallacy_removal.models import LogicalFallacy

            llm = OpenAI()

            qa_prompt = PromptTemplate(
                template="Q: {question} A:",
                input_variables=["question"],
            )
            qa_chain = LLMChain(llm=llm, prompt=qa_prompt)

            fallacy_chain = FallacyChain.from_llm(
                llm=llm,
                chain=qa_chain,
                logical_fallacies=[
                    LogicalFallacy(
                        fallacy_critique_request="Tell if this answer meets criteria.",
                        fallacy_revision_request=                        "Give an answer that meets better criteria.",
                    )
                ],
            )

            fallacy_chain.run(question="How do I know if the earth is round?")
    r	   chainzList[LogicalFallacy]logical_fallaciesfallacy_critique_chainfallacy_revision_chainFboolreturn_intermediate_stepsNzOptional[List[str]])namesreturnc                 C  s&   |d u rt t S dd |D S d S )Nc                 S  s   g | ]}t | qS  r   ).0namer   r   y/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_experimental/fallacy_removal/base.py
<listcomp>E       z.FallacyChain.get_fallacies.<locals>.<listcomp>)listr   values)clsr   r   r   r   get_fallacies@   s    zFallacyChain.get_fallaciesr   r
   r   z'FallacyChain')llmr   fallacy_critique_promptfallacy_revision_promptkwargsr   c                 K  s.   t ||d}t ||d}| f |||d|S )zCreate a chain from an LLM.)r%   prompt)r   r   r   r   )r#   r%   r   r&   r'   r(   r   r   r   r   r   from_llmG   s    
zFallacyChain.from_llmz	List[str])r   c                 C  s   | j jS )zInput keys.)r   
input_keysselfr   r   r   r+   Z   s    zFallacyChain.input_keysc                 C  s   | j rg dS dgS )zOutput keys.)outputfallacy_critiques_and_revisionsinitial_outputr.   )r   r,   r   r   r   output_keys_   s    zFallacyChain.output_keyszDict[str, Any]z$Optional[CallbackManagerForChainRun])inputsrun_managerr   c              
   C  sf  |p
t  }| jjf i |d|di}|}| jjjf i |}|jd| d | jdd g }| j	D ]}| j
j|||j|dd}	| j|	d	 }
d
|
 v r||
df qh| jj|||j|
|j|dd }|}||
|f |jd|j dd | jdd |jd|
 d | jdd |jd| d | jdd qhd|i}| jrb||d< ||d< |S )N	callbacksoriginalzInitial response: 

yellow)textverbosecolorfallacy_critique)input_promptoutput_from_modelfallacy_critique_requestr4   output_stringzno fallacy critique needed fallacy_revision)r<   r=   r>   r;   Zrevision_requestr4   z	Applying z...greenzLogical Fallacy: bluezUpdated response: r.   r0   r/   )r   Zget_noop_managerr   runZ	get_childr)   formatZon_textr9   r   r   r>   _parse_critiquestriplowerappendr   Zfallacy_revision_requestr   r   )r-   r2   r3   Z_run_managerresponseZinitial_responser<   r/   Zlogical_fallacyZfallacy_raw_critiquer;   rB   Zfinal_outputr   r   r   _callf   st    






zFallacyChain._callstr)r@   r   c                 C  s4   d| vr| S |  dd } d| v r0|  dd } | S )NzFallacy Revision request:r   r6   )splitr?   r   r   r   rG      s    zFallacyChain._parse_critique)N)N)__name__
__module____qualname____doc____annotations__r   classmethodr$   r   r   r*   propertyr+   r1   rL   staticmethodrG   r   r   r   r   r      s(   
$	 Jr   N)rR   
__future__r   typingr   r   r   r   Zlangchain.chains.baser   Zlangchain.chains.llmr	   Zlangchain.schemar
   Z langchain_core.callbacks.managerr   Zlangchain_core.language_modelsr   Z0langchain_experimental.fallacy_removal.fallaciesr   Z-langchain_experimental.fallacy_removal.modelsr   Z.langchain_experimental.fallacy_removal.promptsr   r   r   r   r   r   r   <module>   s   