a
    dg                     @  s   d dl mZ d dlmZ d dlmZmZmZmZ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 d d
lmZ d dlmZmZ d dlmZmZ G dd deZdS )    )annotations)indent)AnyDictListOptionalType)BaseLanguageModel)Chain)AsyncCallbackManagerForChainRunCallbackManagerForChainRun)
ConfigDict)
ToTChecker)ToTController)ToTDFSMemory)ThoughtThoughtValidity)BaseThoughtGenerationStrategyProposePromptStrategyc                      s&  e Zd ZU dZded< ded< dZded< 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< dZded< edddZeddd dddZdd fdd Zed!d"d#d$Zed!d"d%d&Zd8d(d
d)d*d+d,d-Zd9d.d)d/d0d1d2Zd:d.d3d/d0d4d5Zedd"d6d7Z  ZS );ToTChainz7
    Chain implementing the Tree of Thought (ToT).
    r	   llmr   checkerresponsestr
output_key
   intk   cr   
tot_memoryr   tot_controllerz#Type[BaseThoughtGenerationStrategy]tot_strategy_classFboolverbose_llmTZforbid)Zarbitrary_types_allowedextrar   )r   kwargsreturnc                 K  s   | f d|i|S )z
        Create a ToTChain from a language model.

        :param llm: The language model to use.
        :param kwargs: Additional arguments to pass to the ToTChain constructor.
        r    )clsr   r&   r(   r(   m/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_experimental/tot/base.pyfrom_llm3   s    zToTChain.from_llm)r&   c                   s    t  jf i | | j| j_d S )N)super__init__r   r!   )selfr&   	__class__r(   r*   r-   =   s    zToTChain.__init__z	List[str])r'   c                 C  s   dgS )zJWill be whatever keys the prompt expects.

        :meta private:
        problem_descriptionr(   r.   r(   r(   r*   
input_keysA   s    zToTChain.input_keysc                 C  s   | j gS )z=Will always return text key.

        :meta private:
        )r   r2   r(   r(   r*   output_keysI   s    zToTChain.output_keysNr   z$Optional[CallbackManagerForChainRun]None)thoughtlevelrun_managerr'   c                 C  sP   |rLt jdt jdt jdi}td|j dd| d}|j|||j | jd d S )	Ngreenyellowredz	Thought: 
z    )prefix)textcolorverbose)	r   VALID_FINALZVALID_INTERMEDIATEINVALIDr   r>   on_textvalidityr@   )r.   r6   r7   r8   colorsr>   r(   r(   r*   log_thoughtQ   s    zToTChain.log_thoughtzDict[str, Any]zDict[str, str])inputsr8   r'   c                 C  s   |p
t  }|r|jdd |d }d|i}d}| j| j| j| jd}d}t| jD ]}	| j	j
}|j||| d}
||
f |d< | j|| dd	 }t|
|d
}|jtjkr| ||| | j|ji  S | j	| | ||| | | j	}qT| jdiS )Nz"Starting the ToT solve procedure.
)r>   r1   r(   )r   r   r@   r   )	callbacksZthoughtsrD   )r>   rD   zNo solution found)r   Zget_noop_managerrC   r"   r   r   r$   ranger   r    r7   Znext_thoughtZ	get_childr   r   rD   r   rA   rF   r   r>   storer!   )r.   rG   r8   Z_run_managerr1   Zchecker_inputsZthoughts_pathZthought_generatorr7   _Zthought_textZthought_validityr6   r(   r(   r*   _callb   s:    
zToTChain._callz)Optional[AsyncCallbackManagerForChainRun]c                   s   t dd S )NzAsync not implemented yet)NotImplementedError)r.   rG   r8   r(   r(   r*   _acall   s    zToTChain._acallc                 C  s   dS )NZtotr(   r2   r(   r(   r*   _chain_type   s    zToTChain._chain_type)N)N)N)__name__
__module____qualname____doc____annotations__r   r   r   r   r    r   r!   r   r"   r$   r   Zmodel_configclassmethodr+   r-   propertyr3   r4   rF   rL   rN   rO   __classcell__r(   r(   r/   r*   r      s:   
	  ' r   N) 
__future__r   textwrapr   typingr   r   r   r   r   Zlangchain.base_languager	   Zlangchain.chains.baser
   Z langchain_core.callbacks.managerr   r   Zpydanticr   Z"langchain_experimental.tot.checkerr   Z%langchain_experimental.tot.controllerr   Z!langchain_experimental.tot.memoryr   Z"langchain_experimental.tot.thoughtr   r   Z-langchain_experimental.tot.thought_generationr   r   r   r(   r(   r(   r*   <module>   s   