@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 • 42.8 kB
Source Map (JSON)
{"version":3,"file":"LlmSchemaComposer.mjs","sources":["../../src/composers/LlmSchemaComposer.ts"],"sourcesContent":["import { OpenApi } from \"../OpenApi\";\nimport { IJsonSchemaAttribute } from \"../structures/IJsonSchemaAttribute\";\nimport { ILlmFunction } from \"../structures/ILlmFunction\";\nimport { ILlmSchema } from \"../structures/ILlmSchema\";\nimport { IOpenApiSchemaError } from \"../structures/IOpenApiSchemaError\";\nimport { IResult } from \"../structures/IResult\";\nimport { LlmTypeChecker } from \"../utils/LlmTypeChecker\";\nimport { NamingConvention } from \"../utils/NamingConvention\";\nimport { OpenApiConstraintShifter } from \"../utils/OpenApiConstraintShifter\";\nimport { OpenApiTypeChecker } from \"../utils/OpenApiTypeChecker\";\nimport { OpenApiValidator } from \"../utils/OpenApiValidator\";\nimport { JsonDescriptionUtil } from \"../utils/internal/JsonDescriptionUtil\";\nimport { LlmDescriptionInverter } from \"./LlmDescriptionInverter\";\nimport { LlmParametersFinder } from \"./LlmParametersComposer\";\n\nexport namespace LlmSchemaComposer {\n /* -----------------------------------------------------------\n CONVERTERS\n ----------------------------------------------------------- */\n export const parameters = (props: {\n config?: Partial<ILlmSchema.IConfig>;\n components: OpenApi.IComponents;\n schema: OpenApi.IJsonSchema.IObject | OpenApi.IJsonSchema.IReference;\n accessor?: string;\n refAccessor?: string;\n }): IResult<ILlmSchema.IParameters, IOpenApiSchemaError> => {\n const config: ILlmSchema.IConfig = getConfig(props.config);\n const entity: IResult<OpenApi.IJsonSchema.IObject, IOpenApiSchemaError> =\n LlmParametersFinder.parameters({\n ...props,\n method: \"LlmSchemaComposer.parameters\",\n });\n if (entity.success === false) return entity;\n\n const $defs: Record<string, ILlmSchema> = {};\n const result: IResult<ILlmSchema, IOpenApiSchemaError> = transform({\n ...props,\n config,\n $defs,\n schema: entity.value,\n });\n if (result.success === false) return result;\n return {\n success: true,\n value: {\n ...(result.value as ILlmSchema.IObject),\n additionalProperties: false,\n $defs,\n description: OpenApiTypeChecker.isReference(props.schema)\n ? JsonDescriptionUtil.cascade({\n prefix: \"#/components/schemas/\",\n components: props.components,\n schema: {\n ...props.schema,\n description: result.value.description,\n },\n escape: true,\n })\n : result.value.description,\n } satisfies ILlmSchema.IParameters,\n };\n };\n\n export const schema = (props: {\n config?: Partial<ILlmSchema.IConfig>;\n components: OpenApi.IComponents;\n $defs: Record<string, ILlmSchema>;\n schema: OpenApi.IJsonSchema;\n accessor?: string;\n refAccessor?: string;\n }): IResult<ILlmSchema, IOpenApiSchemaError> =>\n transform({\n config: getConfig(props.config),\n components: props.components,\n $defs: props.$defs,\n schema: props.schema,\n accessor: props.accessor,\n refAccessor: props.refAccessor,\n });\n\n const transform = (props: {\n config: ILlmSchema.IConfig;\n components: OpenApi.IComponents;\n $defs: Record<string, ILlmSchema>;\n schema: OpenApi.IJsonSchema;\n accessor?: string;\n refAccessor?: string;\n }): IResult<ILlmSchema, IOpenApiSchemaError> => {\n // PREPARE ASSETS\n const union: Array<ILlmSchema> = [];\n const attribute: IJsonSchemaAttribute = {\n title: props.schema.title,\n description: props.schema.description,\n deprecated: props.schema.deprecated,\n readOnly: props.schema.readOnly,\n writeOnly: props.schema.writeOnly,\n example: props.schema.example,\n examples: props.schema.examples,\n ...Object.fromEntries(\n Object.entries(props.schema).filter(\n ([key, value]) => key.startsWith(\"x-\") && value !== undefined,\n ),\n ),\n };\n\n // VALIDADTE SCHEMA\n const reasons: IOpenApiSchemaError.IReason[] = [];\n OpenApiTypeChecker.visit({\n closure: (next, accessor) => {\n if (props.config.strict === true) {\n // STRICT MODE VALIDATION\n reasons.push(...validateStrict(next, accessor));\n }\n if (OpenApiTypeChecker.isTuple(next))\n reasons.push({\n accessor,\n schema: next,\n message: `LLM does not allow tuple type.`,\n });\n else if (OpenApiTypeChecker.isReference(next)) {\n // UNABLE TO FIND MATCHED REFERENCE\n const key: string = next.$ref.split(\"#/components/schemas/\")[1];\n if (props.components.schemas?.[key] === undefined)\n reasons.push({\n schema: next,\n accessor: accessor,\n message: `unable to find reference type ${JSON.stringify(key)}.`,\n });\n }\n },\n components: props.components,\n schema: props.schema,\n accessor: props.accessor,\n refAccessor: props.refAccessor,\n });\n if (reasons.length > 0)\n return {\n success: false,\n error: {\n method: \"LlmSchemaComposer.schema\",\n message: \"Failed to compose LLM schema\",\n reasons,\n },\n };\n\n const visitConstant = (input: OpenApi.IJsonSchema): void => {\n const insert = (value: any): void => {\n const matched:\n | ILlmSchema.IString\n | ILlmSchema.INumber\n | ILlmSchema.IBoolean\n | undefined = union.find(\n (u) =>\n (u as (IJsonSchemaAttribute & { type: string }) | undefined)\n ?.type === typeof value,\n ) as ILlmSchema.IString | undefined;\n if (matched !== undefined) {\n matched.enum ??= [];\n matched.enum.push(value);\n } else\n union.push({\n type: typeof value as \"number\",\n enum: [value],\n });\n };\n if (OpenApiTypeChecker.isConstant(input)) insert(input.const);\n else if (OpenApiTypeChecker.isOneOf(input))\n input.oneOf.forEach(visitConstant);\n };\n const visit = (input: OpenApi.IJsonSchema, accessor: string): void => {\n if (OpenApiTypeChecker.isOneOf(input)) {\n // UNION TYPE\n input.oneOf.forEach((s, i) => visit(s, `${accessor}.oneOf[${i}]`));\n } else if (OpenApiTypeChecker.isReference(input)) {\n // REFERENCE TYPE\n const key: string = input.$ref.split(\"#/components/schemas/\")[1];\n const target: OpenApi.IJsonSchema | undefined =\n props.components.schemas?.[key];\n if (target === undefined) return;\n else if (\n // KEEP THE REFERENCE TYPE\n props.config.reference === true ||\n OpenApiTypeChecker.isRecursiveReference({\n components: props.components,\n schema: input,\n })\n ) {\n const out = () => {\n union.push({\n ...input,\n $ref: `#/$defs/${key}`,\n });\n };\n if (props.$defs[key] !== undefined) return out();\n\n props.$defs[key] = {};\n const converted: IResult<ILlmSchema, IOpenApiSchemaError> = transform(\n {\n config: props.config,\n components: props.components,\n $defs: props.$defs,\n schema: target,\n refAccessor: props.refAccessor,\n accessor: `${props.refAccessor ?? \"$def\"}[${JSON.stringify(key)}]`,\n },\n );\n if (converted.success === false) return; // UNREACHABLE\n props.$defs[key] = converted.value;\n return out();\n } else {\n // DISCARD THE REFERENCE TYPE\n const length: number = union.length;\n visit(target, accessor);\n visitConstant(target);\n if (length === union.length - 1)\n union[union.length - 1] = {\n ...union[union.length - 1]!,\n description: JsonDescriptionUtil.cascade({\n prefix: \"#/components/schemas/\",\n components: props.components,\n schema: input,\n escape: true,\n }),\n };\n else\n attribute.description = JsonDescriptionUtil.cascade({\n prefix: \"#/components/schemas/\",\n components: props.components,\n schema: input,\n escape: true,\n });\n }\n } else if (OpenApiTypeChecker.isObject(input)) {\n // OBJECT TYPE\n const properties: Record<string, ILlmSchema> = Object.fromEntries(\n Object.entries(input.properties ?? {})\n .map(([key, value]) => {\n const converted: IResult<ILlmSchema, IOpenApiSchemaError> =\n transform({\n config: props.config,\n components: props.components,\n $defs: props.$defs,\n schema: value,\n refAccessor: props.refAccessor,\n accessor: `${props.accessor ?? \"$input.schema\"}.properties[${JSON.stringify(key)}]`,\n });\n if (converted.success === false) {\n reasons.push(...converted.error.reasons);\n return [key, null];\n }\n return [key, converted.value];\n })\n .filter(([, value]) => value !== null),\n );\n if (Object.values(properties).some((v) => v === null)) return;\n\n const additionalProperties: ILlmSchema | boolean | undefined | null =\n (() => {\n if (\n typeof input.additionalProperties === \"object\" &&\n input.additionalProperties !== null\n ) {\n const converted: IResult<ILlmSchema, IOpenApiSchemaError> =\n transform({\n config: props.config,\n components: props.components,\n $defs: props.$defs,\n schema: input.additionalProperties,\n refAccessor: props.refAccessor,\n accessor: `${accessor}.additionalProperties`,\n });\n if (converted.success === false) {\n reasons.push(...converted.error.reasons);\n return null;\n }\n return converted.value;\n }\n return props.config.strict === true\n ? false\n : input.additionalProperties;\n })();\n if (additionalProperties === null) return;\n union.push({\n ...input,\n properties,\n additionalProperties,\n required: input.required ?? [],\n description:\n props.config.strict === true\n ? JsonDescriptionUtil.take(input)\n : input.description,\n });\n } else if (OpenApiTypeChecker.isArray(input)) {\n // ARRAY TYPE\n const items: IResult<ILlmSchema, IOpenApiSchemaError> = transform({\n config: props.config,\n components: props.components,\n $defs: props.$defs,\n schema: input.items,\n refAccessor: props.refAccessor,\n accessor: `${accessor}.items`,\n });\n if (items.success === false) {\n reasons.push(...items.error.reasons);\n return;\n }\n union.push(\n props.config.strict === true\n ? OpenApiConstraintShifter.shiftArray({\n ...input,\n items: items.value,\n })\n : {\n ...input,\n items: items.value,\n },\n );\n } else if (OpenApiTypeChecker.isString(input))\n union.push(\n props.config.strict === true\n ? OpenApiConstraintShifter.shiftString({ ...input })\n : input,\n );\n else if (\n OpenApiTypeChecker.isNumber(input) ||\n OpenApiTypeChecker.isInteger(input)\n )\n union.push(\n props.config.strict === true\n ? OpenApiConstraintShifter.shiftNumeric({ ...input })\n : input,\n );\n else if (OpenApiTypeChecker.isTuple(input))\n return; // UNREACHABLE\n else if (OpenApiTypeChecker.isConstant(input) === false)\n union.push({ ...input });\n };\n\n visitConstant(props.schema);\n visit(props.schema, props.accessor ?? \"$input.schema\");\n\n if (reasons.length > 0)\n return {\n success: false,\n error: {\n method: \"LlmSchemaComposer.schema\",\n message: \"Failed to compose LLM schema\",\n reasons,\n },\n };\n else if (union.length === 0)\n return {\n // unknown type\n success: true,\n value: {\n ...attribute,\n type: undefined,\n },\n };\n else if (union.length === 1)\n return {\n // single type\n success: true,\n value: {\n ...attribute,\n ...union[0],\n description:\n props.config.strict === true && LlmTypeChecker.isReference(union[0])\n ? undefined\n : (union[0].description ?? attribute.description),\n },\n };\n return {\n success: true,\n value: {\n ...attribute,\n anyOf: union.map((u) => ({\n ...u,\n description:\n props.config.strict === true && LlmTypeChecker.isReference(u)\n ? undefined\n : u.description,\n })),\n \"x-discriminator\":\n OpenApiTypeChecker.isOneOf(props.schema) &&\n props.schema.discriminator !== undefined &&\n props.schema.oneOf.length === union.length &&\n union.every(\n (e) => LlmTypeChecker.isReference(e) || LlmTypeChecker.isNull(e),\n )\n ? {\n propertyName: props.schema.discriminator.propertyName,\n mapping:\n props.schema.discriminator.mapping !== undefined\n ? Object.fromEntries(\n Object.entries(props.schema.discriminator.mapping).map(\n ([key, value]) => [\n key,\n `#/$defs/${value.split(\"/\").at(-1)}`,\n ],\n ),\n )\n : undefined,\n }\n : undefined,\n },\n };\n };\n\n /* -----------------------------------------------------------\n SEPARATORS\n ----------------------------------------------------------- */\n export const separate = (props: {\n parameters: ILlmSchema.IParameters;\n predicate: (schema: ILlmSchema) => boolean;\n convention?: (key: string, type: \"llm\" | \"human\") => string;\n equals?: boolean;\n }): ILlmFunction.ISeparated => {\n const convention =\n props.convention ??\n ((key, type) => `${key}.${NamingConvention.capitalize(type)}`);\n const [llm, human] = separateObject({\n predicate: props.predicate,\n convention,\n $defs: props.parameters.$defs,\n schema: props.parameters,\n });\n if (llm === null || human === null)\n return {\n llm: (llm as ILlmSchema.IParameters | null) ?? {\n type: \"object\",\n properties: {} as Record<string, ILlmSchema>,\n required: [],\n additionalProperties: false,\n $defs: {},\n },\n human: human as ILlmSchema.IParameters | null,\n };\n const output: ILlmFunction.ISeparated = {\n llm: {\n ...llm,\n $defs: Object.fromEntries(\n Object.entries(props.parameters.$defs).filter(([key]) =>\n key.endsWith(\".Llm\"),\n ),\n ),\n additionalProperties: false,\n },\n human: {\n ...human,\n $defs: Object.fromEntries(\n Object.entries(props.parameters.$defs).filter(([key]) =>\n key.endsWith(\".Human\"),\n ),\n ),\n additionalProperties: false,\n },\n };\n for (const key of Object.keys(props.parameters.$defs))\n if (key.endsWith(\".Llm\") === false && key.endsWith(\".Human\") === false)\n delete props.parameters.$defs[key];\n if (Object.keys(output.llm.properties).length !== 0) {\n const components: OpenApi.IComponents = {};\n output.validate = OpenApiValidator.create({\n components,\n schema: invert({\n components,\n schema: output.llm,\n $defs: output.llm.$defs,\n }),\n required: true,\n equals: props.equals,\n });\n }\n return output;\n };\n\n const separateStation = (props: {\n predicate: (schema: ILlmSchema) => boolean;\n convention: (key: string, type: \"llm\" | \"human\") => string;\n $defs: Record<string, ILlmSchema>;\n schema: ILlmSchema;\n }): [ILlmSchema | null, ILlmSchema | null] => {\n if (props.predicate(props.schema) === true) return [null, props.schema];\n else if (\n LlmTypeChecker.isUnknown(props.schema) ||\n LlmTypeChecker.isAnyOf(props.schema)\n )\n return [props.schema, null];\n else if (LlmTypeChecker.isObject(props.schema))\n return separateObject({\n predicate: props.predicate,\n convention: props.convention,\n $defs: props.$defs,\n schema: props.schema,\n });\n else if (LlmTypeChecker.isArray(props.schema))\n return separateArray({\n predicate: props.predicate,\n convention: props.convention,\n $defs: props.$defs,\n schema: props.schema,\n });\n else if (LlmTypeChecker.isReference(props.schema))\n return separateReference({\n predicate: props.predicate,\n convention: props.convention,\n $defs: props.$defs,\n schema: props.schema,\n });\n return [props.schema, null];\n };\n\n const separateArray = (props: {\n predicate: (schema: ILlmSchema) => boolean;\n convention: (key: string, type: \"llm\" | \"human\") => string;\n $defs: Record<string, ILlmSchema>;\n schema: ILlmSchema.IArray;\n }): [ILlmSchema.IArray | null, ILlmSchema.IArray | null] => {\n const [x, y] = separateStation({\n predicate: props.predicate,\n convention: props.convention,\n $defs: props.$defs,\n schema: props.schema.items,\n });\n return [\n x !== null\n ? {\n ...props.schema,\n items: x,\n }\n : null,\n y !== null\n ? {\n ...props.schema,\n items: y,\n }\n : null,\n ];\n };\n\n const separateObject = (props: {\n $defs: Record<string, ILlmSchema>;\n predicate: (schema: ILlmSchema) => boolean;\n convention: (key: string, type: \"llm\" | \"human\") => string;\n schema: ILlmSchema.IObject;\n }): [ILlmSchema.IObject | null, ILlmSchema.IObject | null] => {\n // EMPTY OBJECT\n if (\n Object.keys(props.schema.properties ?? {}).length === 0 &&\n !!props.schema.additionalProperties === false\n )\n return [props.schema, null];\n\n const llm = {\n ...props.schema,\n properties: {} as Record<string, ILlmSchema>,\n additionalProperties: props.schema.additionalProperties,\n } satisfies ILlmSchema.IObject;\n const human = {\n ...props.schema,\n properties: {} as Record<string, ILlmSchema>,\n } satisfies ILlmSchema.IObject;\n\n for (const [key, value] of Object.entries(props.schema.properties ?? {})) {\n const [x, y] = separateStation({\n predicate: props.predicate,\n convention: props.convention,\n $defs: props.$defs,\n schema: value,\n });\n if (x !== null) llm.properties[key] = x;\n if (y !== null) human.properties[key] = y;\n }\n if (\n typeof props.schema.additionalProperties === \"object\" &&\n props.schema.additionalProperties !== null\n ) {\n const [dx, dy] = separateStation({\n predicate: props.predicate,\n convention: props.convention,\n $defs: props.$defs,\n schema: props.schema.additionalProperties,\n });\n llm.additionalProperties = dx ?? false;\n human.additionalProperties = dy ?? false;\n }\n return [\n !!Object.keys(llm.properties).length || !!llm.additionalProperties\n ? shrinkRequired(llm)\n : null,\n !!Object.keys(human.properties).length || human.additionalProperties\n ? shrinkRequired(human)\n : null,\n ];\n };\n\n const separateReference = (props: {\n predicate: (schema: ILlmSchema) => boolean;\n convention: (key: string, type: \"llm\" | \"human\") => string;\n $defs: Record<string, ILlmSchema>;\n schema: ILlmSchema.IReference;\n }): [ILlmSchema.IReference | null, ILlmSchema.IReference | null] => {\n const key: string = props.schema.$ref.split(\"#/$defs/\")[1];\n const humanKey: string = props.convention(key, \"human\");\n const llmKey: string = props.convention(key, \"llm\");\n\n // FIND EXISTING\n if (props.$defs?.[humanKey] || props.$defs?.[llmKey])\n return [\n props.$defs?.[llmKey]\n ? {\n ...props.schema,\n $ref: `#/$defs/${llmKey}`,\n }\n : null,\n props.$defs?.[humanKey]\n ? {\n ...props.schema,\n $ref: `#/$defs/${humanKey}`,\n }\n : null,\n ];\n\n // PRE-ASSIGNMENT\n props.$defs![llmKey] = {};\n props.$defs![humanKey] = {};\n\n // DO COMPOSE\n const schema: ILlmSchema = props.$defs?.[key]!;\n const [llm, human] = separateStation({\n predicate: props.predicate,\n convention: props.convention,\n $defs: props.$defs,\n schema,\n });\n if (llm !== null) Object.assign(props.$defs[llmKey], llm);\n if (human !== null) Object.assign(props.$defs[humanKey], human);\n\n // ONLY ONE\n if (llm === null || human === null) {\n delete props.$defs[llmKey];\n delete props.$defs[humanKey];\n return llm === null ? [null, props.schema] : [props.schema, null];\n }\n\n // BOTH OF THEM\n return [\n llm !== null\n ? {\n ...props.schema,\n $ref: `#/$defs/${llmKey}`,\n }\n : null,\n human !== null\n ? {\n ...props.schema,\n $ref: `#/$defs/${humanKey}`,\n }\n : null,\n ];\n };\n\n const shrinkRequired = (s: ILlmSchema.IObject): ILlmSchema.IObject => {\n s.required = s.required.filter((key) => s.properties?.[key] !== undefined);\n return s;\n };\n\n /* -----------------------------------------------------------\n INVERTERS\n ----------------------------------------------------------- */\n export const invert = (props: {\n components: OpenApi.IComponents;\n schema: ILlmSchema;\n $defs: Record<string, ILlmSchema>;\n }): OpenApi.IJsonSchema => {\n const union: OpenApi.IJsonSchema[] = [];\n const attribute: IJsonSchemaAttribute = {\n title: props.schema.title,\n description: props.schema.description,\n deprecated: props.schema.deprecated,\n readOnly: props.schema.readOnly,\n writeOnly: props.schema.writeOnly,\n example: props.schema.example,\n examples: props.schema.examples,\n ...Object.fromEntries(\n Object.entries(props.schema).filter(\n ([key, value]) => key.startsWith(\"x-\") && value !== undefined,\n ),\n ),\n };\n\n const next = (schema: ILlmSchema): OpenApi.IJsonSchema =>\n invert({\n components: props.components,\n $defs: props.$defs,\n schema,\n });\n const visit = (schema: ILlmSchema): void => {\n if (LlmTypeChecker.isArray(schema))\n union.push({\n ...schema,\n ...LlmDescriptionInverter.array(schema.description),\n items: next(schema.items),\n });\n else if (LlmTypeChecker.isObject(schema))\n union.push({\n ...schema,\n properties: Object.fromEntries(\n Object.entries(schema.properties).map(([key, value]) => [\n key,\n next(value),\n ]),\n ),\n additionalProperties:\n typeof schema.additionalProperties === \"object\" &&\n schema.additionalProperties !== null\n ? next(schema.additionalProperties)\n : schema.additionalProperties,\n });\n else if (LlmTypeChecker.isAnyOf(schema)) schema.anyOf.forEach(visit);\n else if (LlmTypeChecker.isReference(schema)) {\n const key: string = schema.$ref.split(\"#/$defs/\")[1];\n if (props.components.schemas?.[key] === undefined) {\n props.components.schemas ??= {};\n props.components.schemas[key] = {};\n props.components.schemas[key] = next(props.$defs[key] ?? {});\n }\n union.push({\n ...schema,\n $ref: `#/components/schemas/${key}`,\n });\n } else if (LlmTypeChecker.isBoolean(schema))\n if (!!schema.enum?.length)\n schema.enum.forEach((v) =>\n union.push({\n const: v,\n }),\n );\n else union.push(schema);\n else if (\n LlmTypeChecker.isInteger(schema) ||\n LlmTypeChecker.isNumber(schema)\n )\n if (!!schema.enum?.length)\n schema.enum.forEach((v) =>\n union.push({\n const: v,\n }),\n );\n else\n union.push({\n ...schema,\n ...LlmDescriptionInverter.numeric(schema.description),\n ...{ enum: undefined },\n });\n else if (LlmTypeChecker.isString(schema))\n if (!!schema.enum?.length)\n schema.enum.forEach((v) =>\n union.push({\n const: v,\n }),\n );\n else\n union.push({\n ...schema,\n ...LlmDescriptionInverter.string(schema.description),\n ...{ enum: undefined },\n });\n else\n union.push({\n ...schema,\n });\n };\n visit(props.schema);\n\n return {\n ...attribute,\n ...(union.length === 0\n ? { type: undefined }\n : union.length === 1\n ? { ...union[0] }\n : {\n oneOf: union.map((u) => ({ ...u, nullable: undefined })),\n discriminator:\n LlmTypeChecker.isAnyOf(props.schema) &&\n props.schema[\"x-discriminator\"] !== undefined\n ? {\n propertyName:\n props.schema[\"x-discriminator\"].propertyName,\n mapping:\n props.schema[\"x-discriminator\"].mapping !== undefined\n ? Object.fromEntries(\n Object.entries(\n props.schema[\"x-discriminator\"].mapping,\n ).map(([key, value]) => [\n key,\n `#/components/schemas/${value.split(\"/\").at(-1)}`,\n ]),\n )\n : undefined,\n }\n : undefined,\n }),\n } satisfies OpenApi.IJsonSchema;\n };\n\n export const getConfig = (\n config?: Partial<ILlmSchema.IConfig> | undefined,\n ): ILlmSchema.IConfig => ({\n reference: config?.reference ?? true,\n strict: config?.strict ?? false,\n });\n}\n\nconst validateStrict = (\n schema: OpenApi.IJsonSchema,\n accessor: string,\n): IOpenApiSchemaError.IReason[] => {\n const reasons: IOpenApiSchemaError.IReason[] = [];\n if (OpenApiTypeChecker.isObject(schema)) {\n if (!!schema.additionalProperties)\n reasons.push({\n schema: schema,\n accessor: `${accessor}.additionalProperties`,\n message:\n \"LLM does not allow additionalProperties in strict mode, the dynamic key typed object.\",\n });\n for (const key of Object.keys(schema.properties ?? {}))\n if (schema.required?.includes(key) === false)\n reasons.push({\n schema: schema,\n accessor: `${accessor}.properties.${key}`,\n message: \"LLM does not allow optional properties in strict mode.\",\n });\n }\n return reasons;\n};\n"],"names":["LlmSchemaComposer","parameters","props","config","getConfig","entity","LlmParametersFinder","method","success","$defs","result","transform","schema","value","additionalProperties","description","OpenApiTypeChecker","isReference","JsonDescriptionUtil","cascade","prefix","components","escape","accessor","refAccessor","union","attribute","title","deprecated","readOnly","writeOnly","example","examples","Object","fromEntries","entries","filter","key","startsWith","undefined","reasons","visit","closure","next","strict","push","validateStrict","isTuple","message","$ref","split","schemas","JSON","stringify","length","error","visitConstant","input","insert","matched","find","u","type","enum","isConstant","const","isOneOf","oneOf","forEach","s","i","target","reference","isRecursiveReference","out","converted","isObject","properties","map","values","some","v","required","take","isArray","items","OpenApiConstraintShifter","shiftArray","isString","shiftString","isNumber","isInteger","shiftNumeric","LlmTypeChecker","anyOf","discriminator","every","e","isNull","propertyName","mapping","at","separate","convention","NamingConvention","capitalize","llm","human","separateObject","predicate","output","endsWith","keys","validate","OpenApiValidator","create","invert","equals","separateStation","isUnknown","isAnyOf","separateArray","separateReference","x","y","dx","dy","shrinkRequired","humanKey","llmKey","assign","LlmDescriptionInverter","array","_a","isBoolean","numeric","string","nullable","includes"],"mappings":"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"}