
    Ah:                       S SK Jr  S SKrS SKrS SKJr  S SKJrJrJ	r	J
r
Jr  S SKrS SKJr  S SKJr  S SKJr  S SKJr  S S	KJrJr  S S
KJr  S SKJr  S SKJr  S SKJr  S SKJ r   \(       a  S SK!J"r"  S SK#J$r$  SS jr%SS jr&    SS jr' " S S\5      r(\" SSSS9       S                   SS jj5       r)g)     )annotationsN)defaultdict)TYPE_CHECKINGAnyCallableOptionalUnion)
deprecated)CallbackManagerForChainRun)BaseLanguageModel)JsonOutputFunctionsParser)BasePromptTemplateChatPromptTemplate)get_colored_text)Response)Chain)LLMChain)SequentialChainOpenAPISpec)	Parameterc           	     (   [         R                  " SU 5      n0 nU GH[  nUR                  S5      R                  S5      nX   n[	        U[
        5      (       an  US   S:X  a"  US   S:X  a  SOSnSUR                  U5      -   nOUS   S:X  a(  US   S:X  a  U S	3OSnU S	3UR                  U5      -   nOSR                  U5      nO[	        U[        5      (       at  US   S:X  a  S	OSn	UR                  5        V
Vs/ sH  u  pU	R                  X45      PM     nn
nUS   S:X  a  SnSnOUS   S:X  a  SnSnOSnS
nXR                  U5      -  nO#US   S:X  a  SU 3nOUS   S:X  a	  SU S	U 3nOUnXU'   GM^     U R                  " S0 UD6$ s  snn
f )Nz{(.*?)}z.;*r   .,;=  )
refindalllstriprstrip
isinstancelistjoindictitemsformat)urlpath_paramsexpected_path_param
new_paramsparamclean_paramvalsepnew_valkv_sepkvkv_strss                a/var/www/html/shao/venv/lib/python3.13/site-packages/langchain/chains/openai_functions/openapi.py_format_urlr9      s   **Z5J$ll4(//4&c4  Qx3"2Y#-c3-qS+09+;Q'(M+chhsm;((3-T""!"I,S#F7:yy{C{tqv{{A6*{GCQx3qSxx((G1X_#iG1X_+au-GG#5? %@ ::#
##% Ds   <Fc                2   0 n/ nU  GH  nUR                   (       a  UR                  UR                   5      nOG[        [        UR                  R                  5       5      5      R                  nUR                  U5      nUR                  (       a"  UR                  (       d  UR                  Ul        [        R                  " UR                  SS95      X$R                  '   UR                  (       d  M  UR                  UR                  5        GM     SX#S.$ )NTexclude_noneobject)type
propertiesrequired)param_schema
get_schemanextitercontentvaluesmedia_type_schemadescriptionjsonloadsnamer@   append)paramsspecr?   r@   pschemarG   s          r8   _openapi_params_to_json_schemarQ   @   s    JH>>__Q^^4F $T!))*:*:*<%= > P P__%67F==!3!3!"F!ZZ(FG
66:::OOAFF#  JMM    c           	     &  ^  SSK Jn  U R                  (       d  / S 4$ / n0 mU R                   GH  nU R	                  U5       Vs0 sH  ofR
                  UR                  4U_M     nnU R                  U5       GHL  n0 n	U R                  XX5      n
UR                  5       nU R                  U
5       H  nXUR
                  UR                  4'   M     [        [        5      nUR                  5        H  u  pXS      R                  U5        M     SSS	S
S.nUR                  5        H$  u  nnUU   (       d  M  [        UU   U 5      U	U'   M&     U R!                  U
5      nU(       a  UR"                  (       a  0 nUR"                  R                  5        HZ  u  nnUR$                  (       d  M  U R'                  UR$                  5      n[(        R*                  " UR)                  SS95      UU'   M\     [-        U5      S:X  a5  [/        [1        UR                  5       5      5      u  nnUS:X  a  SOSnUU	U'   O-[-        U5      S:  a  S[        UR3                  5       5      0U	S'   UR5                  XU5      nUR6                  UR8                  SU	S.S.nUR                  U5        UUR:                  UR<                  -   S.TUS   '   GMO     GM        S             SU4S jjjnUU4$ ! [         a  nSn[        U5      UeSnAff = fs  snf )a  Convert a valid OpenAPI spec to the JSON Schema format expected for OpenAI
    functions.

Args:
    spec: OpenAPI spec to convert.

Returns:
    Tuple of the OpenAI functions JSON schema and a default function for executing
        a request based on the OpenAI function schema.
r   )APIOperationzeCould not import langchain_community.tools. Please install it with `pip install langchain-community`.Nc                     g Nr    r    rR   r8   <lambda>+openapi_spec_to_openai_fn.<locals>.<lambda>h   s    4rR      rM   headerscookiesr,   )queryheadercookiepathTr;   zapplication/jsonrI   dataanyOfr=   )r>   r?   )rK   rH   
parameters)methodr+   rK   c                  > T
U    S   nT
U    S   nUR                  S0 5      n[        Xx5      nSU;   a4  [        US   [        5      (       a  [        R
                  " US   5      US'   0 UEUEn	Ub  SU	;   a  U	S   R                  U5        OX)S'   Ub  SU	;   a  U	S   R                  U5        OX9S'   [        R                  " Xg40 U	DSU0D6$ )Nrc   r+   r,   r`   rZ   rM   timeout)	popr9   r%   r(   rI   dumpsupdaterequestsrequest)rK   fn_argsrZ   rM   re   kwargsrc   r+   r,   _kwargs_name_to_call_maps             r8   default_call_api3openapi_spec_to_openai_fn.<locals>.default_call_api   s     #4(2%e,kk-4#+WGFOT!B!B"jj9GFO'W''G#	"))'2%,	"7"!((0$*!HwHHHrR   )NN   )rK   strrk   r(   rZ   Optional[dict]rM   rs   re   zOptional[int]rl   r   returnr   )langchain_community.toolsrT   ImportErrorpathsget_parameters_for_pathrK   param_inget_methods_for_pathget_operationcopyget_parameters_for_operationr   r&   r)   rL   rQ   get_request_body_for_operationrE   rG   rB   rI   rJ   lenrC   rD   rF   from_openapi_specoperation_idrH   base_urlr_   )rN   rT   emsg	functionsr_   rO   r,   rc   request_argsop	op_paramsr/   params_by_typename_locparam_loc_to_arg_name	param_locarg_namerequest_bodymedia_types
media_typemedia_type_objectrP   schema_dictkeyapi_opfnro   rn   s                               @r8   openapi_spec_to_openai_fnr   Q   sZ   &: ::<I

-1-I-I$-O
-OVVQZZ !#-O 	 
 //5FL##D1B#((*I::2>:?5::u~~67 ?(.N(0{+2215  1 "##%	%! (='B'B'D#	8!),,-K&y1.L* (E  >>rBL 4 4 5A5I5I5O5O5Q1J 1(:::!%1B1T1T!U26**"KKTK:3J/ 6R {#q(.248I8I8K3L.M+J$.2D$D&&C(3L%%),3T+:L:L:N5O+PL(!33DGF++%11$".B R  4-bj)a 6	 x #'!%!#III  I 	I
 I I 
I I6 &&&  &H 	 #A%&
s   K. !L.
L8LLc                      \ rS rSr% SrS\S'    SrS\S'    SrS\S	'    \SS
 j5       r	\SS j5       r
 S     SS jjrSrg)SimpleRequestChain   z5Chain for making a simple request to an API endpoint.r   request_methodresponserr   
output_keyfunction	input_keyc                    U R                   /$ rV   )r   selfs    r8   
input_keysSimpleRequestChain.input_keys   s    rR   c                    U R                   /$ rV   )r   r   s    r8   output_keysSimpleRequestChain.output_keys   s      rR   Nc           
        U=(       d    [         R                  " 5       nXR                     R                  S5      nXR                     R                  S5      n[	        US5      n[	        [
        R                  " USS9S5      nSU S3U-   nUR                  U5        U R                  XE5      n	U	R                  [        R                  R                  :w  a2  U	R                   SU	R                   S	U S
UR                  SS5       3n
O U	R                  5       n
U R"                  U
0$ ! [         a    U	R                   n
 N&f = f)z2Run the logic of this chain and return the output.rK   	argumentsgreen   )indentzCalling endpoint z with arguments:
z: z
For z Called with args: rM   r   )r   get_noop_managerr   rf   r   rI   rg   on_textr   status_coderi   codesokreasonget	Exceptiontextr   )r   inputsrun_manager_run_managerrK   args_pretty_name_pretty_args_textapi_responser   s              r8   _callSimpleRequestChain._call   s3    #S&@&Q&Q&Snn%))&1nn%))+6'g6'

4(BGL#L>1CD|SU#!%!4!4T!@##x~~'8'88++,B|/B/B.C %%)XXh%;$<> -',,. **  -',,-s   
D( (E Er    )rt   z	list[str]rV   )r   dict[str, Any]r   z$Optional[CallbackManagerForChainRun]rt   r   )__name__
__module____qualname____firstlineno____doc____annotations__r   r   propertyr   r   r   __static_attributes__r    rR   r8   r   r      sz    ?/ J 3Is2    ! ! =A++ :+ 
	+ +rR   r   z0.2.13zThis function is deprecated and will be removed in langchain 1.0. See API reference for replacement: https://api.python.langchain.com/en/latest/chains/langchain.chains.openai_functions.openapi.get_openapi_chain.htmlz1.0)sincemessageremovalc           
       ^^^  SSK Jn	  [        U [        5      (       aX  U	R
                  U	R                  U	R                  4 H  n U" U 5      n   O   [        U [        5      (       a  SU  3n[        U5      e[        U 5      u  nmU(       d  Sn[        U5      eU=(       d    [        R                  " S5      n[        SUUSU0[        S	S
9SUS.U=(       d    0 D6nU=(       d    [        UUU4S jUS9n[!        SX/UR"                  S/US.UD6$ ! [         a  n
Sn[        U5      U
eSn
A
ff = f! [         a    e [         a     GM  f = f)a
  Create a chain for querying an API from a OpenAPI spec.

Note: this class is deprecated. See below for a replacement implementation.
    The benefits of this implementation are:

    - Uses LLM tool calling features to encourage properly-formatted API requests;
    - Includes async support.

    .. code-block:: python

        from typing import Any

        from langchain.chains.openai_functions.openapi import openapi_spec_to_openai_fn
        from langchain_community.utilities.openapi import OpenAPISpec
        from langchain_core.prompts import ChatPromptTemplate
        from langchain_openai import ChatOpenAI

        # Define API spec. Can be JSON or YAML
        api_spec = """
        {
        "openapi": "3.1.0",
        "info": {
            "title": "JSONPlaceholder API",
            "version": "1.0.0"
        },
        "servers": [
            {
            "url": "https://jsonplaceholder.typicode.com"
            }
        ],
        "paths": {
            "/posts": {
            "get": {
                "summary": "Get posts",
                "parameters": [
                {
                    "name": "_limit",
                    "in": "query",
                    "required": false,
                    "schema": {
                    "type": "integer",
                    "example": 2
                    },
                    "description": "Limit the number of results"
                }
                ]
            }
            }
        }
        }
        """

        parsed_spec = OpenAPISpec.from_text(api_spec)
        openai_fns, call_api_fn = openapi_spec_to_openai_fn(parsed_spec)
        tools = [
            {"type": "function", "function": fn}
            for fn in openai_fns
        ]

        prompt = ChatPromptTemplate.from_template(
            "Use the provided APIs to respond to this user query:\n\n{query}"
        )
        llm = ChatOpenAI(model="gpt-4o-mini", temperature=0).bind_tools(tools)

        def _execute_tool(message) -> Any:
            if tool_calls := message.tool_calls:
                tool_call = message.tool_calls[0]
                response = call_api_fn(name=tool_call["name"], fn_args=tool_call["args"])
                response.raise_for_status()
                return response.json()
            else:
                return message.content

        chain = prompt | llm | _execute_tool

    .. code-block:: python

        response = chain.invoke({"query": "Get me top two posts."})

Args:
    spec: OpenAPISpec or url/file/text string corresponding to one.
    llm: language model, should be an OpenAI function-calling model, e.g.
        `ChatOpenAI(model="gpt-3.5-turbo-0613")`.
    prompt: Main prompt template to use.
    request_chain: Chain for taking the functions output and executing the request.
r   r   zqCould not import langchain_community.utilities.openapi. Please install it with `pip install langchain-community`.Nz!Unable to parse spec from source zkMust provide an LLM for this chain.For example,
from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
z>Use the provided API's to respond to this user query:

{query}r   F)	args_onlyr   )llmprompt
llm_kwargsoutput_parserr   verbosec                   > T" U UTTS9$ )N)rZ   rM   r    )rK   r   call_api_fnrZ   rM   s     r8   rW   #get_openapi_chain.<locals>.<lambda>  s    +	+
rR   )r   r   r   )chainsinput_variablesoutput_variablesr   r    )%langchain_community.utilities.openapir   rv   r%   rr   from_url	from_file	from_textr   
ValueErrorr   r   from_templater   r   r   r   r   )rN   r   r   request_chainllm_chain_kwargsr   rZ   rM   rl   r   r   r   
conversion
openai_fns	llm_chainr   s         ``       @r8   get_openapi_chainr      s   T&E $  !!!!
J
!$'
 dC  5dV<CS/!7=J# 	
 o )77JF  ,/%@ !rI " %7
 &M  )!,,$	
  g  &H 	 #A%&   s)   D D2
D/D**D/2E
E)r+   rr   r,   r(   rt   rr   )rM   zlist[Parameter]rN   r   rt   r(   )rN   r   rt   z%tuple[list[dict[str, Any]], Callable])NNNNFNN)rN   zUnion[OpenAPISpec, str]r   zOptional[BaseLanguageModel]r   zOptional[BasePromptTemplate]r   zOptional[Chain]r   rs   r   boolrZ   rs   rM   rs   rl   r   rt   r   )*
__future__r   rI   r!   collectionsr   typingr   r   r   r   r	   ri   langchain_core._apir
   langchain_core.callbacksr   langchain_core.language_modelsr   .langchain_core.output_parsers.openai_functionsr   langchain_core.promptsr   r   langchain_core.utils.inputr   r   langchain.chains.baser   langchain.chains.llmr   langchain.chains.sequentialr   r   r   openapi_pydanticr   r9   rQ   r   r   r   r    rR   r8   <module>r      s   "  	 # @ @  * ? < T I 7  ' ) 7A*#$LN"n'
n'*n'b++ ++\ 
	}  (,+/%)'+"!\
!\	$\ )\ #	\
 %\ \ \ \ \ \\rR   