{"version":3,"file":"ChatGptSchemaComposer.mjs","sources":["../../../src/composers/llm/ChatGptSchemaComposer.ts"],"sourcesContent":["import { OpenApi } from \"../../OpenApi\";\nimport { IChatGptSchema } from \"../../structures/IChatGptSchema\";\nimport { ILlmFunction } from \"../../structures/ILlmFunction\";\nimport { ILlmSchemaV3_1 } from \"../../structures/ILlmSchemaV3_1\";\nimport { IOpenApiSchemaError } from \"../../structures/IOpenApiSchemaError\";\nimport { IResult } from \"../../structures/IResult\";\nimport { ChatGptTypeChecker } from \"../../utils/ChatGptTypeChecker\";\nimport { LlmTypeCheckerV3_1 } from \"../../utils/LlmTypeCheckerV3_1\";\nimport { NamingConvention } from \"../../utils/NamingConvention\";\nimport { OpenApiTypeChecker } from \"../../utils/OpenApiTypeChecker\";\nimport { OpenApiValidator } from \"../../utils/OpenApiValidator\";\nimport { JsonDescriptionUtil } from \"../../utils/internal/JsonDescriptionUtil\";\nimport { LlmDescriptionInverter } from \"./LlmDescriptionInverter\";\nimport { LlmSchemaV3_1Composer } from \"./LlmSchemaV3_1Composer\";\n\nexport namespace ChatGptSchemaComposer {\n  /**\n   * @internal\n   */\n  export const IS_DEFS = true;\n\n  /* -----------------------------------------------------------\n    CONVERTERS\n  ----------------------------------------------------------- */\n  export const parameters = (props: {\n    config: IChatGptSchema.IConfig;\n    components: OpenApi.IComponents;\n    schema: OpenApi.IJsonSchema.IObject | OpenApi.IJsonSchema.IReference;\n    accessor?: string;\n    refAccessor?: string;\n  }): IResult<IChatGptSchema.IParameters, IOpenApiSchemaError> => {\n    // polyfill\n    props.config.strict ??= false;\n\n    // validate\n    const result: IResult<ILlmSchemaV3_1.IParameters, IOpenApiSchemaError> =\n      LlmSchemaV3_1Composer.parameters({\n        ...props,\n        config: {\n          reference: props.config.reference,\n          constraint: false,\n        },\n        validate: props.config.strict === true ? validateStrict : undefined,\n      });\n    if (result.success === false) return result;\n\n    // returns with transformation\n    for (const key of Object.keys(result.value.$defs))\n      result.value.$defs[key] = transform({\n        config: props.config,\n        schema: result.value.$defs[key],\n      });\n    return {\n      success: true,\n      value: transform({\n        config: props.config,\n        schema: result.value,\n      }) as IChatGptSchema.IParameters,\n    };\n  };\n\n  export const schema = (props: {\n    config: IChatGptSchema.IConfig;\n    components: OpenApi.IComponents;\n    $defs: Record<string, IChatGptSchema>;\n    schema: OpenApi.IJsonSchema;\n    accessor?: string;\n    refAccessor?: string;\n  }): IResult<IChatGptSchema, IOpenApiSchemaError> => {\n    // polyfill\n    props.config.strict ??= false;\n\n    // validate\n    const oldbie: Set<string> = new Set(Object.keys(props.$defs));\n    const result: IResult<ILlmSchemaV3_1, IOpenApiSchemaError> =\n      LlmSchemaV3_1Composer.schema({\n        ...props,\n        config: {\n          reference: props.config.reference,\n          constraint: false,\n        },\n        validate: props.config.strict === true ? validateStrict : undefined,\n      });\n    if (result.success === false) return result;\n\n    // returns with transformation\n    for (const key of Object.keys(props.$defs))\n      if (oldbie.has(key) === false)\n        props.$defs[key] = transform({\n          config: props.config,\n          schema: props.$defs[key],\n        });\n    return {\n      success: true,\n      value: transform({\n        config: props.config,\n        schema: result.value,\n      }),\n    };\n  };\n\n  const validateStrict = (\n    schema: OpenApi.IJsonSchema,\n    accessor: string,\n  ): IOpenApiSchemaError.IReason[] => {\n    const reasons: IOpenApiSchemaError.IReason[] = [];\n    if (OpenApiTypeChecker.isObject(schema)) {\n      if (!!schema.additionalProperties)\n        reasons.push({\n          schema: schema,\n          accessor: `${accessor}.additionalProperties`,\n          message:\n            \"ChatGPT does not allow additionalProperties in strict mode, the dynamic key typed object.\",\n        });\n      for (const key of Object.keys(schema.properties ?? {}))\n        if (schema.required?.includes(key) === false)\n          reasons.push({\n            schema: schema,\n            accessor: `${accessor}.properties.${key}`,\n            message:\n              \"ChatGPT does not allow optional properties in strict mode.\",\n          });\n    }\n    return reasons;\n  };\n\n  const transform = (props: {\n    config: IChatGptSchema.IConfig;\n    schema: ILlmSchemaV3_1;\n  }): IChatGptSchema => {\n    const union: Array<IChatGptSchema> = [];\n    const attribute: IChatGptSchema.__IAttribute = {\n      title: props.schema.title,\n      description: props.schema.description,\n      example: props.schema.example,\n      examples: props.schema.examples,\n      ...Object.fromEntries(\n        Object.entries(schema).filter(\n          ([key, value]) => key.startsWith(\"x-\") && value !== undefined,\n        ),\n      ),\n    };\n    const visit = (input: ILlmSchemaV3_1): void => {\n      if (LlmTypeCheckerV3_1.isOneOf(input)) input.oneOf.forEach(visit);\n      else if (LlmTypeCheckerV3_1.isArray(input))\n        union.push({\n          ...input,\n          items: transform({\n            config: props.config,\n            schema: input.items,\n          }),\n        });\n      else if (LlmTypeCheckerV3_1.isObject(input))\n        union.push({\n          ...input,\n          properties: Object.fromEntries(\n            Object.entries(input.properties).map(([key, value]) => [\n              key,\n              transform({\n                config: props.config,\n                schema: value,\n              }),\n            ]),\n          ),\n          additionalProperties:\n            props.config.strict === true\n              ? false\n              : typeof input.additionalProperties === \"object\" &&\n                  input.additionalProperties !== null\n                ? transform({\n                    config: props.config,\n                    schema: input.additionalProperties,\n                  })\n                : input.additionalProperties,\n          description: JsonDescriptionUtil.take(input),\n        });\n      else if (LlmTypeCheckerV3_1.isConstant(input) === false)\n        union.push(input);\n    };\n    const visitConstant = (input: ILlmSchemaV3_1): void => {\n      const insert = (value: any): void => {\n        const matched: IChatGptSchema.IString | undefined = union.find(\n          (u) =>\n            (u as IChatGptSchema.__ISignificant<any> | undefined)?.type ===\n            typeof value,\n        ) as IChatGptSchema.IString | undefined;\n        if (matched !== undefined) {\n          matched.enum ??= [];\n          matched.enum.push(value);\n        } else\n          union.push({\n            type: typeof value as \"number\",\n            enum: [value],\n          });\n      };\n      if (OpenApiTypeChecker.isConstant(input)) insert(input.const);\n      else if (OpenApiTypeChecker.isOneOf(input))\n        input.oneOf.forEach((s) => visitConstant(s as ILlmSchemaV3_1));\n    };\n    visit(props.schema);\n    visitConstant(props.schema);\n    if (union.length === 0)\n      return {\n        ...attribute,\n        type: undefined,\n      };\n    else if (union.length === 1)\n      return {\n        ...attribute,\n        ...union[0],\n        description: ChatGptTypeChecker.isReference(union[0]!)\n          ? undefined\n          : (union[0].description ?? attribute.description),\n      };\n    return {\n      ...attribute,\n      anyOf: union.map((u) => ({\n        ...u,\n        description: ChatGptTypeChecker.isReference(u)\n          ? undefined\n          : u.description,\n      })),\n    };\n  };\n\n  /* -----------------------------------------------------------\n    SEPARATORS\n  ----------------------------------------------------------- */\n  export const separateParameters = (props: {\n    parameters: IChatGptSchema.IParameters;\n    predicate: (schema: IChatGptSchema) => boolean;\n    convention?: (key: string, type: \"llm\" | \"human\") => string;\n  }): ILlmFunction.ISeparated<\"chatgpt\"> => {\n    const convention =\n      props.convention ??\n      ((key, type) => `${key}.${NamingConvention.capitalize(type)}`);\n    const [llm, human] = separateObject({\n      predicate: props.predicate,\n      convention,\n      $defs: props.parameters.$defs,\n      schema: props.parameters,\n    });\n    if (llm === null || human === null)\n      return {\n        llm: (llm as IChatGptSchema.IParameters | null) ?? {\n          type: \"object\",\n          properties: {} as Record<string, IChatGptSchema>,\n          required: [],\n          additionalProperties: false,\n          $defs: {},\n        },\n        human: human as IChatGptSchema.IParameters | null,\n      };\n    const output: ILlmFunction.ISeparated<\"chatgpt\"> = {\n      llm: {\n        ...llm,\n        $defs: Object.fromEntries(\n          Object.entries(props.parameters.$defs).filter(([key]) =>\n            key.endsWith(\".Llm\"),\n          ),\n        ),\n        additionalProperties: false,\n      },\n      human: {\n        ...human,\n        $defs: Object.fromEntries(\n          Object.entries(props.parameters.$defs).filter(([key]) =>\n            key.endsWith(\".Human\"),\n          ),\n        ),\n        additionalProperties: false,\n      },\n    };\n    for (const key of Object.keys(props.parameters.$defs))\n      if (key.endsWith(\".Llm\") === false && key.endsWith(\".Human\") === false)\n        delete props.parameters.$defs[key];\n    if (Object.keys(output.llm.properties).length !== 0) {\n      const components: OpenApi.IComponents = {};\n      output.validate = OpenApiValidator.create({\n        components,\n        schema: invert({\n          components,\n          schema: output.llm,\n          $defs: output.llm.$defs,\n        }),\n        required: true,\n      });\n    }\n    return output;\n  };\n\n  const separateStation = (props: {\n    predicate: (schema: IChatGptSchema) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    $defs: Record<string, IChatGptSchema>;\n    schema: IChatGptSchema;\n  }): [IChatGptSchema | null, IChatGptSchema | null] => {\n    if (props.predicate(props.schema) === true) return [null, props.schema];\n    else if (\n      ChatGptTypeChecker.isUnknown(props.schema) ||\n      ChatGptTypeChecker.isAnyOf(props.schema)\n    )\n      return [props.schema, null];\n    else if (ChatGptTypeChecker.isObject(props.schema))\n      return separateObject({\n        predicate: props.predicate,\n        convention: props.convention,\n        $defs: props.$defs,\n        schema: props.schema,\n      });\n    else if (ChatGptTypeChecker.isArray(props.schema))\n      return separateArray({\n        predicate: props.predicate,\n        convention: props.convention,\n        $defs: props.$defs,\n        schema: props.schema,\n      });\n    else if (ChatGptTypeChecker.isReference(props.schema))\n      return separateReference({\n        predicate: props.predicate,\n        convention: props.convention,\n        $defs: props.$defs,\n        schema: props.schema,\n      });\n    return [props.schema, null];\n  };\n\n  const separateArray = (props: {\n    predicate: (schema: IChatGptSchema) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    $defs: Record<string, IChatGptSchema>;\n    schema: IChatGptSchema.IArray;\n  }): [IChatGptSchema.IArray | null, IChatGptSchema.IArray | null] => {\n    const [x, y] = separateStation({\n      predicate: props.predicate,\n      convention: props.convention,\n      $defs: props.$defs,\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    $defs: Record<string, IChatGptSchema>;\n    predicate: (schema: IChatGptSchema) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    schema: IChatGptSchema.IObject;\n  }): [IChatGptSchema.IObject | null, IChatGptSchema.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, IChatGptSchema>,\n      additionalProperties: props.schema.additionalProperties,\n    } satisfies IChatGptSchema.IObject;\n    const human = {\n      ...props.schema,\n      properties: {} as Record<string, IChatGptSchema>,\n    } satisfies IChatGptSchema.IObject;\n\n    for (const [key, value] of Object.entries(props.schema.properties ?? {})) {\n      const [x, y] = separateStation({\n        predicate: props.predicate,\n        convention: props.convention,\n        $defs: props.$defs,\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        convention: props.convention,\n        $defs: props.$defs,\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 separateReference = (props: {\n    predicate: (schema: IChatGptSchema) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    $defs: Record<string, IChatGptSchema>;\n    schema: IChatGptSchema.IReference;\n  }): [IChatGptSchema.IReference | null, IChatGptSchema.IReference | null] => {\n    const key: string = props.schema.$ref.split(\"#/$defs/\")[1];\n    const humanKey: string = props.convention(key, \"human\");\n    const llmKey: string = props.convention(key, \"llm\");\n\n    // FIND EXISTING\n    if (props.$defs?.[humanKey] || props.$defs?.[llmKey])\n      return [\n        props.$defs?.[llmKey]\n          ? {\n              ...props.schema,\n              $ref: `#/$defs/${llmKey}`,\n            }\n          : null,\n        props.$defs?.[humanKey]\n          ? {\n              ...props.schema,\n              $ref: `#/$defs/${humanKey}`,\n            }\n          : null,\n      ];\n\n    // PRE-ASSIGNMENT\n    props.$defs![llmKey] = {};\n    props.$defs![humanKey] = {};\n\n    // DO COMPOSE\n    const schema: IChatGptSchema = props.$defs?.[key]!;\n    const [llm, human] = separateStation({\n      predicate: props.predicate,\n      convention: props.convention,\n      $defs: props.$defs,\n      schema,\n    });\n\n    // ONLY ONE\n    if (llm === null || human === null) {\n      delete props.$defs[llmKey];\n      delete props.$defs[humanKey];\n      return llm === null ? [null, props.schema] : [props.schema, null];\n    }\n\n    // BOTH OF THEM\n    return [\n      llm !== null\n        ? {\n            ...props.schema,\n            $ref: `#/$defs/${llmKey}`,\n          }\n        : null,\n      human !== null\n        ? {\n            ...props.schema,\n            $ref: `#/$defs/${humanKey}`,\n          }\n        : null,\n    ];\n  };\n\n  const shrinkRequired = (\n    s: IChatGptSchema.IObject,\n  ): IChatGptSchema.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    components: OpenApi.IComponents;\n    schema: IChatGptSchema;\n    $defs: Record<string, IChatGptSchema>;\n  }): OpenApi.IJsonSchema => {\n    const union: OpenApi.IJsonSchema[] = [];\n    const attribute: OpenApi.IJsonSchema.__IAttribute = {\n      title: props.schema.title,\n      description: props.schema.description,\n      ...Object.fromEntries(\n        Object.entries(props.schema).filter(\n          ([key, value]) => key.startsWith(\"x-\") && value !== undefined,\n        ),\n      ),\n      example: props.schema.example,\n      examples: props.schema.examples,\n    };\n\n    const next = (schema: IChatGptSchema): OpenApi.IJsonSchema =>\n      invert({\n        components: props.components,\n        $defs: props.$defs,\n        schema,\n      });\n    const visit = (schema: IChatGptSchema): void => {\n      if (ChatGptTypeChecker.isArray(schema))\n        union.push({\n          ...schema,\n          ...LlmDescriptionInverter.array(schema.description),\n          items: next(schema.items),\n        });\n      else if (ChatGptTypeChecker.isObject(schema))\n        union.push({\n          ...schema,\n          properties: Object.fromEntries(\n            Object.entries(schema.properties).map(([key, value]) => [\n              key,\n              next(value),\n            ]),\n          ),\n          additionalProperties:\n            typeof schema.additionalProperties === \"object\" &&\n            schema.additionalProperties !== null\n              ? next(schema.additionalProperties)\n              : schema.additionalProperties,\n        });\n      else if (ChatGptTypeChecker.isAnyOf(schema)) schema.anyOf.forEach(visit);\n      else if (ChatGptTypeChecker.isReference(schema)) {\n        const key: string = schema.$ref.split(\"#/$defs/\")[1];\n        if (props.components.schemas?.[key] === undefined) {\n          props.components.schemas ??= {};\n          props.components.schemas[key] = {};\n          props.components.schemas[key] = next(props.$defs[key] ?? {});\n        }\n        union.push({\n          ...schema,\n          $ref: `#/components/schemas/${key}`,\n        });\n      } else if (ChatGptTypeChecker.isBoolean(schema))\n        if (!!schema.enum?.length)\n          schema.enum.forEach((v) =>\n            union.push({\n              const: v,\n            }),\n          );\n        else union.push(schema);\n      else if (\n        ChatGptTypeChecker.isInteger(schema) ||\n        ChatGptTypeChecker.isNumber(schema)\n      )\n        if (!!schema.enum?.length)\n          schema.enum.forEach((v) =>\n            union.push({\n              const: v,\n            }),\n          );\n        else\n          union.push({\n            ...schema,\n            ...LlmDescriptionInverter.numeric(schema.description),\n            ...{ enum: undefined },\n          });\n      else if (ChatGptTypeChecker.isString(schema))\n        if (!!schema.enum?.length)\n          schema.enum.forEach((v) =>\n            union.push({\n              const: v,\n            }),\n          );\n        else\n          union.push({\n            ...schema,\n            ...LlmDescriptionInverter.string(schema.description),\n            ...{ enum: undefined },\n          });\n      else\n        union.push({\n          ...schema,\n        });\n    };\n    visit(props.schema);\n\n    return {\n      ...attribute,\n      ...(union.length === 0\n        ? { type: undefined }\n        : union.length === 1\n          ? { ...union[0] }\n          : { oneOf: union.map((u) => ({ ...u, nullable: undefined })) }),\n    };\n  };\n}\n"],"names":["ChatGptSchemaComposer","IS_DEFS","parameters","props","_a","config","strict","result","LlmSchemaV3_1Composer","reference","constraint","validate","validateStrict","undefined","success","key","Object","keys","value","$defs","transform","schema","oldbie","Set","has","accessor","reasons","OpenApiTypeChecker","isObject","additionalProperties","push","message","properties","required","includes","union","attribute","title","description","example","examples","fromEntries","entries","filter","startsWith","visit","input","LlmTypeCheckerV3_1","isOneOf","oneOf","forEach","isArray","items","map","JsonDescriptionUtil","take","isConstant","visitConstant","insert","matched","find","u","type","enum","const","s","length","ChatGptTypeChecker","isReference","anyOf","separateParameters","convention","NamingConvention","capitalize","llm","human","separateObject","predicate","output","endsWith","components","OpenApiValidator","create","invert","separateStation","isUnknown","isAnyOf","separateArray","separateReference","x","y","dx","dy","shrinkRequired","$ref","split","humanKey","llmKey","next","LlmDescriptionInverter","array","schemas","isBoolean","v","isInteger","isNumber","numeric","isString","string","nullable"],"mappings":"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"}