free-coding-models 0.5.60 → 0.5.62

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.
@@ -0,0 +1,296 @@
1
+ /**
2
+ * @file models-drift.js
3
+ * @description Drift detection between `sources.js` (our curated catalog) and the live
4
+ * models.dev community catalog. Compares context window, max output tokens,
5
+ * and capability flags (reasoning / vision / thinking). Reports mismatches
6
+ * but never auto-rewrites sources.js — a human approves the edit.
7
+ *
8
+ * @details
9
+ * 📖 Why this exists:
10
+ * 📖 - sources.js is curated but `ctx` drifts constantly (128k → 256k → 1M).
11
+ * 📖 - We don't want to silently overwrite curated values; we want to surface
12
+ * 📖 the drift so a human can review it.
13
+ * 📖 - Used by:
14
+ * 📖 1. `scripts/check-drift.mjs` (CLI: `free-coding-models --check-drift`)
15
+ * 📖 2. `.github/workflows/check-drift.yml` (weekly CI — opens an issue)
16
+ * 📖 3. The TUI footer chip + /health endpoint (read-only)
17
+ *
18
+ * 📖 What "drift" means here:
19
+ * 📖 - ctx: sources.js says "128k", models.dev says 256000 → UPDATE
20
+ * 📖 - maxTokens: sources.js has no value, models.dev says 65536 → ADD
21
+ * 📖 - reasoning/vision flags: sources.js is null, models.dev has the flag → ADD
22
+ * 📖 - exact match: ✓ (no action)
23
+ *
24
+ * 📖 A "field mismatch" entry has:
25
+ * 📖 { modelId, field, sourcesJsValue, modelsDevValue, action: 'update'|'add'|'remove' }
26
+ *
27
+ * @functions
28
+ * → detectDrift(models, catalog, opts?) — Returns a list of field mismatches
29
+ * → summarizeDrift(mismatches) — { total, byField, byModel, modelsAffected }
30
+ * → formatDriftReport(mismatches, opts?) — Pretty-print a human-readable report
31
+ * → parseCtxToNum(ctx) — "128k" / "1m" → number
32
+ * → DRIFT_FIELDS — The list of fields we check
33
+ *
34
+ * @exports detectDrift, summarizeDrift, formatDriftReport, parseCtxToNum, DRIFT_FIELDS
35
+ *
36
+ * @see src/core/models-dev-fetcher.js — provides the live catalog
37
+ * @see src/core/models-dev-index.js — provides the lookup helpers
38
+ * @see scripts/check-drift.mjs — CLI consumer
39
+ */
40
+
41
+ import { buildModelIndex, lookupModelDevMeta, normalizeModelDevEntry } from './models-dev-index.js'
42
+
43
+ /** 📖 Fields we check for drift. Each has a sources.js column + a models.dev mapping. */
44
+ export const DRIFT_FIELDS = ['ctx', 'maxTokens', 'reasoning', 'vision', 'thinking']
45
+
46
+ /**
47
+ * 📖 Convert a sources.js ctx string ("128k", "1m", "262144") to a number.
48
+ * 📖 Mirrors parseCtxToK from utils.js but returns raw tokens (not thousands).
49
+ * 📖 Returns null if the string is empty, "-", or unparseable.
50
+ */
51
+ export function parseCtxToNum(ctx) {
52
+ if (ctx == null) return null
53
+ const s = String(ctx).trim()
54
+ if (!s || s === '-' || s === '—') return null
55
+ // Pure number
56
+ if (/^\d+$/.test(s)) return parseInt(s, 10)
57
+ // Suffix
58
+ const m = s.match(/^(\d+(?:\.\d+)?)\s*([km])$/i)
59
+ if (m) {
60
+ const n = parseFloat(m[1])
61
+ const unit = m[2].toLowerCase()
62
+ if (unit === 'k') return Math.round(n * 1000)
63
+ if (unit === 'm') return Math.round(n * 1_000_000)
64
+ }
65
+ return null
66
+ }
67
+
68
+ // ─── Comparison helpers ──────────────────────────────────────────────────────
69
+
70
+ function contextMatch(sourcesJsCtx, devContextWindow) {
71
+ const a = parseCtxToNum(sourcesJsCtx)
72
+ const b = (typeof devContextWindow === 'number' && Number.isFinite(devContextWindow)) ? devContextWindow : null
73
+ if (a == null && b == null) return { status: 'both-null' }
74
+ if (a == null && b != null) return { status: 'add', sourcesJs: null, dev: b }
75
+ if (a != null && b == null) return { status: 'dev-missing', sourcesJs: a, dev: null }
76
+ // 📖 Allow 5% tolerance for vendor-specific rounding
77
+ if (Math.abs(a - b) <= Math.max(a, b) * 0.05) return { status: 'match', sourcesJs: a, dev: b }
78
+ return { status: 'drift', sourcesJs: a, dev: b }
79
+ }
80
+
81
+ function flagMatch(sourcesJsFlag, devFlag) {
82
+ // 📖 sources.js stores capability flags as booleans (true/false) or null/undefined
83
+ const a = sourcesJsFlag === true
84
+ const b = devFlag === true
85
+ if (!a && !b) return { status: 'both-off' }
86
+ if (!a && b) return { status: 'add', sourcesJs: false, dev: true }
87
+ if (a && !b) return { status: 'drift', sourcesJs: true, dev: false }
88
+ return { status: 'match' }
89
+ }
90
+
91
+ function numMatch(sourcesJsNum, devNum) {
92
+ const a = (typeof sourcesJsNum === 'number' && Number.isFinite(sourcesJsNum)) ? sourcesJsNum : null
93
+ const b = (typeof devNum === 'number' && Number.isFinite(devNum)) ? devNum : null
94
+ if (a == null && b == null) return { status: 'both-null' }
95
+ if (a == null && b != null) return { status: 'add', sourcesJs: null, dev: b }
96
+ if (a != null && b == null) return { status: 'dev-missing', sourcesJs: a, dev: null }
97
+ if (a === b) return { status: 'match', sourcesJs: a, dev: b }
98
+ return { status: 'drift', sourcesJs: a, dev: b }
99
+ }
100
+
101
+ // ─── Main detection ──────────────────────────────────────────────────────────
102
+
103
+ /**
104
+ * 📖 Run drift detection over the sources.js model list against the live catalog.
105
+ * 📖 Returns a list of per-field mismatches. Use `summarizeDrift` + `formatDriftReport`
106
+ * 📖 to render the result.
107
+ *
108
+ * 📖 Each model in `models` should be a sources.js tuple:
109
+ * 📖 [modelId, label, tier, sweScore, ctx, providerKey, ...]
110
+ * 📖 or an object with the same fields.
111
+ *
112
+ * @param {Array} models — sources.js MODELS array
113
+ * @param {object} catalog — parsed models.dev catalog (or null = no drift)
114
+ * @param {object} [opts]
115
+ * @param {object} [opts.index] — Pre-built index (skips the build)
116
+ * @param {number} [opts.threshold=0] — Min mismatches to report; 0 = all
117
+ * @returns {Array<{
118
+ * modelId: string, label: string, field: string,
119
+ * sourcesJsValue: any, modelsDevValue: any,
120
+ * action: 'update'|'add'|'drift', matchKind: 'exact'|'alias'|'substring'|'none'
121
+ * }>}
122
+ */
123
+ export function detectDrift(models, catalog, opts = {}) {
124
+ if (!Array.isArray(models) || models.length === 0) return []
125
+ if (!catalog || typeof catalog !== 'object') return []
126
+
127
+ const index = opts.index ?? buildModelIndex(catalog)
128
+ const threshold = opts.threshold ?? 0
129
+ const out = []
130
+
131
+ for (const entry of models) {
132
+ // 📖 Accept both tuple form and object form
133
+ let modelId, label, ctx, reasoning, vision, thinking, maxTokens
134
+ if (Array.isArray(entry)) {
135
+ [modelId, label, , , ctx] = entry
136
+ // 📖 The 6th+ elements of the sources.js tuple are providerKey + metadata;
137
+ // 📖 for drift we only need the first 5.
138
+ } else if (entry && typeof entry === 'object') {
139
+ ({ modelId, label, ctx, reasoning, vision, thinking, maxTokens } = entry)
140
+ } else {
141
+ continue
142
+ }
143
+ if (!modelId) continue
144
+
145
+ const match = lookupModelDevMeta(modelId, label, index)
146
+ if (!match) continue
147
+ const norm = match.entry
148
+ const matchKind = match.matchKind
149
+
150
+ // 📖 Skip substring matches for ctx/metadata to avoid false positives.
151
+ // 📖 Only exact + alias matches contribute to drift.
152
+ if (matchKind === 'substring') continue
153
+
154
+ // ctx
155
+ const ctxCmp = contextMatch(ctx, norm.contextWindow)
156
+ if (ctxCmp.status === 'drift' || ctxCmp.status === 'add') {
157
+ out.push({
158
+ modelId, label, field: 'ctx',
159
+ sourcesJsValue: ctxCmp.sourcesJs,
160
+ modelsDevValue: ctxCmp.dev,
161
+ action: ctxCmp.status === 'add' ? 'add' : 'update',
162
+ matchKind,
163
+ })
164
+ }
165
+ // maxTokens
166
+ const maxCmp = numMatch(maxTokens, norm.maxOutputTokens)
167
+ if (maxCmp.status === 'drift' || maxCmp.status === 'add') {
168
+ out.push({
169
+ modelId, label, field: 'maxTokens',
170
+ sourcesJsValue: maxCmp.sourcesJs,
171
+ modelsDevValue: maxCmp.dev,
172
+ action: maxCmp.status === 'add' ? 'add' : 'update',
173
+ matchKind,
174
+ })
175
+ }
176
+ // reasoning
177
+ const rCmp = flagMatch(reasoning, norm.reasoning)
178
+ if (rCmp.status === 'drift' || rCmp.status === 'add') {
179
+ out.push({
180
+ modelId, label, field: 'reasoning',
181
+ sourcesJsValue: rCmp.sourcesJs,
182
+ modelsDevValue: rCmp.dev,
183
+ action: rCmp.status === 'add' ? 'add' : 'update',
184
+ matchKind,
185
+ })
186
+ }
187
+ // vision
188
+ const vCmp = flagMatch(vision, norm.vision)
189
+ if (vCmp.status === 'drift' || vCmp.status === 'add') {
190
+ out.push({
191
+ modelId, label, field: 'vision',
192
+ sourcesJsValue: vCmp.sourcesJs,
193
+ modelsDevValue: vCmp.dev,
194
+ action: vCmp.status === 'add' ? 'add' : 'update',
195
+ matchKind,
196
+ })
197
+ }
198
+ // thinking
199
+ const tCmp = flagMatch(thinking, norm.thinking)
200
+ if (tCmp.status === 'drift' || tCmp.status === 'add') {
201
+ out.push({
202
+ modelId, label, field: 'thinking',
203
+ sourcesJsValue: tCmp.sourcesJs,
204
+ modelsDevValue: tCmp.dev,
205
+ action: tCmp.status === 'add' ? 'add' : 'update',
206
+ matchKind,
207
+ })
208
+ }
209
+ }
210
+
211
+ if (threshold > 0 && out.length < threshold) {
212
+ return []
213
+ }
214
+ return out
215
+ }
216
+
217
+ // ─── Summary + report ────────────────────────────────────────────────────────
218
+
219
+ /**
220
+ * 📖 Aggregate stats over a drift result list. Used by the TUI footer chip and
221
+ * 📖 the /health endpoint.
222
+ *
223
+ * @param {Array} mismatches — Output of detectDrift
224
+ * @returns {{
225
+ * total: number,
226
+ * byField: Record<string, number>,
227
+ * byAction: Record<string, number>,
228
+ * modelsAffected: string[]
229
+ * }}
230
+ */
231
+ export function summarizeDrift(mismatches) {
232
+ const byField = Object.fromEntries(DRIFT_FIELDS.map(f => [f, 0]))
233
+ const byAction = { update: 0, add: 0, drift: 0 }
234
+ const modelsSet = new Set()
235
+ for (const m of mismatches || []) {
236
+ byField[m.field] = (byField[m.field] ?? 0) + 1
237
+ byAction[m.action] = (byAction[m.action] ?? 0) + 1
238
+ modelsSet.add(m.modelId)
239
+ }
240
+ return {
241
+ total: (mismatches || []).length,
242
+ byField,
243
+ byAction,
244
+ modelsAffected: Array.from(modelsSet).sort(),
245
+ }
246
+ }
247
+
248
+ /**
249
+ * 📖 Format a drift report for human reading. Used by the CLI script and the
250
+ * 📖 GitHub Actions workflow (which posts the report to an issue).
251
+ *
252
+ * @param {Array} mismatches — Output of detectDrift
253
+ * @param {object} [opts]
254
+ * @param {boolean} [opts.useColor=true] — ANSI-color the output
255
+ * @returns {string} Multi-line report
256
+ */
257
+ export function formatDriftReport(mismatches, opts = {}) {
258
+ const useColor = opts.useColor !== false && process.stdout?.isTTY === true
259
+ const RED = useColor ? '\x1b[31m' : ''
260
+ const YEL = useColor ? '\x1b[33m' : ''
261
+ const GRN = useColor ? '\x1b[32m' : ''
262
+ const DIM = useColor ? '\x1b[2m' : ''
263
+ const RST = useColor ? '\x1b[0m' : ''
264
+
265
+ const summary = summarizeDrift(mismatches)
266
+ if (summary.total === 0) {
267
+ return `${GRN}✓ No catalog drift detected${RST} ${DIM}(all models match models.dev)${RST}`
268
+ }
269
+ const lines = []
270
+ lines.push(`${YEL}⚠️ Catalog drift detected (${summary.total} mismatches across ${summary.modelsAffected.length} models)${RST}`)
271
+ lines.push('')
272
+
273
+ // 📖 Group by model for readability
274
+ const byModel = new Map()
275
+ for (const m of mismatches) {
276
+ const list = byModel.get(m.modelId) ?? []
277
+ list.push(m)
278
+ byModel.set(m.modelId, list)
279
+ }
280
+ for (const [modelId, list] of byModel) {
281
+ const label = list[0].label || modelId
282
+ lines.push(` ${label} ${DIM}(${modelId})${RST}`)
283
+ for (const m of list) {
284
+ const arrow = m.action === 'add' ? '← ADD' : '← UPDATE'
285
+ const color = m.action === 'add' ? GRN : RED
286
+ const sj = m.sourcesJsValue === null || m.sourcesJsValue === undefined ? '—' : String(m.sourcesJsValue)
287
+ const dv = m.modelsDevValue === null || m.modelsDevValue === undefined ? '—' : String(m.modelsDevValue)
288
+ lines.push(` ${DIM}${m.field.padEnd(11)}${RST} sources.js=${sj} models.dev=${dv} ${color}${arrow}${RST}`)
289
+ }
290
+ lines.push('')
291
+ }
292
+ return lines.join('\n')
293
+ }
294
+
295
+ // Re-export normalizeModelDevEntry for convenience (drift callers often need it)
296
+ export { normalizeModelDevEntry }
package/src/core/utils.js CHANGED
@@ -606,6 +606,18 @@ export function parseArgs(argv) {
606
606
  const probeTtlRaw = probeTtlValueIdx !== -1 ? args[probeTtlValueIdx] : null
607
607
  const probeTtlMs = probeTtlRaw !== null ? parseInt(probeTtlRaw, 10) : null
608
608
 
609
+ // 📖 Drift detection flags (t5):
610
+ // 📖 --check-drift (boolean) — print a drift report vs models.dev, exit non-zero on mismatch.
611
+ // 📖 --drift-threshold <N> (value) — only fail when N+ mismatches are found.
612
+ const checkDriftMode = flags.includes('--check-drift')
613
+ const driftThresholdIdx = args.findIndex(a => a.toLowerCase() === '--drift-threshold')
614
+ const driftThresholdValueIdx = (driftThresholdIdx !== -1 && args[driftThresholdIdx + 1] && !args[driftThresholdIdx + 1].startsWith('--'))
615
+ ? driftThresholdIdx + 1
616
+ : -1
617
+ if (driftThresholdValueIdx !== -1) skipIndices.add(driftThresholdValueIdx)
618
+ const driftThresholdRaw = driftThresholdValueIdx !== -1 ? args[driftThresholdValueIdx] : null
619
+ const driftThreshold = driftThresholdRaw !== null ? parseInt(driftThresholdRaw, 10) : null
620
+
609
621
  return {
610
622
  apiKey,
611
623
  bestMode,
@@ -647,6 +659,8 @@ export function parseArgs(argv) {
647
659
  daemonMode,
648
660
  daemonBackgroundMode,
649
661
  daemonStopMode,
662
+ checkDriftMode,
663
+ driftThreshold,
650
664
  daemonStatusMode,
651
665
  // 📖 Profile system removed - API keys now persist permanently across all sessions
652
666
  recommendMode,
@@ -0,0 +1,302 @@
1
+ {
2
+ "_meta": {
3
+ "schemaVersion": 1,
4
+ "lastUpdated": "2026-07-25",
5
+ "source": "Artificial Analysis + curated manual overlay",
6
+ "notes": "Curated seed dataset for ~30 well-known models. Refreshed by scripts/update-benchmarks.mjs before each release. Fields with null are not yet measured."
7
+ },
8
+ "deepseek-ai/deepseek-v3.2": {
9
+ "codingIndex": 65.4, "mathIndex": 70.2, "agenticIndex": 58.0, "reasoningIndex": 68.5,
10
+ "mmluPro": 75.3, "gpqa": 52.0, "hle": 8.4, "contextWindow": 160000,
11
+ "supportsReasoning": true, "supportsVision": false,
12
+ "lastUpdated": "2026-07-20", "originalModel": "DeepSeek V3.2"
13
+ },
14
+ "deepseek-ai/deepseek-v4-pro": {
15
+ "codingIndex": 81.2, "mathIndex": 84.5, "agenticIndex": 74.8, "reasoningIndex": 80.1,
16
+ "mmluPro": 86.4, "gpqa": 65.7, "hle": 14.2, "contextWindow": 1000000,
17
+ "supportsReasoning": true, "supportsVision": false,
18
+ "lastUpdated": "2026-07-20", "originalModel": "DeepSeek V4 Pro"
19
+ },
20
+ "deepseek-ai/deepseek-v4-flash": {
21
+ "codingIndex": 78.9, "mathIndex": 80.1, "agenticIndex": 71.5, "reasoningIndex": 77.0,
22
+ "mmluPro": 83.2, "gpqa": 60.4, "hle": 12.8, "contextWindow": 1000000,
23
+ "supportsReasoning": true, "supportsVision": false,
24
+ "lastUpdated": "2026-07-20", "originalModel": "DeepSeek V4 Flash"
25
+ },
26
+ "deepseek-ai/deepseek-r1": {
27
+ "codingIndex": 52.0, "mathIndex": 90.4, "agenticIndex": 48.5, "reasoningIndex": 78.6,
28
+ "mmluPro": 84.0, "gpqa": 71.5, "hle": 9.9, "contextWindow": 128000,
29
+ "supportsReasoning": true, "supportsVision": false,
30
+ "lastUpdated": "2026-07-20", "originalModel": "DeepSeek R1"
31
+ },
32
+ "deepseek/deepseek-r1": {
33
+ "codingIndex": 52.0, "mathIndex": 90.4, "agenticIndex": 48.5, "reasoningIndex": 78.6,
34
+ "mmluPro": 84.0, "gpqa": 71.5, "hle": 9.9, "contextWindow": 128000,
35
+ "supportsReasoning": true, "supportsVision": false,
36
+ "lastUpdated": "2026-07-20", "originalModel": "DeepSeek R1"
37
+ },
38
+ "DeepSeek-V3.1": {
39
+ "codingIndex": 68.0, "mathIndex": 73.0, "agenticIndex": 60.5, "reasoningIndex": 70.0,
40
+ "mmluPro": 76.5, "gpqa": 53.2, "hle": 9.1, "contextWindow": 128000,
41
+ "supportsReasoning": true, "supportsVision": false,
42
+ "lastUpdated": "2026-07-20", "originalModel": "DeepSeek V3.1"
43
+ },
44
+ "DeepSeek-V3.2": {
45
+ "codingIndex": 70.5, "mathIndex": 75.0, "agenticIndex": 62.0, "reasoningIndex": 72.0,
46
+ "mmluPro": 78.0, "gpqa": 54.5, "hle": 9.5, "contextWindow": 32000,
47
+ "supportsReasoning": true, "supportsVision": false,
48
+ "lastUpdated": "2026-07-20", "originalModel": "DeepSeek V3.2"
49
+ },
50
+ "deepseek/deepseek-chat": {
51
+ "codingIndex": 65.0, "mathIndex": 70.0, "agenticIndex": 58.0, "reasoningIndex": 68.0,
52
+ "mmluPro": 75.0, "gpqa": 52.0, "hle": 8.4, "contextWindow": 128000,
53
+ "supportsReasoning": false, "supportsVision": false,
54
+ "lastUpdated": "2026-07-20", "originalModel": "DeepSeek Chat"
55
+ },
56
+ "z-ai/glm-5.2": {
57
+ "codingIndex": 82.4, "mathIndex": 79.0, "agenticIndex": 76.1, "reasoningIndex": 78.9,
58
+ "mmluPro": 84.2, "gpqa": 61.8, "hle": 13.5, "contextWindow": 128000,
59
+ "supportsReasoning": true, "supportsVision": false,
60
+ "lastUpdated": "2026-07-20", "originalModel": "GLM 5.2"
61
+ },
62
+ "zai-glm-4.7": {
63
+ "codingIndex": 75.0, "mathIndex": 73.5, "agenticIndex": 68.4, "reasoningIndex": 72.0,
64
+ "mmluPro": 78.5, "gpqa": 55.2, "hle": 10.8, "contextWindow": 128000,
65
+ "supportsReasoning": true, "supportsVision": false,
66
+ "lastUpdated": "2026-07-20", "originalModel": "GLM 4.7"
67
+ },
68
+ "@cf/zai-org/glm-4.7-flash": {
69
+ "codingIndex": 70.0, "mathIndex": 69.0, "agenticIndex": 62.0, "reasoningIndex": 66.0,
70
+ "mmluPro": 73.0, "gpqa": 50.0, "hle": 9.0, "contextWindow": 128000,
71
+ "supportsReasoning": false, "supportsVision": false,
72
+ "lastUpdated": "2026-07-20", "originalModel": "GLM 4.7 Flash"
73
+ },
74
+ "moonshotai/kimi-k2.6": {
75
+ "codingIndex": 79.5, "mathIndex": 77.0, "agenticIndex": 73.2, "reasoningIndex": 76.4,
76
+ "mmluPro": 82.0, "gpqa": 59.0, "hle": 12.4, "contextWindow": 262000,
77
+ "supportsReasoning": true, "supportsVision": false,
78
+ "lastUpdated": "2026-07-20", "originalModel": "Kimi K2.6"
79
+ },
80
+ "@cf/moonshotai/kimi-k2.6": {
81
+ "codingIndex": 79.5, "mathIndex": 77.0, "agenticIndex": 73.2, "reasoningIndex": 76.4,
82
+ "mmluPro": 82.0, "gpqa": 59.0, "hle": 12.4, "contextWindow": 262000,
83
+ "supportsReasoning": true, "supportsVision": false,
84
+ "lastUpdated": "2026-07-20", "originalModel": "Kimi K2.6"
85
+ },
86
+ "@cf/moonshotai/kimi-k2.7-code": {
87
+ "codingIndex": 81.0, "mathIndex": 76.5, "agenticIndex": 74.0, "reasoningIndex": 75.5,
88
+ "mmluPro": 81.5, "gpqa": 58.0, "hle": 12.0, "contextWindow": 262000,
89
+ "supportsReasoning": false, "supportsVision": false,
90
+ "lastUpdated": "2026-07-20", "originalModel": "Kimi K2.7 Code"
91
+ },
92
+ "minimaxai/minimax-m2.7": {
93
+ "codingIndex": 77.5, "mathIndex": 75.0, "agenticIndex": 70.0, "reasoningIndex": 74.5,
94
+ "mmluPro": 80.5, "gpqa": 56.0, "hle": 11.5, "contextWindow": 200000,
95
+ "supportsReasoning": true, "supportsVision": false,
96
+ "lastUpdated": "2026-07-20", "originalModel": "MiniMax M2.7"
97
+ },
98
+ "minimaxai/minimax-m3": {
99
+ "codingIndex": 78.0, "mathIndex": 76.0, "agenticIndex": 71.0, "reasoningIndex": 75.0,
100
+ "mmluPro": 81.0, "gpqa": 57.0, "hle": 12.0, "contextWindow": 1000000,
101
+ "supportsReasoning": true, "supportsVision": true,
102
+ "lastUpdated": "2026-07-20", "originalModel": "MiniMax M3"
103
+ },
104
+ "MiniMax-M2.7": {
105
+ "codingIndex": 77.5, "mathIndex": 75.0, "agenticIndex": 70.0, "reasoningIndex": 74.5,
106
+ "mmluPro": 80.5, "gpqa": 56.0, "hle": 11.5, "contextWindow": 192000,
107
+ "supportsReasoning": true, "supportsVision": false,
108
+ "lastUpdated": "2026-07-20", "originalModel": "MiniMax M2.7"
109
+ },
110
+ "stepfun-ai/step-3.7-flash": {
111
+ "codingIndex": 73.5, "mathIndex": 74.0, "agenticIndex": 68.0, "reasoningIndex": 72.0,
112
+ "mmluPro": 78.0, "gpqa": 53.0, "hle": 10.5, "contextWindow": 256000,
113
+ "supportsReasoning": true, "supportsVision": false,
114
+ "lastUpdated": "2026-07-20", "originalModel": "Step 3.7 Flash"
115
+ },
116
+ "openai/gpt-oss-120b": {
117
+ "codingIndex": 62.0, "mathIndex": 64.0, "agenticIndex": 58.0, "reasoningIndex": 63.0,
118
+ "mmluPro": 70.0, "gpqa": 52.0, "hle": 9.0, "contextWindow": 128000,
119
+ "supportsReasoning": true, "supportsVision": false,
120
+ "lastUpdated": "2026-07-20", "originalModel": "GPT OSS 120B"
121
+ },
122
+ "gpt-oss-120b": {
123
+ "codingIndex": 62.0, "mathIndex": 64.0, "agenticIndex": 58.0, "reasoningIndex": 63.0,
124
+ "mmluPro": 70.0, "gpqa": 52.0, "hle": 9.0, "contextWindow": 128000,
125
+ "supportsReasoning": true, "supportsVision": false,
126
+ "lastUpdated": "2026-07-20", "originalModel": "GPT OSS 120B"
127
+ },
128
+ "openai/gpt-oss-20b": {
129
+ "codingIndex": 50.0, "mathIndex": 52.0, "agenticIndex": 46.0, "reasoningIndex": 51.0,
130
+ "mmluPro": 58.0, "gpqa": 42.0, "hle": 6.5, "contextWindow": 128000,
131
+ "supportsReasoning": true, "supportsVision": false,
132
+ "lastUpdated": "2026-07-20", "originalModel": "GPT OSS 20B"
133
+ },
134
+ "gpt-oss-20b": {
135
+ "codingIndex": 50.0, "mathIndex": 52.0, "agenticIndex": 46.0, "reasoningIndex": 51.0,
136
+ "mmluPro": 58.0, "gpqa": 42.0, "hle": 6.5, "contextWindow": 128000,
137
+ "supportsReasoning": true, "supportsVision": false,
138
+ "lastUpdated": "2026-07-20", "originalModel": "GPT OSS 20B"
139
+ },
140
+ "meta/llama-4-maverick-17b-128e-instruct": {
141
+ "codingIndex": 73.5, "mathIndex": 70.0, "agenticIndex": 65.0, "reasoningIndex": 71.0,
142
+ "mmluPro": 78.0, "gpqa": 53.0, "hle": 10.0, "contextWindow": 1000000,
143
+ "supportsReasoning": false, "supportsVision": true,
144
+ "lastUpdated": "2026-07-20", "originalModel": "Llama 4 Maverick"
145
+ },
146
+ "meta-llama/llama-4-scout-17b-16e-instruct": {
147
+ "codingIndex": 28.0, "mathIndex": 25.0, "agenticIndex": 22.0, "reasoningIndex": 26.0,
148
+ "mmluPro": 30.0, "gpqa": 18.0, "hle": 2.0, "contextWindow": 10000000,
149
+ "supportsReasoning": false, "supportsVision": true,
150
+ "lastUpdated": "2026-07-20", "originalModel": "Llama 4 Scout"
151
+ },
152
+ "@cf/meta/llama-4-scout-17b-16e-instruct": {
153
+ "codingIndex": 28.0, "mathIndex": 25.0, "agenticIndex": 22.0, "reasoningIndex": 26.0,
154
+ "mmluPro": 30.0, "gpqa": 18.0, "hle": 2.0, "contextWindow": 10000000,
155
+ "supportsReasoning": false, "supportsVision": true,
156
+ "lastUpdated": "2026-07-20", "originalModel": "Llama 4 Scout"
157
+ },
158
+ "meta/llama-3.3-70b-versatile": {
159
+ "codingIndex": 22.0, "mathIndex": 24.0, "agenticIndex": 18.0, "reasoningIndex": 23.0,
160
+ "mmluPro": 28.0, "gpqa": 16.0, "hle": 1.5, "contextWindow": 131072,
161
+ "supportsReasoning": false, "supportsVision": false,
162
+ "lastUpdated": "2026-07-20", "originalModel": "Llama 3.3 70B Versatile"
163
+ },
164
+ "llama-3.3-70b-versatile": {
165
+ "codingIndex": 22.0, "mathIndex": 24.0, "agenticIndex": 18.0, "reasoningIndex": 23.0,
166
+ "mmluPro": 28.0, "gpqa": 16.0, "hle": 1.5, "contextWindow": 131072,
167
+ "supportsReasoning": false, "supportsVision": false,
168
+ "lastUpdated": "2026-07-20", "originalModel": "Llama 3.3 70B Versatile"
169
+ },
170
+ "Meta-Llama-3.3-70B-Instruct": {
171
+ "codingIndex": 22.0, "mathIndex": 24.0, "agenticIndex": 18.0, "reasoningIndex": 23.0,
172
+ "mmluPro": 28.0, "gpqa": 16.0, "hle": 1.5, "contextWindow": 128000,
173
+ "supportsReasoning": false, "supportsVision": false,
174
+ "lastUpdated": "2026-07-20", "originalModel": "Llama 3.3 70B Instruct"
175
+ },
176
+ "llama-3.1-8b-instant": {
177
+ "codingIndex": 18.0, "mathIndex": 19.0, "agenticIndex": 14.0, "reasoningIndex": 17.0,
178
+ "mmluPro": 22.0, "gpqa": 12.0, "hle": 1.0, "contextWindow": 131072,
179
+ "supportsReasoning": false, "supportsVision": false,
180
+ "lastUpdated": "2026-07-20", "originalModel": "Llama 3.1 8B Instant"
181
+ },
182
+ "qwen/qwen3.6-27b": {
183
+ "codingIndex": 76.5, "mathIndex": 74.0, "agenticIndex": 70.0, "reasoningIndex": 73.0,
184
+ "mmluPro": 79.0, "gpqa": 55.0, "hle": 11.0, "contextWindow": 131072,
185
+ "supportsReasoning": true, "supportsVision": false,
186
+ "lastUpdated": "2026-07-20", "originalModel": "Qwen3.6 27B"
187
+ },
188
+ "qwen/qwen2.5-coder-32b-instruct": {
189
+ "codingIndex": 48.0, "mathIndex": 45.0, "agenticIndex": 42.0, "reasoningIndex": 44.0,
190
+ "mmluPro": 52.0, "gpqa": 32.0, "hle": 4.0, "contextWindow": 128000,
191
+ "supportsReasoning": false, "supportsVision": false,
192
+ "lastUpdated": "2026-07-20", "originalModel": "Qwen2.5 Coder 32B"
193
+ },
194
+ "qwen/qwen3-30b-a3b-fp8": {
195
+ "codingIndex": 65.0, "mathIndex": 64.0, "agenticIndex": 58.0, "reasoningIndex": 63.0,
196
+ "mmluPro": 70.0, "gpqa": 48.0, "hle": 8.0, "contextWindow": 131072,
197
+ "supportsReasoning": true, "supportsVision": false,
198
+ "lastUpdated": "2026-07-20", "originalModel": "Qwen3 30B A3B"
199
+ },
200
+ "mistralai/mistral-medium-3.5-128b": {
201
+ "codingIndex": 76.5, "mathIndex": 74.0, "agenticIndex": 70.5, "reasoningIndex": 73.0,
202
+ "mmluPro": 79.0, "gpqa": 56.0, "hle": 11.2, "contextWindow": 256000,
203
+ "supportsReasoning": false, "supportsVision": false,
204
+ "lastUpdated": "2026-07-20", "originalModel": "Mistral Medium 3.5"
205
+ },
206
+ "mistralai/mistral-small-4-119b-2603": {
207
+ "codingIndex": 60.0, "mathIndex": 58.0, "agenticIndex": 55.0, "reasoningIndex": 57.0,
208
+ "mmluPro": 65.0, "gpqa": 44.0, "hle": 7.0, "contextWindow": 256000,
209
+ "supportsReasoning": false, "supportsVision": false,
210
+ "lastUpdated": "2026-07-20", "originalModel": "Mistral Small 4"
211
+ },
212
+ "mistralai/mistral-large-3-675b-instruct-2512": {
213
+ "codingIndex": 58.0, "mathIndex": 56.0, "agenticIndex": 52.0, "reasoningIndex": 55.0,
214
+ "mmluPro": 63.0, "gpqa": 42.0, "hle": 6.5, "contextWindow": 256000,
215
+ "supportsReasoning": false, "supportsVision": false,
216
+ "lastUpdated": "2026-07-20", "originalModel": "Mistral Large 675B"
217
+ },
218
+ "mistralai/ministral-14b-instruct-2512": {
219
+ "codingIndex": 34.0, "mathIndex": 32.0, "agenticIndex": 28.0, "reasoningIndex": 31.0,
220
+ "mmluPro": 38.0, "gpqa": 22.0, "hle": 3.0, "contextWindow": 32000,
221
+ "supportsReasoning": false, "supportsVision": false,
222
+ "lastUpdated": "2026-07-20", "originalModel": "Ministral 14B"
223
+ },
224
+ "google/gemma-4-31b-it": {
225
+ "codingIndex": 52.0, "mathIndex": 50.0, "agenticIndex": 46.0, "reasoningIndex": 49.0,
226
+ "mmluPro": 58.0, "gpqa": 38.0, "hle": 5.5, "contextWindow": 256000,
227
+ "supportsReasoning": false, "supportsVision": false,
228
+ "lastUpdated": "2026-07-20", "originalModel": "Gemma 4 31B"
229
+ },
230
+ "gemma-4-31b": {
231
+ "codingIndex": 52.0, "mathIndex": 50.0, "agenticIndex": 46.0, "reasoningIndex": 49.0,
232
+ "mmluPro": 58.0, "gpqa": 38.0, "hle": 5.5, "contextWindow": 128000,
233
+ "supportsReasoning": false, "supportsVision": false,
234
+ "lastUpdated": "2026-07-20", "originalModel": "Gemma 4 31B"
235
+ },
236
+ "@cf/google/gemma-4-26b-a4b-it": {
237
+ "codingIndex": 48.0, "mathIndex": 46.0, "agenticIndex": 42.0, "reasoningIndex": 45.0,
238
+ "mmluPro": 54.0, "gpqa": 35.0, "hle": 5.0, "contextWindow": 128000,
239
+ "supportsReasoning": false, "supportsVision": false,
240
+ "lastUpdated": "2026-07-20", "originalModel": "Gemma 4 26B"
241
+ },
242
+ "nvidia/nemotron-3-ultra-550b-a55b": {
243
+ "codingIndex": 71.0, "mathIndex": 70.0, "agenticIndex": 65.0, "reasoningIndex": 69.0,
244
+ "mmluPro": 75.0, "gpqa": 52.0, "hle": 9.5, "contextWindow": 1000000,
245
+ "supportsReasoning": true, "supportsVision": false,
246
+ "lastUpdated": "2026-07-20", "originalModel": "Nemotron 3 Ultra"
247
+ },
248
+ "nvidia/nemotron-3-super-120b-a12b": {
249
+ "codingIndex": 60.0, "mathIndex": 59.0, "agenticIndex": 54.0, "reasoningIndex": 58.0,
250
+ "mmluPro": 65.0, "gpqa": 44.0, "hle": 7.0, "contextWindow": 128000,
251
+ "supportsReasoning": true, "supportsVision": false,
252
+ "lastUpdated": "2026-07-20", "originalModel": "Nemotron 3 Super"
253
+ },
254
+ "nvidia/nemotron-3-nano-30b-a3b": {
255
+ "codingIndex": 38.0, "mathIndex": 36.0, "agenticIndex": 32.0, "reasoningIndex": 35.0,
256
+ "mmluPro": 42.0, "gpqa": 26.0, "hle": 3.5, "contextWindow": 1000000,
257
+ "supportsReasoning": false, "supportsVision": false,
258
+ "lastUpdated": "2026-07-20", "originalModel": "Nemotron 3 Nano"
259
+ },
260
+ "bytedance/seed-oss-36b-instruct": {
261
+ "codingIndex": 56.0, "mathIndex": 54.0, "agenticIndex": 50.0, "reasoningIndex": 53.0,
262
+ "mmluPro": 60.0, "gpqa": 40.0, "hle": 6.0, "contextWindow": 32000,
263
+ "supportsReasoning": false, "supportsVision": false,
264
+ "lastUpdated": "2026-07-20", "originalModel": "Seed OSS 36B"
265
+ },
266
+ "stockmark/stockmark-2-100b-instruct": {
267
+ "codingIndex": 36.0, "mathIndex": 34.0, "agenticIndex": 30.0, "reasoningIndex": 33.0,
268
+ "mmluPro": 40.0, "gpqa": 24.0, "hle": 3.0, "contextWindow": 32000,
269
+ "supportsReasoning": false, "supportsVision": false,
270
+ "lastUpdated": "2026-07-20", "originalModel": "Stockmark 100B"
271
+ },
272
+ "codestral-latest": {
273
+ "codingIndex": 42.0, "mathIndex": 40.0, "agenticIndex": 38.0, "reasoningIndex": 39.0,
274
+ "mmluPro": 48.0, "gpqa": 30.0, "hle": 4.0, "contextWindow": 32000,
275
+ "supportsReasoning": false, "supportsVision": false,
276
+ "lastUpdated": "2026-07-20", "originalModel": "Codestral Latest"
277
+ },
278
+ "qwen/qwq-32b": {
279
+ "codingIndex": 58.0, "mathIndex": 82.0, "agenticIndex": 50.0, "reasoningIndex": 76.0,
280
+ "mmluPro": 75.0, "gpqa": 64.0, "hle": 11.0, "contextWindow": 131072,
281
+ "supportsReasoning": true, "supportsVision": false,
282
+ "lastUpdated": "2026-07-20", "originalModel": "QwQ 32B"
283
+ },
284
+ "poolside/laguna-m.1:free": {
285
+ "codingIndex": 72.0, "mathIndex": 68.0, "agenticIndex": 65.0, "reasoningIndex": 69.0,
286
+ "mmluPro": 74.0, "gpqa": 50.0, "hle": 9.5, "contextWindow": 262000,
287
+ "supportsReasoning": false, "supportsVision": false,
288
+ "lastUpdated": "2026-07-20", "originalModel": "Poolside Laguna M.1"
289
+ },
290
+ "poolside/laguna-xs.2:free": {
291
+ "codingIndex": 68.0, "mathIndex": 65.0, "agenticIndex": 62.0, "reasoningIndex": 65.0,
292
+ "mmluPro": 70.0, "gpqa": 47.0, "hle": 8.5, "contextWindow": 262000,
293
+ "supportsReasoning": false, "supportsVision": false,
294
+ "lastUpdated": "2026-07-20", "originalModel": "Poolside Laguna XS.2"
295
+ },
296
+ "@cf/qwen/qwen3-30b-a3b-fp8": {
297
+ "codingIndex": 65.0, "mathIndex": 64.0, "agenticIndex": 58.0, "reasoningIndex": 63.0,
298
+ "mmluPro": 70.0, "gpqa": 48.0, "hle": 8.0, "contextWindow": 131072,
299
+ "supportsReasoning": true, "supportsVision": false,
300
+ "lastUpdated": "2026-07-20", "originalModel": "Qwen3 30B A3B"
301
+ }
302
+ }