@samchon/openapi
Version:
OpenAPI definitions and converters for 'typia' and 'nestia'.
1 lines • 9.58 kB
Source Map (JSON)
{"version":3,"file":"GeminiSchemaComposer.mjs","sources":["../../../src/composers/llm/GeminiSchemaComposer.ts"],"sourcesContent":["import { OpenApi } from \"../../OpenApi\";\nimport { OpenApiV3 } from \"../../OpenApiV3\";\nimport { OpenApiV3_1 } from \"../../OpenApiV3_1\";\nimport { IGeminiSchema } from \"../../structures/IGeminiSchema\";\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 { OpenApiTypeChecker } from \"../../utils/OpenApiTypeChecker\";\nimport { LlmParametersFinder } from \"./LlmParametersComposer\";\nimport { LlmSchemaV3Composer } from \"./LlmSchemaV3Composer\";\n\nexport namespace GeminiSchemaComposer {\n /**\n * @internal\n */\n export const IS_DEFS = false;\n\n export const parameters = (props: {\n config: IGeminiSchema.IConfig;\n components: OpenApi.IComponents;\n schema: OpenApi.IJsonSchema.IObject | OpenApi.IJsonSchema.IReference;\n accessor?: string;\n refAccessor?: string;\n }): IResult<IGeminiSchema.IParameters, IOpenApiSchemaError> => {\n const entity: IResult<OpenApi.IJsonSchema.IObject, IOpenApiSchemaError> =\n LlmParametersFinder.parameters({\n ...props,\n method: \"GeminiSchemaComposer.parameters\",\n });\n if (entity.success === false) return entity;\n return schema(props) as IResult<\n IGeminiSchema.IParameters,\n IOpenApiSchemaError\n >;\n };\n\n export const schema = (props: {\n config: IGeminiSchema.IConfig;\n components: OpenApi.IComponents;\n schema: OpenApi.IJsonSchema;\n accessor?: string;\n refAccessor?: string;\n }): IResult<IGeminiSchema, IOpenApiSchemaError> => {\n // TRANSFORM TO LLM SCHEMA OF V3.0\n const result: IResult<ILlmSchemaV3, IOpenApiSchemaError> =\n LlmSchemaV3Composer.schema({\n ...props,\n config: {\n recursive: props.config.recursive,\n constraint: false,\n },\n validate: (next, accessor): IOpenApiSchemaError.IReason[] => {\n if (OpenApiTypeChecker.isObject(next)) {\n if (!!next.additionalProperties)\n return [\n {\n schema: next,\n accessor: `${accessor}.additionalProperties`,\n message: \"Gemini does not allow additionalProperties.\",\n },\n ];\n } else if (\n OpenApiTypeChecker.isOneOf(next) &&\n isOneOf(props.components)(next)\n )\n return [\n {\n schema: next,\n accessor: accessor,\n message: \"Gemini does not allow union type.\",\n },\n ];\n return [];\n },\n });\n if (result.success === false) return result;\n\n // SPECIALIZATIONS\n LlmTypeCheckerV3.visit({\n schema: result.value,\n closure: (v) => {\n if (v.title !== undefined) {\n if (v.description === undefined) v.description = v.title;\n else {\n const title: string = v.title.endsWith(\".\")\n ? v.title.substring(0, v.title.length - 1)\n : v.title;\n v.description = v.description.startsWith(title)\n ? v.description\n : `${title}.\\n\\n${v.description}`;\n }\n delete v.title;\n }\n if (\n LlmTypeCheckerV3.isObject(v) &&\n v.additionalProperties !== undefined\n ) {\n delete (v as Partial<ILlmSchemaV3.IObject>).additionalProperties;\n }\n },\n });\n\n // DO NOT ALLOW UNION TYPE\n return result;\n };\n\n export const separateParameters = (props: {\n predicate: (schema: IGeminiSchema) => boolean;\n parameters: IGeminiSchema.IParameters;\n }): ILlmFunction.ISeparated<\"gemini\"> => {\n const separated: ILlmFunction.ISeparated<\"3.0\"> =\n LlmSchemaV3Composer.separateParameters(\n props as {\n predicate: (schema: ILlmSchemaV3) => boolean;\n parameters: ILlmSchemaV3.IParameters;\n },\n );\n return separated as any as ILlmFunction.ISeparated<\"gemini\">;\n };\n\n export const invert = (props: {\n schema: IGeminiSchema;\n }): OpenApi.IJsonSchema => LlmSchemaV3Composer.invert(props);\n}\n\nconst isOneOf =\n (components: OpenApi.IComponents) =>\n (schema: OpenApi.IJsonSchema): boolean => {\n const union: OpenApiV3_1.IJsonSchema[] = [];\n const already: Set<string> = new Set();\n const visit = (schema: OpenApi.IJsonSchema): void => {\n if (\n OpenApiTypeChecker.isBoolean(schema) ||\n OpenApiTypeChecker.isInteger(schema) ||\n OpenApiTypeChecker.isNumber(schema) ||\n OpenApiTypeChecker.isString(schema)\n )\n union.push({ ...schema });\n else if (\n OpenApiTypeChecker.isArray(schema) ||\n OpenApiTypeChecker.isTuple(schema) ||\n OpenApiTypeChecker.isObject(schema)\n )\n union.push(schema);\n else if (OpenApiTypeChecker.isOneOf(schema)) schema.oneOf.forEach(visit);\n else if (OpenApiTypeChecker.isReference(schema)) {\n if (already.has(schema.$ref)) union.push(schema);\n else {\n already.add(schema.$ref);\n const target: OpenApi.IJsonSchema | undefined =\n components.schemas?.[schema.$ref.split(\"/\").pop()!];\n if (target === undefined) union.push(schema);\n else visit(target);\n }\n }\n };\n const visitConstant = (schema: OpenApi.IJsonSchema): void => {\n const insert = (value: any): void => {\n const matched: OpenApiV3_1.IJsonSchema.INumber | undefined = union.find(\n (u) =>\n (u as OpenApiV3.IJsonSchema.__ISignificant<any>).type ===\n typeof value,\n ) as OpenApiV3.IJsonSchema.INumber | undefined;\n if (matched !== undefined) {\n matched.enum ??= [];\n matched.enum.push(value);\n } else union.push({ type: typeof value as \"number\", enum: [value] });\n };\n if (OpenApiTypeChecker.isConstant(schema)) insert(schema.const);\n else if (OpenApiTypeChecker.isOneOf(schema))\n for (const u of schema.oneOf)\n if (OpenApiTypeChecker.isConstant(u)) insert(u.const);\n };\n visit(schema);\n visitConstant(schema);\n return union.length > 1;\n };\n"],"names":["GeminiSchemaComposer","IS_DEFS","parameters","props","entity","LlmParametersFinder","method","success","schema","result","LlmSchemaV3Composer","config","recursive","constraint","validate","next","accessor","OpenApiTypeChecker","isObject","additionalProperties","message","isOneOf","components","LlmTypeCheckerV3","visit","value","closure","v","title","undefined","description","endsWith","substring","length","startsWith","separateParameters","separated","invert","union","already","Set","isBoolean","isInteger","isNumber","isString","push","isArray","isTuple","oneOf","forEach","isReference","has","$ref","add","target","schemas","split","pop","visitConstant","insert","matched","find","u","type","enum","isConstant","const"],"mappings":"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"}