From 91a1dd7c7a1ba495ed3b1bf4390638ddc069f924 Mon Sep 17 00:00:00 2001 From: functionstackx <47992694+functionstackx@users.noreply.github.com> Date: Thu, 27 Aug 2026 01:44:00 -0400 Subject: [PATCH] feat(model): add Qwen3.8-Flash-Next MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Registers the Qwen4-architecture preview as its own model, wired end to end: DB bucket, normalizer paths, dashboard selector, compare pages, rankings, and run pages. Both serving paths resolve, taken from executed sweeps rather than inferred. Hopper has no NVFP4 path, so H200 serves the FP8 checkpoint and Blackwell serves NVFP4: - Qwen/Qwen3.8-Flash-Next-FP8 -> qwen3.8next (run 33038487711, H200, #2753) - RadixArk/Qwen3.8-Flash-Next-NVFP4 -> qwen3.8next (run 33039186365, B300, #2752) Both artifacts report infmax_model_prefix `qwen3.8next`, so no PREFIX_ALIASES entry is needed. Parameters are 176B total, not the 125B the model card leads with: the card's headline covers the main model only, and the 51B n-gram embedding table brings the total to 176B. The 4B MTP head sits outside both figures. Recorded in the AGENTS.md parameter table and its mislabel-traps list so the next agent does not repeat the 125B reading. Category is `experimental`, not `default`. The only data today is the day-zero agentic arm, and `default` would seat the model in the /overview matrix, which is built from DEFAULT_MODELS and would render an empty fixed-sequence row. MODEL_OPTIONS excludes only `hidden`, so it stays selectable everywhere else. One word to promote once the sweep covers more chips. Three pinned-count guards move because a model was added, which is what they exist to force: compare-slug seoName coverage, rankings pages (22 -> 24), and run pages (99 -> 108). The api-route-catalog digest for constants/models.ts is refreshed after confirming the API reference derives its model enum from DB_MODEL_TO_DISPLAY, so no documentation copy needed changing. 中文:新增 Qwen4 架构预览模型 Qwen3.8-Flash-Next,并完成端到端接入:数据库分桶、 normalizer 路径、仪表板选择器、对比页、排名页与运行页。两条服务路径均来自已执行的 sweep 而非推断:Hopper 无 NVFP4 路径,故 H200 使用 FP8 权重(run 33038487711, #2753),Blackwell 使用 NVFP4(run 33039186365,#2752);两者的 infmax_model_prefix 均为 `qwen3.8next`,无需 PREFIX_ALIASES。参数量为 176B 而非 model card 首行的 125B:该数字仅指主模型,加上 51B n-gram embedding 后共 176B, 另有 4B MTP 头不计入其中;已记入 AGENTS.md 参数表与易错清单。分类使用 `experimental` 而非 `default`:当前仅有首发 agentic 数据,若设为 default 会在 /overview 矩阵中出现空的定长行;MODEL_OPTIONS 仅排除 hidden,因此其余位置仍可选择。 三处计数守卫按预期变化(rankings 22→24,run pages 99→108,compare-slug 覆盖表), 并在确认 API 文档的模型枚举派生自 DB_MODEL_TO_DISPLAY 后更新了摘要哈希。 --- AGENTS.md | 2 ++ packages/app/src/lib/api-route-catalog.ts | 2 +- packages/app/src/lib/compare-slug.test.ts | 1 + packages/app/src/lib/compare-slug.ts | 9 +++++++++ packages/app/src/lib/compare-ssr.ts | 1 + packages/app/src/lib/data-mappings.ts | 13 +++++++++++++ packages/app/src/lib/rankings.test.ts | 2 +- packages/app/src/lib/run-pages.test.ts | 2 +- packages/constants/src/models.ts | 10 ++++++++++ packages/db/src/etl/normalizers.ts | 8 ++++++++ 10 files changed, 47 insertions(+), 3 deletions(-) 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',