diff --git a/AGENTS.md b/AGENTS.md index d2eaaa676..b079ec01c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -225,6 +225,7 @@ Authoritative total / active parameter counts for every model in the dashboard. | Kimi-K2.6 | 1T | 32B | `moonshotai/Kimi-K2.6` | HF model card | | Kimi-K2.7-Code | 1T | 32B | `moonshotai/Kimi-K2.7-Code` | HF model card | | Qwen3.5-397B-A17B | 397B | 17B | `Qwen/Qwen3.5-397B-A17B` | HF model card | +| Qwen3.8-Flash-Next | 176B | 6B | `Qwen/Qwen3.8-Flash-Next-FP8` | HF model card | | GLM-5 | 744B | 40B | `zai-org/GLM-5` | HF model card | | GLM-5.1 | 744B | 40B | `zai-org/GLM-5.1-FP8` | HF model card (same base as GLM-5) | | MiniMax-M2.5 | 230B | 10B | `MiniMaxAI/MiniMax-M2.5` | HF model card | @@ -234,6 +235,7 @@ Authoritative total / active parameter counts for every model in the dashboard. **Common mislabel traps** (have all bitten this repo at least once — do not repeat): +- **Qwen3.8-Flash-Next is 176B, not 125B.** The model card leads with "125B with 6B activated", but that is the main model only; the 51B n-gram embedding table brings the total to 176B. The separate 4B MTP head sits outside both figures. It is a Qwen4-architecture preview (GatedDeltaNet + Qwen Sparse Attention, 512 experts, 10 routed + 1 shared), not a Qwen3.5 point release, so it gets its own DB bucket. - **GLM-5 ≠ 355B.** 355B is GLM-4.5. GLM-5 jumped to 744B / 40B active (256-expert MoE with DSA). - **MiniMax-M2.5/M2.7 ≠ 456B.** 456B is the older MiniMax-Text-01 / M1 (32 large experts). The M2 series is a different architecture: 230B / 10B active, 256 small experts. - **DeepSeek-R1 is 671B, not 685B.** HF metadata shows 685B because the bundled MTP head adds ~14B; the core MoE is 671B / 37B active. diff --git a/packages/app/src/lib/api-route-catalog.ts b/packages/app/src/lib/api-route-catalog.ts index 8ba30b9c5..7352e6de1 100644 --- a/packages/app/src/lib/api-route-catalog.ts +++ b/packages/app/src/lib/api-route-catalog.ts @@ -687,7 +687,7 @@ export const apiContractSourceDigests = [ // Reviewed again for the release-date corrections: values inside // MODEL_RELEASE_DATES only. No published model name, alias, or parameter enum // is touched, and no endpoint exposes a release date, so the docs stand. - sourceSha256: 'f8f46a341bf57384c0080c2ed75d867801142675ded08225281cf7c102236628', + sourceSha256: '9faf1ed1ed1712ee04741b6aa2291d42b2c202c2dadbb1a2681b5391da555e6c', reviewArea: { en: 'Published benchmark and TCO model names, aliases, and parameter enums.', zh: '已发布基准与 TCO 模型名称、别名和参数枚举。', diff --git a/packages/app/src/lib/compare-slug.test.ts b/packages/app/src/lib/compare-slug.test.ts index 8ee4c7c82..46773a596 100644 --- a/packages/app/src/lib/compare-slug.test.ts +++ b/packages/app/src/lib/compare-slug.test.ts @@ -272,6 +272,7 @@ describe('compareModelSeoName', () => { 'glm-5-2': 'GLM-5.2', 'minimax-m3': 'MiniMax M3', 'minimax-m27': 'MiniMax M2.7', + 'qwen-3-8-flash-next': 'Qwen3.8-Flash-Next', 'qwen-3-5': 'Qwen3.5', 'gptoss-120b': 'gpt-oss-120b', 'llama-3-3-70b': 'Llama 3.3 70B', diff --git a/packages/app/src/lib/compare-slug.ts b/packages/app/src/lib/compare-slug.ts index 3dd3b6aa9..383919af1 100644 --- a/packages/app/src/lib/compare-slug.ts +++ b/packages/app/src/lib/compare-slug.ts @@ -122,6 +122,15 @@ export const COMPARE_MODEL_SLUGS: CompareModelSlug[] = [ // Primary version the slug canonicalizes to (M2.7). seoName: 'MiniMax M2.7', }, + { + slug: 'qwen-3-8-flash-next', + displayName: 'Qwen3.8-Flash-Next', + dbKeys: ['qwen3.8next'], + // 176B total: a 125B main model plus a 51B n-gram embedding table, with 6B + // active per forward pass (MoE). The 4B MTP head sits outside that total. + label: 'Qwen 3.8 Flash Next 176B-A6B', + seoName: 'Qwen3.8-Flash-Next', + }, { slug: 'qwen-3-5', displayName: 'Qwen-3.5-397B-A17B', diff --git a/packages/app/src/lib/compare-ssr.ts b/packages/app/src/lib/compare-ssr.ts index 80c1e0683..6264adbd6 100644 --- a/packages/app/src/lib/compare-ssr.ts +++ b/packages/app/src/lib/compare-ssr.ts @@ -48,6 +48,7 @@ export const KNOWN_MODELS = new Set([ 'DeepSeek-R1-0528', 'gpt-oss-120b', 'Qwen-3.5-397B-A17B', + 'Qwen3.8-Flash-Next', 'Kimi-K2.5', 'Kimi-K3', 'MiniMax-M2.5', diff --git a/packages/app/src/lib/data-mappings.ts b/packages/app/src/lib/data-mappings.ts index bcc032def..fabf1eace 100644 --- a/packages/app/src/lib/data-mappings.ts +++ b/packages/app/src/lib/data-mappings.ts @@ -6,6 +6,7 @@ export enum Model { DeepSeek_R1 = 'DeepSeek-R1-0528', GptOss = 'gpt-oss-120b', Qwen3_5 = 'Qwen-3.5-397B-A17B', + Qwen3_8_Flash_Next = 'Qwen3.8-Flash-Next', Kimi_K2_5 = 'Kimi-K2.5', Kimi_K3 = 'Kimi-K3', MiniMax_M2_5 = 'MiniMax-M2.5', @@ -167,6 +168,18 @@ const MODEL_CONFIG: Record = { // the selector presents both releases over the existing GLM-5.2 data bucket. [Model.GLM_5_2]: { label: 'GLM5.2/GLM5.3 744B', prefix: 'glm5.2', category: 'default' }, [Model.Qwen3_5]: { label: 'Qwen3.5 397B', prefix: 'qwen3.5', category: 'default' }, + // 176B total: a 125B main model plus a 51B n-gram embedding table, 6B active + // per forward pass, and a separate 4B MTP head the parameter count excludes. + // Experimental rather than default while the only data is the day-zero H200 + // FP8 agentic arm: `default` would seat it in the /overview matrix, which is + // built from DEFAULT_MODELS and would render an empty fixed-sequence row for + // it. It stays fully selectable everywhere else, since MODEL_OPTIONS excludes + // only `hidden`. Promote to `default` once the sweep covers more chips. + [Model.Qwen3_8_Flash_Next]: { + label: 'Qwen3.8 Flash Next 176B', + prefix: 'qwen3.8next', + category: 'experimental', + }, [Model.GptOss]: { label: 'gpt-oss 120B', prefix: 'gptoss', category: 'deprecated' }, [Model.MiniMax_M2_5]: { // M2.5 and M2.7 share an architecture — same GLM5/5.1 pattern as Kimi. diff --git a/packages/app/src/lib/rankings.test.ts b/packages/app/src/lib/rankings.test.ts index b0e384916..9f3dc412f 100644 --- a/packages/app/src/lib/rankings.test.ts +++ b/packages/app/src/lib/rankings.test.ts @@ -67,7 +67,7 @@ describe('rankings registry', () => { it('has one page per (kind, model) pair', () => { const entries = getAllRankingPageEntries(); expect(entries.length).toBe(RANKING_KINDS.length * INFERENCE_MODEL_SLUGS.length); - expect(entries.length).toBe(22); + expect(entries.length).toBe(24); }); it('has unique, well-formed slugs', () => { diff --git a/packages/app/src/lib/run-pages.test.ts b/packages/app/src/lib/run-pages.test.ts index 51093bfe5..373dfef76 100644 --- a/packages/app/src/lib/run-pages.test.ts +++ b/packages/app/src/lib/run-pages.test.ts @@ -35,7 +35,7 @@ describe('run pages registry', () => { it('has one candidate per (model, chip) pair', () => { const entries = getAllRunPageEntries(); expect(entries.length).toBe(INFERENCE_MODEL_SLUGS.length * getAllChipPages().length); - expect(entries.length).toBe(99); + expect(entries.length).toBe(108); }); it('has unique, well-formed slugs', () => { diff --git a/packages/constants/src/models.ts b/packages/constants/src/models.ts index 0dd46ea40..a5927e052 100644 --- a/packages/constants/src/models.ts +++ b/packages/constants/src/models.ts @@ -11,6 +11,9 @@ export const DB_MODEL_TO_DISPLAY: Record = { gptoss120b: 'gpt-oss-120b', llama70b: 'Llama-3.3-70B-Instruct-FP8', 'qwen3.5': 'Qwen-3.5-397B-A17B', + // Qwen4-architecture preview, not a Qwen3.5 point release (GatedDeltaNet plus + // Qwen Sparse Attention, 512 experts), so it gets its own display bucket. + 'qwen3.8next': 'Qwen3.8-Flash-Next', 'kimik2.5': 'Kimi-K2.5', 'kimik2.6': 'Kimi-K2.5', 'kimik2.7-code': 'Kimi-K2.5', @@ -140,6 +143,13 @@ export const MODEL_RELEASE_DATES: Record = { // Qwen/Qwen3.5-397B-A17B on 2026-02-16 — the same day InferenceX first swept // it. sweep: 2026-02-16 — day zero. 'Qwen-3.5-397B-A17B': '2026-02-16', + // Qwen announced the open-sourcing of Qwen3.8-Flash-Next and its FP8 sibling + // for 23:00 Beijing time on 2026-08-26, which is also the day the SGLang + // bring-up image tag was published. Some coverage puts the Hugging Face repo + // live on 08-24; the announced date is the one used here, and either way it + // precedes the first sweep on 08-27. The model card itself states no date. + // sweep: 2026-08-27 — day zero. + 'Qwen3.8-Flash-Next': '2026-08-26', // Bucket covers M2.5 and M2.7, so the date is M2.5's: announced 2026-02-12 // with weights on Hugging Face, architecturally unchanged from M2 (230B/10B). // Was 2025-10-25, which is M2's launch, not M2.5's — `model-architectures.ts` diff --git a/packages/db/src/etl/normalizers.ts b/packages/db/src/etl/normalizers.ts index fdd8cf9e3..4a8c7f02b 100644 --- a/packages/db/src/etl/normalizers.ts +++ b/packages/db/src/etl/normalizers.ts @@ -94,6 +94,14 @@ export const MODEL_TO_KEY: Record = { // Qwen3.5 'Qwen/Qwen3.5-397B-A17B': 'qwen3.5', 'Qwen/Qwen3.5-397B-A17B-FP8': 'qwen3.5', + // Qwen3.8-Flash-Next (Qwen4 architecture preview — distinct bucket from 3.5). + // Hopper has no NVFP4 path, so H200 serves the FP8 checkpoint while Blackwell + // serves NVFP4. Both paths are taken from executed sweeps rather than inferred: + // FP8 from run 33038487711 (H200, PR #2753), NVFP4 from run 33039186365 + // (B300, PR #2752). Both report `infmax_model_prefix: qwen3.8next`, so no + // PREFIX_ALIASES entry is needed. + 'Qwen/Qwen3.8-Flash-Next-FP8': 'qwen3.8next', + 'RadixArk/Qwen3.8-Flash-Next-NVFP4': 'qwen3.8next', // Kimi-K2.5 / K2.6 / K2.7-Code (same architecture, distinct DB buckets) 'moonshotai/Kimi-K2.5': 'kimik2.5', 'moonshotai/Kimi-K2.6': 'kimik2.6',