{"version":3,"file":"LlmSchemaV3_1Composer.mjs","sources":["../../../src/composers/llm/LlmSchemaV3_1Composer.ts"],"sourcesContent":["import { OpenApi } from \"../../OpenApi\";\nimport { ILlmFunction } from \"../../structures/ILlmFunction\";\nimport { ILlmSchemaV3_1 } from \"../../structures/ILlmSchemaV3_1\";\nimport { IOpenApiSchemaError } from \"../../structures/IOpenApiSchemaError\";\nimport { IResult } from \"../../structures/IResult\";\nimport { LlmTypeCheckerV3_1 } from \"../../utils/LlmTypeCheckerV3_1\";\nimport { NamingConvention } from \"../../utils/NamingConvention\";\nimport { OpenApiConstraintShifter } from \"../../utils/OpenApiConstraintShifter\";\nimport { OpenApiTypeChecker } from \"../../utils/OpenApiTypeChecker\";\nimport { OpenApiValidator } from \"../../utils/OpenApiValidator\";\nimport { JsonDescriptionUtil } from \"../../utils/internal/JsonDescriptionUtil\";\nimport { LlmDescriptionInverter } from \"./LlmDescriptionInverter\";\nimport { LlmParametersFinder } from \"./LlmParametersComposer\";\n\nexport namespace LlmSchemaV3_1Composer {\n  /**\n   * @internal\n   */\n  export const IS_DEFS = true;\n\n  /* -----------------------------------------------------------\n    CONVERTERS\n  ----------------------------------------------------------- */\n  export const parameters = (props: {\n    config: ILlmSchemaV3_1.IConfig;\n    components: OpenApi.IComponents;\n    schema: OpenApi.IJsonSchema.IObject | OpenApi.IJsonSchema.IReference;\n    errors?: string[];\n    /** @internal */\n    validate?: (\n      input: OpenApi.IJsonSchema,\n      accessor: string,\n    ) => IOpenApiSchemaError.IReason[];\n    accessor?: string;\n    refAccessor?: string;\n  }): IResult<ILlmSchemaV3_1.IParameters, IOpenApiSchemaError> => {\n    const entity: IResult<OpenApi.IJsonSchema.IObject, IOpenApiSchemaError> =\n      LlmParametersFinder.parameters({\n        ...props,\n        method: \"LlmSchemaV3_1Composer.parameters\",\n      });\n    if (entity.success === false) return entity;\n\n    const $defs: Record<string, ILlmSchemaV3_1> = {};\n    const result: IResult<ILlmSchemaV3_1, IOpenApiSchemaError> = schema({\n      ...props,\n      $defs,\n      schema: entity.value,\n    });\n    if (result.success === false) return result;\n    return {\n      success: true,\n      value: {\n        ...(result.value as ILlmSchemaV3_1.IObject),\n        additionalProperties: false,\n        $defs,\n        description: OpenApiTypeChecker.isReference(props.schema)\n          ? JsonDescriptionUtil.cascade({\n              prefix: \"#/components/schemas/\",\n              components: props.components,\n              schema: props.schema,\n              escape: true,\n            })\n          : result.value.description,\n      } satisfies ILlmSchemaV3_1.IParameters,\n    };\n  };\n\n  export const schema = (props: {\n    config: ILlmSchemaV3_1.IConfig;\n    components: OpenApi.IComponents;\n    $defs: Record<string, ILlmSchemaV3_1>;\n    schema: OpenApi.IJsonSchema;\n    /** @internal */\n    validate?: (\n      input: OpenApi.IJsonSchema,\n      accessor: string,\n    ) => IOpenApiSchemaError.IReason[];\n    accessor?: string;\n    refAccessor?: string;\n  }): IResult<ILlmSchemaV3_1, IOpenApiSchemaError> => {\n    const union: Array<ILlmSchemaV3_1 | null> = [];\n    const attribute: ILlmSchemaV3_1.__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(props.schema).filter(\n          ([key, value]) => key.startsWith(\"x-\") && value !== undefined,\n        ),\n      ),\n    };\n\n    const reasons: IOpenApiSchemaError.IReason[] = [];\n    OpenApiTypeChecker.visit({\n      closure: (next, accessor) => {\n        if (props.validate) {\n          // CUSTOM VALIDATION\n          reasons.push(...props.validate(next, accessor));\n        }\n        if (OpenApiTypeChecker.isTuple(next))\n          reasons.push({\n            schema: next,\n            accessor: accessor,\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              accessor: accessor,\n              message: `unable to find reference type ${JSON.stringify(key)}.`,\n            });\n        }\n      },\n      components: props.components,\n      schema: props.schema,\n      accessor: props.accessor,\n      refAccessor: props.refAccessor,\n    });\n    if (reasons.length > 0)\n      return {\n        success: false,\n        error: {\n          method: \"LlmSchemaV3_1Composer.schema\",\n          message: \"Failed to compose LLM schema of v3.1\",\n          reasons,\n        },\n      };\n\n    const visit = (input: OpenApi.IJsonSchema, accessor: string): number => {\n      if (OpenApiTypeChecker.isOneOf(input)) {\n        // UNION TYPE\n        input.oneOf.forEach((s, i) => visit(s, `${accessor}.oneOf[${i}]`));\n        return 0;\n      } else if (OpenApiTypeChecker.isReference(input)) {\n        // REFERENCE TYPE\n        const key: string = input.$ref.split(\"#/components/schemas/\")[1];\n        const target: OpenApi.IJsonSchema | undefined =\n          props.components.schemas?.[key];\n        if (target === undefined)\n          return union.push(null); // UNREACHABLEE\n        else if (\n          // KEEP THE REFERENCE TYPE\n          props.config.reference === true ||\n          OpenApiTypeChecker.isRecursiveReference({\n            components: props.components,\n            schema: input,\n          })\n        ) {\n          const out = () =>\n            union.push({\n              ...input,\n              $ref: `#/$defs/${key}`,\n            });\n          if (props.$defs[key] !== undefined) return out();\n          props.$defs[key] = {};\n          const converted: IResult<ILlmSchemaV3_1, IOpenApiSchemaError> =\n            schema({\n              config: props.config,\n              components: props.components,\n              $defs: props.$defs,\n              schema: target,\n              refAccessor: props.refAccessor,\n              accessor: `${props.refAccessor ?? \"$def\"}[${JSON.stringify(key)}]`,\n            });\n          if (converted.success === false) return union.push(null); // UNREACHABLE\n          props.$defs[key] = converted.value;\n          return out();\n        } else {\n          // DISCARD THE REFERENCE TYPE\n          const length: number = union.length;\n          visit(target, accessor);\n          if (length === union.length - 1 && union[union.length - 1] !== null)\n            union[union.length - 1] = {\n              ...union[union.length - 1]!,\n              description: JsonDescriptionUtil.cascade({\n                prefix: \"#/components/schemas/\",\n                components: props.components,\n                schema: input,\n                escape: true,\n              }),\n            };\n          else\n            attribute.description = JsonDescriptionUtil.cascade({\n              prefix: \"#/components/schemas/\",\n              components: props.components,\n              schema: input,\n              escape: true,\n            });\n          return union.length;\n        }\n      } else if (OpenApiTypeChecker.isObject(input)) {\n        // OBJECT TYPE\n        const properties: Record<string, ILlmSchemaV3_1 | null> =\n          Object.entries(input.properties ?? {}).reduce(\n            (acc, [key, value]) => {\n              const converted: IResult<ILlmSchemaV3_1, IOpenApiSchemaError> =\n                schema({\n                  config: props.config,\n                  components: props.components,\n                  $defs: props.$defs,\n                  schema: value,\n                  refAccessor: props.refAccessor,\n                  accessor: `${accessor}.properties[${JSON.stringify(key)}]`,\n                });\n              acc[key] = converted.success ? converted.value : null;\n              if (converted.success === false)\n                reasons.push(...converted.error.reasons);\n              return acc;\n            },\n            {} as Record<string, ILlmSchemaV3_1 | null>,\n          );\n        if (Object.values(properties).some((v) => v === null))\n          return union.push(null);\n        const additionalProperties:\n          | ILlmSchemaV3_1\n          | boolean\n          | null\n          | undefined = (() => {\n          if (\n            typeof input.additionalProperties === \"object\" &&\n            input.additionalProperties !== null\n          ) {\n            const converted: IResult<ILlmSchemaV3_1, IOpenApiSchemaError> =\n              schema({\n                config: props.config,\n                components: props.components,\n                $defs: props.$defs,\n                schema: input.additionalProperties,\n                refAccessor: props.refAccessor,\n                accessor: `${accessor}.additionalProperties`,\n              });\n            if (converted.success === false) {\n              reasons.push(...converted.error.reasons);\n              return null;\n            }\n            return converted.value;\n          }\n          return input.additionalProperties;\n        })();\n        if (additionalProperties === null) return union.push(null);\n        return union.push({\n          ...input,\n          properties: properties as Record<string, ILlmSchemaV3_1>,\n          additionalProperties,\n          required: input.required ?? [],\n        });\n      } else if (OpenApiTypeChecker.isArray(input)) {\n        const items: IResult<ILlmSchemaV3_1, IOpenApiSchemaError> = schema({\n          config: props.config,\n          components: props.components,\n          $defs: props.$defs,\n          schema: input.items,\n          refAccessor: props.refAccessor,\n          accessor: `${accessor}.items`,\n        });\n        if (items.success === false) {\n          reasons.push(...items.error.reasons);\n          return union.push(null);\n        }\n        return union.push(\n          (props.config.constraint\n            ? (x: ILlmSchemaV3_1.IArray) => x\n            : (x: ILlmSchemaV3_1.IArray) =>\n                OpenApiConstraintShifter.shiftArray(x))({\n            ...input,\n            items: items.value,\n          }),\n        );\n      } else if (OpenApiTypeChecker.isString(input))\n        return union.push(\n          (props.config.constraint\n            ? (x: ILlmSchemaV3_1.IString) => x\n            : (x: ILlmSchemaV3_1.IString) =>\n                OpenApiConstraintShifter.shiftString(x))({\n            ...input,\n          }),\n        );\n      else if (\n        OpenApiTypeChecker.isNumber(input) ||\n        OpenApiTypeChecker.isInteger(input)\n      )\n        return union.push(\n          (props.config.constraint\n            ? (x: ILlmSchemaV3_1.INumber | ILlmSchemaV3_1.IInteger) => x\n            : (x: ILlmSchemaV3_1.INumber | ILlmSchemaV3_1.IInteger) =>\n                OpenApiConstraintShifter.shiftNumeric(x))({\n            ...input,\n          }),\n        );\n      else if (OpenApiTypeChecker.isTuple(input))\n        return union.push(null); // UNREACHABLE\n      else return union.push({ ...input });\n    };\n    visit(props.schema, props.accessor ?? \"$input.schema\");\n\n    if (union.some((u) => u === null))\n      return {\n        success: false,\n        error: {\n          method: \"LlmSchemaV3_1Composer.schema\",\n          message: \"Failed to compose LLM schema of v3.1\",\n          reasons,\n        },\n      };\n    else if (union.length === 0)\n      return {\n        success: true,\n        value: {\n          ...attribute,\n          type: undefined,\n        },\n      };\n    else if (union.length === 1)\n      return {\n        success: true,\n        value: {\n          ...attribute,\n          ...union[0]!,\n        },\n      };\n    return {\n      success: true,\n      value: {\n        ...attribute,\n        oneOf: union.filter((u) => u !== null),\n      },\n    };\n  };\n\n  /* -----------------------------------------------------------\n    SEPARATORS\n  ----------------------------------------------------------- */\n  export const separateParameters = (props: {\n    parameters: ILlmSchemaV3_1.IParameters;\n    predicate: (schema: ILlmSchemaV3_1) => boolean;\n    convention?: (key: string, type: \"llm\" | \"human\") => string;\n  }): ILlmFunction.ISeparated<\"3.1\"> => {\n    const convention =\n      props.convention ??\n      ((key, type) => `${key}.${NamingConvention.capitalize(type)}`);\n    const [llm, human] = separateObject({\n      $defs: props.parameters.$defs,\n      schema: props.parameters,\n      predicate: props.predicate,\n      convention,\n    });\n    if (llm === null || human === null)\n      return {\n        llm: (llm as ILlmSchemaV3_1.IParameters | null) ?? {\n          type: \"object\",\n          properties: {},\n          additionalProperties: false,\n          required: [],\n          $defs: {},\n        },\n        human: human as ILlmSchemaV3_1.IParameters | null,\n      };\n    const output: ILlmFunction.ISeparated<\"3.1\"> = {\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: ILlmSchemaV3_1) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    $defs: Record<string, ILlmSchemaV3_1>;\n    schema: ILlmSchemaV3_1;\n  }): [ILlmSchemaV3_1 | null, ILlmSchemaV3_1 | null] => {\n    if (props.predicate(props.schema) === true) return [null, props.schema];\n    else if (\n      LlmTypeCheckerV3_1.isUnknown(props.schema) ||\n      LlmTypeCheckerV3_1.isOneOf(props.schema)\n    )\n      return [props.schema, null];\n    else if (LlmTypeCheckerV3_1.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 (LlmTypeCheckerV3_1.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 (LlmTypeCheckerV3_1.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: ILlmSchemaV3_1) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    $defs: Record<string, ILlmSchemaV3_1>;\n    schema: ILlmSchemaV3_1.IArray;\n  }): [ILlmSchemaV3_1.IArray | null, ILlmSchemaV3_1.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    predicate: (schema: ILlmSchemaV3_1) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    $defs: Record<string, ILlmSchemaV3_1>;\n    schema: ILlmSchemaV3_1.IObject;\n  }): [ILlmSchemaV3_1.IObject | null, ILlmSchemaV3_1.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_1>,\n      additionalProperties: props.schema.additionalProperties,\n    } satisfies ILlmSchemaV3_1.IObject;\n    const human = {\n      ...props.schema,\n      properties: {} as Record<string, ILlmSchemaV3_1>,\n    } satisfies ILlmSchemaV3_1.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: ILlmSchemaV3_1) => boolean;\n    convention: (key: string, type: \"llm\" | \"human\") => string;\n    $defs: Record<string, ILlmSchemaV3_1>;\n    schema: ILlmSchemaV3_1.IReference;\n  }): [ILlmSchemaV3_1.IReference | null, ILlmSchemaV3_1.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: ILlmSchemaV3_1 = 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: ILlmSchemaV3_1.IObject,\n  ): ILlmSchemaV3_1.IObject => {\n    if (s.required !== undefined)\n      s.required = s.required.filter(\n        (key) => s.properties?.[key] !== undefined,\n      );\n    return s;\n  };\n\n  /* -----------------------------------------------------------\n    INVERTERS\n  ----------------------------------------------------------- */\n  export const invert = (props: {\n    components: OpenApi.IComponents;\n    schema: ILlmSchemaV3_1;\n    $defs: Record<string, ILlmSchemaV3_1>;\n  }): OpenApi.IJsonSchema => {\n    const next = (schema: ILlmSchemaV3_1): OpenApi.IJsonSchema =>\n      invert({\n        components: props.components,\n        $defs: props.$defs,\n        schema,\n      });\n    if (LlmTypeCheckerV3_1.isArray(props.schema))\n      return {\n        ...props.schema,\n        ...LlmDescriptionInverter.array(props.schema.description),\n        items: next(props.schema.items),\n      };\n    else if (LlmTypeCheckerV3_1.isObject(props.schema))\n      return {\n        ...props.schema,\n        properties: props.schema.properties\n          ? Object.fromEntries(\n              Object.entries(props.schema.properties).map(([key, value]) => [\n                key,\n                next(value),\n              ]),\n            )\n          : undefined,\n        additionalProperties:\n          typeof props.schema.additionalProperties === \"object\" &&\n          props.schema.additionalProperties !== null\n            ? next(props.schema.additionalProperties)\n            : props.schema.additionalProperties,\n      };\n    else if (LlmTypeCheckerV3_1.isReference(props.schema)) {\n      const key: string = props.schema.$ref.split(\"#/$defs/\").at(-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      return {\n        ...props.schema,\n        $ref: `#/components/schemas/${key}`,\n      };\n    } else if (\n      LlmTypeCheckerV3_1.isInteger(props.schema) ||\n      LlmTypeCheckerV3_1.isNumber(props.schema)\n    )\n      return {\n        ...props.schema,\n        ...LlmDescriptionInverter.numeric(props.schema.description),\n      };\n    else if (LlmTypeCheckerV3_1.isString(props.schema))\n      return {\n        ...props.schema,\n        ...LlmDescriptionInverter.string(props.schema.description),\n      };\n    return props.schema;\n  };\n}\n"],"names":["LlmSchemaV3_1Composer","IS_DEFS","parameters","props","entity","LlmParametersFinder","method","success","$defs","result","schema","value","additionalProperties","description","OpenApiTypeChecker","isReference","JsonDescriptionUtil","cascade","prefix","components","escape","union","attribute","title","example","examples","Object","fromEntries","entries","filter","key","startsWith","undefined","reasons","visit","closure","next","accessor","validate","push","isTuple","message","$ref","split","schemas","JSON","stringify","refAccessor","length","error","input","isOneOf","oneOf","forEach","s","i","target","config","reference","isRecursiveReference","out","converted","isObject","properties","reduce","acc","values","some","v","required","isArray","items","constraint","x","OpenApiConstraintShifter","shiftArray","isString","shiftString","isNumber","isInteger","shiftNumeric","u","type","separateParameters","convention","NamingConvention","capitalize","llm","human","separateObject","predicate","output","endsWith","keys","OpenApiValidator","create","invert","separateStation","LlmTypeCheckerV3_1","isUnknown","separateArray","separateReference","y","dx","dy","shrinkRequired","humanKey","llmKey","LlmDescriptionInverter","array","map","at","_a","numeric","string"],"mappings":"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"}