@dexto/core 1.5.5 → 1.5.7

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 (146) hide show
  1. package/dist/agent/DextoAgent.cjs +94 -26
  2. package/dist/agent/DextoAgent.d.ts +17 -7
  3. package/dist/agent/DextoAgent.d.ts.map +1 -1
  4. package/dist/agent/DextoAgent.js +95 -27
  5. package/dist/agent/schemas.d.ts +417 -66
  6. package/dist/agent/schemas.d.ts.map +1 -1
  7. package/dist/context/utils.cjs +49 -3
  8. package/dist/context/utils.d.ts.map +1 -1
  9. package/dist/context/utils.js +49 -3
  10. package/dist/errors/types.cjs +2 -1
  11. package/dist/errors/types.d.ts +2 -1
  12. package/dist/errors/types.d.ts.map +1 -1
  13. package/dist/errors/types.js +2 -1
  14. package/dist/image/types.d.ts +15 -0
  15. package/dist/image/types.d.ts.map +1 -1
  16. package/dist/llm/error-codes.cjs +1 -0
  17. package/dist/llm/error-codes.d.ts +1 -0
  18. package/dist/llm/error-codes.d.ts.map +1 -1
  19. package/dist/llm/error-codes.js +1 -0
  20. package/dist/llm/errors.cjs +15 -0
  21. package/dist/llm/errors.d.ts +15 -8
  22. package/dist/llm/errors.d.ts.map +1 -1
  23. package/dist/llm/errors.js +15 -0
  24. package/dist/llm/executor/turn-executor.cjs +27 -0
  25. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  26. package/dist/llm/executor/turn-executor.js +27 -0
  27. package/dist/llm/registry.cjs +472 -28
  28. package/dist/llm/registry.d.ts +80 -4
  29. package/dist/llm/registry.d.ts.map +1 -1
  30. package/dist/llm/registry.js +464 -25
  31. package/dist/llm/resolver.cjs +13 -0
  32. package/dist/llm/resolver.d.ts.map +1 -1
  33. package/dist/llm/resolver.js +16 -1
  34. package/dist/llm/schemas.d.ts +59 -59
  35. package/dist/llm/services/factory.cjs +41 -25
  36. package/dist/llm/services/factory.d.ts +20 -1
  37. package/dist/llm/services/factory.d.ts.map +1 -1
  38. package/dist/llm/services/factory.js +42 -26
  39. package/dist/llm/services/test-utils.integration.cjs +5 -1
  40. package/dist/llm/services/test-utils.integration.d.ts.map +1 -1
  41. package/dist/llm/services/test-utils.integration.js +5 -1
  42. package/dist/llm/types.cjs +5 -2
  43. package/dist/llm/types.d.ts +1 -1
  44. package/dist/llm/types.d.ts.map +1 -1
  45. package/dist/llm/types.js +5 -2
  46. package/dist/logger/logger.cjs +6 -7
  47. package/dist/logger/logger.d.ts +1 -0
  48. package/dist/logger/logger.d.ts.map +1 -1
  49. package/dist/logger/logger.js +6 -7
  50. package/dist/logger/v2/dexto-logger.cjs +4 -0
  51. package/dist/logger/v2/dexto-logger.d.ts +3 -0
  52. package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
  53. package/dist/logger/v2/dexto-logger.js +4 -0
  54. package/dist/logger/v2/types.d.ts +2 -0
  55. package/dist/logger/v2/types.d.ts.map +1 -1
  56. package/dist/mcp/error-codes.cjs +1 -0
  57. package/dist/mcp/error-codes.d.ts +1 -0
  58. package/dist/mcp/error-codes.d.ts.map +1 -1
  59. package/dist/mcp/error-codes.js +1 -0
  60. package/dist/mcp/errors.cjs +13 -0
  61. package/dist/mcp/errors.d.ts +7 -0
  62. package/dist/mcp/errors.d.ts.map +1 -1
  63. package/dist/mcp/errors.js +13 -0
  64. package/dist/mcp/manager.cjs +46 -4
  65. package/dist/mcp/manager.d.ts +10 -2
  66. package/dist/mcp/manager.d.ts.map +1 -1
  67. package/dist/mcp/manager.js +46 -4
  68. package/dist/mcp/mcp-client.cjs +89 -5
  69. package/dist/mcp/mcp-client.d.ts +5 -1
  70. package/dist/mcp/mcp-client.d.ts.map +1 -1
  71. package/dist/mcp/mcp-client.js +89 -5
  72. package/dist/mcp/schemas.cjs +6 -1
  73. package/dist/mcp/schemas.d.ts +1 -1
  74. package/dist/mcp/schemas.d.ts.map +1 -1
  75. package/dist/mcp/schemas.js +6 -1
  76. package/dist/mcp/types.d.ts +5 -0
  77. package/dist/mcp/types.d.ts.map +1 -1
  78. package/dist/prompts/index.d.ts +1 -1
  79. package/dist/prompts/index.d.ts.map +1 -1
  80. package/dist/prompts/prompt-manager.cjs +90 -4
  81. package/dist/prompts/prompt-manager.d.ts +16 -6
  82. package/dist/prompts/prompt-manager.d.ts.map +1 -1
  83. package/dist/prompts/prompt-manager.js +90 -4
  84. package/dist/prompts/providers/config-prompt-provider.cjs +104 -10
  85. package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
  86. package/dist/prompts/providers/config-prompt-provider.js +105 -11
  87. package/dist/prompts/providers/custom-prompt-provider.cjs +1 -0
  88. package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
  89. package/dist/prompts/providers/custom-prompt-provider.js +1 -0
  90. package/dist/prompts/providers/mcp-prompt-provider.cjs +1 -0
  91. package/dist/prompts/providers/mcp-prompt-provider.d.ts.map +1 -1
  92. package/dist/prompts/providers/mcp-prompt-provider.js +1 -0
  93. package/dist/prompts/schemas.cjs +28 -2
  94. package/dist/prompts/schemas.d.ts +130 -0
  95. package/dist/prompts/schemas.d.ts.map +1 -1
  96. package/dist/prompts/schemas.js +28 -2
  97. package/dist/prompts/types.d.ts +55 -3
  98. package/dist/prompts/types.d.ts.map +1 -1
  99. package/dist/session/chat-session.d.ts +1 -1
  100. package/dist/session/chat-session.d.ts.map +1 -1
  101. package/dist/session/index.d.ts +1 -1
  102. package/dist/session/index.d.ts.map +1 -1
  103. package/dist/session/session-manager.cjs +47 -3
  104. package/dist/session/session-manager.d.ts +10 -0
  105. package/dist/session/session-manager.d.ts.map +1 -1
  106. package/dist/session/session-manager.js +47 -3
  107. package/dist/systemPrompt/contributors.cjs +42 -0
  108. package/dist/systemPrompt/contributors.d.ts +13 -0
  109. package/dist/systemPrompt/contributors.d.ts.map +1 -1
  110. package/dist/systemPrompt/contributors.js +41 -0
  111. package/dist/tools/errors.cjs +7 -3
  112. package/dist/tools/errors.d.ts +5 -1
  113. package/dist/tools/errors.d.ts.map +1 -1
  114. package/dist/tools/errors.js +7 -3
  115. package/dist/tools/internal-tools/constants.cjs +2 -1
  116. package/dist/tools/internal-tools/constants.d.ts +1 -1
  117. package/dist/tools/internal-tools/constants.d.ts.map +1 -1
  118. package/dist/tools/internal-tools/constants.js +2 -1
  119. package/dist/tools/internal-tools/implementations/invoke-skill-tool.cjs +140 -0
  120. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts +24 -0
  121. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts.map +1 -0
  122. package/dist/tools/internal-tools/implementations/invoke-skill-tool.js +117 -0
  123. package/dist/tools/internal-tools/provider.cjs +15 -0
  124. package/dist/tools/internal-tools/provider.d.ts +12 -0
  125. package/dist/tools/internal-tools/provider.d.ts.map +1 -1
  126. package/dist/tools/internal-tools/provider.js +15 -0
  127. package/dist/tools/internal-tools/registry.cjs +6 -0
  128. package/dist/tools/internal-tools/registry.d.ts +34 -0
  129. package/dist/tools/internal-tools/registry.d.ts.map +1 -1
  130. package/dist/tools/internal-tools/registry.js +6 -0
  131. package/dist/tools/schemas.cjs +2 -2
  132. package/dist/tools/schemas.d.ts +1 -1
  133. package/dist/tools/schemas.d.ts.map +1 -1
  134. package/dist/tools/schemas.js +2 -2
  135. package/dist/tools/tool-manager.cjs +230 -79
  136. package/dist/tools/tool-manager.d.ts +89 -8
  137. package/dist/tools/tool-manager.d.ts.map +1 -1
  138. package/dist/tools/tool-manager.js +231 -80
  139. package/dist/utils/api-key-resolver.cjs +5 -2
  140. package/dist/utils/api-key-resolver.d.ts.map +1 -1
  141. package/dist/utils/api-key-resolver.js +5 -2
  142. package/dist/utils/service-initializer.cjs +8 -2
  143. package/dist/utils/service-initializer.d.ts +5 -1
  144. package/dist/utils/service-initializer.d.ts.map +1 -1
  145. package/dist/utils/service-initializer.js +8 -2
  146. package/package.json +1 -1
@@ -23,6 +23,7 @@ __export(registry_exports, {
23
23
  MIME_TYPE_TO_FILE_TYPE: () => MIME_TYPE_TO_FILE_TYPE,
24
24
  acceptsAnyModel: () => acceptsAnyModel,
25
25
  calculateCost: () => calculateCost,
26
+ getAllModelsForProvider: () => getAllModelsForProvider,
26
27
  getAllSupportedModels: () => getAllSupportedModels,
27
28
  getAllowedMimeTypes: () => getAllowedMimeTypes,
28
29
  getDefaultModelForProvider: () => getDefaultModelForProvider,
@@ -34,21 +35,26 @@ __export(registry_exports, {
34
35
  getSupportedFileTypesForModel: () => getSupportedFileTypesForModel,
35
36
  getSupportedModels: () => getSupportedModels,
36
37
  getSupportedProviders: () => getSupportedProviders,
38
+ hasAllRegistryModelsSupport: () => hasAllRegistryModelsSupport,
39
+ isModelValidForProvider: () => isModelValidForProvider,
37
40
  isReasoningCapableModel: () => isReasoningCapableModel,
38
41
  isValidProviderModel: () => isValidProviderModel,
39
42
  modelSupportsFileType: () => modelSupportsFileType,
40
43
  requiresApiKey: () => requiresApiKey,
41
44
  requiresBaseURL: () => requiresBaseURL,
45
+ resolveModelOrigin: () => resolveModelOrigin,
42
46
  stripBedrockRegionPrefix: () => stripBedrockRegionPrefix,
43
47
  supportsBaseURL: () => supportsBaseURL,
44
48
  supportsCustomModels: () => supportsCustomModels,
49
+ transformModelNameForProvider: () => transformModelNameForProvider,
45
50
  validateModelFileSupport: () => validateModelFileSupport
46
51
  });
47
52
  module.exports = __toCommonJS(registry_exports);
48
53
  var import_errors = require("./errors.js");
49
54
  var import_error_codes = require("./error-codes.js");
50
55
  var import_DextoRuntimeError = require("../errors/DextoRuntimeError.js");
51
- var import_types = require("./types.js");
56
+ var import_types = require("../errors/types.js");
57
+ var import_types2 = require("./types.js");
52
58
  var import_openrouter_model_registry = require("./providers/openrouter-model-registry.js");
53
59
  const MIME_TYPE_TO_FILE_TYPE = {
54
60
  "application/pdf": "pdf",
@@ -79,6 +85,7 @@ const LLM_REGISTRY = {
79
85
  {
80
86
  name: "gpt-5.2-chat-latest",
81
87
  displayName: "GPT-5.2 Instant",
88
+ openrouterId: "openai/gpt-5.2-chat",
82
89
  maxInputTokens: 4e5,
83
90
  supportedFileTypes: ["pdf", "image"],
84
91
  pricing: {
@@ -92,6 +99,7 @@ const LLM_REGISTRY = {
92
99
  {
93
100
  name: "gpt-5.2",
94
101
  displayName: "GPT-5.2 Thinking",
102
+ openrouterId: "openai/gpt-5.2",
95
103
  maxInputTokens: 4e5,
96
104
  supportedFileTypes: ["pdf", "image"],
97
105
  pricing: {
@@ -105,6 +113,7 @@ const LLM_REGISTRY = {
105
113
  {
106
114
  name: "gpt-5.2-pro",
107
115
  displayName: "GPT-5.2 Pro",
116
+ openrouterId: "openai/gpt-5.2-pro",
108
117
  maxInputTokens: 4e5,
109
118
  supportedFileTypes: ["pdf", "image"],
110
119
  pricing: {
@@ -118,6 +127,7 @@ const LLM_REGISTRY = {
118
127
  {
119
128
  name: "gpt-5.2-codex",
120
129
  displayName: "GPT-5.2 Codex",
130
+ openrouterId: "openai/gpt-5.2-codex",
121
131
  maxInputTokens: 4e5,
122
132
  supportedFileTypes: ["pdf", "image"],
123
133
  pricing: {
@@ -132,6 +142,7 @@ const LLM_REGISTRY = {
132
142
  {
133
143
  name: "gpt-5.1-chat-latest",
134
144
  displayName: "GPT-5.1 Instant",
145
+ openrouterId: "openai/gpt-5.1-chat",
135
146
  maxInputTokens: 4e5,
136
147
  supportedFileTypes: ["pdf", "image"],
137
148
  pricing: {
@@ -145,6 +156,7 @@ const LLM_REGISTRY = {
145
156
  {
146
157
  name: "gpt-5.1",
147
158
  displayName: "GPT-5.1 Thinking",
159
+ openrouterId: "openai/gpt-5.1",
148
160
  maxInputTokens: 4e5,
149
161
  supportedFileTypes: ["pdf", "image"],
150
162
  pricing: {
@@ -158,6 +170,7 @@ const LLM_REGISTRY = {
158
170
  {
159
171
  name: "gpt-5.1-codex",
160
172
  displayName: "GPT-5.1 Codex",
173
+ openrouterId: "openai/gpt-5.1-codex",
161
174
  maxInputTokens: 4e5,
162
175
  supportedFileTypes: ["pdf", "image"],
163
176
  pricing: {
@@ -171,6 +184,7 @@ const LLM_REGISTRY = {
171
184
  {
172
185
  name: "gpt-5.1-codex-mini",
173
186
  displayName: "GPT-5.1 Codex Mini",
187
+ openrouterId: "openai/gpt-5.1-codex-mini",
174
188
  maxInputTokens: 4e5,
175
189
  supportedFileTypes: ["pdf", "image"],
176
190
  pricing: {
@@ -197,6 +211,7 @@ const LLM_REGISTRY = {
197
211
  {
198
212
  name: "gpt-5-pro",
199
213
  displayName: "GPT-5 Pro",
214
+ openrouterId: "openai/gpt-5-pro",
200
215
  maxInputTokens: 4e5,
201
216
  supportedFileTypes: ["pdf", "image"],
202
217
  pricing: {
@@ -210,6 +225,7 @@ const LLM_REGISTRY = {
210
225
  {
211
226
  name: "gpt-5",
212
227
  displayName: "GPT-5",
228
+ openrouterId: "openai/gpt-5",
213
229
  maxInputTokens: 4e5,
214
230
  supportedFileTypes: ["pdf", "image"],
215
231
  pricing: {
@@ -223,6 +239,7 @@ const LLM_REGISTRY = {
223
239
  {
224
240
  name: "gpt-5-mini",
225
241
  displayName: "GPT-5 Mini",
242
+ openrouterId: "openai/gpt-5-mini",
226
243
  maxInputTokens: 4e5,
227
244
  default: true,
228
245
  supportedFileTypes: ["pdf", "image"],
@@ -237,6 +254,7 @@ const LLM_REGISTRY = {
237
254
  {
238
255
  name: "gpt-5-nano",
239
256
  displayName: "GPT-5 Nano",
257
+ openrouterId: "openai/gpt-5-nano",
240
258
  maxInputTokens: 4e5,
241
259
  supportedFileTypes: ["pdf", "image"],
242
260
  pricing: {
@@ -250,6 +268,7 @@ const LLM_REGISTRY = {
250
268
  {
251
269
  name: "gpt-5-codex",
252
270
  displayName: "GPT-5 Codex",
271
+ openrouterId: "openai/gpt-5-codex",
253
272
  maxInputTokens: 4e5,
254
273
  supportedFileTypes: ["pdf", "image"],
255
274
  pricing: {
@@ -263,6 +282,7 @@ const LLM_REGISTRY = {
263
282
  {
264
283
  name: "gpt-4.1",
265
284
  displayName: "GPT-4.1",
285
+ openrouterId: "openai/gpt-4.1",
266
286
  maxInputTokens: 1048576,
267
287
  supportedFileTypes: ["pdf", "image"],
268
288
  pricing: {
@@ -276,6 +296,7 @@ const LLM_REGISTRY = {
276
296
  {
277
297
  name: "gpt-4.1-mini",
278
298
  displayName: "GPT-4.1 Mini",
299
+ openrouterId: "openai/gpt-4.1-mini",
279
300
  maxInputTokens: 1048576,
280
301
  supportedFileTypes: ["pdf", "image"],
281
302
  pricing: {
@@ -289,6 +310,7 @@ const LLM_REGISTRY = {
289
310
  {
290
311
  name: "gpt-4.1-nano",
291
312
  displayName: "GPT-4.1 Nano",
313
+ openrouterId: "openai/gpt-4.1-nano",
292
314
  maxInputTokens: 1048576,
293
315
  supportedFileTypes: ["pdf", "image"],
294
316
  pricing: {
@@ -302,6 +324,7 @@ const LLM_REGISTRY = {
302
324
  {
303
325
  name: "gpt-4o",
304
326
  displayName: "GPT-4o",
327
+ openrouterId: "openai/gpt-4o",
305
328
  maxInputTokens: 128e3,
306
329
  supportedFileTypes: ["pdf", "image"],
307
330
  pricing: {
@@ -315,6 +338,7 @@ const LLM_REGISTRY = {
315
338
  {
316
339
  name: "gpt-4o-mini",
317
340
  displayName: "GPT-4o Mini",
341
+ openrouterId: "openai/gpt-4o-mini",
318
342
  maxInputTokens: 128e3,
319
343
  supportedFileTypes: ["pdf", "image"],
320
344
  pricing: {
@@ -328,6 +352,7 @@ const LLM_REGISTRY = {
328
352
  {
329
353
  name: "gpt-4o-audio-preview",
330
354
  displayName: "GPT-4o Audio Preview",
355
+ openrouterId: "openai/gpt-4o-audio-preview",
331
356
  maxInputTokens: 128e3,
332
357
  supportedFileTypes: ["audio"],
333
358
  pricing: {
@@ -341,6 +366,7 @@ const LLM_REGISTRY = {
341
366
  {
342
367
  name: "o4-mini",
343
368
  displayName: "O4 Mini",
369
+ openrouterId: "openai/o4-mini",
344
370
  maxInputTokens: 2e5,
345
371
  supportedFileTypes: ["pdf", "image"],
346
372
  pricing: {
@@ -354,6 +380,7 @@ const LLM_REGISTRY = {
354
380
  {
355
381
  name: "o3",
356
382
  displayName: "O3",
383
+ openrouterId: "openai/o3",
357
384
  maxInputTokens: 2e5,
358
385
  supportedFileTypes: ["pdf", "image"],
359
386
  pricing: {
@@ -367,6 +394,7 @@ const LLM_REGISTRY = {
367
394
  {
368
395
  name: "o3-mini",
369
396
  displayName: "O3 Mini",
397
+ openrouterId: "openai/o3-mini",
370
398
  maxInputTokens: 2e5,
371
399
  supportedFileTypes: [],
372
400
  pricing: {
@@ -380,6 +408,7 @@ const LLM_REGISTRY = {
380
408
  {
381
409
  name: "o1",
382
410
  displayName: "O1",
411
+ openrouterId: "openai/o1",
383
412
  maxInputTokens: 2e5,
384
413
  supportedFileTypes: ["pdf", "image"],
385
414
  pricing: {
@@ -392,8 +421,9 @@ const LLM_REGISTRY = {
392
421
  }
393
422
  ],
394
423
  baseURLSupport: "none",
395
- supportedFileTypes: []
424
+ supportedFileTypes: [],
396
425
  // No defaults - models must explicitly specify support
426
+ openrouterPrefix: "openai"
397
427
  },
398
428
  "openai-compatible": {
399
429
  models: [],
@@ -408,6 +438,7 @@ const LLM_REGISTRY = {
408
438
  {
409
439
  name: "claude-haiku-4-5-20251001",
410
440
  displayName: "Claude 4.5 Haiku",
441
+ openrouterId: "anthropic/claude-haiku-4.5",
411
442
  maxInputTokens: 2e5,
412
443
  default: true,
413
444
  supportedFileTypes: ["pdf", "image"],
@@ -423,6 +454,7 @@ const LLM_REGISTRY = {
423
454
  {
424
455
  name: "claude-sonnet-4-5-20250929",
425
456
  displayName: "Claude 4.5 Sonnet",
457
+ openrouterId: "anthropic/claude-sonnet-4.5",
426
458
  maxInputTokens: 2e5,
427
459
  supportedFileTypes: ["pdf", "image"],
428
460
  pricing: {
@@ -437,6 +469,7 @@ const LLM_REGISTRY = {
437
469
  {
438
470
  name: "claude-opus-4-5-20251101",
439
471
  displayName: "Claude 4.5 Opus",
472
+ openrouterId: "anthropic/claude-opus-4.5",
440
473
  maxInputTokens: 2e5,
441
474
  supportedFileTypes: ["pdf", "image"],
442
475
  pricing: {
@@ -451,6 +484,7 @@ const LLM_REGISTRY = {
451
484
  {
452
485
  name: "claude-opus-4-1-20250805",
453
486
  displayName: "Claude 4.1 Opus",
487
+ openrouterId: "anthropic/claude-opus-4.1",
454
488
  maxInputTokens: 2e5,
455
489
  supportedFileTypes: ["pdf", "image"],
456
490
  pricing: {
@@ -465,6 +499,7 @@ const LLM_REGISTRY = {
465
499
  {
466
500
  name: "claude-4-opus-20250514",
467
501
  displayName: "Claude 4 Opus",
502
+ openrouterId: "anthropic/claude-opus-4",
468
503
  maxInputTokens: 2e5,
469
504
  supportedFileTypes: ["pdf", "image"],
470
505
  pricing: {
@@ -479,6 +514,7 @@ const LLM_REGISTRY = {
479
514
  {
480
515
  name: "claude-4-sonnet-20250514",
481
516
  displayName: "Claude 4 Sonnet",
517
+ openrouterId: "anthropic/claude-sonnet-4",
482
518
  maxInputTokens: 2e5,
483
519
  supportedFileTypes: ["pdf", "image"],
484
520
  pricing: {
@@ -493,6 +529,7 @@ const LLM_REGISTRY = {
493
529
  {
494
530
  name: "claude-3-7-sonnet-20250219",
495
531
  displayName: "Claude 3.7 Sonnet",
532
+ openrouterId: "anthropic/claude-3.7-sonnet",
496
533
  maxInputTokens: 2e5,
497
534
  supportedFileTypes: ["pdf", "image"],
498
535
  pricing: {
@@ -507,6 +544,7 @@ const LLM_REGISTRY = {
507
544
  {
508
545
  name: "claude-3-5-sonnet-20240620",
509
546
  displayName: "Claude 3.5 Sonnet",
547
+ openrouterId: "anthropic/claude-3.5-sonnet",
510
548
  maxInputTokens: 2e5,
511
549
  supportedFileTypes: ["pdf", "image"],
512
550
  pricing: {
@@ -521,6 +559,7 @@ const LLM_REGISTRY = {
521
559
  {
522
560
  name: "claude-3-5-haiku-20241022",
523
561
  displayName: "Claude 3.5 Haiku",
562
+ openrouterId: "anthropic/claude-3.5-haiku",
524
563
  maxInputTokens: 2e5,
525
564
  supportedFileTypes: ["pdf", "image"],
526
565
  pricing: {
@@ -534,14 +573,16 @@ const LLM_REGISTRY = {
534
573
  }
535
574
  ],
536
575
  baseURLSupport: "none",
537
- supportedFileTypes: []
576
+ supportedFileTypes: [],
538
577
  // No defaults - models must explicitly specify support
578
+ openrouterPrefix: "anthropic"
539
579
  },
540
580
  google: {
541
581
  models: [
542
582
  {
543
583
  name: "gemini-3-flash-preview",
544
584
  displayName: "Gemini 3 Flash Preview",
585
+ openrouterId: "google/gemini-3-flash-preview",
545
586
  maxInputTokens: 1048576,
546
587
  default: true,
547
588
  supportedFileTypes: ["pdf", "image", "audio"],
@@ -556,6 +597,7 @@ const LLM_REGISTRY = {
556
597
  {
557
598
  name: "gemini-3-pro-preview",
558
599
  displayName: "Gemini 3 Pro Preview",
600
+ openrouterId: "google/gemini-3-pro-preview",
559
601
  maxInputTokens: 1048576,
560
602
  supportedFileTypes: ["pdf", "image", "audio"],
561
603
  pricing: {
@@ -569,6 +611,7 @@ const LLM_REGISTRY = {
569
611
  {
570
612
  name: "gemini-3-pro-image-preview",
571
613
  displayName: "Gemini 3 Pro Image Preview",
614
+ openrouterId: "google/gemini-3-pro-image-preview",
572
615
  maxInputTokens: 1048576,
573
616
  supportedFileTypes: ["image"],
574
617
  pricing: {
@@ -582,6 +625,7 @@ const LLM_REGISTRY = {
582
625
  {
583
626
  name: "gemini-2.5-pro",
584
627
  displayName: "Gemini 2.5 Pro",
628
+ openrouterId: "google/gemini-2.5-pro",
585
629
  maxInputTokens: 1048576,
586
630
  supportedFileTypes: ["pdf", "image", "audio"],
587
631
  pricing: {
@@ -595,6 +639,7 @@ const LLM_REGISTRY = {
595
639
  {
596
640
  name: "gemini-2.5-flash",
597
641
  displayName: "Gemini 2.5 Flash",
642
+ openrouterId: "google/gemini-2.5-flash",
598
643
  maxInputTokens: 1048576,
599
644
  supportedFileTypes: ["pdf", "image", "audio"],
600
645
  pricing: {
@@ -608,6 +653,7 @@ const LLM_REGISTRY = {
608
653
  {
609
654
  name: "gemini-2.5-flash-lite",
610
655
  displayName: "Gemini 2.5 Flash Lite",
656
+ openrouterId: "google/gemini-2.5-flash-lite",
611
657
  maxInputTokens: 1048576,
612
658
  supportedFileTypes: ["pdf", "image", "audio"],
613
659
  pricing: {
@@ -621,6 +667,7 @@ const LLM_REGISTRY = {
621
667
  {
622
668
  name: "gemini-2.0-flash",
623
669
  displayName: "Gemini 2.0 Flash",
670
+ openrouterId: "google/gemini-2.0-flash-001",
624
671
  maxInputTokens: 1048576,
625
672
  supportedFileTypes: ["pdf", "image", "audio"],
626
673
  pricing: {
@@ -635,6 +682,7 @@ const LLM_REGISTRY = {
635
682
  {
636
683
  name: "gemini-2.0-flash-lite",
637
684
  displayName: "Gemini 2.0 Flash Lite",
685
+ openrouterId: "google/gemini-2.0-flash-lite-001",
638
686
  maxInputTokens: 1048576,
639
687
  supportedFileTypes: ["pdf", "image", "audio"],
640
688
  pricing: {
@@ -647,8 +695,9 @@ const LLM_REGISTRY = {
647
695
  }
648
696
  ],
649
697
  baseURLSupport: "none",
650
- supportedFileTypes: []
698
+ supportedFileTypes: [],
651
699
  // No defaults - models must explicitly specify support
700
+ openrouterPrefix: "google"
652
701
  },
653
702
  // https://console.groq.com/docs/models
654
703
  groq: {
@@ -775,6 +824,7 @@ const LLM_REGISTRY = {
775
824
  {
776
825
  name: "grok-4",
777
826
  displayName: "Grok 4",
827
+ openrouterId: "x-ai/grok-4",
778
828
  maxInputTokens: 256e3,
779
829
  default: true,
780
830
  supportedFileTypes: ["image"],
@@ -789,6 +839,7 @@ const LLM_REGISTRY = {
789
839
  {
790
840
  name: "grok-3",
791
841
  displayName: "Grok 3",
842
+ openrouterId: "x-ai/grok-3",
792
843
  maxInputTokens: 131072,
793
844
  supportedFileTypes: ["image"],
794
845
  pricing: {
@@ -802,6 +853,7 @@ const LLM_REGISTRY = {
802
853
  {
803
854
  name: "grok-3-mini",
804
855
  displayName: "Grok 3 Mini",
856
+ openrouterId: "x-ai/grok-3-mini",
805
857
  maxInputTokens: 131072,
806
858
  supportedFileTypes: ["image"],
807
859
  pricing: {
@@ -815,6 +867,7 @@ const LLM_REGISTRY = {
815
867
  {
816
868
  name: "grok-code-fast-1",
817
869
  displayName: "Grok Code Fast",
870
+ openrouterId: "x-ai/grok-code-fast-1",
818
871
  maxInputTokens: 131072,
819
872
  supportedFileTypes: [],
820
873
  pricing: {
@@ -827,8 +880,9 @@ const LLM_REGISTRY = {
827
880
  }
828
881
  ],
829
882
  baseURLSupport: "none",
830
- supportedFileTypes: []
883
+ supportedFileTypes: [],
831
884
  // XAI currently doesn't support file uploads
885
+ openrouterPrefix: "x-ai"
832
886
  },
833
887
  // https://docs.cohere.com/reference/models
834
888
  cohere: {
@@ -836,6 +890,7 @@ const LLM_REGISTRY = {
836
890
  {
837
891
  name: "command-a-03-2025",
838
892
  displayName: "Command A (03-2025)",
893
+ openrouterId: "cohere/command-a",
839
894
  maxInputTokens: 256e3,
840
895
  default: true,
841
896
  supportedFileTypes: [],
@@ -849,6 +904,7 @@ const LLM_REGISTRY = {
849
904
  {
850
905
  name: "command-r-plus",
851
906
  displayName: "Command R+",
907
+ openrouterId: "cohere/command-r-plus-08-2024",
852
908
  maxInputTokens: 128e3,
853
909
  supportedFileTypes: [],
854
910
  pricing: {
@@ -861,6 +917,7 @@ const LLM_REGISTRY = {
861
917
  {
862
918
  name: "command-r",
863
919
  displayName: "Command R",
920
+ openrouterId: "cohere/command-r-08-2024",
864
921
  maxInputTokens: 128e3,
865
922
  supportedFileTypes: [],
866
923
  pricing: {
@@ -873,6 +930,7 @@ const LLM_REGISTRY = {
873
930
  {
874
931
  name: "command-r7b",
875
932
  displayName: "Command R7B",
933
+ openrouterId: "cohere/command-r7b-12-2024",
876
934
  maxInputTokens: 128e3,
877
935
  supportedFileTypes: [],
878
936
  pricing: {
@@ -884,8 +942,78 @@ const LLM_REGISTRY = {
884
942
  }
885
943
  ],
886
944
  baseURLSupport: "none",
887
- supportedFileTypes: []
945
+ supportedFileTypes: [],
888
946
  // Cohere currently doesn't support file uploads
947
+ openrouterPrefix: "cohere"
948
+ },
949
+ // https://platform.minimax.io/docs/api-reference/text-openai-api
950
+ // MiniMax provides an OpenAI-compatible endpoint at https://api.minimax.chat/v1
951
+ minimax: {
952
+ models: [
953
+ {
954
+ name: "MiniMax-M2.1",
955
+ displayName: "MiniMax M2.1",
956
+ openrouterId: "minimax/minimax-m2.1",
957
+ maxInputTokens: 196608,
958
+ default: true,
959
+ supportedFileTypes: []
960
+ },
961
+ {
962
+ name: "MiniMax-M2.1-lightning",
963
+ displayName: "MiniMax M2.1 Lightning",
964
+ openrouterId: "minimax/minimax-m2.1-lightning",
965
+ maxInputTokens: 196608,
966
+ supportedFileTypes: []
967
+ },
968
+ {
969
+ name: "MiniMax-M2",
970
+ displayName: "MiniMax M2",
971
+ openrouterId: "minimax/minimax-m2",
972
+ maxInputTokens: 2e5,
973
+ supportedFileTypes: []
974
+ },
975
+ {
976
+ name: "M2-her",
977
+ displayName: "MiniMax M2-Her",
978
+ openrouterId: "minimax/minimax-m2-her",
979
+ maxInputTokens: 32768,
980
+ supportedFileTypes: []
981
+ }
982
+ ],
983
+ baseURLSupport: "none",
984
+ supportedFileTypes: [],
985
+ openrouterPrefix: "minimax"
986
+ },
987
+ // https://docs.z.ai/api-reference/llm/chat-completion
988
+ // Zhipu AI GLM OpenAI-compatible endpoint: https://open.bigmodel.cn/api/paas/v4
989
+ glm: {
990
+ models: [
991
+ {
992
+ name: "glm-4.7",
993
+ displayName: "GLM 4.7",
994
+ openrouterId: "z-ai/glm-4.7",
995
+ maxInputTokens: 128e3,
996
+ default: true,
997
+ supportedFileTypes: []
998
+ },
999
+ {
1000
+ name: "glm-4.7-flash",
1001
+ displayName: "GLM 4.7 Flash",
1002
+ openrouterId: "z-ai/glm-4.7-flash",
1003
+ maxInputTokens: 128e3,
1004
+ supportedFileTypes: []
1005
+ },
1006
+ {
1007
+ name: "glm-4.7-flashx",
1008
+ displayName: "GLM 4.7 FlashX",
1009
+ openrouterId: "z-ai/glm-4.7-flashx",
1010
+ maxInputTokens: 128e3,
1011
+ supportedFileTypes: []
1012
+ }
1013
+ ],
1014
+ baseURLSupport: "none",
1015
+ supportedFileTypes: [],
1016
+ openrouterPrefix: "z-ai"
889
1017
  },
890
1018
  // https://openrouter.ai/docs
891
1019
  // OpenRouter is a unified API gateway providing access to 100+ models from various providers.
@@ -897,7 +1025,9 @@ const LLM_REGISTRY = {
897
1025
  // Fixed endpoint - baseURL auto-injected in resolver, no user override allowed
898
1026
  supportedFileTypes: ["pdf", "image", "audio"],
899
1027
  // Allow all types - user assumes responsibility for model capabilities
900
- supportsCustomModels: true
1028
+ supportsCustomModels: true,
1029
+ supportsAllRegistryModels: true
1030
+ // Can serve models from all other providers
901
1031
  },
902
1032
  // https://docs.litellm.ai/
903
1033
  // LiteLLM is an OpenAI-compatible proxy that unifies 100+ LLM providers.
@@ -1330,8 +1460,163 @@ const LLM_REGISTRY = {
1330
1460
  // Vision support depends on model
1331
1461
  supportsCustomModels: true
1332
1462
  // Accept any Ollama model name
1463
+ },
1464
+ // Dexto Gateway - OpenAI-compatible proxy through api.dexto.ai
1465
+ // Routes to OpenRouter with per-request billing (balance decrement)
1466
+ // Requires DEXTO_API_KEY from `dexto login`
1467
+ //
1468
+ // This is a first-class provider that users explicitly select.
1469
+ // Model IDs are in OpenRouter format (e.g., 'anthropic/claude-sonnet-4.5')
1470
+ dexto: {
1471
+ models: [
1472
+ // Claude models (Anthropic via OpenRouter)
1473
+ {
1474
+ name: "anthropic/claude-haiku-4.5",
1475
+ displayName: "Claude 4.5 Haiku",
1476
+ maxInputTokens: 2e5,
1477
+ default: true,
1478
+ supportedFileTypes: ["pdf", "image"],
1479
+ pricing: {
1480
+ inputPerM: 1,
1481
+ outputPerM: 5,
1482
+ cacheWritePerM: 1.25,
1483
+ cacheReadPerM: 0.1,
1484
+ currency: "USD",
1485
+ unit: "per_million_tokens"
1486
+ }
1487
+ },
1488
+ {
1489
+ name: "anthropic/claude-sonnet-4.5",
1490
+ displayName: "Claude 4.5 Sonnet",
1491
+ maxInputTokens: 2e5,
1492
+ supportedFileTypes: ["pdf", "image"],
1493
+ pricing: {
1494
+ inputPerM: 3,
1495
+ outputPerM: 15,
1496
+ cacheWritePerM: 3.75,
1497
+ cacheReadPerM: 0.3,
1498
+ currency: "USD",
1499
+ unit: "per_million_tokens"
1500
+ }
1501
+ },
1502
+ {
1503
+ name: "anthropic/claude-opus-4.5",
1504
+ displayName: "Claude 4.5 Opus",
1505
+ maxInputTokens: 2e5,
1506
+ supportedFileTypes: ["pdf", "image"],
1507
+ pricing: {
1508
+ inputPerM: 5,
1509
+ outputPerM: 25,
1510
+ cacheWritePerM: 6.25,
1511
+ cacheReadPerM: 0.5,
1512
+ currency: "USD",
1513
+ unit: "per_million_tokens"
1514
+ }
1515
+ },
1516
+ // OpenAI models (via OpenRouter)
1517
+ {
1518
+ name: "openai/gpt-5.2",
1519
+ displayName: "GPT-5.2",
1520
+ maxInputTokens: 4e5,
1521
+ supportedFileTypes: ["pdf", "image"],
1522
+ pricing: {
1523
+ inputPerM: 1.75,
1524
+ outputPerM: 14,
1525
+ cacheReadPerM: 0.175,
1526
+ currency: "USD",
1527
+ unit: "per_million_tokens"
1528
+ }
1529
+ },
1530
+ {
1531
+ name: "openai/gpt-5.2-codex",
1532
+ displayName: "GPT-5.2 Codex",
1533
+ maxInputTokens: 4e5,
1534
+ supportedFileTypes: ["pdf", "image"],
1535
+ pricing: {
1536
+ inputPerM: 1.75,
1537
+ outputPerM: 14,
1538
+ cacheReadPerM: 0.175,
1539
+ currency: "USD",
1540
+ unit: "per_million_tokens"
1541
+ }
1542
+ },
1543
+ // Google models (via OpenRouter)
1544
+ {
1545
+ name: "google/gemini-3-pro-preview",
1546
+ displayName: "Gemini 3 Pro",
1547
+ maxInputTokens: 1048576,
1548
+ supportedFileTypes: ["pdf", "image", "audio"],
1549
+ pricing: {
1550
+ inputPerM: 2,
1551
+ outputPerM: 12,
1552
+ cacheReadPerM: 0.2,
1553
+ currency: "USD",
1554
+ unit: "per_million_tokens"
1555
+ }
1556
+ },
1557
+ {
1558
+ name: "google/gemini-3-flash-preview",
1559
+ displayName: "Gemini 3 Flash",
1560
+ maxInputTokens: 1048576,
1561
+ supportedFileTypes: ["pdf", "image", "audio"],
1562
+ pricing: {
1563
+ inputPerM: 0.5,
1564
+ outputPerM: 3,
1565
+ cacheReadPerM: 0.05,
1566
+ currency: "USD",
1567
+ unit: "per_million_tokens"
1568
+ }
1569
+ },
1570
+ // Free models (via OpenRouter)
1571
+ {
1572
+ name: "qwen/qwen3-coder:free",
1573
+ displayName: "Qwen3 Coder (Free)",
1574
+ maxInputTokens: 262e3,
1575
+ supportedFileTypes: []
1576
+ // Free - no pricing
1577
+ },
1578
+ {
1579
+ name: "deepseek/deepseek-r1-0528:free",
1580
+ displayName: "DeepSeek R1 (Free)",
1581
+ maxInputTokens: 163840,
1582
+ supportedFileTypes: []
1583
+ // Free - no pricing
1584
+ },
1585
+ // Other models (via OpenRouter)
1586
+ {
1587
+ name: "z-ai/glm-4.7",
1588
+ displayName: "GLM 4.7",
1589
+ maxInputTokens: 202752,
1590
+ supportedFileTypes: [],
1591
+ pricing: {
1592
+ inputPerM: 0.4,
1593
+ outputPerM: 1.5,
1594
+ currency: "USD",
1595
+ unit: "per_million_tokens"
1596
+ }
1597
+ },
1598
+ {
1599
+ name: "minimax/minimax-m2.1",
1600
+ displayName: "Minimax M2.1",
1601
+ maxInputTokens: 196608,
1602
+ supportedFileTypes: [],
1603
+ pricing: {
1604
+ inputPerM: 0.27,
1605
+ outputPerM: 1.1,
1606
+ currency: "USD",
1607
+ unit: "per_million_tokens"
1608
+ }
1609
+ }
1610
+ ],
1611
+ baseURLSupport: "none",
1612
+ // Fixed endpoint: https://api.dexto.ai/v1
1613
+ supportedFileTypes: ["pdf", "image", "audio"],
1614
+ // Same as OpenRouter
1615
+ supportsCustomModels: true,
1616
+ // Accept any OpenRouter model ID beyond the preset list
1617
+ supportsAllRegistryModels: true
1618
+ // Can serve models from all other providers via OpenRouter
1333
1619
  }
1334
- // TODO: Add 'dexto' provider (similar to openrouter, uses https://api.dexto.ai/v1)
1335
1620
  };
1336
1621
  function stripBedrockRegionPrefix(model) {
1337
1622
  if (model.startsWith("eu.") || model.startsWith("us.")) {
@@ -1347,24 +1632,27 @@ function getDefaultModelForProvider(provider) {
1347
1632
  return providerInfo.models.find((m) => m.default)?.name || null;
1348
1633
  }
1349
1634
  function getSupportedProviders() {
1350
- return [...import_types.LLM_PROVIDERS];
1635
+ return [...import_types2.LLM_PROVIDERS];
1351
1636
  }
1352
1637
  function getSupportedModels(provider) {
1353
1638
  const providerInfo = LLM_REGISTRY[provider];
1354
1639
  return providerInfo.models.map((m) => m.name);
1355
1640
  }
1356
1641
  function getMaxInputTokensForModel(provider, model, logger) {
1357
- const providerInfo = LLM_REGISTRY[provider];
1358
- const normalizedModel = stripBedrockRegionPrefix(model).toLowerCase();
1642
+ const resolved = resolveToNativeProvider(provider, model);
1643
+ const providerInfo = LLM_REGISTRY[resolved.provider];
1644
+ const normalizedModel = stripBedrockRegionPrefix(resolved.model).toLowerCase();
1359
1645
  const modelInfo = providerInfo.models.find((m) => m.name.toLowerCase() === normalizedModel);
1360
1646
  if (!modelInfo) {
1361
- const supportedModels = getSupportedModels(provider).join(", ");
1647
+ const supportedModels = getSupportedModels(resolved.provider).join(", ");
1362
1648
  logger?.error(
1363
- `Model '${model}' not found for provider '${provider}' in LLM registry. Supported models: ${supportedModels}`
1649
+ `Model '${resolved.model}' not found for provider '${resolved.provider}' in LLM registry. Supported models: ${supportedModels}`
1364
1650
  );
1365
- throw import_errors.LLMError.unknownModel(provider, model);
1651
+ throw import_errors.LLMError.unknownModel(resolved.provider, resolved.model);
1366
1652
  }
1367
- logger?.debug(`Found max tokens for ${provider}/${model}: ${modelInfo.maxInputTokens}`);
1653
+ logger?.debug(
1654
+ `Found max tokens for ${resolved.provider}/${resolved.model}: ${modelInfo.maxInputTokens}`
1655
+ );
1368
1656
  return modelInfo.maxInputTokens;
1369
1657
  }
1370
1658
  function isValidProviderModel(provider, model) {
@@ -1373,8 +1661,29 @@ function isValidProviderModel(provider, model) {
1373
1661
  return providerInfo.models.some((m) => m.name.toLowerCase() === normalizedModel);
1374
1662
  }
1375
1663
  function getProviderFromModel(model) {
1664
+ if (model.includes("/")) {
1665
+ const [prefix, ...rest] = model.split("/");
1666
+ const modelName = rest.join("/");
1667
+ if (prefix) {
1668
+ const normalizedPrefix = prefix.toLowerCase();
1669
+ for (const provider of import_types2.LLM_PROVIDERS) {
1670
+ const providerPrefix = getOpenrouterPrefix(provider);
1671
+ if (providerPrefix?.toLowerCase() === normalizedPrefix) {
1672
+ const providerInfo = LLM_REGISTRY[provider];
1673
+ const normalizedModelName = stripBedrockRegionPrefix(modelName).toLowerCase();
1674
+ const existsInProvider = providerInfo.models.some(
1675
+ (m) => m.name.toLowerCase() === normalizedModelName || m.openrouterId?.toLowerCase() === model.toLowerCase()
1676
+ );
1677
+ if (existsInProvider) {
1678
+ return provider;
1679
+ }
1680
+ break;
1681
+ }
1682
+ }
1683
+ }
1684
+ }
1376
1685
  const normalizedModel = stripBedrockRegionPrefix(model).toLowerCase();
1377
- for (const provider of import_types.LLM_PROVIDERS) {
1686
+ for (const provider of import_types2.LLM_PROVIDERS) {
1378
1687
  const info = LLM_REGISTRY[provider];
1379
1688
  if (info.models.some((m) => m.name.toLowerCase() === normalizedModel)) {
1380
1689
  return provider;
@@ -1401,6 +1710,133 @@ function supportsCustomModels(provider) {
1401
1710
  const providerInfo = LLM_REGISTRY[provider];
1402
1711
  return providerInfo.supportsCustomModels === true;
1403
1712
  }
1713
+ function hasAllRegistryModelsSupport(provider) {
1714
+ const providerInfo = LLM_REGISTRY[provider];
1715
+ return providerInfo.supportsAllRegistryModels === true;
1716
+ }
1717
+ function getOpenrouterPrefix(provider) {
1718
+ return LLM_REGISTRY[provider].openrouterPrefix;
1719
+ }
1720
+ const GATEWAY_ACCESSIBLE_PROVIDERS = Object.entries(LLM_REGISTRY).filter(
1721
+ ([provider, info]) => (
1722
+ // Has openrouterPrefix (needs transformation)
1723
+ info.openrouterPrefix !== void 0 || // Special case: groq models already have vendor prefixes, no transformation needed
1724
+ provider === "groq"
1725
+ )
1726
+ ).map(([provider]) => provider);
1727
+ function getAllModelsForProvider(provider) {
1728
+ const providerInfo = LLM_REGISTRY[provider];
1729
+ if (!providerInfo.supportsAllRegistryModels) {
1730
+ return providerInfo.models.map((m) => ({ ...m }));
1731
+ }
1732
+ const allModels = [];
1733
+ for (const model of providerInfo.models) {
1734
+ allModels.push({ ...model, originalProvider: provider });
1735
+ }
1736
+ for (const sourceProvider of GATEWAY_ACCESSIBLE_PROVIDERS) {
1737
+ const sourceInfo = LLM_REGISTRY[sourceProvider];
1738
+ for (const model of sourceInfo.models) {
1739
+ allModels.push({
1740
+ ...model,
1741
+ originalProvider: sourceProvider
1742
+ });
1743
+ }
1744
+ }
1745
+ return allModels;
1746
+ }
1747
+ function transformModelNameForProvider(model, originalProvider, targetProvider) {
1748
+ if (!hasAllRegistryModelsSupport(targetProvider)) {
1749
+ return model;
1750
+ }
1751
+ if (hasAllRegistryModelsSupport(originalProvider)) {
1752
+ return model;
1753
+ }
1754
+ if (model.includes("/")) {
1755
+ return model;
1756
+ }
1757
+ const prefix = getOpenrouterPrefix(originalProvider);
1758
+ if (!prefix) {
1759
+ return model;
1760
+ }
1761
+ const providerInfo = LLM_REGISTRY[originalProvider];
1762
+ if (providerInfo) {
1763
+ const normalizedModel = model.toLowerCase();
1764
+ const modelInfo = providerInfo.models.find((m) => m.name.toLowerCase() === normalizedModel);
1765
+ if (modelInfo?.openrouterId) {
1766
+ return modelInfo.openrouterId;
1767
+ }
1768
+ }
1769
+ throw new import_DextoRuntimeError.DextoRuntimeError(
1770
+ import_error_codes.LLMErrorCode.MODEL_UNKNOWN,
1771
+ import_types.ErrorScope.LLM,
1772
+ import_types.ErrorType.SYSTEM,
1773
+ `Model '${model}' from provider '${originalProvider}' has no openrouterId mapping. All models that can be used via gateway providers must have explicit openrouterId in the registry.`,
1774
+ { model, originalProvider, targetProvider }
1775
+ );
1776
+ }
1777
+ function resolveModelOrigin(model, gatewayProvider) {
1778
+ if (!hasAllRegistryModelsSupport(gatewayProvider)) {
1779
+ return { provider: gatewayProvider, model };
1780
+ }
1781
+ if (model.includes("/")) {
1782
+ const [prefix, ...rest] = model.split("/");
1783
+ const modelName = rest.join("/");
1784
+ if (prefix) {
1785
+ const normalizedPrefix = prefix.toLowerCase();
1786
+ for (const provider of import_types2.LLM_PROVIDERS) {
1787
+ const providerPrefix = getOpenrouterPrefix(provider);
1788
+ if (providerPrefix?.toLowerCase() === normalizedPrefix) {
1789
+ const providerInfo = LLM_REGISTRY[provider];
1790
+ const nativeModel = providerInfo?.models.find(
1791
+ (m) => m.openrouterId?.toLowerCase() === model.toLowerCase()
1792
+ );
1793
+ if (nativeModel) {
1794
+ return { provider, model: nativeModel.name };
1795
+ }
1796
+ return { provider, model: modelName };
1797
+ }
1798
+ }
1799
+ }
1800
+ for (const sourceProvider of GATEWAY_ACCESSIBLE_PROVIDERS) {
1801
+ const sourceInfo = LLM_REGISTRY[sourceProvider];
1802
+ if (sourceInfo.models.some((m) => m.name.toLowerCase() === model.toLowerCase())) {
1803
+ return { provider: sourceProvider, model };
1804
+ }
1805
+ }
1806
+ }
1807
+ for (const sourceProvider of GATEWAY_ACCESSIBLE_PROVIDERS) {
1808
+ const sourceInfo = LLM_REGISTRY[sourceProvider];
1809
+ const normalizedModel = stripBedrockRegionPrefix(model).toLowerCase();
1810
+ if (sourceInfo.models.some((m) => m.name.toLowerCase() === normalizedModel)) {
1811
+ return { provider: sourceProvider, model };
1812
+ }
1813
+ }
1814
+ return null;
1815
+ }
1816
+ function resolveToNativeProvider(provider, model) {
1817
+ if (hasAllRegistryModelsSupport(provider)) {
1818
+ const origin = resolveModelOrigin(model, provider);
1819
+ if (origin) {
1820
+ return origin;
1821
+ }
1822
+ }
1823
+ return { provider, model };
1824
+ }
1825
+ function isModelValidForProvider(provider, model) {
1826
+ const providerInfo = LLM_REGISTRY[provider];
1827
+ const normalizedModel = stripBedrockRegionPrefix(model).toLowerCase();
1828
+ if (providerInfo.models.some((m) => m.name.toLowerCase() === normalizedModel)) {
1829
+ return true;
1830
+ }
1831
+ if (providerInfo.supportsCustomModels) {
1832
+ return true;
1833
+ }
1834
+ if (providerInfo.supportsAllRegistryModels) {
1835
+ const origin = resolveModelOrigin(model, provider);
1836
+ return origin !== null;
1837
+ }
1838
+ return false;
1839
+ }
1404
1840
  const API_KEY_OPTIONAL_PROVIDERS = /* @__PURE__ */ new Set([
1405
1841
  "local",
1406
1842
  // Native node-llama-cpp execution - no auth needed
@@ -1419,14 +1855,15 @@ function requiresApiKey(provider) {
1419
1855
  return !API_KEY_OPTIONAL_PROVIDERS.has(provider);
1420
1856
  }
1421
1857
  function getSupportedFileTypesForModel(provider, model) {
1422
- const providerInfo = LLM_REGISTRY[provider];
1423
- if (acceptsAnyModel(provider)) {
1858
+ const resolved = resolveToNativeProvider(provider, model);
1859
+ const providerInfo = LLM_REGISTRY[resolved.provider];
1860
+ if (acceptsAnyModel(resolved.provider)) {
1424
1861
  return providerInfo.supportedFileTypes;
1425
1862
  }
1426
- const normalizedModel = stripBedrockRegionPrefix(model).toLowerCase();
1863
+ const normalizedModel = stripBedrockRegionPrefix(resolved.model).toLowerCase();
1427
1864
  const modelInfo = providerInfo.models.find((m) => m.name.toLowerCase() === normalizedModel);
1428
1865
  if (!modelInfo) {
1429
- throw import_errors.LLMError.unknownModel(provider, model);
1866
+ throw import_errors.LLMError.unknownModel(resolved.provider, resolved.model);
1430
1867
  }
1431
1868
  return modelInfo.supportedFileTypes;
1432
1869
  }
@@ -1557,26 +1994,28 @@ function getEffectiveMaxInputTokens(config, logger) {
1557
1994
  }
1558
1995
  }
1559
1996
  function getModelPricing(provider, model) {
1560
- const providerInfo = LLM_REGISTRY[provider];
1561
- if (acceptsAnyModel(provider)) {
1997
+ const resolved = resolveToNativeProvider(provider, model);
1998
+ const providerInfo = LLM_REGISTRY[resolved.provider];
1999
+ if (acceptsAnyModel(resolved.provider)) {
1562
2000
  return void 0;
1563
2001
  }
1564
- const normalizedModel = stripBedrockRegionPrefix(model).toLowerCase();
2002
+ const normalizedModel = stripBedrockRegionPrefix(resolved.model).toLowerCase();
1565
2003
  const modelInfo = providerInfo.models.find((m) => m.name.toLowerCase() === normalizedModel);
1566
2004
  return modelInfo?.pricing;
1567
2005
  }
1568
2006
  function getModelDisplayName(model, provider) {
1569
- let resolvedProvider;
2007
+ let inferredProvider;
1570
2008
  try {
1571
- resolvedProvider = provider ?? getProviderFromModel(model);
2009
+ inferredProvider = provider ?? getProviderFromModel(model);
1572
2010
  } catch {
1573
2011
  return model;
1574
2012
  }
1575
- const providerInfo = LLM_REGISTRY[resolvedProvider];
1576
- if (!providerInfo || acceptsAnyModel(resolvedProvider)) {
2013
+ const resolved = resolveToNativeProvider(inferredProvider, model);
2014
+ const providerInfo = LLM_REGISTRY[resolved.provider];
2015
+ if (!providerInfo || acceptsAnyModel(resolved.provider)) {
1577
2016
  return model;
1578
2017
  }
1579
- const normalizedModel = stripBedrockRegionPrefix(model).toLowerCase();
2018
+ const normalizedModel = stripBedrockRegionPrefix(resolved.model).toLowerCase();
1580
2019
  const modelInfo = providerInfo.models.find((m) => m.name.toLowerCase() === normalizedModel);
1581
2020
  return modelInfo?.displayName ?? model;
1582
2021
  }
@@ -1608,6 +2047,7 @@ function calculateCost(usage, pricing) {
1608
2047
  MIME_TYPE_TO_FILE_TYPE,
1609
2048
  acceptsAnyModel,
1610
2049
  calculateCost,
2050
+ getAllModelsForProvider,
1611
2051
  getAllSupportedModels,
1612
2052
  getAllowedMimeTypes,
1613
2053
  getDefaultModelForProvider,
@@ -1619,13 +2059,17 @@ function calculateCost(usage, pricing) {
1619
2059
  getSupportedFileTypesForModel,
1620
2060
  getSupportedModels,
1621
2061
  getSupportedProviders,
2062
+ hasAllRegistryModelsSupport,
2063
+ isModelValidForProvider,
1622
2064
  isReasoningCapableModel,
1623
2065
  isValidProviderModel,
1624
2066
  modelSupportsFileType,
1625
2067
  requiresApiKey,
1626
2068
  requiresBaseURL,
2069
+ resolveModelOrigin,
1627
2070
  stripBedrockRegionPrefix,
1628
2071
  supportsBaseURL,
1629
2072
  supportsCustomModels,
2073
+ transformModelNameForProvider,
1630
2074
  validateModelFileSupport
1631
2075
  });