UNPKG

@samchon/openapi

Version:

OpenAPI definitions and converters for 'typia' and 'nestia'.

1 lines 33.6 kB
{"version":3,"file":"LlmSchemaV3_1Composer.mjs","sources":["../../../src/composers/llm/LlmSchemaV3_1Composer.ts"],"sourcesContent":["import { OpenApi } from \"../../OpenApi\";\nimport { ILlmFunction } from \"../../structures/ILlmFunction\";\nimport { ILlmSchemaV3_1 } from \"../../structures/ILlmSchemaV3_1\";\nimport { IOpenApiSchemaError } from \"../../structures/IOpenApiSchemaError\";\nimport { IResult } from \"../../structures/IResult\";\nimport { LlmTypeCheckerV3_1 } from \"../../utils/LlmTypeCheckerV3_1\";\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 LlmSchemaV3_1Composer {\n /**\n * @internal\n */\n export const IS_DEFS = true;\n\n /* -----------------------------------------------------------\n CONVERTERS\n ----------------------------------------------------------- */\n export const parameters = (props: {\n config: ILlmSchemaV3_1.IConfig;\n components: OpenApi.IComponents;\n schema: OpenApi.IJsonSchema.IObject | OpenApi.IJsonSchema.IReference;\n errors?: string[];\n /** @internal */\n validate?: (\n input: OpenApi.IJsonSchema,\n accessor: string,\n ) => IOpenApiSchemaError.IReason[];\n accessor?: string;\n refAccessor?: string;\n }): IResult<ILlmSchemaV3_1.IParameters, IOpenApiSchemaError> => {\n const entity: IResult<OpenApi.IJsonSchema.IObject, IOpenApiSchemaError> =\n LlmParametersFinder.parameters({\n ...props,\n method: \"LlmSchemaV3_1Composer.parameters\",\n });\n if (entity.success === false) return entity;\n\n const $defs: Record<string, ILlmSchemaV3_1> = {};\n const result: IResult<ILlmSchemaV3_1, IOpenApiSchemaError> = schema({\n ...props,\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 ILlmSchemaV3_1.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: props.schema,\n escape: true,\n })\n : result.value.description,\n } satisfies ILlmSchemaV3_1.IParameters,\n };\n };\n\n export const schema = (props: {\n config: ILlmSchemaV3_1.IConfig;\n components: OpenApi.IComponents;\n $defs: Record<string, ILlmSchemaV3_1>;\n schema: OpenApi.IJsonSchema;\n /** @internal */\n validate?: (\n input: OpenApi.IJsonSchema,\n accessor: string,\n ) => IOpenApiSchemaError.IReason[];\n accessor?: string;\n refAccessor?: string;\n }): IResult<ILlmSchemaV3_1, IOpenApiSchemaError> => {\n const union: Array<ILlmSchemaV3_1 | null> = [];\n const attribute: ILlmSchemaV3_1.__IAttribute = {\n title: props.schema.title,\n description: props.schema.description,\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 reasons: IOpenApiSchemaError.IReason[] = [];\n OpenApiTypeChecker.visit({\n closure: (next, accessor) => {\n if (props.validate) {\n // CUSTOM VALIDATION\n reasons.push(...props.validate(next, accessor));\n }\n if (OpenApiTypeChecker.isTuple(next))\n reasons.push({\n schema: next,\n accessor: accessor,\n message: `LLM does not allow tuple type.`,\n });\n else if (OpenApiTypeChecker.isReference(next)) {\n // UNABLE TO FIND MATCHED REFERENCE\n const key = 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: \"LlmSchemaV3_1Composer.schema\",\n message: \"Failed to compose LLM schema of v3.1\",\n reasons,\n },\n };\n\n const visit = (input: OpenApi.IJsonSchema, accessor: string): number => {\n if (OpenApiTypeChecker.isOneOf(input)) {\n // UNION TYPE\n input.oneOf.forEach((s, i) => visit(s, `${accessor}.oneOf[${i}]`));\n return 0;\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)\n return union.push(null); // UNREACHABLEE\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 if (props.$defs[key] !== undefined) return out();\n props.$defs[key] = {};\n const converted: IResult<ILlmSchemaV3_1, IOpenApiSchemaError> =\n schema({\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 if (converted.success === false) return union.push(null); // 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 if (length === union.length - 1 && union[union.length - 1] !== null)\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 return union.length;\n }\n } else if (OpenApiTypeChecker.isObject(input)) {\n // OBJECT TYPE\n const properties: Record<string, ILlmSchemaV3_1 | null> =\n Object.entries(input.properties ?? {}).reduce(\n (acc, [key, value]) => {\n const converted: IResult<ILlmSchemaV3_1, IOpenApiSchemaError> =\n schema({\n config: props.config,\n components: props.components,\n $defs: props.$defs,\n schema: value,\n refAccessor: props.refAccessor,\n accessor: `${accessor}.properties[${JSON.stringify(key)}]`,\n });\n acc[key] = converted.success ? converted.value : null;\n if (converted.success === false)\n reasons.push(...converted.error.reasons);\n return acc;\n },\n {} as Record<string, ILlmSchemaV3_1 | null>,\n );\n if (Object.values(properties).some((v) => v === null))\n return union.push(null);\n const additionalProperties:\n | ILlmSchemaV3_1\n | boolean\n | null\n | undefined = (() => {\n if (\n typeof input.additionalProperties === \"object\" &&\n input.additionalProperties !== null\n ) {\n const converted: IResult<ILlmSchemaV3_1, IOpenApiSchemaError> =\n schema({\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 input.additionalProperties;\n })();\n if (additionalProperties === null) return union.push(null);\n return union.push({\n ...input,\n properties: properties as Record<string, ILlmSchemaV3_1>,\n additionalProperties,\n required: input.required ?? [],\n });\n } else if (OpenApiTypeChecker.isArray(input)) {\n const items: IResult<ILlmSchemaV3_1, IOpenApiSchemaError> = schema({\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 union.push(null);\n }\n return union.push(\n (props.config.constraint\n ? (x: ILlmSchemaV3_1.IArray) => x\n : (x: ILlmSchemaV3_1.IArray) =>\n OpenApiConstraintShifter.shiftArray(x))({\n ...input,\n items: items.value,\n }),\n );\n } else if (OpenApiTypeChecker.isString(input))\n return union.push(\n (props.config.constraint\n ? (x: ILlmSchemaV3_1.IString) => x\n : (x: ILlmSchemaV3_1.IString) =>\n OpenApiConstraintShifter.shiftString(x))({\n ...input,\n }),\n );\n else if (\n OpenApiTypeChecker.isNumber(input) ||\n OpenApiTypeChecker.isInteger(input)\n )\n return union.push(\n (props.config.constraint\n ? (x: ILlmSchemaV3_1.INumber | ILlmSchemaV3_1.IInteger) => x\n : (x: ILlmSchemaV3_1.INumber | ILlmSchemaV3_1.IInteger) =>\n OpenApiConstraintShifter.shiftNumeric(x))({\n ...input,\n }),\n );\n else if (OpenApiTypeChecker.isTuple(input))\n return union.push(null); // UNREACHABLE\n else return union.push({ ...input });\n };\n visit(props.schema, props.accessor ?? \"$input.schema\");\n\n if (union.some((u) => u === null))\n return {\n success: false,\n error: {\n method: \"LlmSchemaV3_1Composer.schema\",\n message: \"Failed to compose LLM schema of v3.1\",\n reasons,\n },\n };\n else if (union.length === 0)\n return {\n success: true,\n value: {\n ...attribute,\n type: undefined,\n },\n };\n else if (union.length === 1)\n return {\n success: true,\n value: {\n ...attribute,\n ...union[0]!,\n },\n };\n return {\n success: true,\n value: {\n ...attribute,\n oneOf: union.filter((u) => u !== null),\n },\n };\n };\n\n /* -----------------------------------------------------------\n SEPARATORS\n ----------------------------------------------------------- */\n export const separateParameters = (props: {\n parameters: ILlmSchemaV3_1.IParameters;\n predicate: (schema: ILlmSchemaV3_1) => boolean;\n convention?: (key: string, type: \"llm\" | \"human\") => string;\n }): ILlmFunction.ISeparated<\"3.1\"> => {\n const convention =\n props.convention ??\n ((key, type) => `${key}.${NamingConvention.capitalize(type)}`);\n const [llm, human] = separateObject({\n $defs: props.parameters.$defs,\n schema: props.parameters,\n predicate: props.predicate,\n convention,\n });\n if (llm === null || human === null)\n return {\n llm: (llm as ILlmSchemaV3_1.IParameters | null) ?? {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n required: [],\n $defs: {},\n },\n human: human as ILlmSchemaV3_1.IParameters | null,\n };\n const output: ILlmFunction.ISeparated<\"3.1\"> = {\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 });\n }\n return output;\n };\n\n const separateStation = (props: {\n predicate: (schema: ILlmSchemaV3_1) => boolean;\n convention: (key: string, type: \"llm\" | \"human\") => string;\n $defs: Record<string, ILlmSchemaV3_1>;\n schema: ILlmSchemaV3_1;\n }): [ILlmSchemaV3_1 | null, ILlmSchemaV3_1 | null] => {\n if (props.predicate(props.schema) === true) return [null, props.schema];\n else if (\n LlmTypeCheckerV3_1.isUnknown(props.schema) ||\n LlmTypeCheckerV3_1.isOneOf(props.schema)\n )\n return [props.schema, null];\n else if (LlmTypeCheckerV3_1.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 (LlmTypeCheckerV3_1.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 (LlmTypeCheckerV3_1.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: ILlmSchemaV3_1) => boolean;\n convention: (key: string, type: \"llm\" | \"human\") => string;\n $defs: Record<string, ILlmSchemaV3_1>;\n schema: ILlmSchemaV3_1.IArray;\n }): [ILlmSchemaV3_1.IArray | null, ILlmSchemaV3_1.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 predicate: (schema: ILlmSchemaV3_1) => boolean;\n convention: (key: string, type: \"llm\" | \"human\") => string;\n $defs: Record<string, ILlmSchemaV3_1>;\n schema: ILlmSchemaV3_1.IObject;\n }): [ILlmSchemaV3_1.IObject | null, ILlmSchemaV3_1.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, ILlmSchemaV3_1>,\n additionalProperties: props.schema.additionalProperties,\n } satisfies ILlmSchemaV3_1.IObject;\n const human = {\n ...props.schema,\n properties: {} as Record<string, ILlmSchemaV3_1>,\n } satisfies ILlmSchemaV3_1.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: ILlmSchemaV3_1) => boolean;\n convention: (key: string, type: \"llm\" | \"human\") => string;\n $defs: Record<string, ILlmSchemaV3_1>;\n schema: ILlmSchemaV3_1.IReference;\n }): [ILlmSchemaV3_1.IReference | null, ILlmSchemaV3_1.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: ILlmSchemaV3_1 = props.$defs?.[key]!;\n const [llm, human] = separateStation({\n predicate: props.predicate,\n convention: props.convention,\n $defs: props.$defs,\n schema,\n });\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 = (\n s: ILlmSchemaV3_1.IObject,\n ): ILlmSchemaV3_1.IObject => {\n if (s.required !== undefined)\n s.required = s.required.filter(\n (key) => s.properties?.[key] !== undefined,\n );\n return s;\n };\n\n /* -----------------------------------------------------------\n INVERTERS\n ----------------------------------------------------------- */\n export const invert = (props: {\n components: OpenApi.IComponents;\n schema: ILlmSchemaV3_1;\n $defs: Record<string, ILlmSchemaV3_1>;\n }): OpenApi.IJsonSchema => {\n const next = (schema: ILlmSchemaV3_1): OpenApi.IJsonSchema =>\n invert({\n components: props.components,\n $defs: props.$defs,\n schema,\n });\n if (LlmTypeCheckerV3_1.isArray(props.schema))\n return {\n ...props.schema,\n ...LlmDescriptionInverter.array(props.schema.description),\n items: next(props.schema.items),\n };\n else if (LlmTypeCheckerV3_1.isObject(props.schema))\n return {\n ...props.schema,\n properties: props.schema.properties\n ? Object.fromEntries(\n Object.entries(props.schema.properties).map(([key, value]) => [\n key,\n next(value),\n ]),\n )\n : undefined,\n additionalProperties:\n typeof props.schema.additionalProperties === \"object\" &&\n props.schema.additionalProperties !== null\n ? next(props.schema.additionalProperties)\n : props.schema.additionalProperties,\n };\n else if (LlmTypeCheckerV3_1.isReference(props.schema)) {\n const key: string = props.schema.$ref.split(\"#/$defs/\").at(-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 return {\n ...props.schema,\n $ref: `#/components/schemas/${key}`,\n };\n } else if (\n LlmTypeCheckerV3_1.isInteger(props.schema) ||\n LlmTypeCheckerV3_1.isNumber(props.schema)\n )\n return {\n ...props.schema,\n ...LlmDescriptionInverter.numeric(props.schema.description),\n };\n else if (LlmTypeCheckerV3_1.isString(props.schema))\n return {\n ...props.schema,\n ...LlmDescriptionInverter.string(props.schema.description),\n };\n return props.schema;\n };\n}\n"],"names":["LlmSchemaV3_1Composer","IS_DEFS","parameters","props","entity","LlmParametersFinder","method","success","$defs","result","schema","value","additionalProperties","description","OpenApiTypeChecker","isReference","JsonDescriptionUtil","cascade","prefix","components","escape","union","attribute","title","example","examples","Object","fromEntries","entries","filter","key","startsWith","undefined","reasons","visit","closure","next","accessor","validate","push","isTuple","message","$ref","split","schemas","JSON","stringify","refAccessor","length","error","input","isOneOf","oneOf","forEach","s","i","target","config","reference","isRecursiveReference","out","converted","isObject","properties","reduce","acc","values","some","v","required","isArray","items","constraint","x","OpenApiConstraintShifter","shiftArray","isString","shiftString","isNumber","isInteger","shiftNumeric","u","type","separateParameters","convention","NamingConvention","capitalize","llm","human","separateObject","predicate","output","endsWith","keys","OpenApiValidator","create","invert","separateStation","LlmTypeCheckerV3_1","isUnknown","separateArray","separateReference","y","dx","dy","shrinkRequired","humanKey","llmKey","LlmDescriptionInverter","array","map","at","_a","numeric","string"],"mappings":"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"}