{"version":3,"file":"LlmTypeChecker.mjs","sources":["../../src/utils/LlmTypeChecker.ts"],"sourcesContent":["import { ILlmSchema } from \"../structures/ILlmSchema\";\nimport { MapUtil } from \"./MapUtil\";\nimport { OpenApiTypeCheckerBase } from \"./internal/OpenApiTypeCheckerBase\";\n\n/**\n * Type checker for LLM function calling schema.\n *\n * `LlmTypeChecker` is a type checker of {@link ILlmSchema}, the type schema for\n * LLM (Large Language Model) function calling.\n *\n * This checker provides type guard functions for validating schema types, and\n * operators for traversing and comparing schemas.\n *\n * @author Jeongho Nam - https://github.com/samchon\n */\nexport namespace LlmTypeChecker {\n  /* -----------------------------------------------------------\n    TYPE CHECKERS\n  ----------------------------------------------------------- */\n  /**\n   * Test whether the schema is a null type.\n   *\n   * @param schema Target schema\n   * @returns Whether null type or not\n   */\n  export const isNull = (schema: ILlmSchema): schema is ILlmSchema.INull =>\n    (schema as ILlmSchema.INull).type === \"null\";\n\n  /**\n   * Test whether the schema is an unknown type.\n   *\n   * @param schema Target schema\n   * @returns Whether unknown type or not\n   */\n  export const isUnknown = (\n    schema: ILlmSchema,\n  ): schema is ILlmSchema.IUnknown =>\n    (schema as ILlmSchema.IUnknown).type === undefined &&\n    !isAnyOf(schema) &&\n    !isReference(schema);\n\n  /**\n   * Test whether the schema is a boolean type.\n   *\n   * @param schema Target schema\n   * @returns Whether boolean type or not\n   */\n  export const isBoolean = (\n    schema: ILlmSchema,\n  ): schema is ILlmSchema.IBoolean =>\n    (schema as ILlmSchema.IBoolean).type === \"boolean\";\n\n  /**\n   * Test whether the schema is an integer type.\n   *\n   * @param schema Target schema\n   * @returns Whether integer type or not\n   */\n  export const isInteger = (\n    schema: ILlmSchema,\n  ): schema is ILlmSchema.IInteger =>\n    (schema as ILlmSchema.IInteger).type === \"integer\";\n\n  /**\n   * Test whether the schema is a number type.\n   *\n   * @param schema Target schema\n   * @returns Whether number type or not\n   */\n  export const isNumber = (schema: ILlmSchema): schema is ILlmSchema.INumber =>\n    (schema as ILlmSchema.INumber).type === \"number\";\n\n  /**\n   * Test whether the schema is a string type.\n   *\n   * @param schema Target schema\n   * @returns Whether string type or not\n   */\n  export const isString = (schema: ILlmSchema): schema is ILlmSchema.IString =>\n    (schema as ILlmSchema.IString).type === \"string\";\n\n  /**\n   * Test whether the schema is an array type.\n   *\n   * @param schema Target schema\n   * @returns Whether array type or not\n   */\n  export const isArray = (schema: ILlmSchema): schema is ILlmSchema.IArray =>\n    (schema as ILlmSchema.IArray).type === \"array\" &&\n    (schema as ILlmSchema.IArray).items !== undefined;\n\n  /**\n   * Test whether the schema is an object type.\n   *\n   * @param schema Target schema\n   * @returns Whether object type or not\n   */\n  export const isObject = (schema: ILlmSchema): schema is ILlmSchema.IObject =>\n    (schema as ILlmSchema.IObject).type === \"object\";\n\n  /**\n   * Test whether the schema is a reference type.\n   *\n   * @param schema Target schema\n   * @returns Whether reference type or not\n   */\n  export const isReference = (\n    schema: ILlmSchema,\n  ): schema is ILlmSchema.IReference => (schema as any).$ref !== undefined;\n\n  /**\n   * Test whether the schema is a union type.\n   *\n   * @param schema Target schema\n   * @returns Whether union type or not\n   */\n  export const isAnyOf = (schema: ILlmSchema): schema is ILlmSchema.IAnyOf =>\n    (schema as ILlmSchema.IAnyOf).anyOf !== undefined;\n\n  /* -----------------------------------------------------------\n    OPERATORS\n  ----------------------------------------------------------- */\n  /**\n   * Visit every nested schemas.\n   *\n   * Visit every nested schemas of the target, and apply the `props.closure`\n   * function.\n   *\n   * Here is the list of occurring nested visitings:\n   *\n   * - {@link ILlmSchema.IAnyOf.anyOf}\n   * - {@link ILlmSchema.IReference}\n   * - {@link ILlmSchema.IObject.properties}\n   * - {@link ILlmSchema.IArray.items}\n   *\n   * @param props Properties for visiting\n   */\n  export const visit = (props: {\n    closure: (schema: ILlmSchema, accessor: string) => void;\n    $defs?: Record<string, ILlmSchema> | undefined;\n    schema: ILlmSchema;\n    accessor?: string;\n    refAccessor?: string;\n  }): void => {\n    const already: Set<string> = new Set();\n    const refAccessor: string = props.refAccessor ?? \"$input.$defs\";\n    const next = (schema: ILlmSchema, accessor: string): void => {\n      props.closure(schema, accessor);\n      if (LlmTypeChecker.isReference(schema)) {\n        const key: string = schema.$ref.split(\"#/$defs/\").pop()!;\n        if (already.has(key) === true) return;\n        already.add(key);\n        const found: ILlmSchema | undefined = props.$defs?.[key];\n        if (found !== undefined) next(found, `${refAccessor}[${key}]`);\n      } else if (LlmTypeChecker.isAnyOf(schema))\n        schema.anyOf.forEach((s, i) => next(s, `${accessor}.anyOf[${i}]`));\n      else if (LlmTypeChecker.isObject(schema)) {\n        for (const [key, value] of Object.entries(schema.properties))\n          next(value, `${accessor}.properties[${JSON.stringify(key)}]`);\n        if (\n          typeof schema.additionalProperties === \"object\" &&\n          schema.additionalProperties !== null\n        )\n          next(schema.additionalProperties, `${accessor}.additionalProperties`);\n      } else if (LlmTypeChecker.isArray(schema))\n        next(schema.items, `${accessor}.items`);\n    };\n    next(props.schema, props.accessor ?? \"$input.schemas\");\n  };\n\n  /**\n   * Test whether the `x` schema covers the `y` schema.\n   *\n   * @param props Properties for testing\n   * @returns Whether the `x` schema covers the `y` schema\n   */\n  export const covers = (props: {\n    $defs?: Record<string, ILlmSchema> | undefined;\n    x: ILlmSchema;\n    y: ILlmSchema;\n  }): boolean =>\n    coverStation({\n      $defs: props.$defs,\n      x: props.x,\n      y: props.y,\n      visited: new Map(),\n    });\n\n  const coverStation = (p: {\n    $defs?: Record<string, ILlmSchema> | undefined;\n    visited: Map<ILlmSchema, Map<ILlmSchema, boolean>>;\n    x: ILlmSchema;\n    y: ILlmSchema;\n  }): boolean => {\n    const cache: boolean | undefined = p.visited.get(p.x)?.get(p.y);\n    if (cache !== undefined) return cache;\n\n    // FOR RECURSIVE CASE\n    const nested: Map<ILlmSchema, boolean> = MapUtil.take(p.visited)(p.x)(\n      () => new Map(),\n    );\n    nested.set(p.y, true);\n\n    // COMPUTE IT\n    const result: boolean = coverSchema(p);\n    nested.set(p.y, result);\n    return result;\n  };\n\n  const coverSchema = (p: {\n    $defs?: Record<string, ILlmSchema> | undefined;\n    visited: Map<ILlmSchema, Map<ILlmSchema, boolean>>;\n    x: ILlmSchema;\n    y: ILlmSchema;\n  }): boolean => {\n    // CHECK EQUALITY\n    if (p.x === p.y) return true;\n    else if (isReference(p.x) && isReference(p.y) && p.x.$ref === p.y.$ref)\n      return true;\n\n    // COMPARE WITH FLATTENING\n    const alpha: ILlmSchema[] = flatSchema(p.$defs, p.x);\n    const beta: ILlmSchema[] = flatSchema(p.$defs, p.y);\n    if (alpha.some((x) => isUnknown(x))) return true;\n    else if (beta.some((x) => isUnknown(x))) return false;\n    return beta.every((b) =>\n      alpha.some((a) =>\n        coverEscapedSchema({\n          $defs: p.$defs,\n          visited: p.visited,\n          x: a,\n          y: b,\n        }),\n      ),\n    );\n  };\n\n  const coverEscapedSchema = (p: {\n    $defs?: Record<string, ILlmSchema> | undefined;\n    visited: Map<ILlmSchema, Map<ILlmSchema, boolean>>;\n    x: ILlmSchema;\n    y: ILlmSchema;\n  }): boolean => {\n    // CHECK EQUALITY\n    if (p.x === p.y) return true;\n    else if (isUnknown(p.x)) return true;\n    else if (isUnknown(p.y)) return false;\n    else if (isNull(p.x)) return isNull(p.y);\n    // ATOMIC CASE\n    else if (isBoolean(p.x)) return isBoolean(p.y) && coverBoolean(p.x, p.y);\n    else if (isInteger(p.x)) return isInteger(p.y) && coverInteger(p.x, p.y);\n    else if (isNumber(p.x)) return isNumber(p.y) && coverNumber(p.x, p.y);\n    else if (isString(p.x)) return isString(p.y) && coverString(p.x, p.y);\n    // INSTANCE CASE\n    else if (isArray(p.x))\n      return (\n        isArray(p.y) &&\n        coverArray({\n          $defs: p.$defs,\n          visited: p.visited,\n          x: p.x,\n          y: p.y,\n        })\n      );\n    else if (isObject(p.x))\n      return (\n        isObject(p.y) &&\n        coverObject({\n          $defs: p.$defs,\n          visited: p.visited,\n          x: p.x,\n          y: p.y,\n        })\n      );\n    else if (isReference(p.x)) return isReference(p.y) && p.x.$ref === p.y.$ref;\n    return false;\n  };\n\n  const coverArray = (p: {\n    $defs?: Record<string, ILlmSchema> | undefined;\n    visited: Map<ILlmSchema, Map<ILlmSchema, boolean>>;\n    x: ILlmSchema.IArray;\n    y: ILlmSchema.IArray;\n  }): boolean => {\n    if (\n      !(\n        p.x.minItems === undefined ||\n        (p.y.minItems !== undefined && p.x.minItems <= p.y.minItems)\n      )\n    )\n      return false;\n    else if (\n      !(\n        p.x.maxItems === undefined ||\n        (p.y.maxItems !== undefined && p.x.maxItems >= p.y.maxItems)\n      )\n    )\n      return false;\n    return coverStation({\n      $defs: p.$defs,\n      visited: p.visited,\n      x: p.x.items,\n      y: p.y.items,\n    });\n  };\n\n  const coverObject = (p: {\n    $defs?: Record<string, ILlmSchema> | undefined;\n    visited: Map<ILlmSchema, Map<ILlmSchema, boolean>>;\n    x: ILlmSchema.IObject;\n    y: ILlmSchema.IObject;\n  }): boolean => {\n    if (!p.x.additionalProperties && !!p.y.additionalProperties) return false;\n    else if (\n      !!p.x.additionalProperties &&\n      !!p.y.additionalProperties &&\n      ((typeof p.x.additionalProperties === \"object\" &&\n        p.y.additionalProperties === true) ||\n        (typeof p.x.additionalProperties === \"object\" &&\n          typeof p.y.additionalProperties === \"object\" &&\n          !coverStation({\n            $defs: p.$defs,\n            visited: p.visited,\n            x: p.x.additionalProperties,\n            y: p.y.additionalProperties,\n          })))\n    )\n      return false;\n    return Object.entries(p.y.properties ?? {}).every(([key, b]) => {\n      const a: ILlmSchema | undefined = p.x.properties?.[key];\n      if (a === undefined) return false;\n      else if (\n        (p.x.required?.includes(key) ?? false) === true &&\n        (p.y.required?.includes(key) ?? false) === false\n      )\n        return false;\n      return coverStation({\n        $defs: p.$defs,\n        visited: p.visited,\n        x: a,\n        y: b,\n      });\n    });\n  };\n\n  const coverBoolean = (\n    x: ILlmSchema.IBoolean,\n    y: ILlmSchema.IBoolean,\n  ): boolean => {\n    if (!!x.enum?.length)\n      return !!y.enum?.length && y.enum.every((v) => x.enum!.includes(v));\n    return true;\n  };\n\n  const coverInteger = (\n    x: ILlmSchema.IInteger,\n    y: ILlmSchema.IInteger,\n  ): boolean => {\n    if (!!x.enum?.length)\n      return !!y.enum?.length && y.enum.every((v) => x.enum!.includes(v));\n    return OpenApiTypeCheckerBase.coverInteger(x, y);\n  };\n\n  const coverNumber = (\n    x: ILlmSchema.INumber,\n    y: ILlmSchema.IInteger | ILlmSchema.INumber,\n  ): boolean => {\n    if (!!x.enum?.length)\n      return !!y.enum?.length && y.enum.every((v) => x.enum!.includes(v));\n    return OpenApiTypeCheckerBase.coverNumber(x, y);\n  };\n\n  const coverString = (\n    x: ILlmSchema.IString,\n    y: ILlmSchema.IString,\n  ): boolean => {\n    if (!!x.enum?.length)\n      return !!y.enum?.length && y.enum.every((v) => x.enum!.includes(v));\n    return OpenApiTypeCheckerBase.coverString(x, y);\n  };\n\n  const flatSchema = (\n    $defs: Record<string, ILlmSchema> | undefined,\n    schema: ILlmSchema,\n  ): ILlmSchema[] => {\n    schema = escapeReference($defs, schema);\n    if (isAnyOf(schema))\n      return schema.anyOf.map((v) => flatSchema($defs, v)).flat();\n    return [schema];\n  };\n\n  const escapeReference = (\n    $defs: Record<string, ILlmSchema> | undefined,\n    schema: ILlmSchema,\n  ): Exclude<ILlmSchema, ILlmSchema.IReference> =>\n    isReference(schema)\n      ? escapeReference($defs, $defs![schema.$ref.replace(\"#/$defs/\", \"\")]!)\n      : schema;\n}\n"],"names":["LlmTypeChecker","isNull","schema","type","isUnknown","undefined","isAnyOf","isReference","isBoolean","isInteger","isNumber","isString","isArray","items","isObject","$ref","anyOf","visit","props","already","Set","refAccessor","next","accessor","closure","key","split","pop","has","add","found","$defs","forEach","s","i","value","Object","entries","properties","JSON","stringify","additionalProperties","covers","coverStation","x","y","visited","Map","p","cache","get","nested","MapUtil","take","set","result","coverSchema","alpha","flatSchema","beta","some","every","b","a","coverEscapedSchema","coverBoolean","coverInteger","coverNumber","coverString","coverArray","coverObject","minItems","maxItems","required","includes","enum","length","v","OpenApiTypeCheckerBase","escapeReference","map","flat","replace"],"mappings":"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"}