@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.
- package/dist/agent/DextoAgent.cjs +94 -26
- package/dist/agent/DextoAgent.d.ts +17 -7
- package/dist/agent/DextoAgent.d.ts.map +1 -1
- package/dist/agent/DextoAgent.js +95 -27
- package/dist/agent/schemas.d.ts +417 -66
- package/dist/agent/schemas.d.ts.map +1 -1
- package/dist/context/utils.cjs +49 -3
- package/dist/context/utils.d.ts.map +1 -1
- package/dist/context/utils.js +49 -3
- package/dist/errors/types.cjs +2 -1
- package/dist/errors/types.d.ts +2 -1
- package/dist/errors/types.d.ts.map +1 -1
- package/dist/errors/types.js +2 -1
- package/dist/image/types.d.ts +15 -0
- package/dist/image/types.d.ts.map +1 -1
- package/dist/llm/error-codes.cjs +1 -0
- package/dist/llm/error-codes.d.ts +1 -0
- package/dist/llm/error-codes.d.ts.map +1 -1
- package/dist/llm/error-codes.js +1 -0
- package/dist/llm/errors.cjs +15 -0
- package/dist/llm/errors.d.ts +15 -8
- package/dist/llm/errors.d.ts.map +1 -1
- package/dist/llm/errors.js +15 -0
- package/dist/llm/executor/turn-executor.cjs +27 -0
- package/dist/llm/executor/turn-executor.d.ts.map +1 -1
- package/dist/llm/executor/turn-executor.js +27 -0
- package/dist/llm/registry.cjs +472 -28
- package/dist/llm/registry.d.ts +80 -4
- package/dist/llm/registry.d.ts.map +1 -1
- package/dist/llm/registry.js +464 -25
- package/dist/llm/resolver.cjs +13 -0
- package/dist/llm/resolver.d.ts.map +1 -1
- package/dist/llm/resolver.js +16 -1
- package/dist/llm/schemas.d.ts +59 -59
- package/dist/llm/services/factory.cjs +41 -25
- package/dist/llm/services/factory.d.ts +20 -1
- package/dist/llm/services/factory.d.ts.map +1 -1
- package/dist/llm/services/factory.js +42 -26
- package/dist/llm/services/test-utils.integration.cjs +5 -1
- package/dist/llm/services/test-utils.integration.d.ts.map +1 -1
- package/dist/llm/services/test-utils.integration.js +5 -1
- package/dist/llm/types.cjs +5 -2
- package/dist/llm/types.d.ts +1 -1
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +5 -2
- package/dist/logger/logger.cjs +6 -7
- package/dist/logger/logger.d.ts +1 -0
- package/dist/logger/logger.d.ts.map +1 -1
- package/dist/logger/logger.js +6 -7
- package/dist/logger/v2/dexto-logger.cjs +4 -0
- package/dist/logger/v2/dexto-logger.d.ts +3 -0
- package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
- package/dist/logger/v2/dexto-logger.js +4 -0
- package/dist/logger/v2/types.d.ts +2 -0
- package/dist/logger/v2/types.d.ts.map +1 -1
- package/dist/mcp/error-codes.cjs +1 -0
- package/dist/mcp/error-codes.d.ts +1 -0
- package/dist/mcp/error-codes.d.ts.map +1 -1
- package/dist/mcp/error-codes.js +1 -0
- package/dist/mcp/errors.cjs +13 -0
- package/dist/mcp/errors.d.ts +7 -0
- package/dist/mcp/errors.d.ts.map +1 -1
- package/dist/mcp/errors.js +13 -0
- package/dist/mcp/manager.cjs +46 -4
- package/dist/mcp/manager.d.ts +10 -2
- package/dist/mcp/manager.d.ts.map +1 -1
- package/dist/mcp/manager.js +46 -4
- package/dist/mcp/mcp-client.cjs +89 -5
- package/dist/mcp/mcp-client.d.ts +5 -1
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js +89 -5
- package/dist/mcp/schemas.cjs +6 -1
- package/dist/mcp/schemas.d.ts +1 -1
- package/dist/mcp/schemas.d.ts.map +1 -1
- package/dist/mcp/schemas.js +6 -1
- package/dist/mcp/types.d.ts +5 -0
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/prompts/index.d.ts +1 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/prompt-manager.cjs +90 -4
- package/dist/prompts/prompt-manager.d.ts +16 -6
- package/dist/prompts/prompt-manager.d.ts.map +1 -1
- package/dist/prompts/prompt-manager.js +90 -4
- package/dist/prompts/providers/config-prompt-provider.cjs +104 -10
- package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/config-prompt-provider.js +105 -11
- package/dist/prompts/providers/custom-prompt-provider.cjs +1 -0
- package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/custom-prompt-provider.js +1 -0
- package/dist/prompts/providers/mcp-prompt-provider.cjs +1 -0
- package/dist/prompts/providers/mcp-prompt-provider.d.ts.map +1 -1
- package/dist/prompts/providers/mcp-prompt-provider.js +1 -0
- package/dist/prompts/schemas.cjs +28 -2
- package/dist/prompts/schemas.d.ts +130 -0
- package/dist/prompts/schemas.d.ts.map +1 -1
- package/dist/prompts/schemas.js +28 -2
- package/dist/prompts/types.d.ts +55 -3
- package/dist/prompts/types.d.ts.map +1 -1
- package/dist/session/chat-session.d.ts +1 -1
- package/dist/session/chat-session.d.ts.map +1 -1
- package/dist/session/index.d.ts +1 -1
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/session-manager.cjs +47 -3
- package/dist/session/session-manager.d.ts +10 -0
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +47 -3
- package/dist/systemPrompt/contributors.cjs +42 -0
- package/dist/systemPrompt/contributors.d.ts +13 -0
- package/dist/systemPrompt/contributors.d.ts.map +1 -1
- package/dist/systemPrompt/contributors.js +41 -0
- package/dist/tools/errors.cjs +7 -3
- package/dist/tools/errors.d.ts +5 -1
- package/dist/tools/errors.d.ts.map +1 -1
- package/dist/tools/errors.js +7 -3
- package/dist/tools/internal-tools/constants.cjs +2 -1
- package/dist/tools/internal-tools/constants.d.ts +1 -1
- package/dist/tools/internal-tools/constants.d.ts.map +1 -1
- package/dist/tools/internal-tools/constants.js +2 -1
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.cjs +140 -0
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts +24 -0
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts.map +1 -0
- package/dist/tools/internal-tools/implementations/invoke-skill-tool.js +117 -0
- package/dist/tools/internal-tools/provider.cjs +15 -0
- package/dist/tools/internal-tools/provider.d.ts +12 -0
- package/dist/tools/internal-tools/provider.d.ts.map +1 -1
- package/dist/tools/internal-tools/provider.js +15 -0
- package/dist/tools/internal-tools/registry.cjs +6 -0
- package/dist/tools/internal-tools/registry.d.ts +34 -0
- package/dist/tools/internal-tools/registry.d.ts.map +1 -1
- package/dist/tools/internal-tools/registry.js +6 -0
- package/dist/tools/schemas.cjs +2 -2
- package/dist/tools/schemas.d.ts +1 -1
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +2 -2
- package/dist/tools/tool-manager.cjs +230 -79
- package/dist/tools/tool-manager.d.ts +89 -8
- package/dist/tools/tool-manager.d.ts.map +1 -1
- package/dist/tools/tool-manager.js +231 -80
- package/dist/utils/api-key-resolver.cjs +5 -2
- package/dist/utils/api-key-resolver.d.ts.map +1 -1
- package/dist/utils/api-key-resolver.js +5 -2
- package/dist/utils/service-initializer.cjs +8 -2
- package/dist/utils/service-initializer.d.ts +5 -1
- package/dist/utils/service-initializer.d.ts.map +1 -1
- package/dist/utils/service-initializer.js +8 -2
- package/package.json +1 -1
package/dist/llm/registry.cjs
CHANGED
|
@@ -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("
|
|
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 [...
|
|
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
|
|
1358
|
-
const
|
|
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(
|
|
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
|
|
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
|
|
1423
|
-
|
|
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
|
|
1561
|
-
|
|
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
|
|
2007
|
+
let inferredProvider;
|
|
1570
2008
|
try {
|
|
1571
|
-
|
|
2009
|
+
inferredProvider = provider ?? getProviderFromModel(model);
|
|
1572
2010
|
} catch {
|
|
1573
2011
|
return model;
|
|
1574
2012
|
}
|
|
1575
|
-
const
|
|
1576
|
-
|
|
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
|
});
|