From 3c1531596b6f9d216f1e1961c813bbf1519eccb8 Mon Sep 17 00:00:00 2001 From: functionstackx <47992694+functionstackx@users.noreply.github.com> Date: Sat, 18 Jul 2026 16:31:56 -0400 Subject: [PATCH] chore(models): split GLM-5.2 into its own model, deprecate GLM 5/5.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GLM-5.2 is a new architecture bucket (743B core MoE / 39B active with IndexShare DSA; the 753B HF metadata figure includes the bundled MTP head), not a point release of GLM-5/5.1 — #588 folded it into the GLM-5 display grouping by mistake. Split glm5.2 into its own GLM-5.2 display model with its own dropdown entry (default category) and /compare slug (glm-5-2), and move the GLM 5/5.1 entry to the Deprecated group (no longer actively benchmarked). Records the 753B MTP-head param trap and the not-a-point-release trap in AGENTS.md. 中文:GLM-5.2 是全新架构分桶(核心 MoE 743B / 激活 39B,采用 IndexShare 稀疏注意力;HF 元数据显示 753B 是因为包含 MTP 头),并非 GLM-5/5.1 的 小版本更新 — #588 误将其并入 GLM-5 显示分组。本次将 glm5.2 拆分为独立 的 GLM-5.2 显示模型(默认分类,含独立下拉项与 /compare slug glm-5-2), 并将 GLM 5/5.1 条目移入"已弃用"分组(不再进行日常基准测试);同时在 AGENTS.md 中记录 753B(含 MTP 头)参数量陷阱与"非小版本更新"陷阱。 Co-Authored-By: Claude Fable 5 --- AGENTS.md | 2 ++ .../app/cypress/e2e/dropdown-switching.cy.ts | 1 + .../app/src/app/compare-per-dollar/page.tsx | 2 +- packages/app/src/app/compare/page.tsx | 2 +- .../src/app/zh/compare-per-dollar/page.tsx | 2 +- packages/app/src/app/zh/compare/page.tsx | 2 +- .../inference/agentic-point/sibling-nav.tsx | 1 + .../submissions/submissions-utils.test.ts | 1 + .../submissions/submissions-utils.ts | 2 +- packages/app/src/lib/compare-slug.test.ts | 9 +++++- packages/app/src/lib/compare-slug.ts | 22 ++++++++++---- packages/app/src/lib/compare-ssr.ts | 1 + packages/app/src/lib/data-mappings.test.ts | 30 ++++++++++++++++++- packages/app/src/lib/data-mappings.ts | 20 ++++++++++++- packages/app/src/lib/models-mapping.test.ts | 9 ++++-- packages/constants/src/models.test.ts | 9 ++++-- packages/constants/src/models.ts | 5 +++- packages/db/src/etl/normalizers.ts | 3 +- 18 files changed, 101 insertions(+), 22 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index ddef8354..6471e806 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -176,6 +176,7 @@ Authoritative total / active parameter counts for every model in the dashboard. | Qwen3.5-397B-A17B | 397B | 17B | `Qwen/Qwen3.5-397B-A17B` | 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) | +| GLM-5.2 | 743B | 39B | `zai-org/GLM-5.2` | HF config.json (see trap below) | | MiniMax-M2.5 | 230B | 10B | `MiniMaxAI/MiniMax-M2.5` | HF model card | | MiniMax-M2.7 | 230B | 10B | `MiniMaxAI/MiniMax-M2.7` | NVIDIA M2.7 blog | | gpt-oss-120b | 120B | 5.1B | `openai/gpt-oss-120b` | HF model card | @@ -184,6 +185,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): - **GLM-5 ≠ 355B.** 355B is GLM-4.5. GLM-5 jumped to 744B / 40B active (256-expert MoE with DSA). +- **GLM-5.2 is NOT a GLM-5 point release, and ≠ 753B.** Unlike 5.0 → 5.1, GLM-5.2 is a new architecture bucket (`glm_moe_dsa` with IndexShare sparse attention, 78 layers) — it maps to its own `GLM-5.2` display model; never group `glm5.2` with `glm5`/`glm5.1`. Its HF metadata shows 753B because the bundled MTP head (`num_nextn_predict_layers: 1`) adds ~10B; the core MoE is 743B / 39B active. - **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. - **Kimi K2.5, K2.6, and K2.7-Code are post-training refinements**, not new pre-trained sizes. Same 1T / 32B / 384-expert backbone as the original K2. K2.7-Code is a coding-focused refinement of the same backbone. diff --git a/packages/app/cypress/e2e/dropdown-switching.cy.ts b/packages/app/cypress/e2e/dropdown-switching.cy.ts index 62c36c3d..0ad1a079 100644 --- a/packages/app/cypress/e2e/dropdown-switching.cy.ts +++ b/packages/app/cypress/e2e/dropdown-switching.cy.ts @@ -50,6 +50,7 @@ describe('Dropdown one-click switching', () => { cy.contains('Maintenance Mode').scrollIntoView().should('be.visible'); cy.contains('[role="option"]', 'DeepSeek R1 0528 671B').scrollIntoView().should('be.visible'); cy.contains('Deprecated').scrollIntoView().should('be.visible'); + cy.contains('[role="option"]', 'GLM5/5.1 744B').scrollIntoView().should('be.visible'); cy.contains('[role="option"]', 'gpt-oss 120B').scrollIntoView().should('be.visible'); cy.contains('[role="option"]', 'Llama 3.3 70B Instruct').scrollIntoView().should('be.visible'); }); diff --git a/packages/app/src/app/compare-per-dollar/page.tsx b/packages/app/src/app/compare-per-dollar/page.tsx index c33f57b2..05a4ad0a 100644 --- a/packages/app/src/app/compare-per-dollar/page.tsx +++ b/packages/app/src/app/compare-per-dollar/page.tsx @@ -19,7 +19,7 @@ import { bucketComparePairsByVendor, formatModelList } from '@/lib/compare-ssr'; export const dynamic = 'force-dynamic'; -const DESCRIPTION = `Which GPU delivers more inference performance per dollar? InferenceX is the independent, open-source benchmark from SemiAnalysis, with verified, reproducible results. ${SUPPORTERS_LINE} Compare cost per million tokens, normalized by hyperscaler TCO, across DeepSeek V4 Pro, DeepSeek R1, Kimi K2, MiniMax M3, GLM 5, Qwen 3.5 & more.`; +const DESCRIPTION = `Which GPU delivers more inference performance per dollar? InferenceX is the independent, open-source benchmark from SemiAnalysis, with verified, reproducible results. ${SUPPORTERS_LINE} Compare cost per million tokens, normalized by hyperscaler TCO, across DeepSeek V4 Pro, DeepSeek R1, Kimi K2, MiniMax M3, GLM 5.2, Qwen 3.5 & more.`; export const metadata: Metadata = { title: 'GPU Performance per Dollar', diff --git a/packages/app/src/app/compare/page.tsx b/packages/app/src/app/compare/page.tsx index 7c44c8c9..0fff6650 100644 --- a/packages/app/src/app/compare/page.tsx +++ b/packages/app/src/app/compare/page.tsx @@ -19,7 +19,7 @@ import { bucketComparePairsByVendor, formatModelList } from '@/lib/compare-ssr'; export const dynamic = 'force-dynamic'; -const DESCRIPTION = `InferenceX is the independent, open-source GPU inference benchmark from SemiAnalysis, with verified, reproducible nightly results. ${SUPPORTERS_LINE} Compare latency, throughput & cost head-to-head across DeepSeek V4 Pro, DeepSeek R1, Kimi K2, MiniMax M3, GLM 5, Qwen 3.5 & more.`; +const DESCRIPTION = `InferenceX is the independent, open-source GPU inference benchmark from SemiAnalysis, with verified, reproducible nightly results. ${SUPPORTERS_LINE} Compare latency, throughput & cost head-to-head across DeepSeek V4 Pro, DeepSeek R1, Kimi K2, MiniMax M3, GLM 5.2, Qwen 3.5 & more.`; export const metadata: Metadata = { title: 'GPU Comparisons', diff --git a/packages/app/src/app/zh/compare-per-dollar/page.tsx b/packages/app/src/app/zh/compare-per-dollar/page.tsx index a31f6e5b..580273b7 100644 --- a/packages/app/src/app/zh/compare-per-dollar/page.tsx +++ b/packages/app/src/app/zh/compare-per-dollar/page.tsx @@ -18,7 +18,7 @@ import { ZH_OG_LOCALE, zhAlternates } from '@/lib/i18n'; export const dynamic = 'force-dynamic'; -const DESCRIPTION = `哪款 GPU 每美元推理性能最高?InferenceX 是 SemiAnalysis 推出的独立开源基准测试平台,提供经过验证的、可复现的测试结果。${SUPPORTERS_LINE_ZH}横向对比 DeepSeek V4 Pro、DeepSeek R1、Kimi K2、MiniMax M3、GLM 5、Qwen 3.5 等模型基于云服务商 TCO 归一化的每百万 token 成本。`; +const DESCRIPTION = `哪款 GPU 每美元推理性能最高?InferenceX 是 SemiAnalysis 推出的独立开源基准测试平台,提供经过验证的、可复现的测试结果。${SUPPORTERS_LINE_ZH}横向对比 DeepSeek V4 Pro、DeepSeek R1、Kimi K2、MiniMax M3、GLM 5.2、Qwen 3.5 等模型基于云服务商 TCO 归一化的每百万 token 成本。`; export const metadata: Metadata = { title: 'GPU 每美元性能', diff --git a/packages/app/src/app/zh/compare/page.tsx b/packages/app/src/app/zh/compare/page.tsx index 55a4f43f..8f6c025f 100644 --- a/packages/app/src/app/zh/compare/page.tsx +++ b/packages/app/src/app/zh/compare/page.tsx @@ -18,7 +18,7 @@ import { ZH_OG_LOCALE, zhAlternates } from '@/lib/i18n'; export const dynamic = 'force-dynamic'; -const DESCRIPTION = `InferenceX 是 SemiAnalysis 推出的独立开源 GPU 推理基准测试平台,提供经过验证的、可复现的每夜测试结果。${SUPPORTERS_LINE_ZH}横向对比 DeepSeek V4 Pro、DeepSeek R1、Kimi K2、MiniMax M3、GLM 5、Qwen 3.5 等模型的延迟、吞吐量与成本。`; +const DESCRIPTION = `InferenceX 是 SemiAnalysis 推出的独立开源 GPU 推理基准测试平台,提供经过验证的、可复现的每夜测试结果。${SUPPORTERS_LINE_ZH}横向对比 DeepSeek V4 Pro、DeepSeek R1、Kimi K2、MiniMax M3、GLM 5.2、Qwen 3.5 等模型的延迟、吞吐量与成本。`; export const metadata: Metadata = { title: 'GPU 对比', diff --git a/packages/app/src/components/inference/agentic-point/sibling-nav.tsx b/packages/app/src/components/inference/agentic-point/sibling-nav.tsx index b013f41e..4b5ab06d 100644 --- a/packages/app/src/components/inference/agentic-point/sibling-nav.tsx +++ b/packages/app/src/components/inference/agentic-point/sibling-nav.tsx @@ -33,6 +33,7 @@ const MODEL_LABELS: Record = { dsv4: 'DeepSeek V4 Pro', glm5: 'GLM-5', 'glm5.1': 'GLM-5.1', + 'glm5.2': 'GLM-5.2', gptoss120b: 'gpt-oss 120B', kimik2: 'Kimi K2', 'kimik2.5': 'Kimi K2.5', diff --git a/packages/app/src/components/submissions/submissions-utils.test.ts b/packages/app/src/components/submissions/submissions-utils.test.ts index 13f9dca4..ab35515a 100644 --- a/packages/app/src/components/submissions/submissions-utils.test.ts +++ b/packages/app/src/components/submissions/submissions-utils.test.ts @@ -300,6 +300,7 @@ describe('buildInferenceCompareUrl', () => { const cases: [string, string][] = [ ['gptoss120b', 'gpt-oss-120b'], ['glm5.1', 'GLM-5'], + ['glm5.2', 'GLM-5.2'], ['llama70b', 'Llama-3.3-70B-Instruct-FP8'], ['kimik2.6', 'Kimi-K2.5'], ['kimik2.7-code', 'Kimi-K2.5'], diff --git a/packages/app/src/components/submissions/submissions-utils.ts b/packages/app/src/components/submissions/submissions-utils.ts index 90099d46..286d77ec 100644 --- a/packages/app/src/components/submissions/submissions-utils.ts +++ b/packages/app/src/components/submissions/submissions-utils.ts @@ -80,7 +80,7 @@ export function buildInferenceCompareUrl( previousRow: SubmissionSummaryRow, ): string | null { // DB_MODEL_TO_DISPLAY covers every DB prefix incl. point-release aliases - // (gptoss120b, glm5.1, kimik2.6, kimik2.7-code, minimaxm2.7, llama70b). + // (gptoss120b, glm5.1, glm5.2, kimik2.6, kimik2.7-code, minimaxm2.7, llama70b). // MODEL_PREFIX_MAPPING only has the single canonical prefix per Model enum // and misses those rows. const displayModel = DB_MODEL_TO_DISPLAY[currentRow.model]; diff --git a/packages/app/src/lib/compare-slug.test.ts b/packages/app/src/lib/compare-slug.test.ts index fa612d90..03ef195c 100644 --- a/packages/app/src/lib/compare-slug.test.ts +++ b/packages/app/src/lib/compare-slug.test.ts @@ -43,6 +43,13 @@ describe('parseCompareSlug — new model-prefixed form', () => { expect(parsed?.b).toBe('gb200'); }); + it('parses the glm-5-2 slug as its own model, distinct from glm-5-1', () => { + const parsed = parseCompareSlug('glm-5-2-h100-vs-h200'); + expect(parsed?.model.slug).toBe('glm-5-2'); + expect(parsed?.model.dbKeys).toEqual(['glm5.2']); + expect(parsed?.isAliasModel).toBe(false); + }); + it('parses the minimax-m3 slug as its own model, distinct from minimax-m27', () => { const parsed = parseCompareSlug('minimax-m3-h100-vs-h200'); expect(parsed?.model.slug).toBe('minimax-m3'); @@ -252,7 +259,7 @@ describe('compareModelDisplayLabel', () => { expect(compareModelDisplayLabel(KIMI_K26, 'gb200', 'mi355x')).toBe( 'Kimi K2.5/K2.6/K2.7-Code 1T — GB200 NVL72 vs MI355X', ); - expect(compareModelDisplayLabel(GLM_51, 'h100', 'h200')).toBe('GLM 5/5.1/5.2 — H100 vs H200'); + expect(compareModelDisplayLabel(GLM_51, 'h100', 'h200')).toBe('GLM 5/5.1 — H100 vs H200'); }); }); diff --git a/packages/app/src/lib/compare-slug.ts b/packages/app/src/lib/compare-slug.ts index 3891b4d3..7e462f11 100644 --- a/packages/app/src/lib/compare-slug.ts +++ b/packages/app/src/lib/compare-slug.ts @@ -35,8 +35,9 @@ export interface CompareModelSlug { // gpt-oss → Llama 70B. Per product spec — flagship Chinese-developed models // first, smaller open US-developed models at the bottom. Qwen sits between // MiniMax and gpt-oss to keep the Chinese-lab cluster contiguous before the -// US transition. The two MiniMax entries stay adjacent with the newer M3 -// flagship leading the older M2 series. +// US transition. The two GLM entries and the two MiniMax entries each stay +// adjacent with the newer flagship (GLM 5.2, MiniMax M3) leading the older +// series. export const COMPARE_MODEL_SLUGS: CompareModelSlug[] = [ { slug: 'deepseek-v4', @@ -63,13 +64,22 @@ export const COMPARE_MODEL_SLUGS: CompareModelSlug[] = [ // count appended so the label conveys model scale alongside the version. label: 'Kimi K2.5/K2.6/K2.7-Code 1T', }, + { + slug: 'glm-5-2', + displayName: 'GLM-5.2', + // GLM-5.2 is a new 743B architecture (IndexShare sparse attention), not a + // point release of the GLM-5/5.1 family, so it gets its own slug and dbKey + // rather than joining the glm-5-1 group. + dbKeys: ['glm5.2'], + label: 'GLM 5.2 743B', + }, { slug: 'glm-5-1', displayName: 'GLM-5', - // GLM-5 point releases share the same base architecture. Keep the existing - // canonical slug for URL stability while querying every DB bucket. - dbKeys: ['glm5.2', 'glm5.1', 'glm5'], - label: 'GLM 5/5.1/5.2', + // GLM-5.0 and GLM-5.1 share an architecture per the model card; the slug + // uses the newer version name but the data pull covers both DB buckets. + dbKeys: ['glm5.1', 'glm5'], + label: 'GLM 5/5.1', }, { slug: 'minimax-m3', diff --git a/packages/app/src/lib/compare-ssr.ts b/packages/app/src/lib/compare-ssr.ts index 27b85f2b..44e80939 100644 --- a/packages/app/src/lib/compare-ssr.ts +++ b/packages/app/src/lib/compare-ssr.ts @@ -70,6 +70,7 @@ export const KNOWN_MODELS = new Set([ 'MiniMax-M2.5', 'MiniMax-M3', 'GLM-5', + 'GLM-5.2', 'DeepSeek-V4-Pro', ]); export const KNOWN_SEQUENCES = new Set(['1k/1k', '1k/8k', '8k/1k']); diff --git a/packages/app/src/lib/data-mappings.test.ts b/packages/app/src/lib/data-mappings.test.ts index 485d8849..505b0c43 100644 --- a/packages/app/src/lib/data-mappings.test.ts +++ b/packages/app/src/lib/data-mappings.test.ts @@ -57,6 +57,16 @@ describe('getModelAndSequence', () => { expect(result).toEqual({ model: Model.Kimi_K2_5, sequence: Sequence.OneK_OneK }); }); + it('parses glm5.2 artifact names as GLM_5_2, not GLM_5 (substring collision)', () => { + const result = getModelAndSequence('results_glm5.2_1k1k'); + expect(result).toEqual({ model: Model.GLM_5_2, sequence: Sequence.OneK_OneK }); + }); + + it('still parses plain glm5 artifact names as GLM_5', () => { + const result = getModelAndSequence('results_glm5_8k1k'); + expect(result).toEqual({ model: Model.GLM_5, sequence: Sequence.EightK_OneK }); + }); + it('returns undefined for unrecognized model prefix', () => { expect(getModelAndSequence('results_unknown_1k1k')).toBeUndefined(); }); @@ -127,6 +137,15 @@ describe('getModelAndSequenceFromArtifact', () => { expect(result).toEqual({ model: Model.Kimi_K2_5, sequence: Sequence.EightK_OneK }); }); + it('parses structured artifact with glm5.2 prefix as GLM_5_2', () => { + const result = getModelAndSequenceFromArtifact({ + infmax_model_prefix: 'glm5.2', + isl: 1024, + osl: 1024, + }); + expect(result).toEqual({ model: Model.GLM_5_2, sequence: Sequence.OneK_OneK }); + }); + it('returns undefined for unknown model prefix', () => { const result = getModelAndSequenceFromArtifact({ infmax_model_prefix: 'unknown', @@ -162,9 +181,17 @@ describe('isModelDeprecated', () => { expect(isModelDeprecated(Model.GptOss)).toBe(true); }); + it('returns true for deprecated model GLM_5 (superseded by GLM-5.2)', () => { + expect(isModelDeprecated(Model.GLM_5)).toBe(true); + }); + it('returns false for non-deprecated model DeepSeek_R1', () => { expect(isModelDeprecated(Model.DeepSeek_R1)).toBe(false); }); + + it('returns false for non-deprecated model GLM_5_2', () => { + expect(isModelDeprecated(Model.GLM_5_2)).toBe(false); + }); }); // =========================================================================== @@ -224,7 +251,8 @@ describe('getModelLabel', () => { expect(getModelLabel(Model.GptOss)).toBe('gpt-oss 120B'); expect(getModelLabel(Model.Qwen3_5)).toBe('Qwen3.5 397B'); expect(getModelLabel(Model.Kimi_K2_5)).toBe('Kimi K2.5/2.6/2.7-Code 1T'); - expect(getModelLabel(Model.GLM_5)).toBe('GLM5/5.1/5.2 744B'); + expect(getModelLabel(Model.GLM_5)).toBe('GLM5/5.1 744B'); + expect(getModelLabel(Model.GLM_5_2)).toBe('GLM5.2 743B'); expect(getModelLabel(Model.MiniMax_M2_5)).toBe('MiniMax M2.5/2.7 230B'); }); diff --git a/packages/app/src/lib/data-mappings.ts b/packages/app/src/lib/data-mappings.ts index 6076d501..24f5a147 100644 --- a/packages/app/src/lib/data-mappings.ts +++ b/packages/app/src/lib/data-mappings.ts @@ -10,6 +10,7 @@ export enum Model { MiniMax_M2_5 = 'MiniMax-M2.5', MiniMax_M3 = 'MiniMax-M3', GLM_5 = 'GLM-5', + GLM_5_2 = 'GLM-5.2', DeepSeek_V4_Pro = 'DeepSeek-V4-Pro', } @@ -111,8 +112,25 @@ const MODEL_CONFIG: Record = { prefix: 'dsr1', category: 'maintenance', }, - [Model.GLM_5]: { label: 'GLM5/5.1/5.2 744B', prefix: 'glm5', category: 'default' }, + [Model.GLM_5_2]: { + // GLM-5.2 is a new architecture bucket (743B core MoE / 39B active with + // IndexShare DSA; HF metadata shows 753B because of the bundled MTP head), + // NOT a point release of GLM-5/5.1 — so it gets its own entry instead of + // joining the GLM_5 grouping. Keep this entry above GLM_5: + // MODEL_PREFIX_MAPPING matches artifact names by substring in insertion + // order, and 'glm5.2' artifact names also contain 'glm5'. + label: 'GLM5.2 743B', + prefix: 'glm5.2', + category: 'default', + }, [Model.Qwen3_5]: { label: 'Qwen3.5 397B', prefix: 'qwen3.5', category: 'default' }, + [Model.GLM_5]: { + // Superseded by GLM-5.2 (a different architecture bucket, split into its + // own entry above), so it's deprecated (no longer actively benchmarked). + label: 'GLM5/5.1 744B', + prefix: 'glm5', + category: 'deprecated', + }, [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/models-mapping.test.ts b/packages/app/src/lib/models-mapping.test.ts index 7d941375..294d66ec 100644 --- a/packages/app/src/lib/models-mapping.test.ts +++ b/packages/app/src/lib/models-mapping.test.ts @@ -31,9 +31,12 @@ describe('DISPLAY_MODEL_TO_DB', () => { }); it('groups point-release DB keys under one display', () => { - expect(DISPLAY_MODEL_TO_DB['GLM-5']).toEqual( - expect.arrayContaining(['glm5', 'glm5.1', 'glm5.2']), - ); + expect(DISPLAY_MODEL_TO_DB['GLM-5']).toEqual(expect.arrayContaining(['glm5', 'glm5.1'])); + }); + + it('keeps glm5.2 in its own GLM-5.2 display bucket (new architecture)', () => { + expect(DISPLAY_MODEL_TO_DB['GLM-5.2']).toEqual(['glm5.2']); + expect(DISPLAY_MODEL_TO_DB['GLM-5']).not.toContain('glm5.2'); }); }); diff --git a/packages/constants/src/models.test.ts b/packages/constants/src/models.test.ts index 10766c5e..b2304a64 100644 --- a/packages/constants/src/models.test.ts +++ b/packages/constants/src/models.test.ts @@ -16,9 +16,7 @@ describe('DB_MODEL_TO_DISPLAY / DISPLAY_MODEL_TO_DB consistency', () => { }); it('groups point-release DB keys under the same display name', () => { - expect(DISPLAY_MODEL_TO_DB['GLM-5']).toEqual( - expect.arrayContaining(['glm5', 'glm5.1', 'glm5.2']), - ); + expect(DISPLAY_MODEL_TO_DB['GLM-5']).toEqual(expect.arrayContaining(['glm5', 'glm5.1'])); expect(DISPLAY_MODEL_TO_DB['Kimi-K2.5']).toEqual( expect.arrayContaining(['kimik2.5', 'kimik2.6', 'kimik2.7-code']), ); @@ -30,6 +28,11 @@ describe('DB_MODEL_TO_DISPLAY / DISPLAY_MODEL_TO_DB consistency', () => { it('maps minimaxm3 to its own MiniMax-M3 display name', () => { expect(DISPLAY_MODEL_TO_DB['MiniMax-M3']).toEqual(['minimaxm3']); }); + + it('maps glm5.2 to its own GLM-5.2 display name (new architecture, not a GLM-5 point release)', () => { + expect(DISPLAY_MODEL_TO_DB['GLM-5.2']).toEqual(['glm5.2']); + expect(DISPLAY_MODEL_TO_DB['GLM-5']).not.toContain('glm5.2'); + }); }); describe('sequenceToIslOsl', () => { diff --git a/packages/constants/src/models.ts b/packages/constants/src/models.ts index eab03c33..ea778682 100644 --- a/packages/constants/src/models.ts +++ b/packages/constants/src/models.ts @@ -19,7 +19,10 @@ export const DB_MODEL_TO_DISPLAY: Record = { minimaxm3: 'MiniMax-M3', glm5: 'GLM-5', 'glm5.1': 'GLM-5', - 'glm5.2': 'GLM-5', + // GLM-5.2 is a new architecture bucket (743B core MoE with IndexShare DSA), + // not a point release of GLM-5/5.1 (744B) — it renders as its own display + // model instead of joining the GLM-5 grouping. + 'glm5.2': 'GLM-5.2', dsv4: 'DeepSeek-V4-Pro', }; diff --git a/packages/db/src/etl/normalizers.ts b/packages/db/src/etl/normalizers.ts index 275cd6ea..e8263777 100644 --- a/packages/db/src/etl/normalizers.ts +++ b/packages/db/src/etl/normalizers.ts @@ -98,9 +98,10 @@ export const MODEL_TO_KEY: Record = { 'MiniMaxAI/MiniMax-M2.5': 'minimaxm2.5', // MiniMax-M3 (428B, distinct architecture from the M2 series) 'MiniMaxAI/MiniMax-M3': 'minimaxm3', - // GLM-5 + // GLM-5 / 5.1 (same architecture, grouped under one display) 'zai-org/GLM-5-FP8': 'glm5', 'amd/GLM-5.1-MXFP4': 'glm5.1', + // GLM-5.2 (new architecture — its own display bucket, not a GLM-5 point release) 'zai-org/GLM-5.2-FP8': 'glm5.2', // DeepSeek-V4-Pro 'deepseek-ai/DeepSeek-V4-Pro': 'dsv4',