@x12i/ai-tools 1.0.4 → 2.0.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 (153) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +146 -204
  3. package/dist/AiModelsCatalogClient-B5FMI9gj.d.cts +58 -0
  4. package/dist/AiModelsCatalogClient-CPPNI6Ry.d.ts +58 -0
  5. package/dist/aliases/index.cjs +4 -3
  6. package/dist/aliases/index.cjs.map +1 -1
  7. package/dist/aliases/index.d.cts +3 -5
  8. package/dist/aliases/index.d.ts +3 -5
  9. package/dist/aliases/index.js +2 -2
  10. package/dist/catalog/index.cjs +18 -9
  11. package/dist/catalog/index.cjs.map +1 -1
  12. package/dist/catalog/index.d.cts +13 -100
  13. package/dist/catalog/index.d.ts +13 -100
  14. package/dist/catalog/index.js +31 -23
  15. package/dist/{chunk-AJEKEWWB.js → chunk-2PTCWPHV.js} +17 -3
  16. package/dist/chunk-2PTCWPHV.js.map +1 -0
  17. package/dist/chunk-56R4XA2S.js +1 -0
  18. package/dist/chunk-5GUKLOEK.cjs +1 -0
  19. package/dist/chunk-5GUKLOEK.cjs.map +1 -0
  20. package/dist/chunk-5XAAMBDO.cjs +1988 -0
  21. package/dist/chunk-5XAAMBDO.cjs.map +1 -0
  22. package/dist/chunk-6BQBKROR.js +95 -0
  23. package/dist/chunk-6BQBKROR.js.map +1 -0
  24. package/dist/chunk-AB5GNXJ4.js +46 -0
  25. package/dist/chunk-AB5GNXJ4.js.map +1 -0
  26. package/dist/{chunk-O2A6OVEH.js → chunk-ANVONYJF.js} +2 -2
  27. package/dist/{chunk-O2A6OVEH.js.map → chunk-ANVONYJF.js.map} +1 -1
  28. package/dist/chunk-B3V2EHRY.js +225 -0
  29. package/dist/chunk-B3V2EHRY.js.map +1 -0
  30. package/dist/{chunk-QWAX7VQO.cjs → chunk-BAHBDADJ.cjs} +11 -11
  31. package/dist/{chunk-QWAX7VQO.cjs.map → chunk-BAHBDADJ.cjs.map} +1 -1
  32. package/dist/{chunk-TF4L2NEC.cjs → chunk-DXZOL3VN.cjs} +62 -313
  33. package/dist/chunk-DXZOL3VN.cjs.map +1 -0
  34. package/dist/chunk-EDMCKHO6.cjs +225 -0
  35. package/dist/chunk-EDMCKHO6.cjs.map +1 -0
  36. package/dist/{chunk-DJ5SWJDY.js → chunk-EYHMQVAL.js} +48 -299
  37. package/dist/chunk-EYHMQVAL.js.map +1 -0
  38. package/dist/chunk-GS7T56RP.cjs +8 -0
  39. package/dist/chunk-GS7T56RP.cjs.map +1 -0
  40. package/dist/chunk-NF2SKQR7.cjs +973 -0
  41. package/dist/chunk-NF2SKQR7.cjs.map +1 -0
  42. package/dist/chunk-OPN6BGNH.js +1985 -0
  43. package/dist/chunk-OPN6BGNH.js.map +1 -0
  44. package/dist/{chunk-7Q742NI3.cjs → chunk-PADNCGZB.cjs} +17 -3
  45. package/dist/chunk-PADNCGZB.cjs.map +1 -0
  46. package/dist/chunk-PRCICORG.cjs +95 -0
  47. package/dist/chunk-PRCICORG.cjs.map +1 -0
  48. package/dist/{chunk-6QGDZTGH.js → chunk-SIH4GPV4.js} +4 -29
  49. package/dist/chunk-SIH4GPV4.js.map +1 -0
  50. package/dist/chunk-U2YDDUVP.js +970 -0
  51. package/dist/chunk-U2YDDUVP.js.map +1 -0
  52. package/dist/{chunk-4NAY6HRP.js → chunk-VJHLO2R3.js} +7 -58
  53. package/dist/chunk-VJHLO2R3.js.map +1 -0
  54. package/dist/chunk-XAWBTX3N.cjs +46 -0
  55. package/dist/chunk-XAWBTX3N.cjs.map +1 -0
  56. package/dist/{chunk-AV6OE2YQ.cjs → chunk-XOKUDUUI.cjs} +14 -39
  57. package/dist/chunk-XOKUDUUI.cjs.map +1 -0
  58. package/dist/chunk-YQDSN6R6.cjs +86 -0
  59. package/dist/chunk-YQDSN6R6.cjs.map +1 -0
  60. package/dist/cli/index.cjs +59 -201
  61. package/dist/cli/index.cjs.map +1 -1
  62. package/dist/cli/index.js +53 -198
  63. package/dist/cli/index.js.map +1 -1
  64. package/dist/cost/index.cjs +19 -3
  65. package/dist/cost/index.cjs.map +1 -1
  66. package/dist/cost/index.d.cts +10 -50
  67. package/dist/cost/index.d.ts +10 -50
  68. package/dist/cost/index.js +18 -3
  69. package/dist/index.cjs +24 -16
  70. package/dist/index.cjs.map +1 -1
  71. package/dist/index.d.cts +13 -13
  72. package/dist/index.d.ts +13 -13
  73. package/dist/index.js +44 -37
  74. package/dist/modelCache-BzRn6t_C.d.ts +113 -0
  75. package/dist/modelCache-CJftI-Ko.d.cts +113 -0
  76. package/dist/{modelNameResolver-DqFt7g6W.d.ts → modelNameResolver-5XkBMctP.d.ts} +2 -6
  77. package/dist/{modelNameResolver-D9V_GfUK.d.cts → modelNameResolver-C5CSTGFF.d.cts} +2 -6
  78. package/dist/models/index.cjs +9 -6
  79. package/dist/models/index.cjs.map +1 -1
  80. package/dist/models/index.d.cts +9 -31
  81. package/dist/models/index.d.ts +9 -31
  82. package/dist/models/index.js +9 -7
  83. package/dist/resolveUsageModel-BFwf80Hz.d.ts +140 -0
  84. package/dist/resolveUsageModel-C_YmGR1M.d.cts +140 -0
  85. package/dist/sync/index.cjs +7 -9
  86. package/dist/sync/index.cjs.map +1 -1
  87. package/dist/sync/index.d.cts +3 -8
  88. package/dist/sync/index.d.ts +3 -8
  89. package/dist/sync/index.js +8 -11
  90. package/dist/toolbox/index.cjs +1 -0
  91. package/dist/toolbox/index.cjs.map +1 -1
  92. package/dist/types-BrzJWsTU.d.cts +277 -0
  93. package/dist/types-BrzJWsTU.d.ts +277 -0
  94. package/package.json +9 -20
  95. package/src/data/models-catalog.json +670 -0
  96. package/src/data/openrouter-models-catalog.json +857 -0
  97. package/dist/AiModelsCatalogClient-4RF5BCDL.cjs +0 -9
  98. package/dist/AiModelsCatalogClient-4RF5BCDL.cjs.map +0 -1
  99. package/dist/AiModelsCatalogClient-CNeqFiFs.d.cts +0 -30
  100. package/dist/AiModelsCatalogClient-NUF3CBLW.js +0 -9
  101. package/dist/AiModelsCatalogClient-nwFoEaqL.d.ts +0 -30
  102. package/dist/catalox/index.cjs +0 -21
  103. package/dist/catalox/index.cjs.map +0 -1
  104. package/dist/catalox/index.d.cts +0 -11
  105. package/dist/catalox/index.d.ts +0 -11
  106. package/dist/catalox/index.js +0 -21
  107. package/dist/catalox/index.js.map +0 -1
  108. package/dist/chunk-4NAY6HRP.js.map +0 -1
  109. package/dist/chunk-6QGDZTGH.js.map +0 -1
  110. package/dist/chunk-7Q742NI3.cjs.map +0 -1
  111. package/dist/chunk-AJEKEWWB.js.map +0 -1
  112. package/dist/chunk-AV6OE2YQ.cjs.map +0 -1
  113. package/dist/chunk-C3H7RTFR.cjs +0 -1
  114. package/dist/chunk-C3H7RTFR.cjs.map +0 -1
  115. package/dist/chunk-DJ5SWJDY.js.map +0 -1
  116. package/dist/chunk-DKHGWHXP.cjs +0 -169
  117. package/dist/chunk-DKHGWHXP.cjs.map +0 -1
  118. package/dist/chunk-F2F4UEFD.cjs +0 -75
  119. package/dist/chunk-F2F4UEFD.cjs.map +0 -1
  120. package/dist/chunk-FGP3QXWL.cjs +0 -163
  121. package/dist/chunk-FGP3QXWL.cjs.map +0 -1
  122. package/dist/chunk-G2G4KSC5.js +0 -30
  123. package/dist/chunk-G2G4KSC5.js.map +0 -1
  124. package/dist/chunk-HN6UAQAE.cjs +0 -83
  125. package/dist/chunk-HN6UAQAE.cjs.map +0 -1
  126. package/dist/chunk-HS74X2OJ.cjs +0 -172
  127. package/dist/chunk-HS74X2OJ.cjs.map +0 -1
  128. package/dist/chunk-HYGXZY25.js +0 -163
  129. package/dist/chunk-HYGXZY25.js.map +0 -1
  130. package/dist/chunk-KQOALKKX.js +0 -75
  131. package/dist/chunk-KQOALKKX.js.map +0 -1
  132. package/dist/chunk-LYOU7CA2.cjs +0 -30
  133. package/dist/chunk-LYOU7CA2.cjs.map +0 -1
  134. package/dist/chunk-M5TMA73F.js +0 -1
  135. package/dist/chunk-M5TMA73F.js.map +0 -1
  136. package/dist/chunk-MX3AMQFC.js +0 -172
  137. package/dist/chunk-MX3AMQFC.js.map +0 -1
  138. package/dist/chunk-QCRLKVB3.cjs +0 -137
  139. package/dist/chunk-QCRLKVB3.cjs.map +0 -1
  140. package/dist/chunk-TF4L2NEC.cjs.map +0 -1
  141. package/dist/chunk-VRFVF5RH.js +0 -169
  142. package/dist/chunk-VRFVF5RH.js.map +0 -1
  143. package/dist/chunk-YHO57D2V.js +0 -83
  144. package/dist/chunk-YHO57D2V.js.map +0 -1
  145. package/dist/syncAiModelsCatalog-CnXRLm2c.d.cts +0 -32
  146. package/dist/syncAiModelsCatalog-DpkN_w7S.d.ts +0 -32
  147. package/dist/types-BYXnCvKx.d.cts +0 -137
  148. package/dist/types-BYXnCvKx.d.ts +0 -137
  149. package/dist/types-CX6QFNNy.d.cts +0 -144
  150. package/dist/types-CuiPDcVs.d.ts +0 -144
  151. package/dist/upsertAiModelRecord-C831wOIF.d.ts +0 -35
  152. package/dist/upsertAiModelRecord-CjY-sny0.d.cts +0 -35
  153. /package/dist/{AiModelsCatalogClient-NUF3CBLW.js.map → chunk-56R4XA2S.js.map} +0 -0
@@ -0,0 +1,225 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/sync/modelNameResolver/constants.ts
2
+ var DEFAULT_CONFIDENCE_THRESHOLD = 0.6;
3
+ var PROVIDER_NORMALISATION_MAP = {
4
+ "open-router": "openrouter",
5
+ or: "openrouter",
6
+ oai: "openai",
7
+ "open-ai": "openai",
8
+ claude: "anthropic",
9
+ ant: "anthropic",
10
+ gemini: "google",
11
+ gcp: "google",
12
+ "google-ai": "google",
13
+ vertex: "google",
14
+ meta: "meta-llama",
15
+ llama: "meta-llama",
16
+ "mistral-ai": "mistral",
17
+ "cohere-ai": "cohere"
18
+ };
19
+ var LOCAL_PROVIDERS = /* @__PURE__ */ new Set([
20
+ "ollama",
21
+ "lmstudio",
22
+ "lm-studio",
23
+ "localai",
24
+ "local-ai",
25
+ "llamacpp",
26
+ "llama.cpp",
27
+ "llamafile",
28
+ "jan",
29
+ "koboldcpp"
30
+ ]);
31
+ var PROVIDER_INFERENCE_MAP = [
32
+ { pattern: /^gpt-/, provider: "openai" },
33
+ { pattern: /^o1($|-)/, provider: "openai" },
34
+ { pattern: /^o3($|-)/, provider: "openai" },
35
+ { pattern: /^o4($|-)/, provider: "openai" },
36
+ { pattern: /^chatgpt-/, provider: "openai" },
37
+ { pattern: /^text-davinci/, provider: "openai" },
38
+ { pattern: /^dall-e/, provider: "openai" },
39
+ { pattern: /^whisper/, provider: "openai" },
40
+ { pattern: /^tts-/, provider: "openai" },
41
+ { pattern: /^claude-/, provider: "anthropic" },
42
+ { pattern: /^gemini-/, provider: "google" },
43
+ { pattern: /^palm-/, provider: "google" },
44
+ { pattern: /^bison/, provider: "google" },
45
+ { pattern: /^llama-?[23]/, provider: "meta-llama" },
46
+ { pattern: /^llama/, provider: "meta-llama" },
47
+ { pattern: /^codellama/, provider: "meta-llama" },
48
+ { pattern: /^mistral-/, provider: "mistral" },
49
+ { pattern: /^mixtral-/, provider: "mistral" },
50
+ { pattern: /^codestral/, provider: "mistral" },
51
+ { pattern: /^ministral/, provider: "mistral" },
52
+ { pattern: /^command-/, provider: "cohere" },
53
+ { pattern: /^c4ai-/, provider: "cohere" },
54
+ { pattern: /^deepseek-/, provider: "deepseek" },
55
+ { pattern: /^grok-/, provider: "x-ai" },
56
+ { pattern: /^qwen/, provider: "qwen" },
57
+ { pattern: /^yi-/, provider: "01-ai" },
58
+ { pattern: /^sonar/, provider: "perplexity" },
59
+ { pattern: /^pplx-/, provider: "perplexity" },
60
+ { pattern: /^titan-/, provider: "amazon" },
61
+ { pattern: /^nova-/, provider: "amazon" }
62
+ ];
63
+ var SHORTHAND_MAP = {
64
+ gpt4: "openai/gpt-4",
65
+ gpt4o: "openai/gpt-4o",
66
+ "gpt-4-omni": "openai/gpt-4o",
67
+ gpt4omni: "openai/gpt-4o",
68
+ "gpt4-turbo": "openai/gpt-4-turbo",
69
+ gpt4turbo: "openai/gpt-4-turbo",
70
+ "gpt4-mini": "openai/gpt-4o-mini",
71
+ "gpt-4o-mini": "openai/gpt-4o-mini",
72
+ o1: "openai/o1",
73
+ "o1-mini": "openai/o1-mini",
74
+ o3: "openai/o3",
75
+ "o3-mini": "openai/o3-mini",
76
+ "o4-mini": "openai/o4-mini",
77
+ "3.5-turbo": "openai/gpt-3.5-turbo",
78
+ gpt35: "openai/gpt-3.5-turbo",
79
+ gpt3: "openai/gpt-3.5-turbo",
80
+ claude3: "anthropic/claude-3-5-sonnet-20241022",
81
+ "claude-3": "anthropic/claude-3-5-sonnet-20241022",
82
+ "claude3-sonnet": "anthropic/claude-3-5-sonnet-20241022",
83
+ "claude-sonnet": "anthropic/claude-3-5-sonnet-20241022",
84
+ "claude-haiku": "anthropic/claude-3-5-haiku-20241022",
85
+ "claude3-haiku": "anthropic/claude-3-5-haiku-20241022",
86
+ "claude-opus": "anthropic/claude-opus-4",
87
+ "claude3-opus": "anthropic/claude-3-opus-20240229",
88
+ claude4: "anthropic/claude-opus-4",
89
+ "claude4-sonnet": "anthropic/claude-sonnet-4",
90
+ "claude4-opus": "anthropic/claude-opus-4",
91
+ sonnet: "anthropic/claude-3-5-sonnet-20241022",
92
+ haiku: "anthropic/claude-3-5-haiku-20241022",
93
+ opus: "anthropic/claude-opus-4",
94
+ gemini: "google/gemini-pro",
95
+ "gemini-pro": "google/gemini-pro",
96
+ "gemini-flash": "google/gemini-flash-1.5",
97
+ gemini2: "google/gemini-2.0-flash-001",
98
+ "gemini-2": "google/gemini-2.0-flash-001",
99
+ llama3: "meta-llama/llama-3.1-8b-instruct",
100
+ "llama-3": "meta-llama/llama-3.1-8b-instruct",
101
+ llama2: "meta-llama/llama-2-13b-chat",
102
+ "llama-2": "meta-llama/llama-2-13b-chat",
103
+ mistral: "mistral/mistral-7b-instruct",
104
+ "mistral-large": "mistral/mistral-large-latest",
105
+ mixtral: "mistral/mixtral-8x7b-instruct",
106
+ deepseek: "deepseek/deepseek-chat",
107
+ "deepseek-r1": "deepseek/deepseek-r1"
108
+ };
109
+
110
+ // src/sync/modelNameResolver/normalize.ts
111
+ function normalizeString(input) {
112
+ let s = input.trim();
113
+ s = s.replace(/\s+/g, " ").replace(/ /g, "-");
114
+ s = s.toLowerCase();
115
+ s = s.replace(/^\/+|\/+$/g, "");
116
+ s = s.replace(/\/+/g, "/");
117
+ if (s.startsWith('"') && s.endsWith('"') || s.startsWith("'") && s.endsWith("'")) {
118
+ s = s.slice(1, -1);
119
+ }
120
+ return s;
121
+ }
122
+ function normalizeProvider(provider) {
123
+ if (provider === void 0 || provider === "") return void 0;
124
+ const n = normalizeString(provider);
125
+ return _nullishCoalesce(PROVIDER_NORMALISATION_MAP[n], () => ( n));
126
+ }
127
+ function tokenise(s) {
128
+ return s.split(/[-_./]+/).filter(Boolean);
129
+ }
130
+ function modelSlug(modelId) {
131
+ const slash = modelId.indexOf("/");
132
+ return slash >= 0 ? modelId.slice(slash + 1) : modelId;
133
+ }
134
+
135
+ // src/sync/openRouterRoutingEnv.ts
136
+ var _env = require('@x12i/env');
137
+ function providerIdToEnvKeyPrefix(providerId) {
138
+ return providerId.trim().toLowerCase().replace(/-/g, "_").toUpperCase();
139
+ }
140
+ function vendorApiKeyEnvName(providerId) {
141
+ return `${providerIdToEnvKeyPrefix(providerId)}_API_KEY`;
142
+ }
143
+ function loadOpenRouterRoutingEnv(env = process.env) {
144
+ const dotenv = _env.loadDotenv.call(void 0, );
145
+ const merged = {};
146
+ for (const [k, v] of Object.entries(dotenv)) {
147
+ if (v !== void 0) merged[k] = v;
148
+ }
149
+ for (const [k, v] of Object.entries(env)) {
150
+ if (v !== void 0) merged[k] = v;
151
+ }
152
+ const openRouterKey = _optionalChain([merged, 'access', _ => _.OPENROUTER_API_KEY, 'optionalAccess', _2 => _2.trim, 'call', _3 => _3()]);
153
+ const useRaw = _optionalChain([merged, 'access', _4 => _4.USE_OPENROUTER, 'optionalAccess', _5 => _5.trim, 'call', _6 => _6(), 'access', _7 => _7.toLowerCase, 'call', _8 => _8()]);
154
+ const useOpenRouterExplicit = useRaw === "true" || useRaw === "1";
155
+ return {
156
+ hasOpenRouterKey: Boolean(openRouterKey),
157
+ useOpenRouterExplicit,
158
+ getVendorApiKey(providerId) {
159
+ const name = vendorApiKeyEnvName(providerId);
160
+ const val = _optionalChain([merged, 'access', _9 => _9[name], 'optionalAccess', _10 => _10.trim, 'call', _11 => _11()]);
161
+ return val || void 0;
162
+ }
163
+ };
164
+ }
165
+ function shouldDefaultRouteViaOpenRouter(providerId, config) {
166
+ if (!config.hasOpenRouterKey) return false;
167
+ if (config.useOpenRouterExplicit) return true;
168
+ if (providerId && providerId !== "openrouter") {
169
+ return !config.getVendorApiKey(providerId);
170
+ }
171
+ return false;
172
+ }
173
+
174
+ // src/sync/modelNameResolver/stripVersionSuffix.ts
175
+ var VERSION_STRIP_PATTERNS = [
176
+ { re: /-\d{4}-\d{2}-\d{2}$/, label: "date YYYY-MM-DD" },
177
+ { re: /-\d{8}$/, label: "date YYYYMMDD" },
178
+ { re: /-v\d+$/, label: "version -vN" },
179
+ { re: /-\d+\.\d+\.\d+$/, label: "semver" },
180
+ { re: /:\d+[a-z]?$/i, label: "colon version" },
181
+ { re: /-\d{4,}$/, label: "build number" },
182
+ { re: /@\d+$/, label: "epoch @NNNN" }
183
+ ];
184
+ function stripModelSlugSuffix(slug) {
185
+ for (const { re } of VERSION_STRIP_PATTERNS) {
186
+ if (re.test(slug)) {
187
+ return slug.replace(re, "");
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+ function stripModelVersionSuffix(model) {
193
+ const normalized = normalizeString(model);
194
+ if (!normalized) return null;
195
+ if (normalized.includes("/")) {
196
+ const slash = normalized.indexOf("/");
197
+ const prefix = normalized.slice(0, slash);
198
+ const slug = normalized.slice(slash + 1);
199
+ const stripped2 = stripModelSlugSuffix(slug);
200
+ if (stripped2 && stripped2 !== slug) {
201
+ return `${prefix}/${stripped2}`;
202
+ }
203
+ return null;
204
+ }
205
+ const stripped = stripModelSlugSuffix(normalized);
206
+ return stripped && stripped !== normalized ? stripped : null;
207
+ }
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+ exports.DEFAULT_CONFIDENCE_THRESHOLD = DEFAULT_CONFIDENCE_THRESHOLD; exports.LOCAL_PROVIDERS = LOCAL_PROVIDERS; exports.PROVIDER_INFERENCE_MAP = PROVIDER_INFERENCE_MAP; exports.SHORTHAND_MAP = SHORTHAND_MAP; exports.normalizeString = normalizeString; exports.normalizeProvider = normalizeProvider; exports.tokenise = tokenise; exports.modelSlug = modelSlug; exports.stripModelSlugSuffix = stripModelSlugSuffix; exports.stripModelVersionSuffix = stripModelVersionSuffix; exports.providerIdToEnvKeyPrefix = providerIdToEnvKeyPrefix; exports.vendorApiKeyEnvName = vendorApiKeyEnvName; exports.loadOpenRouterRoutingEnv = loadOpenRouterRoutingEnv; exports.shouldDefaultRouteViaOpenRouter = shouldDefaultRouteViaOpenRouter;
225
+ //# sourceMappingURL=chunk-EDMCKHO6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-EDMCKHO6.cjs","../src/sync/modelNameResolver/constants.ts","../src/sync/modelNameResolver/normalize.ts","../src/sync/openRouterRoutingEnv.ts","../src/sync/modelNameResolver/stripVersionSuffix.ts"],"names":["stripped"],"mappings":"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AA;AACjB;AAEO,SAAS,mBAAA,CAAoB,UAAA,EAA4B;AAC9D,EAAA,OAAO,CAAA,EAAA;AACT;AAcgB;AAGR,EAAA;AACA,EAAA;AACN,EAAA;AACM,IAAA;AACN,EAAA;AACA,EAAA;AACM,IAAA;AACN,EAAA;AAEM,EAAA;AACA,EAAA;AACA,EAAA;AAEC,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAOgB;AAIT,EAAA;AACD,EAAA;AACA,EAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AHkGU;AACA;AI1KG;AACL,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACR;AAGgB;AACd,EAAA;AACM,IAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACO,EAAA;AACT;AAMgB;AACR,EAAA;AACD,EAAA;AAED,EAAA;AACI,IAAA;AACA,IAAA;AACA,IAAA;AACAA,IAAAA;AACFA,IAAAA;AACF,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;AAEM,EAAA;AACC,EAAA;AACT;AJmKU;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/ami/Documents/prometheus/x12i/ai-tools/dist/chunk-EDMCKHO6.cjs","sourcesContent":[null,"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","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"]}
@@ -1,270 +1,20 @@
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-B3V2EHRY.js";
1
15
  import {
2
16
  ModelResolutionError
3
- } from "./chunk-AJEKEWWB.js";
4
-
5
- // src/cache/modelCache.ts
6
- import { createNxCache } from "nx-cache";
7
- var cache = createNxCache();
8
- var DEFAULT_MODEL_CACHE_TTL_MS = 60 * 60 * 1e3;
9
- function readCachedModels(appId, ttlMs = DEFAULT_MODEL_CACHE_TTL_MS) {
10
- const res = cache.read("ai-models", { appId });
11
- if (!res.found) return null;
12
- const cachedAt = res.metadata?.cachedAt;
13
- if (cachedAt) {
14
- const age = Date.now() - new Date(cachedAt).getTime();
15
- if (age > ttlMs) return null;
16
- } else if (res.meta.isExpired) {
17
- return null;
18
- }
19
- return res.value;
20
- }
21
- function writeCachedModels(appId, models, ttlMs = DEFAULT_MODEL_CACHE_TTL_MS) {
22
- cache.write("ai-models", models, {
23
- scope: { appId },
24
- ttlMs,
25
- metadata: { cachedAt: (/* @__PURE__ */ new Date()).toISOString(), count: models.size }
26
- });
27
- }
28
- function invalidateModelsCache(appId) {
29
- cache.resetKey("ai-models", { appId });
30
- }
31
-
32
- // src/catalog/aiModelsCatalogDescriptor.ts
33
- var AI_MODELS_CATALOG_ID = "ai-models";
34
- var AI_TOOLS_APP_ID = "ai-tools";
35
- var AI_MODELS_DESCRIPTOR = {
36
- catalogId: AI_MODELS_CATALOG_ID,
37
- label: "AI Models",
38
- description: "Full mirror of OpenRouter Models API metadata and pricing, synced on a schedule.",
39
- itemLabel: "Model",
40
- sourceMode: "native",
41
- status: "active",
42
- visibility: "visible",
43
- capabilities: {
44
- canList: true,
45
- canGet: true,
46
- canCreate: false,
47
- canEdit: false,
48
- canDelete: false,
49
- canExport: true,
50
- canValidate: true
51
- },
52
- identity: {
53
- itemIdStrategy: "natural",
54
- itemIdField: "modelId",
55
- titleField: "name",
56
- subtitleField: "providerId",
57
- statusField: "status",
58
- updatedAtField: "syncedAt"
59
- },
60
- queryableFields: [
61
- { key: "modelId", label: "Model ID", type: "string", indexed: true, filterable: true },
62
- { key: "providerId", label: "Provider", type: "string", indexed: true, filterable: true },
63
- { key: "name", label: "Name", type: "string", filterable: true },
64
- { key: "canonicalSlug", label: "Canonical Slug", type: "string", indexed: true, filterable: true },
65
- { key: "contextLength", label: "Context Length", type: "number", sortable: true },
66
- {
67
- key: "status",
68
- label: "Status",
69
- type: "enum",
70
- indexed: true,
71
- filterable: true,
72
- enumValues: ["active", "deprecated", "unknown"]
73
- },
74
- {
75
- key: "primaryOutputModality",
76
- label: "Primary Output",
77
- type: "string",
78
- indexed: true,
79
- filterable: true
80
- },
81
- { key: "supportsTools", label: "Tools", type: "boolean", indexed: true, filterable: true },
82
- {
83
- key: "supportsReasoning",
84
- label: "Reasoning",
85
- type: "boolean",
86
- indexed: true,
87
- filterable: true
88
- },
89
- { key: "supportsStreaming", label: "Streams", type: "boolean", filterable: true },
90
- { key: "isModerated", label: "Moderated", type: "boolean", filterable: true },
91
- { key: "syncedAt", label: "Synced At", type: "datetime", sortable: true }
92
- ],
93
- defaultSort: { field: "syncedAt", direction: "desc" }
94
- };
95
-
96
- // src/sync/openRouterRoutingEnv.ts
97
- import { loadDotenv } from "@x12i/env";
98
- function providerIdToEnvKeyPrefix(providerId) {
99
- return providerId.trim().toLowerCase().replace(/-/g, "_").toUpperCase();
100
- }
101
- function vendorApiKeyEnvName(providerId) {
102
- return `${providerIdToEnvKeyPrefix(providerId)}_API_KEY`;
103
- }
104
- function loadOpenRouterRoutingEnv(env = process.env) {
105
- const dotenv = loadDotenv();
106
- const merged = {};
107
- for (const [k, v] of Object.entries(dotenv)) {
108
- if (v !== void 0) merged[k] = v;
109
- }
110
- for (const [k, v] of Object.entries(env)) {
111
- if (v !== void 0) merged[k] = v;
112
- }
113
- const openRouterKey = merged.OPENROUTER_API_KEY?.trim();
114
- const useRaw = merged.USE_OPENROUTER?.trim().toLowerCase();
115
- const useOpenRouterExplicit = useRaw === "true" || useRaw === "1";
116
- return {
117
- hasOpenRouterKey: Boolean(openRouterKey),
118
- useOpenRouterExplicit,
119
- getVendorApiKey(providerId) {
120
- const name = vendorApiKeyEnvName(providerId);
121
- const val = merged[name]?.trim();
122
- return val || void 0;
123
- }
124
- };
125
- }
126
- function shouldDefaultRouteViaOpenRouter(providerId, config) {
127
- if (!config.hasOpenRouterKey) return false;
128
- if (config.useOpenRouterExplicit) return true;
129
- if (providerId && providerId !== "openrouter") {
130
- return !config.getVendorApiKey(providerId);
131
- }
132
- return false;
133
- }
134
-
135
- // src/sync/modelNameResolver/constants.ts
136
- var DEFAULT_CONFIDENCE_THRESHOLD = 0.6;
137
- var PROVIDER_NORMALISATION_MAP = {
138
- "open-router": "openrouter",
139
- or: "openrouter",
140
- oai: "openai",
141
- "open-ai": "openai",
142
- claude: "anthropic",
143
- ant: "anthropic",
144
- gemini: "google",
145
- gcp: "google",
146
- "google-ai": "google",
147
- vertex: "google",
148
- meta: "meta-llama",
149
- llama: "meta-llama",
150
- "mistral-ai": "mistral",
151
- "cohere-ai": "cohere"
152
- };
153
- var LOCAL_PROVIDERS = /* @__PURE__ */ new Set([
154
- "ollama",
155
- "lmstudio",
156
- "lm-studio",
157
- "localai",
158
- "local-ai",
159
- "llamacpp",
160
- "llama.cpp",
161
- "llamafile",
162
- "jan",
163
- "koboldcpp"
164
- ]);
165
- var PROVIDER_INFERENCE_MAP = [
166
- { pattern: /^gpt-/, provider: "openai" },
167
- { pattern: /^o1($|-)/, provider: "openai" },
168
- { pattern: /^o3($|-)/, provider: "openai" },
169
- { pattern: /^o4($|-)/, provider: "openai" },
170
- { pattern: /^chatgpt-/, provider: "openai" },
171
- { pattern: /^text-davinci/, provider: "openai" },
172
- { pattern: /^dall-e/, provider: "openai" },
173
- { pattern: /^whisper/, provider: "openai" },
174
- { pattern: /^tts-/, provider: "openai" },
175
- { pattern: /^claude-/, provider: "anthropic" },
176
- { pattern: /^gemini-/, provider: "google" },
177
- { pattern: /^palm-/, provider: "google" },
178
- { pattern: /^bison/, provider: "google" },
179
- { pattern: /^llama-?[23]/, provider: "meta-llama" },
180
- { pattern: /^llama/, provider: "meta-llama" },
181
- { pattern: /^codellama/, provider: "meta-llama" },
182
- { pattern: /^mistral-/, provider: "mistral" },
183
- { pattern: /^mixtral-/, provider: "mistral" },
184
- { pattern: /^codestral/, provider: "mistral" },
185
- { pattern: /^ministral/, provider: "mistral" },
186
- { pattern: /^command-/, provider: "cohere" },
187
- { pattern: /^c4ai-/, provider: "cohere" },
188
- { pattern: /^deepseek-/, provider: "deepseek" },
189
- { pattern: /^grok-/, provider: "x-ai" },
190
- { pattern: /^qwen/, provider: "qwen" },
191
- { pattern: /^yi-/, provider: "01-ai" },
192
- { pattern: /^sonar/, provider: "perplexity" },
193
- { pattern: /^pplx-/, provider: "perplexity" },
194
- { pattern: /^titan-/, provider: "amazon" },
195
- { pattern: /^nova-/, provider: "amazon" }
196
- ];
197
- var SHORTHAND_MAP = {
198
- gpt4: "openai/gpt-4",
199
- gpt4o: "openai/gpt-4o",
200
- "gpt-4-omni": "openai/gpt-4o",
201
- gpt4omni: "openai/gpt-4o",
202
- "gpt4-turbo": "openai/gpt-4-turbo",
203
- gpt4turbo: "openai/gpt-4-turbo",
204
- "gpt4-mini": "openai/gpt-4o-mini",
205
- "gpt-4o-mini": "openai/gpt-4o-mini",
206
- o1: "openai/o1",
207
- "o1-mini": "openai/o1-mini",
208
- o3: "openai/o3",
209
- "o3-mini": "openai/o3-mini",
210
- "o4-mini": "openai/o4-mini",
211
- "3.5-turbo": "openai/gpt-3.5-turbo",
212
- gpt35: "openai/gpt-3.5-turbo",
213
- gpt3: "openai/gpt-3.5-turbo",
214
- claude3: "anthropic/claude-3-5-sonnet-20241022",
215
- "claude-3": "anthropic/claude-3-5-sonnet-20241022",
216
- "claude3-sonnet": "anthropic/claude-3-5-sonnet-20241022",
217
- "claude-sonnet": "anthropic/claude-3-5-sonnet-20241022",
218
- "claude-haiku": "anthropic/claude-3-5-haiku-20241022",
219
- "claude3-haiku": "anthropic/claude-3-5-haiku-20241022",
220
- "claude-opus": "anthropic/claude-opus-4",
221
- "claude3-opus": "anthropic/claude-3-opus-20240229",
222
- claude4: "anthropic/claude-opus-4",
223
- "claude4-sonnet": "anthropic/claude-sonnet-4",
224
- "claude4-opus": "anthropic/claude-opus-4",
225
- sonnet: "anthropic/claude-3-5-sonnet-20241022",
226
- haiku: "anthropic/claude-3-5-haiku-20241022",
227
- opus: "anthropic/claude-opus-4",
228
- gemini: "google/gemini-pro",
229
- "gemini-pro": "google/gemini-pro",
230
- "gemini-flash": "google/gemini-flash-1.5",
231
- gemini2: "google/gemini-2.0-flash-001",
232
- "gemini-2": "google/gemini-2.0-flash-001",
233
- llama3: "meta-llama/llama-3.1-8b-instruct",
234
- "llama-3": "meta-llama/llama-3.1-8b-instruct",
235
- llama2: "meta-llama/llama-2-13b-chat",
236
- "llama-2": "meta-llama/llama-2-13b-chat",
237
- mistral: "mistral/mistral-7b-instruct",
238
- "mistral-large": "mistral/mistral-large-latest",
239
- mixtral: "mistral/mixtral-8x7b-instruct",
240
- deepseek: "deepseek/deepseek-chat",
241
- "deepseek-r1": "deepseek/deepseek-r1"
242
- };
243
-
244
- // src/sync/modelNameResolver/normalize.ts
245
- function normalizeString(input) {
246
- let s = input.trim();
247
- s = s.replace(/\s+/g, " ").replace(/ /g, "-");
248
- s = s.toLowerCase();
249
- s = s.replace(/^\/+|\/+$/g, "");
250
- s = s.replace(/\/+/g, "/");
251
- if (s.startsWith('"') && s.endsWith('"') || s.startsWith("'") && s.endsWith("'")) {
252
- s = s.slice(1, -1);
253
- }
254
- return s;
255
- }
256
- function normalizeProvider(provider) {
257
- if (provider === void 0 || provider === "") return void 0;
258
- const n = normalizeString(provider);
259
- return PROVIDER_NORMALISATION_MAP[n] ?? n;
260
- }
261
- function tokenise(s) {
262
- return s.split(/[-_./]+/).filter(Boolean);
263
- }
264
- function modelSlug(modelId) {
265
- const slash = modelId.indexOf("/");
266
- return slash >= 0 ? modelId.slice(slash + 1) : modelId;
267
- }
17
+ } from "./chunk-2PTCWPHV.js";
268
18
 
269
19
  // src/sync/modelNameResolver/catalogIndexes.ts
270
20
  function buildCatalogIndexes(catalog) {
@@ -286,15 +36,6 @@ function buildCatalogIndexes(catalog) {
286
36
  }
287
37
 
288
38
  // src/sync/modelNameResolver/ModelNameResolver.ts
289
- var VERSION_STRIP_PATTERNS = [
290
- { re: /-\d{4}-\d{2}-\d{2}$/, label: "date YYYY-MM-DD" },
291
- { re: /-\d{8}$/, label: "date YYYYMMDD" },
292
- { re: /-v\d+$/, label: "version -vN" },
293
- { re: /-\d+\.\d+\.\d+$/, label: "semver" },
294
- { re: /:\d+[a-z]?$/i, label: "colon version" },
295
- { re: /-\d{4,}$/, label: "build number" },
296
- { re: /@\d+$/, label: "epoch @NNNN" }
297
- ];
298
39
  var ModelNameResolver = class {
299
40
  catalog;
300
41
  indexes;
@@ -415,7 +156,7 @@ var ModelNameResolver = class {
415
156
  if (hit) return { match: hit };
416
157
  hit = tryMatch("cross-provider-correction", () => this.crossProviderCorrection(model));
417
158
  if (hit) return { match: hit };
418
- const stripped = this.stripVersionSuffixes(model);
159
+ const stripped = stripModelVersionSuffix(model);
419
160
  if (stripped && stripped !== model) {
420
161
  if (!attempted.includes("version-suffix-strip")) attempted.push("version-suffix-strip");
421
162
  const inner = this.runPipeline(
@@ -587,18 +328,10 @@ var ModelNameResolver = class {
587
328
  reason: `Corrected provider prefix from "${wrongPrefix}" to "${inferred}" based on model name pattern`
588
329
  };
589
330
  }
590
- stripVersionSuffixes(model) {
591
- for (const { re } of VERSION_STRIP_PATTERNS) {
592
- if (re.test(model)) {
593
- return model.replace(re, "");
594
- }
595
- }
596
- return null;
597
- }
598
331
  dateSuffixMatch(model) {
599
332
  if (model.includes("/")) {
600
333
  const [prefix, slug] = model.split("/", 2);
601
- const stripped = this.stripVersionSuffixes(slug);
334
+ const stripped = stripModelSlugSuffix(slug);
602
335
  if (stripped && stripped !== slug) {
603
336
  const candidate = `${prefix}/${stripped}`;
604
337
  const record = this.catalog.get(candidate);
@@ -709,21 +442,37 @@ var ModelNameResolver = class {
709
442
  }
710
443
  };
711
444
 
445
+ // src/models/reasoningModel.ts
446
+ var REASONING_SUPPORTED_PARAMETERS = ["reasoning", "include_reasoning"];
447
+ function supportsReasoningParameter(model) {
448
+ return model.supportedParameters.some(
449
+ (p) => REASONING_SUPPORTED_PARAMETERS.includes(p)
450
+ );
451
+ }
452
+ function hasReasoningPricing(model) {
453
+ const raw = model.openRouterPricing?.internal_reasoning;
454
+ if (raw !== void 0 && raw !== null && String(raw).trim() !== "") {
455
+ return true;
456
+ }
457
+ return model.pricing.reasoningUsdPerToken !== void 0;
458
+ }
459
+ function computeSupportsReasoning(model) {
460
+ return supportsReasoningParameter(model) || hasReasoningPricing(model);
461
+ }
462
+ function isReasoningModel(model) {
463
+ if (model.supportsReasoning !== void 0) {
464
+ return model.supportsReasoning;
465
+ }
466
+ return computeSupportsReasoning(model);
467
+ }
468
+
712
469
  export {
713
- DEFAULT_MODEL_CACHE_TTL_MS,
714
- readCachedModels,
715
- writeCachedModels,
716
- invalidateModelsCache,
717
- AI_MODELS_CATALOG_ID,
718
- AI_TOOLS_APP_ID,
719
- AI_MODELS_DESCRIPTOR,
720
- providerIdToEnvKeyPrefix,
721
- vendorApiKeyEnvName,
722
- loadOpenRouterRoutingEnv,
723
- shouldDefaultRouteViaOpenRouter,
724
- normalizeString,
725
- normalizeProvider,
726
470
  buildCatalogIndexes,
727
- ModelNameResolver
471
+ ModelNameResolver,
472
+ REASONING_SUPPORTED_PARAMETERS,
473
+ supportsReasoningParameter,
474
+ hasReasoningPricing,
475
+ computeSupportsReasoning,
476
+ isReasoningModel
728
477
  };
729
- //# sourceMappingURL=chunk-DJ5SWJDY.js.map
478
+ //# sourceMappingURL=chunk-EYHMQVAL.js.map