@samchon/openapi
Version:
OpenAPI definitions and converters for 'typia' and 'nestia'.
1 lines • 16.7 kB
Source Map (JSON)
{"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 /** @internal */\n export const IS_DEFS = false;\n\n export const DEFAULT_CONFIG: ILlmSchemaV3.IConfig = {\n recursive: 3,\n constraint: true,\n };\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 equals?: boolean;\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 equals: props.equals,\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","DEFAULT_CONFIG","recursive","constraint","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","config","downgraded","OpenApiV3Downgrader","downgradeSchema","original","LlmTypeCheckerV3","isOneOf","discriminator","isObject","properties","required","isInteger","isNumber","OpenApiConstraintShifter","shiftNumeric","isString","shiftString","isArray","shiftArray","separateParameters","llm","human","separateObject","predicate","type","OpenApiValidator","create","invert","equals","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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"}