@x12i/ai-tools 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AiModelsCatalogClient-B5FMI9gj.d.cts → AiModelsCatalogClient-C9ZJHhv3.d.ts} +4 -1
- package/dist/{AiModelsCatalogClient-CPPNI6Ry.d.ts → AiModelsCatalogClient-DgBdVFk-.d.cts} +4 -1
- package/dist/aliases/index.d.cts +3 -3
- package/dist/aliases/index.d.ts +3 -3
- package/dist/catalog/index.cjs +6 -5
- package/dist/catalog/index.cjs.map +1 -1
- package/dist/catalog/index.d.cts +4 -4
- package/dist/catalog/index.d.ts +4 -4
- package/dist/catalog/index.js +5 -4
- package/dist/{chunk-EYHMQVAL.js → chunk-54GKLIDW.js} +22 -10
- package/dist/chunk-54GKLIDW.js.map +1 -0
- package/dist/chunk-5IZ7PLY2.cjs +51 -0
- package/dist/chunk-5IZ7PLY2.cjs.map +1 -0
- package/dist/{chunk-XAWBTX3N.cjs → chunk-75ZVXZAV.cjs} +7 -7
- package/dist/{chunk-XAWBTX3N.cjs.map → chunk-75ZVXZAV.cjs.map} +1 -1
- package/dist/{chunk-YQDSN6R6.cjs → chunk-76FHWQH3.cjs} +3 -3
- package/dist/{chunk-YQDSN6R6.cjs.map → chunk-76FHWQH3.cjs.map} +1 -1
- package/dist/{chunk-EDMCKHO6.cjs → chunk-BCX5CLJJ.cjs} +15 -2
- package/dist/chunk-BCX5CLJJ.cjs.map +1 -0
- package/dist/{chunk-OPN6BGNH.js → chunk-D6OIUYNC.js} +117 -5
- package/dist/{chunk-OPN6BGNH.js.map → chunk-D6OIUYNC.js.map} +1 -1
- package/dist/{chunk-NF2SKQR7.cjs → chunk-DDRWORUU.cjs} +30 -298
- package/dist/chunk-DDRWORUU.cjs.map +1 -0
- package/dist/{chunk-5XAAMBDO.cjs → chunk-HBNYVRLZ.cjs} +123 -11
- package/dist/chunk-HBNYVRLZ.cjs.map +1 -0
- package/dist/chunk-HEB73GKJ.js +263 -0
- package/dist/chunk-HEB73GKJ.js.map +1 -0
- package/dist/{chunk-VJHLO2R3.js → chunk-KSJSLKYI.js} +2 -2
- package/dist/{chunk-SIH4GPV4.js → chunk-MOLWV5LV.js} +2 -2
- package/dist/{chunk-U2YDDUVP.js → chunk-PN4FF6YF.js} +10 -275
- package/dist/chunk-PN4FF6YF.js.map +1 -0
- package/dist/{chunk-DXZOL3VN.cjs → chunk-RSHI4OOY.cjs} +46 -34
- package/dist/chunk-RSHI4OOY.cjs.map +1 -0
- package/dist/{chunk-B3V2EHRY.js → chunk-SLSKQRMI.js} +15 -2
- package/dist/{chunk-B3V2EHRY.js.map → chunk-SLSKQRMI.js.map} +1 -1
- package/dist/{chunk-XOKUDUUI.cjs → chunk-TMA6QSNH.cjs} +3 -3
- package/dist/{chunk-XOKUDUUI.cjs.map → chunk-TMA6QSNH.cjs.map} +1 -1
- package/dist/{chunk-6BQBKROR.js → chunk-VBROBIVI.js} +3 -3
- package/dist/{chunk-6BQBKROR.js.map → chunk-VBROBIVI.js.map} +1 -1
- package/dist/chunk-WSUFQR3D.cjs +266 -0
- package/dist/chunk-WSUFQR3D.cjs.map +1 -0
- package/dist/{chunk-PRCICORG.cjs → chunk-X42KFOUO.cjs} +6 -6
- package/dist/{chunk-PRCICORG.cjs.map → chunk-X42KFOUO.cjs.map} +1 -1
- package/dist/chunk-YQVY7CWT.js +51 -0
- package/dist/chunk-YQVY7CWT.js.map +1 -0
- package/dist/{chunk-AB5GNXJ4.js → chunk-ZPUZ7DBO.js} +2 -2
- package/dist/cli/index.cjs +16 -15
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +7 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cost/index.cjs +4 -3
- package/dist/cost/index.cjs.map +1 -1
- package/dist/cost/index.d.cts +4 -4
- package/dist/cost/index.d.ts +4 -4
- package/dist/cost/index.js +3 -2
- package/dist/index.cjs +28 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +8 -6
- package/dist/index.d.ts +8 -6
- package/dist/index.js +33 -16
- package/dist/{modelCache-CJftI-Ko.d.cts → modelCache-sL3dBfRM.d.cts} +1 -1
- package/dist/{modelCache-BzRn6t_C.d.ts → modelCache-xzoTUue2.d.ts} +1 -1
- package/dist/{modelNameResolver-5XkBMctP.d.ts → modelNameResolver-2WroQlqt.d.ts} +2 -1
- package/dist/{modelNameResolver-C5CSTGFF.d.cts → modelNameResolver-Bxlehrbp.d.cts} +2 -1
- package/dist/models/index.cjs +7 -6
- package/dist/models/index.cjs.map +1 -1
- package/dist/models/index.d.cts +3 -3
- package/dist/models/index.d.ts +3 -3
- package/dist/models/index.js +9 -8
- package/dist/profiles/index.cjs +18 -0
- package/dist/profiles/index.cjs.map +1 -0
- package/dist/profiles/index.d.cts +40 -0
- package/dist/profiles/index.d.ts +40 -0
- package/dist/profiles/index.js +17 -0
- package/dist/profiles/index.js.map +1 -0
- package/dist/{resolveUsageModel-BFwf80Hz.d.ts → resolveUsageModel-DrFuiuIW.d.ts} +2 -2
- package/dist/{resolveUsageModel-C_YmGR1M.d.cts → resolveUsageModel-xKZ2QpHy.d.cts} +2 -2
- package/dist/sync/index.cjs +7 -5
- package/dist/sync/index.cjs.map +1 -1
- package/dist/sync/index.d.cts +3 -3
- package/dist/sync/index.d.ts +3 -3
- package/dist/sync/index.js +6 -4
- package/dist/{types-BrzJWsTU.d.ts → types-BZYGjN2O.d.cts} +21 -2
- package/dist/{types-BrzJWsTU.d.cts → types-BZYGjN2O.d.ts} +21 -2
- package/package.json +7 -2
- package/dist/chunk-5XAAMBDO.cjs.map +0 -1
- package/dist/chunk-DXZOL3VN.cjs.map +0 -1
- package/dist/chunk-EDMCKHO6.cjs.map +0 -1
- package/dist/chunk-EYHMQVAL.js.map +0 -1
- package/dist/chunk-NF2SKQR7.cjs.map +0 -1
- package/dist/chunk-U2YDDUVP.js.map +0 -1
- /package/dist/{chunk-VJHLO2R3.js.map → chunk-KSJSLKYI.js.map} +0 -0
- /package/dist/{chunk-SIH4GPV4.js.map → chunk-MOLWV5LV.js.map} +0 -0
- /package/dist/{chunk-AB5GNXJ4.js.map → chunk-ZPUZ7DBO.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sync/OpenRouterSyncProvider.ts","../src/sync/modelNameResolver.ts"],"sourcesContent":["import { SyncError } from \"../errors.js\";\nimport { normalizeOpenRouterModel } from \"../models/normalizeOpenRouterModel.js\";\nimport type { AiModelRecord } from \"../models/types.js\";\nimport type {\n OpenRouterModelsQuery,\n OpenRouterModelsResponse,\n} from \"../models/openrouter.types.js\";\n\nexport type OpenRouterSyncProviderOptions = {\n /** Optional — public GET /models needs no key. */\n apiKey?: string;\n baseUrl?: string;\n /** Query params passed to OpenRouter (default: all modalities). */\n query?: OpenRouterModelsQuery;\n};\n\nfunction buildFetchHeaders(apiKey?: string): Record<string, string> {\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (apiKey?.trim()) headers.Authorization = `Bearer ${apiKey.trim()}`;\n return headers;\n}\n\nfunction buildModelsUrl(baseUrl: string, query?: OpenRouterModelsQuery): string {\n const url = new URL(`${baseUrl.replace(/\\/$/, \"\")}/models`);\n const q = { output_modalities: \"all\", ...query };\n for (const [key, value] of Object.entries(q)) {\n if (value !== undefined && value !== \"\") url.searchParams.set(key, value);\n }\n return url.toString();\n}\n\nexport class OpenRouterSyncProvider {\n private readonly apiKey?: string;\n private readonly baseUrl: string;\n private readonly query?: OpenRouterModelsQuery;\n\n constructor(options: OpenRouterSyncProviderOptions = {}) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://openrouter.ai/api/v1\";\n this.query = options.query ?? { output_modalities: \"all\" };\n }\n\n /**\n * Fetches the full OpenRouter model catalog (public, no API key required).\n * @see https://openrouter.ai/api/v1/models\n */\n async fetchModels(): Promise<AiModelRecord[]> {\n const url = buildModelsUrl(this.baseUrl, this.query);\n let response: Response;\n\n try {\n response = await fetch(url, { headers: buildFetchHeaders(this.apiKey) });\n } catch (cause) {\n throw new SyncError(\"OPENROUTER_MODELS_FETCH_FAILED\", `Failed to fetch OpenRouter models from ${url}`, cause);\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new SyncError(\n \"OPENROUTER_AUTH_FAILED\",\n this.apiKey\n ? \"OpenRouter API key is invalid or unauthorized.\"\n : \"OpenRouter returned unauthorized — remove OPENROUTER_API_KEY to use the public models endpoint.\",\n );\n }\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new SyncError(\n \"OPENROUTER_MODELS_FETCH_FAILED\",\n `OpenRouter models fetch failed (${response.status}): ${body.slice(0, 200)}`,\n );\n }\n\n const json = (await response.json()) as OpenRouterModelsResponse;\n const syncedAt = new Date().toISOString();\n return (json.data ?? []).map((row) => normalizeOpenRouterModel(row, syncedAt));\n }\n\n /** Build the URL used for the last fetch pattern (for debugging). */\n getModelsUrl(): string {\n return buildModelsUrl(this.baseUrl, this.query);\n }\n}\n","import type { AliasRegistry } from \"../aliases/AliasRegistry.js\";\nimport type { AiModelRecord } from \"../models/types.js\";\nimport { ModelNameResolver } from \"./modelNameResolver/ModelNameResolver.js\";\nimport type {\n ModelResolutionInput,\n ModelResolutionResult,\n ModelResolutionSuccess,\n ModelResolverOptions,\n ResolvedModel,\n} from \"./modelNameResolver/types.js\";\n\nexport { ModelNameResolver } from \"./modelNameResolver/ModelNameResolver.js\";\nexport { buildCatalogIndexes } from \"./modelNameResolver/catalogIndexes.js\";\nexport * from \"./modelNameResolver/types.js\";\nexport {\n loadOpenRouterRoutingEnv,\n shouldDefaultRouteViaOpenRouter,\n providerIdToEnvKeyPrefix,\n vendorApiKeyEnvName,\n} from \"./openRouterRoutingEnv.js\";\nexport type { OpenRouterRoutingConfig } from \"./openRouterRoutingEnv.js\";\nexport { normalizeString, normalizeProvider } from \"./modelNameResolver/normalize.js\";\n\nexport function createModelNameResolver(\n catalog: Map<string, AiModelRecord>,\n options?: ModelResolverOptions,\n): ModelNameResolver {\n return new ModelNameResolver(catalog, options);\n}\n\n/** Resolve a model string; returns catalog record only (no resolution metadata). */\nexport function resolveModel(\n input: string,\n models: Map<string, AiModelRecord>,\n aliasRegistry?: AliasRegistry,\n provider?: string,\n): ResolvedModel | null {\n const resolver = new ModelNameResolver(models, { aliasRegistry });\n const result = resolver.resolve({ model: input, provider });\n if (!result.found || !result.record) return null;\n return {\n catalogModel: result.record,\n matchedAlias: result.modelId,\n routedViaOpenRouter: result.routedViaOpenRouter,\n };\n}\n\nexport function isRoutedViaOpenRouter(\n provider: string | undefined,\n model: AiModelRecord,\n matchedKey: string,\n): boolean {\n if (provider === \"openrouter\") return true;\n if (provider && provider !== \"openrouter\") return false;\n return model.modelId.includes(\"/\") && matchedKey.includes(\"/\");\n}\n\nexport type {\n ModelResolutionInput,\n ModelResolutionResult,\n ModelResolutionSuccess,\n ModelResolverOptions,\n};\n"],"mappings":";;;;;;;;;;;AAgBA,SAAS,kBAAkB,QAAyC;AAClE,QAAM,UAAkC,EAAE,QAAQ,mBAAmB;AACrE,MAAI,QAAQ,KAAK,EAAG,SAAQ,gBAAgB,UAAU,OAAO,KAAK,CAAC;AACnE,SAAO;AACT;AAEA,SAAS,eAAe,SAAiB,OAAuC;AAC9E,QAAM,MAAM,IAAI,IAAI,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC,SAAS;AAC1D,QAAM,IAAI,EAAE,mBAAmB,OAAO,GAAG,MAAM;AAC/C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,CAAC,GAAG;AAC5C,QAAI,UAAU,UAAa,UAAU,GAAI,KAAI,aAAa,IAAI,KAAK,KAAK;AAAA,EAC1E;AACA,SAAO,IAAI,SAAS;AACtB;AAEO,IAAM,yBAAN,MAA6B;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,UAAyC,CAAC,GAAG;AACvD,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,QAAQ,QAAQ,SAAS,EAAE,mBAAmB,MAAM;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAwC;AAC5C,UAAM,MAAM,eAAe,KAAK,SAAS,KAAK,KAAK;AACnD,QAAI;AAEJ,QAAI;AACF,iBAAW,MAAM,MAAM,KAAK,EAAE,SAAS,kBAAkB,KAAK,MAAM,EAAE,CAAC;AAAA,IACzE,SAAS,OAAO;AACd,YAAM,IAAI,UAAU,kCAAkC,0CAA0C,GAAG,IAAI,KAAK;AAAA,IAC9G;AAEA,QAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,YAAM,IAAI;AAAA,QACR;AAAA,QACA,KAAK,SACD,mDACA;AAAA,MACN;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,YAAM,IAAI;AAAA,QACR;AAAA,QACA,mCAAmC,SAAS,MAAM,MAAM,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,MAC5E;AAAA,IACF;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AACxC,YAAQ,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,yBAAyB,KAAK,QAAQ,CAAC;AAAA,EAC/E;AAAA;AAAA,EAGA,eAAuB;AACrB,WAAO,eAAe,KAAK,SAAS,KAAK,KAAK;AAAA,EAChD;AACF;;;
|
|
1
|
+
{"version":3,"sources":["../src/sync/OpenRouterSyncProvider.ts","../src/sync/modelNameResolver.ts"],"sourcesContent":["import { SyncError } from \"../errors.js\";\nimport { normalizeOpenRouterModel } from \"../models/normalizeOpenRouterModel.js\";\nimport type { AiModelRecord } from \"../models/types.js\";\nimport type {\n OpenRouterModelsQuery,\n OpenRouterModelsResponse,\n} from \"../models/openrouter.types.js\";\n\nexport type OpenRouterSyncProviderOptions = {\n /** Optional — public GET /models needs no key. */\n apiKey?: string;\n baseUrl?: string;\n /** Query params passed to OpenRouter (default: all modalities). */\n query?: OpenRouterModelsQuery;\n};\n\nfunction buildFetchHeaders(apiKey?: string): Record<string, string> {\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (apiKey?.trim()) headers.Authorization = `Bearer ${apiKey.trim()}`;\n return headers;\n}\n\nfunction buildModelsUrl(baseUrl: string, query?: OpenRouterModelsQuery): string {\n const url = new URL(`${baseUrl.replace(/\\/$/, \"\")}/models`);\n const q = { output_modalities: \"all\", ...query };\n for (const [key, value] of Object.entries(q)) {\n if (value !== undefined && value !== \"\") url.searchParams.set(key, value);\n }\n return url.toString();\n}\n\nexport class OpenRouterSyncProvider {\n private readonly apiKey?: string;\n private readonly baseUrl: string;\n private readonly query?: OpenRouterModelsQuery;\n\n constructor(options: OpenRouterSyncProviderOptions = {}) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://openrouter.ai/api/v1\";\n this.query = options.query ?? { output_modalities: \"all\" };\n }\n\n /**\n * Fetches the full OpenRouter model catalog (public, no API key required).\n * @see https://openrouter.ai/api/v1/models\n */\n async fetchModels(): Promise<AiModelRecord[]> {\n const url = buildModelsUrl(this.baseUrl, this.query);\n let response: Response;\n\n try {\n response = await fetch(url, { headers: buildFetchHeaders(this.apiKey) });\n } catch (cause) {\n throw new SyncError(\"OPENROUTER_MODELS_FETCH_FAILED\", `Failed to fetch OpenRouter models from ${url}`, cause);\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new SyncError(\n \"OPENROUTER_AUTH_FAILED\",\n this.apiKey\n ? \"OpenRouter API key is invalid or unauthorized.\"\n : \"OpenRouter returned unauthorized — remove OPENROUTER_API_KEY to use the public models endpoint.\",\n );\n }\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new SyncError(\n \"OPENROUTER_MODELS_FETCH_FAILED\",\n `OpenRouter models fetch failed (${response.status}): ${body.slice(0, 200)}`,\n );\n }\n\n const json = (await response.json()) as OpenRouterModelsResponse;\n const syncedAt = new Date().toISOString();\n return (json.data ?? []).map((row) => normalizeOpenRouterModel(row, syncedAt));\n }\n\n /** Build the URL used for the last fetch pattern (for debugging). */\n getModelsUrl(): string {\n return buildModelsUrl(this.baseUrl, this.query);\n }\n}\n","import type { AliasRegistry } from \"../aliases/AliasRegistry.js\";\nimport type { AiModelRecord } from \"../models/types.js\";\nimport { ModelNameResolver } from \"./modelNameResolver/ModelNameResolver.js\";\nimport type {\n ModelResolutionInput,\n ModelResolutionResult,\n ModelResolutionSuccess,\n ModelResolverOptions,\n ResolvedModel,\n} from \"./modelNameResolver/types.js\";\n\nexport { ModelNameResolver } from \"./modelNameResolver/ModelNameResolver.js\";\nexport { buildCatalogIndexes } from \"./modelNameResolver/catalogIndexes.js\";\nexport * from \"./modelNameResolver/types.js\";\nexport {\n loadOpenRouterRoutingEnv,\n shouldDefaultRouteViaOpenRouter,\n isEffectiveOpenRouterTransport,\n providerIdToEnvKeyPrefix,\n vendorApiKeyEnvName,\n} from \"./openRouterRoutingEnv.js\";\nexport type { OpenRouterRoutingConfig } from \"./openRouterRoutingEnv.js\";\nexport { normalizeString, normalizeProvider } from \"./modelNameResolver/normalize.js\";\n\nexport function createModelNameResolver(\n catalog: Map<string, AiModelRecord>,\n options?: ModelResolverOptions,\n): ModelNameResolver {\n return new ModelNameResolver(catalog, options);\n}\n\n/** Resolve a model string; returns catalog record only (no resolution metadata). */\nexport function resolveModel(\n input: string,\n models: Map<string, AiModelRecord>,\n aliasRegistry?: AliasRegistry,\n provider?: string,\n): ResolvedModel | null {\n const resolver = new ModelNameResolver(models, { aliasRegistry });\n const result = resolver.resolve({ model: input, provider });\n if (!result.found || !result.record) return null;\n return {\n catalogModel: result.record,\n matchedAlias: result.modelId,\n routedViaOpenRouter: result.routedViaOpenRouter,\n };\n}\n\nexport function isRoutedViaOpenRouter(\n provider: string | undefined,\n model: AiModelRecord,\n matchedKey: string,\n): boolean {\n if (provider === \"openrouter\") return true;\n if (provider && provider !== \"openrouter\") return false;\n return model.modelId.includes(\"/\") && matchedKey.includes(\"/\");\n}\n\nexport type {\n ModelResolutionInput,\n ModelResolutionResult,\n ModelResolutionSuccess,\n ModelResolverOptions,\n};\n"],"mappings":";;;;;;;;;;;AAgBA,SAAS,kBAAkB,QAAyC;AAClE,QAAM,UAAkC,EAAE,QAAQ,mBAAmB;AACrE,MAAI,QAAQ,KAAK,EAAG,SAAQ,gBAAgB,UAAU,OAAO,KAAK,CAAC;AACnE,SAAO;AACT;AAEA,SAAS,eAAe,SAAiB,OAAuC;AAC9E,QAAM,MAAM,IAAI,IAAI,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC,SAAS;AAC1D,QAAM,IAAI,EAAE,mBAAmB,OAAO,GAAG,MAAM;AAC/C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,CAAC,GAAG;AAC5C,QAAI,UAAU,UAAa,UAAU,GAAI,KAAI,aAAa,IAAI,KAAK,KAAK;AAAA,EAC1E;AACA,SAAO,IAAI,SAAS;AACtB;AAEO,IAAM,yBAAN,MAA6B;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,UAAyC,CAAC,GAAG;AACvD,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,QAAQ,QAAQ,SAAS,EAAE,mBAAmB,MAAM;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAwC;AAC5C,UAAM,MAAM,eAAe,KAAK,SAAS,KAAK,KAAK;AACnD,QAAI;AAEJ,QAAI;AACF,iBAAW,MAAM,MAAM,KAAK,EAAE,SAAS,kBAAkB,KAAK,MAAM,EAAE,CAAC;AAAA,IACzE,SAAS,OAAO;AACd,YAAM,IAAI,UAAU,kCAAkC,0CAA0C,GAAG,IAAI,KAAK;AAAA,IAC9G;AAEA,QAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,YAAM,IAAI;AAAA,QACR;AAAA,QACA,KAAK,SACD,mDACA;AAAA,MACN;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,YAAM,IAAI;AAAA,QACR;AAAA,QACA,mCAAmC,SAAS,MAAM,MAAM,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,MAC5E;AAAA,IACF;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AACxC,YAAQ,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,yBAAyB,KAAK,QAAQ,CAAC;AAAA,EAC/E;AAAA;AAAA,EAGA,eAAuB;AACrB,WAAO,eAAe,KAAK,SAAS,KAAK,KAAK;AAAA,EAChD;AACF;;;AC1DO,SAAS,wBACd,SACA,SACmB;AACnB,SAAO,IAAI,kBAAkB,SAAS,OAAO;AAC/C;AAGO,SAAS,aACd,OACA,QACA,eACA,UACsB;AACtB,QAAM,WAAW,IAAI,kBAAkB,QAAQ,EAAE,cAAc,CAAC;AAChE,QAAM,SAAS,SAAS,QAAQ,EAAE,OAAO,OAAO,SAAS,CAAC;AAC1D,MAAI,CAAC,OAAO,SAAS,CAAC,OAAO,OAAQ,QAAO;AAC5C,SAAO;AAAA,IACL,cAAc,OAAO;AAAA,IACrB,cAAc,OAAO;AAAA,IACrB,qBAAqB,OAAO;AAAA,EAC9B;AACF;AAEO,SAAS,sBACd,UACA,OACA,YACS;AACT,MAAI,aAAa,aAAc,QAAO;AACtC,MAAI,YAAY,aAAa,aAAc,QAAO;AAClD,SAAO,MAAM,QAAQ,SAAS,GAAG,KAAK,WAAW,SAAS,GAAG;AAC/D;","names":[]}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkBCX5CLJJcjs = require('./chunk-BCX5CLJJ.cjs');
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
var _chunkGS7T56RPcjs = require('./chunk-GS7T56RP.cjs');
|
|
12
|
+
|
|
13
|
+
// src/cost/costModelResolution.ts
|
|
14
|
+
function isOpenRouterProvider(provider) {
|
|
15
|
+
return _chunkBCX5CLJJcjs.normalizeProvider.call(void 0, provider) === "openrouter";
|
|
16
|
+
}
|
|
17
|
+
function isLocalProvider(provider) {
|
|
18
|
+
const p = _nullishCoalesce(_chunkBCX5CLJJcjs.normalizeProvider.call(void 0, provider), () => ( _chunkBCX5CLJJcjs.normalizeString.call(void 0, _nullishCoalesce(provider, () => ( "")))));
|
|
19
|
+
return _chunkBCX5CLJJcjs.LOCAL_PROVIDERS.has(p);
|
|
20
|
+
}
|
|
21
|
+
function isLocalProviderResolution(resolved, inputProvider) {
|
|
22
|
+
if (!_optionalChain([resolved, 'optionalAccess', _ => _.found]) || resolved.record) return false;
|
|
23
|
+
if (resolved.resolvedVia.includes("local-provider-passthrough")) return true;
|
|
24
|
+
return isLocalProvider(inputProvider);
|
|
25
|
+
}
|
|
26
|
+
function underlyingProviderFromModel(model, providerHint) {
|
|
27
|
+
const normalized = _chunkBCX5CLJJcjs.normalizeString.call(void 0, model);
|
|
28
|
+
if (normalized.includes("/")) {
|
|
29
|
+
const prefix = normalized.split("/")[0];
|
|
30
|
+
if (!isOpenRouterProvider(prefix)) return prefix;
|
|
31
|
+
}
|
|
32
|
+
if (providerHint && !isOpenRouterProvider(providerHint)) {
|
|
33
|
+
return _chunkBCX5CLJJcjs.normalizeProvider.call(void 0, providerHint);
|
|
34
|
+
}
|
|
35
|
+
return void 0;
|
|
36
|
+
}
|
|
37
|
+
function providerHintForProfiles(model, provider) {
|
|
38
|
+
if (isOpenRouterProvider(provider)) {
|
|
39
|
+
return underlyingProviderFromModel(model, provider);
|
|
40
|
+
}
|
|
41
|
+
return _chunkBCX5CLJJcjs.normalizeProvider.call(void 0, provider);
|
|
42
|
+
}
|
|
43
|
+
function buildCatalogResolveAttempts(model, provider) {
|
|
44
|
+
const attempts = [];
|
|
45
|
+
const seen = /* @__PURE__ */ new Set();
|
|
46
|
+
const add = (m, p) => {
|
|
47
|
+
const key = `${_nullishCoalesce(p, () => ( ""))}\0${_chunkBCX5CLJJcjs.normalizeString.call(void 0, m)}`;
|
|
48
|
+
if (seen.has(key)) return;
|
|
49
|
+
seen.add(key);
|
|
50
|
+
attempts.push({ model: m, provider: p });
|
|
51
|
+
};
|
|
52
|
+
add(model, provider);
|
|
53
|
+
const underlying = underlyingProviderFromModel(model, provider);
|
|
54
|
+
if (provider) add(model, void 0);
|
|
55
|
+
if (underlying) add(model, underlying);
|
|
56
|
+
if (!isOpenRouterProvider(provider)) {
|
|
57
|
+
add(model, "openrouter");
|
|
58
|
+
}
|
|
59
|
+
return attempts;
|
|
60
|
+
}
|
|
61
|
+
async function resolveFromCatalogAttempts(catalog, attempts, options) {
|
|
62
|
+
let last = null;
|
|
63
|
+
let localPassthrough = null;
|
|
64
|
+
for (const attempt of attempts) {
|
|
65
|
+
const result = await catalog.resolveModel(attempt, options);
|
|
66
|
+
last = result;
|
|
67
|
+
if (result.found && result.record) return result;
|
|
68
|
+
if (result.found && !result.record && isLocalProviderResolution(result, attempt.provider)) {
|
|
69
|
+
localPassthrough = result;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return _nullishCoalesce(localPassthrough, () => ( last));
|
|
73
|
+
}
|
|
74
|
+
function resolveRoutedViaOpenRouter(inputProvider, resolved, modelId, routingEnv) {
|
|
75
|
+
const env = _nullishCoalesce(routingEnv, () => ( _chunkBCX5CLJJcjs.loadOpenRouterRoutingEnv.call(void 0, )));
|
|
76
|
+
if (isOpenRouterProvider(inputProvider)) return true;
|
|
77
|
+
if (_optionalChain([resolved, 'optionalAccess', _2 => _2.found])) {
|
|
78
|
+
return resolved.routedViaOpenRouter;
|
|
79
|
+
}
|
|
80
|
+
const vendor = underlyingProviderFromModel(
|
|
81
|
+
_nullishCoalesce(_nullishCoalesce(modelId, () => ( (_optionalChain([resolved, 'optionalAccess', _3 => _3.found]) ? resolved.modelId : ""))), () => ( "")),
|
|
82
|
+
inputProvider
|
|
83
|
+
);
|
|
84
|
+
if (vendor && _chunkBCX5CLJJcjs.shouldDefaultRouteViaOpenRouter.call(void 0, vendor, env)) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// src/cost/aiProfilesMatch.ts
|
|
91
|
+
var _module = require('module');
|
|
92
|
+
var _path = require('path');
|
|
93
|
+
var _aiprofiles = require('@x12i/ai-profiles');
|
|
94
|
+
var require2 = _module.createRequire.call(void 0, _chunkGS7T56RPcjs.importMetaUrl);
|
|
95
|
+
function loadProfilesRegistry() {
|
|
96
|
+
const entry = _path.dirname.call(void 0, require2.resolve("@x12i/ai-profiles"));
|
|
97
|
+
const loader = require2(_path.join.call(void 0, entry, "loader/loadAIProfilesRegistry.js"));
|
|
98
|
+
return loader.loadAIProfilesRegistry({ source: "auto" });
|
|
99
|
+
}
|
|
100
|
+
function profileKey(value) {
|
|
101
|
+
return value.trim().toLowerCase();
|
|
102
|
+
}
|
|
103
|
+
function canonicalModelId(provider, modelId) {
|
|
104
|
+
const normalized = _chunkBCX5CLJJcjs.normalizeString.call(void 0, modelId);
|
|
105
|
+
if (normalized.includes("/")) return normalized;
|
|
106
|
+
const p = _nullishCoalesce(_chunkBCX5CLJJcjs.normalizeProvider.call(void 0, provider), () => ( _chunkBCX5CLJJcjs.normalizeString.call(void 0, provider)));
|
|
107
|
+
return `${p}/${normalized}`;
|
|
108
|
+
}
|
|
109
|
+
var cachedIndex = null;
|
|
110
|
+
function indexRegistry(registry) {
|
|
111
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
112
|
+
const add = (key, entry) => {
|
|
113
|
+
const k = profileKey(key);
|
|
114
|
+
if (!k) return;
|
|
115
|
+
const list = _nullishCoalesce(byKey.get(k), () => ( []));
|
|
116
|
+
if (list.some(
|
|
117
|
+
(e) => e.canonicalModelId === entry.canonicalModelId && e.choice === entry.choice && e.profile === entry.profile
|
|
118
|
+
)) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
list.push(entry);
|
|
122
|
+
byKey.set(k, list);
|
|
123
|
+
};
|
|
124
|
+
for (const profile of Object.values(registry.profiles)) {
|
|
125
|
+
for (const [choiceKey, choice] of Object.entries(profile.choices)) {
|
|
126
|
+
const entry = choiceEntry(choice, profile.profile, choiceKey);
|
|
127
|
+
add(choice.modelId, entry);
|
|
128
|
+
add(canonicalModelId(choice.provider, choice.modelId), entry);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return byKey;
|
|
132
|
+
}
|
|
133
|
+
function choiceEntry(choice, profile, choiceKey) {
|
|
134
|
+
const canonical = canonicalModelId(choice.provider, choice.modelId);
|
|
135
|
+
return {
|
|
136
|
+
provider: _nullishCoalesce(_chunkBCX5CLJJcjs.normalizeProvider.call(void 0, choice.provider), () => ( choice.provider)),
|
|
137
|
+
modelId: _chunkBCX5CLJJcjs.normalizeString.call(void 0, choice.modelId),
|
|
138
|
+
canonicalModelId: canonical,
|
|
139
|
+
pricing: choice.pricing,
|
|
140
|
+
profile,
|
|
141
|
+
choice: choiceKey
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
async function getProfileIndex() {
|
|
145
|
+
const registry = await loadProfilesRegistry();
|
|
146
|
+
const cacheKey = `${registry.version}:${_nullishCoalesce(registry.generatedAt, () => ( ""))}:${registry.source}`;
|
|
147
|
+
if (_optionalChain([cachedIndex, 'optionalAccess', _4 => _4.cacheKey]) === cacheKey) {
|
|
148
|
+
return cachedIndex.byKey;
|
|
149
|
+
}
|
|
150
|
+
const byKey = indexRegistry(registry);
|
|
151
|
+
cachedIndex = { cacheKey, byKey };
|
|
152
|
+
return byKey;
|
|
153
|
+
}
|
|
154
|
+
function scoreCandidate(entry, model, providerHint) {
|
|
155
|
+
const normalized = _chunkBCX5CLJJcjs.normalizeString.call(void 0, model);
|
|
156
|
+
let score = 0;
|
|
157
|
+
if (normalized === entry.canonicalModelId) score += 100;
|
|
158
|
+
if (normalized === entry.modelId) score += 80;
|
|
159
|
+
if (providerHint && entry.provider === providerHint) score += 50;
|
|
160
|
+
if (entry.pricing) score += 2;
|
|
161
|
+
return score;
|
|
162
|
+
}
|
|
163
|
+
function pickBest(candidates, model, providerHint) {
|
|
164
|
+
if (candidates.length === 0) return null;
|
|
165
|
+
if (candidates.length === 1) return candidates[0];
|
|
166
|
+
let best = candidates[0];
|
|
167
|
+
let bestScore = scoreCandidate(best, model, providerHint);
|
|
168
|
+
for (let i = 1; i < candidates.length; i++) {
|
|
169
|
+
const c = candidates[i];
|
|
170
|
+
const s = scoreCandidate(c, model, providerHint);
|
|
171
|
+
if (s > bestScore) {
|
|
172
|
+
best = c;
|
|
173
|
+
bestScore = s;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return best;
|
|
177
|
+
}
|
|
178
|
+
function resolvedToMatch(resolved) {
|
|
179
|
+
return {
|
|
180
|
+
provider: _nullishCoalesce(_chunkBCX5CLJJcjs.normalizeProvider.call(void 0, resolved.provider), () => ( resolved.provider)),
|
|
181
|
+
modelId: _chunkBCX5CLJJcjs.normalizeString.call(void 0, resolved.modelId),
|
|
182
|
+
canonicalModelId: canonicalModelId(resolved.provider, resolved.modelId),
|
|
183
|
+
pricing: resolved.pricing,
|
|
184
|
+
instructionTier: resolved.instructionTier,
|
|
185
|
+
backend: resolved.backend,
|
|
186
|
+
matchedVia: resolved.shortcut ? "shortcut" : "profile",
|
|
187
|
+
profile: resolved.profile,
|
|
188
|
+
choice: resolved.choice
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
async function fromIndexed(entry) {
|
|
192
|
+
const resolved = await _aiprofiles.resolveAIProfile.call(void 0, entry.profile, { choice: entry.choice });
|
|
193
|
+
return {
|
|
194
|
+
provider: _nullishCoalesce(_chunkBCX5CLJJcjs.normalizeProvider.call(void 0, resolved.provider), () => ( resolved.provider)),
|
|
195
|
+
modelId: _chunkBCX5CLJJcjs.normalizeString.call(void 0, resolved.modelId),
|
|
196
|
+
canonicalModelId: canonicalModelId(resolved.provider, resolved.modelId),
|
|
197
|
+
pricing: _nullishCoalesce(resolved.pricing, () => ( entry.pricing)),
|
|
198
|
+
instructionTier: resolved.instructionTier,
|
|
199
|
+
backend: resolved.backend,
|
|
200
|
+
matchedVia: "model-id",
|
|
201
|
+
profile: resolved.profile,
|
|
202
|
+
choice: resolved.choice
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
async function lookupInIndex(index, model, provider) {
|
|
206
|
+
const providerHint = provider ? _chunkBCX5CLJJcjs.normalizeProvider.call(void 0, provider) : void 0;
|
|
207
|
+
const keys = [
|
|
208
|
+
profileKey(model),
|
|
209
|
+
profileKey(_chunkBCX5CLJJcjs.normalizeString.call(void 0, model))
|
|
210
|
+
];
|
|
211
|
+
if (providerHint) {
|
|
212
|
+
keys.push(profileKey(canonicalModelId(providerHint, model)));
|
|
213
|
+
}
|
|
214
|
+
const pooled = [];
|
|
215
|
+
for (const key of keys) {
|
|
216
|
+
const hits = index.get(key);
|
|
217
|
+
if (hits) pooled.push(...hits);
|
|
218
|
+
}
|
|
219
|
+
const bare = _chunkBCX5CLJJcjs.normalizeString.call(void 0, model);
|
|
220
|
+
if (!bare.includes("/")) {
|
|
221
|
+
for (const list of index.values()) {
|
|
222
|
+
for (const entry of list) {
|
|
223
|
+
if (entry.modelId === bare) pooled.push(entry);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const unique = /* @__PURE__ */ new Map();
|
|
228
|
+
for (const e of pooled) {
|
|
229
|
+
unique.set(`${e.profile}:${e.choice}:${e.canonicalModelId}`, e);
|
|
230
|
+
}
|
|
231
|
+
const best = pickBest([...unique.values()], model, providerHint);
|
|
232
|
+
return best ? fromIndexed(best) : null;
|
|
233
|
+
}
|
|
234
|
+
async function matchModelInAiProfiles(model, provider) {
|
|
235
|
+
try {
|
|
236
|
+
const resolved = await _aiprofiles.resolveAIProfile.call(void 0, model);
|
|
237
|
+
return resolvedToMatch(resolved);
|
|
238
|
+
} catch (err) {
|
|
239
|
+
if (!(err instanceof _aiprofiles.AIProfilesError) || err.code !== "UNKNOWN_PROFILE") {
|
|
240
|
+
throw err;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const index = await getProfileIndex();
|
|
244
|
+
const hint = providerHintForProfiles(model, provider);
|
|
245
|
+
const direct = await lookupInIndex(index, model, hint);
|
|
246
|
+
if (direct) return direct;
|
|
247
|
+
const stripped = _chunkBCX5CLJJcjs.stripModelVersionSuffix.call(void 0, model);
|
|
248
|
+
if (stripped && stripped !== _chunkBCX5CLJJcjs.normalizeString.call(void 0, model)) {
|
|
249
|
+
return lookupInIndex(
|
|
250
|
+
index,
|
|
251
|
+
stripped,
|
|
252
|
+
providerHintForProfiles(stripped, provider)
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
exports.isLocalProvider = isLocalProvider; exports.isLocalProviderResolution = isLocalProviderResolution; exports.buildCatalogResolveAttempts = buildCatalogResolveAttempts; exports.resolveFromCatalogAttempts = resolveFromCatalogAttempts; exports.resolveRoutedViaOpenRouter = resolveRoutedViaOpenRouter; exports.matchModelInAiProfiles = matchModelInAiProfiles;
|
|
266
|
+
//# sourceMappingURL=chunk-WSUFQR3D.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-WSUFQR3D.cjs","../src/cost/costModelResolution.ts","../src/cost/aiProfilesMatch.ts"],"names":["require"],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACEO,SAAS,oBAAA,CAAqB,QAAA,EAA4B;AAC/D,EAAA,OAAO,iDAAA,QAA0B,EAAA,IAAM,YAAA;AACzC;AAEO,SAAS,eAAA,CAAgB,QAAA,EAA4B;AAC1D,EAAA,MAAM,EAAA,mBAAI,iDAAA,QAA0B,CAAA,UAAK,+CAAA,iBAAgB,QAAA,UAAY,IAAE,GAAA;AACvE,EAAA,OAAO,iCAAA,CAAgB,GAAA,CAAI,CAAC,CAAA;AAC9B;AAGO,SAAS,yBAAA,CACd,QAAA,EACA,aAAA,EACS;AACT,EAAA,GAAA,CAAI,iBAAC,QAAA,2BAAU,QAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,OAAO,KAAA;AAChD,EAAA,GAAA,CAAI,QAAA,CAAS,WAAA,CAAY,QAAA,CAAS,4BAA4B,CAAA,EAAG,OAAO,IAAA;AACxE,EAAA,OAAO,eAAA,CAAgB,aAAa,CAAA;AACtC;AAMO,SAAS,2BAAA,CACd,KAAA,EACA,YAAA,EACoB;AACpB,EAAA,MAAM,WAAA,EAAa,+CAAA,KAAqB,CAAA;AACxC,EAAA,GAAA,CAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,IAAA,MAAM,OAAA,EAAS,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AACtC,IAAA,GAAA,CAAI,CAAC,oBAAA,CAAqB,MAAM,CAAA,EAAG,OAAO,MAAA;AAAA,EAC5C;AACA,EAAA,GAAA,CAAI,aAAA,GAAgB,CAAC,oBAAA,CAAqB,YAAY,CAAA,EAAG;AACvD,IAAA,OAAO,iDAAA,YAA8B,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,KAAA,CAAA;AACT;AAGO,SAAS,uBAAA,CACd,KAAA,EACA,QAAA,EACoB;AACpB,EAAA,GAAA,CAAI,oBAAA,CAAqB,QAAQ,CAAA,EAAG;AAClC,IAAA,OAAO,2BAAA,CAA4B,KAAA,EAAO,QAAQ,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,iDAAA,QAA0B,CAAA;AACnC;AAMO,SAAS,2BAAA,CACd,KAAA,EACA,QAAA,EACwB;AACxB,EAAA,MAAM,SAAA,EAAmC,CAAC,CAAA;AAC1C,EAAA,MAAM,KAAA,kBAAO,IAAI,GAAA,CAAY,CAAA;AAC7B,EAAA,MAAM,IAAA,EAAM,CAAC,CAAA,EAAW,CAAA,EAAA,GAAe;AACrC,IAAA,MAAM,IAAA,EAAM,CAAA,mBAAA;AACC,IAAA;AACD,IAAA;AACH,IAAA;AACX,EAAA;AAEW,EAAA;AAEL,EAAA;AACQ,EAAA;AACE,EAAA;AACX,EAAA;AACQ,IAAA;AACb,EAAA;AAEO,EAAA;AACT;AAEsB;AAKqB,EAAA;AACrC,EAAA;AAEO,EAAA;AACH,IAAA;AACC,IAAA;AACI,IAAA;AAEF,IAAA;AAIP,MAAA;AACF,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AAEgB;AAMF,EAAA;AAER,EAAA;AAEU,EAAA;AACL,IAAA;AACT,EAAA;AAEe,EAAA;AACD,sCAAA;AACZ,IAAA;AACF,EAAA;AACc,EAAA;AACL,IAAA;AACT,EAAA;AAEO,EAAA;AACT;ADnDiB;AACA;AEzFR;AACA;AACA;AAaO;AAOP;AACO,EAAA;AACCA,EAAAA;AAGD,EAAA;AAChB;AAcS;AACM,EAAA;AACf;AAES;AACD,EAAA;AACS,EAAA;AACL,EAAA;AACK,EAAA;AACjB;AAWI;AAMK;AACO,EAAA;AAED,EAAA;AACD,IAAA;AACF,IAAA;AACK,IAAA;AAEN,IAAA;AAEC,MAAA;AAIN,IAAA;AACA,MAAA;AACF,IAAA;AACU,IAAA;AACG,IAAA;AACf,EAAA;AAEW,EAAA;AACG,IAAA;AACJ,MAAA;AACK,MAAA;AACP,MAAA;AACN,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AAES;AAKD,EAAA;AACC,EAAA;AACK,IAAA;AACD,IAAA;AACT,IAAA;AACS,IAAA;AACT,IAAA;AACQ,IAAA;AACV,EAAA;AACF;AAEe;AACP,EAAA;AACA,EAAA;AACF,EAAA;AACK,IAAA;AACT,EAAA;AACc,EAAA;AACA,EAAA;AACP,EAAA;AACT;AAES;AAKD,EAAA;AACM,EAAA;AAER,EAAA;AACA,EAAA;AACA,EAAA;AACM,EAAA;AAEH,EAAA;AACT;AAES;AAKQ,EAAA;AACA,EAAA;AAEJ,EAAA;AACP,EAAA;AACS,EAAA;AACD,IAAA;AACA,IAAA;AACF,IAAA;AACC,MAAA;AACP,MAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAES;AACA,EAAA;AACK,IAAA;AACD,IAAA;AACT,IAAA;AACS,IAAA;AACT,IAAA;AACS,IAAA;AACG,IAAA;AACH,IAAA;AACD,IAAA;AACV,EAAA;AACF;AAEe;AACP,EAAA;AACC,EAAA;AACK,IAAA;AACD,IAAA;AACT,IAAA;AACS,IAAA;AACT,IAAA;AACS,IAAA;AACG,IAAA;AACH,IAAA;AACD,IAAA;AACV,EAAA;AACF;AAEe;AAKP,EAAA;AACO,EAAA;AACA,IAAA;AACA,IAAA;AACb,EAAA;AACI,EAAA;AACQ,IAAA;AACZ,EAAA;AAEgC,EAAA;AACrB,EAAA;AACI,IAAA;AACH,IAAA;AACZ,EAAA;AAEa,EAAA;AACH,EAAA;AACG,IAAA;AACE,MAAA;AACL,QAAA;AACN,MAAA;AACF,IAAA;AACF,EAAA;AAEe,EAAA;AACJ,EAAA;AACE,IAAA;AACb,EAAA;AAEa,EAAA;AACC,EAAA;AAChB;AAMsB;AAIhB,EAAA;AACI,IAAA;AACC,IAAA;AACK,EAAA;AACN,IAAA;AACE,MAAA;AACR,IAAA;AACF,EAAA;AAEc,EAAA;AACD,EAAA;AACE,EAAA;AACH,EAAA;AAEN,EAAA;AACF,EAAA;AACK,IAAA;AACL,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAEO,EAAA;AACT;AFPiB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-WSUFQR3D.cjs","sourcesContent":[null,"import type { AiModelsCatalogClient } from \"../catalog/AiModelsCatalogClient.js\";\nimport { LOCAL_PROVIDERS } from \"../sync/modelNameResolver/constants.js\";\nimport {\n loadOpenRouterRoutingEnv,\n shouldDefaultRouteViaOpenRouter,\n} from \"../sync/openRouterRoutingEnv.js\";\nimport { normalizeProvider, normalizeString } from \"../sync/modelNameResolver/normalize.js\";\nimport type {\n ModelResolutionInput,\n ModelResolutionResult,\n ModelResolverOptions,\n} from \"../sync/modelNameResolver/types.js\";\nimport type { OpenRouterRoutingConfig } from \"../sync/openRouterRoutingEnv.js\";\n\nexport function isOpenRouterProvider(provider?: string): boolean {\n return normalizeProvider(provider) === \"openrouter\";\n}\n\nexport function isLocalProvider(provider?: string): boolean {\n const p = normalizeProvider(provider) ?? normalizeString(provider ?? \"\");\n return LOCAL_PROVIDERS.has(p);\n}\n\n/** Catalog resolver returned success without a priced record (Ollama, LM Studio, …). */\nexport function isLocalProviderResolution(\n resolved: ModelResolutionResult | null,\n inputProvider?: string,\n): boolean {\n if (!resolved?.found || resolved.record) return false;\n if (resolved.resolvedVia.includes(\"local-provider-passthrough\")) return true;\n return isLocalProvider(inputProvider);\n}\n\n/**\n * Vendor id for a model slug (`openai/gpt-4o` → `openai`).\n * Ignores `openrouter` as a provider hint — it is a routing layer, not the model owner.\n */\nexport function underlyingProviderFromModel(\n model: string,\n providerHint?: string,\n): string | undefined {\n const normalized = normalizeString(model);\n if (normalized.includes(\"/\")) {\n const prefix = normalized.split(\"/\")[0]!;\n if (!isOpenRouterProvider(prefix)) return prefix;\n }\n if (providerHint && !isOpenRouterProvider(providerHint)) {\n return normalizeProvider(providerHint);\n }\n return undefined;\n}\n\n/** Provider hint for ai-profiles index lookup (openrouter → underlying vendor). */\nexport function providerHintForProfiles(\n model: string,\n provider?: string,\n): string | undefined {\n if (isOpenRouterProvider(provider)) {\n return underlyingProviderFromModel(model, provider);\n }\n return normalizeProvider(provider);\n}\n\n/**\n * Catalog resolve attempts for direct API and OpenRouter usage.\n * Tries the caller hint, inferred vendor, no hint, and openrouter routing.\n */\nexport function buildCatalogResolveAttempts(\n model: string,\n provider?: string,\n): ModelResolutionInput[] {\n const attempts: ModelResolutionInput[] = [];\n const seen = new Set<string>();\n const add = (m: string, p?: string) => {\n const key = `${p ?? \"\"}\\0${normalizeString(m)}`;\n if (seen.has(key)) return;\n seen.add(key);\n attempts.push({ model: m, provider: p });\n };\n\n add(model, provider);\n\n const underlying = underlyingProviderFromModel(model, provider);\n if (provider) add(model, undefined);\n if (underlying) add(model, underlying);\n if (!isOpenRouterProvider(provider)) {\n add(model, \"openrouter\");\n }\n\n return attempts;\n}\n\nexport async function resolveFromCatalogAttempts(\n catalog: AiModelsCatalogClient,\n attempts: ModelResolutionInput[],\n options?: ModelResolverOptions,\n): Promise<ModelResolutionResult | null> {\n let last: ModelResolutionResult | null = null;\n let localPassthrough: ModelResolutionResult | null = null;\n\n for (const attempt of attempts) {\n const result = await catalog.resolveModel(attempt, options);\n last = result;\n if (result.found && result.record) return result;\n if (\n result.found &&\n !result.record &&\n isLocalProviderResolution(result, attempt.provider)\n ) {\n localPassthrough = result;\n }\n }\n\n return localPassthrough ?? last;\n}\n\nexport function resolveRoutedViaOpenRouter(\n inputProvider: string | undefined,\n resolved: ModelResolutionResult | null,\n modelId?: string,\n routingEnv?: OpenRouterRoutingConfig,\n): boolean {\n const env = routingEnv ?? loadOpenRouterRoutingEnv();\n\n if (isOpenRouterProvider(inputProvider)) return true;\n\n if (resolved?.found) {\n return resolved.routedViaOpenRouter;\n }\n\n const vendor = underlyingProviderFromModel(\n modelId ?? (resolved?.found ? resolved.modelId : \"\") ?? \"\",\n inputProvider,\n );\n if (vendor && shouldDefaultRouteViaOpenRouter(vendor, env)) {\n return true;\n }\n\n return false;\n}\n","import { createRequire } from \"node:module\";\nimport { dirname, join } from \"node:path\";\nimport { AIProfilesError, resolveAIProfile } from \"@x12i/ai-profiles\";\nimport type {\n AIProfileBackend,\n AIProfileChoice,\n AIModelPricing,\n AIProfilesRegistry,\n InstructionTier,\n ResolvedAIProfile,\n} from \"@x12i/ai-profiles\";\nimport { providerHintForProfiles } from \"./costModelResolution.js\";\nimport { normalizeProvider, normalizeString } from \"../sync/modelNameResolver/normalize.js\";\nimport { stripModelVersionSuffix } from \"../sync/modelNameResolver/stripVersionSuffix.js\";\n\nconst require = createRequire(import.meta.url);\n\ntype LoadRegistryFn = (options?: {\n source?: \"auto\" | \"remote\" | \"bundled\";\n refresh?: boolean;\n}) => Promise<AIProfilesRegistry>;\n\nfunction loadProfilesRegistry(): Promise<AIProfilesRegistry> {\n const entry = dirname(require.resolve(\"@x12i/ai-profiles\"));\n const loader = require(join(entry, \"loader/loadAIProfilesRegistry.js\")) as {\n loadAIProfilesRegistry: LoadRegistryFn;\n };\n return loader.loadAIProfilesRegistry({ source: \"auto\" });\n}\n\nexport type AiProfilesModelMatch = {\n provider: string;\n modelId: string;\n canonicalModelId: string;\n pricing?: AIModelPricing;\n instructionTier: InstructionTier;\n backend: AIProfileBackend;\n matchedVia: \"profile\" | \"shortcut\" | \"profile-alias\" | \"model-id\";\n profile?: string;\n choice?: string;\n};\n\nfunction profileKey(value: string): string {\n return value.trim().toLowerCase();\n}\n\nfunction canonicalModelId(provider: string, modelId: string): string {\n const normalized = normalizeString(modelId);\n if (normalized.includes(\"/\")) return normalized;\n const p = normalizeProvider(provider) ?? normalizeString(provider);\n return `${p}/${normalized}`;\n}\n\ntype IndexedChoice = {\n provider: string;\n modelId: string;\n canonicalModelId: string;\n pricing?: AIModelPricing;\n profile: string;\n choice: string;\n};\n\nlet cachedIndex: {\n cacheKey: string;\n byKey: Map<string, IndexedChoice[]>;\n} | null = null;\n\n/** Index bare model ids only — profile/shortcut names resolve via {@link resolveAIProfile}. */\nfunction indexRegistry(registry: AIProfilesRegistry): Map<string, IndexedChoice[]> {\n const byKey = new Map<string, IndexedChoice[]>();\n\n const add = (key: string, entry: IndexedChoice) => {\n const k = profileKey(key);\n if (!k) return;\n const list = byKey.get(k) ?? [];\n if (\n list.some(\n (e) =>\n e.canonicalModelId === entry.canonicalModelId &&\n e.choice === entry.choice &&\n e.profile === entry.profile,\n )\n ) {\n return;\n }\n list.push(entry);\n byKey.set(k, list);\n };\n\n for (const profile of Object.values(registry.profiles)) {\n for (const [choiceKey, choice] of Object.entries(profile.choices)) {\n const entry = choiceEntry(choice, profile.profile, choiceKey);\n add(choice.modelId, entry);\n add(canonicalModelId(choice.provider, choice.modelId), entry);\n }\n }\n\n return byKey;\n}\n\nfunction choiceEntry(\n choice: AIProfileChoice,\n profile: string,\n choiceKey: string,\n): IndexedChoice {\n const canonical = canonicalModelId(choice.provider, choice.modelId);\n return {\n provider: normalizeProvider(choice.provider) ?? choice.provider,\n modelId: normalizeString(choice.modelId),\n canonicalModelId: canonical,\n pricing: choice.pricing,\n profile,\n choice: choiceKey,\n };\n}\n\nasync function getProfileIndex(): Promise<Map<string, IndexedChoice[]>> {\n const registry = await loadProfilesRegistry();\n const cacheKey = `${registry.version}:${registry.generatedAt ?? \"\"}:${registry.source}`;\n if (cachedIndex?.cacheKey === cacheKey) {\n return cachedIndex.byKey;\n }\n const byKey = indexRegistry(registry);\n cachedIndex = { cacheKey, byKey };\n return byKey;\n}\n\nfunction scoreCandidate(\n entry: IndexedChoice,\n model: string,\n providerHint?: string,\n): number {\n const normalized = normalizeString(model);\n let score = 0;\n\n if (normalized === entry.canonicalModelId) score += 100;\n if (normalized === entry.modelId) score += 80;\n if (providerHint && entry.provider === providerHint) score += 50;\n if (entry.pricing) score += 2;\n\n return score;\n}\n\nfunction pickBest(\n candidates: IndexedChoice[],\n model: string,\n providerHint?: string,\n): IndexedChoice | null {\n if (candidates.length === 0) return null;\n if (candidates.length === 1) return candidates[0]!;\n\n let best = candidates[0]!;\n let bestScore = scoreCandidate(best, model, providerHint);\n for (let i = 1; i < candidates.length; i++) {\n const c = candidates[i]!;\n const s = scoreCandidate(c, model, providerHint);\n if (s > bestScore) {\n best = c;\n bestScore = s;\n }\n }\n return best;\n}\n\nfunction resolvedToMatch(resolved: ResolvedAIProfile): AiProfilesModelMatch {\n return {\n provider: normalizeProvider(resolved.provider) ?? resolved.provider,\n modelId: normalizeString(resolved.modelId),\n canonicalModelId: canonicalModelId(resolved.provider, resolved.modelId),\n pricing: resolved.pricing,\n instructionTier: resolved.instructionTier,\n backend: resolved.backend,\n matchedVia: resolved.shortcut ? \"shortcut\" : \"profile\",\n profile: resolved.profile,\n choice: resolved.choice,\n };\n}\n\nasync function fromIndexed(entry: IndexedChoice): Promise<AiProfilesModelMatch> {\n const resolved = await resolveAIProfile(entry.profile, { choice: entry.choice });\n return {\n provider: normalizeProvider(resolved.provider) ?? resolved.provider,\n modelId: normalizeString(resolved.modelId),\n canonicalModelId: canonicalModelId(resolved.provider, resolved.modelId),\n pricing: resolved.pricing ?? entry.pricing,\n instructionTier: resolved.instructionTier,\n backend: resolved.backend,\n matchedVia: \"model-id\",\n profile: resolved.profile,\n choice: resolved.choice,\n };\n}\n\nasync function lookupInIndex(\n index: Map<string, IndexedChoice[]>,\n model: string,\n provider?: string,\n): Promise<AiProfilesModelMatch | null> {\n const providerHint = provider ? normalizeProvider(provider) : undefined;\n const keys = [\n profileKey(model),\n profileKey(normalizeString(model)),\n ];\n if (providerHint) {\n keys.push(profileKey(canonicalModelId(providerHint, model)));\n }\n\n const pooled: IndexedChoice[] = [];\n for (const key of keys) {\n const hits = index.get(key);\n if (hits) pooled.push(...hits);\n }\n\n const bare = normalizeString(model);\n if (!bare.includes(\"/\")) {\n for (const list of index.values()) {\n for (const entry of list) {\n if (entry.modelId === bare) pooled.push(entry);\n }\n }\n }\n\n const unique = new Map<string, IndexedChoice>();\n for (const e of pooled) {\n unique.set(`${e.profile}:${e.choice}:${e.canonicalModelId}`, e);\n }\n\n const best = pickBest([...unique.values()], model, providerHint);\n return best ? fromIndexed(best) : null;\n}\n\n/**\n * Resolve a model string via @x12i/ai-profiles — profile/shortcut names, aliases,\n * or a concrete model id that appears on a profile choice.\n */\nexport async function matchModelInAiProfiles(\n model: string,\n provider?: string,\n): Promise<AiProfilesModelMatch | null> {\n try {\n const resolved = await resolveAIProfile(model);\n return resolvedToMatch(resolved);\n } catch (err) {\n if (!(err instanceof AIProfilesError) || err.code !== \"UNKNOWN_PROFILE\") {\n throw err;\n }\n }\n\n const index = await getProfileIndex();\n const hint = providerHintForProfiles(model, provider);\n const direct = await lookupInIndex(index, model, hint);\n if (direct) return direct;\n\n const stripped = stripModelVersionSuffix(model);\n if (stripped && stripped !== normalizeString(model)) {\n return lookupInIndex(\n index,\n stripped,\n providerHintForProfiles(stripped, provider),\n );\n }\n\n return null;\n}\n\n/** @internal Test-only — reset module cache between tests. */\nexport function resetAiProfilesMatchCacheForTests(): void {\n cachedIndex = null;\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkTMA6QSNHcjs = require('./chunk-TMA6QSNH.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunkRSHI4OOYcjs = require('./chunk-RSHI4OOY.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
var _chunkPADNCGZBcjs = require('./chunk-PADNCGZB.cjs');
|
|
@@ -58,7 +58,7 @@ var OpenRouterSyncProvider = class {
|
|
|
58
58
|
}
|
|
59
59
|
const json = await response.json();
|
|
60
60
|
const syncedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
61
|
-
return (_nullishCoalesce(json.data, () => ( []))).map((row) =>
|
|
61
|
+
return (_nullishCoalesce(json.data, () => ( []))).map((row) => _chunkTMA6QSNHcjs.normalizeOpenRouterModel.call(void 0, row, syncedAt));
|
|
62
62
|
}
|
|
63
63
|
/** Build the URL used for the last fetch pattern (for debugging). */
|
|
64
64
|
getModelsUrl() {
|
|
@@ -68,10 +68,10 @@ var OpenRouterSyncProvider = class {
|
|
|
68
68
|
|
|
69
69
|
// src/sync/modelNameResolver.ts
|
|
70
70
|
function createModelNameResolver(catalog, options) {
|
|
71
|
-
return new (0,
|
|
71
|
+
return new (0, _chunkRSHI4OOYcjs.ModelNameResolver)(catalog, options);
|
|
72
72
|
}
|
|
73
73
|
function resolveModel(input, models, aliasRegistry, provider) {
|
|
74
|
-
const resolver = new (0,
|
|
74
|
+
const resolver = new (0, _chunkRSHI4OOYcjs.ModelNameResolver)(models, { aliasRegistry });
|
|
75
75
|
const result = resolver.resolve({ model: input, provider });
|
|
76
76
|
if (!result.found || !result.record) return null;
|
|
77
77
|
return {
|
|
@@ -92,4 +92,4 @@ function isRoutedViaOpenRouter(provider, model, matchedKey) {
|
|
|
92
92
|
|
|
93
93
|
|
|
94
94
|
exports.OpenRouterSyncProvider = OpenRouterSyncProvider; exports.createModelNameResolver = createModelNameResolver; exports.resolveModel = resolveModel; exports.isRoutedViaOpenRouter = isRoutedViaOpenRouter;
|
|
95
|
-
//# sourceMappingURL=chunk-
|
|
95
|
+
//# sourceMappingURL=chunk-X42KFOUO.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-X42KFOUO.cjs","../src/sync/OpenRouterSyncProvider.ts","../src/sync/modelNameResolver.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACMA,SAAS,iBAAA,CAAkB,MAAA,EAAyC;AAClE,EAAA,MAAM,QAAA,EAAkC,EAAE,MAAA,EAAQ,mBAAmB,CAAA;AACrE,EAAA,GAAA,iBAAI,MAAA,2BAAQ,IAAA,mBAAK,GAAA,EAAG,OAAA,CAAQ,cAAA,EAAgB,CAAA,OAAA,EAAU,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAA;AAC5D,EAAA;AACT;AAEgF;AACpB,EAAA;AACX,EAAA;AACD,EAAA;AACuB,IAAA;AACrE,EAAA;AACoB,EAAA;AACtB;AAEoC;AACjB,EAAA;AACA,EAAA;AACA,EAAA;AAEwC,EAAA;AACjC,IAAA;AACY,IAAA;AACuB,IAAA;AAC3D,EAAA;AAAA;AAAA;AAAA;AAAA;AAM8C,EAAA;AACO,IAAA;AAC/C,IAAA;AAEA,IAAA;AAC4D,MAAA;AAChD,IAAA;AACwC,MAAA;AACxD,IAAA;AAEwD,IAAA;AAC5C,MAAA;AACR,QAAA;AAEI,QAAA;AAEN,MAAA;AACF,IAAA;AAEkB,IAAA;AACiC,MAAA;AACvC,MAAA;AACR,QAAA;AAC6D,QAAA;AAC/D,MAAA;AACF,IAAA;AAEkC,IAAA;AACM,IAAA;AACuB,IAAA;AACjE,EAAA;AAAA;AAGuB,EAAA;AACyB,IAAA;AAChD,EAAA;AACF;ADfsE;AACA;AEzCjD;AAC0B,EAAA;AAC/C;AAQwB;AAC0C,EAAA;AACN,EAAA;AACd,EAAA;AACrC,EAAA;AACgB,IAAA;AACA,IAAA;AACO,IAAA;AAC9B,EAAA;AACF;AAMW;AAC6B,EAAA;AACY,EAAA;AACW,EAAA;AAC/D;AF+BsE;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-X42KFOUO.cjs","sourcesContent":[null,"import { SyncError } from \"../errors.js\";\nimport { normalizeOpenRouterModel } from \"../models/normalizeOpenRouterModel.js\";\nimport type { AiModelRecord } from \"../models/types.js\";\nimport type {\n OpenRouterModelsQuery,\n OpenRouterModelsResponse,\n} from \"../models/openrouter.types.js\";\n\nexport type OpenRouterSyncProviderOptions = {\n /** Optional — public GET /models needs no key. */\n apiKey?: string;\n baseUrl?: string;\n /** Query params passed to OpenRouter (default: all modalities). */\n query?: OpenRouterModelsQuery;\n};\n\nfunction buildFetchHeaders(apiKey?: string): Record<string, string> {\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (apiKey?.trim()) headers.Authorization = `Bearer ${apiKey.trim()}`;\n return headers;\n}\n\nfunction buildModelsUrl(baseUrl: string, query?: OpenRouterModelsQuery): string {\n const url = new URL(`${baseUrl.replace(/\\/$/, \"\")}/models`);\n const q = { output_modalities: \"all\", ...query };\n for (const [key, value] of Object.entries(q)) {\n if (value !== undefined && value !== \"\") url.searchParams.set(key, value);\n }\n return url.toString();\n}\n\nexport class OpenRouterSyncProvider {\n private readonly apiKey?: string;\n private readonly baseUrl: string;\n private readonly query?: OpenRouterModelsQuery;\n\n constructor(options: OpenRouterSyncProviderOptions = {}) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://openrouter.ai/api/v1\";\n this.query = options.query ?? { output_modalities: \"all\" };\n }\n\n /**\n * Fetches the full OpenRouter model catalog (public, no API key required).\n * @see https://openrouter.ai/api/v1/models\n */\n async fetchModels(): Promise<AiModelRecord[]> {\n const url = buildModelsUrl(this.baseUrl, this.query);\n let response: Response;\n\n try {\n response = await fetch(url, { headers: buildFetchHeaders(this.apiKey) });\n } catch (cause) {\n throw new SyncError(\"OPENROUTER_MODELS_FETCH_FAILED\", `Failed to fetch OpenRouter models from ${url}`, cause);\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new SyncError(\n \"OPENROUTER_AUTH_FAILED\",\n this.apiKey\n ? \"OpenRouter API key is invalid or unauthorized.\"\n : \"OpenRouter returned unauthorized — remove OPENROUTER_API_KEY to use the public models endpoint.\",\n );\n }\n\n if (!response.ok) {\n const body = await response.text().catch(() => \"\");\n throw new SyncError(\n \"OPENROUTER_MODELS_FETCH_FAILED\",\n `OpenRouter models fetch failed (${response.status}): ${body.slice(0, 200)}`,\n );\n }\n\n const json = (await response.json()) as OpenRouterModelsResponse;\n const syncedAt = new Date().toISOString();\n return (json.data ?? []).map((row) => normalizeOpenRouterModel(row, syncedAt));\n }\n\n /** Build the URL used for the last fetch pattern (for debugging). */\n getModelsUrl(): string {\n return buildModelsUrl(this.baseUrl, this.query);\n }\n}\n","import type { AliasRegistry } from \"../aliases/AliasRegistry.js\";\nimport type { AiModelRecord } from \"../models/types.js\";\nimport { ModelNameResolver } from \"./modelNameResolver/ModelNameResolver.js\";\nimport type {\n ModelResolutionInput,\n ModelResolutionResult,\n ModelResolutionSuccess,\n ModelResolverOptions,\n ResolvedModel,\n} from \"./modelNameResolver/types.js\";\n\nexport { ModelNameResolver } from \"./modelNameResolver/ModelNameResolver.js\";\nexport { buildCatalogIndexes } from \"./modelNameResolver/catalogIndexes.js\";\nexport * from \"./modelNameResolver/types.js\";\nexport {\n loadOpenRouterRoutingEnv,\n shouldDefaultRouteViaOpenRouter,\n isEffectiveOpenRouterTransport,\n providerIdToEnvKeyPrefix,\n vendorApiKeyEnvName,\n} from \"./openRouterRoutingEnv.js\";\nexport type { OpenRouterRoutingConfig } from \"./openRouterRoutingEnv.js\";\nexport { normalizeString, normalizeProvider } from \"./modelNameResolver/normalize.js\";\n\nexport function createModelNameResolver(\n catalog: Map<string, AiModelRecord>,\n options?: ModelResolverOptions,\n): ModelNameResolver {\n return new ModelNameResolver(catalog, options);\n}\n\n/** Resolve a model string; returns catalog record only (no resolution metadata). */\nexport function resolveModel(\n input: string,\n models: Map<string, AiModelRecord>,\n aliasRegistry?: AliasRegistry,\n provider?: string,\n): ResolvedModel | null {\n const resolver = new ModelNameResolver(models, { aliasRegistry });\n const result = resolver.resolve({ model: input, provider });\n if (!result.found || !result.record) return null;\n return {\n catalogModel: result.record,\n matchedAlias: result.modelId,\n routedViaOpenRouter: result.routedViaOpenRouter,\n };\n}\n\nexport function isRoutedViaOpenRouter(\n provider: string | undefined,\n model: AiModelRecord,\n matchedKey: string,\n): boolean {\n if (provider === \"openrouter\") return true;\n if (provider && provider !== \"openrouter\") return false;\n return model.modelId.includes(\"/\") && matchedKey.includes(\"/\");\n}\n\nexport type {\n ModelResolutionInput,\n ModelResolutionResult,\n ModelResolutionSuccess,\n ModelResolverOptions,\n};\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// src/profiles/resolveProfileForAsk.ts
|
|
2
|
+
import { resolveAIProfile } from "@x12i/ai-profiles";
|
|
3
|
+
function profileConfigFromResolved(resolved) {
|
|
4
|
+
return {
|
|
5
|
+
provider: resolved.provider,
|
|
6
|
+
model: resolved.modelId,
|
|
7
|
+
instructionTier: resolved.instructionTier,
|
|
8
|
+
backend: resolved.backend,
|
|
9
|
+
profile: resolved.profile,
|
|
10
|
+
choice: resolved.choice,
|
|
11
|
+
temperature: resolved.runtime.temperature,
|
|
12
|
+
outputMode: resolved.runtime.outputMode,
|
|
13
|
+
toolPolicy: resolved.runtime.toolPolicy,
|
|
14
|
+
reasoningEffort: resolved.runtime.reasoningEffort,
|
|
15
|
+
executionMode: resolved.runtime.executionMode,
|
|
16
|
+
requireCitations: resolved.runtime.requireCitations,
|
|
17
|
+
allowWeb: resolved.runtime.allowWeb,
|
|
18
|
+
allowFileSearch: resolved.runtime.allowFileSearch,
|
|
19
|
+
allowCodeExecution: resolved.runtime.allowCodeExecution,
|
|
20
|
+
humanReview: resolved.runtime.humanReview,
|
|
21
|
+
...resolved.metadata !== void 0 ? { metadata: resolved.metadata } : {},
|
|
22
|
+
...resolved.pricing !== void 0 ? { pricing: resolved.pricing } : {},
|
|
23
|
+
resolved
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async function resolveProfileForAsk(input) {
|
|
27
|
+
const resolved = await resolveAIProfile(input.profile, {
|
|
28
|
+
choice: input.choice,
|
|
29
|
+
source: input.source,
|
|
30
|
+
refresh: input.refresh
|
|
31
|
+
});
|
|
32
|
+
return profileConfigFromResolved(resolved);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// src/profiles/index.ts
|
|
36
|
+
import {
|
|
37
|
+
resolveAIProfile as resolveAIProfile2,
|
|
38
|
+
listAIProfiles,
|
|
39
|
+
listAIShortcuts,
|
|
40
|
+
isKnownProfileOrShortcut
|
|
41
|
+
} from "@x12i/ai-profiles";
|
|
42
|
+
|
|
43
|
+
export {
|
|
44
|
+
profileConfigFromResolved,
|
|
45
|
+
resolveProfileForAsk,
|
|
46
|
+
resolveAIProfile2 as resolveAIProfile,
|
|
47
|
+
listAIProfiles,
|
|
48
|
+
listAIShortcuts,
|
|
49
|
+
isKnownProfileOrShortcut
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=chunk-YQVY7CWT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/profiles/resolveProfileForAsk.ts","../src/profiles/index.ts"],"sourcesContent":["import { resolveAIProfile } from \"@x12i/ai-profiles\";\nimport type {\n AIProfileBackend,\n InstructionTier,\n RegistrySourceMode,\n ResolvedAIProfile,\n} from \"@x12i/ai-profiles\";\n\nexport type ResolveProfileForAskInput = {\n profile: string;\n choice?: string;\n source?: RegistrySourceMode;\n refresh?: boolean;\n};\n\n/** FuncX / ask-node model config derived from {@link ResolvedAIProfile}. */\nexport type AskProfileModelConfig = {\n provider: ResolvedAIProfile[\"provider\"];\n model: string;\n instructionTier: InstructionTier;\n backend: AIProfileBackend;\n profile: string;\n choice: string;\n temperature: number;\n outputMode: ResolvedAIProfile[\"runtime\"][\"outputMode\"];\n toolPolicy: ResolvedAIProfile[\"runtime\"][\"toolPolicy\"];\n reasoningEffort: ResolvedAIProfile[\"runtime\"][\"reasoningEffort\"];\n executionMode: ResolvedAIProfile[\"runtime\"][\"executionMode\"];\n requireCitations: boolean;\n allowWeb: boolean;\n allowFileSearch: boolean;\n allowCodeExecution: boolean;\n humanReview: ResolvedAIProfile[\"runtime\"][\"humanReview\"];\n metadata?: Record<string, unknown>;\n pricing?: ResolvedAIProfile[\"pricing\"];\n resolved: ResolvedAIProfile;\n};\n\nexport function profileConfigFromResolved(\n resolved: ResolvedAIProfile,\n): AskProfileModelConfig {\n return {\n provider: resolved.provider,\n model: resolved.modelId,\n instructionTier: resolved.instructionTier,\n backend: resolved.backend,\n profile: resolved.profile,\n choice: resolved.choice,\n temperature: resolved.runtime.temperature,\n outputMode: resolved.runtime.outputMode,\n toolPolicy: resolved.runtime.toolPolicy,\n reasoningEffort: resolved.runtime.reasoningEffort,\n executionMode: resolved.runtime.executionMode,\n requireCitations: resolved.runtime.requireCitations,\n allowWeb: resolved.runtime.allowWeb,\n allowFileSearch: resolved.runtime.allowFileSearch,\n allowCodeExecution: resolved.runtime.allowCodeExecution,\n humanReview: resolved.runtime.humanReview,\n ...(resolved.metadata !== undefined ? { metadata: resolved.metadata } : {}),\n ...(resolved.pricing !== undefined ? { pricing: resolved.pricing } : {}),\n resolved,\n };\n}\n\n/**\n * Resolve a profile (+ optional choice) into ask-node / FuncX model configuration.\n * Uses {@link ResolvedAIProfile.instructionTier} and {@link ResolvedAIProfile.backend}\n * from `@x12i/ai-profiles` — do not duplicate preset tables locally.\n */\nexport async function resolveProfileForAsk(\n input: ResolveProfileForAskInput,\n): Promise<AskProfileModelConfig> {\n const resolved = await resolveAIProfile(input.profile, {\n choice: input.choice,\n source: input.source,\n refresh: input.refresh,\n });\n return profileConfigFromResolved(resolved);\n}\n","export {\n resolveProfileForAsk,\n profileConfigFromResolved,\n} from \"./resolveProfileForAsk.js\";\nexport type {\n AskProfileModelConfig,\n ResolveProfileForAskInput,\n} from \"./resolveProfileForAsk.js\";\n\nexport type {\n ResolvedAIProfile,\n InstructionTier,\n AIProfileBackend,\n AIProfileSummary,\n AIShortcutSummary,\n ResolveAIProfileOptions,\n RegistrySourceMode,\n} from \"@x12i/ai-profiles\";\n\nexport {\n resolveAIProfile,\n listAIProfiles,\n listAIShortcuts,\n isKnownProfileOrShortcut,\n} from \"@x12i/ai-profiles\";\n"],"mappings":";AAAA,SAAS,wBAAwB;AAsC1B,SAAS,0BACd,UACuB;AACvB,SAAO;AAAA,IACL,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,IAChB,iBAAiB,SAAS;AAAA,IAC1B,SAAS,SAAS;AAAA,IAClB,SAAS,SAAS;AAAA,IAClB,QAAQ,SAAS;AAAA,IACjB,aAAa,SAAS,QAAQ;AAAA,IAC9B,YAAY,SAAS,QAAQ;AAAA,IAC7B,YAAY,SAAS,QAAQ;AAAA,IAC7B,iBAAiB,SAAS,QAAQ;AAAA,IAClC,eAAe,SAAS,QAAQ;AAAA,IAChC,kBAAkB,SAAS,QAAQ;AAAA,IACnC,UAAU,SAAS,QAAQ;AAAA,IAC3B,iBAAiB,SAAS,QAAQ;AAAA,IAClC,oBAAoB,SAAS,QAAQ;AAAA,IACrC,aAAa,SAAS,QAAQ;AAAA,IAC9B,GAAI,SAAS,aAAa,SAAY,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,IACzE,GAAI,SAAS,YAAY,SAAY,EAAE,SAAS,SAAS,QAAQ,IAAI,CAAC;AAAA,IACtE;AAAA,EACF;AACF;AAOA,eAAsB,qBACpB,OACgC;AAChC,QAAM,WAAW,MAAM,iBAAiB,MAAM,SAAS;AAAA,IACrD,QAAQ,MAAM;AAAA,IACd,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,EACjB,CAAC;AACD,SAAO,0BAA0B,QAAQ;AAC3C;;;AC3DA;AAAA,EACE,oBAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":["resolveAIProfile"]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
DEFAULT_DIRECT_CATALOG_URL,
|
|
4
4
|
DEFAULT_OPENROUTER_CATALOG_URL,
|
|
5
5
|
loadCatalogSourcesCached
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-D6OIUYNC.js";
|
|
7
7
|
|
|
8
8
|
// src/catalog/catalogMaintenance.ts
|
|
9
9
|
async function refreshAiModelsCatalog(options = {}) {
|
|
@@ -43,4 +43,4 @@ export {
|
|
|
43
43
|
refreshAiModelsCatalog,
|
|
44
44
|
verifyAiModelsCatalog
|
|
45
45
|
};
|
|
46
|
-
//# sourceMappingURL=chunk-
|
|
46
|
+
//# sourceMappingURL=chunk-ZPUZ7DBO.js.map
|
package/dist/cli/index.cjs
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkDDRWORUUcjs = require('../chunk-DDRWORUU.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
var _chunkBAHBDADJcjs = require('../chunk-BAHBDADJ.cjs');
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var
|
|
11
|
+
var _chunk76FHWQH3cjs = require('../chunk-76FHWQH3.cjs');
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
var
|
|
15
|
+
var _chunk75ZVXZAVcjs = require('../chunk-75ZVXZAV.cjs');
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
var
|
|
20
|
-
require('../chunk-
|
|
21
|
-
require('../chunk-
|
|
19
|
+
var _chunkHBNYVRLZcjs = require('../chunk-HBNYVRLZ.cjs');
|
|
20
|
+
require('../chunk-WSUFQR3D.cjs');
|
|
21
|
+
require('../chunk-RSHI4OOY.cjs');
|
|
22
|
+
require('../chunk-BCX5CLJJ.cjs');
|
|
22
23
|
require('../chunk-PADNCGZB.cjs');
|
|
23
24
|
|
|
24
25
|
|
|
@@ -35,8 +36,8 @@ function registry(path) {
|
|
|
35
36
|
function resolver(path) {
|
|
36
37
|
return new (0, _chunkBAHBDADJcjs.AliasResolver)({
|
|
37
38
|
registry: registry(path),
|
|
38
|
-
catalogClient: new (0,
|
|
39
|
-
cacheTtlMs:
|
|
39
|
+
catalogClient: new (0, _chunkHBNYVRLZcjs.AiModelsCatalogClient)({
|
|
40
|
+
cacheTtlMs: _chunkHBNYVRLZcjs.resolveCatalogCacheTtlMs.call(void 0, )
|
|
40
41
|
})
|
|
41
42
|
});
|
|
42
43
|
}
|
|
@@ -161,7 +162,7 @@ function emitHuman(lines) {
|
|
|
161
162
|
function registerCatalogCommand(program2) {
|
|
162
163
|
const catalog = program2.command("catalog").description("Model catalog load and health commands");
|
|
163
164
|
catalog.command("refresh").description("Fetch catalogs from open-assets.x12i.com and warm the cache").option("--bundled-only", "Use bundled src/data catalogs only (no HTTP)").option("--json", "Machine-readable JSON on stdout").action(async (opts) => {
|
|
164
|
-
const result = await
|
|
165
|
+
const result = await _chunk75ZVXZAVcjs.refreshAiModelsCatalog.call(void 0, { bundledOnly: opts.bundledOnly });
|
|
165
166
|
if (opts.json) {
|
|
166
167
|
emitJson(result);
|
|
167
168
|
} else {
|
|
@@ -173,7 +174,7 @@ function registerCatalogCommand(program2) {
|
|
|
173
174
|
}
|
|
174
175
|
});
|
|
175
176
|
catalog.command("verify").description("Validate direct + OpenRouter catalogs load successfully").option("--bundled-only", "Use bundled src/data catalogs only (no HTTP)").option("--json", "Machine-readable JSON on stdout").action(async (opts) => {
|
|
176
|
-
const report = await
|
|
177
|
+
const report = await _chunk75ZVXZAVcjs.verifyAiModelsCatalog.call(void 0, { bundledOnly: opts.bundledOnly });
|
|
177
178
|
if (opts.json) {
|
|
178
179
|
emitJson(report);
|
|
179
180
|
} else {
|
|
@@ -201,11 +202,11 @@ function registerCostCommand(program2) {
|
|
|
201
202
|
"Completion token count",
|
|
202
203
|
(v) => Number.parseInt(v, 10)
|
|
203
204
|
).option("--cached-tokens <n>", "Cached token count", (v) => Number.parseInt(v, 10)).option("--reasoning-tokens <n>", "Reasoning token count", (v) => Number.parseInt(v, 10)).option("--provider <id>", "Provider for pricing selection", "openrouter").option("--json", "Output raw AiCostResult JSON").option("--bundled-only", "Use src/data catalogs only (no HTTP)").action(async (opts) => {
|
|
204
|
-
const catalogClient = new (0,
|
|
205
|
-
cacheTtlMs:
|
|
205
|
+
const catalogClient = new (0, _chunkHBNYVRLZcjs.AiModelsCatalogClient)({
|
|
206
|
+
cacheTtlMs: _chunkHBNYVRLZcjs.resolveCatalogCacheTtlMs.call(void 0, ),
|
|
206
207
|
bundledOnly: opts.bundledOnly
|
|
207
208
|
});
|
|
208
|
-
const calculator = new (0,
|
|
209
|
+
const calculator = new (0, _chunkDDRWORUUcjs.CostCalculator)(catalogClient, {
|
|
209
210
|
aliasRegistry: new (0, _chunkBAHBDADJcjs.AliasRegistry)()
|
|
210
211
|
});
|
|
211
212
|
const result = await calculator.calculate({
|
|
@@ -247,8 +248,8 @@ function registerCostCommand(program2) {
|
|
|
247
248
|
|
|
248
249
|
// src/cli/commands/models.ts
|
|
249
250
|
function service(opts) {
|
|
250
|
-
return new (0,
|
|
251
|
-
cacheTtlMs:
|
|
251
|
+
return new (0, _chunk76FHWQH3cjs.AiModelsService)({
|
|
252
|
+
cacheTtlMs: _chunkHBNYVRLZcjs.resolveCatalogCacheTtlMs.call(void 0, ),
|
|
252
253
|
bundledOnly: opts.bundledOnly
|
|
253
254
|
});
|
|
254
255
|
}
|