
    NgA                        d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZ ddl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 dd	lmZ dd
lmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 dZ5	 e
d         Z6dedefdZ7dedeg ef         fdZ8 G d de2e          Z9 G d de2e          Z: G d de2e          Z; G d de2e          Z< G d de2e          Z=de.d edefd!Z>d"e?d#e?d$e4d ed%e@d&ee6         defd'ZAde.d$e4d ed%e@d&ee6         defd(ZB	 	 	 	 	 	 d2de.d$e4d ed,ee         d-ee         d.e@d/eee?ef                  d%e@d&ee6         d0edefd1ZCdS )3zLAgent that interacts with OpenAPI APIs via a hierarchical planning approach.    N)partial)AnyCallableDictListLiteralOptionalSequencecast)BaseCallbackManager)BaseLanguageModel)BasePromptTemplatePromptTemplate)BaseToolTool)Field)API_CONTROLLER_PROMPTAPI_CONTROLLER_TOOL_DESCRIPTIONAPI_CONTROLLER_TOOL_NAMEAPI_ORCHESTRATOR_PROMPTAPI_PLANNER_PROMPTAPI_PLANNER_TOOL_DESCRIPTIONAPI_PLANNER_TOOL_NAMEPARSING_DELETE_PROMPTPARSING_GET_PROMPTPARSING_PATCH_PROMPTPARSING_POST_PROMPTPARSING_PUT_PROMPT REQUESTS_DELETE_TOOL_DESCRIPTIONREQUESTS_GET_TOOL_DESCRIPTIONREQUESTS_PATCH_TOOL_DESCRIPTIONREQUESTS_POST_TOOL_DESCRIPTIONREQUESTS_PUT_TOOL_DESCRIPTION)ReducedOpenAPISpec)OpenAI)BaseRequestsTool)RequestsWrapperi  )GETPOSTPUTDELETEPATCHpromptreturnc                 @    ddl m}  |t                      |           S )Nr   LLMChainllmr-   )langchain.chains.llmr1   r%   )r-   r1   s     n/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/agent_toolkits/openapi/planner.py_get_default_llm_chainr6   3   s7    ------8HH       c                 ,    t          t          |           S )z#Returns a default LLMChain factory.)r   r6   )r-   s    r5   _get_default_llm_chain_factoryr9   <   s     )6222r7   c                       e Zd ZU dZdZeed<   	 eZeed<   	 e	Z
eed<   	  e ee                    Zeed<   	 ded	efd
Zded	efdZdS )RequestsGetToolWithParsingzHRequests GET tool with LLM-instructed extraction of truncated responses.requests_getnamedescriptionresponse_lengthdefault_factory	llm_chaintextr.   c                 t   ddl m} 	  ||          }n# t          j        $ r}|d }~ww xY w|                    d          }t          t          | j                            |d         |                    }|d | j                 }| j	        
                    ||d                                                   S )Nr   parse_json_markdownparamsurl)rG   output_instructionsresponseinstructions)langchain.output_parsers.jsonrF   jsonJSONDecodeErrorgetr   strrequests_wrapperr?   rB   predictstrip)selfrC   rF   dataedata_paramsrK   s          r5   _runzRequestsGetToolWithParsing._runQ   s    EEEEEE	&&t,,DD# 	 	 	G	hhx((&**4;{*KK
 
 2d223~%%D1F,G & 
 

%''	    *%*c                 "   K   t                      NNotImplementedErrorrU   rC   s     r5   _arunz RequestsGetToolWithParsing._aruna         !###r7   N)__name__
__module____qualname____doc__r=   rQ   __annotations__r    r>   MAX_RESPONSE_LENGTHr?   intr   r9   r   rB   r   rY   r`    r7   r5   r;   r;   C   s         RRD#4K444.OS...8U667IJJ  Is    1      $ $ $ $ $ $ $ $r7   r;   c                       e Zd ZU dZdZeed<   	 eZeed<   	 e	Z
eed<   	  e ee                    Zeed<   	 ded	efd
Zded	efdZdS )RequestsPostToolWithParsingzIRequests POST tool with LLM-instructed extraction of truncated responses.requests_postr=   r>   r?   r@   rB   rC   r.   c                 T   ddl m} 	  ||          }n# t          j        $ r}|d }~ww xY wt	          t
          | j                            |d         |d                             }|d | j                 }| j	        
                    ||d                                                   S Nr   rE   rH   rV   rI   rJ   )rM   rF   rN   rO   r   rQ   rR   postr?   rB   rS   rT   rU   rC   rF   rV   rW   rK   s         r5   rY   z RequestsPostToolWithParsing._runs   s    EEEEEE	&&t,,DD# 	 	 	G	S$"7"<"<T%[$v,"W"WXX2d223~%%D1F,G & 
 

%''	rZ   c                 "   K   t                      r\   r]   r_   s     r5   r`   z!RequestsPostToolWithParsing._arun   ra   r7   N)rb   rc   rd   re   r=   rQ   rf   r"   r>   rg   r?   rh   r   r9   r   rB   r   rY   r`   ri   r7   r5   rk   rk   e   s         SSD#5K555.OS...8U667JKK  Is    1     $ $ $ $ $ $ $ $r7   rk   c                       e Zd ZU dZdZeed<   	 eZeed<   	 e	Z
eed<   	  e ee                    Zeed<   	 ded	efd
Zded	efdZdS )RequestsPatchToolWithParsingzJRequests PATCH tool with LLM-instructed extraction of truncated responses.requests_patchr=   r>   r?   r@   rB   rC   r.   c                 T   ddl m} 	  ||          }n# t          j        $ r}|d }~ww xY wt	          t
          | j                            |d         |d                             }|d | j                 }| j	        
                    ||d                                                   S rn   )rM   rF   rN   rO   r   rQ   rR   patchr?   rB   rS   rT   rp   s         r5   rY   z!RequestsPatchToolWithParsing._run   s    EEEEEE	&&t,,DD# 	 	 	G	&,,T%[$v,GG
 
 2d223~%%D1F,G & 
 

%''	rZ   c                 "   K   t                      r\   r]   r_   s     r5   r`   z"RequestsPatchToolWithParsing._arun   ra   r7   N)rb   rc   rd   re   r=   rQ   rf   r!   r>   rg   r?   rh   r   r9   r   rB   r   rY   r`   ri   r7   r5   rs   rs      s         TT D#   6K666.OS...8U667KLL  Is    1     $ $ $ $ $ $ $ $r7   rs   c                       e Zd ZU dZdZeed<   	 eZeed<   	 e	Z
eed<   	  e ee                    Zeed<   	 ded	efd
Zded	efdZdS )RequestsPutToolWithParsingzHRequests PUT tool with LLM-instructed extraction of truncated responses.requests_putr=   r>   r?   r@   rB   rC   r.   c                 T   ddl m} 	  ||          }n# t          j        $ r}|d }~ww xY wt	          t
          | j                            |d         |d                             }|d | j                 }| j	        
                    ||d                                                   S rn   )rM   rF   rN   rO   r   rQ   rR   putr?   rB   rS   rT   rp   s         r5   rY   zRequestsPutToolWithParsing._run   s    EEEEEE	&&t,,DD# 	 	 	G	S$"7";";DKf"V"VWW2d223~%%D1F,G & 
 

%''	rZ   c                 "   K   t                      r\   r]   r_   s     r5   r`   z RequestsPutToolWithParsing._arun   ra   r7   N)rb   rc   rd   re   r=   rQ   rf   r#   r>   rg   r?   rh   r   r9   r   rB   r   rY   r`   ri   r7   r5   ry   ry      s         RRD#4K444.OS...8U667IJJ  Is    1     $ $ $ $ $ $ $ $r7   ry   c                       e Zd ZU dZdZeed<   	 eZeed<   	 e	Z
ee         ed<   	  e ee                    Zeed<   	 ded	efd
Zded	efdZdS )RequestsDeleteToolWithParsingz9Tool that sends a DELETE request and parses the response.requests_deleter=   r>   r?   r@   rB   rC   r.   c                 F   ddl m} 	  ||          }n# t          j        $ r}|d }~ww xY wt	          t
          | j                            |d                             }|d | j                 }| j	        
                    ||d                                                   S )Nr   rE   rH   rI   rJ   )rM   rF   rN   rO   r   rQ   rR   deleter?   rB   rS   rT   rp   s         r5   rY   z"RequestsDeleteToolWithParsing._run   s    EEEEEE	&&t,,DD# 	 	 	G	S$"7">">tE{"K"KLL2d223~%%D1F,G & 
 

%''	rZ   c                 "   K   t                      r\   r]   r_   s     r5   r`   z#RequestsDeleteToolWithParsing._arun   ra   r7   N)rb   rc   rd   re   r=   rQ   rf   r   r>   rg   r?   r	   rh   r   r9   r   rB   r   rY   r`   ri   r7   r5   r   r      s         CC!D#!!!7K777&%8OXc]888-U667LMM  Is    4     $ $ $ $ $ $ $ $r7   r   api_specr3   c           	          ddl m} d | j        D             }t          t          dgddd                    |          z   i          } |||          }t          t          t          |j	        	          }|S )
Nr   r0   c                 $    g | ]\  }}}| d | S ) ri   ).0r=   r>   _s       r5   
<listcomp>z,_create_api_planner_tool.<locals>.<listcomp>   s9       $8D+q4+  r7   query	endpointsz- templateinput_variablespartial_variablesr2   )r=   r>   func)
r4   r1   r   r   r   joinr   r   r   run)r   r3   r1   endpoint_descriptionsr-   chaintools          r5   _create_api_planner_toolr      s     .----- <D<N   # 	&tyy9N/O/O(OP  F
 HV,,,E"0Y  D
 Kr7   api_urlapi_docsrR   allow_dangerous_requestsallowed_operationsc                    ddl m} ddlm} ddlm} g }	d|v r7 ||t                    }
|	                    t          ||
|                     d|v r7 ||t                    }|	                    t          |||                     d	|v r7 ||t                    }|	                    t          |||                     d
|v r7 ||t                    }|	                    t          |||                     d|v r7 ||t                    }|	                    t!          |||                     |	st#          d          t%          t&          ddg| |d                    d |	D                       d                    d |	D                       d          } | |||          d |	D                       }|                    ||	d          S )Nr   AgentExecutorZeroShotAgentr0   r(   r2   )rR   rB   r   r)   r*   r+   r,   zTools not foundinputagent_scratchpad, c                     g | ]	}|j         
S ri   r=   r   r   s     r5   r   z0_create_api_controller_agent.<locals>.<listcomp>?      $A$A$A4TY$A$A$Ar7   
c                 0    g | ]}|j          d |j         S z: r=   r>   r   s     r5   r   z0_create_api_controller_agent.<locals>.<listcomp>A  +    FFFDI33!133FFFr7   )r   r   
tool_namestool_descriptionsr   c                     g | ]	}|j         
S ri   r   r   s     r5   r   z0_create_api_controller_agent.<locals>.<listcomp>G      333Tty333r7   rB   allowed_toolsT)agenttoolsverbose)langchain.agents.agentr   langchain.agents.mrkl.baser   r4   r1   r   appendr;   r   rk   r   ry   r   r   r   rs   
ValueErrorr   r   r   from_agent_and_tools)r   r   rR   r3   r   r   r   r   r1   r   get_llm_chainpost_llm_chainput_llm_chaindelete_llm_chainpatch_llm_chainr-   r   s                    r5   _create_api_controller_agentr      s    544444888888------E""" S1CDDD&!1')A  	
 	
 	
 ###!c2EFFF'!1()A  	
 	
 	
 """ S1CDDD&!1')A  	
 	
 	
 %%%#84IJJJ)!1*)A  	
 	
 	
 $$$"(s3GHHH(!1))A  	
 	
 	
  ,*+++& "45 ))$A$A5$A$A$ABB!%FFFFF" "	
 
  F M(s622233U333  E --EPT-UUUr7   c                       j         d         d         dt          dt          f fd}t          t          |t                    S )zExpose controller as a tool.

    The tool is invoked with a plan from the planner, and dynamically
    creates a controller agent with relevant documentation only to
    constrain the context.
    r   rH   plan_strr.   c           	         d}t          j        ||           }d |D             }d}|D ]}d}j        D ]c\  }}}	t          j        t          j        dd|                    }
|
                    |          r d}|d| d	t          j        |	           d
z  }d|st          | d          t          |          }|
                    |           S )Nz'\b(GET|POST|PATCH|DELETE|PUT)\s+(/\S+)*c                 t    g | ]5\  }}d                      ||                    d          d                   6S )z{method} {route}?r   )methodroute)formatsplit)r   r   r   s      r5   r   z]_create_api_controller_tool.<locals>._create_and_run_api_controller_agent.<locals>.<listcomp>_  sP     
 
 
 %%V5;;s;K;KA;N%OO
 
 
r7    Fz\{.*?\}z.*Tz== Docs for z == 
r   z endpoint does not exist.)refindallr   compilesubmatchyamldumpr   r   r   )r   patternmatchesendpoint_namesdocs_strendpoint_namefound_matchr=   r   docs
regex_namer   r   r   r   base_urlr3   rR   s               r5   $_create_and_run_api_controller_agentzI_create_api_controller_tool.<locals>._create_and_run_api_controller_agent\  s+   <*Wh//
 
!(
 
 
 + 	N 	NMK!)!3 X XaZ{D$(G(GHH
##M22 X"&K W} W WDIdOO W W WWH N M!L!L!LMMMN -$
 
 yy"""r7   )r=   r   r>   )serversrQ   r   r   r   )r   rR   r3   r   r   r   r   s   ````` @r5   _create_api_controller_toolr   L  s     "5)H#s #s # # # # # # # # # # #8 %13   r7   TFr(   r)   shared_memorycallback_managerr   agent_executor_kwargskwargsc	           	         ddl m}
 ddlm} ddlm} t          | |          t          | ||||          g}t          t          ddgd
                    d |D                       d	
                    d
 |D                       d          } |d ||||          d |D             d|	} |
j        d||||d|pi S )a  Construct an OpenAI API planner and controller for a given spec.

    Inject credentials via requests_wrapper.

    We use a top-level "orchestrator" agent to invoke the planner and controller,
    rather than a top-level planner
    that invokes a controller with its plan. This is to keep the planner simple.

    You need to set allow_dangerous_requests to True to use Agent with BaseRequestsTool.
    Requests can be dangerous and can lead to security vulnerabilities.
    For example, users can ask a server to make a request to an internal
    server. It's recommended to use requests through a proxy server
    and avoid accepting inputs from untrusted sources without proper sandboxing.
    Please see: https://python.langchain.com/docs/security
    for further security information.

    Args:
        api_spec: The OpenAPI spec.
        requests_wrapper: The requests wrapper.
        llm: The language model.
        shared_memory: Optional. The shared memory. Default is None.
        callback_manager: Optional. The callback manager. Default is None.
        verbose: Optional. Whether to print verbose output. Default is True.
        agent_executor_kwargs: Optional. Additional keyword arguments
            for the agent executor.
        allow_dangerous_requests: Optional. Whether to allow dangerous requests.
            Default is False.
        allowed_operations: Optional. The allowed operations.
            Default is ("GET", "POST").
        kwargs: Additional arguments.

    Returns:
        The agent executor.
    r   r   r   r0   r   r   r   c                     g | ]	}|j         
S ri   r   r   s     r5   r   z(create_openapi_agent.<locals>.<listcomp>  r   r7   r   c                 0    g | ]}|j          d |j         S r   r   r   s     r5   r   z(create_openapi_agent.<locals>.<listcomp>  r   r7   )r   r   r   )r3   r-   memoryc                     g | ]	}|j         
S ri   r   r   s     r5   r   z(create_openapi_agent.<locals>.<listcomp>  r   r7   r   )r   r   r   r   ri   )r   r   r   r   r4   r1   r   r   r   r   r   r   )r   rR   r3   r   r   r   r   r   r   r   r   r   r1   r   r-   r   s                   r5   create_openapi_agentr     sc   \ 544444888888------ 	!3//#$	
 	
	E ( "45))$A$A5$A$A$ABB!%FFFFF" "
 
	 	 	F M (s6-HHH33U333   E
 .=- )	 
 !&B  r7   )NNTNFr   )Dre   rN   r   	functoolsr   typingr   r   r   r   r   r	   r
   r   r   langchain_core.callbacksr   langchain_core.language_modelsr   langchain_core.promptsr   r   langchain_core.toolsr   r   pydanticr   9langchain_community.agent_toolkits.openapi.planner_promptr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   /langchain_community.agent_toolkits.openapi.specr$   langchain_community.llmsr%   'langchain_community.tools.requests.toolr&   &langchain_community.utilities.requestsr'   rg   	Operationr6   r9   r;   rk   rs   ry   r   r   rQ   boolr   r   r   ri   r7   r5   <module>r      s   R R  				       O O O O O O O O O O O O O O O O O O O O  8 8 8 8 8 8 < < < < < < E E E E E E E E / / / / / / / /                                           & O N N N N N + + + + + + D D D D D D B B B B B B   4;<	#5 #    33b#g3 3 3 3$ $ $ $ $!18 $ $ $D$ $ $ $ $"2H $ $ $>$ $ $ $ $#3X $ $ $B$ $ $ $ $!18 $ $ $>$ $ $ $ $$4h $ $ $F '8	   ,LVLVLV &LV 
	LV
 #LV !+LV 	LV LV LV LV^0 0%0 
0 #	0
 !+0 
0 0 0 0n $(6:6:%*.=Q Q Q%Q 
Q C=	Q
 23Q Q $DcN3Q #Q !+Q Q 	Q Q Q Q Q Qr7   