UNPKG

@samchon/openapi

Version:

Universal OpenAPI to LLM function calling schemas. Transform any Swagger/OpenAPI document into type-safe schemas for OpenAI, Claude, Qwen, and more.

141 lines (140 loc) 4.54 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LlmDescriptionInverter = void 0; const OpenApiExclusiveEmender_1 = require("../utils/OpenApiExclusiveEmender"); var LlmDescriptionInverter; (function (LlmDescriptionInverter) { LlmDescriptionInverter.numeric = (description) => { if (description === undefined) return {}; const lines = description.split("\n"); return OpenApiExclusiveEmender_1.OpenApiExclusiveEmender.emend({ minimum: find({ type: "number", name: "minimum", lines, }), maximum: find({ type: "number", name: "maximum", lines, }), exclusiveMinimum: find({ type: "number", name: "exclusiveMinimum", lines, }), exclusiveMaximum: find({ type: "number", name: "exclusiveMaximum", lines, }), multipleOf: find({ type: "number", name: "multipleOf", lines, }), description: describe(lines, [ "minimum", "maximum", "exclusiveMinimum", "exclusiveMaximum", "multipleOf", ]), }); }; LlmDescriptionInverter.string = (description) => { if (description === undefined) return {}; const lines = description.split("\n"); return { format: find({ type: "string", name: "format", lines, }), pattern: find({ type: "string", name: "pattern", lines, }), contentMediaType: find({ type: "string", name: "contentMediaType", lines, }), minLength: find({ type: "number", name: "minLength", lines, }), maxLength: find({ type: "number", name: "maxLength", lines, }), description: describe(lines, [ "format", "pattern", "contentMediaType", "minLength", "maxLength", ]), }; }; LlmDescriptionInverter.array = (description) => { if (description === undefined) return {}; const lines = description.split("\n"); return { minItems: find({ type: "number", name: "minItems", lines, }), maxItems: find({ type: "number", name: "maxItems", lines, }), uniqueItems: find({ type: "boolean", name: "uniqueItems", lines, }), description: describe(lines, ["minItems", "maxItems", "uniqueItems"]), }; }; const find = (props) => { if (props.type === "boolean") return props.lines.some((line) => line.startsWith(`@${props.name}`)) ? true : undefined; for (const line of props.lines) { if (line.startsWith(`@${props.name} `) === false) continue; const value = line.replace(`@${props.name} `, "").trim(); if (props.type === "number") return (isNaN(Number(value)) ? undefined : Number(value)); return value; } return undefined; }; const describe = (lines, tags) => { const ret = trimArray(lines .map((str) => str.trim()) .filter((str) => tags.every((tag) => str.startsWith(`@${tag}`) === false))).join("\n"); return ret.length === 0 ? undefined : ret; }; const trimArray = (array) => { let first = 0; let last = array.length - 1; for (; first < array.length; ++first) if (array[first].trim().length !== 0) break; for (; last >= 0; --last) if (array[last].trim().length !== 0) break; return array.slice(first, last + 1); }; })(LlmDescriptionInverter || (exports.LlmDescriptionInverter = LlmDescriptionInverter = {}));