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).