Recursively parse OpenAPI specifications such that all "$ref": "#/foo"
entries are replaced with what the reference in the spec resolves to.
Our goal is to make it easier to load an OpenAPI schema into a search index or tool calling repository for RAG-style LLM usecases.
This is a very simple package which wraps @json-schema-tools/reference-resolver. You may want to consider copying the index.ts
function intead of installing this entire package.
Install
npm install openapi-schema-ref-parser
Usage Example
import expandRefs from "openapi-schema-ref-parser";
async function expandOpenapiSpec() {
const specResponse = await fetch(
"https://api.trieve.ai/api-docs/openapi.json"
);
const specText = await specResponse.text();
const openapiSpec = JSON.parse(specText);
const expandedSpec = await expandRefs(openapiSpec, { maxDepth: 1000 });
for (const path in expandedSpec.paths) {
for (const method in expandedSpec.paths[path]) {
const methodPath = `${method.toUpperCase()} ${path}`;
const route = { [methodPath]: expandedSpec.paths[path][method] };
console.log(JSON.stringify(route, null, 2));
}
}
}
expandOpenapiSpec();
Context
OpenAPI specs have gotten more valuable in the past couple years of LLMs being around since LLMs are able to intelligently do things once they know about every route available in a given API. However, they can be hard to process into a search index or tool calling repository because they leverage a $ref
system.
OpenAPI specifications tend to re-use types across many path
's and method
's. To simplify their defitions, the final JSON
or YAML
files contain several field values like {"schema": { "$ref": "#/components/schemas/ErrorResponseBody" }}
where the actual value lies at openapiSpec.components.schemas.ErrorResponseBody
.