From 48cf9783913077fdad7c26752c7a70b20b57fb30 Mon Sep 17 00:00:00 2001 From: Jonathan Soma Date: Fri, 13 Oct 2023 02:20:32 +0300 Subject: [PATCH] Allow placeholders in OpenAPI endpoints #2938 (#2940) Use regex matches when checking endpoints instead of exact matches. `{varname}` becomes `.*` Fixes #2938 --------- Co-authored-by: Bagatur --- .../agents/agent_toolkits/openapi/planner.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/libs/langchain/langchain/agents/agent_toolkits/openapi/planner.py b/libs/langchain/langchain/agents/agent_toolkits/openapi/planner.py index 759891d030..43c0c61940 100644 --- a/libs/langchain/langchain/agents/agent_toolkits/openapi/planner.py +++ b/libs/langchain/langchain/agents/agent_toolkits/openapi/planner.py @@ -291,13 +291,16 @@ def _create_api_controller_tool( "{method} {route}".format(method=method, route=route.split("?")[0]) for method, route in matches ] - endpoint_docs_by_name = {name: docs for name, _, docs in api_spec.endpoints} docs_str = "" for endpoint_name in endpoint_names: - docs = endpoint_docs_by_name.get(endpoint_name) - if not docs: + found_match = False + for name, _, docs in api_spec.endpoints: + regex_name = re.compile(re.sub("\{.*?\}", ".*", name)) + if regex_name.match(endpoint_name): + found_match = True + docs_str += f"== Docs for {endpoint_name} == \n{yaml.dump(docs)}\n" + if not found_match: raise ValueError(f"{endpoint_name} endpoint does not exist.") - docs_str += f"== Docs for {endpoint_name} == \n{yaml.dump(docs)}\n" agent = _create_api_controller_agent(base_url, docs_str, requests_wrapper, llm) return agent.run(plan_str)