
    h?                        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	 	 	 	 	 	 d/de.d$e4d ed)ee   d*ee   d+e@d,eee?ef      d%e@d&ee6   d-edefd.ZCy)0zLAgent 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                 2    ddl m}  |t               |       S )Nr   LLMChainllmr-   )langchain.chains.llmr1   r%   )r-   r1   s     p/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langchain_community/agent_toolkits/openapi/planner.py_get_default_llm_chainr6   3   s    -H     c                 "    t        t        |       S )z#Returns a default LLMChain factory.)r   r6   )r-   s    r5   _get_default_llm_chain_factoryr9   <   s     )6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y)RequestsGetToolWithParsingzHRequests GET tool with LLM-instructed extraction of truncated responses.requests_getnamedescriptionresponse_lengthdefault_factory	llm_chaintextr.   c                 R   ddl m} 	  ||      }|j	                  d      }t        t        | j                  j	                  |d   |            }|d | j                   }| j                  j                  ||d         j                         S # t        j                  $ r}|d }~ww xY w)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	&t,D hhx(&&**4;{*K
 2d223~~%%D1F,G & 

%'	 ## 	G	s   B B&B!!B&c                    K   t               wNNotImplementedErrorrU   rC   s     r5   _arunz RequestsGetToolWithParsing._aruna        !##   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   sq    RD#4K4.OS.867I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y)RequestsPostToolWithParsingzIRequests POST tool with LLM-instructed extraction of truncated responses.requests_postr=   r>   r?   r@   rB   rC   r.   c                 4   ddl m} 	  ||      }t	        t
        | j                  j                  |d   |d               }|d | j                   }| j                  j                  ||d         j                         S # t        j                  $ r}|d }~ww xY w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	&t,D S$"7"7"<"<T%[$v,"WX2d223~~%%D1F,G & 

%'		 ## 	G	   A= =BBBc                    K   t               wr[   r\   r^   s     r5   r_   z!RequestsPostToolWithParsing._arun   r`   ra   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   sq    SD#5K5.OS.867J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y)RequestsPatchToolWithParsingzJRequests PATCH tool with LLM-instructed extraction of truncated responses.requests_patchr=   r>   r?   r@   rB   rC   r.   c                 4   ddl m} 	  ||      }t	        t
        | j                  j                  |d   |d               }|d | j                   }| j                  j                  ||d         j                         S # t        j                  $ r}|d }~ww xY wrn   )rM   rF   rN   rO   r   rQ   rR   patchr?   rB   rS   rT   rp   s         r5   rY   z!RequestsPatchToolWithParsing._run   s    E	&t,D &&,,T%[$v,G
 2d223~~%%D1F,G & 

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

%'		 ## 	G	rq   c                    K   t               wr[   r\   r^   s     r5   r_   z RequestsPutToolWithParsing._arun   r`   ra   N)rb   rc   rd   re   r=   rQ   rf   r#   r>   rg   r?   rh   r   r9   r   rB   r   rY   r_   ri   r7   r5   rz   rz      sq    RD#4K4.OS.867IJIs  1  $ $ $r7   rz   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y)RequestsDeleteToolWithParsingz9Tool that sends a DELETE request and parses the response.requests_deleter=   r>   r?   r@   rB   rC   r.   c                 ,   ddl m} 	  ||      }t	        t
        | j                  j                  |d               }|d | j                   }| j                  j                  ||d         j                         S # t        j                  $ r}|d }~ww xY w)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	&t,D S$"7"7">">tE{"KL2d223~~%%D1F,G & 

%'		 ## 	G	s   A9 9BBBc                    K   t               wr[   r\   r^   s     r5   r_   z#RequestsDeleteToolWithParsing._arun   r`   ra   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      su    C!D#!7K7&%8OXc]8-67LMIs  4  $ $ $r7   r   api_specr3   c           	         ddl m} | j                  D cg c]  \  }}}| d|  }}}}t        t        dgdddj                  |      z   i      } |||      }t        t        t        |j                  	      }	|	S c c}}}w )
Nr   r0    query	endpointsz- templateinput_variablespartial_variablesr2   )r=   r>   func)
r4   r1   r   r   r   joinr   r   r   run)
r   r3   r1   r=   r>   _endpoint_descriptionsr-   chaintools
             r5   _create_api_planner_toolr      s     . =E<N<N $8D+q4&+  # 	&tyy9N/O(OPF
 V,E"0YYD
 Ks   B api_urlapi_docsrR   allow_dangerous_requestsallowed_operationsc                    ddl m} ddlm} ddlm} g }	d|v r+ ||t              }
|	j                  t        ||
|             d|v r+ ||t              }|	j                  t        |||             d	|v r+ ||t              }|	j                  t        |||             d
|v r+ ||t              }|	j                  t        |||             d|v r+ ||t              }|	j                  t!        |||             |	st#        d      t%        t&        ddg| |dj)                  |	D cg c]  }|j*                   c}      dj)                  |	D cg c]  }|j*                   d|j,                    c}      d      } | |||      |	D cg c]  }|j*                   c}      }|j/                  ||	d      S c c}w c c}w c c}w )Nr   AgentExecutorZeroShotAgentr0   r(   r2   )rR   rB   r   r)   r*   r+   r,   zTools not foundinputagent_scratchpad, 
: )r   r   
tool_namestool_descriptionsr   rB   allowed_toolsT)agenttoolsverbose)langchain.agents.agentr   langchain.agents.mrkl.baser   r4   r1   r   appendr;   r   rk   r   rz   r   r   r   rt   
ValueErrorr   r   r   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-   r   s                     r5   _create_api_controller_agentr      s    58-E"" S1CD&!1')A	
 ##!c2EF'!1()A	
 "" S1CD&!1')A	
 %%#4IJ)!1*)A	
 $$"s3GH(!1))A	
 *++& "45 ))5$A4TYY$AB!%@EFDII;b!1!1 23F"	
F s62-23Ttyy3E --EPT-UU %BF 4s   +G"GG
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 cg c]*  \  }}dj                  ||j                  d      d         , }}}d}|D ]  }d}j                  D ]c  \  }	}
}t        j
                  t        j                  dd	|	            }|j                  |      sCd
}|d| dt        j                  |       dz  }e |rzt        | d       t        |      }|j                  |       S c c}}w )Nz'\b(GET|POST|PATCH|DELETE|PUT)\s+(/\S+)*z{method} {route}?r   )methodroute Fz\{.*?\}z.*Tz== Docs for z == 
r   z endpoint does not exist.)refindallformatsplitr   compilesubmatchyamldumpr   r   r   )r   patternmatchesr   r   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\  s0   <**Wh/ ")
 %%V5;;s;KA;N%O
 
 + 	NMK!)!3!3 XaZZ{D$(GH
##M2"&K,}oVDIIdOCTTV WWH	X
  M?2K!LMM	N -$
 yy""/
s   /C?)r=   r   r>   )serversrQ   r   r   r   )r   rR   r3   r   r   r   r   s   ````` @r5   _create_api_controller_toolr   L  sJ     "5)H#s #s # #8 %13 r7   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j                  |D cg c]  }|j                   c}      dj                  |D cg c]  }|j                   d	|j                    c}      d
      } |d ||||      |D cg c]  }|j                   c}d|	} |
j                  d||||d|xs i S c c}w c c}w c c}w )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   r   r   )r   r   r   )r3   r-   memoryr   )r   r   r   r   ri   )r   r   r   r   r4   r1   r   r   r   r   r   r=   r>   r   )r   rR   r3   r   r   r   r   r   r   r   r   r   r1   r   r   r-   r   s                    r5   create_openapi_agentr     s   \ 58- 	!3/#$	
	E ( "45))5$A4TYY$AB!%@EFDII;b!1!1 23F"
	F  s6-H-23Ttyy3 E
 .=-- )	
 !&B  %BF 4s   
C)2"C.3C3)NNTNF)r(   r)   )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   rt   rz   r   r   rQ   boolr   r   r   ri   r7   r5   <module>r      sR   R  	  O O O  8 < E /     & O + D B   4;<	#5 # 33b#g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^0 0%0 
0 #	0
 !+0 
0n $(6:6:%*.=Q Q%Q 
Q C=	Q
 23Q Q $DcN3Q #Q !+Q Q 	Qr7   