Source code for langchain_community.agent_toolkits.openapi.spec

"""用于OpenAPI规范的快速简单表示。"""

from dataclasses import dataclass
from typing import List, Tuple

from langchain_core.utils.json_schema import dereference_refs


[docs]@dataclass(frozen=True) class ReducedOpenAPISpec: """一个简化的OpenAPI规范。 这是OpenAPI规范的一个简单粗糙的表示。 属性: servers: 规范中的服务器。 description: 规范的描述。 endpoints: 规范中的端点。""" servers: List[dict] description: str endpoints: List[Tuple[str, str, dict]]
[docs]def reduce_openapi_spec(spec: dict, dereference: bool = True) -> ReducedOpenAPISpec: """简化/提炼/压缩某种规范。我希望检索的目标更小(更重要的是),我希望检索结果更小。我希望 https://openapi.tools/ 能够在这方面提供一些有用的内容,但似乎并非如此。 """ # 1. Consider only get, post, patch, put, delete endpoints. endpoints = [ (f"{operation_name.upper()} {route}", docs.get("description"), docs) for route, operation in spec["paths"].items() for operation_name, docs in operation.items() if operation_name in ["get", "post", "patch", "put", "delete"] ] # 2. Replace any refs so that complete docs are retrieved. # Note: probably want to do this post-retrieval, it blows up the size of the spec. if dereference: endpoints = [ (name, description, dereference_refs(docs, full_schema=spec)) for name, description, docs in endpoints ] # 3. Strip docs down to required request args + happy path response. def reduce_endpoint_docs(docs: dict) -> dict: out = {} if docs.get("description"): out["description"] = docs.get("description") if docs.get("parameters"): out["parameters"] = [ parameter for parameter in docs.get("parameters", []) if parameter.get("required") ] if "200" in docs["responses"]: out["responses"] = docs["responses"]["200"] if docs.get("requestBody"): out["requestBody"] = docs.get("requestBody") return out endpoints = [ (name, description, reduce_endpoint_docs(docs)) for name, description, docs in endpoints ] return ReducedOpenAPISpec( servers=spec["servers"], description=spec["info"].get("description", ""), endpoints=endpoints, )