@x12i/ai-tools 2.0.4 → 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
@@ -0,0 +1,32 @@
1
+ // src/models/reasoningModel.ts
2
+ var REASONING_SUPPORTED_PARAMETERS = ["reasoning", "include_reasoning"];
3
+ function supportsReasoningParameter(model) {
4
+ return model.supportedParameters.some(
5
+ (p) => REASONING_SUPPORTED_PARAMETERS.includes(p)
6
+ );
7
+ }
8
+ function hasReasoningPricing(model) {
9
+ const raw = model.openRouterPricing?.internal_reasoning;
10
+ if (raw !== void 0 && raw !== null && String(raw).trim() !== "") {
11
+ return true;
12
+ }
13
+ return model.pricing.reasoningUsdPerToken !== void 0;
14
+ }
15
+ function computeSupportsReasoning(model) {
16
+ return supportsReasoningParameter(model) || hasReasoningPricing(model);
17
+ }
18
+ function isReasoningModel(model) {
19
+ if (model.supportsReasoning !== void 0) {
20
+ return model.supportsReasoning;
21
+ }
22
+ return computeSupportsReasoning(model);
23
+ }
24
+
25
+ export {
26
+ REASONING_SUPPORTED_PARAMETERS,
27
+ supportsReasoningParameter,
28
+ hasReasoningPricing,
29
+ computeSupportsReasoning,
30
+ isReasoningModel
31
+ };
32
+ //# sourceMappingURL=chunk-SQ6NOF4Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/models/reasoningModel.ts"],"sourcesContent":["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":";AAGO,IAAM,iCAAiC,CAAC,aAAa,mBAAmB;AAaxE,SAAS,2BAA2B,OAA4D;AACrG,SAAO,MAAM,oBAAoB;AAAA,IAAK,CAAC,MACpC,+BAAqD,SAAS,CAAC;AAAA,EAClE;AACF;AAMO,SAAS,oBACd,OACS;AACT,QAAM,MAAM,MAAM,mBAAmB;AACrC,MAAI,QAAQ,UAAa,QAAQ,QAAQ,OAAO,GAAG,EAAE,KAAK,MAAM,IAAI;AAClE,WAAO;AAAA,EACT;AACA,SAAO,MAAM,QAAQ,yBAAyB;AAChD;AAKO,SAAS,yBAAyB,OAAqC;AAC5E,SAAO,2BAA2B,KAAK,KAAK,oBAAoB,KAAK;AACvE;AAQO,SAAS,iBAAiB,OAAqC;AACpE,MAAI,MAAM,sBAAsB,QAAW;AACzC,WAAO,MAAM;AAAA,EACf;AACA,SAAO,yBAAyB,KAAK;AACvC;","names":[]}
@@ -1,21 +1,192 @@
1
- import {
2
- DEFAULT_CONFIDENCE_THRESHOLD,
3
- LOCAL_PROVIDERS,
4
- PROVIDER_INFERENCE_MAP,
5
- SHORTHAND_MAP,
6
- loadOpenRouterRoutingEnv,
7
- modelSlug,
8
- normalizeProvider,
9
- normalizeString,
10
- shouldDefaultRouteViaOpenRouter,
11
- stripModelSlugSuffix,
12
- stripModelVersionSuffix,
13
- tokenise
14
- } from "./chunk-SLSKQRMI.js";
15
1
  import {
16
2
  ModelResolutionError
17
3
  } from "./chunk-2PTCWPHV.js";
18
4
 
5
+ // src/sync/modelNameResolver/constants.ts
6
+ var DEFAULT_CONFIDENCE_THRESHOLD = 0.6;
7
+ var PROVIDER_NORMALISATION_MAP = {
8
+ "open-router": "openrouter",
9
+ or: "openrouter",
10
+ oai: "openai",
11
+ "open-ai": "openai",
12
+ claude: "anthropic",
13
+ ant: "anthropic",
14
+ gemini: "google",
15
+ gcp: "google",
16
+ "google-ai": "google",
17
+ vertex: "google",
18
+ meta: "meta-llama",
19
+ llama: "meta-llama",
20
+ "mistral-ai": "mistral",
21
+ "cohere-ai": "cohere"
22
+ };
23
+ var LOCAL_PROVIDERS = /* @__PURE__ */ new Set([
24
+ "ollama",
25
+ "lmstudio",
26
+ "lm-studio",
27
+ "localai",
28
+ "local-ai",
29
+ "llamacpp",
30
+ "llama.cpp",
31
+ "llamafile",
32
+ "jan",
33
+ "koboldcpp"
34
+ ]);
35
+ var PROVIDER_INFERENCE_MAP = [
36
+ { pattern: /^gpt-/, provider: "openai" },
37
+ { pattern: /^o1($|-)/, provider: "openai" },
38
+ { pattern: /^o3($|-)/, provider: "openai" },
39
+ { pattern: /^o4($|-)/, provider: "openai" },
40
+ { pattern: /^chatgpt-/, provider: "openai" },
41
+ { pattern: /^text-davinci/, provider: "openai" },
42
+ { pattern: /^dall-e/, provider: "openai" },
43
+ { pattern: /^whisper/, provider: "openai" },
44
+ { pattern: /^tts-/, provider: "openai" },
45
+ { pattern: /^claude-/, provider: "anthropic" },
46
+ { pattern: /^gemini-/, provider: "google" },
47
+ { pattern: /^palm-/, provider: "google" },
48
+ { pattern: /^bison/, provider: "google" },
49
+ { pattern: /^llama-?[23]/, provider: "meta-llama" },
50
+ { pattern: /^llama/, provider: "meta-llama" },
51
+ { pattern: /^codellama/, provider: "meta-llama" },
52
+ { pattern: /^mistral-/, provider: "mistral" },
53
+ { pattern: /^mixtral-/, provider: "mistral" },
54
+ { pattern: /^codestral/, provider: "mistral" },
55
+ { pattern: /^ministral/, provider: "mistral" },
56
+ { pattern: /^command-/, provider: "cohere" },
57
+ { pattern: /^c4ai-/, provider: "cohere" },
58
+ { pattern: /^deepseek-/, provider: "deepseek" },
59
+ { pattern: /^grok-/, provider: "x-ai" },
60
+ { pattern: /^qwen/, provider: "qwen" },
61
+ { pattern: /^yi-/, provider: "01-ai" },
62
+ { pattern: /^sonar/, provider: "perplexity" },
63
+ { pattern: /^pplx-/, provider: "perplexity" },
64
+ { pattern: /^titan-/, provider: "amazon" },
65
+ { pattern: /^nova-/, provider: "amazon" }
66
+ ];
67
+ var SHORTHAND_MAP = {
68
+ gpt4: "openai/gpt-4",
69
+ gpt4o: "openai/gpt-4o",
70
+ "gpt-4-omni": "openai/gpt-4o",
71
+ gpt4omni: "openai/gpt-4o",
72
+ "gpt4-turbo": "openai/gpt-4-turbo",
73
+ gpt4turbo: "openai/gpt-4-turbo",
74
+ "gpt4-mini": "openai/gpt-4o-mini",
75
+ "gpt-4o-mini": "openai/gpt-4o-mini",
76
+ o1: "openai/o1",
77
+ "o1-mini": "openai/o1-mini",
78
+ o3: "openai/o3",
79
+ "o3-mini": "openai/o3-mini",
80
+ "o4-mini": "openai/o4-mini",
81
+ "3.5-turbo": "openai/gpt-3.5-turbo",
82
+ gpt35: "openai/gpt-3.5-turbo",
83
+ gpt3: "openai/gpt-3.5-turbo",
84
+ claude3: "anthropic/claude-3-5-sonnet-20241022",
85
+ "claude-3": "anthropic/claude-3-5-sonnet-20241022",
86
+ "claude3-sonnet": "anthropic/claude-3-5-sonnet-20241022",
87
+ "claude-sonnet": "anthropic/claude-3-5-sonnet-20241022",
88
+ "claude-haiku": "anthropic/claude-3-5-haiku-20241022",
89
+ "claude3-haiku": "anthropic/claude-3-5-haiku-20241022",
90
+ "claude-opus": "anthropic/claude-opus-4",
91
+ "claude3-opus": "anthropic/claude-3-opus-20240229",
92
+ claude4: "anthropic/claude-opus-4",
93
+ "claude4-sonnet": "anthropic/claude-sonnet-4",
94
+ "claude4-opus": "anthropic/claude-opus-4",
95
+ sonnet: "anthropic/claude-3-5-sonnet-20241022",
96
+ haiku: "anthropic/claude-3-5-haiku-20241022",
97
+ opus: "anthropic/claude-opus-4",
98
+ gemini: "google/gemini-pro",
99
+ "gemini-pro": "google/gemini-pro",
100
+ "gemini-flash": "google/gemini-flash-1.5",
101
+ gemini2: "google/gemini-2.0-flash-001",
102
+ "gemini-2": "google/gemini-2.0-flash-001",
103
+ llama3: "meta-llama/llama-3.1-8b-instruct",
104
+ "llama-3": "meta-llama/llama-3.1-8b-instruct",
105
+ llama2: "meta-llama/llama-2-13b-chat",
106
+ "llama-2": "meta-llama/llama-2-13b-chat",
107
+ mistral: "mistral/mistral-7b-instruct",
108
+ "mistral-large": "mistral/mistral-large-latest",
109
+ mixtral: "mistral/mixtral-8x7b-instruct",
110
+ deepseek: "deepseek/deepseek-chat",
111
+ "deepseek-r1": "deepseek/deepseek-r1"
112
+ };
113
+
114
+ // src/sync/modelNameResolver/normalize.ts
115
+ function normalizeString(input) {
116
+ let s = input.trim();
117
+ s = s.replace(/\s+/g, " ").replace(/ /g, "-");
118
+ s = s.toLowerCase();
119
+ s = s.replace(/^\/+|\/+$/g, "");
120
+ s = s.replace(/\/+/g, "/");
121
+ if (s.startsWith('"') && s.endsWith('"') || s.startsWith("'") && s.endsWith("'")) {
122
+ s = s.slice(1, -1);
123
+ }
124
+ return s;
125
+ }
126
+ function normalizeProvider(provider) {
127
+ if (provider === void 0 || provider === "") return void 0;
128
+ const n = normalizeString(provider);
129
+ return PROVIDER_NORMALISATION_MAP[n] ?? n;
130
+ }
131
+ function tokenise(s) {
132
+ return s.split(/[-_./]+/).filter(Boolean);
133
+ }
134
+ function modelSlug(modelId) {
135
+ const slash = modelId.indexOf("/");
136
+ return slash >= 0 ? modelId.slice(slash + 1) : modelId;
137
+ }
138
+
139
+ // src/sync/openRouterRoutingEnv.ts
140
+ import { loadDotenv } from "@x12i/env";
141
+ function providerIdToEnvKeyPrefix(providerId) {
142
+ return providerId.trim().toLowerCase().replace(/-/g, "_").toUpperCase();
143
+ }
144
+ function vendorApiKeyEnvName(providerId) {
145
+ return `${providerIdToEnvKeyPrefix(providerId)}_API_KEY`;
146
+ }
147
+ function loadOpenRouterRoutingEnv(env = process.env) {
148
+ const dotenv = loadDotenv();
149
+ const merged = {};
150
+ for (const [k, v] of Object.entries(dotenv)) {
151
+ if (v !== void 0) merged[k] = v;
152
+ }
153
+ for (const [k, v] of Object.entries(env)) {
154
+ if (v !== void 0) merged[k] = v;
155
+ }
156
+ const openRouterKey = merged.OPENROUTER_API_KEY?.trim();
157
+ const useRaw = merged.USE_OPENROUTER?.trim().toLowerCase();
158
+ const useOpenRouterExplicit = useRaw === "true" || useRaw === "1";
159
+ return {
160
+ hasOpenRouterKey: Boolean(openRouterKey),
161
+ useOpenRouterExplicit,
162
+ getVendorApiKey(providerId) {
163
+ const name = vendorApiKeyEnvName(providerId);
164
+ const val = merged[name]?.trim();
165
+ return val || void 0;
166
+ }
167
+ };
168
+ }
169
+ function shouldDefaultRouteViaOpenRouter(providerId, config) {
170
+ if (!config.hasOpenRouterKey) return false;
171
+ if (config.useOpenRouterExplicit) return true;
172
+ if (providerId && providerId !== "openrouter") {
173
+ return !config.getVendorApiKey(providerId);
174
+ }
175
+ return false;
176
+ }
177
+ function isEffectiveOpenRouterTransport(config, input = {}) {
178
+ if (input.routeViaOpenRouter === true) return true;
179
+ if (input.routeViaOpenRouter === false) return false;
180
+ const provider = input.provider?.trim().toLowerCase();
181
+ if (provider === "openrouter") return true;
182
+ const vendor = input.modelId?.includes("/") === true ? input.modelId.split("/")[0].trim().toLowerCase() : provider;
183
+ if (vendor && vendor !== "openrouter") {
184
+ return shouldDefaultRouteViaOpenRouter(vendor, config);
185
+ }
186
+ if (config.hasOpenRouterKey && config.useOpenRouterExplicit) return true;
187
+ return false;
188
+ }
189
+
19
190
  // src/sync/modelNameResolver/catalogIndexes.ts
20
191
  function buildCatalogIndexes(catalog) {
21
192
  const aliasIndex = /* @__PURE__ */ new Map();
@@ -35,6 +206,41 @@ function buildCatalogIndexes(catalog) {
35
206
  return { aliasIndex, slugIndex, providerPrefixesBySize };
36
207
  }
37
208
 
209
+ // src/sync/modelNameResolver/stripVersionSuffix.ts
210
+ var VERSION_STRIP_PATTERNS = [
211
+ { re: /-\d{4}-\d{2}-\d{2}$/, label: "date YYYY-MM-DD" },
212
+ { re: /-\d{8}$/, label: "date YYYYMMDD" },
213
+ { re: /-v\d+$/, label: "version -vN" },
214
+ { re: /-\d+\.\d+\.\d+$/, label: "semver" },
215
+ { re: /:\d+[a-z]?$/i, label: "colon version" },
216
+ { re: /-\d{4,}$/, label: "build number" },
217
+ { re: /@\d+$/, label: "epoch @NNNN" }
218
+ ];
219
+ function stripModelSlugSuffix(slug) {
220
+ for (const { re } of VERSION_STRIP_PATTERNS) {
221
+ if (re.test(slug)) {
222
+ return slug.replace(re, "");
223
+ }
224
+ }
225
+ return null;
226
+ }
227
+ function stripModelVersionSuffix(model) {
228
+ const normalized = normalizeString(model);
229
+ if (!normalized) return null;
230
+ if (normalized.includes("/")) {
231
+ const slash = normalized.indexOf("/");
232
+ const prefix = normalized.slice(0, slash);
233
+ const slug = normalized.slice(slash + 1);
234
+ const stripped2 = stripModelSlugSuffix(slug);
235
+ if (stripped2 && stripped2 !== slug) {
236
+ return `${prefix}/${stripped2}`;
237
+ }
238
+ return null;
239
+ }
240
+ const stripped = stripModelSlugSuffix(normalized);
241
+ return stripped && stripped !== normalized ? stripped : null;
242
+ }
243
+
38
244
  // src/sync/modelNameResolver/ModelNameResolver.ts
39
245
  var ModelNameResolver = class {
40
246
  catalog;
@@ -454,37 +660,19 @@ var ModelNameResolver = class {
454
660
  }
455
661
  };
456
662
 
457
- // src/models/reasoningModel.ts
458
- var REASONING_SUPPORTED_PARAMETERS = ["reasoning", "include_reasoning"];
459
- function supportsReasoningParameter(model) {
460
- return model.supportedParameters.some(
461
- (p) => REASONING_SUPPORTED_PARAMETERS.includes(p)
462
- );
463
- }
464
- function hasReasoningPricing(model) {
465
- const raw = model.openRouterPricing?.internal_reasoning;
466
- if (raw !== void 0 && raw !== null && String(raw).trim() !== "") {
467
- return true;
468
- }
469
- return model.pricing.reasoningUsdPerToken !== void 0;
470
- }
471
- function computeSupportsReasoning(model) {
472
- return supportsReasoningParameter(model) || hasReasoningPricing(model);
473
- }
474
- function isReasoningModel(model) {
475
- if (model.supportsReasoning !== void 0) {
476
- return model.supportsReasoning;
477
- }
478
- return computeSupportsReasoning(model);
479
- }
480
-
481
663
  export {
664
+ LOCAL_PROVIDERS,
665
+ PROVIDER_INFERENCE_MAP,
666
+ normalizeString,
667
+ normalizeProvider,
668
+ modelSlug,
669
+ stripModelVersionSuffix,
670
+ providerIdToEnvKeyPrefix,
671
+ vendorApiKeyEnvName,
672
+ loadOpenRouterRoutingEnv,
673
+ shouldDefaultRouteViaOpenRouter,
674
+ isEffectiveOpenRouterTransport,
482
675
  buildCatalogIndexes,
483
- ModelNameResolver,
484
- REASONING_SUPPORTED_PARAMETERS,
485
- supportsReasoningParameter,
486
- hasReasoningPricing,
487
- computeSupportsReasoning,
488
- isReasoningModel
676
+ ModelNameResolver
489
677
  };
490
- //# sourceMappingURL=chunk-54GKLIDW.js.map
678
+ //# sourceMappingURL=chunk-SYHLDADG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sync/modelNameResolver/constants.ts","../src/sync/modelNameResolver/normalize.ts","../src/sync/openRouterRoutingEnv.ts","../src/sync/modelNameResolver/catalogIndexes.ts","../src/sync/modelNameResolver/stripVersionSuffix.ts","../src/sync/modelNameResolver/ModelNameResolver.ts"],"sourcesContent":["export const DEFAULT_CONFIDENCE_THRESHOLD = 0.6;\n\nexport const PROVIDER_NORMALISATION_MAP: Record<string, string> = {\n \"open-router\": \"openrouter\",\n or: \"openrouter\",\n oai: \"openai\",\n \"open-ai\": \"openai\",\n claude: \"anthropic\",\n ant: \"anthropic\",\n gemini: \"google\",\n gcp: \"google\",\n \"google-ai\": \"google\",\n vertex: \"google\",\n meta: \"meta-llama\",\n llama: \"meta-llama\",\n \"mistral-ai\": \"mistral\",\n \"cohere-ai\": \"cohere\",\n};\n\nexport const LOCAL_PROVIDERS = new Set([\n \"ollama\",\n \"lmstudio\",\n \"lm-studio\",\n \"localai\",\n \"local-ai\",\n \"llamacpp\",\n \"llama.cpp\",\n \"llamafile\",\n \"jan\",\n \"koboldcpp\",\n]);\n\nexport const PROVIDER_INFERENCE_MAP: Array<{\n pattern: RegExp;\n provider: string;\n notes?: string;\n}> = [\n { pattern: /^gpt-/, provider: \"openai\" },\n { pattern: /^o1($|-)/, provider: \"openai\" },\n { pattern: /^o3($|-)/, provider: \"openai\" },\n { pattern: /^o4($|-)/, provider: \"openai\" },\n { pattern: /^chatgpt-/, provider: \"openai\" },\n { pattern: /^text-davinci/, provider: \"openai\" },\n { pattern: /^dall-e/, provider: \"openai\" },\n { pattern: /^whisper/, provider: \"openai\" },\n { pattern: /^tts-/, provider: \"openai\" },\n { pattern: /^claude-/, provider: \"anthropic\" },\n { pattern: /^gemini-/, provider: \"google\" },\n { pattern: /^palm-/, provider: \"google\" },\n { pattern: /^bison/, provider: \"google\" },\n { pattern: /^llama-?[23]/, provider: \"meta-llama\" },\n { pattern: /^llama/, provider: \"meta-llama\" },\n { pattern: /^codellama/, provider: \"meta-llama\" },\n { pattern: /^mistral-/, provider: \"mistral\" },\n { pattern: /^mixtral-/, provider: \"mistral\" },\n { pattern: /^codestral/, provider: \"mistral\" },\n { pattern: /^ministral/, provider: \"mistral\" },\n { pattern: /^command-/, provider: \"cohere\" },\n { pattern: /^c4ai-/, provider: \"cohere\" },\n { pattern: /^deepseek-/, provider: \"deepseek\" },\n { pattern: /^grok-/, provider: \"x-ai\" },\n { pattern: /^qwen/, provider: \"qwen\" },\n { pattern: /^yi-/, provider: \"01-ai\" },\n { pattern: /^sonar/, provider: \"perplexity\" },\n { pattern: /^pplx-/, provider: \"perplexity\" },\n { pattern: /^titan-/, provider: \"amazon\" },\n { pattern: /^nova-/, provider: \"amazon\" },\n];\n\nexport const SHORTHAND_MAP: Record<string, string> = {\n gpt4: \"openai/gpt-4\",\n gpt4o: \"openai/gpt-4o\",\n \"gpt-4-omni\": \"openai/gpt-4o\",\n gpt4omni: \"openai/gpt-4o\",\n \"gpt4-turbo\": \"openai/gpt-4-turbo\",\n gpt4turbo: \"openai/gpt-4-turbo\",\n \"gpt4-mini\": \"openai/gpt-4o-mini\",\n \"gpt-4o-mini\": \"openai/gpt-4o-mini\",\n o1: \"openai/o1\",\n \"o1-mini\": \"openai/o1-mini\",\n o3: \"openai/o3\",\n \"o3-mini\": \"openai/o3-mini\",\n \"o4-mini\": \"openai/o4-mini\",\n \"3.5-turbo\": \"openai/gpt-3.5-turbo\",\n gpt35: \"openai/gpt-3.5-turbo\",\n gpt3: \"openai/gpt-3.5-turbo\",\n claude3: \"anthropic/claude-3-5-sonnet-20241022\",\n \"claude-3\": \"anthropic/claude-3-5-sonnet-20241022\",\n \"claude3-sonnet\": \"anthropic/claude-3-5-sonnet-20241022\",\n \"claude-sonnet\": \"anthropic/claude-3-5-sonnet-20241022\",\n \"claude-haiku\": \"anthropic/claude-3-5-haiku-20241022\",\n \"claude3-haiku\": \"anthropic/claude-3-5-haiku-20241022\",\n \"claude-opus\": \"anthropic/claude-opus-4\",\n \"claude3-opus\": \"anthropic/claude-3-opus-20240229\",\n claude4: \"anthropic/claude-opus-4\",\n \"claude4-sonnet\": \"anthropic/claude-sonnet-4\",\n \"claude4-opus\": \"anthropic/claude-opus-4\",\n sonnet: \"anthropic/claude-3-5-sonnet-20241022\",\n haiku: \"anthropic/claude-3-5-haiku-20241022\",\n opus: \"anthropic/claude-opus-4\",\n gemini: \"google/gemini-pro\",\n \"gemini-pro\": \"google/gemini-pro\",\n \"gemini-flash\": \"google/gemini-flash-1.5\",\n gemini2: \"google/gemini-2.0-flash-001\",\n \"gemini-2\": \"google/gemini-2.0-flash-001\",\n llama3: \"meta-llama/llama-3.1-8b-instruct\",\n \"llama-3\": \"meta-llama/llama-3.1-8b-instruct\",\n llama2: \"meta-llama/llama-2-13b-chat\",\n \"llama-2\": \"meta-llama/llama-2-13b-chat\",\n mistral: \"mistral/mistral-7b-instruct\",\n \"mistral-large\": \"mistral/mistral-large-latest\",\n mixtral: \"mistral/mixtral-8x7b-instruct\",\n deepseek: \"deepseek/deepseek-chat\",\n \"deepseek-r1\": \"deepseek/deepseek-r1\",\n};\n","import { PROVIDER_NORMALISATION_MAP } from \"./constants.js\";\n\nexport function normalizeString(input: string): string {\n let s = input.trim();\n s = s.replace(/\\s+/g, \" \").replace(/ /g, \"-\");\n s = s.toLowerCase();\n s = s.replace(/^\\/+|\\/+$/g, \"\");\n s = s.replace(/\\/+/g, \"/\");\n if (\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith(\"'\") && s.endsWith(\"'\"))\n ) {\n s = s.slice(1, -1);\n }\n return s;\n}\n\nexport function normalizeProvider(provider: string | undefined): string | undefined {\n if (provider === undefined || provider === \"\") return undefined;\n const n = normalizeString(provider);\n return PROVIDER_NORMALISATION_MAP[n] ?? n;\n}\n\nexport function tokenise(s: string): string[] {\n return s.split(/[-_./]+/).filter(Boolean);\n}\n\nexport function modelSlug(modelId: string): string {\n const slash = modelId.indexOf(\"/\");\n return slash >= 0 ? modelId.slice(slash + 1) : modelId;\n}\n","import { loadDotenv } from \"@x12i/env\";\n\n/**\n * Env naming for vendor direct API keys: `{VENDOR}_API_KEY`\n * where VENDOR is the provider id in UPPER_SNAKE (hyphens → underscores).\n *\n * Examples: `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `META_LLAMA_API_KEY`, `X_AI_API_KEY`\n */\nexport function providerIdToEnvKeyPrefix(providerId: string): string {\n return providerId\n .trim()\n .toLowerCase()\n .replace(/-/g, \"_\")\n .toUpperCase();\n}\n\nexport function vendorApiKeyEnvName(providerId: string): string {\n return `${providerIdToEnvKeyPrefix(providerId)}_API_KEY`;\n}\n\nexport type OpenRouterRoutingConfig = {\n /** OPENROUTER_API_KEY is set and non-empty */\n hasOpenRouterKey: boolean;\n /** USE_OPENROUTER=true or USE_OPENROUTER=1 */\n useOpenRouterExplicit: boolean;\n /** Read `{PROVIDER}_API_KEY` for a catalog provider id */\n getVendorApiKey(providerId: string): string | undefined;\n};\n\n/**\n * Load routing hints from process env and optional `.env` (via @x12/env).\n */\nexport function loadOpenRouterRoutingEnv(\n env: Record<string, string | undefined> = process.env,\n): OpenRouterRoutingConfig {\n const dotenv = loadDotenv();\n const merged: Record<string, string> = {};\n for (const [k, v] of Object.entries(dotenv)) {\n if (v !== undefined) merged[k] = v;\n }\n for (const [k, v] of Object.entries(env)) {\n if (v !== undefined) merged[k] = v;\n }\n\n const openRouterKey = merged.OPENROUTER_API_KEY?.trim();\n const useRaw = merged.USE_OPENROUTER?.trim().toLowerCase();\n const useOpenRouterExplicit = useRaw === \"true\" || useRaw === \"1\";\n\n return {\n hasOpenRouterKey: Boolean(openRouterKey),\n useOpenRouterExplicit,\n getVendorApiKey(providerId: string) {\n const name = vendorApiKeyEnvName(providerId);\n const val = merged[name]?.trim();\n return val || undefined;\n },\n };\n}\n\n/**\n * Default route via OpenRouter when:\n * 1. OPENROUTER_API_KEY is set AND USE_OPENROUTER=true|1, or\n * 2. OPENROUTER_API_KEY is set AND the vendor's `{VENDOR}_API_KEY` is missing.\n */\nexport function shouldDefaultRouteViaOpenRouter(\n providerId: string | undefined,\n config: OpenRouterRoutingConfig,\n): boolean {\n if (!config.hasOpenRouterKey) return false;\n if (config.useOpenRouterExplicit) return true;\n if (providerId && providerId !== \"openrouter\") {\n return !config.getVendorApiKey(providerId);\n }\n return false;\n}\n\nexport type EffectiveOpenRouterTransportInput = {\n provider?: string;\n modelId?: string;\n routeViaOpenRouter?: boolean;\n};\n\n/**\n * Whether the effective runtime transport is OpenRouter.\n * Honors explicit gateway override, then env defaults from {@link loadOpenRouterRoutingEnv}.\n */\nexport function isEffectiveOpenRouterTransport(\n config: OpenRouterRoutingConfig,\n input: EffectiveOpenRouterTransportInput = {},\n): boolean {\n if (input.routeViaOpenRouter === true) return true;\n if (input.routeViaOpenRouter === false) return false;\n\n const provider = input.provider?.trim().toLowerCase();\n if (provider === \"openrouter\") return true;\n\n const vendor =\n input.modelId?.includes(\"/\") === true\n ? input.modelId.split(\"/\")[0]!.trim().toLowerCase()\n : provider;\n\n if (vendor && vendor !== \"openrouter\") {\n return shouldDefaultRouteViaOpenRouter(vendor, config);\n }\n\n if (config.hasOpenRouterKey && config.useOpenRouterExplicit) return true;\n return false;\n}\n","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 { normalizeString } from \"./normalize.js\";\n\n/** Patterns stripped when resolving versioned runtime model ids to catalog entries. */\nexport const VERSION_STRIP_PATTERNS: ReadonlyArray<{ re: RegExp; label: string }> = [\n { re: /-\\d{4}-\\d{2}-\\d{2}$/, label: \"date YYYY-MM-DD\" },\n { re: /-\\d{8}$/, label: \"date YYYYMMDD\" },\n { re: /-v\\d+$/, label: \"version -vN\" },\n { re: /-\\d+\\.\\d+\\.\\d+$/, label: \"semver\" },\n { re: /:\\d+[a-z]?$/i, label: \"colon version\" },\n { re: /-\\d{4,}$/, label: \"build number\" },\n { re: /@\\d+$/, label: \"epoch @NNNN\" },\n];\n\n/** Strip version/date suffix from a bare slug (no `provider/` prefix). */\nexport function stripModelSlugSuffix(slug: string): string | null {\n for (const { re } of VERSION_STRIP_PATTERNS) {\n if (re.test(slug)) {\n return slug.replace(re, \"\");\n }\n }\n return null;\n}\n\n/**\n * Strip a version/date suffix from a model id (`gpt-5.5-2026-04-23` → `gpt-5.5`,\n * `openai/gpt-4o-2024-08-06` → `openai/gpt-4o`). Returns null when nothing was stripped.\n */\nexport function stripModelVersionSuffix(model: string): string | null {\n const normalized = normalizeString(model);\n if (!normalized) return null;\n\n if (normalized.includes(\"/\")) {\n const slash = normalized.indexOf(\"/\");\n const prefix = normalized.slice(0, slash);\n const slug = normalized.slice(slash + 1);\n const stripped = stripModelSlugSuffix(slug);\n if (stripped && stripped !== slug) {\n return `${prefix}/${stripped}`;\n }\n return null;\n }\n\n const stripped = stripModelSlugSuffix(normalized);\n return stripped && stripped !== normalized ? stripped : null;\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"],"mappings":"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","names":["stripped"]}
@@ -5,18 +5,18 @@
5
5
 
6
6
 
7
7
 
8
- var _chunkBCX5CLJJcjs = require('./chunk-BCX5CLJJ.cjs');
8
+ var _chunk5XBMNY7Qcjs = require('./chunk-5XBMNY7Q.cjs');
9
9
 
10
10
 
11
11
  var _chunkGS7T56RPcjs = require('./chunk-GS7T56RP.cjs');
12
12
 
13
13
  // src/cost/costModelResolution.ts
14
14
  function isOpenRouterProvider(provider) {
15
- return _chunkBCX5CLJJcjs.normalizeProvider.call(void 0, provider) === "openrouter";
15
+ return _chunk5XBMNY7Qcjs.normalizeProvider.call(void 0, provider) === "openrouter";
16
16
  }
17
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);
18
+ const p = _nullishCoalesce(_chunk5XBMNY7Qcjs.normalizeProvider.call(void 0, provider), () => ( _chunk5XBMNY7Qcjs.normalizeString.call(void 0, _nullishCoalesce(provider, () => ( "")))));
19
+ return _chunk5XBMNY7Qcjs.LOCAL_PROVIDERS.has(p);
20
20
  }
21
21
  function isLocalProviderResolution(resolved, inputProvider) {
22
22
  if (!_optionalChain([resolved, 'optionalAccess', _ => _.found]) || resolved.record) return false;
@@ -24,13 +24,13 @@ function isLocalProviderResolution(resolved, inputProvider) {
24
24
  return isLocalProvider(inputProvider);
25
25
  }
26
26
  function underlyingProviderFromModel(model, providerHint) {
27
- const normalized = _chunkBCX5CLJJcjs.normalizeString.call(void 0, model);
27
+ const normalized = _chunk5XBMNY7Qcjs.normalizeString.call(void 0, model);
28
28
  if (normalized.includes("/")) {
29
29
  const prefix = normalized.split("/")[0];
30
30
  if (!isOpenRouterProvider(prefix)) return prefix;
31
31
  }
32
32
  if (providerHint && !isOpenRouterProvider(providerHint)) {
33
- return _chunkBCX5CLJJcjs.normalizeProvider.call(void 0, providerHint);
33
+ return _chunk5XBMNY7Qcjs.normalizeProvider.call(void 0, providerHint);
34
34
  }
35
35
  return void 0;
36
36
  }
@@ -38,13 +38,13 @@ function providerHintForProfiles(model, provider) {
38
38
  if (isOpenRouterProvider(provider)) {
39
39
  return underlyingProviderFromModel(model, provider);
40
40
  }
41
- return _chunkBCX5CLJJcjs.normalizeProvider.call(void 0, provider);
41
+ return _chunk5XBMNY7Qcjs.normalizeProvider.call(void 0, provider);
42
42
  }
43
43
  function buildCatalogResolveAttempts(model, provider) {
44
44
  const attempts = [];
45
45
  const seen = /* @__PURE__ */ new Set();
46
46
  const add = (m, p) => {
47
- const key = `${_nullishCoalesce(p, () => ( ""))}\0${_chunkBCX5CLJJcjs.normalizeString.call(void 0, m)}`;
47
+ const key = `${_nullishCoalesce(p, () => ( ""))}\0${_chunk5XBMNY7Qcjs.normalizeString.call(void 0, m)}`;
48
48
  if (seen.has(key)) return;
49
49
  seen.add(key);
50
50
  attempts.push({ model: m, provider: p });
@@ -72,7 +72,7 @@ async function resolveFromCatalogAttempts(catalog, attempts, options) {
72
72
  return _nullishCoalesce(localPassthrough, () => ( last));
73
73
  }
74
74
  function resolveRoutedViaOpenRouter(inputProvider, resolved, modelId, routingEnv) {
75
- const env = _nullishCoalesce(routingEnv, () => ( _chunkBCX5CLJJcjs.loadOpenRouterRoutingEnv.call(void 0, )));
75
+ const env = _nullishCoalesce(routingEnv, () => ( _chunk5XBMNY7Qcjs.loadOpenRouterRoutingEnv.call(void 0, )));
76
76
  if (isOpenRouterProvider(inputProvider)) return true;
77
77
  if (_optionalChain([resolved, 'optionalAccess', _2 => _2.found])) {
78
78
  return resolved.routedViaOpenRouter;
@@ -81,7 +81,7 @@ function resolveRoutedViaOpenRouter(inputProvider, resolved, modelId, routingEnv
81
81
  _nullishCoalesce(_nullishCoalesce(modelId, () => ( (_optionalChain([resolved, 'optionalAccess', _3 => _3.found]) ? resolved.modelId : ""))), () => ( "")),
82
82
  inputProvider
83
83
  );
84
- if (vendor && _chunkBCX5CLJJcjs.shouldDefaultRouteViaOpenRouter.call(void 0, vendor, env)) {
84
+ if (vendor && _chunk5XBMNY7Qcjs.shouldDefaultRouteViaOpenRouter.call(void 0, vendor, env)) {
85
85
  return true;
86
86
  }
87
87
  return false;
@@ -101,9 +101,9 @@ function profileKey(value) {
101
101
  return value.trim().toLowerCase();
102
102
  }
103
103
  function canonicalModelId(provider, modelId) {
104
- const normalized = _chunkBCX5CLJJcjs.normalizeString.call(void 0, modelId);
104
+ const normalized = _chunk5XBMNY7Qcjs.normalizeString.call(void 0, modelId);
105
105
  if (normalized.includes("/")) return normalized;
106
- const p = _nullishCoalesce(_chunkBCX5CLJJcjs.normalizeProvider.call(void 0, provider), () => ( _chunkBCX5CLJJcjs.normalizeString.call(void 0, provider)));
106
+ const p = _nullishCoalesce(_chunk5XBMNY7Qcjs.normalizeProvider.call(void 0, provider), () => ( _chunk5XBMNY7Qcjs.normalizeString.call(void 0, provider)));
107
107
  return `${p}/${normalized}`;
108
108
  }
109
109
  var cachedIndex = null;
@@ -133,8 +133,8 @@ function indexRegistry(registry) {
133
133
  function choiceEntry(choice, profile, choiceKey) {
134
134
  const canonical = canonicalModelId(choice.provider, choice.modelId);
135
135
  return {
136
- provider: _nullishCoalesce(_chunkBCX5CLJJcjs.normalizeProvider.call(void 0, choice.provider), () => ( choice.provider)),
137
- modelId: _chunkBCX5CLJJcjs.normalizeString.call(void 0, choice.modelId),
136
+ provider: _nullishCoalesce(_chunk5XBMNY7Qcjs.normalizeProvider.call(void 0, choice.provider), () => ( choice.provider)),
137
+ modelId: _chunk5XBMNY7Qcjs.normalizeString.call(void 0, choice.modelId),
138
138
  canonicalModelId: canonical,
139
139
  pricing: choice.pricing,
140
140
  profile,
@@ -152,7 +152,7 @@ async function getProfileIndex() {
152
152
  return byKey;
153
153
  }
154
154
  function scoreCandidate(entry, model, providerHint) {
155
- const normalized = _chunkBCX5CLJJcjs.normalizeString.call(void 0, model);
155
+ const normalized = _chunk5XBMNY7Qcjs.normalizeString.call(void 0, model);
156
156
  let score = 0;
157
157
  if (normalized === entry.canonicalModelId) score += 100;
158
158
  if (normalized === entry.modelId) score += 80;
@@ -177,8 +177,8 @@ function pickBest(candidates, model, providerHint) {
177
177
  }
178
178
  function resolvedToMatch(resolved) {
179
179
  return {
180
- provider: _nullishCoalesce(_chunkBCX5CLJJcjs.normalizeProvider.call(void 0, resolved.provider), () => ( resolved.provider)),
181
- modelId: _chunkBCX5CLJJcjs.normalizeString.call(void 0, resolved.modelId),
180
+ provider: _nullishCoalesce(_chunk5XBMNY7Qcjs.normalizeProvider.call(void 0, resolved.provider), () => ( resolved.provider)),
181
+ modelId: _chunk5XBMNY7Qcjs.normalizeString.call(void 0, resolved.modelId),
182
182
  canonicalModelId: canonicalModelId(resolved.provider, resolved.modelId),
183
183
  pricing: resolved.pricing,
184
184
  instructionTier: resolved.instructionTier,
@@ -191,8 +191,8 @@ function resolvedToMatch(resolved) {
191
191
  async function fromIndexed(entry) {
192
192
  const resolved = await _aiprofiles.resolveAIProfile.call(void 0, entry.profile, { choice: entry.choice });
193
193
  return {
194
- provider: _nullishCoalesce(_chunkBCX5CLJJcjs.normalizeProvider.call(void 0, resolved.provider), () => ( resolved.provider)),
195
- modelId: _chunkBCX5CLJJcjs.normalizeString.call(void 0, resolved.modelId),
194
+ provider: _nullishCoalesce(_chunk5XBMNY7Qcjs.normalizeProvider.call(void 0, resolved.provider), () => ( resolved.provider)),
195
+ modelId: _chunk5XBMNY7Qcjs.normalizeString.call(void 0, resolved.modelId),
196
196
  canonicalModelId: canonicalModelId(resolved.provider, resolved.modelId),
197
197
  pricing: _nullishCoalesce(resolved.pricing, () => ( entry.pricing)),
198
198
  instructionTier: resolved.instructionTier,
@@ -203,10 +203,10 @@ async function fromIndexed(entry) {
203
203
  };
204
204
  }
205
205
  async function lookupInIndex(index, model, provider) {
206
- const providerHint = provider ? _chunkBCX5CLJJcjs.normalizeProvider.call(void 0, provider) : void 0;
206
+ const providerHint = provider ? _chunk5XBMNY7Qcjs.normalizeProvider.call(void 0, provider) : void 0;
207
207
  const keys = [
208
208
  profileKey(model),
209
- profileKey(_chunkBCX5CLJJcjs.normalizeString.call(void 0, model))
209
+ profileKey(_chunk5XBMNY7Qcjs.normalizeString.call(void 0, model))
210
210
  ];
211
211
  if (providerHint) {
212
212
  keys.push(profileKey(canonicalModelId(providerHint, model)));
@@ -216,7 +216,7 @@ async function lookupInIndex(index, model, provider) {
216
216
  const hits = index.get(key);
217
217
  if (hits) pooled.push(...hits);
218
218
  }
219
- const bare = _chunkBCX5CLJJcjs.normalizeString.call(void 0, model);
219
+ const bare = _chunk5XBMNY7Qcjs.normalizeString.call(void 0, model);
220
220
  if (!bare.includes("/")) {
221
221
  for (const list of index.values()) {
222
222
  for (const entry of list) {
@@ -244,8 +244,8 @@ async function matchModelInAiProfiles(model, provider) {
244
244
  const hint = providerHintForProfiles(model, provider);
245
245
  const direct = await lookupInIndex(index, model, hint);
246
246
  if (direct) return direct;
247
- const stripped = _chunkBCX5CLJJcjs.stripModelVersionSuffix.call(void 0, model);
248
- if (stripped && stripped !== _chunkBCX5CLJJcjs.normalizeString.call(void 0, model)) {
247
+ const stripped = _chunk5XBMNY7Qcjs.stripModelVersionSuffix.call(void 0, model);
248
+ if (stripped && stripped !== _chunk5XBMNY7Qcjs.normalizeString.call(void 0, model)) {
249
249
  return lookupInIndex(
250
250
  index,
251
251
  stripped,
@@ -263,4 +263,4 @@ async function matchModelInAiProfiles(model, provider) {
263
263
 
264
264
 
265
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
266
+ //# sourceMappingURL=chunk-TDO5SDQ3.cjs.map