
    Ngj:                    r   d dl m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 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# erd dl$m%Z% d dl&m'Z' d9dZ(d:dZ)d;d!Z*d<d#Z+ G d$ d%e          Z, ed&d'd()          	 	 	 	 	 	 	 d=d>d8            Z-dS )?    )annotationsN)defaultdict)TYPE_CHECKINGAnyCallableDictListOptionalTupleUnion)
deprecated)CallbackManagerForChainRun)BaseLanguageModel)JsonOutputFunctionsParser)BasePromptTemplateChatPromptTemplate)get_colored_text)Response)Chain)LLMChain)SequentialChainOpenAPISpec)	Parameteror   prefer_shortboolreturnOptional[str]c                Z    t          | dd           }t          | dd           }|r|p|S |p|S )Nsummarydescription)getattr)r   r   r!   r"   s       e/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain/chains/openai_functions/openapi.py_get_descriptionr%      sB    aD))G!]D11K &%+%!'!    urlstrpath_paramsdictc                T  
 t          j        d|           }i }|D ]}|                    d                              d          }||         }t	          |t
                    r|d         dk    r)|d         dk    rdnd}d|                    |          z   }n|d         dk    r/|d         dk    r| d	nd}| d	|                    |          z   }nd                    |          }nt	          |t                    ro|d         dk    rd	nd

fd
|                                D             }	|d         dk    rd}d}n|d         dk    rd}d}nd}d}||                    |	          z  }n)|d         dk    rd| }n|d         dk    r	d| d	| }n|}|||<    | j	        di |S )Nz{(.*?)}z.;*r   .,;=c                D    g | ]\  }}                     ||f          S  )join).0kvkv_seps      r$   
<listcomp>z_format_url.<locals>.<listcomp>3   s-    CCCtq!v{{Aq6**CCCr&    r3   )
refindalllstriprstrip
isinstancelistr4   r*   itemsformat)r'   r)   expected_path_param
new_paramsparamclean_paramvalsepnew_valkv_strsr8   s             @r$   _format_urlrK   "   s   *Z55J$  $  $ll4((//44+&c4   	Qx3"2Y#--cc3-qS+09+;+;''''(+++chhsmm;((3--T"" 	!"I,,SS#FCCCCsyy{{CCCGQx3qSsxx(((GGQx3#c))qS1k11C11#
53:##
###r&   paramsList[Parameter]specr   c                   i }g }| D ]}|j         r|                    |j                   }nFt          |j                                                  d         j        }|                    |          }|j        r|j        s|j        |_        t          j        |                    d                    ||j	        <   |j
        r|                    |j	                   d||dS )Nr   Texclude_noneobject)type
propertiesrequired)param_schema
get_schemar@   contentvaluesmedia_type_schemar"   jsonloadsnamerU   append)rL   rN   rT   rU   pschemarZ   s          r$   _openapi_params_to_json_schemara   I   s    JH 
$ 
$> 	8__Q^44FF $QY%5%5%7%7 8 8 ; M__%677F= 	/!3 	/!"F!Z(F(FGG
16: 	$OOAF###JHMMMr&   %Tuple[List[Dict[str, Any]], Callable]c                   	 ddl m} n# t          $ r t          d          w xY w| j        sg d fS g }i | j        D ]}d |                     |          D             }|                     |          D ]T}i }|                     ||          }|                                }|                     |          D ]}	|	||	j	        |	j
        f<   t          t                    }
|                                D ]&\  }}|
|d                                      |           'ddd	d
d}|                                D ]&\  }}|
|         rt          |
|         |           ||<   '|                     |          }|r|j        ri }|j                                        D ]Q\  }}|j        rE|                     |j                  }t)          j        |                    d                    ||<   Rt-          |          dk    r:t          |                                          d         \  }}|dk    rdnd}|||<   n9t-          |          dk    r&dt          |                                          i|d<   |                    | ||          }|j        |j        d|dd}|                    |           ||j        |j        z   d|d         <   V	 	 d d!fd}||fS )"a4  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`.c                     d S Nr3   r3   r&   r$   <lambda>z+openapi_spec_to_openai_fn.<locals>.<lambda>p   s    4 r&   c                ,    i | ]}|j         |j        f|S r3   )r]   param_in)r5   r_   s     r$   
<dictcomp>z-openapi_spec_to_openai_fn.<locals>.<dictcomp>t   s0     
 
 
()QVQZ !
 
 
r&      rL   headerscookiesr)   )queryheadercookiepathTrP   zapplication/jsonr[   dataanyOfrR   )rS   rT   )r]   r"   
parameters)methodr'   r]   Nr(   fn_argsr*   Optional[dict]kwargsr   r   c                   	|          d         }	|          d         }|                     di           }t          ||          }d|v r8t          |d         t                    rt	          j        |d                   |d<   i ||}|%d|v r|d                             |           n||d<   |%d|v r|d                             |           n||d<   t          j        ||fi |S )Nru   r'   r)   rr   rl   rL   )	poprK   r?   r*   r[   dumpsupdaterequestsrequest)
r]   rv   rl   rL   rx   ru   r'   r)   _kwargs_name_to_call_maps
            r$   default_call_apiz3openapi_spec_to_openai_fn.<locals>.default_call_api   s    #4(2%e,kk-44#{++WGFOT!B!B"j99GFO'W''G##	"))'2222%,	"7""!((0000$*!77w777r&   )NN)r]   r(   rv   r*   rl   rw   rL   rw   rx   r   r   r   )langchain_community.toolsrd   ImportErrorpathsget_parameters_for_pathget_methods_for_pathget_operationcopyget_parameters_for_operationr]   ri   r   r@   rA   r^   ra   get_request_body_for_operationrX   rZ   rW   r[   r\   lenrY   from_openapi_specoperation_idr"   base_urlrq   )rN   rd   	functionsrq   r)   ru   request_argsop	op_paramsrE   params_by_typename_locr_   param_loc_to_arg_name	param_locarg_namerequest_bodymedia_types
media_typemedia_type_objectr`   schema_dictkeyapi_opfnr   r   s                             @r$   openapi_spec_to_openai_fnr   Z   s   
::::::: 
 
 
H
 
 	

 :  <<I
 6 6
 
-1-I-I$-O-O
 
 
 //55 2	 2	FL##D&11B#((**I::2>> @ @:?	5:u~677(..N(00 6 6!x{+2215555!##%	% %! (='B'B'D'D  #	8!), -K&y14. .L*  >>rBBL Q 4 Q 5A5I5O5O5Q5Q  1J 1(: !%1B1T!U!U26*"KKTK::3 3J/ {##q((.2;3D3D3F3F.G.G.J+J$.2D$D$D&&&C(3L%%%%)),3T+:L:L:N:N5O5O+PL(!33D$GGF+%1$".  B R    4- -bj))_2	n #'!%	8 8 8 8 8 8 84 &&&s   
 $c                  |    e Zd ZU dZded<   	 dZded<   	 dZded<   	 edd            Zedd            Z		 dddZ
dS )SimpleRequestChainz5Chain for making a simple request to an API endpoint.r   request_methodresponser(   
output_keyfunction	input_keyr   	List[str]c                    | j         gS rf   )r   selfs    r$   
input_keyszSimpleRequestChain.input_keys   s    r&   c                    | j         gS rf   )r   r   s    r$   output_keyszSimpleRequestChain.output_keys   s      r&   NinputsDict[str, Any]run_manager$Optional[CallbackManagerForChainRun]c                d   |pt          j                    }|| j                                     d          }|| j                                     d          }t	          |d          }t	          t          j        |d          d          }d| d|z   }|                    |           |                     ||          }	|	j	        dk    r3|	j	         d	|	j
         d
| dz   d|                    dd           z   }
n-	 |	                                }
n# t          $ r
 |	j        }
Y nw xY w| j        |
iS )z2Run the logic of this chain and return the output.r]   	argumentsgreen   )indentzCalling endpoint z with arguments:
   z: z
For  zCalled with args: rL   r:   )r   get_noop_managerr   rz   r   r[   r{   on_textr   status_codereasonget	Exceptiontextr   )r   r   r   _run_managerr]   args_pretty_name_pretty_args_textapi_responser   s              r$   _callzSimpleRequestChain._call   s`    #S&@&Q&S&Sdn%))&11dn%))+66'g66'
4(B(B(BGLLDLDDD|SU###!%!4!4T4!@!@#s**+DD|/BDD"4"""#>txx'<'<>>? H-',,.. - - -',-**s   =D D&%D&)r   r   rf   )r   r   r   r   r   r   )__name__
__module____qualname____doc____annotations__r   r   propertyr   r   r   r3   r&   r$   r   r      s         ??/ J    3I2      X  ! ! ! X! =A+ + + + + + +r&   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removalFUnion[OpenAPISpec, str]llmOptional[BaseLanguageModel]promptOptional[BasePromptTemplate]request_chainOptional[Chain]llm_chain_kwargsOptional[Dict]verboserl   rx   r   c           
     x   	 ddl m}	 n"# t          $ r}
t          d          |
d}
~
ww xY wt          | t                    rj|	j        |	j        |	j        fD ].}	  ||           }  n# t          $ r}
|
d}
~
wt          $ r Y +w xY wt          | t                    rt          d|            t          |           \  }|st          d          |pt          j        d          }t          d||d|it          d	
          d|d|pi }|pt          fd|          }t!          d||g|j        dg|d|S )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   )r   r   
llm_kwargsoutput_parserr   r   c                "     | |          S )N)rl   rL   r3   )r]   r   call_api_fnrl   rL   s     r$   rg   z#get_openapi_chain.<locals>.<lambda>  s!    ++$+
 +
 +
 r&   )r   r   r   )chainsinput_variablesoutput_variablesr   r3   )%langchain_community.utilities.openapir   r   r?   r(   from_url	from_file	from_textr   
ValueErrorr   r   from_templater   r   r   r   r   )rN   r   r   r   r   r   rl   rL   rx   r   e
conversion
openai_fns	llm_chainr   s         ``      @r$   get_openapi_chainr      s-   TEEEEEEE   H
 
 	
 $ I !!
 	 	J
!z$''      dC   	IGGGHHH7==J 
#
 
 	

  )7J F  ,/%@@@  !r I " %7
 
 
 
 
 
 	& & &M  =)!,$	 
   s.    
+&+A''
B1A33BB)r   r   r   r   r   r   )r'   r(   r)   r*   r   r(   )rL   rM   rN   r   r   r*   )rN   r   r   rb   )NNNNFNN)rN   r   r   r   r   r   r   r   r   r   r   r   rl   r   rL   r   rx   r   r   r   ).
__future__r   r[   r;   collectionsr   typingr   r   r   r   r	   r
   r   r   r}   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   r%   rK   ra   r   r   r   r3   r&   r$   <module>r      sZ   " " " " " "  				 # # # # # # S S S S S S S S S S S S S S S S S S S S  * * * * * * ? ? ? ? ? ? < < < < < < T T T T T T I I I I I I I I 7 7 7 7 7 7       ' ' ' ' ' ' ) ) ) ) ) ) 7 7 7 7 7 7 +AAAAAA******" " " "$$ $$ $$ $$NN N N N"k' k' k' k'\++ ++ ++ ++ ++ ++ ++ ++\ 
	}    (,+/%)'+"!V V V V V V Vr&   