a
    dg:                     @  s   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mZ dd
lmZ ddlmZ ddlmZ ddlmZ g dZg dZG dd dZG dd de
Z dS )zImplements Program-Aided Language Models.

This module implements the Program-Aided Language Models (PAL) for generating code
solutions. PAL is a technique described in the paper "Program-Aided Language Models"
(https://arxiv.org/pdf/2211.10435.pdf).
    )annotationsN)AnyDictListOptional)Chain)LLMChain)CallbackManagerForChainRun)BaseLanguageModel)
ConfigDictFieldmodel_validator)Self)COLORED_OBJECT_PROMPT)MATH_PROMPT)
PythonREPL)systemexecZexecfileeval
__import__compile)	r   __subclasses____builtins____globals____getattribute____code__	__bases____mro____base__c                   @  s2   e Zd ZdZejZejZd
ddddddd	Z	dS )PALValidationz"Validation for PAL generated code.NFzOptional[str]zOptional[type]bool)solution_expression_namesolution_expression_typeallow_importsallow_command_execc                 C  s   || _ || _|dur4t| j ts4tdt| j  |durt| j| jurt| j| jurttd| j d| j d| j |dur|du rtd|du r|durtd|| _	|| _
dS )a  Initialize a PALValidation instance.

        Args:
            solution_expression_name (str): Name of the expected solution expression.
                If passed, solution_expression_type must be passed as well.
            solution_expression_type (str): AST type of the expected solution
                expression. If passed, solution_expression_name must be passed as well.
                Must be one of PALValidation.SOLUTION_EXPRESSION_TYPE_FUNCTION,
                PALValidation.SOLUTION_EXPRESSION_TYPE_VARIABLE.
            allow_imports (bool): Allow import statements.
            allow_command_exec (bool): Allow using known command execution functions.
        Nz;Expected solution_expression_name to be str, instead found z0Expected solution_expression_type to be one of (,z),instead found zOsolution_expression_name requires solution_expression_type to be passed as wellzOsolution_expression_type requires solution_expression_name to be passed as well)r!   r"   
isinstancestr
ValueErrortype!SOLUTION_EXPRESSION_TYPE_FUNCTION!SOLUTION_EXPRESSION_TYPE_VARIABLE	TypeErrorr#   r$   )selfr!   r"   r#   r$    r.   s/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_experimental/pal_chain/base.py__init__3   sJ    zPALValidation.__init__)NNFF)
__name__
__module____qualname____doc__astFunctionDefr*   Namer+   r0   r.   r.   r.   r/   r   -   s       r   c                   @  s<  e Zd ZU dZded< dZded< dZded< d	Zd
ed< d	Zd
ed< dZ	ded< dZ
ded< eedZded< dZded< dZded< eddddddZe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/d0Zed1d2d d3d4d5Zed1d2d d3d6d7Zeddd8d9Zd	S );PALChaina  Chain that implements Program-Aided Language Models (PAL).

    This class implements the Program-Aided Language Models (PAL) for generating code
    solutions. PAL is a technique described in the paper "Program-Aided Language Models"
    (https://arxiv.org/pdf/2211.10435.pdf).

    *Security note*: This class implements an AI technique that generates and evaluates
        Python code, which can be dangerous and requires a specially sandboxed
        environment to be safely used. While this class implements some basic guardrails
        by limiting available locals/globals and by parsing and inspecting
        the generated Python AST using `PALValidation`, those guardrails will not
        deter sophisticated attackers and are not a replacement for a proper sandbox.
        Do not use this class on untrusted inputs, with elevated permissions,
        or without consulting your security team about proper sandboxing!
    r   	llm_chain

r'   stopprint(solution())get_answer_exprNzOptional[Dict[str, Any]]python_globalspython_localsresult
output_keyFr    return_intermediate_steps)default_factoryr   code_validations
   zOptional[int]timeoutallow_dangerous_codeafter)moder   )returnc                 C  s   | j std| S )Na  This chain relies on the execution of generated code, which can be dangerous. Please read the security notice for this class, and only use it if you understand the security implications. If you want to proceed, you will need to opt-in, by setting `allow_dangerous_code` to `True`.)rG   r(   r-   r.   r.   r/   	post_init   s
    	zPALChain.post_initTZforbid)Zarbitrary_types_allowedextraz	List[str]c                 C  s
   | j jjS )z?Return the singular input key.

        :meta private:
        )r9   promptZinput_variablesrK   r.   r.   r/   
input_keys   s    zPALChain.input_keysc                 C  s   | j s| jgS | jdgS dS )z@Return the singular output key.

        :meta private:
        intermediate_stepsN)rB   rA   rK   r.   r.   r/   output_keys   s    zPALChain.output_keyszDict[str, Any]z$Optional[CallbackManagerForChainRun]zDict[str, str])inputsrun_managerrJ   c                 C  s   |p
t  }| jjf | jg| d|}|j|dd| jd t	|| j
 t| j| jd}|j|d| j  | jd}| j| i}| jr||d< |S )N)r;   	callbacksgreen
)colorendverbose)Z_globalsZ_locals)rF   rP   )r	   Zget_noop_managerr9   Zpredictr;   Z	get_childZon_textrY   r8   validate_coderD   r   r>   r?   runr=   rF   rA   striprB   )r-   rR   rS   Z_run_managercodereplresoutputr.   r.   r/   _call   s"    zPALChain._callNone)r]   rD   rJ   c           	   	   C  s  zt |}W nd ttfy2   td| Y nB tyT   tdt| Y n  tyr   td| Y n0 d}|jd u rd}d}t	t 
|}|D ]}|jd ur|jd urt||jrt|dr|j|jkrd}t|t jr|jD ]*}t||jrt|dr|j|jkrd}qt|t js8t|t jrd}q|s\td|j d	|j |jsx|rxtd
| |jr|jst |D ]}|jst|t jr|jtv rtd|j d| |jsNt|t jrNt|jdr|jjtv rtd|jj d| t|jt jrN|jjtv rNtd|jj d| |jst|t jsrt|t jrtd
| qd S )Nz)Generated code is not valid python code: z9Generated code is expected to be a string, instead found z7Generated code too long / complex to be parsed by ast: FTnameidz3Generated code is missing the solution expression: z
 of type: z'Generated code has disallowed imports: z)Found illegal command execution function z	 in code )r5   parseSyntaxErrorUnicodeDecodeErrorr(   r,   r)   OverflowErrorr!   listiter_child_nodesr"   r&   hasattrrc   Assigntargetsrd   Import
ImportFromr#   r$   walk	AttributeattrCOMMAND_EXECUTION_ATTRIBUTESCallfuncCOMMAND_EXECUTION_FUNCTIONS)	clsr]   rD   Z	code_treeZfound_solution_exprZhas_importsZtop_level_nodesnodeZtarget_noder.   r.   r/   rZ      s    











zPALChain.validate_coder
   r   )llmkwargsrJ   c                 K  s2   t |td}tdtjd}| f |dd|d|S )zLoad PAL from math prompt.

        Args:
            llm (BaseLanguageModel): The language model to use for generating code.

        Returns:
            PALChain: An instance of PALChain.
        ry   rN   Zsolutionr!   r"   r:   r<   r9   r;   r=   rD   )r   r   r   r*   rw   ry   rz   r9   rD   r.   r.   r/   from_math_prompt@  s    
zPALChain.from_math_promptc                 K  s2   t |td}tdtjd}| f |dd|d|S )zLoad PAL from colored object prompt.

        Args:
            llm (BaseLanguageModel): The language model to use for generating code.

        Returns:
            PALChain: An instance of PALChain.
        r{   Zanswerr|   z


zprint(answer)r}   )r   r   r   r+   r~   r.   r.   r/   from_colored_object_promptX  s    z#PALChain.from_colored_object_promptc                 C  s   dS )NZ	pal_chainr.   rK   r.   r.   r/   _chain_typeq  s    zPALChain._chain_type)N)r1   r2   r3   r4   __annotations__r;   r=   r>   r?   rA   rB   r   r   rD   rF   rG   r   rL   r   Zmodel_configpropertyrO   rQ   ra   classmethodrZ   r   r   r   r.   r.   r.   r/   r8   l   s>   
 cr8   )!r4   
__future__r   r5   typingr   r   r   r   Zlangchain.chains.baser   Zlangchain.chains.llmr   Z langchain_core.callbacks.managerr	   Zlangchain_core.language_modelsr
   Zpydanticr   r   r   Ztyping_extensionsr   Z6langchain_experimental.pal_chain.colored_object_promptr   Z,langchain_experimental.pal_chain.math_promptr   Z langchain_experimental.utilitiesr   rv   rs   r   r8   r.   r.   r.   r/   <module>   s    ?