UNPKG

@samchon/openapi

Version:

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

451 lines (450 loc) 15.8 kB
import { IJsonSchemaAttribute } from "./IJsonSchemaAttribute"; /** * Type schema based on OpenAPI v3.1 for LLM function calling. * * `ILlmSchemaV3_1` is a type metadata for LLM (Large Language Model) * function calling, based on the OpenAPI v3.1 speicification. This type * is not the final type for the LLM function calling, but the intermediate * structure for the conversion to the final type of below: * * - {@link IChatGptSchema} * - {@link IClaudeSchema} * - {@link ILlamaSchema} * * However, the `ILlmSchemaV3_1` does not follow the entire specification of * the OpenAPI v3.1. It has own specific restrictions and definitions. Here is the * list of how `ILlmSchemaV3_1` is different with the OpenAPI v3.1 JSON schema. * * - Decompose mixed type: {@link OpenApiV3_1.IJsonSchema.IMixed} * - Resolve nullable property: {@link OpenApiV3_1.IJsonSchema.__ISignificant.nullable} * - Constant type is banned: {@link OpenApiV3_1.IJsonSchema.IConstant} * - Merge {@link OpenApiV3_1.IJsonSchema.IAnyOf} to {@link ILlmSchemaV3_1.IOneOf} * - Merge {@link OpenApiV3_1.IJsonSchema.IAllOf} to {@link ILlmSchemaV3_1.IObject} * - Merge {@link OpenApiV3_1.IJsonSchema.IRecursiveReference} to {@link ILlmSchemaV3_1.IReference} * - Do not support {@link OpenApiV3_1.IJsonSchema.ITuple} type * * If compare with the {@link OpenApi.IJsonSchema}, the emended JSON schema specification, * * - {@link ILlmSchemaV3_1.IParameters.$defs} instead of the {@link OpenApi.IJsonSchema.schemas} * - Do not support {@link OpenApi.IJsonSchema.ITuple} type * - {@link ILlmSchemaV3_1.properties} and {@link ILlmSchemaV3_1.required} are always defined * * For reference, if you've composed the `ILlmSchemaV3_1` type with the * {@link ILlmSchemaV3_1.IConfig.reference} `false` option (default is `false`), only the * recursived named types would be archived into the {@link ILlmSchemaV3_1.IParameters.$defs}, * and the others would be ecaped from the {@link ILlmSchemaV3_1.IReference} type. * * Also, if you've composed the `ILlmSchemaV3_1` type with the * {@link ILlmSchemaV3_1.IConfig.constraint} `false` option (default `false`), * the `ILlmSchemaV3_1` would not compose these properties. Instead, these * properties would be written on {@link ILlmSchemaV3_1.__IAttribute.descripotion} * field like `@format uuid` case. * * - {@link ILlmSchemaV3_1.INumber.minimum} * - {@link ILlmSchemaV3_1.INumber.maximum} * - {@link ILlmSchemaV3_1.INumber.multipleOf} * - {@link ILlmSchemaV3_1.IString.minLength} * - {@link ILlmSchemaV3_1.IString.maxLength} * - {@link ILlmSchemaV3_1.IString.format} * - {@link ILlmSchemaV3_1.IString.pattern} * - {@link ILlmSchemaV3_1.IString.contentMediaType} * - {@link ILlmSchemaV3_1.IArray.minItems} * - {@link ILlmSchemaV3_1.IArray.maxItems} * - {@link ILlmSchemaV3_1.IArray.unique} * * @reference https://platform.openai.com/docs/guides/function-calling * @reference https://platform.openai.com/docs/guides/structured-outputs * @author Jeongho Nam - https://github.com/samchon */ export type ILlmSchemaV3_1 = ILlmSchemaV3_1.IConstant | ILlmSchemaV3_1.IBoolean | ILlmSchemaV3_1.IInteger | ILlmSchemaV3_1.INumber | ILlmSchemaV3_1.IString | ILlmSchemaV3_1.IArray | ILlmSchemaV3_1.IObject | ILlmSchemaV3_1.IReference | ILlmSchemaV3_1.IOneOf | ILlmSchemaV3_1.INull | ILlmSchemaV3_1.IUnknown; export declare namespace ILlmSchemaV3_1 { /** * Configuration for OpenAPI v3.1 based LLM schema composition. */ interface IConfig { /** * Whether to allow constraint properties or not. * * If you configure this property to `false`, the schemas do not contain * the constraint properties of below. Instead, below properties would be * written to the {@link ILlmSchemaV3_1.__IAttribute.description} property * as a comment string like `"@format uuid"`. * * This is because some LLM schema model like {@link IChatGptSchema} * has banned such constraint, because their LLM cannot understand the * constraint properties and occur the hallucination. * * Therefore, considering your LLM model's performance, capability, * and the complexity of your parameter types, determine which is better, * to allow the constraint properties or not. * * - {@link ILlmSchemaV3_1.INumber.minimum} * - {@link ILlmSchemaV3_1.INumber.maximum} * - {@link ILlmSchemaV3_1.INumber.multipleOf} * - {@link ILlmSchemaV3_1.IString.minLength} * - {@link ILlmSchemaV3_1.IString.maxLength} * - {@link ILlmSchemaV3_1.IString.format} * - {@link ILlmSchemaV3_1.IString.pattern} * - {@link ILlmSchemaV3_1.IString.contentMediaType} * - {@link ILlmSchemaV3_1.IString.default} * - {@link ILlmSchemaV3_1.IArray.minItems} * - {@link ILlmSchemaV3_1.IArray.maxItems} * - {@link ILlmSchemaV3_1.IArray.unique} * * @default true */ constraint: boolean; /** * Whether to allow reference type in everywhere. * * If you configure this property to `false`, most of reference types * represented by {@link ILlmSchemaV3_1.IReference} would be escaped to * a plain type unless recursive type case. * * This is because some low sized LLM models does not understand the * reference type well, and even the large size LLM models sometimes occur * the hallucination. * * However, the reference type makes the schema size smaller, so that reduces * the LLM token cost. Therefore, if you're using the large size of LLM model, * and want to reduce the LLM token cost, you can configure this property to * `true`. * * @default false */ reference: boolean; } /** * Type of the function parameters. * * `ILlmSchemaV3_1.IParameters` is a type defining a function's parameters * as a keyworded object type. * * It also can be utilized for the structured output metadata. * * @reference https://platform.openai.com/docs/guides/structured-outputs */ interface IParameters extends Omit<IObject, "additionalProperties"> { /** * Collection of the named types. */ $defs: Record<string, ILlmSchemaV3_1>; /** * Additional properties' info. * * The `additionalProperties` means the type schema info of the additional * properties that are not listed in the {@link properties}. * * By the way, it is not allowed in the parameters level. */ additionalProperties: false; } /** * Constant value type. */ interface IConstant extends IJsonSchemaAttribute { /** * The constant value. */ const: boolean | number | string; } /** * Boolean type info. */ interface IBoolean extends IJsonSchemaAttribute.IBoolean { /** * The default value. */ default?: boolean; } /** * Integer type info. */ interface IInteger extends IJsonSchemaAttribute.IInteger { /** * Default value. * * @type int64 */ default?: number; /** * Minimum value restriction. * * @type int64 */ minimum?: number; /** * Maximum value restriction. * * @type int64 */ maximum?: number; /** * Exclusive minimum value restriction. */ exclusiveMinimum?: number; /** * Exclusive maximum value restriction. */ exclusiveMaximum?: number; /** * Multiple of value restriction. * * @type uint64 * @exclusiveMinimum 0 */ multipleOf?: number; } /** * Number (double) type info. */ interface INumber extends IJsonSchemaAttribute.INumber { /** * Default value. */ default?: number; /** * Minimum value restriction. */ minimum?: number; /** * Maximum value restriction. */ maximum?: number; /** * Exclusive minimum value restriction. */ exclusiveMinimum?: number; /** * Exclusive maximum value restriction. */ exclusiveMaximum?: number; /** * Multiple of value restriction. * * @exclusiveMinimum 0 */ multipleOf?: number; } /** * String type info. */ interface IString extends IJsonSchemaAttribute.IString { /** * Default value. */ default?: string; /** * Format restriction. */ format?: "binary" | "byte" | "password" | "regex" | "uuid" | "email" | "hostname" | "idn-email" | "idn-hostname" | "iri" | "iri-reference" | "ipv4" | "ipv6" | "uri" | "uri-reference" | "uri-template" | "url" | "date-time" | "date" | "time" | "duration" | "json-pointer" | "relative-json-pointer" | (string & {}); /** * Pattern restriction. */ pattern?: string; /** * Content media type restriction. */ contentMediaType?: string; /** * Minimum length restriction. * * @type uint64 */ minLength?: number; /** * Maximum length restriction. * * @type uint64 */ maxLength?: number; } /** * Array type info. */ interface IArray extends IJsonSchemaAttribute.IArray { /** * Items type info. * * The `items` means the type of the array elements. In other words, it is * the type schema info of the `T` in the TypeScript array type `Array<T>`. */ items: ILlmSchemaV3_1; /** * Unique items restriction. * * If this property value is `true`, target array must have unique items. */ uniqueItems?: boolean; /** * Minimum items restriction. * * Restriction of minimum number of items in the array. * * @type uint64 */ minItems?: number; /** * Maximum items restriction. * * Restriction of maximum number of items in the array. * * @type uint64 */ maxItems?: number; } /** * Object type info. */ interface IObject extends IJsonSchemaAttribute.IObject { /** * Properties of the object. * * The `properties` means a list of key-value pairs of the object's * regular properties. The key is the name of the regular property, * and the value is the type schema info. * * If you need additional properties that is represented by dynamic key, * you can use the {@link additionalProperties} instead. */ properties: Record<string, ILlmSchemaV3_1>; /** * Additional properties' info. * * The `additionalProperties` means the type schema info of the additional * properties that are not listed in the {@link properties}. * * If the value is `true`, it means that the additional properties are not * restricted. They can be any type. Otherwise, if the value is * {@link IOpenAiSchema} type, it means that the additional properties must * follow the type schema info. * * - `true`: `Record<string, any>` * - `IOpenAiSchema`: `Record<string, T>` */ additionalProperties?: boolean | ILlmSchemaV3_1; /** * List of key values of the required properties. * * The `required` means a list of the key values of the required * {@link properties}. If some property key is not listed in the `required` * list, it means that property is optional. Otherwise some property key * exists in the `required` list, it means that the property must be filled. * * Below is an example of the {@link properties} and `required`. * * ```typescript * interface SomeObject { * id: string; * email: string; * name?: string; * } * ``` * * As you can see, `id` and `email` {@link properties} are {@link required}, * so that they are listed in the `required` list. * * ```json * { * "type": "object", * "properties": { * "id": { "type": "string" }, * "email": { "type": "string" }, * "name": { "type": "string" } * }, * "required": ["id", "email"] * } * ``` */ required: string[]; } /** * Reference type directing named schema. */ interface IReference extends IJsonSchemaAttribute { /** * Reference to the named schema. * * The `ref` is a reference to the named schema. Format of the `$ref` is * following the JSON Pointer specification. In the OpenAPI, the `$ref` * starts with `#/$defs/` which means the type is stored in * the {@link ILlmSchemaV3_1.IParameters.$defs} object. * * - `#/$defs/SomeObject` * - `#/$defs/AnotherObject` */ $ref: string; } /** * Union type. * * IOneOf` represents an union type of the TypeScript (`A | B | C`). * * For reference, even though your Swagger (or OpenAPI) document has * defined `anyOf` instead of the `oneOf`, {@link OpenApi} forcibly * converts it to `oneOf` type. */ interface IOneOf extends IJsonSchemaAttribute { /** * List of the union types. */ oneOf: Exclude<ILlmSchemaV3_1, ILlmSchemaV3_1.IOneOf>[]; /** * Discriminator info of the union type. */ discriminator?: IOneOf.IDiscriminator; } namespace IOneOf { /** * Discriminator info of the union type. */ interface IDiscriminator { /** * Property name for the discriminator. */ propertyName: string; /** * Mapping of the discriminator value to the schema name. * * This property is valid only for {@link IReference} typed * {@link IOneOf.oneof} elements. Therefore, `key` of `mapping` is * the discriminator value, and `value` of `mapping` is the * schema name like `#/components/schemas/SomeObject`. */ mapping?: Record<string, string>; } } /** * Null type. */ interface INull extends IJsonSchemaAttribute.INull { /** * Default value. */ default?: null; } /** * Unknown, the `any` type. */ interface IUnknown extends IJsonSchemaAttribute.IUnknown { } /** * Significant attributes that can be applied to the most types. * * @deprecated * @hidden */ interface __ISignificant<Type extends string> extends __IAttribute { /** * Discriminator value of the type. */ type: Type; } /** * Common attributes that can be applied to all types. * * @deprecated * @hidden */ type __IAttribute = IJsonSchemaAttribute; }