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.

1 lines 18.7 kB
{"version":3,"file":"LlmTypeChecker.mjs","sources":["../../src/utils/LlmTypeChecker.ts"],"sourcesContent":["import { ILlmSchema } from \"../structures/ILlmSchema\";\nimport { MapUtil } from \"./MapUtil\";\nimport { OpenApiTypeCheckerBase } from \"./internal/OpenApiTypeCheckerBase\";\n\n/**\n * Type checker for LLM function calling schema.\n *\n * `LlmTypeChecker` is a type checker of {@link ILlmSchema}, the type schema for\n * LLM (Large Language Model) function calling.\n *\n * This checker provides type guard functions for validating schema types, and\n * operators for traversing and comparing schemas.\n *\n * @author Jeongho Nam - https://github.com/samchon\n */\nexport namespace LlmTypeChecker {\n /* -----------------------------------------------------------\n TYPE CHECKERS\n ----------------------------------------------------------- */\n /**\n * Test whether the schema is a null type.\n *\n * @param schema Target schema\n * @returns Whether null type or not\n */\n export const isNull = (schema: ILlmSchema): schema is ILlmSchema.INull =>\n (schema as ILlmSchema.INull).type === \"null\";\n\n /**\n * Test whether the schema is an unknown type.\n *\n * @param schema Target schema\n * @returns Whether unknown type or not\n */\n export const isUnknown = (\n schema: ILlmSchema,\n ): schema is ILlmSchema.IUnknown =>\n (schema as ILlmSchema.IUnknown).type === undefined &&\n !isAnyOf(schema) &&\n !isReference(schema);\n\n /**\n * Test whether the schema is a boolean type.\n *\n * @param schema Target schema\n * @returns Whether boolean type or not\n */\n export const isBoolean = (\n schema: ILlmSchema,\n ): schema is ILlmSchema.IBoolean =>\n (schema as ILlmSchema.IBoolean).type === \"boolean\";\n\n /**\n * Test whether the schema is an integer type.\n *\n * @param schema Target schema\n * @returns Whether integer type or not\n */\n export const isInteger = (\n schema: ILlmSchema,\n ): schema is ILlmSchema.IInteger =>\n (schema as ILlmSchema.IInteger).type === \"integer\";\n\n /**\n * Test whether the schema is a number type.\n *\n * @param schema Target schema\n * @returns Whether number type or not\n */\n export const isNumber = (schema: ILlmSchema): schema is ILlmSchema.INumber =>\n (schema as ILlmSchema.INumber).type === \"number\";\n\n /**\n * Test whether the schema is a string type.\n *\n * @param schema Target schema\n * @returns Whether string type or not\n */\n export const isString = (schema: ILlmSchema): schema is ILlmSchema.IString =>\n (schema as ILlmSchema.IString).type === \"string\";\n\n /**\n * Test whether the schema is an array type.\n *\n * @param schema Target schema\n * @returns Whether array type or not\n */\n export const isArray = (schema: ILlmSchema): schema is ILlmSchema.IArray =>\n (schema as ILlmSchema.IArray).type === \"array\" &&\n (schema as ILlmSchema.IArray).items !== undefined;\n\n /**\n * Test whether the schema is an object type.\n *\n * @param schema Target schema\n * @returns Whether object type or not\n */\n export const isObject = (schema: ILlmSchema): schema is ILlmSchema.IObject =>\n (schema as ILlmSchema.IObject).type === \"object\";\n\n /**\n * Test whether the schema is a reference type.\n *\n * @param schema Target schema\n * @returns Whether reference type or not\n */\n export const isReference = (\n schema: ILlmSchema,\n ): schema is ILlmSchema.IReference => (schema as any).$ref !== undefined;\n\n /**\n * Test whether the schema is a union type.\n *\n * @param schema Target schema\n * @returns Whether union type or not\n */\n export const isAnyOf = (schema: ILlmSchema): schema is ILlmSchema.IAnyOf =>\n (schema as ILlmSchema.IAnyOf).anyOf !== undefined;\n\n /* -----------------------------------------------------------\n OPERATORS\n ----------------------------------------------------------- */\n /**\n * Visit every nested schemas.\n *\n * Visit every nested schemas of the target, and apply the `props.closure`\n * function.\n *\n * Here is the list of occurring nested visitings:\n *\n * - {@link ILlmSchema.IAnyOf.anyOf}\n * - {@link ILlmSchema.IReference}\n * - {@link ILlmSchema.IObject.properties}\n * - {@link ILlmSchema.IArray.items}\n *\n * @param props Properties for visiting\n */\n export const visit = (props: {\n closure: (schema: ILlmSchema, accessor: string) => void;\n $defs?: Record<string, ILlmSchema> | undefined;\n schema: ILlmSchema;\n accessor?: string;\n refAccessor?: string;\n }): void => {\n const already: Set<string> = new Set();\n const refAccessor: string = props.refAccessor ?? \"$input.$defs\";\n const next = (schema: ILlmSchema, accessor: string): void => {\n props.closure(schema, accessor);\n if (LlmTypeChecker.isReference(schema)) {\n const key: string = schema.$ref.split(\"#/$defs/\").pop()!;\n if (already.has(key) === true) return;\n already.add(key);\n const found: ILlmSchema | undefined = props.$defs?.[key];\n if (found !== undefined) next(found, `${refAccessor}[${key}]`);\n } else if (LlmTypeChecker.isAnyOf(schema))\n schema.anyOf.forEach((s, i) => next(s, `${accessor}.anyOf[${i}]`));\n else if (LlmTypeChecker.isObject(schema)) {\n for (const [key, value] of Object.entries(schema.properties))\n next(value, `${accessor}.properties[${JSON.stringify(key)}]`);\n if (\n typeof schema.additionalProperties === \"object\" &&\n schema.additionalProperties !== null\n )\n next(schema.additionalProperties, `${accessor}.additionalProperties`);\n } else if (LlmTypeChecker.isArray(schema))\n next(schema.items, `${accessor}.items`);\n };\n next(props.schema, props.accessor ?? \"$input.schemas\");\n };\n\n /**\n * Test whether the `x` schema covers the `y` schema.\n *\n * @param props Properties for testing\n * @returns Whether the `x` schema covers the `y` schema\n */\n export const covers = (props: {\n $defs?: Record<string, ILlmSchema> | undefined;\n x: ILlmSchema;\n y: ILlmSchema;\n }): boolean =>\n coverStation({\n $defs: props.$defs,\n x: props.x,\n y: props.y,\n visited: new Map(),\n });\n\n const coverStation = (p: {\n $defs?: Record<string, ILlmSchema> | undefined;\n visited: Map<ILlmSchema, Map<ILlmSchema, boolean>>;\n x: ILlmSchema;\n y: ILlmSchema;\n }): boolean => {\n const cache: boolean | undefined = p.visited.get(p.x)?.get(p.y);\n if (cache !== undefined) return cache;\n\n // FOR RECURSIVE CASE\n const nested: Map<ILlmSchema, boolean> = MapUtil.take(p.visited)(p.x)(\n () => new Map(),\n );\n nested.set(p.y, true);\n\n // COMPUTE IT\n const result: boolean = coverSchema(p);\n nested.set(p.y, result);\n return result;\n };\n\n const coverSchema = (p: {\n $defs?: Record<string, ILlmSchema> | undefined;\n visited: Map<ILlmSchema, Map<ILlmSchema, boolean>>;\n x: ILlmSchema;\n y: ILlmSchema;\n }): boolean => {\n // CHECK EQUALITY\n if (p.x === p.y) return true;\n else if (isReference(p.x) && isReference(p.y) && p.x.$ref === p.y.$ref)\n return true;\n\n // COMPARE WITH FLATTENING\n const alpha: ILlmSchema[] = flatSchema(p.$defs, p.x);\n const beta: ILlmSchema[] = flatSchema(p.$defs, p.y);\n if (alpha.some((x) => isUnknown(x))) return true;\n else if (beta.some((x) => isUnknown(x))) return false;\n return beta.every((b) =>\n alpha.some((a) =>\n coverEscapedSchema({\n $defs: p.$defs,\n visited: p.visited,\n x: a,\n y: b,\n }),\n ),\n );\n };\n\n const coverEscapedSchema = (p: {\n $defs?: Record<string, ILlmSchema> | undefined;\n visited: Map<ILlmSchema, Map<ILlmSchema, boolean>>;\n x: ILlmSchema;\n y: ILlmSchema;\n }): boolean => {\n // CHECK EQUALITY\n if (p.x === p.y) return true;\n else if (isUnknown(p.x)) return true;\n else if (isUnknown(p.y)) return false;\n else if (isNull(p.x)) return isNull(p.y);\n // ATOMIC CASE\n else if (isBoolean(p.x)) return isBoolean(p.y) && coverBoolean(p.x, p.y);\n else if (isInteger(p.x)) return isInteger(p.y) && coverInteger(p.x, p.y);\n else if (isNumber(p.x)) return isNumber(p.y) && coverNumber(p.x, p.y);\n else if (isString(p.x)) return isString(p.y) && coverString(p.x, p.y);\n // INSTANCE CASE\n else if (isArray(p.x))\n return (\n isArray(p.y) &&\n coverArray({\n $defs: p.$defs,\n visited: p.visited,\n x: p.x,\n y: p.y,\n })\n );\n else if (isObject(p.x))\n return (\n isObject(p.y) &&\n coverObject({\n $defs: p.$defs,\n visited: p.visited,\n x: p.x,\n y: p.y,\n })\n );\n else if (isReference(p.x)) return isReference(p.y) && p.x.$ref === p.y.$ref;\n return false;\n };\n\n const coverArray = (p: {\n $defs?: Record<string, ILlmSchema> | undefined;\n visited: Map<ILlmSchema, Map<ILlmSchema, boolean>>;\n x: ILlmSchema.IArray;\n y: ILlmSchema.IArray;\n }): boolean => {\n if (\n !(\n p.x.minItems === undefined ||\n (p.y.minItems !== undefined && p.x.minItems <= p.y.minItems)\n )\n )\n return false;\n else if (\n !(\n p.x.maxItems === undefined ||\n (p.y.maxItems !== undefined && p.x.maxItems >= p.y.maxItems)\n )\n )\n return false;\n return coverStation({\n $defs: p.$defs,\n visited: p.visited,\n x: p.x.items,\n y: p.y.items,\n });\n };\n\n const coverObject = (p: {\n $defs?: Record<string, ILlmSchema> | undefined;\n visited: Map<ILlmSchema, Map<ILlmSchema, boolean>>;\n x: ILlmSchema.IObject;\n y: ILlmSchema.IObject;\n }): boolean => {\n if (!p.x.additionalProperties && !!p.y.additionalProperties) return false;\n else if (\n !!p.x.additionalProperties &&\n !!p.y.additionalProperties &&\n ((typeof p.x.additionalProperties === \"object\" &&\n p.y.additionalProperties === true) ||\n (typeof p.x.additionalProperties === \"object\" &&\n typeof p.y.additionalProperties === \"object\" &&\n !coverStation({\n $defs: p.$defs,\n visited: p.visited,\n x: p.x.additionalProperties,\n y: p.y.additionalProperties,\n })))\n )\n return false;\n return Object.entries(p.y.properties ?? {}).every(([key, b]) => {\n const a: ILlmSchema | undefined = p.x.properties?.[key];\n if (a === undefined) return false;\n else if (\n (p.x.required?.includes(key) ?? false) === true &&\n (p.y.required?.includes(key) ?? false) === false\n )\n return false;\n return coverStation({\n $defs: p.$defs,\n visited: p.visited,\n x: a,\n y: b,\n });\n });\n };\n\n const coverBoolean = (\n x: ILlmSchema.IBoolean,\n y: ILlmSchema.IBoolean,\n ): boolean => {\n if (!!x.enum?.length)\n return !!y.enum?.length && y.enum.every((v) => x.enum!.includes(v));\n return true;\n };\n\n const coverInteger = (\n x: ILlmSchema.IInteger,\n y: ILlmSchema.IInteger,\n ): boolean => {\n if (!!x.enum?.length)\n return !!y.enum?.length && y.enum.every((v) => x.enum!.includes(v));\n return OpenApiTypeCheckerBase.coverInteger(x, y);\n };\n\n const coverNumber = (\n x: ILlmSchema.INumber,\n y: ILlmSchema.IInteger | ILlmSchema.INumber,\n ): boolean => {\n if (!!x.enum?.length)\n return !!y.enum?.length && y.enum.every((v) => x.enum!.includes(v));\n return OpenApiTypeCheckerBase.coverNumber(x, y);\n };\n\n const coverString = (\n x: ILlmSchema.IString,\n y: ILlmSchema.IString,\n ): boolean => {\n if (!!x.enum?.length)\n return !!y.enum?.length && y.enum.every((v) => x.enum!.includes(v));\n return OpenApiTypeCheckerBase.coverString(x, y);\n };\n\n const flatSchema = (\n $defs: Record<string, ILlmSchema> | undefined,\n schema: ILlmSchema,\n ): ILlmSchema[] => {\n schema = escapeReference($defs, schema);\n if (isAnyOf(schema))\n return schema.anyOf.map((v) => flatSchema($defs, v)).flat();\n return [schema];\n };\n\n const escapeReference = (\n $defs: Record<string, ILlmSchema> | undefined,\n schema: ILlmSchema,\n ): Exclude<ILlmSchema, ILlmSchema.IReference> =>\n isReference(schema)\n ? escapeReference($defs, $defs![schema.$ref.replace(\"#/$defs/\", \"\")]!)\n : schema;\n}\n"],"names":["LlmTypeChecker","isNull","schema","type","isUnknown","undefined","isAnyOf","isReference","isBoolean","isInteger","isNumber","isString","isArray","items","isObject","$ref","anyOf","visit","props","already","Set","refAccessor","next","accessor","closure","key","split","pop","has","add","found","$defs","forEach","s","i","value","Object","entries","properties","JSON","stringify","additionalProperties","covers","coverStation","x","y","visited","Map","p","cache","get","nested","MapUtil","take","set","result","coverSchema","alpha","flatSchema","beta","some","every","b","a","coverEscapedSchema","coverBoolean","coverInteger","coverNumber","coverString","coverArray","coverObject","minItems","maxItems","required","includes","enum","length","v","OpenApiTypeCheckerBase","escapeReference","map","flat","replace"],"mappings":"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"}