diff --git a/packages/app/cypress/e2e/chart-overflow-continuation.cy.ts b/packages/app/cypress/e2e/chart-overflow-continuation.cy.ts index 99484b932..5b78f53de 100644 --- a/packages/app/cypress/e2e/chart-overflow-continuation.cy.ts +++ b/packages/app/cypress/e2e/chart-overflow-continuation.cy.ts @@ -160,7 +160,11 @@ describe('Chart overflow continuations', () => { cy.wrap($continuation) .find('[data-testid="overflow-continuation-label"]') .should(($label) => { - expect(Number($label.attr('y'))).to.be.greaterThan(arrowY); + const offset = Number($label.attr('y')) - arrowY; + expect( + Math.abs(offset - 18) < 0.01 || Math.abs(offset + 12) < 0.01, + 'label is below the arrow or uses the above-arrow bottom-edge fallback', + ).to.equal(true); }); }); cy.wrap($continuation) diff --git a/packages/app/cypress/e2e/overview.cy.ts b/packages/app/cypress/e2e/overview.cy.ts index b7e418a42..97b7a2a1e 100644 --- a/packages/app/cypress/e2e/overview.cy.ts +++ b/packages/app/cypress/e2e/overview.cy.ts @@ -28,9 +28,9 @@ const AGENTX_LABEL_ZH = '长上下文多轮真实智能体场景(AgentX)'; const PAGE_TITLE = 'Inference Cost per Million Tokens'; const PAGE_TITLE_ZH = '推理每百万 token 成本'; -const SOURCE_NOTE = 'Source: InferenceX & SemiAnalysis Market August 2025 AI Cloud TCO Model'; -const SOURCE_LINK_TEXT = 'SemiAnalysis Market August 2025 AI Cloud TCO Model'; -const SOURCE_NOTE_ZH = '来源:InferenceX 与 SemiAnalysis Market August 2025 AI Cloud TCO Model'; +const SOURCE_NOTE = 'Source: InferenceX & SemiAnalysis Market July 2026 AI Cloud TCO Model'; +const SOURCE_LINK_TEXT = 'SemiAnalysis Market July 2026 AI Cloud TCO Model'; +const SOURCE_NOTE_ZH = '来源:InferenceX 与 SemiAnalysis Market July 2026 AI Cloud TCO Model'; const SOURCE_HREF = 'https://semianalysis.com/ai-cloud-tco-model/'; const SCOPE_METRIC = 'Hyperscaler cost'; const SCOPE_DIRECTION = '↓ Lower is better'; @@ -213,7 +213,7 @@ describe('Overview page', () => { // its hover/focus/screen-reader label, never as visible text. cy.get( '[data-testid="overview-pair-value"][data-hardware="b200"] [data-testid="overview-cost-evidence-link"]', - ).should('have.text', '$0.067'); + ).should('have.text', '$0.059'); cy.get( '[data-testid="overview-pair-value"][data-hardware="b200"] [data-testid="overview-cost-evidence-link"]', ) @@ -225,7 +225,7 @@ describe('Overview page', () => { .and( 'have.attr', 'aria-label', - 'Approximately $0.067. Estimated from validated benchmark runs. Open raw source dashboard for Jul 18: DeepSeek V4 Pro 1.6T · B200 · SGLang · FP4 · MTP', + 'Approximately $0.059. Estimated from validated benchmark runs. Open raw source dashboard for Jul 18: DeepSeek V4 Pro 1.6T · B200 · SGLang · FP4 · MTP', ); cy.get('[data-testid="overview-pair-missing"]').should('not.exist'); }); @@ -261,7 +261,7 @@ describe('Overview page', () => { platform('b200').find('[data-testid="overview-cost-delta"]').should('not.exist'); platform('mi355x') .find('[data-testid="overview-cost-delta"]') - .should('contain.text', '25%') + .should('contain.text', '-15%') .and('have.attr', 'data-cost-polarity', 'cheaper') .then(($badge) => { // The shade lives on the cell now, never on the badge itself. @@ -274,9 +274,9 @@ describe('Overview page', () => { desktopModel('DeepSeek-V4-Pro', SINGLE_TURN).within(() => { platform('gb200') .find('[data-testid="overview-cost-delta"]') - .should('contain.text', '+80%') + .should('contain.text', '+71%') .and('have.attr', 'data-cost-polarity', 'pricier'); - // +80% saturates the alpha ramp; read the computed value so the + // +71% saturates the alpha ramp; read the computed value so the // assertion survives the browser normalizing `0.40` to `0.4`. expectCellTint('gb200', 'rgba(239, 68, 68, 0.4)'); // No read at the tier means nothing to grade — the cell stays untinted. @@ -316,18 +316,13 @@ describe('Overview page', () => { }); }); - // Within the ±5% parity band the cell reads as even, not polarity. + // Outside the ±5% parity band the cell carries the matching polarity. desktopModel('Kimi-K2.5').within(() => { platform('b300') .find('[data-testid="overview-cost-delta"]') - .should('contain.text', '+2%') - .and('have.attr', 'data-cost-polarity', 'even'); - platform('b300').then(([cell]) => { - const [r, g, b] = getComputedStyle(cell.closest('td')!) - .backgroundColor.match(/\d+/g)! - .map(Number); - expect(Math.max(r, g, b) - Math.min(r, g, b)).to.be.lessThan(60); - }); + .should('contain.text', '+11%') + .and('have.attr', 'data-cost-polarity', 'pricier'); + expectCellTint('b300', 'rgba(239, 68, 68,'); }); }); @@ -440,7 +435,7 @@ describe('Overview page', () => { // Priced from the AgentX rows alone — the single-turn sweep never leaks in. cy.get( '[data-testid="overview-pair-value"][data-hardware="b200"] [data-testid="overview-cost-evidence-link"]', - ).should('have.text', '$0.072'); + ).should('have.text', '$0.064'); cy.get( '[data-testid="overview-pair-value"][data-hardware="mi355x"] [data-testid="overview-cost-evidence-link"]', ).should('have.text', '$0.069'); @@ -508,7 +503,7 @@ describe('Overview page', () => { cy.get( '[data-testid="overview-pair-value"][data-hardware="mi355x"] [data-testid="overview-cost-evidence-link"]', ) - .should('have.text', '$0.061') + .should('have.text', '$0.062') .and( 'have.attr', 'title', @@ -517,7 +512,7 @@ describe('Overview page', () => { .and( 'have.attr', 'aria-label', - '$0.061. Open raw source dashboard for Jul 18: Qwen3.5 397B · MI355X · SGLang · FP8 · MTP', + '$0.062. Open raw source dashboard for Jul 18: Qwen3.5 397B · MI355X · SGLang · FP8 · MTP', ) .should('have.attr', 'href') .and('include', '/inference?') @@ -530,7 +525,7 @@ describe('Overview page', () => { cy.get( '[data-testid="overview-pair-value"][data-hardware="b200"] [data-testid="overview-cost-evidence-link"]', ) - .should('contain.text', '$0.082') + .should('contain.text', '$0.073') .should('have.attr', 'href') .and('include', 'i_prec=fp4') .and('include', 'i_gpus=b200_sglang_mtp'); @@ -576,7 +571,7 @@ describe('Overview page', () => { platform('gb300').within(() => { cy.get('[data-testid="overview-pair-value"][data-hardware="gb300"]').should( 'contain.text', - '$0.113', + '$0.099', ); cy.get('[data-testid="overview-cost-delta"][data-hardware="gb300"]').should( 'have.attr', @@ -628,7 +623,7 @@ describe('Overview page', () => { }); desktopModel('Qwen-3.5-397B-A17B', SINGLE_TURN).within(() => { - platform('b200').should('contain.text', '$0.139').and('contain.text', 'FP8'); + platform('b200').should('contain.text', '$0.124').and('contain.text', 'FP8'); platform('mi355x').within(() => { cy.get('[data-testid="overview-pair-value"][data-hardware="mi355x"]').should( 'contain.text', @@ -659,7 +654,7 @@ describe('Overview page', () => { platform('b300').within(() => { cy.get('[data-testid="overview-pair-value"][data-hardware="b300"]').should( 'contain.text', - '$0.050', + '$0.049', ); cy.get('[data-testid="overview-cost-delta"][data-hardware="b300"]') .should('contain.text', '∞') @@ -700,13 +695,13 @@ describe('Overview page', () => { platform('mi355x').within(() => { cy.get( '[data-testid="overview-pair-value"][data-hardware="mi355x"] [data-testid="overview-cost-evidence-link"]', - ).should('have.text', '$0.061'); + ).should('have.text', '$0.062'); }); }); mobileModel('DeepSeek-V4-Pro', SINGLE_TURN).within(() => { cy.get( '[data-testid="overview-pair-value"][data-hardware="b200"] [data-testid="overview-cost-evidence-link"]', - ).should('have.text', '$0.067'); + ).should('have.text', '$0.059'); cy.get('[data-testid="overview-pair-missing"][data-hardware="gb300"]').should( 'have.attr', 'title', @@ -915,8 +910,8 @@ describe('Overview page', () => { .and('include', '原始数据仪表板:DeepSeek V4 Pro 1.6T · B200 · SGLang · FP4 · MTP'); cy.get('@estimatedB200') .invoke('attr', 'aria-label') - .should('include', '约 $0.067。根据已验证的基准运行结果估算。'); - cy.get('@estimatedB200').should('have.text', '$0.067'); + .should('include', '约 $0.059。根据已验证的基准运行结果估算。'); + cy.get('@estimatedB200').should('have.text', '$0.059'); cy.get('@estimatedB200') .should('have.attr', 'href') .and('include', '/zh/inference?') @@ -958,7 +953,7 @@ describe('Overview page', () => { cy.get('[data-testid="overview-model-scenario"]').should('have.text', AGENTX_LABEL_ZH); cy.get( '[data-testid="overview-pair-value"][data-hardware="b200"] [data-testid="overview-cost-evidence-link"]', - ).should('have.text', '$0.072'); + ).should('have.text', '$0.064'); }); cy.contains('若某款芯片不支持 FP4 推测解码,则采用次优的可用配置。').should('exist'); diff --git a/packages/app/src/app/compare-per-dollar/[slug]/page-client.tsx b/packages/app/src/app/compare-per-dollar/[slug]/page-client.tsx index d30ce141a..2d8135bc5 100644 --- a/packages/app/src/app/compare-per-dollar/[slug]/page-client.tsx +++ b/packages/app/src/app/compare-per-dollar/[slug]/page-client.tsx @@ -214,7 +214,7 @@ export default function ComparePerDollarPageClient({ className="underline hover:text-primary" onClick={() => track('compare_per_dollar_tco_source_clicked', { slug })} > - SemiAnalysis Market August 2025 Pricing Surveys & AI Cloud TCO Model + SemiAnalysis Market July 2026 Pricing Surveys & AI Cloud TCO Model .

diff --git a/packages/app/src/components/calculator/FleetPlanner.tsx b/packages/app/src/components/calculator/FleetPlanner.tsx index e1d38cd14..017072583 100644 --- a/packages/app/src/components/calculator/FleetPlanner.tsx +++ b/packages/app/src/components/calculator/FleetPlanner.tsx @@ -399,7 +399,7 @@ export default function FleetPlanner({ className="underline hover:text-foreground" href="https://semianalysis.com/ai-cloud-tco-model/" > - SemiAnalysis Market August 2025 Pricing Surveys & AI Cloud TCO Model + SemiAnalysis Market July 2026 Pricing Surveys & AI Cloud TCO Model diff --git a/packages/app/src/components/calculator/ThroughputCalculatorDisplay.tsx b/packages/app/src/components/calculator/ThroughputCalculatorDisplay.tsx index 3002cefb7..8d759c6be 100644 --- a/packages/app/src/components/calculator/ThroughputCalculatorDisplay.tsx +++ b/packages/app/src/components/calculator/ThroughputCalculatorDisplay.tsx @@ -1140,7 +1140,7 @@ function ThroughputCalculatorInner({ initialPercentile }: { initialPercentile: P className="underline hover:text-foreground" href="https://semianalysis.com/ai-cloud-tco-model/" > - SemiAnalysis Market August 2025 Pricing Surveys & AI Cloud TCO Model + SemiAnalysis Market July 2026 Pricing Surveys & AI Cloud TCO Model diff --git a/packages/app/src/components/overview/overview-scorecard.tsx b/packages/app/src/components/overview/overview-scorecard.tsx index 4bcb4318f..c4bdba294 100644 --- a/packages/app/src/components/overview/overview-scorecard.tsx +++ b/packages/app/src/components/overview/overview-scorecard.tsx @@ -26,7 +26,7 @@ export const OVERVIEW_STRINGS = { // The unit is dropped from the visible line but kept for screen readers. scopeAria: 'Hyperscaler cost per one million total tokens. Lower is better.', sourcePrefix: 'Source: InferenceX & ', - sourceLinkText: 'SemiAnalysis Market August 2025 AI Cloud TCO Model', + sourceLinkText: 'SemiAnalysis Market July 2026 AI Cloud TCO Model', tierNavLabel: 'SLO', tierUnit: 'tok/s/user', engineScopeNavLabel: 'Engine scope', @@ -73,7 +73,7 @@ export const OVERVIEW_STRINGS = { scopeDirection: '↓ 越低越好', scopeAria: '超大规模云(hyperscaler)每百万总 token 成本,越低越好。', sourcePrefix: '来源:InferenceX 与 ', - sourceLinkText: 'SemiAnalysis Market August 2025 AI Cloud TCO Model', + sourceLinkText: 'SemiAnalysis Market July 2026 AI Cloud TCO Model', tierNavLabel: 'SLO', tierUnit: 'tok/s/用户', engineScopeNavLabel: '引擎范围', diff --git a/packages/app/src/components/ui/chart-display-helpers.test.tsx b/packages/app/src/components/ui/chart-display-helpers.test.tsx index f78b570a3..d0ed8f874 100644 --- a/packages/app/src/components/ui/chart-display-helpers.test.tsx +++ b/packages/app/src/components/ui/chart-display-helpers.test.tsx @@ -85,7 +85,7 @@ describe('MetricAssumptionNotes', () => { expect(getVisibleText()).toContain('TCO $/GPU/hr:'); expect(getVisibleText()).toContain( - 'SemiAnalysis Market August 2025 Pricing Surveys & AI Cloud TCO Model', + 'SemiAnalysis Market July 2026 Pricing Surveys & AI Cloud TCO Model', ); expect(getVisibleCaveatText()).toContain('calculate cost per decode GPU or per prefill GPU'); }); diff --git a/packages/app/src/components/ui/chart-display-helpers.tsx b/packages/app/src/components/ui/chart-display-helpers.tsx index 5c7d97c4c..f4456824b 100644 --- a/packages/app/src/components/ui/chart-display-helpers.tsx +++ b/packages/app/src/components/ui/chart-display-helpers.tsx @@ -182,7 +182,7 @@ export function MetricAssumptionNotes({ <> - SemiAnalysis Market August 2025 Pricing Surveys & AI Cloud TCO Model + SemiAnalysis Market July 2026 Pricing Surveys & AI Cloud TCO Model )} diff --git a/packages/app/src/lib/constants.test.ts b/packages/app/src/lib/constants.test.ts index 6f32b6b63..70de84dc1 100644 --- a/packages/app/src/lib/constants.test.ts +++ b/packages/app/src/lib/constants.test.ts @@ -188,6 +188,24 @@ describe('getHardwareConfig', () => { expect(entry.costr).toBeGreaterThanOrEqual(0); } }); + + it('uses the July 2026 TCO rates for modeled datacenter GPUs', () => { + const expectedRates = { + h100: [1.168, 1.5501205804741525, 1.78], + h200: [1.2174257813639555, 1.5918579041035947, 2.05], + b200: [1.7349236084834354, 2.0693175588620671, 2.6], + b300: [2.2550110908541448, 2.5151486614356386, 3], + gb200: [1.8648110244453284, 2.263552701012252, 2.6], + gb300: [2.313899859674561, 2.7890137161029926, 3.3], + mi300x: [0.9535220083742874, 1.1567197344221469, 1.3], + mi325x: [1.0998080408523334, 1.3234578915100057, 1.6], + mi355x: [1.4960710469526235, 2.089023971578409, 2.1], + } as const; + + for (const [gpu, [costh, costn, costr]] of Object.entries(expectedRates)) { + expect(HW_REGISTRY[gpu]).toMatchObject({ costh, costn, costr }); + } + }); }); // =========================================================================== @@ -197,9 +215,9 @@ describe('getGpuSpecs', () => { it('returns specs for a base GPU key', () => { const specs = getGpuSpecs('h100'); expect(specs.power).toBe(1.37); - expect(specs.costh).toBe(1.3); - expect(specs.costn).toBe(1.69); - expect(specs.costr).toBe(1.3); + expect(specs.costh).toBe(1.168); + expect(specs.costn).toBe(1.5501205804741525); + expect(specs.costr).toBe(1.78); }); it('extracts base from compound key (e.g. h100_vllm)', () => { @@ -210,7 +228,7 @@ describe('getGpuSpecs', () => { it('extracts base from dash-separated key (e.g. h200-dynamo-trt)', () => { const specs = getGpuSpecs('h200-dynamo-trt'); expect(specs.power).toBe(1.37); - expect(specs.costh).toBe(1.41); + expect(specs.costh).toBe(1.2174257813639555); }); it('returns zero specs for unknown GPU', () => { diff --git a/packages/app/src/lib/overview-data.test.ts b/packages/app/src/lib/overview-data.test.ts index 338b3fef7..5c95d55a5 100644 --- a/packages/app/src/lib/overview-data.test.ts +++ b/packages/app/src/lib/overview-data.test.ts @@ -18,6 +18,13 @@ import { let nextId = 1; +const JULY_2026_HYPERSCALER_TCO = { + b200: 1.7349236084834354, + gb200: 1.8648110244453284, + gb300: 2.313899859674561, + mi355x: 1.4960710469526235, +} as const; + // `output_tput_per_gpu` is deliberately a constant decoy on most rows: the // overview's cost basis is TOTAL tokens (`tput_per_gpu`), so any expectation // below would collapse to the 123 decoy if the code read output tokens. @@ -151,11 +158,17 @@ describe('overview engine scope and scenario selection', () => { }); it('prices from HW_REGISTRY costh — not the retail costr tier', () => { - // b200: costh 1.95 vs costr 2.90 — the two tiers disagree, so a costr + // b200: costh 1.7349 vs costr 2.60 — the two tiers disagree, so a costr // regression cannot pass this assertion. - expect(overviewCostPerMtok('b200', 7200)).toBeCloseTo(1_950_000 / (7200 * 3600), 9); - expect(overviewCostPerMtok('b200', 7200)).not.toBeCloseTo(2_900_000 / (7200 * 3600), 9); - expect(overviewCostPerMtok('mi355x', 9000)).toBeCloseTo(1_480_000 / (9000 * 3600), 9); + expect(overviewCostPerMtok('b200', 7200)).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.b200 * 1e6) / (7200 * 3600), + 9, + ); + expect(overviewCostPerMtok('b200', 7200)).not.toBeCloseTo(2_600_000 / (7200 * 3600), 9); + expect(overviewCostPerMtok('mi355x', 9000)).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.mi355x * 1e6) / (9000 * 3600), + 9, + ); expect(overviewCostPerMtok('b200', null)).toBeNull(); expect(overviewCostPerMtok('b200', 0)).toBeNull(); expect(overviewCostPerMtok('b200', -100)).toBeNull(); @@ -170,12 +183,22 @@ describe('overview engine scope and scenario selection', () => { const summary = buildOverviewModelSummary(Model.Qwen3_5, rows, 50, 'community'); const byHardware = Object.fromEntries(summary.platforms.map((p) => [p.hardware, p])); - // Expected $/GPU/hr from HW_REGISTRY costh — b200 1.95, mi355x 1.48, gb300 2.652. - expect(byHardware.b200.costPerMtok).toBeCloseTo(1_950_000 / (7200 * 3600), 6); + // Expected $/GPU/hr from HW_REGISTRY costh — b200 1.7349, mi355x 1.4961, + // gb300 2.3139. + expect(byHardware.b200.costPerMtok).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.b200 * 1e6) / (7200 * 3600), + 6, + ); expect(byHardware.b200.costVsB200Pct).toBeNull(); - expect(byHardware.mi355x.costPerMtok).toBeCloseTo(1_480_000 / (9000 * 3600), 6); + expect(byHardware.mi355x.costPerMtok).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.mi355x * 1e6) / (9000 * 3600), + 6, + ); expect(byHardware.mi355x.costVsB200Pct).toBeCloseTo( - 1_480_000 / (9000 * 3600) / (1_950_000 / (7200 * 3600)) - 1, + (JULY_2026_HYPERSCALER_TCO.mi355x * 1e6) / + (9000 * 3600) / + ((JULY_2026_HYPERSCALER_TCO.b200 * 1e6) / (7200 * 3600)) - + 1, 6, ); expect(byHardware.mi355x.costVsB200Pct).toBeLessThan(0); @@ -193,7 +216,10 @@ describe('overview engine scope and scenario selection', () => { ); const gb300 = summary.platforms.find((p) => p.hardware === 'gb300')!; - expect(gb300.costPerMtok).toBeCloseTo(2_652_000 / (9000 * 3600), 6); + expect(gb300.costPerMtok).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.gb300 * 1e6) / (9000 * 3600), + 6, + ); expect(gb300.costVsB200Pct).toBeNull(); expect(summary.platforms.find((p) => p.hardware === 'b200')?.costPerMtok).toBeNull(); }); @@ -283,7 +309,7 @@ describe('overview engine scope and scenario selection', () => { expect(b200.read.config?.framework).toBe('llmd-vllm'); expect(b200.read.value).toBe(9900); - expect(b200.costPerMtok).toBeCloseTo(1_950_000 / (9900 * 3600), 6); + expect(b200.costPerMtok).toBeCloseTo((JULY_2026_HYPERSCALER_TCO.b200 * 1e6) / (9900 * 3600), 6); }); it('builds one serving-series frontier across topology variants', () => { @@ -786,7 +812,10 @@ describe('overview platform selection', () => { boundary: 'interpolated', estimated: false, }); - expect(b200.costPerMtok).toBeCloseTo(1_950_000 / (10800 * 3600), 6); + expect(b200.costPerMtok).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.b200 * 1e6) / (10800 * 3600), + 6, + ); }); it('restricts AgentX points to the E2E frontier on total throughput', () => { @@ -971,14 +1000,20 @@ describe('assembleOverviewPageData over the overview-rows fixture', () => { const deepseek = page.models.find((m) => m.model === Model.DeepSeek_V4_Pro)!; const dsB300 = headlinePairOf(deepseek, 'b300-vs-b200')!; expect(dsB300.baseline.read.value).toBeCloseTo(8101.968); - expect(dsB300.baseline.costPerMtok).toBeCloseTo(1_950_000 / (8101.968 * 3600), 6); + expect(dsB300.baseline.costPerMtok).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.b200 * 1e6) / (8101.968 * 3600), + 6, + ); expect(dsB300.candidate.read.value).toBeNull(); expect(dsB300.candidate.costPerMtok).toBeNull(); expect(dsB300.candidate.missingReason).toBe('no_exact_at_tier'); const dsGb200 = headlinePairOf(deepseek, 'gb200-vs-b200')!; expect(dsGb200.candidate.precision).toBe(Precision.FP8); expect(dsGb200.candidate.read.value).toBe(5100); - expect(dsGb200.candidate.costPerMtok).toBeCloseTo(2_210_000 / (5100 * 3600), 6); + expect(dsGb200.candidate.costPerMtok).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.gb200 * 1e6) / (5100 * 3600), + 6, + ); expect(headlinePairOf(deepseek, 'mi355x-vs-b200')?.candidate.missingReason).toBe( 'no_exact_at_tier', ); @@ -995,13 +1030,22 @@ describe('assembleOverviewPageData over the overview-rows fixture', () => { )!; const dsxB200 = deepseekAgentx.platforms.find((p) => p.hardware === 'b200')!; expect(dsxB200.read.value).toBe(7500); - expect(dsxB200.costPerMtok).toBeCloseTo(1_950_000 / (7500 * 3600), 6); + expect(dsxB200.costPerMtok).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.b200 * 1e6) / (7500 * 3600), + 6, + ); // Distinct from this model's single-turn B200 read (8101.968), so a // regression that fed single-turn rows into this row would land there. expect(dsxB200.read.value).not.toBeCloseTo(8101.968, 3); const dsxMi355x = deepseekAgentx.platforms.find((p) => p.hardware === 'mi355x')!; expect(dsxMi355x.read.value).toBe(6000); - expect(dsxMi355x.costVsB200Pct).toBeCloseTo(1_480_000 / 6000 / (1_950_000 / 7500) - 1, 6); + expect(dsxMi355x.costVsB200Pct).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.mi355x * 1e6) / + 6000 / + ((JULY_2026_HYPERSCALER_TCO.b200 * 1e6) / 7500) - + 1, + 6, + ); expect( deepseekAgentx.platforms .filter((p) => ['b300', 'gb200', 'gb300'].includes(p.hardware)) @@ -1014,7 +1058,10 @@ describe('assembleOverviewPageData over the overview-rows fixture', () => { const mmGb300 = headlinePairOf(minimax, 'gb300-vs-b200')!; expect(mmGb300.baseline.missingReason).toBe('no_scenario_data'); expect(mmGb300.candidate.read.value).toBe(6510); - expect(mmGb300.candidate.costPerMtok).toBeCloseTo(2_652_000 / (6510 * 3600), 6); + expect(mmGb300.candidate.costPerMtok).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.gb300 * 1e6) / (6510 * 3600), + 6, + ); expect(mmGb300.candidate.costVsB200Pct).toBeNull(); // Qwen: MI355X independently falls back to FP8 while B200 and B300 use FP4. @@ -1022,11 +1069,17 @@ describe('assembleOverviewPageData over the overview-rows fixture', () => { const qwenMi = headlinePairOf(qwen, 'mi355x-vs-b200')!; expect(qwenMi.candidate.precision).toBe(Precision.FP8); expect(qwenMi.candidate.read.value).toBe(6688); - expect(qwenMi.candidate.costPerMtok).toBeCloseTo(1_480_000 / (6688 * 3600), 6); + expect(qwenMi.candidate.costPerMtok).toBeCloseTo( + (JULY_2026_HYPERSCALER_TCO.mi355x * 1e6) / (6688 * 3600), + 6, + ); expect(qwenMi.baseline.precision).toBe(Precision.FP4); expect(qwenMi.baseline.read.value).toBeCloseTo(6602.344); expect(qwenMi.candidate.costVsB200Pct).toBeCloseTo( - 1_480_000 / (6688 * 3600) / (1_950_000 / (6602.344 * 3600)) - 1, + (JULY_2026_HYPERSCALER_TCO.mi355x * 1e6) / + (6688 * 3600) / + ((JULY_2026_HYPERSCALER_TCO.b200 * 1e6) / (6602.344 * 3600)) - + 1, 6, ); const qwenB300 = headlinePairOf(qwen, 'b300-vs-b200')!; diff --git a/packages/constants/src/gpu-keys.ts b/packages/constants/src/gpu-keys.ts index 55175b19b..7e2a633c3 100644 --- a/packages/constants/src/gpu-keys.ts +++ b/packages/constants/src/gpu-keys.ts @@ -29,9 +29,9 @@ export const HW_REGISTRY: Record = { sort: 7, tdp: 700, power: 1.37, - costh: 1.3, - costn: 1.69, - costr: 1.3, + costh: 1.168, + costn: 1.5501205804741525, + costr: 1.78, }, h200: { vendor: 'NVIDIA', @@ -40,9 +40,9 @@ export const HW_REGISTRY: Record = { sort: 5, tdp: 700, power: 1.37, - costh: 1.41, - costn: 1.74, - costr: 1.6, + costh: 1.2174257813639555, + costn: 1.5918579041035947, + costr: 2.05, }, b200: { vendor: 'NVIDIA', @@ -51,11 +51,10 @@ export const HW_REGISTRY: Record = { sort: 3, tdp: 1000, power: 1.71, - costh: 1.95, - costn: 2.34, - costr: 2.9, + costh: 1.7349236084834354, + costn: 2.0693175588620671, + costr: 2.6, }, - // TODO: B300 pricing is temporary - using 1.2x B200 pricing until official pricing is available b300: { vendor: 'NVIDIA', arch: 'Blackwell', @@ -63,9 +62,9 @@ export const HW_REGISTRY: Record = { sort: 2, tdp: 1200, power: 1.9, - costh: 2.34, - costn: 2.808, - costr: 3.48, + costh: 2.2550110908541448, + costn: 2.5151486614356386, + costr: 3, }, gb200: { vendor: 'NVIDIA', @@ -74,11 +73,10 @@ export const HW_REGISTRY: Record = { sort: 1, tdp: 1200, power: 1.87, - costh: 2.21, - costn: 2.75, - costr: 3.3, + costh: 1.8648110244453284, + costn: 2.263552701012252, + costr: 2.6, }, - // TODO: GB300 pricing is temporary - using 1.2x GB200 pricing until official pricing is available gb300: { vendor: 'NVIDIA', arch: 'Blackwell', @@ -86,9 +84,9 @@ export const HW_REGISTRY: Record = { sort: 0, tdp: 1400, power: 2.12, - costh: 2.652, - costn: 3.3, - costr: 3.96, + costh: 2.313899859674561, + costn: 2.7890137161029926, + costr: 3.3, }, mi300x: { vendor: 'AMD', @@ -97,9 +95,9 @@ export const HW_REGISTRY: Record = { sort: 8, tdp: 750, power: 1.39, - costh: 1.12, - costn: 1.4, - costr: 1.55, + costh: 0.9535220083742874, + costn: 1.1567197344221469, + costr: 1.3, }, mi325x: { vendor: 'AMD', @@ -108,9 +106,9 @@ export const HW_REGISTRY: Record = { sort: 6, tdp: 1000, power: 1.69, - costh: 1.28, - costn: 1.59, - costr: 1.8, + costh: 1.0998080408523334, + costn: 1.3234578915100057, + costr: 1.6, }, mi355x: { vendor: 'AMD', @@ -119,8 +117,8 @@ export const HW_REGISTRY: Record = { sort: 4, tdp: 1400, power: 2.09, - costh: 1.48, - costn: 1.9, + costh: 1.4960710469526235, + costn: 2.089023971578409, costr: 2.1, }, // NVIDIA RTX PRO 6000 Blackwell Server Edition (GB202, PCIe Gen5, 96 GB GDDR7).