{"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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"}