@quantish/agent 0.1.17 → 0.1.19
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/index.js +135 -11
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2386,14 +2386,35 @@ function resolveModelId(nameOrAlias) {
|
|
|
2386
2386
|
return id;
|
|
2387
2387
|
}
|
|
2388
2388
|
}
|
|
2389
|
+
if (OPENROUTER_MODELS[lower]) {
|
|
2390
|
+
return lower;
|
|
2391
|
+
}
|
|
2392
|
+
if (OPENROUTER_MODEL_ALIASES[lower]) {
|
|
2393
|
+
return OPENROUTER_MODEL_ALIASES[lower];
|
|
2394
|
+
}
|
|
2395
|
+
for (const [id, config] of Object.entries(OPENROUTER_MODELS)) {
|
|
2396
|
+
if (config.name.toLowerCase() === lower) {
|
|
2397
|
+
return id;
|
|
2398
|
+
}
|
|
2399
|
+
}
|
|
2400
|
+
if (nameOrAlias.includes("/")) {
|
|
2401
|
+
return nameOrAlias;
|
|
2402
|
+
}
|
|
2389
2403
|
return null;
|
|
2390
2404
|
}
|
|
2391
2405
|
function getModelPricing(modelId) {
|
|
2392
|
-
const
|
|
2393
|
-
|
|
2406
|
+
const anthropicModel = MODELS[modelId];
|
|
2407
|
+
if (anthropicModel?.pricing) {
|
|
2408
|
+
return anthropicModel.pricing;
|
|
2409
|
+
}
|
|
2410
|
+
const openrouterModel = OPENROUTER_MODELS[modelId];
|
|
2411
|
+
if (openrouterModel?.pricing) {
|
|
2412
|
+
return openrouterModel.pricing;
|
|
2413
|
+
}
|
|
2414
|
+
return null;
|
|
2394
2415
|
}
|
|
2395
2416
|
function getModelConfig(modelId) {
|
|
2396
|
-
return MODELS[modelId] ?? null;
|
|
2417
|
+
return MODELS[modelId] ?? OPENROUTER_MODELS[modelId] ?? null;
|
|
2397
2418
|
}
|
|
2398
2419
|
function calculateCost(modelId, inputTokens, outputTokens, cacheCreationTokens = 0, cacheReadTokens = 0) {
|
|
2399
2420
|
const pricing = getModelPricing(modelId);
|
|
@@ -2437,13 +2458,106 @@ function formatCost(cost) {
|
|
|
2437
2458
|
function listModels() {
|
|
2438
2459
|
return Object.values(MODELS);
|
|
2439
2460
|
}
|
|
2461
|
+
var OPENROUTER_MODELS = {
|
|
2462
|
+
"z-ai/glm-4.7": {
|
|
2463
|
+
id: "z-ai/glm-4.7",
|
|
2464
|
+
name: "glm-4.7",
|
|
2465
|
+
displayName: "GLM 4.7",
|
|
2466
|
+
pricing: {
|
|
2467
|
+
inputPerMTok: 0.4,
|
|
2468
|
+
outputPerMTok: 1.5,
|
|
2469
|
+
cacheWritePerMTok: 0,
|
|
2470
|
+
cacheReadPerMTok: 0
|
|
2471
|
+
},
|
|
2472
|
+
contextWindow: 202752,
|
|
2473
|
+
description: "Z.AI flagship. Enhanced programming, multi-step reasoning, agent tasks."
|
|
2474
|
+
},
|
|
2475
|
+
"minimax/minimax-m2.1": {
|
|
2476
|
+
id: "minimax/minimax-m2.1",
|
|
2477
|
+
name: "minimax-m2.1",
|
|
2478
|
+
displayName: "MiniMax M2.1",
|
|
2479
|
+
pricing: {
|
|
2480
|
+
inputPerMTok: 0.3,
|
|
2481
|
+
outputPerMTok: 1.2,
|
|
2482
|
+
cacheWritePerMTok: 0,
|
|
2483
|
+
cacheReadPerMTok: 0
|
|
2484
|
+
},
|
|
2485
|
+
contextWindow: 204800,
|
|
2486
|
+
description: "Lightweight, optimized for coding and agentic workflows."
|
|
2487
|
+
},
|
|
2488
|
+
"deepseek/deepseek-chat": {
|
|
2489
|
+
id: "deepseek/deepseek-chat",
|
|
2490
|
+
name: "deepseek-chat",
|
|
2491
|
+
displayName: "DeepSeek Chat",
|
|
2492
|
+
pricing: {
|
|
2493
|
+
inputPerMTok: 0.14,
|
|
2494
|
+
outputPerMTok: 0.28,
|
|
2495
|
+
cacheWritePerMTok: 0,
|
|
2496
|
+
cacheReadPerMTok: 0
|
|
2497
|
+
},
|
|
2498
|
+
contextWindow: 128e3,
|
|
2499
|
+
description: "Ultra-cheap, strong coding and reasoning. Great for high-volume."
|
|
2500
|
+
},
|
|
2501
|
+
"google/gemini-2.0-flash-001": {
|
|
2502
|
+
id: "google/gemini-2.0-flash-001",
|
|
2503
|
+
name: "gemini-2.0-flash",
|
|
2504
|
+
displayName: "Gemini 2.0 Flash",
|
|
2505
|
+
pricing: {
|
|
2506
|
+
inputPerMTok: 0.1,
|
|
2507
|
+
outputPerMTok: 0.4,
|
|
2508
|
+
cacheWritePerMTok: 0,
|
|
2509
|
+
cacheReadPerMTok: 0
|
|
2510
|
+
},
|
|
2511
|
+
contextWindow: 1e6,
|
|
2512
|
+
description: "Google's fast multimodal model. 1M context window."
|
|
2513
|
+
},
|
|
2514
|
+
"qwen/qwen-2.5-coder-32b-instruct": {
|
|
2515
|
+
id: "qwen/qwen-2.5-coder-32b-instruct",
|
|
2516
|
+
name: "qwen-coder-32b",
|
|
2517
|
+
displayName: "Qwen 2.5 Coder 32B",
|
|
2518
|
+
pricing: {
|
|
2519
|
+
inputPerMTok: 0.18,
|
|
2520
|
+
outputPerMTok: 0.18,
|
|
2521
|
+
cacheWritePerMTok: 0,
|
|
2522
|
+
cacheReadPerMTok: 0
|
|
2523
|
+
},
|
|
2524
|
+
contextWindow: 32768,
|
|
2525
|
+
description: "Alibaba's coding specialist. Excellent for code generation."
|
|
2526
|
+
}
|
|
2527
|
+
};
|
|
2528
|
+
var OPENROUTER_MODEL_ALIASES = {
|
|
2529
|
+
"glm": "z-ai/glm-4.7",
|
|
2530
|
+
"glm-4.7": "z-ai/glm-4.7",
|
|
2531
|
+
"minimax": "minimax/minimax-m2.1",
|
|
2532
|
+
"deepseek": "deepseek/deepseek-chat",
|
|
2533
|
+
"gemini": "google/gemini-2.0-flash-001",
|
|
2534
|
+
"gemini-flash": "google/gemini-2.0-flash-001",
|
|
2535
|
+
"qwen": "qwen/qwen-2.5-coder-32b-instruct",
|
|
2536
|
+
"qwen-coder": "qwen/qwen-2.5-coder-32b-instruct"
|
|
2537
|
+
};
|
|
2440
2538
|
|
|
2441
2539
|
// src/agent/provider.ts
|
|
2442
2540
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2443
2541
|
|
|
2444
2542
|
// src/agent/openrouter.ts
|
|
2445
2543
|
var OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
|
|
2446
|
-
var
|
|
2544
|
+
var OPENROUTER_MODELS2 = {
|
|
2545
|
+
// Z.AI GLM models
|
|
2546
|
+
"z-ai/glm-4.7": {
|
|
2547
|
+
id: "z-ai/glm-4.7",
|
|
2548
|
+
name: "glm-4.7",
|
|
2549
|
+
displayName: "GLM 4.7",
|
|
2550
|
+
provider: "Z.AI",
|
|
2551
|
+
pricing: {
|
|
2552
|
+
inputPerMTok: 0.4,
|
|
2553
|
+
outputPerMTok: 1.5
|
|
2554
|
+
},
|
|
2555
|
+
contextWindow: 202752,
|
|
2556
|
+
maxOutputTokens: 65536,
|
|
2557
|
+
supportsTools: true,
|
|
2558
|
+
supportsReasoning: true,
|
|
2559
|
+
description: "Z.AI flagship. Enhanced programming, multi-step reasoning, agent tasks."
|
|
2560
|
+
},
|
|
2447
2561
|
// MiniMax models - very cost effective
|
|
2448
2562
|
"minimax/minimax-m2.1": {
|
|
2449
2563
|
id: "minimax/minimax-m2.1",
|
|
@@ -2636,6 +2750,9 @@ var OPENROUTER_MODELS = {
|
|
|
2636
2750
|
}
|
|
2637
2751
|
};
|
|
2638
2752
|
var OPENROUTER_ALIASES = {
|
|
2753
|
+
// Z.AI GLM
|
|
2754
|
+
"glm": "z-ai/glm-4.7",
|
|
2755
|
+
"glm-4.7": "z-ai/glm-4.7",
|
|
2639
2756
|
// MiniMax
|
|
2640
2757
|
"minimax": "minimax/minimax-m2.1",
|
|
2641
2758
|
"m2": "minimax/minimax-m2",
|
|
@@ -2662,13 +2779,13 @@ var OPENROUTER_ALIASES = {
|
|
|
2662
2779
|
};
|
|
2663
2780
|
function resolveOpenRouterModelId(nameOrAlias) {
|
|
2664
2781
|
const lower = nameOrAlias.toLowerCase();
|
|
2665
|
-
if (
|
|
2782
|
+
if (OPENROUTER_MODELS2[lower]) {
|
|
2666
2783
|
return lower;
|
|
2667
2784
|
}
|
|
2668
2785
|
if (OPENROUTER_ALIASES[lower]) {
|
|
2669
2786
|
return OPENROUTER_ALIASES[lower];
|
|
2670
2787
|
}
|
|
2671
|
-
for (const [id, config] of Object.entries(
|
|
2788
|
+
for (const [id, config] of Object.entries(OPENROUTER_MODELS2)) {
|
|
2672
2789
|
if (config.name.toLowerCase() === lower) {
|
|
2673
2790
|
return id;
|
|
2674
2791
|
}
|
|
@@ -2679,7 +2796,7 @@ function resolveOpenRouterModelId(nameOrAlias) {
|
|
|
2679
2796
|
return null;
|
|
2680
2797
|
}
|
|
2681
2798
|
function getOpenRouterModelConfig(modelId) {
|
|
2682
|
-
return
|
|
2799
|
+
return OPENROUTER_MODELS2[modelId] ?? null;
|
|
2683
2800
|
}
|
|
2684
2801
|
function convertToOpenAITools(anthropicTools) {
|
|
2685
2802
|
return anthropicTools.map((tool) => ({
|
|
@@ -2840,7 +2957,7 @@ function calculateOpenRouterCost(modelId, inputTokens, outputTokens, cacheReadTo
|
|
|
2840
2957
|
};
|
|
2841
2958
|
}
|
|
2842
2959
|
function listOpenRouterModels() {
|
|
2843
|
-
return Object.values(
|
|
2960
|
+
return Object.values(OPENROUTER_MODELS2);
|
|
2844
2961
|
}
|
|
2845
2962
|
|
|
2846
2963
|
// src/agent/provider.ts
|
|
@@ -3144,10 +3261,17 @@ var OpenRouterProvider = class {
|
|
|
3144
3261
|
const toolCalls = [];
|
|
3145
3262
|
for (const [, tc] of toolCallsInProgress) {
|
|
3146
3263
|
try {
|
|
3147
|
-
|
|
3264
|
+
let args = tc.arguments?.trim() || "{}";
|
|
3265
|
+
if (args && !args.endsWith("}")) {
|
|
3266
|
+
args = args + "}";
|
|
3267
|
+
}
|
|
3268
|
+
const input = JSON.parse(args);
|
|
3148
3269
|
toolCalls.push({ id: tc.id, name: tc.name, input });
|
|
3149
3270
|
callbacks.onToolCall?.(tc.id, tc.name, input);
|
|
3150
|
-
} catch {
|
|
3271
|
+
} catch (e) {
|
|
3272
|
+
console.error(`[OpenRouter] Failed to parse tool call "${tc.name}": ${tc.arguments}`);
|
|
3273
|
+
toolCalls.push({ id: tc.id, name: tc.name, input: {} });
|
|
3274
|
+
callbacks.onToolCall?.(tc.id, tc.name, {});
|
|
3151
3275
|
}
|
|
3152
3276
|
}
|
|
3153
3277
|
const cost = calculateOpenRouterCost(
|
|
@@ -3959,7 +4083,7 @@ ${userMessage}`;
|
|
|
3959
4083
|
}
|
|
3960
4084
|
if (!resolvedId) {
|
|
3961
4085
|
const anthropicModels = Object.values(MODELS).map((m) => m.name).join(", ");
|
|
3962
|
-
const orModels = Object.values(
|
|
4086
|
+
const orModels = Object.values(OPENROUTER_MODELS2).slice(0, 5).map((m) => m.name).join(", ");
|
|
3963
4087
|
return {
|
|
3964
4088
|
success: false,
|
|
3965
4089
|
error: `Unknown model: "${modelIdOrAlias}". Anthropic: ${anthropicModels}. OpenRouter: ${orModels}, ...`
|