UNPKG

@samchon/openapi

Version:

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

1 lines 16.4 kB
{"version":3,"file":"LlmSchemaV3Composer.mjs","sources":["../../../src/composers/llm/LlmSchemaV3Composer.ts"],"sourcesContent":["import { OpenApi } from \"../../OpenApi\";\nimport { OpenApiV3Downgrader } from \"../../converters/OpenApiV3Downgrader\";\nimport { OpenApiV3Upgrader } from \"../../converters/OpenApiV3Upgrader\";\nimport { ILlmFunction } from \"../../structures/ILlmFunction\";\nimport { ILlmSchemaV3 } from \"../../structures/ILlmSchemaV3\";\nimport { IOpenApiSchemaError } from \"../../structures/IOpenApiSchemaError\";\nimport { IResult } from \"../../structures/IResult\";\nimport { LlmTypeCheckerV3 } from \"../../utils/LlmTypeCheckerV3\";\nimport { OpenApiConstraintShifter } from \"../../utils/OpenApiConstraintShifter\";\nimport { OpenApiTypeChecker } from \"../../utils/OpenApiTypeChecker\";\nimport { OpenApiValidator } from \"../../utils/OpenApiValidator\";\nimport { LlmDescriptionInverter } from \"./LlmDescriptionInverter\";\nimport { LlmParametersFinder } from \"./LlmParametersComposer\";\n\nexport namespace LlmSchemaV3Composer {\n /**\n * @internal\n */\n export const IS_DEFS = false;\n\n /* -----------------------------------------------------------\n CONVERTERS\n ----------------------------------------------------------- */\n export const parameters = (props: {\n config: ILlmSchemaV3.IConfig;\n components: OpenApi.IComponents;\n schema: OpenApi.IJsonSchema.IObject | OpenApi.IJsonSchema.IReference;\n /** @internal */\n validate?: (\n schema: OpenApi.IJsonSchema,\n accessor: string,\n ) => IOpenApiSchemaError.IReason[];\n accessor?: string;\n refAccessor?: string;\n }): IResult<ILlmSchemaV3.IParameters, IOpenApiSchemaError> => {\n const entity: IResult<OpenApi.IJsonSchema.IObject, IOpenApiSchemaError> =\n LlmParametersFinder.parameters({\n ...props,\n method: \"LlmSchemaV3Composer.parameters\",\n });\n if (entity.success === false) return entity;\n\n const result: IResult<ILlmSchemaV3, IOpenApiSchemaError> = schema(props);\n if (result.success === false) return result;\n return {\n success: true,\n value: {\n ...(result.value as ILlmSchemaV3.IObject),\n additionalProperties: false,\n } satisfies ILlmSchemaV3.IParameters,\n };\n };\n\n export const schema = (props: {\n config: ILlmSchemaV3.IConfig;\n components: OpenApi.IComponents;\n schema: OpenApi.IJsonSchema;\n /** @internal */\n validate?: (\n schema: OpenApi.IJsonSchema,\n accessor: string,\n ) => IOpenApiSchemaError.IReason[];\n accessor?: string;\n refAccessor?: string;\n }): IResult<ILlmSchemaV3, IOpenApiSchemaError> => {\n // CHECK TUPLE TYPE\n const reasons: IOpenApiSchemaError.IReason[] = [];\n OpenApiTypeChecker.visit({\n closure: (next, accessor) => {\n if (props.validate) reasons.push(...props.validate(next, accessor));\n if (OpenApiTypeChecker.isTuple(next))\n reasons.push({\n accessor: 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 = next.$ref.split(\"#/components/schemas/\")[1];\n if (props.components.schemas?.[key] === undefined) {\n reasons.push({\n schema: next,\n message: `${accessor}: unable to find reference type ${JSON.stringify(key)}.`,\n accessor: accessor,\n });\n }\n }\n },\n components: props.components,\n schema: props.schema,\n accessor: props.accessor,\n refAccessor: props.refAccessor,\n });\n // if ((valid as boolean) === false) return null;\n if (reasons.length > 0)\n return {\n success: false,\n error: {\n method: \"LlmSchemaV3Composer.schema\",\n message: \"Failed to compose LLM schema of v3\",\n reasons,\n },\n };\n\n // CHECK MISMATCHES\n const escaped: IResult<OpenApi.IJsonSchema, IOpenApiSchemaError> =\n OpenApiTypeChecker.escape({\n ...props,\n recursive: props.config.recursive,\n });\n if (escaped.success === false)\n // UNREACHABLE\n return {\n success: false,\n error: {\n method: \"LlmSchemaV3Composer.schema\",\n message: \"Failed to compose LLM schema of v3\",\n reasons: escaped.error.reasons,\n },\n };\n\n // SPECIALIZATIONS\n const downgraded: ILlmSchemaV3 = OpenApiV3Downgrader.downgradeSchema({\n original: {\n schemas: {},\n },\n downgraded: {},\n })(escaped.value) as ILlmSchemaV3;\n LlmTypeCheckerV3.visit({\n closure: (next) => {\n if (\n LlmTypeCheckerV3.isOneOf(next) &&\n (next as any).discriminator !== undefined\n )\n delete (next as any).discriminator;\n else if (LlmTypeCheckerV3.isObject(next)) {\n next.properties ??= {};\n next.required ??= [];\n }\n if (props.config.constraint === false) {\n if (\n LlmTypeCheckerV3.isInteger(next) ||\n LlmTypeCheckerV3.isNumber(next)\n )\n OpenApiConstraintShifter.shiftNumeric(\n next as\n | OpenApi.IJsonSchema.IInteger\n | OpenApi.IJsonSchema.INumber,\n );\n else if (LlmTypeCheckerV3.isString(next))\n OpenApiConstraintShifter.shiftString(\n next as OpenApi.IJsonSchema.IString,\n );\n else if (LlmTypeCheckerV3.isArray(next))\n OpenApiConstraintShifter.shiftArray(\n next as OpenApi.IJsonSchema.IArray,\n );\n }\n },\n schema: downgraded,\n });\n return {\n success: true,\n value: downgraded,\n };\n };\n\n /* -----------------------------------------------------------\n SEPARATORS\n ----------------------------------------------------------- */\n export const separateParameters = (props: {\n predicate: (schema: ILlmSchemaV3) => boolean;\n parameters: ILlmSchemaV3.IParameters;\n }): ILlmFunction.ISeparated<\"3.0\"> => {\n const [llm, human] = separateObject({\n predicate: props.predicate,\n schema: props.parameters,\n });\n return {\n llm: (llm as ILlmSchemaV3.IParameters | null) ?? {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n required: [],\n },\n human: human as ILlmSchemaV3.IParameters | null,\n validate: llm\n ? OpenApiValidator.create({\n components: {},\n schema: invert({ schema: llm }),\n required: true,\n })\n : undefined,\n };\n };\n\n const separateStation = (props: {\n predicate: (schema: ILlmSchemaV3) => boolean;\n schema: ILlmSchemaV3;\n }): [ILlmSchemaV3 | null, ILlmSchemaV3 | null] => {\n if (props.predicate(props.schema) === true) return [null, props.schema];\n else if (\n LlmTypeCheckerV3.isUnknown(props.schema) ||\n LlmTypeCheckerV3.isOneOf(props.schema)\n )\n return [props.schema, null];\n else if (LlmTypeCheckerV3.isObject(props.schema))\n return separateObject({\n predicate: props.predicate,\n schema: props.schema,\n });\n else if (LlmTypeCheckerV3.isArray(props.schema))\n return separateArray({\n predicate: props.predicate,\n schema: props.schema,\n });\n return [props.schema, null];\n };\n\n const separateArray = (props: {\n predicate: (schema: ILlmSchemaV3) => boolean;\n schema: ILlmSchemaV3.IArray;\n }): [ILlmSchemaV3.IArray | null, ILlmSchemaV3.IArray | null] => {\n const [x, y] = separateStation({\n predicate: props.predicate,\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) => boolean;\n schema: ILlmSchemaV3.IObject;\n }): [ILlmSchemaV3.IObject | null, ILlmSchemaV3.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>,\n additionalProperties: props.schema.additionalProperties,\n } satisfies ILlmSchemaV3.IObject;\n const human = {\n ...props.schema,\n properties: {} as Record<string, ILlmSchemaV3>,\n additionalProperties: props.schema.additionalProperties,\n } satisfies ILlmSchemaV3.IObject;\n\n for (const [key, value] of Object.entries(props.schema.properties ?? {})) {\n const [x, y] = separateStation({\n predicate: props.predicate,\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 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 shrinkRequired = (s: ILlmSchemaV3.IObject): ILlmSchemaV3.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 schema: ILlmSchemaV3;\n }): OpenApi.IJsonSchema => {\n const upgraded: OpenApi.IJsonSchema = OpenApiV3Upgrader.convertSchema({})(\n props.schema,\n );\n OpenApiTypeChecker.visit({\n closure: (schema) => {\n if (OpenApiTypeChecker.isArray(schema))\n Object.assign(schema, {\n ...schema,\n ...LlmDescriptionInverter.array(schema.description),\n });\n else if (\n OpenApiTypeChecker.isInteger(schema) ||\n OpenApiTypeChecker.isNumber(schema)\n )\n Object.assign(schema, {\n ...schema,\n ...LlmDescriptionInverter.numeric(schema.description),\n });\n else if (OpenApiTypeChecker.isString(schema))\n Object.assign(schema, {\n ...schema,\n ...LlmDescriptionInverter.string(schema.description),\n });\n },\n components: {},\n schema: upgraded,\n });\n return upgraded;\n };\n}\n"],"names":["LlmSchemaV3Composer","IS_DEFS","parameters","props","entity","LlmParametersFinder","method","success","result","schema","value","additionalProperties","reasons","OpenApiTypeChecker","visit","closure","next","accessor","validate","push","isTuple","message","isReference","key","$ref","split","components","schemas","undefined","JSON","stringify","refAccessor","length","error","escaped","escape","recursive","config","downgraded","OpenApiV3Downgrader","downgradeSchema","original","LlmTypeCheckerV3","isOneOf","discriminator","isObject","properties","required","constraint","isInteger","isNumber","OpenApiConstraintShifter","shiftNumeric","isString","shiftString","isArray","shiftArray","separateParameters","llm","human","separateObject","predicate","type","OpenApiValidator","create","invert","separateStation","isUnknown","separateArray","x","y","items","Object","keys","entries","dx","dy","shrinkRequired","s","filter","upgraded","OpenApiV3Upgrader","convertSchema","assign","LlmDescriptionInverter","array","description","numeric","string"],"mappings":"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"}