{"version":3,"file":"LlmSchemaV3Composer.mjs","sources":["../../../src/composers/llm/LlmSchemaV3Composer.ts"],"sourcesContent":["import { OpenApi } from \"../../OpenApi\";\nimport { OpenApiV3Downgrader } from \"../../converters/OpenApiV3Downgrader\";\nimport { OpenApiV3Upgrader } from \"../../converters/OpenApiV3Upgrader\";\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 { OpenApiConstraintShifter } from \"../../utils/OpenApiConstraintShifter\";\nimport { OpenApiTypeChecker } from \"../../utils/OpenApiTypeChecker\";\nimport { OpenApiValidator } from \"../../utils/OpenApiValidator\";\nimport { LlmDescriptionInverter } from \"./LlmDescriptionInverter\";\nimport { LlmParametersFinder } from \"./LlmParametersComposer\";\n\nexport namespace LlmSchemaV3Composer {\n  /**\n   * @internal\n   */\n  export const IS_DEFS = false;\n\n  /* -----------------------------------------------------------\n    CONVERTERS\n  ----------------------------------------------------------- */\n  export const parameters = (props: {\n    config: ILlmSchemaV3.IConfig;\n    components: OpenApi.IComponents;\n    schema: OpenApi.IJsonSchema.IObject | OpenApi.IJsonSchema.IReference;\n    /** @internal */\n    validate?: (\n      schema: OpenApi.IJsonSchema,\n      accessor: string,\n    ) => IOpenApiSchemaError.IReason[];\n    accessor?: string;\n    refAccessor?: string;\n  }): IResult<ILlmSchemaV3.IParameters, IOpenApiSchemaError> => {\n    const entity: IResult<OpenApi.IJsonSchema.IObject, IOpenApiSchemaError> =\n      LlmParametersFinder.parameters({\n        ...props,\n        method: \"LlmSchemaV3Composer.parameters\",\n      });\n    if (entity.success === false) return entity;\n\n    const result: IResult<ILlmSchemaV3, IOpenApiSchemaError> = schema(props);\n    if (result.success === false) return result;\n    return {\n      success: true,\n      value: {\n        ...(result.value as ILlmSchemaV3.IObject),\n        additionalProperties: false,\n      } satisfies ILlmSchemaV3.IParameters,\n    };\n  };\n\n  export const schema = (props: {\n    config: ILlmSchemaV3.IConfig;\n    components: OpenApi.IComponents;\n    schema: OpenApi.IJsonSchema;\n    /** @internal */\n    validate?: (\n      schema: OpenApi.IJsonSchema,\n      accessor: string,\n    ) => IOpenApiSchemaError.IReason[];\n    accessor?: string;\n    refAccessor?: string;\n  }): IResult<ILlmSchemaV3, IOpenApiSchemaError> => {\n    // CHECK TUPLE TYPE\n    const reasons: IOpenApiSchemaError.IReason[] = [];\n    OpenApiTypeChecker.visit({\n      closure: (next, accessor) => {\n        if (props.validate) reasons.push(...props.validate(next, accessor));\n        if (OpenApiTypeChecker.isTuple(next))\n          reasons.push({\n            accessor: accessor,\n            schema: next,\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              message: `${accessor}: unable to find reference type ${JSON.stringify(key)}.`,\n              accessor: accessor,\n            });\n          }\n        }\n      },\n      components: props.components,\n      schema: props.schema,\n      accessor: props.accessor,\n      refAccessor: props.refAccessor,\n    });\n    // if ((valid as boolean) === false) return null;\n    if (reasons.length > 0)\n      return {\n        success: false,\n        error: {\n          method: \"LlmSchemaV3Composer.schema\",\n          message: \"Failed to compose LLM schema of v3\",\n          reasons,\n        },\n      };\n\n    // CHECK MISMATCHES\n    const escaped: IResult<OpenApi.IJsonSchema, IOpenApiSchemaError> =\n      OpenApiTypeChecker.escape({\n        ...props,\n        recursive: props.config.recursive,\n      });\n    if (escaped.success === false)\n      // UNREACHABLE\n      return {\n        success: false,\n        error: {\n          method: \"LlmSchemaV3Composer.schema\",\n          message: \"Failed to compose LLM schema of v3\",\n          reasons: escaped.error.reasons,\n        },\n      };\n\n    // SPECIALIZATIONS\n    const downgraded: ILlmSchemaV3 = OpenApiV3Downgrader.downgradeSchema({\n      original: {\n        schemas: {},\n      },\n      downgraded: {},\n    })(escaped.value) as ILlmSchemaV3;\n    LlmTypeCheckerV3.visit({\n      closure: (next) => {\n        if (\n          LlmTypeCheckerV3.isOneOf(next) &&\n          (next as any).discriminator !== undefined\n        )\n          delete (next as any).discriminator;\n        else if (LlmTypeCheckerV3.isObject(next)) {\n          next.properties ??= {};\n          next.required ??= [];\n        }\n        if (props.config.constraint === false) {\n          if (\n            LlmTypeCheckerV3.isInteger(next) ||\n            LlmTypeCheckerV3.isNumber(next)\n          )\n            OpenApiConstraintShifter.shiftNumeric(\n              next as\n                | OpenApi.IJsonSchema.IInteger\n                | OpenApi.IJsonSchema.INumber,\n            );\n          else if (LlmTypeCheckerV3.isString(next))\n            OpenApiConstraintShifter.shiftString(\n              next as OpenApi.IJsonSchema.IString,\n            );\n          else if (LlmTypeCheckerV3.isArray(next))\n            OpenApiConstraintShifter.shiftArray(\n              next as OpenApi.IJsonSchema.IArray,\n            );\n        }\n      },\n      schema: downgraded,\n    });\n    return {\n      success: true,\n      value: downgraded,\n    };\n  };\n\n  /* -----------------------------------------------------------\n    SEPARATORS\n  ----------------------------------------------------------- */\n  export const separateParameters = (props: {\n    predicate: (schema: ILlmSchemaV3) => boolean;\n    parameters: ILlmSchemaV3.IParameters;\n  }): ILlmFunction.ISeparated<\"3.0\"> => {\n    const [llm, human] = separateObject({\n      predicate: props.predicate,\n      schema: props.parameters,\n    });\n    return {\n      llm: (llm as ILlmSchemaV3.IParameters | null) ?? {\n        type: \"object\",\n        properties: {},\n        additionalProperties: false,\n        required: [],\n      },\n      human: human as ILlmSchemaV3.IParameters | null,\n      validate: llm\n        ? OpenApiValidator.create({\n            components: {},\n            schema: invert({ schema: llm }),\n            required: true,\n          })\n        : undefined,\n    };\n  };\n\n  const separateStation = (props: {\n    predicate: (schema: ILlmSchemaV3) => boolean;\n    schema: ILlmSchemaV3;\n  }): [ILlmSchemaV3 | null, ILlmSchemaV3 | null] => {\n    if (props.predicate(props.schema) === true) return [null, props.schema];\n    else if (\n      LlmTypeCheckerV3.isUnknown(props.schema) ||\n      LlmTypeCheckerV3.isOneOf(props.schema)\n    )\n      return [props.schema, null];\n    else if (LlmTypeCheckerV3.isObject(props.schema))\n      return separateObject({\n        predicate: props.predicate,\n        schema: props.schema,\n      });\n    else if (LlmTypeCheckerV3.isArray(props.schema))\n      return separateArray({\n        predicate: props.predicate,\n        schema: props.schema,\n      });\n    return [props.schema, null];\n  };\n\n  const separateArray = (props: {\n    predicate: (schema: ILlmSchemaV3) => boolean;\n    schema: ILlmSchemaV3.IArray;\n  }): [ILlmSchemaV3.IArray | null, ILlmSchemaV3.IArray | null] => {\n    const [x, y] = separateStation({\n      predicate: props.predicate,\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) => boolean;\n    schema: ILlmSchemaV3.IObject;\n  }): [ILlmSchemaV3.IObject | null, ILlmSchemaV3.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>,\n      additionalProperties: props.schema.additionalProperties,\n    } satisfies ILlmSchemaV3.IObject;\n    const human = {\n      ...props.schema,\n      properties: {} as Record<string, ILlmSchemaV3>,\n      additionalProperties: props.schema.additionalProperties,\n    } satisfies ILlmSchemaV3.IObject;\n\n    for (const [key, value] of Object.entries(props.schema.properties ?? {})) {\n      const [x, y] = separateStation({\n        predicate: props.predicate,\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        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 shrinkRequired = (s: ILlmSchemaV3.IObject): ILlmSchemaV3.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    schema: ILlmSchemaV3;\n  }): OpenApi.IJsonSchema => {\n    const upgraded: OpenApi.IJsonSchema = OpenApiV3Upgrader.convertSchema({})(\n      props.schema,\n    );\n    OpenApiTypeChecker.visit({\n      closure: (schema) => {\n        if (OpenApiTypeChecker.isArray(schema))\n          Object.assign(schema, {\n            ...schema,\n            ...LlmDescriptionInverter.array(schema.description),\n          });\n        else if (\n          OpenApiTypeChecker.isInteger(schema) ||\n          OpenApiTypeChecker.isNumber(schema)\n        )\n          Object.assign(schema, {\n            ...schema,\n            ...LlmDescriptionInverter.numeric(schema.description),\n          });\n        else if (OpenApiTypeChecker.isString(schema))\n          Object.assign(schema, {\n            ...schema,\n            ...LlmDescriptionInverter.string(schema.description),\n          });\n      },\n      components: {},\n      schema: upgraded,\n    });\n    return upgraded;\n  };\n}\n"],"names":["LlmSchemaV3Composer","IS_DEFS","parameters","props","entity","LlmParametersFinder","method","success","result","schema","value","additionalProperties","reasons","OpenApiTypeChecker","visit","closure","next","accessor","validate","push","isTuple","message","isReference","key","$ref","split","components","schemas","undefined","JSON","stringify","refAccessor","length","error","escaped","escape","recursive","config","downgraded","OpenApiV3Downgrader","downgradeSchema","original","LlmTypeCheckerV3","isOneOf","discriminator","isObject","properties","required","constraint","isInteger","isNumber","OpenApiConstraintShifter","shiftNumeric","isString","shiftString","isArray","shiftArray","separateParameters","llm","human","separateObject","predicate","type","OpenApiValidator","create","invert","separateStation","isUnknown","separateArray","x","y","items","Object","keys","entries","dx","dy","shrinkRequired","s","filter","upgraded","OpenApiV3Upgrader","convertSchema","assign","LlmDescriptionInverter","array","description","numeric","string"],"mappings":";;;;;;;;;;;;;;;;AAcM,IAAWA;;CAAjB,SAAiBA;IAIFA,oBAAOC,UAAG;IAKVD,oBAAAE,aAAcC;QAYzB,MAAMC,SACJC,oBAAoBH,WAAW;eAC1BC;YACHG,QAAQ;;QAEZ,IAAIF,OAAOG,YAAY,OAAO,OAAOH;QAErC,MAAMI,SAAqDR,oBAAAS,OAAON;QAClE,IAAIK,OAAOD,YAAY,OAAO,OAAOC;QACrC,OAAO;YACLD,SAAS;YACTG,OAAO;mBACDF,OAAOE;gBACXC,sBAAsB;;;AAEzB;IAGUX,oBAAAS,SAAUN;QAarB,MAAMS,UAAyC;QAC/CC,mBAAmBC,MAAM;YACvBC,SAAS,CAACC,MAAMC;gBACd,IAAId,MAAMe,UAAUN,QAAQO,QAAQhB,MAAMe,SAASF,MAAMC;gBACzD,IAAIJ,mBAAmBO,QAAQJ,OAC7BJ,QAAQO,KAAK;oBACXF;oBACAR,QAAQO;oBACRK,SAAS;yBAER,IAAIR,mBAAmBS,YAAYN,OAAO;oBAE7C,MAAMO,MAAMP,KAAKQ,KAAKC,MAAM,yBAAyB;oBACrD,IAAItB,MAAMuB,WAAWC,UAAUJ,SAASK,WAAW;wBACjDhB,QAAQO,KAAK;4BACXV,QAAQO;4BACRK,SAAS,GAAGJ,2CAA2CY,KAAKC,UAAUP;4BACtEN;;;;;YAKRS,YAAYvB,MAAMuB;YAClBjB,QAAQN,MAAMM;YACdQ,UAAUd,MAAMc;YAChBc,aAAa5B,MAAM4B;;QAGrB,IAAInB,QAAQoB,SAAS,GACnB,OAAO;YACLzB,SAAS;YACT0B,OAAO;gBACL3B,QAAQ;gBACRe,SAAS;gBACTT;;;QAKN,MAAMsB,UACJrB,mBAAmBsB,OAAO;eACrBhC;YACHiC,WAAWjC,MAAMkC,OAAOD;;QAE5B,IAAIF,QAAQ3B,YAAY,OAEtB,OAAO;YACLA,SAAS;YACT0B,OAAO;gBACL3B,QAAQ;gBACRe,SAAS;gBACTT,SAASsB,QAAQD,MAAMrB;;;QAK7B,MAAM0B,aAA2BC,oBAAoBC,gBAAgB;YACnEC,UAAU;gBACRd,SAAS,CAAE;;YAEbW,YAAY,CAAE;UAJiBC,CAK9BL,QAAQxB;QACXgC,iBAAiB5B,MAAM;YACrBC,SAAUC;gBACR,IACE0B,iBAAiBC,QAAQ3B,SACxBA,KAAa4B,kBAAkBhB,kBAExBZ,KAAa4B,oBAClB,IAAIF,iBAAiBG,SAAS7B,OAAO;oBACxCA,KAAK8B,eAAL9B,KAAK8B,aAAe,CAAA;oBACpB9B,KAAK+B,aAAL/B,KAAK+B,WAAa;;gBAEpB,IAAI5C,MAAMkC,OAAOW,eAAe,OAAO;oBACrC,IACEN,iBAAiBO,UAAUjC,SAC3B0B,iBAAiBQ,SAASlC,OAE1BmC,yBAAyBC,aACvBpC,YAIC,IAAI0B,iBAAiBW,SAASrC,OACjCmC,yBAAyBG,YACvBtC,YAEC,IAAI0B,iBAAiBa,QAAQvC,OAChCmC,yBAAyBK,WACvBxC;;;YAIRP,QAAQ6B;;QAEV,OAAO;YACL/B,SAAS;YACTG,OAAO4B;;AACR;IAMUtC,oBAAAyD,qBAAsBtD;QAIjC,OAAOuD,KAAKC,SAASC,eAAe;YAClCC,WAAW1D,MAAM0D;YACjBpD,QAAQN,MAAMD;;QAEhB,OAAO;YACLwD,KAAMA,OAA2C;gBAC/CI,MAAM;gBACNhB,YAAY,CAAE;gBACdnC,sBAAsB;gBACtBoC,UAAU;;YAEZY;YACAzC,UAAUwC,MACNK,iBAAiBC,OAAO;gBACtBtC,YAAY,CAAE;gBACdjB,QAAQT,oBAAAiE,OAAO;oBAAExD,QAAQiD;;gBACzBX,UAAU;iBAEZnB;;AACL;IAGH,MAAMsC,kBAAmB/D;QAIvB,IAAIA,MAAM0D,UAAU1D,MAAMM,YAAY,MAAM,OAAO,EAAC,MAAMN,MAAMM,eAC3D,IACHiC,iBAAiByB,UAAUhE,MAAMM,WACjCiC,iBAAiBC,QAAQxC,MAAMM,SAE/B,OAAO,EAACN,MAAMM,QAAQ,aACnB,IAAIiC,iBAAiBG,SAAS1C,MAAMM,SACvC,OAAOmD,eAAe;YACpBC,WAAW1D,MAAM0D;YACjBpD,QAAQN,MAAMM;iBAEb,IAAIiC,iBAAiBa,QAAQpD,MAAMM,SACtC,OAAO2D,cAAc;YACnBP,WAAW1D,MAAM0D;YACjBpD,QAAQN,MAAMM;;QAElB,OAAO,EAACN,MAAMM,QAAQ;AAAK;IAG7B,MAAM2D,gBAAiBjE;QAIrB,OAAOkE,GAAGC,KAAKJ,gBAAgB;YAC7BL,WAAW1D,MAAM0D;YACjBpD,QAAQN,MAAMM,OAAO8D;;QAEvB,OAAO,EACLF,MAAM,OACF;eACKlE,MAAMM;YACT8D,OAAOF;YAET,MACJC,MAAM,OACF;eACKnE,MAAMM;YACT8D,OAAOD;YAET;AACL;IAGH,MAAMV,iBAAkBzD;QAKtB,IACEqE,OAAOC,KAAKtE,MAAMM,OAAOqC,cAAc,CAAE,GAAEd,WAAW,OACpD7B,MAAMM,OAAOE,yBAAyB,OAExC,OAAO,EAACR,MAAMM,QAAQ;QAExB,MAAMiD,MAAM;eACPvD,MAAMM;YACTqC,YAAY,CAAkC;YAC9CnC,sBAAsBR,MAAMM,OAAOE;;QAErC,MAAMgD,QAAQ;eACTxD,MAAMM;YACTqC,YAAY,CAAkC;YAC9CnC,sBAAsBR,MAAMM,OAAOE;;QAGrC,KAAK,OAAOY,KAAKb,UAAU8D,OAAOE,QAAQvE,MAAMM,OAAOqC,cAAc,CAAA,IAAK;YACxE,OAAOuB,GAAGC,KAAKJ,gBAAgB;gBAC7BL,WAAW1D,MAAM0D;gBACjBpD,QAAQC;;YAEV,IAAI2D,MAAM,MAAMX,IAAIZ,WAAWvB,OAAO8C;YACtC,IAAIC,MAAM,MAAMX,MAAMb,WAAWvB,OAAO+C;;QAE1C,WACSnE,MAAMM,OAAOE,yBAAyB,YAC7CR,MAAMM,OAAOE,yBAAyB,MACtC;YACA,OAAOgE,IAAIC,MAAMV,gBAAgB;gBAC/BL,WAAW1D,MAAM0D;gBACjBpD,QAAQN,MAAMM,OAAOE;;YAEvB+C,IAAI/C,uBAAuBgE,MAAM;YACjChB,MAAMhD,uBAAuBiE,MAAM;;QAErC,OAAO,IACHJ,OAAOC,KAAKf,IAAIZ,YAAYd,YAAY0B,IAAI/C,uBAC1CkE,eAAenB,OACf,QACFc,OAAOC,KAAKd,MAAMb,YAAYd,YAAY2B,MAAMhD,uBAC9CkE,eAAelB,SACf;AACL;IAGH,MAAMkB,iBAAkBC;QACtBA,EAAE/B,WAAW+B,EAAE/B,SAASgC,QAAQxD,OAAQuD,EAAEhC,WAAWvB,SAASK;QAC9D,OAAOkD;AAAC;IAMG9E,oBAAAiE,SAAU9D;QAGrB,MAAM6E,WAAgCC,kBAAkBC,cAAc,CAAA,EAAhCD,CACpC9E,MAAMM;QAERI,mBAAmBC,MAAM;YACvBC,SAAUN;gBACR,IAAII,mBAAmB0C,QAAQ9C,SAC7B+D,OAAOW,OAAO1E,QAAQ;uBACjBA;uBACA2E,uBAAuBC,MAAM5E,OAAO6E;yBAEtC,IACHzE,mBAAmBoC,UAAUxC,WAC7BI,mBAAmBqC,SAASzC,SAE5B+D,OAAOW,OAAO1E,QAAQ;uBACjBA;uBACA2E,uBAAuBG,QAAQ9E,OAAO6E;yBAExC,IAAIzE,mBAAmBwC,SAAS5C,SACnC+D,OAAOW,OAAO1E,QAAQ;uBACjBA;uBACA2E,uBAAuBI,OAAO/E,OAAO6E;;AACxC;YAEN5D,YAAY,CAAE;YACdjB,QAAQuE;;QAEV,OAAOA;AAAQ;AAElB,EAhUD,CAAiBhF,wBAAAA,sBAgUhB,CAAA;;"}