@link-assistant/hive-mind 1.46.8 → 1.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +3 -2
- package/package.json +1 -1
- package/src/claude.budget-stats.lib.mjs +64 -34
- package/src/claude.lib.mjs +5 -5
- package/src/models/index.mjs +10 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,27 @@
|
|
|
1
1
|
# @link-assistant/hive-mind
|
|
2
2
|
|
|
3
|
+
## 1.47.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 7997308: feat: update free models for --tool agent, set qwen3.6-plus-free as default (#1543)
|
|
8
|
+
- Change default agent model from `minimax-m2.5-free` to `qwen3.6-plus-free` (~1M context window)
|
|
9
|
+
- Add `qwen3.6-plus-free` (Alibaba Qwen, ~1M context) to free models
|
|
10
|
+
- Add `nemotron-3-super-free` (NVIDIA hybrid Mamba-Transformer, ~262K context) to free models
|
|
11
|
+
- Update documentation, tests, and provider priority lists
|
|
12
|
+
- Syncs with upstream agent PR #234
|
|
13
|
+
|
|
14
|
+
## 1.46.9
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 8104fad: Fix wrong context window calculation showing impossible percentages like 250% (Issue #1539). When peakContextUsage is unknown (e.g. sub-agent models from result JSON only), skip the context window input tokens display entirely instead of falling back to cumulative totals across all requests, which are not valid per-request context window metrics.
|
|
19
|
+
|
|
3
20
|
## 1.46.8
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
|
6
23
|
|
|
24
|
+
- Fix wrong context window calculation showing impossible percentages like 250% (Issue #1539). When peakContextUsage is unknown (e.g. sub-agent models from result JSON only), skip the context window input tokens display entirely instead of falling back to cumulative totals across all requests, which are not valid per-request context window metrics.
|
|
7
25
|
- bcf2b9b: Retry on network issues and minimize terminal/log output differences (#1536): add ghRetry/ghCmdRetry utilities with exponential backoff for transient network errors (TCP reset, TLS timeout, connection refused, unexpected EOF). Apply retry to critical gh CLI calls: accept-invite, repository setup, auto-fork permission check, visibility detection, write permission check. Log stderr to log file on command failure for terminal/log parity. Add 'unexpected eof' to transient error detection patterns.
|
|
8
26
|
|
|
9
27
|
## 1.46.7
|
package/README.md
CHANGED
|
@@ -445,10 +445,11 @@ Examples:
|
|
|
445
445
|
/solve https://github.com/owner/repo/issues/123 --model opus --think max
|
|
446
446
|
|
|
447
447
|
Free Models (with --tool agent):
|
|
448
|
+
/solve https://github.com/owner/repo/issues/123 --tool agent --model qwen3.6-plus-free
|
|
449
|
+
/solve https://github.com/owner/repo/issues/123 --tool agent --model opencode/qwen3.6-plus-free
|
|
450
|
+
/solve https://github.com/owner/repo/issues/123 --tool agent --model nemotron-3-super-free
|
|
448
451
|
/solve https://github.com/owner/repo/issues/123 --tool agent --model minimax-m2.5-free
|
|
449
|
-
/solve https://github.com/owner/repo/issues/123 --tool agent --model opencode/minimax-m2.5-free
|
|
450
452
|
/solve https://github.com/owner/repo/issues/123 --tool agent --model gpt-5-nano
|
|
451
|
-
/solve https://github.com/owner/repo/issues/123 --tool agent --model big-pickle
|
|
452
453
|
|
|
453
454
|
Free Models via Kilo Gateway (with --tool agent):
|
|
454
455
|
/solve https://github.com/owner/repo/issues/123 --tool agent --model kilo/glm-5-free
|
package/package.json
CHANGED
|
@@ -158,16 +158,19 @@ export const displayBudgetStats = async (usage, tokenUsage, log) => {
|
|
|
158
158
|
const subSessions = tokenUsage?.subSessions || [];
|
|
159
159
|
const hasMultipleSubSessions = subSessions.length > 1;
|
|
160
160
|
|
|
161
|
+
const peakContext = usage.peakContextUsage || 0;
|
|
162
|
+
|
|
161
163
|
if (hasMultipleSubSessions) {
|
|
162
164
|
for (let i = 0; i < subSessions.length; i++) {
|
|
163
165
|
const sub = subSessions[i];
|
|
164
166
|
const subPeak = sub.peakContextUsage || 0;
|
|
165
|
-
|
|
166
|
-
|
|
167
|
+
// Issue #1539: Only use peak per-request context for context window display.
|
|
168
|
+
// Cumulative totals across all requests can exceed the context limit and produce
|
|
169
|
+
// impossible percentages (e.g. 250%). When peak is unknown, skip context display.
|
|
167
170
|
const parts = [];
|
|
168
|
-
if (contextLimit &&
|
|
169
|
-
const pct = ((
|
|
170
|
-
parts.push(`${formatNumber(
|
|
171
|
+
if (contextLimit && subPeak > 0) {
|
|
172
|
+
const pct = ((subPeak / contextLimit) * 100).toFixed(0);
|
|
173
|
+
parts.push(`${formatNumber(subPeak)} / ${formatNumber(contextLimit)} input tokens (${pct}%)`);
|
|
171
174
|
}
|
|
172
175
|
if (outputLimit) {
|
|
173
176
|
const outPct = ((sub.outputTokens / outputLimit) * 100).toFixed(0);
|
|
@@ -177,15 +180,12 @@ export const displayBudgetStats = async (usage, tokenUsage, log) => {
|
|
|
177
180
|
await log(` ${i + 1}. Context window: ${parts.join(', ')}`);
|
|
178
181
|
}
|
|
179
182
|
}
|
|
180
|
-
} else {
|
|
181
|
-
// Single sub-session: single-line format
|
|
182
|
-
const peakContext = usage.peakContextUsage || 0;
|
|
183
|
-
const cumulativeContext = usage.inputTokens + usage.cacheCreationTokens + usage.cacheReadTokens;
|
|
184
|
-
const contextValue = peakContext > 0 ? peakContext : cumulativeContext;
|
|
183
|
+
} else if (peakContext > 0) {
|
|
184
|
+
// Single sub-session with known peak: single-line format
|
|
185
185
|
const parts = [];
|
|
186
|
-
if (contextLimit
|
|
187
|
-
const pct = ((
|
|
188
|
-
parts.push(`${formatNumber(
|
|
186
|
+
if (contextLimit) {
|
|
187
|
+
const pct = ((peakContext / contextLimit) * 100).toFixed(0);
|
|
188
|
+
parts.push(`${formatNumber(peakContext)} / ${formatNumber(contextLimit)} input tokens (${pct}%)`);
|
|
189
189
|
}
|
|
190
190
|
if (outputLimit) {
|
|
191
191
|
const outPct = ((usage.outputTokens / outputLimit) * 100).toFixed(0);
|
|
@@ -195,6 +195,8 @@ export const displayBudgetStats = async (usage, tokenUsage, log) => {
|
|
|
195
195
|
await log(` Context window: ${parts.join(', ')}`);
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
|
+
// Issue #1539: When peakContextUsage is unknown, skip context window line entirely.
|
|
199
|
+
// Cumulative totals are shown on the Total line below — no duplication needed.
|
|
198
200
|
|
|
199
201
|
// Cumulative totals — single line
|
|
200
202
|
const totalInputNonCached = usage.inputTokens + usage.cacheCreationTokens;
|
|
@@ -202,6 +204,11 @@ export const displayBudgetStats = async (usage, tokenUsage, log) => {
|
|
|
202
204
|
let totalLine = `${formatNumber(totalInputNonCached)}`;
|
|
203
205
|
if (cachedTokens > 0) totalLine += ` + ${formatNumber(cachedTokens)} cached`;
|
|
204
206
|
totalLine += ` input tokens, ${formatNumber(usage.outputTokens)} output tokens`;
|
|
207
|
+
// Issue #1539: When peakContextUsage is unknown, embed output percentage in Total line
|
|
208
|
+
if (peakContext === 0 && outputLimit) {
|
|
209
|
+
const outPct = ((usage.outputTokens / outputLimit) * 100).toFixed(0);
|
|
210
|
+
totalLine += ` (${outPct}% of ${formatNumber(outputLimit)} output limit)`;
|
|
211
|
+
}
|
|
205
212
|
await log(` Total: ${totalLine}`);
|
|
206
213
|
};
|
|
207
214
|
|
|
@@ -230,6 +237,15 @@ export const mergeResultModelUsage = (modelUsage, resultModelUsage) => {
|
|
|
230
237
|
if (resultUsage.costUSD != null) {
|
|
231
238
|
modelUsage[modelId]._resultCostUSD = resultUsage.costUSD;
|
|
232
239
|
}
|
|
240
|
+
// Issue #1539: Extract model limits from result JSON for sub-agent models
|
|
241
|
+
// Claude Code's result event includes contextWindow and maxOutputTokens per model,
|
|
242
|
+
// which we use as fallback when modelInfo API is unavailable.
|
|
243
|
+
if (resultUsage.contextWindow) {
|
|
244
|
+
modelUsage[modelId]._resultContextWindow = resultUsage.contextWindow;
|
|
245
|
+
}
|
|
246
|
+
if (resultUsage.maxOutputTokens) {
|
|
247
|
+
modelUsage[modelId]._resultMaxOutputTokens = resultUsage.maxOutputTokens;
|
|
248
|
+
}
|
|
233
249
|
} else {
|
|
234
250
|
const jsonlUsage = modelUsage[modelId];
|
|
235
251
|
const jsonlTotal = jsonlUsage.inputTokens + jsonlUsage.cacheCreationTokens + jsonlUsage.cacheReadTokens + jsonlUsage.outputTokens;
|
|
@@ -244,6 +260,13 @@ export const mergeResultModelUsage = (modelUsage, resultModelUsage) => {
|
|
|
244
260
|
if (resultUsage.costUSD != null) {
|
|
245
261
|
jsonlUsage._resultCostUSD = resultUsage.costUSD;
|
|
246
262
|
}
|
|
263
|
+
// Issue #1539: Also extract model limits from result JSON as fallback
|
|
264
|
+
if (resultUsage.contextWindow) {
|
|
265
|
+
jsonlUsage._resultContextWindow = resultUsage.contextWindow;
|
|
266
|
+
}
|
|
267
|
+
if (resultUsage.maxOutputTokens) {
|
|
268
|
+
jsonlUsage._resultMaxOutputTokens = resultUsage.maxOutputTokens;
|
|
269
|
+
}
|
|
247
270
|
}
|
|
248
271
|
}
|
|
249
272
|
};
|
|
@@ -274,36 +297,35 @@ const formatSubSessionsList = (subSessions, contextLimit, outputLimit) => {
|
|
|
274
297
|
let result = '';
|
|
275
298
|
for (let i = 0; i < subSessions.length; i++) {
|
|
276
299
|
const sub = subSessions[i];
|
|
300
|
+
// Issue #1539: Only use peak per-request context; skip context display when unknown
|
|
277
301
|
const subPeakContext = sub.peakContextUsage || 0;
|
|
278
|
-
|
|
279
|
-
const subCumulative = (sub.inputTokens || 0) + (sub.cacheCreationTokens || 0) + (sub.cacheReadTokens || 0);
|
|
280
|
-
result += formatContextOutputLine(subPeakContext, contextLimit, sub.outputTokens, outputLimit, `${i + 1}. `, subCumulative);
|
|
302
|
+
result += formatContextOutputLine(subPeakContext, contextLimit, sub.outputTokens, outputLimit, `${i + 1}. `);
|
|
281
303
|
}
|
|
282
304
|
return result;
|
|
283
305
|
};
|
|
284
306
|
|
|
285
307
|
/**
|
|
286
308
|
* Issue #1526: Build a single-line context window + output tokens string.
|
|
309
|
+
* Issue #1539: Only show context window when peakContext > 0 (per-request peak known).
|
|
310
|
+
* When peakContext is 0 (unknown), context part is omitted to avoid misleading percentages.
|
|
287
311
|
* Format: "- Context window: X / Y input tokens (Z%), A / B output tokens (W%)"
|
|
288
|
-
*
|
|
289
|
-
* @param {number} peakContext - Peak context usage (0 if unknown)
|
|
312
|
+
* @param {number} peakContext - Peak context usage (0 if unknown — context display skipped)
|
|
290
313
|
* @param {number} contextLimit - Context window limit (null if unknown)
|
|
291
314
|
* @param {number} outputTokens - Output tokens used
|
|
292
315
|
* @param {number} outputLimit - Output token limit (null if unknown)
|
|
293
316
|
* @param {string} [prefix='- '] - Line prefix
|
|
294
317
|
* @returns {string} Formatted line or empty string
|
|
295
318
|
*/
|
|
296
|
-
const formatContextOutputLine = (peakContext, contextLimit, outputTokens, outputLimit, prefix = '- '
|
|
319
|
+
const formatContextOutputLine = (peakContext, contextLimit, outputTokens, outputLimit, prefix = '- ') => {
|
|
297
320
|
const parts = [];
|
|
298
321
|
if (contextLimit) {
|
|
299
|
-
//
|
|
300
|
-
//
|
|
301
|
-
//
|
|
302
|
-
//
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
parts.push(`${formatTokensCompact(contextValue)} / ${formatTokensCompact(contextLimit)} input tokens (${pct}%)`);
|
|
322
|
+
// Issue #1539: Only use peak per-request context for context window display.
|
|
323
|
+
// When peak is unknown (e.g., model only from result JSON, not in JSONL),
|
|
324
|
+
// skip context display. Cumulative totals across all requests are not valid
|
|
325
|
+
// context window metrics and produce impossible percentages (e.g. 250%).
|
|
326
|
+
if (peakContext > 0) {
|
|
327
|
+
const pct = ((peakContext / contextLimit) * 100).toFixed(0);
|
|
328
|
+
parts.push(`${formatTokensCompact(peakContext)} / ${formatTokensCompact(contextLimit)} input tokens (${pct}%)`);
|
|
307
329
|
}
|
|
308
330
|
}
|
|
309
331
|
if (outputLimit) {
|
|
@@ -322,7 +344,8 @@ const formatContextOutputLine = (peakContext, contextLimit, outputTokens, output
|
|
|
322
344
|
* Sub-sessions are shown as a global section (not duplicated per model) since JSONL
|
|
323
345
|
* sub-session tracking is global across all models.
|
|
324
346
|
* Issue #1526: Shorter output format — context window + output tokens on single line.
|
|
325
|
-
*
|
|
347
|
+
* Issue #1539: Only display context window when peak per-request usage is known.
|
|
348
|
+
* Cumulative totals are never used as context window metrics (they can exceed model limits).
|
|
326
349
|
* @param {Object} tokenUsage - Token usage data from calculateSessionTokens or buildAgentBudgetStats
|
|
327
350
|
* @returns {string} Formatted markdown string for PR comment
|
|
328
351
|
*/
|
|
@@ -358,17 +381,17 @@ export const buildBudgetStatsString = tokenUsage => {
|
|
|
358
381
|
|
|
359
382
|
if (isMultiModel) stats += `\n\n**${modelName}:**`;
|
|
360
383
|
|
|
384
|
+
const peakContext = usage.peakContextUsage || 0;
|
|
385
|
+
|
|
361
386
|
if (!isMultiModel && hasMultipleSubSessions) {
|
|
362
387
|
// Single-model + multiple sub-sessions: show numbered sub-sessions under that model
|
|
363
388
|
stats += formatSubSessionsList(subSessions, contextLimit, outputLimit);
|
|
364
|
-
} else {
|
|
389
|
+
} else if (peakContext > 0) {
|
|
365
390
|
// Issue #1526: Single line format for context window + output tokens
|
|
366
|
-
|
|
367
|
-
// (e.g., for result-JSON-sourced sub-agent models where only cumulative totals are available)
|
|
368
|
-
const peakContext = usage.peakContextUsage || 0;
|
|
369
|
-
const cumulativeContext = usage.inputTokens + usage.cacheCreationTokens + usage.cacheReadTokens;
|
|
370
|
-
stats += formatContextOutputLine(peakContext, contextLimit, usage.outputTokens, outputLimit, '- ', cumulativeContext);
|
|
391
|
+
stats += formatContextOutputLine(peakContext, contextLimit, usage.outputTokens, outputLimit, '- ');
|
|
371
392
|
}
|
|
393
|
+
// Issue #1539: When peakContextUsage is unknown, skip context window line entirely.
|
|
394
|
+
// Cumulative totals are shown on the Total line below — no duplication needed.
|
|
372
395
|
|
|
373
396
|
// Cumulative totals per model: input tokens + cached shown separately
|
|
374
397
|
// Issue #1526: Shorter format — single "Total:" line
|
|
@@ -378,6 +401,13 @@ export const buildBudgetStatsString = tokenUsage => {
|
|
|
378
401
|
if (cachedTokens > 0) totalLine += ` + ${formatTokensCompact(cachedTokens)} cached`;
|
|
379
402
|
totalLine += ` input tokens, ${formatTokensCompact(usage.outputTokens)} output tokens`;
|
|
380
403
|
|
|
404
|
+
// Issue #1539: When peakContextUsage is unknown (no per-request data), embed
|
|
405
|
+
// output token percentage in the Total line so no data is lost.
|
|
406
|
+
if (peakContext === 0 && outputLimit) {
|
|
407
|
+
const outPct = ((usage.outputTokens / outputLimit) * 100).toFixed(0);
|
|
408
|
+
totalLine += ` (${outPct}% of ${formatTokensCompact(outputLimit)} output limit)`;
|
|
409
|
+
}
|
|
410
|
+
|
|
381
411
|
// Issue #1508: Show per-model cost when available
|
|
382
412
|
if (usage.costUSD !== null && usage.costUSD !== undefined) {
|
|
383
413
|
totalLine += `, $${usage.costUSD.toFixed(6)} cost`;
|
package/src/claude.lib.mjs
CHANGED
|
@@ -498,13 +498,10 @@ export const calculateSessionTokens = async (sessionId, tempDir, resultModelUsag
|
|
|
498
498
|
}
|
|
499
499
|
// Initialize per-model usage tracking
|
|
500
500
|
const modelUsage = {};
|
|
501
|
-
// Issue #1501: Deduplicate JSONL entries by message ID (
|
|
502
|
-
// Claude Code's stream-json mode splits single API responses with multiple content blocks
|
|
503
|
-
// into separate JSONL entries, each with the same message ID and identical usage stats.
|
|
501
|
+
// Issue #1501: Deduplicate JSONL entries by message ID (stream-json splits responses)
|
|
504
502
|
const seenMessageIds = new Set();
|
|
505
503
|
let duplicateCount = 0;
|
|
506
504
|
// Issue #1501: Track peak context usage per request (not cumulative)
|
|
507
|
-
// The context window limit is per-request, so we track the max single-request fill.
|
|
508
505
|
const peakContextByModel = {};
|
|
509
506
|
let globalPeakContext = 0;
|
|
510
507
|
// Issue #1491: Track sub-sessions between compactification events
|
|
@@ -610,7 +607,10 @@ export const calculateSessionTokens = async (sessionId, tempDir, resultModelUsag
|
|
|
610
607
|
usage.costUSD = usage._resultCostUSD ?? null;
|
|
611
608
|
usage.costBreakdown = null;
|
|
612
609
|
usage.modelName = modelId;
|
|
613
|
-
|
|
610
|
+
// Issue #1539: Use contextWindow/maxOutputTokens from result JSON as fallback model limits
|
|
611
|
+
const ctx = usage._resultContextWindow,
|
|
612
|
+
out = usage._resultMaxOutputTokens;
|
|
613
|
+
usage.modelInfo = ctx || out ? { limit: { context: ctx || null, output: out || null } } : null;
|
|
614
614
|
}
|
|
615
615
|
}
|
|
616
616
|
// Calculate grand totals across all models
|
package/src/models/index.mjs
CHANGED
|
@@ -47,6 +47,7 @@ export const claudeModels = {
|
|
|
47
47
|
|
|
48
48
|
// Agent models (OpenCode API and Kilo Gateway via agent CLI)
|
|
49
49
|
// Issue #1300: Updated free models to match agent PR #191
|
|
50
|
+
// Issue #1543: Added qwen3.6-plus-free (new default) and nemotron-3-super-free per agent PR #234
|
|
50
51
|
export const agentModels = {
|
|
51
52
|
// OpenCode Zen free models (current)
|
|
52
53
|
grok: 'opencode/grok-code',
|
|
@@ -54,7 +55,9 @@ export const agentModels = {
|
|
|
54
55
|
'grok-code-fast-1': 'opencode/grok-code',
|
|
55
56
|
'big-pickle': 'opencode/big-pickle',
|
|
56
57
|
'gpt-5-nano': 'opencode/gpt-5-nano',
|
|
57
|
-
'minimax-m2.5-free': 'opencode/minimax-m2.5-free', //
|
|
58
|
+
'minimax-m2.5-free': 'opencode/minimax-m2.5-free', // Upgraded from M2.1 (Issue #1391)
|
|
59
|
+
'qwen3.6-plus-free': 'opencode/qwen3.6-plus-free', // New: ~1M context, default (Issue #1543)
|
|
60
|
+
'nemotron-3-super-free': 'opencode/nemotron-3-super-free', // New: NVIDIA hybrid Mamba-Transformer (Issue #1543)
|
|
58
61
|
// Kilo Gateway free models (Issue #1282, updated in #1300)
|
|
59
62
|
// Short names for Kilo-exclusive models (Issue #1300)
|
|
60
63
|
'glm-5-free': 'kilo/glm-5-free', // Kilo-exclusive
|
|
@@ -112,7 +115,7 @@ export const codexModels = {
|
|
|
112
115
|
// Default model for each tool (Issue #1473: centralized to avoid scattered hardcoded defaults)
|
|
113
116
|
export const defaultModels = {
|
|
114
117
|
claude: 'sonnet',
|
|
115
|
-
agent: 'minimax-m2.5-free
|
|
118
|
+
agent: 'qwen3.6-plus-free', // Issue #1543: changed from minimax-m2.5-free per agent PR #234
|
|
116
119
|
opencode: 'grok-code-fast-1',
|
|
117
120
|
codex: 'gpt-5',
|
|
118
121
|
};
|
|
@@ -140,6 +143,8 @@ export const freeToBaseModelMap = {
|
|
|
140
143
|
'glm-4.7-free': 'glm-4.7',
|
|
141
144
|
'minimax-m2.1-free': 'minimax-m2.1',
|
|
142
145
|
'minimax-m2.5-free': 'minimax-m2.5',
|
|
146
|
+
'qwen3.6-plus-free': 'qwen3.6-plus', // Issue #1543
|
|
147
|
+
'nemotron-3-super-free': 'nemotron-3-super', // Issue #1543
|
|
143
148
|
'glm-5-free': 'glm-5',
|
|
144
149
|
'glm-4.5-air-free': 'glm-4.5-air',
|
|
145
150
|
'deepseek-r1-free': 'deepseek-r1',
|
|
@@ -187,6 +192,8 @@ export const AGENT_MODELS = {
|
|
|
187
192
|
'opencode/big-pickle': 'opencode/big-pickle',
|
|
188
193
|
'opencode/gpt-5-nano': 'opencode/gpt-5-nano',
|
|
189
194
|
'opencode/minimax-m2.5-free': 'opencode/minimax-m2.5-free',
|
|
195
|
+
'opencode/qwen3.6-plus-free': 'opencode/qwen3.6-plus-free', // Issue #1543
|
|
196
|
+
'opencode/nemotron-3-super-free': 'opencode/nemotron-3-super-free', // Issue #1543
|
|
190
197
|
'opencode/kimi-k2.5-free': 'opencode/kimi-k2.5-free', // Deprecated
|
|
191
198
|
'opencode/glm-4.7-free': 'opencode/glm-4.7-free', // Deprecated
|
|
192
199
|
'opencode/minimax-m2.1-free': 'opencode/minimax-m2.1-free', // Deprecated
|
|
@@ -297,7 +304,7 @@ export const primaryModelNames = {
|
|
|
297
304
|
claude: ['opus', 'sonnet', 'haiku', 'opusplan'],
|
|
298
305
|
opencode: ['grok', 'gpt4o'],
|
|
299
306
|
codex: ['gpt5', 'gpt5-codex', 'o3'],
|
|
300
|
-
agent: ['minimax-m2.5-free', 'big-pickle', 'gpt-5-nano', 'glm-5-free', 'deepseek-r1-free'],
|
|
307
|
+
agent: ['qwen3.6-plus-free', 'nemotron-3-super-free', 'minimax-m2.5-free', 'big-pickle', 'gpt-5-nano', 'glm-5-free', 'deepseek-r1-free'],
|
|
301
308
|
};
|
|
302
309
|
|
|
303
310
|
/**
|