@x12i/ai-tools 2.0.7 → 2.1.0

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.
Files changed (90) hide show
  1. package/dist/catalog/index.cjs +6 -6
  2. package/dist/catalog/index.js +5 -5
  3. package/dist/{chunk-ZPUZ7DBO.js → chunk-25O27USJ.js} +2 -2
  4. package/dist/{chunk-DDRWORUU.cjs → chunk-2A6EUGR5.cjs} +19 -19
  5. package/dist/{chunk-DDRWORUU.cjs.map → chunk-2A6EUGR5.cjs.map} +1 -1
  6. package/dist/chunk-2KPWVOOT.cjs +32 -0
  7. package/dist/chunk-2KPWVOOT.cjs.map +1 -0
  8. package/dist/{chunk-PN4FF6YF.js → chunk-4AIEM4AE.js} +3 -3
  9. package/dist/{chunk-RSHI4OOY.cjs → chunk-5XBMNY7Q.cjs} +252 -64
  10. package/dist/chunk-5XBMNY7Q.cjs.map +1 -0
  11. package/dist/chunk-EBBJCLJQ.js +29 -0
  12. package/dist/chunk-EBBJCLJQ.js.map +1 -0
  13. package/dist/{chunk-D6OIUYNC.js → chunk-ET5LPVPT.js} +5 -5
  14. package/dist/chunk-FISSYP27.cjs +29 -0
  15. package/dist/chunk-FISSYP27.cjs.map +1 -0
  16. package/dist/{chunk-76FHWQH3.cjs → chunk-GVFL2LRG.cjs} +9 -3
  17. package/dist/chunk-GVFL2LRG.cjs.map +1 -0
  18. package/dist/{chunk-75ZVXZAV.cjs → chunk-I6CDT2NG.cjs} +7 -7
  19. package/dist/{chunk-75ZVXZAV.cjs.map → chunk-I6CDT2NG.cjs.map} +1 -1
  20. package/dist/{chunk-VBROBIVI.js → chunk-JCMLIXIX.js} +3 -3
  21. package/dist/{chunk-VBROBIVI.js.map → chunk-JCMLIXIX.js.map} +1 -1
  22. package/dist/chunk-LQLSD26Y.cjs +1 -0
  23. package/dist/chunk-LQLSD26Y.cjs.map +1 -0
  24. package/dist/{chunk-X42KFOUO.cjs → chunk-R6P4AWOM.cjs} +6 -6
  25. package/dist/{chunk-X42KFOUO.cjs.map → chunk-R6P4AWOM.cjs.map} +1 -1
  26. package/dist/{chunk-HBNYVRLZ.cjs → chunk-SIR4LDHD.cjs} +16 -16
  27. package/dist/{chunk-HBNYVRLZ.cjs.map → chunk-SIR4LDHD.cjs.map} +1 -1
  28. package/dist/chunk-SQ6NOF4Z.js +32 -0
  29. package/dist/chunk-SQ6NOF4Z.js.map +1 -0
  30. package/dist/{chunk-54GKLIDW.js → chunk-SYHLDADG.js} +233 -45
  31. package/dist/chunk-SYHLDADG.js.map +1 -0
  32. package/dist/{chunk-WSUFQR3D.cjs → chunk-TDO5SDQ3.cjs} +25 -25
  33. package/dist/{chunk-WSUFQR3D.cjs.map → chunk-TDO5SDQ3.cjs.map} +1 -1
  34. package/dist/chunk-TMDWPWKB.cjs +123 -0
  35. package/dist/chunk-TMDWPWKB.cjs.map +1 -0
  36. package/dist/{chunk-MOLWV5LV.js → chunk-VDNKQRDG.js} +2 -2
  37. package/dist/chunk-VYVX46VO.js +123 -0
  38. package/dist/chunk-VYVX46VO.js.map +1 -0
  39. package/dist/{chunk-KSJSLKYI.js → chunk-WFRS32EQ.js} +8 -2
  40. package/dist/chunk-WFRS32EQ.js.map +1 -0
  41. package/dist/{chunk-HEB73GKJ.js → chunk-XMOALOYU.js} +2 -2
  42. package/dist/chunk-XUUPJ7WO.js +1 -0
  43. package/dist/{chunk-TMA6QSNH.cjs → chunk-YO7AJ5Z3.cjs} +3 -3
  44. package/dist/{chunk-TMA6QSNH.cjs.map → chunk-YO7AJ5Z3.cjs.map} +1 -1
  45. package/dist/cli/index.cjs +36 -16
  46. package/dist/cli/index.cjs.map +1 -1
  47. package/dist/cli/index.js +27 -7
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/cost/index.cjs +15 -5
  50. package/dist/cost/index.cjs.map +1 -1
  51. package/dist/cost/index.d.cts +3 -2
  52. package/dist/cost/index.d.ts +3 -2
  53. package/dist/cost/index.js +14 -4
  54. package/dist/index.cjs +21 -11
  55. package/dist/index.cjs.map +1 -1
  56. package/dist/index.d.cts +2 -1
  57. package/dist/index.d.ts +2 -1
  58. package/dist/index.js +21 -11
  59. package/dist/models/index.cjs +9 -7
  60. package/dist/models/index.cjs.map +1 -1
  61. package/dist/models/index.d.cts +2 -0
  62. package/dist/models/index.d.ts +2 -0
  63. package/dist/models/index.js +8 -6
  64. package/dist/{resolveUsageModel-DrFuiuIW.d.ts → resolveModelVendor--2JdUZlR.d.ts} +5 -1
  65. package/dist/{resolveUsageModel-xKZ2QpHy.d.cts → resolveModelVendor-BPPvzxE8.d.cts} +5 -1
  66. package/dist/resolveModelVendor-Dd4N6Vds.d.cts +16 -0
  67. package/dist/resolveModelVendor-oKeiH9ig.d.ts +16 -0
  68. package/dist/sync/index.cjs +10 -5
  69. package/dist/sync/index.cjs.map +1 -1
  70. package/dist/sync/index.d.cts +1 -0
  71. package/dist/sync/index.d.ts +1 -0
  72. package/dist/sync/index.js +11 -6
  73. package/package.json +2 -2
  74. package/dist/chunk-54GKLIDW.js.map +0 -1
  75. package/dist/chunk-56R4XA2S.js +0 -1
  76. package/dist/chunk-5GUKLOEK.cjs +0 -1
  77. package/dist/chunk-5GUKLOEK.cjs.map +0 -1
  78. package/dist/chunk-76FHWQH3.cjs.map +0 -1
  79. package/dist/chunk-BCX5CLJJ.cjs +0 -238
  80. package/dist/chunk-BCX5CLJJ.cjs.map +0 -1
  81. package/dist/chunk-KSJSLKYI.js.map +0 -1
  82. package/dist/chunk-RSHI4OOY.cjs.map +0 -1
  83. package/dist/chunk-SLSKQRMI.js +0 -238
  84. package/dist/chunk-SLSKQRMI.js.map +0 -1
  85. /package/dist/{chunk-ZPUZ7DBO.js.map → chunk-25O27USJ.js.map} +0 -0
  86. /package/dist/{chunk-PN4FF6YF.js.map → chunk-4AIEM4AE.js.map} +0 -0
  87. /package/dist/{chunk-D6OIUYNC.js.map → chunk-ET5LPVPT.js.map} +0 -0
  88. /package/dist/{chunk-MOLWV5LV.js.map → chunk-VDNKQRDG.js.map} +0 -0
  89. /package/dist/{chunk-HEB73GKJ.js.map → chunk-XMOALOYU.js.map} +0 -0
  90. /package/dist/{chunk-56R4XA2S.js.map → chunk-XUUPJ7WO.js.map} +0 -0
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as AiCostExtraction, a as AiCostResult, b as AiCostWarning, d as AiUsageInput, C as CostCalculator, e as CostCalculatorOptions, E as ExtractUsageInputOptions, f as ExtractUsageInputResult, M as MODEL_FIELD_PRIORITY, g as extractUsageInput, r as resolveUsageModel } from './resolveUsageModel-DrFuiuIW.js';
1
+ export { A as AiCostExtraction, a as AiCostResult, b as AiCostWarning, d as AiUsageInput, C as CostCalculator, e as CostCalculatorOptions, E as ExtractUsageInputOptions, f as ExtractUsageInputResult, M as MODEL_FIELD_PRIORITY, g as extractUsageInput, r as resolveModelVendor, h as resolveUsageModel } from './resolveModelVendor--2JdUZlR.js';
2
2
  export { A as AiModelsCatalogClient, a as AiModelsCatalogClientOptions, L as LoadCatalogOptions, b as LoadedCatalogs, l as loadCatalogSources } from './AiModelsCatalogClient-C9ZJHhv3.js';
3
3
  import { h as ModelResolutionInput, i as ModelResolutionNotFound } from './types-BZYGjN2O.js';
4
4
  export { A as AiModelPricing, a as AiModelRecord, b as AliasEntry, c as AliasFileSchema, d as AliasRegistry, e as AliasRegistryOptions, f as AliasValidationReport, M as ModelListFilters, g as ModelListResult, j as ModelResolutionResult, k as ModelResolutionSuccess, l as ModelResolverOptions, m as OpenRouterModelApi, n as OpenRouterModelsQuery, r as OpenRouterRoutingConfig, R as ResolutionStrategy, t as ResolvedModel, u as ResolvedModelRef, v as isEffectiveOpenRouterTransport, w as loadOpenRouterRoutingEnv, x as providerIdToEnvKeyPrefix, y as shouldDefaultRouteViaOpenRouter, z as vendorApiKeyEnvName } from './types-BZYGjN2O.js';
@@ -9,6 +9,7 @@ export { AIToolbox, AiToolboxOptions, Fallback, FallbackChain, Guard, GuardConfi
9
9
  export { AskProfileModelConfig, ResolveProfileForAskInput, profileConfigFromResolved, resolveProfileForAsk } from './profiles/index.js';
10
10
  export { AIProfileBackend, InstructionTier, ResolvedAIProfile, isKnownProfileOrShortcut, listAIProfiles, listAIShortcuts, resolveAIProfile } from '@x12i/ai-profiles';
11
11
  export { AliasResolver, AliasResolverOptions } from './aliases/index.js';
12
+ export { M as ModelVendorRef, R as ResolveModelVendorOptions, r as resolveModelVendorFromResolution, a as resolveModelVendorSync } from './resolveModelVendor-oKeiH9ig.js';
12
13
 
13
14
  type AiToolsErrorCode = "MODEL_NOT_FOUND" | "SYNC_FETCH_FAILED" | "SYNC_UPSERT_FAILED" | "COST_CALCULATION_FAILED" | "COST_UNKNOWN_MODEL" | "INVALID_USAGE_INPUT" | "OPENROUTER_AUTH_FAILED" | "OPENROUTER_MODELS_FETCH_FAILED" | "CACHE_READ_ERROR" | "ALIAS_NOT_FOUND" | "ALIAS_INVALID_NAME" | "ALIAS_CONFLICT" | "ALIAS_FILE_PARSE_ERROR" | "ALIAS_FILE_WRITE_ERROR";
14
15
  declare class AiToolsError extends Error {
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import "./chunk-56R4XA2S.js";
1
+ import "./chunk-XUUPJ7WO.js";
2
2
  import {
3
3
  CostCalculator,
4
4
  MODEL_FIELD_PRIORITY,
5
5
  extractUsageInput,
6
6
  resolveUsageModel
7
- } from "./chunk-PN4FF6YF.js";
7
+ } from "./chunk-4AIEM4AE.js";
8
8
  import {
9
9
  AIToolbox
10
10
  } from "./chunk-XRBZQQQU.js";
@@ -13,7 +13,7 @@ import {
13
13
  createModelNameResolver,
14
14
  isRoutedViaOpenRouter,
15
15
  resolveModel
16
- } from "./chunk-VBROBIVI.js";
16
+ } from "./chunk-JCMLIXIX.js";
17
17
  import "./chunk-KHODXGPV.js";
18
18
  import {
19
19
  AliasRegistry,
@@ -25,14 +25,21 @@ import {
25
25
  countModels,
26
26
  filterModels,
27
27
  getModelInfo
28
- } from "./chunk-KSJSLKYI.js";
28
+ } from "./chunk-WFRS32EQ.js";
29
+ import {
30
+ resolveModelVendor
31
+ } from "./chunk-EBBJCLJQ.js";
29
32
  import {
30
33
  normalizeOpenRouterModel
31
- } from "./chunk-MOLWV5LV.js";
34
+ } from "./chunk-VDNKQRDG.js";
35
+ import {
36
+ resolveModelVendorFromResolution,
37
+ resolveModelVendorSync
38
+ } from "./chunk-VYVX46VO.js";
32
39
  import {
33
40
  refreshAiModelsCatalog,
34
41
  verifyAiModelsCatalog
35
- } from "./chunk-ZPUZ7DBO.js";
42
+ } from "./chunk-25O27USJ.js";
36
43
  import {
37
44
  AiModelsCatalogClient,
38
45
  DEFAULT_CATALOG_CACHE_TTL_MS,
@@ -42,23 +49,23 @@ import {
42
49
  loadCatalogSources,
43
50
  loadCatalogSourcesCached,
44
51
  resolveCatalogCacheTtlMs
45
- } from "./chunk-D6OIUYNC.js";
46
- import "./chunk-HEB73GKJ.js";
52
+ } from "./chunk-ET5LPVPT.js";
53
+ import "./chunk-XMOALOYU.js";
47
54
  import {
48
- ModelNameResolver,
49
55
  REASONING_SUPPORTED_PARAMETERS,
50
56
  computeSupportsReasoning,
51
57
  hasReasoningPricing,
52
58
  isReasoningModel,
53
59
  supportsReasoningParameter
54
- } from "./chunk-54GKLIDW.js";
60
+ } from "./chunk-SQ6NOF4Z.js";
55
61
  import {
62
+ ModelNameResolver,
56
63
  isEffectiveOpenRouterTransport,
57
64
  loadOpenRouterRoutingEnv,
58
65
  providerIdToEnvKeyPrefix,
59
66
  shouldDefaultRouteViaOpenRouter,
60
67
  vendorApiKeyEnvName
61
- } from "./chunk-SLSKQRMI.js";
68
+ } from "./chunk-SYHLDADG.js";
62
69
  import {
63
70
  AiToolsError,
64
71
  AliasConflictError,
@@ -129,6 +136,9 @@ export {
129
136
  resolveAIProfile,
130
137
  resolveCatalogCacheTtlMs,
131
138
  resolveModel,
139
+ resolveModelVendor,
140
+ resolveModelVendorFromResolution,
141
+ resolveModelVendorSync,
132
142
  resolveProfileForAsk,
133
143
  resolveUsageModel,
134
144
  shouldDefaultRouteViaOpenRouter,
@@ -4,21 +4,23 @@
4
4
 
5
5
 
6
6
 
7
- var _chunk76FHWQH3cjs = require('../chunk-76FHWQH3.cjs');
7
+ var _chunkGVFL2LRGcjs = require('../chunk-GVFL2LRG.cjs');
8
+ require('../chunk-FISSYP27.cjs');
8
9
 
9
10
 
10
11
 
11
- var _chunkTMA6QSNHcjs = require('../chunk-TMA6QSNH.cjs');
12
- require('../chunk-HBNYVRLZ.cjs');
13
- require('../chunk-WSUFQR3D.cjs');
12
+ var _chunkYO7AJ5Z3cjs = require('../chunk-YO7AJ5Z3.cjs');
13
+ require('../chunk-TMDWPWKB.cjs');
14
+ require('../chunk-SIR4LDHD.cjs');
15
+ require('../chunk-TDO5SDQ3.cjs');
14
16
 
15
17
 
16
18
 
17
19
 
18
20
 
19
21
 
20
- var _chunkRSHI4OOYcjs = require('../chunk-RSHI4OOY.cjs');
21
- require('../chunk-BCX5CLJJ.cjs');
22
+ var _chunk2KPWVOOTcjs = require('../chunk-2KPWVOOT.cjs');
23
+ require('../chunk-5XBMNY7Q.cjs');
22
24
  require('../chunk-PADNCGZB.cjs');
23
25
  require('../chunk-GS7T56RP.cjs');
24
26
 
@@ -33,5 +35,5 @@ require('../chunk-GS7T56RP.cjs');
33
35
 
34
36
 
35
37
 
36
- exports.AiModelsService = _chunk76FHWQH3cjs.AiModelsService; exports.REASONING_SUPPORTED_PARAMETERS = _chunkRSHI4OOYcjs.REASONING_SUPPORTED_PARAMETERS; exports.computeSupportsReasoning = _chunkRSHI4OOYcjs.computeSupportsReasoning; exports.countModels = _chunk76FHWQH3cjs.countModels; exports.extractProviderId = _chunkTMA6QSNHcjs.extractProviderId; exports.filterModels = _chunk76FHWQH3cjs.filterModels; exports.getModelInfo = _chunk76FHWQH3cjs.getModelInfo; exports.hasReasoningPricing = _chunkRSHI4OOYcjs.hasReasoningPricing; exports.isReasoningModel = _chunkRSHI4OOYcjs.isReasoningModel; exports.normalizeOpenRouterModel = _chunkTMA6QSNHcjs.normalizeOpenRouterModel; exports.supportsReasoningParameter = _chunkRSHI4OOYcjs.supportsReasoningParameter;
38
+ exports.AiModelsService = _chunkGVFL2LRGcjs.AiModelsService; exports.REASONING_SUPPORTED_PARAMETERS = _chunk2KPWVOOTcjs.REASONING_SUPPORTED_PARAMETERS; exports.computeSupportsReasoning = _chunk2KPWVOOTcjs.computeSupportsReasoning; exports.countModels = _chunkGVFL2LRGcjs.countModels; exports.extractProviderId = _chunkYO7AJ5Z3cjs.extractProviderId; exports.filterModels = _chunkGVFL2LRGcjs.filterModels; exports.getModelInfo = _chunkGVFL2LRGcjs.getModelInfo; exports.hasReasoningPricing = _chunk2KPWVOOTcjs.hasReasoningPricing; exports.isReasoningModel = _chunk2KPWVOOTcjs.isReasoningModel; exports.normalizeOpenRouterModel = _chunkYO7AJ5Z3cjs.normalizeOpenRouterModel; exports.supportsReasoningParameter = _chunk2KPWVOOTcjs.supportsReasoningParameter;
37
39
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/models/index.cjs"],"names":[],"mappings":"AAAA,0GAA8B;AAC9B;AACE;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,gvBAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/models/index.cjs"}
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/models/index.cjs"],"names":[],"mappings":"AAAA,0GAA8B;AAC9B;AACE;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,gvBAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/models/index.cjs"}
@@ -1,6 +1,7 @@
1
1
  import { a as AiModelRecord, M as ModelListFilters, g as ModelListResult, j as ModelResolutionResult, m as OpenRouterModelApi } from '../types-BZYGjN2O.cjs';
2
2
  export { A as AiModelPricing, O as OpenRouterArchitectureApi, n as OpenRouterModelsQuery, o as OpenRouterModelsResponse, p as OpenRouterOutputModality, q as OpenRouterPricingApi, s as OpenRouterTopProviderApi } from '../types-BZYGjN2O.cjs';
3
3
  import { a as AiModelsCatalogClientOptions } from '../AiModelsCatalogClient-DgBdVFk-.cjs';
4
+ import { R as ResolveModelVendorOptions, M as ModelVendorRef } from '../resolveModelVendor-Dd4N6Vds.cjs';
4
5
 
5
6
  type AiModelsServiceOptions = AiModelsCatalogClientOptions;
6
7
  /**
@@ -14,6 +15,7 @@ declare class AiModelsService {
14
15
  countModels(filters?: Omit<ModelListFilters, "limit" | "offset">): Promise<number>;
15
16
  getModelInfo(modelIdOrAlias: string, provider?: string): Promise<AiModelRecord | null>;
16
17
  resolve(modelIdOrAlias: string, provider?: string): Promise<ModelResolutionResult>;
18
+ resolveVendor(model: string, options?: ResolveModelVendorOptions): Promise<ModelVendorRef | null>;
17
19
  refresh(): Promise<void>;
18
20
  }
19
21
  declare function getModelInfo(modelIdOrAlias: string, options?: AiModelsServiceOptions, provider?: string): Promise<AiModelRecord | null>;
@@ -1,6 +1,7 @@
1
1
  import { a as AiModelRecord, M as ModelListFilters, g as ModelListResult, j as ModelResolutionResult, m as OpenRouterModelApi } from '../types-BZYGjN2O.js';
2
2
  export { A as AiModelPricing, O as OpenRouterArchitectureApi, n as OpenRouterModelsQuery, o as OpenRouterModelsResponse, p as OpenRouterOutputModality, q as OpenRouterPricingApi, s as OpenRouterTopProviderApi } from '../types-BZYGjN2O.js';
3
3
  import { a as AiModelsCatalogClientOptions } from '../AiModelsCatalogClient-C9ZJHhv3.js';
4
+ import { R as ResolveModelVendorOptions, M as ModelVendorRef } from '../resolveModelVendor-oKeiH9ig.js';
4
5
 
5
6
  type AiModelsServiceOptions = AiModelsCatalogClientOptions;
6
7
  /**
@@ -14,6 +15,7 @@ declare class AiModelsService {
14
15
  countModels(filters?: Omit<ModelListFilters, "limit" | "offset">): Promise<number>;
15
16
  getModelInfo(modelIdOrAlias: string, provider?: string): Promise<AiModelRecord | null>;
16
17
  resolve(modelIdOrAlias: string, provider?: string): Promise<ModelResolutionResult>;
18
+ resolveVendor(model: string, options?: ResolveModelVendorOptions): Promise<ModelVendorRef | null>;
17
19
  refresh(): Promise<void>;
18
20
  }
19
21
  declare function getModelInfo(modelIdOrAlias: string, options?: AiModelsServiceOptions, provider?: string): Promise<AiModelRecord | null>;
@@ -4,21 +4,23 @@ import {
4
4
  countModels,
5
5
  filterModels,
6
6
  getModelInfo
7
- } from "../chunk-KSJSLKYI.js";
7
+ } from "../chunk-WFRS32EQ.js";
8
+ import "../chunk-EBBJCLJQ.js";
8
9
  import {
9
10
  extractProviderId,
10
11
  normalizeOpenRouterModel
11
- } from "../chunk-MOLWV5LV.js";
12
- import "../chunk-D6OIUYNC.js";
13
- import "../chunk-HEB73GKJ.js";
12
+ } from "../chunk-VDNKQRDG.js";
13
+ import "../chunk-VYVX46VO.js";
14
+ import "../chunk-ET5LPVPT.js";
15
+ import "../chunk-XMOALOYU.js";
14
16
  import {
15
17
  REASONING_SUPPORTED_PARAMETERS,
16
18
  computeSupportsReasoning,
17
19
  hasReasoningPricing,
18
20
  isReasoningModel,
19
21
  supportsReasoningParameter
20
- } from "../chunk-54GKLIDW.js";
21
- import "../chunk-SLSKQRMI.js";
22
+ } from "../chunk-SQ6NOF4Z.js";
23
+ import "../chunk-SYHLDADG.js";
22
24
  import "../chunk-2PTCWPHV.js";
23
25
  export {
24
26
  AiModelsService,
@@ -1,5 +1,6 @@
1
1
  import { A as AiModelPricing, d as AliasRegistry, l as ModelResolverOptions } from './types-BZYGjN2O.js';
2
2
  import { A as AiModelsCatalogClient } from './AiModelsCatalogClient-C9ZJHhv3.js';
3
+ import { R as ResolveModelVendorOptions, M as ModelVendorRef } from './resolveModelVendor-oKeiH9ig.js';
3
4
 
4
5
  type AiUsageInput = {
5
6
  tokens: {
@@ -137,4 +138,7 @@ declare class CostCalculator {
137
138
  /** Prefer runtime id (`usedModel` / `modelUsed`); fall back to `model`. */
138
139
  declare function resolveUsageModel(input: AiUsageInput): string;
139
140
 
140
- export { type AiCostExtraction as A, CostCalculator as C, type ExtractUsageInputOptions as E, type FieldProvenance as F, MODEL_FIELD_PRIORITY as M, type TokenExtractionProvenance as T, type AiCostResult as a, type AiCostWarning as b, type AiCostWarningCode as c, type AiUsageInput as d, type CostCalculatorOptions as e, type ExtractUsageInputResult as f, extractUsageInput as g, resolveUsageModel as r };
141
+ /** Best-effort vendor lookup from a model name alone (catalog + ai-profiles). */
142
+ declare function resolveModelVendor(model: string, catalog: AiModelsCatalogClient, options?: ResolveModelVendorOptions): Promise<ModelVendorRef | null>;
143
+
144
+ export { type AiCostExtraction as A, CostCalculator as C, type ExtractUsageInputOptions as E, type FieldProvenance as F, MODEL_FIELD_PRIORITY as M, type TokenExtractionProvenance as T, type AiCostResult as a, type AiCostWarning as b, type AiCostWarningCode as c, type AiUsageInput as d, type CostCalculatorOptions as e, type ExtractUsageInputResult as f, extractUsageInput as g, resolveUsageModel as h, resolveModelVendor as r };
@@ -1,5 +1,6 @@
1
1
  import { A as AiModelPricing, d as AliasRegistry, l as ModelResolverOptions } from './types-BZYGjN2O.cjs';
2
2
  import { A as AiModelsCatalogClient } from './AiModelsCatalogClient-DgBdVFk-.cjs';
3
+ import { R as ResolveModelVendorOptions, M as ModelVendorRef } from './resolveModelVendor-Dd4N6Vds.cjs';
3
4
 
4
5
  type AiUsageInput = {
5
6
  tokens: {
@@ -137,4 +138,7 @@ declare class CostCalculator {
137
138
  /** Prefer runtime id (`usedModel` / `modelUsed`); fall back to `model`. */
138
139
  declare function resolveUsageModel(input: AiUsageInput): string;
139
140
 
140
- export { type AiCostExtraction as A, CostCalculator as C, type ExtractUsageInputOptions as E, type FieldProvenance as F, MODEL_FIELD_PRIORITY as M, type TokenExtractionProvenance as T, type AiCostResult as a, type AiCostWarning as b, type AiCostWarningCode as c, type AiUsageInput as d, type CostCalculatorOptions as e, type ExtractUsageInputResult as f, extractUsageInput as g, resolveUsageModel as r };
141
+ /** Best-effort vendor lookup from a model name alone (catalog + ai-profiles). */
142
+ declare function resolveModelVendor(model: string, catalog: AiModelsCatalogClient, options?: ResolveModelVendorOptions): Promise<ModelVendorRef | null>;
143
+
144
+ export { type AiCostExtraction as A, CostCalculator as C, type ExtractUsageInputOptions as E, type FieldProvenance as F, MODEL_FIELD_PRIORITY as M, type TokenExtractionProvenance as T, type AiCostResult as a, type AiCostWarning as b, type AiCostWarningCode as c, type AiUsageInput as d, type CostCalculatorOptions as e, type ExtractUsageInputResult as f, extractUsageInput as g, resolveUsageModel as h, resolveModelVendor as r };
@@ -0,0 +1,16 @@
1
+ import { l as ModelResolverOptions, j as ModelResolutionResult, a as AiModelRecord } from './types-BZYGjN2O.cjs';
2
+
3
+ type ModelVendorRef = {
4
+ provider: string;
5
+ model: string;
6
+ };
7
+ type ResolveModelVendorOptions = ModelResolverOptions & {
8
+ /** Return OpenRouter transport shape: provider `openrouter`, model `vendor/slug`. */
9
+ asOpenRouter?: boolean;
10
+ };
11
+ /** Map a resolution result (or best-effort fallback) to `{ provider, model }`. */
12
+ declare function resolveModelVendorFromResolution(result: ModelResolutionResult, inputModel: string, options?: ResolveModelVendorOptions): ModelVendorRef | null;
13
+ /** Best-effort vendor lookup from a model name alone (sync, catalog map only). */
14
+ declare function resolveModelVendorSync(model: string, catalog: Map<string, AiModelRecord>, options?: ResolveModelVendorOptions): ModelVendorRef | null;
15
+
16
+ export { type ModelVendorRef as M, type ResolveModelVendorOptions as R, resolveModelVendorSync as a, resolveModelVendorFromResolution as r };
@@ -0,0 +1,16 @@
1
+ import { l as ModelResolverOptions, j as ModelResolutionResult, a as AiModelRecord } from './types-BZYGjN2O.js';
2
+
3
+ type ModelVendorRef = {
4
+ provider: string;
5
+ model: string;
6
+ };
7
+ type ResolveModelVendorOptions = ModelResolverOptions & {
8
+ /** Return OpenRouter transport shape: provider `openrouter`, model `vendor/slug`. */
9
+ asOpenRouter?: boolean;
10
+ };
11
+ /** Map a resolution result (or best-effort fallback) to `{ provider, model }`. */
12
+ declare function resolveModelVendorFromResolution(result: ModelResolutionResult, inputModel: string, options?: ResolveModelVendorOptions): ModelVendorRef | null;
13
+ /** Best-effort vendor lookup from a model name alone (sync, catalog map only). */
14
+ declare function resolveModelVendorSync(model: string, catalog: Map<string, AiModelRecord>, options?: ResolveModelVendorOptions): ModelVendorRef | null;
15
+
16
+ export { type ModelVendorRef as M, type ResolveModelVendorOptions as R, resolveModelVendorSync as a, resolveModelVendorFromResolution as r };
@@ -3,12 +3,13 @@
3
3
 
4
4
 
5
5
 
6
- var _chunkX42KFOUOcjs = require('../chunk-X42KFOUO.cjs');
7
- require('../chunk-TMA6QSNH.cjs');
6
+ var _chunkR6P4AWOMcjs = require('../chunk-R6P4AWOM.cjs');
7
+ require('../chunk-YO7AJ5Z3.cjs');
8
8
 
9
9
 
10
10
 
11
- var _chunkRSHI4OOYcjs = require('../chunk-RSHI4OOY.cjs');
11
+ var _chunkTMDWPWKBcjs = require('../chunk-TMDWPWKB.cjs');
12
+ require('../chunk-2KPWVOOT.cjs');
12
13
 
13
14
 
14
15
 
@@ -17,7 +18,9 @@ var _chunkRSHI4OOYcjs = require('../chunk-RSHI4OOY.cjs');
17
18
 
18
19
 
19
20
 
20
- var _chunkBCX5CLJJcjs = require('../chunk-BCX5CLJJ.cjs');
21
+
22
+
23
+ var _chunk5XBMNY7Qcjs = require('../chunk-5XBMNY7Q.cjs');
21
24
  require('../chunk-PADNCGZB.cjs');
22
25
  require('../chunk-GS7T56RP.cjs');
23
26
 
@@ -34,5 +37,7 @@ require('../chunk-GS7T56RP.cjs');
34
37
 
35
38
 
36
39
 
37
- exports.ModelNameResolver = _chunkRSHI4OOYcjs.ModelNameResolver; exports.OpenRouterSyncProvider = _chunkX42KFOUOcjs.OpenRouterSyncProvider; exports.buildCatalogIndexes = _chunkRSHI4OOYcjs.buildCatalogIndexes; exports.createModelNameResolver = _chunkX42KFOUOcjs.createModelNameResolver; exports.isEffectiveOpenRouterTransport = _chunkBCX5CLJJcjs.isEffectiveOpenRouterTransport; exports.isRoutedViaOpenRouter = _chunkX42KFOUOcjs.isRoutedViaOpenRouter; exports.loadOpenRouterRoutingEnv = _chunkBCX5CLJJcjs.loadOpenRouterRoutingEnv; exports.normalizeProvider = _chunkBCX5CLJJcjs.normalizeProvider; exports.normalizeString = _chunkBCX5CLJJcjs.normalizeString; exports.providerIdToEnvKeyPrefix = _chunkBCX5CLJJcjs.providerIdToEnvKeyPrefix; exports.resolveModel = _chunkX42KFOUOcjs.resolveModel; exports.shouldDefaultRouteViaOpenRouter = _chunkBCX5CLJJcjs.shouldDefaultRouteViaOpenRouter; exports.vendorApiKeyEnvName = _chunkBCX5CLJJcjs.vendorApiKeyEnvName;
40
+
41
+
42
+ exports.ModelNameResolver = _chunk5XBMNY7Qcjs.ModelNameResolver; exports.OpenRouterSyncProvider = _chunkR6P4AWOMcjs.OpenRouterSyncProvider; exports.buildCatalogIndexes = _chunk5XBMNY7Qcjs.buildCatalogIndexes; exports.createModelNameResolver = _chunkR6P4AWOMcjs.createModelNameResolver; exports.isEffectiveOpenRouterTransport = _chunk5XBMNY7Qcjs.isEffectiveOpenRouterTransport; exports.isRoutedViaOpenRouter = _chunkR6P4AWOMcjs.isRoutedViaOpenRouter; exports.loadOpenRouterRoutingEnv = _chunk5XBMNY7Qcjs.loadOpenRouterRoutingEnv; exports.normalizeProvider = _chunk5XBMNY7Qcjs.normalizeProvider; exports.normalizeString = _chunk5XBMNY7Qcjs.normalizeString; exports.providerIdToEnvKeyPrefix = _chunk5XBMNY7Qcjs.providerIdToEnvKeyPrefix; exports.resolveModel = _chunkR6P4AWOMcjs.resolveModel; exports.resolveModelVendorFromResolution = _chunkTMDWPWKBcjs.resolveModelVendorFromResolution; exports.resolveModelVendorSync = _chunkTMDWPWKBcjs.resolveModelVendorSync; exports.shouldDefaultRouteViaOpenRouter = _chunk5XBMNY7Qcjs.shouldDefaultRouteViaOpenRouter; exports.vendorApiKeyEnvName = _chunk5XBMNY7Qcjs.vendorApiKeyEnvName;
38
43
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/sync/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,s7BAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/sync/index.cjs"}
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/sync/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,gmCAAC","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/sync/index.cjs"}
@@ -1,6 +1,7 @@
1
1
  export { M as ModelNameResolver, O as OpenRouterSyncProvider, a as OpenRouterSyncProviderOptions, c as createModelNameResolver, i as isRoutedViaOpenRouter, r as resolveModel } from '../modelNameResolver-Bxlehrbp.cjs';
2
2
  import { a as AiModelRecord, C as CatalogIndexes } from '../types-BZYGjN2O.cjs';
3
3
  export { h as ModelResolutionInput, j as ModelResolutionResult, k as ModelResolutionSuccess, l as ModelResolverOptions, r as OpenRouterRoutingConfig, R as ResolutionStrategy, t as ResolvedModel, v as isEffectiveOpenRouterTransport, w as loadOpenRouterRoutingEnv, x as providerIdToEnvKeyPrefix, y as shouldDefaultRouteViaOpenRouter, z as vendorApiKeyEnvName } from '../types-BZYGjN2O.cjs';
4
+ export { M as ModelVendorRef, R as ResolveModelVendorOptions, r as resolveModelVendorFromResolution, a as resolveModelVendorSync } from '../resolveModelVendor-Dd4N6Vds.cjs';
4
5
 
5
6
  declare function buildCatalogIndexes(catalog: Map<string, AiModelRecord>): CatalogIndexes;
6
7
 
@@ -1,6 +1,7 @@
1
1
  export { M as ModelNameResolver, O as OpenRouterSyncProvider, a as OpenRouterSyncProviderOptions, c as createModelNameResolver, i as isRoutedViaOpenRouter, r as resolveModel } from '../modelNameResolver-2WroQlqt.js';
2
2
  import { a as AiModelRecord, C as CatalogIndexes } from '../types-BZYGjN2O.js';
3
3
  export { h as ModelResolutionInput, j as ModelResolutionResult, k as ModelResolutionSuccess, l as ModelResolverOptions, r as OpenRouterRoutingConfig, R as ResolutionStrategy, t as ResolvedModel, v as isEffectiveOpenRouterTransport, w as loadOpenRouterRoutingEnv, x as providerIdToEnvKeyPrefix, y as shouldDefaultRouteViaOpenRouter, z as vendorApiKeyEnvName } from '../types-BZYGjN2O.js';
4
+ export { M as ModelVendorRef, R as ResolveModelVendorOptions, r as resolveModelVendorFromResolution, a as resolveModelVendorSync } from '../resolveModelVendor-oKeiH9ig.js';
4
5
 
5
6
  declare function buildCatalogIndexes(catalog: Map<string, AiModelRecord>): CatalogIndexes;
6
7
 
@@ -3,13 +3,16 @@ import {
3
3
  createModelNameResolver,
4
4
  isRoutedViaOpenRouter,
5
5
  resolveModel
6
- } from "../chunk-VBROBIVI.js";
7
- import "../chunk-MOLWV5LV.js";
6
+ } from "../chunk-JCMLIXIX.js";
7
+ import "../chunk-VDNKQRDG.js";
8
8
  import {
9
- ModelNameResolver,
10
- buildCatalogIndexes
11
- } from "../chunk-54GKLIDW.js";
9
+ resolveModelVendorFromResolution,
10
+ resolveModelVendorSync
11
+ } from "../chunk-VYVX46VO.js";
12
+ import "../chunk-SQ6NOF4Z.js";
12
13
  import {
14
+ ModelNameResolver,
15
+ buildCatalogIndexes,
13
16
  isEffectiveOpenRouterTransport,
14
17
  loadOpenRouterRoutingEnv,
15
18
  normalizeProvider,
@@ -17,7 +20,7 @@ import {
17
20
  providerIdToEnvKeyPrefix,
18
21
  shouldDefaultRouteViaOpenRouter,
19
22
  vendorApiKeyEnvName
20
- } from "../chunk-SLSKQRMI.js";
23
+ } from "../chunk-SYHLDADG.js";
21
24
  import "../chunk-2PTCWPHV.js";
22
25
  export {
23
26
  ModelNameResolver,
@@ -31,6 +34,8 @@ export {
31
34
  normalizeString,
32
35
  providerIdToEnvKeyPrefix,
33
36
  resolveModel,
37
+ resolveModelVendorFromResolution,
38
+ resolveModelVendorSync,
34
39
  shouldDefaultRouteViaOpenRouter,
35
40
  vendorApiKeyEnvName
36
41
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x12i/ai-tools",
3
- "version": "2.0.7",
3
+ "version": "2.1.0",
4
4
  "description": "AI model catalogs (open-assets JSON), cost calculation, and LLM utilities",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -85,7 +85,7 @@
85
85
  }
86
86
  },
87
87
  "dependencies": {
88
- "@x12i/ai-profiles": "^1.2.7",
88
+ "@x12i/ai-profiles": "^1.4.0",
89
89
  "@x12i/env": "^4.0.1",
90
90
  "commander": "^12.1.0",
91
91
  "dotenv": "^16.4.7",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sync/modelNameResolver/catalogIndexes.ts","../src/sync/modelNameResolver/ModelNameResolver.ts","../src/models/reasoningModel.ts"],"sourcesContent":["import type { AiModelRecord } from \"../../models/types.js\";\nimport { normalizeString } from \"./normalize.js\";\nimport type { CatalogIndexes } from \"./types.js\";\n\nexport function buildCatalogIndexes(catalog: Map<string, AiModelRecord>): CatalogIndexes {\n const aliasIndex = new Map<string, string>();\n const slugIndex = new Map<string, string>();\n const prefixCounts = new Map<string, number>();\n\n for (const record of catalog.values()) {\n for (const alias of record.aliases) {\n aliasIndex.set(normalizeString(alias), record.modelId);\n }\n if (record.canonicalSlug) {\n slugIndex.set(normalizeString(record.canonicalSlug), record.modelId);\n }\n const pid = record.providerId;\n prefixCounts.set(pid, (prefixCounts.get(pid) ?? 0) + 1);\n }\n\n const providerPrefixesBySize = [...prefixCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([p]) => p);\n\n return { aliasIndex, slugIndex, providerPrefixesBySize };\n}\n","import { ModelResolutionError } from \"../../errors.js\";\nimport type { AiModelRecord } from \"../../models/types.js\";\nimport {\n loadOpenRouterRoutingEnv,\n shouldDefaultRouteViaOpenRouter,\n} from \"../openRouterRoutingEnv.js\";\nimport { buildCatalogIndexes } from \"./catalogIndexes.js\";\nimport {\n DEFAULT_CONFIDENCE_THRESHOLD,\n LOCAL_PROVIDERS,\n PROVIDER_INFERENCE_MAP,\n SHORTHAND_MAP,\n} from \"./constants.js\";\nimport { modelSlug, normalizeProvider, normalizeString, tokenise } from \"./normalize.js\";\nimport { stripModelSlugSuffix, stripModelVersionSuffix } from \"./stripVersionSuffix.js\";\nimport type {\n CatalogIndexes,\n ModelResolutionInput,\n ModelResolutionNotFound,\n ModelResolutionResult,\n ModelResolutionSuccess,\n ModelResolverOptions,\n ResolutionStrategy,\n ResolverContext,\n} from \"./types.js\";\n\ntype MatchCandidate = {\n modelId: string;\n record: AiModelRecord | null;\n confidence: number;\n strategy: ResolutionStrategy;\n reason: string;\n};\n\nexport class ModelNameResolver {\n private readonly catalog: Map<string, AiModelRecord>;\n private readonly indexes: CatalogIndexes;\n private readonly ctx: ResolverContext;\n\n constructor(\n catalog: Map<string, AiModelRecord>,\n options: ModelResolverOptions = {},\n ) {\n this.catalog = catalog;\n this.indexes = buildCatalogIndexes(catalog);\n this.ctx = {\n catalog,\n indexes: this.indexes,\n options: {\n confidenceThreshold: options.confidenceThreshold ?? DEFAULT_CONFIDENCE_THRESHOLD,\n aliasRegistry: options.aliasRegistry,\n additionalShorthands: options.additionalShorthands ?? {},\n additionalProviderPatterns: options.additionalProviderPatterns ?? [],\n additionalLocalProviders: options.additionalLocalProviders ?? [],\n routingEnv: options.routingEnv ?? loadOpenRouterRoutingEnv(),\n routeViaOpenRouter: options.routeViaOpenRouter,\n },\n };\n }\n\n resolve(input: ModelResolutionInput): ModelResolutionResult {\n const attempted: ResolutionStrategy[] = [];\n const threshold = this.ctx.options.confidenceThreshold;\n\n let provider = normalizeProvider(input.provider);\n let model = normalizeString(input.model);\n const normalisedInput = model;\n\n // S0 — alias registry on model string\n if (this.ctx.options.aliasRegistry) {\n attempted.push(\"alias-registry\");\n const entry = this.ctx.options.aliasRegistry.get(model);\n if (entry) {\n model = normalizeString(entry.modelId);\n provider = normalizeProvider(entry.provider) ?? provider;\n }\n }\n\n // Alias used as provider name (e.g. provider=\"best\")\n if (this.ctx.options.aliasRegistry && provider) {\n const aliasAsProvider = this.ctx.options.aliasRegistry.get(provider);\n if (aliasAsProvider) {\n attempted.push(\"alias-as-provider-correction\");\n model = normalizeString(aliasAsProvider.modelId);\n provider = normalizeProvider(aliasAsProvider.provider) ?? provider;\n }\n }\n\n // S10 — local provider (before catalog strategies)\n const localProviders = new Set([\n ...LOCAL_PROVIDERS,\n ...this.ctx.options.additionalLocalProviders.map((p) => normalizeString(p)),\n ]);\n if (provider && localProviders.has(provider)) {\n attempted.push(\"local-provider-passthrough\");\n return this.success({\n modelId: model,\n record: null,\n confidence: 0.99,\n strategy: \"local-provider-passthrough\",\n reason: `Local provider \"${provider}\" — model not looked up in catalog`,\n resolvedVia: attempted,\n normalisedInput,\n provider,\n originalProvider: input.provider,\n });\n }\n\n const preCorrection = [...attempted];\n\n const { match, rejected } = this.runPipeline(model, provider, attempted, threshold, []);\n if (match) {\n const via = [\n ...preCorrection.filter((s) => !match.resolvedVia.includes(s)),\n ...match.resolvedVia,\n ];\n return this.success({\n modelId: match.modelId,\n record: match.record,\n confidence: match.confidence,\n strategy: match.strategy,\n reason: match.reason,\n resolvedVia: via,\n normalisedInput,\n provider,\n originalProvider: input.provider,\n });\n }\n\n const notFound: ModelResolutionNotFound = {\n found: false,\n modelId: null,\n record: null,\n attemptedStrategies: attempted,\n reason: \"No catalog entry matched after all strategies.\",\n bestRejectedCandidate: rejected,\n };\n return notFound;\n }\n\n resolveMany(inputs: ModelResolutionInput[]): ModelResolutionResult[] {\n return inputs.map((i) => this.resolve(i));\n }\n\n resolveOrThrow(input: ModelResolutionInput): ModelResolutionSuccess {\n const result = this.resolve(input);\n if (result.found) return result;\n throw new ModelResolutionError(input, result);\n }\n\n private runPipeline(\n model: string,\n provider: string | undefined,\n attempted: ResolutionStrategy[],\n threshold: number,\n resolvedVia: ResolutionStrategy[],\n depth = 0,\n ): {\n match: (MatchCandidate & { resolvedVia: ResolutionStrategy[] }) | null;\n rejected?: ModelResolutionNotFound[\"bestRejectedCandidate\"];\n } {\n if (depth > 12) return { match: null };\n\n const tryMatch = (\n strategy: ResolutionStrategy,\n fn: () => MatchCandidate | null,\n ): (MatchCandidate & { resolvedVia: ResolutionStrategy[] }) | null => {\n if (!attempted.includes(strategy)) attempted.push(strategy);\n const m = fn();\n if (m && m.confidence >= threshold) {\n return { ...m, resolvedVia: [...resolvedVia, strategy] };\n }\n return null;\n };\n\n let hit = tryMatch(\"exact-match\", () => this.exactMatch(model));\n if (hit) return { match: hit };\n\n hit = tryMatch(\"catalog-alias-match\", () => this.catalogAliasMatch(model));\n if (hit) return { match: hit };\n\n hit = tryMatch(\"canonical-slug-match\", () => this.slugMatch(model));\n if (hit) return { match: hit };\n\n hit = tryMatch(\"provider-prefix-injection\", () =>\n this.providerPrefixInjection(model, provider),\n );\n if (hit) return { match: hit };\n\n hit = tryMatch(\"cross-provider-correction\", () => this.crossProviderCorrection(model));\n if (hit) return { match: hit };\n\n const stripped = stripModelVersionSuffix(model);\n if (stripped && stripped !== model) {\n if (!attempted.includes(\"version-suffix-strip\")) attempted.push(\"version-suffix-strip\");\n const inner = this.runPipeline(\n stripped,\n provider,\n attempted,\n threshold,\n [...resolvedVia, \"version-suffix-strip\"],\n depth + 1,\n );\n if (inner.match) {\n return {\n match: {\n ...inner.match,\n confidence: 0.85,\n strategy: \"version-suffix-strip\",\n reason: `Stripped version suffix from \"${model}\" → \"${stripped}\" then ${inner.match.reason}`,\n resolvedVia: [...resolvedVia, \"version-suffix-strip\", ...inner.match.resolvedVia],\n },\n };\n }\n }\n\n hit = tryMatch(\"date-suffix-strip\", () => this.dateSuffixMatch(model));\n if (hit) return { match: hit };\n\n const shorthand = this.shorthandMap()[model];\n if (shorthand) {\n if (!attempted.includes(\"shorthand-expansion\")) attempted.push(\"shorthand-expansion\");\n const inner = this.runPipeline(\n normalizeString(shorthand),\n provider,\n attempted,\n threshold,\n [...resolvedVia, \"shorthand-expansion\"],\n depth + 1,\n );\n if (inner.match) {\n return {\n match: {\n ...inner.match,\n confidence: 0.8,\n strategy: \"shorthand-expansion\",\n reason: `Expanded shorthand \"${model}\" → \"${shorthand}\" then ${inner.match.reason}`,\n resolvedVia: [...resolvedVia, \"shorthand-expansion\", ...inner.match.resolvedVia],\n },\n };\n }\n }\n\n const partial = this.partialMatch(model, provider);\n if (partial) {\n if (!attempted.includes(\"partial-name-match\")) attempted.push(\"partial-name-match\");\n if (partial.confidence >= threshold) {\n return {\n match: { ...partial, resolvedVia: [...resolvedVia, \"partial-name-match\"] },\n };\n }\n return {\n match: null,\n rejected: {\n modelId: partial.modelId,\n confidence: partial.confidence,\n reason: partial.reason,\n },\n };\n }\n\n return { match: null };\n }\n\n private exactMatch(model: string): MatchCandidate | null {\n const record = this.catalog.get(model);\n if (!record) return null;\n return {\n modelId: model,\n record,\n confidence: 1,\n strategy: \"exact-match\",\n reason: `Exact catalog match for \"${model}\"`,\n };\n }\n\n private catalogAliasMatch(model: string): MatchCandidate | null {\n const modelId = this.indexes.aliasIndex.get(model);\n if (!modelId) return null;\n const record = this.catalog.get(modelId);\n if (!record) return null;\n return {\n modelId,\n record,\n confidence: 1,\n strategy: \"catalog-alias-match\",\n reason: `Catalog alias \"${model}\" → \"${modelId}\"`,\n };\n }\n\n private slugMatch(model: string): MatchCandidate | null {\n const modelId = this.indexes.slugIndex.get(model);\n if (!modelId) return null;\n const record = this.catalog.get(modelId);\n if (!record) return null;\n return {\n modelId,\n record,\n confidence: 0.95,\n strategy: \"canonical-slug-match\",\n reason: `Canonical slug match \"${model}\" → \"${modelId}\"`,\n };\n }\n\n private inferProviderFromSlug(slug: string): string | undefined {\n const patterns = [\n ...this.ctx.options.additionalProviderPatterns,\n ...PROVIDER_INFERENCE_MAP,\n ];\n for (const { pattern, provider } of patterns) {\n if (pattern.test(slug)) return provider;\n }\n return undefined;\n }\n\n private providerPrefixInjection(\n model: string,\n provider: string | undefined,\n ): MatchCandidate | null {\n if (model.includes(\"/\")) return null;\n\n const prefixes: string[] = [];\n if (provider && provider !== \"openrouter\") {\n prefixes.push(provider);\n }\n const inferred = this.inferProviderFromSlug(model);\n if (inferred && !prefixes.includes(inferred)) prefixes.push(inferred);\n for (const p of this.indexes.providerPrefixesBySize) {\n if (!prefixes.includes(p)) prefixes.push(p);\n }\n\n for (const prefix of prefixes) {\n const candidate = `${prefix}/${model}`;\n let record = this.catalog.get(candidate);\n let modelId = candidate;\n if (!record) {\n const latest = this.findLatestVersioned(candidate);\n if (latest) {\n record = latest.record;\n modelId = latest.modelId;\n }\n }\n if (record) {\n const viaInference = inferred === prefix;\n return {\n modelId,\n record,\n confidence: 0.95,\n strategy: \"provider-prefix-injection\",\n reason: viaInference\n ? `Injected provider prefix \"${prefix}/\" inferred from model name pattern`\n : `Injected provider prefix \"${prefix}/\"`,\n };\n }\n }\n return null;\n }\n\n private crossProviderCorrection(model: string): MatchCandidate | null {\n if (!model.includes(\"/\")) return null;\n const [wrongPrefix, ...rest] = model.split(\"/\");\n const slug = rest.join(\"/\");\n const inferred = this.inferProviderFromSlug(slug);\n if (!inferred || inferred === wrongPrefix) return null;\n const candidate = `${inferred}/${slug}`;\n let record = this.catalog.get(candidate);\n let modelId = candidate;\n if (!record) {\n const latest = this.findLatestVersioned(candidate);\n if (!latest) return null;\n record = latest.record;\n modelId = latest.modelId;\n }\n return {\n modelId,\n record,\n confidence: 0.9,\n strategy: \"cross-provider-correction\",\n reason: `Corrected provider prefix from \"${wrongPrefix}\" to \"${inferred}\" based on model name pattern`,\n };\n }\n\n private dateSuffixMatch(model: string): MatchCandidate | null {\n if (model.includes(\"/\")) {\n const [prefix, slug] = model.split(\"/\", 2);\n const stripped = stripModelSlugSuffix(slug);\n if (stripped && stripped !== slug) {\n const candidate = `${prefix}/${stripped}`;\n const record = this.catalog.get(candidate);\n if (record) {\n return {\n modelId: candidate,\n record,\n confidence: 0.85,\n strategy: \"date-suffix-strip\",\n reason: `Stripped date from slug \"${slug}\" → \"${stripped}\"`,\n };\n }\n }\n }\n\n const latest = this.findLatestVersioned(model);\n if (latest) {\n return {\n modelId: latest.modelId,\n record: latest.record,\n confidence: 0.85,\n strategy: \"date-suffix-strip\",\n reason: `Matched \"${model}\" to versioned catalog entry \"${latest.modelId}\" (latest)`,\n };\n }\n return null;\n }\n\n private findLatestVersioned(\n baseModelId: string,\n ): { modelId: string; record: AiModelRecord } | null {\n const candidates: Array<{ modelId: string; record: AiModelRecord; suffix: string }> = [];\n for (const [modelId, record] of this.catalog) {\n if (modelId === baseModelId) continue;\n if (modelId.startsWith(`${baseModelId}-`)) {\n candidates.push({\n modelId,\n record,\n suffix: modelId.slice(baseModelId.length + 1),\n });\n }\n }\n if (candidates.length === 0) return null;\n candidates.sort((a, b) => b.suffix.localeCompare(a.suffix));\n const best = candidates[0]!;\n return { modelId: best.modelId, record: best.record };\n }\n\n private shorthandMap(): Record<string, string> {\n return { ...SHORTHAND_MAP, ...this.ctx.options.additionalShorthands };\n }\n\n private partialMatch(\n model: string,\n provider: string | undefined,\n ): (MatchCandidate & { resolvedVia?: ResolutionStrategy[] }) | null {\n let best: { modelId: string; record: AiModelRecord; score: number } | null = null;\n const inputTokens = tokenise(model);\n if (inputTokens.length === 0) return null;\n\n for (const record of this.catalog.values()) {\n const recordTokens = new Set([\n ...tokenise(record.modelId),\n ...tokenise(record.name ?? \"\"),\n ]);\n const intersection = inputTokens.filter((t) => recordTokens.has(t));\n const overlapRatio = intersection.length / inputTokens.length;\n let score = overlapRatio * 0.6;\n\n if (record.modelId.includes(model)) score += 0.3;\n const slug = modelSlug(record.modelId);\n if (model.includes(slug)) score += 0.2;\n\n if (provider && provider === record.providerId) score += 0.15;\n\n const lenPenalty =\n (Math.abs(model.length - slug.length) / Math.max(model.length, slug.length, 1)) * 0.1;\n score -= lenPenalty;\n\n if (!best || score > best.score) {\n best = { modelId: record.modelId, record, score };\n }\n }\n\n if (!best || best.score < 0.65) return null;\n return {\n modelId: best.modelId,\n record: best.record,\n confidence: 0.65,\n strategy: \"partial-name-match\",\n reason: `Partial token match (score ${best.score.toFixed(2)})`,\n };\n }\n\n private computeRoutedViaOpenRouter(\n modelId: string,\n record: AiModelRecord | null,\n provider: string | undefined,\n originalProvider: string | undefined,\n ): boolean {\n const override = this.ctx.options.routeViaOpenRouter;\n if (override === true) return true;\n if (override === false) return false;\n\n const norm = normalizeProvider(originalProvider) ?? provider;\n if (norm === \"openrouter\") return true;\n if (norm && norm !== \"openrouter\") {\n if (shouldDefaultRouteViaOpenRouter(norm, this.ctx.options.routingEnv)) return true;\n return false;\n }\n\n const recordProvider = record?.providerId;\n if (recordProvider && shouldDefaultRouteViaOpenRouter(recordProvider, this.ctx.options.routingEnv)) {\n return true;\n }\n\n if (record?.availableOnOpenRouter && modelId.includes(\"/\")) return true;\n return false;\n }\n\n private toOpenRouterSlug(\n modelId: string,\n provider: string | undefined,\n record: AiModelRecord | null,\n ): string {\n if (modelId.includes(\"/\")) return modelId;\n const vendor =\n record?.providerId ??\n (provider && provider !== \"openrouter\" ? provider : undefined);\n if (!vendor || vendor === \"openrouter\") return modelId;\n return `${vendor}/${modelId}`;\n }\n\n private success(args: {\n modelId: string;\n record: AiModelRecord | null;\n confidence: number;\n strategy: ResolutionStrategy;\n reason: string;\n resolvedVia: ResolutionStrategy[];\n normalisedInput: string;\n provider?: string;\n originalProvider?: string;\n }): ModelResolutionSuccess {\n const routedViaOpenRouter = this.computeRoutedViaOpenRouter(\n args.modelId,\n args.record,\n args.provider,\n args.originalProvider,\n );\n const modelId = routedViaOpenRouter\n ? this.toOpenRouterSlug(args.modelId, args.provider, args.record)\n : args.modelId;\n\n return {\n found: true,\n modelId,\n record: args.record,\n routedViaOpenRouter,\n confidence: args.confidence,\n resolvedVia: args.resolvedVia,\n resolvedReason: args.reason,\n normalisedInput: args.normalisedInput,\n };\n }\n}\n","import type { AiModelRecord } from \"./types.js\";\n\n/** OpenRouter `supported_parameters` values that indicate reasoning API support. */\nexport const REASONING_SUPPORTED_PARAMETERS = [\"reasoning\", \"include_reasoning\"] as const;\n\nexport type ReasoningModelInput = Pick<\n AiModelRecord,\n \"supportedParameters\" | \"pricing\" | \"openRouterPricing\"\n> & {\n supportsReasoning?: boolean;\n};\n\n/**\n * Whether the model accepts OpenRouter's `reasoning` request parameter\n * (effort, max_tokens, exclude, enabled).\n */\nexport function supportsReasoningParameter(model: Pick<AiModelRecord, \"supportedParameters\">): boolean {\n return model.supportedParameters.some((p) =>\n (REASONING_SUPPORTED_PARAMETERS as readonly string[]).includes(p),\n );\n}\n\n/**\n * Whether the model bills separate reasoning / thinking tokens\n * (`internal_reasoning` in OpenRouter pricing).\n */\nexport function hasReasoningPricing(\n model: Pick<AiModelRecord, \"pricing\" | \"openRouterPricing\">,\n): boolean {\n const raw = model.openRouterPricing?.internal_reasoning;\n if (raw !== undefined && raw !== null && String(raw).trim() !== \"\") {\n return true;\n }\n return model.pricing.reasoningUsdPerToken !== undefined;\n}\n\n/**\n * Compute `supportsReasoning` from catalog fields (used when normalizing catalog entries).\n */\nexport function computeSupportsReasoning(model: ReasoningModelInput): boolean {\n return supportsReasoningParameter(model) || hasReasoningPricing(model);\n}\n\n/**\n * True when the model supports reasoning tokens (API param and/or separate reasoning pricing).\n *\n * Prefer `model.supportsReasoning` on {@link AiModelRecord} after catalog load;\n * this helper also works when only partial fields are available.\n */\nexport function isReasoningModel(model: ReasoningModelInput): boolean {\n if (model.supportsReasoning !== undefined) {\n return model.supportsReasoning;\n }\n return computeSupportsReasoning(model);\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=chunk-56R4XA2S.js.map
@@ -1 +0,0 @@
1
- "use strict";//# sourceMappingURL=chunk-5GUKLOEK.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-5GUKLOEK.cjs"],"names":[],"mappings":"AAAA","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-5GUKLOEK.cjs"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-76FHWQH3.cjs","../src/models/filterModels.ts","../src/models/AiModelsService.ts"],"names":[],"mappings":"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","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-76FHWQH3.cjs","sourcesContent":[null,"import type { AiModelRecord, ModelListFilters } from \"./types.js\";\n\nfunction matchesSearch(record: AiModelRecord, search: string): boolean {\n const q = search.toLowerCase();\n return (\n record.modelId.toLowerCase().includes(q) ||\n record.name.toLowerCase().includes(q) ||\n record.description.toLowerCase().includes(q) ||\n record.canonicalSlug.toLowerCase().includes(q) ||\n record.aliases.some((a) => a.toLowerCase().includes(q))\n );\n}\n\nexport function filterModels(\n models: Iterable<AiModelRecord>,\n filters: ModelListFilters = {},\n): AiModelRecord[] {\n let list = [...models];\n\n if (filters.providerId) {\n list = list.filter((m) => m.providerId === filters.providerId);\n }\n if (filters.status) {\n list = list.filter((m) => m.status === filters.status);\n }\n if (filters.outputModality) {\n list = list.filter((m) => m.outputModalities.includes(filters.outputModality!));\n }\n if (filters.inputModality) {\n list = list.filter((m) => m.inputModalities.includes(filters.inputModality!));\n }\n if (filters.supportedParameter) {\n list = list.filter((m) => m.supportedParameters.includes(filters.supportedParameter!));\n }\n if (filters.supportsTools !== undefined) {\n list = list.filter((m) => m.supportsTools === filters.supportsTools);\n }\n if (filters.supportsReasoning !== undefined) {\n list = list.filter((m) => m.supportsReasoning === filters.supportsReasoning);\n }\n if (filters.search) {\n list = list.filter((m) => matchesSearch(m, filters.search!));\n }\n\n list.sort((a, b) => a.name.localeCompare(b.name));\n\n const offset = filters.offset ?? 0;\n const limit = filters.limit ?? list.length;\n return list.slice(offset, offset + limit);\n}\n\nexport function countModels(\n models: Iterable<AiModelRecord>,\n filters: Omit<ModelListFilters, \"limit\" | \"offset\"> = {},\n): number {\n return filterModels(models, { ...filters, limit: Number.MAX_SAFE_INTEGER, offset: 0 }).length;\n}\n","import { AiModelsCatalogClient } from \"../catalog/AiModelsCatalogClient.js\";\nimport type { AiModelsCatalogClientOptions } from \"../catalog/AiModelsCatalogClient.js\";\nimport { countModels, filterModels } from \"./filterModels.js\";\nimport type { AiModelRecord, ModelListFilters, ModelListResult } from \"./types.js\";\n\nexport type AiModelsServiceOptions = AiModelsCatalogClientOptions;\n\n/**\n * High-level model catalog API — list, filter, count, and get full model info.\n */\nexport class AiModelsService {\n private readonly client: AiModelsCatalogClient;\n\n constructor(options: AiModelsServiceOptions = {}) {\n this.client = new AiModelsCatalogClient(options);\n }\n\n async getAllModels(): Promise<Map<string, AiModelRecord>> {\n return this.client.getAllModels();\n }\n\n async listModels(filters: ModelListFilters = {}): Promise<ModelListResult> {\n const all = await this.getAllModels();\n const total = countModels(all.values(), filters);\n const limit = filters.limit ?? 50;\n const offset = filters.offset ?? 0;\n const models = filterModels(all.values(), { ...filters, limit, offset });\n return { models, total, limit, offset };\n }\n\n async countModels(filters: Omit<ModelListFilters, \"limit\" | \"offset\"> = {}): Promise<number> {\n const all = await this.getAllModels();\n return countModels(all.values(), filters);\n }\n\n async getModelInfo(modelIdOrAlias: string, provider?: string): Promise<AiModelRecord | null> {\n return this.client.getModel(modelIdOrAlias, provider);\n }\n\n async resolve(\n modelIdOrAlias: string,\n provider?: string,\n ): Promise<import(\"../sync/modelNameResolver/types.js\").ModelResolutionResult> {\n return this.client.resolveModel({ model: modelIdOrAlias, provider });\n }\n\n async refresh(): Promise<void> {\n await this.client.refresh();\n }\n}\n\nexport async function getModelInfo(\n modelIdOrAlias: string,\n options: AiModelsServiceOptions = {},\n provider?: string,\n): Promise<AiModelRecord | null> {\n return new AiModelsService(options).getModelInfo(modelIdOrAlias, provider);\n}\n"]}