diff --git a/packages/app/content/blog/kimi-k3-the-manos-the-mythos-the.mdx b/packages/app/content/blog/kimi-k3-the-manos-the-mythos-the.mdx index 43e244de7..f4d11a898 100644 --- a/packages/app/content/blog/kimi-k3-the-manos-the-mythos-the.mdx +++ b/packages/app/content/blog/kimi-k3-the-manos-the-mythos-the.mdx @@ -686,7 +686,7 @@ This benchmark is a big step up from our previous 8k1k/1k1k benchmark, as it tru
For Kimi K3, Day 0 bringup was easier than DSv4 due to better documentation and preparation ahead of weights release. Appropriate images and a speculative decoder model were released at the same time as the weights. diff --git a/packages/app/content/blog/ultra-high-interactivity-on-nvidia.mdx b/packages/app/content/blog/ultra-high-interactivity-on-nvidia.mdx index ef532f0e5..b6f9f3ef6 100644 --- a/packages/app/content/blog/ultra-high-interactivity-on-nvidia.mdx +++ b/packages/app/content/blog/ultra-high-interactivity-on-nvidia.mdx @@ -3,6 +3,7 @@ title: 'Ultra-High Interactivity on NVIDIA GPUs? TileRT on InferenceX' subtitle: 'Can TileRT software on NVIDIA GPUs compete with Cerebras, Groq LPU, and SambaNova? Batch size 1, disaggregated engine, high-throughput prefill engine, high-interactivity decode engine' date: '2026-08-10' publishDate: '2026-08-10' +modifiedDate: '2026-08-18' tags: - benchmark - gpu @@ -13,6 +14,8 @@ tags: - tilert - vllm - glm5 + - agentx + - agentic --- _Originally published on the [SemiAnalysis newsletter](https://newsletter.semianalysis.com/p/ultra-high-interactivity-on-nvidia) on August 10, 2026._ @@ -235,9 +238,9 @@ Work is being done to simplify this, especially as software development can be a AI coding agents accelerate tuning within known templates, but novel transformations still require expert judgment. A monolithic persistent kernel also reduces the usefulness of conventional per-kernel profiler timelines, making automated feedback loops more difficult. -## Next steps with TileRT and InferenceX +## Next steps with TileRT -We are actively working on moving TileRT benchmarking from InferenceX's single-turn 8k/1k to our new agentic coding benchmark, which we call AgentX. This scenario replays real Claude Code and Codex traces with long-context, multi-turn requests, realistic subagent activity, and dynamic tool-use delays. Its median input length is 140k tokens, while the theoretical median cache-hit rate roofline reaches 99.2%. +AgentX, InferenceX's long-context, multi-turn coding scenario, is now live for supported models and serving stacks. It replays privacy-preserving workload shapes derived from real Claude Code and Codex sessions, with long-context, multi-turn requests, realistic subagent activity, and dynamic tool-use delays. Its median input length is 140k tokens, while the theoretical median cache-hit rate roofline reaches 99.2%. Extending TileRT benchmarking from its current single-turn 8k/1k workload to AgentX remains the next step for this serving stack.
对 Kimi K3 来说,Day 0 的 bringup 比 DSv4 更轻松,因为权重发布前的文档和准备工作更充分。合适的镜像和投机解码模型与权重同时发布。 diff --git a/packages/app/content/blog/zh/ultra-high-interactivity-on-nvidia.mdx b/packages/app/content/blog/zh/ultra-high-interactivity-on-nvidia.mdx index 041ee64b3..37e499e17 100644 --- a/packages/app/content/blog/zh/ultra-high-interactivity-on-nvidia.mdx +++ b/packages/app/content/blog/zh/ultra-high-interactivity-on-nvidia.mdx @@ -3,6 +3,7 @@ title: '在 NVIDIA GPU 上实现超高交互性?TileRT 登陆 InferenceX' subtitle: '运行在 NVIDIA GPU 上的 TileRT 软件能否与 Cerebras、Groq LPU、SambaNova 竞争?批大小为 1、分离式引擎、高吞吐量预填充引擎、高交互性解码引擎' date: '2026-08-10' publishDate: '2026-08-10' +modifiedDate: '2026-08-18' tags: - benchmark - gpu @@ -13,6 +14,8 @@ tags: - tilert - vllm - glm5 + - agentx + - agentic --- _本文最初于 2026 年 8 月 10 日发布在 [SemiAnalysis 通讯](https://newsletter.semianalysis.com/p/ultra-high-interactivity-on-nvidia)。_ @@ -235,9 +238,9 @@ TileRT 继承了 ASIC 厂商最大的弱点。静态提前编译意味着模型 AI 编码智能体能在已知模板内加速调优,但新颖的变换仍需专家判断。此外,单体式持久化 kernel 也削弱了传统逐 kernel 性能剖析时间线的作用,使自动化反馈闭环更加困难。 -## TileRT 与 InferenceX 的下一步 +## TileRT 的下一步 -我们正在积极推进,将 TileRT 的基准测试从 InferenceX 的单轮 8k/1k 场景扩展到我们新的智能体编码基准——AgentX。该场景回放真实的 Claude Code 与 Codex 轨迹,包含长上下文、多轮请求、真实的子智能体活动与动态工具调用延迟。其输入长度中位数为 140k tokens,理论缓存命中率中位数屋顶线可达 99.2%。 +InferenceX 的长上下文多轮编码场景 AgentX 现已在具备对应数据的模型与服务栈上正式上线。它回放从真实 Claude Code 与 Codex 会话衍生出的隐私保护工作负载形态,包含长上下文、多轮请求、真实的 subagent 活动与动态工具调用延迟。其输入长度中位数为 140k tokens,理论缓存命中率中位数屋顶线可达 99.2%。对 TileRT 而言,下一步仍是将目前的单轮 8k/1k 基准测试扩展到 AgentX。
{ .should('not.contain.text', 'Agentic'); }); - it('explains the agentic workload in a tooltip that links to /datasets', () => { + it('explains the agentic workload in a tooltip that links to /agentx', () => { cy.mount(); cy.get('[data-testid="scenario-agentic-info"]').trigger('pointermove', { pointerType: 'mouse', @@ -151,7 +151,7 @@ describe('Chart Selectors', () => { ); cy.get('[data-testid="scenario-agentic-info-link"]') .should('be.visible') - .and('have.attr', 'href', '/datasets'); + .and('have.attr', 'href', '/agentx'); }); it('hides the agentic explainer on fixed-sequence scenarios', () => { diff --git a/packages/app/cypress/component/dataset-list.cy.tsx b/packages/app/cypress/component/dataset-list.cy.tsx index ac2e5e611..bdbffe026 100644 --- a/packages/app/cypress/component/dataset-list.cy.tsx +++ b/packages/app/cypress/component/dataset-list.cy.tsx @@ -75,7 +75,7 @@ describe('DatasetList', () => { cy.contains('cc-traces-weka (256k)').should('be.visible'); cy.contains('1,234').should('be.visible'); // conversation_count, localized cy.contains('82%').should('be.visible'); // cachedPct - cy.get('a[href="/datasets/cc-traces-weka-full"]').should('exist'); + cy.get('a[href="/agentx/cc-traces-weka-full"]').should('exist'); }); it('shows the empty state when no datasets are ingested', () => { diff --git a/packages/app/cypress/component/footer.cy.tsx b/packages/app/cypress/component/footer.cy.tsx index 6e7916779..99b84e5df 100644 --- a/packages/app/cypress/component/footer.cy.tsx +++ b/packages/app/cypress/component/footer.cy.tsx @@ -58,9 +58,9 @@ describe('Footer', () => { cy.get('[data-testid="footer-link-supporters"]') .should('contain.text', 'Supporters') .and('have.attr', 'href', '/quotes'); - cy.get('[data-testid="footer-link-datasets"]') - .should('contain.text', 'Datasets') - .and('have.attr', 'href', '/datasets'); + cy.get('[data-testid="footer-link-agentx"]') + .should('contain.text', 'AgentX') + .and('have.attr', 'href', '/agentx'); cy.get('[data-testid="footer-link-articles"]') .should('contain.text', 'Articles') .and('have.attr', 'href', '/blog'); diff --git a/packages/app/cypress/component/header.cy.tsx b/packages/app/cypress/component/header.cy.tsx index 4d0d560e4..0e3bc77a8 100644 --- a/packages/app/cypress/component/header.cy.tsx +++ b/packages/app/cypress/component/header.cy.tsx @@ -105,22 +105,27 @@ describe('Header', () => { cy.get('[data-testid="nav-link-compare"]').should('have.attr', 'href', '/compare'); }); - it('shows Datasets as a top-level nav link and highlights dataset child pages', () => { - cy.get('[data-testid="nav-link-datasets"]') + it('shows AgentX as a top-level nav link and highlights AgentX child pages', () => { + cy.get('[data-testid="nav-link-agentx"]') .should('be.visible') - .and('have.attr', 'href', '/datasets'); + .and('have.attr', 'href', '/agentx') + .find('[data-nav-badge="agentx"]') + .should('have.text', 'NEW'); - mountHeader('/datasets/claude-code-traces'); - cy.get('[data-testid="nav-link-datasets"]').should('have.class', 'text-brand'); + mountHeader('/agentx/claude-code-traces'); + cy.get('[data-testid="nav-link-agentx"]').should('have.class', 'text-brand'); }); - it('keeps Datasets in the Chinese navigation tree', () => { - mountHeader('/zh/datasets'); - cy.get('[data-testid="nav-link-datasets"]') + it('keeps AgentX in the Chinese navigation tree', () => { + mountHeader('/zh/agentx'); + cy.get('[data-testid="nav-link-agentx"]') .should('be.visible') - .and('contain.text', '数据集') - .and('have.attr', 'href', '/zh/datasets') + .and('contain.text', 'AgentX') + .and('have.attr', 'href', '/zh/agentx') .and('have.class', 'text-brand'); + cy.get('[data-testid="nav-link-agentx"]') + .find('[data-nav-badge="agentx"]') + .should('have.text', '新'); }); it('keeps footer destinations out of the primary nav', () => { @@ -151,7 +156,11 @@ describe('Header', () => { cy.contains('a', 'Overview').should('be.visible').and('have.attr', 'href', '/overview'); cy.contains('a', 'Dashboard').should('be.visible').and('have.attr', 'href', '/inference'); cy.contains('a', 'Comparisons').should('be.visible').and('have.attr', 'href', '/compare'); - cy.contains('a', 'Datasets').should('be.visible').and('have.attr', 'href', '/datasets'); + cy.contains('a', 'AgentX') + .should('be.visible') + .and('have.attr', 'href', '/agentx') + .find('[data-nav-badge="agentx"]') + .should('have.text', 'NEW'); cy.contains('a', 'Supporters').should('not.exist'); cy.contains('a', 'Articles').should('not.exist'); }); @@ -167,8 +176,27 @@ describe('Header', () => { cy.wrap(mockRouter.push).should('have.been.calledTwice'); }); - it('keeps every primary link inside the header at the desktop breakpoint', () => { - cy.viewport(1024, 720); + it('uses the hamburger without horizontal overflow from 1009 through 1024 CSS pixels', () => { + [1009, 1012, 1020, 1024].forEach((width) => { + cy.viewport(width, 720); + cy.get('[data-testid="nav-link-dashboard"]').should('not.be.visible'); + cy.get('[data-testid="mobile-menu-toggle"]').should('be.visible'); + cy.document().then((doc) => { + expect(doc.documentElement.scrollWidth, `${width}px document scrollWidth`).to.be.at.most( + doc.documentElement.clientWidth, + ); + }); + cy.get('[data-testid="header"]').then(($header) => { + const header = $header[0]; + expect(header.scrollWidth, `${width}px header scrollWidth`).to.be.at.most( + header.clientWidth, + ); + }); + }); + }); + + it('keeps every primary link inside the header at the xl desktop breakpoint', () => { + cy.viewport(1280, 720); cy.get('[data-testid="header"]').then(($header) => { const header = $header[0]; const bounds = header.getBoundingClientRect(); @@ -237,7 +265,7 @@ describe('Header', () => { cy.get('[data-testid="mobile-menu-toggle"]').click(); cy.get('[data-testid="mobile-menu"]').should('be.visible'); cy.get('[data-testid="mobile-menu"]').within(() => { - ['Home', 'Overview', 'Dashboard', 'Comparisons', 'Datasets', 'About'].forEach((label) => { + ['Home', 'Overview', 'Dashboard', 'Comparisons', 'AgentX', 'About'].forEach((label) => { cy.contains('a', label).should('be.visible'); }); ['Supporters', 'Articles'].forEach((label) => { diff --git a/packages/app/cypress/e2e/agentic-point-time-series.cy.ts b/packages/app/cypress/e2e/agentic-point-time-series.cy.ts index 7a2600e82..e46e9e87c 100644 --- a/packages/app/cypress/e2e/agentic-point-time-series.cy.ts +++ b/packages/app/cypress/e2e/agentic-point-time-series.cy.ts @@ -235,7 +235,7 @@ describe('Agentic point request metric time series', () => { it('restores the request timeline view after browser Back from a dataset route', () => { cy.window().then((win) => { - win.history.pushState({}, '', '/datasets/test-dataset/conversations/conversation-1'); + win.history.pushState({}, '', '/agentx/test-dataset/conversations/conversation-1'); }); cy.go('back'); cy.location('pathname').should('eq', '/inference/agentic/206885'); diff --git a/packages/app/cypress/e2e/datasets-distributions.cy.ts b/packages/app/cypress/e2e/datasets-distributions.cy.ts index 0d2a7789a..c1e77cfb5 100644 --- a/packages/app/cypress/e2e/datasets-distributions.cy.ts +++ b/packages/app/cypress/e2e/datasets-distributions.cy.ts @@ -87,7 +87,7 @@ describe('Dataset distribution percentiles', () => { cy.intercept('GET', '/api/v1/datasets/test-dataset/conversations*', { body: { total: 0, items: [] }, }); - cy.visit('/datasets/test-dataset', { onBeforeLoad: unlockAgenticGate }); + cy.visit('/agentx/test-dataset', { onBeforeLoad: unlockAgenticGate }); }); it('shows P50/P75/P90/P95 for ISL, OSL, and uncached input', () => { diff --git a/packages/app/cypress/e2e/datasets-flamegraph-time.cy.ts b/packages/app/cypress/e2e/datasets-flamegraph-time.cy.ts index bdb1adfc0..5a4e8df22 100644 --- a/packages/app/cypress/e2e/datasets-flamegraph-time.cy.ts +++ b/packages/app/cypress/e2e/datasets-flamegraph-time.cy.ts @@ -95,7 +95,7 @@ describe('Dataset conversation flamegraph timing', () => { }, }, }); - cy.visit('/datasets/test-dataset/conversations/conversation-1', { + cy.visit('/agentx/test-dataset/conversations/conversation-1', { onBeforeLoad: unlockAgenticGate, }); }); diff --git a/packages/app/cypress/e2e/datasets-methodology.cy.ts b/packages/app/cypress/e2e/datasets-methodology.cy.ts new file mode 100644 index 000000000..c48872af4 --- /dev/null +++ b/packages/app/cypress/e2e/datasets-methodology.cy.ts @@ -0,0 +1,121 @@ +import { unlockAgenticGate } from '../support/e2e'; + +describe('AgentX dataset methodology', () => { + beforeEach(() => { + cy.intercept('GET', '/api/v1/datasets', { statusCode: 200, body: [] }); + }); + + it('explains the source, replay sequence, controls, and interpretation in English', () => { + cy.visit('/agentx', { onBeforeLoad: unlockAgenticGate }); + + cy.get('[data-testid="agentx-methodology"]').within(() => { + cy.get('h1').should('have.text', 'AgentX Benchmark Datasets'); + cy.get('[data-testid="agentx-methodology-step"]').should('have.length', 4); + cy.get('[data-testid="agentx-methodology-step"] h3').then(($headings) => { + expect([...$headings].map((heading) => heading.textContent)).to.deep.equal([ + 'Capture', + 'Transform', + 'Reconstruct', + 'Replay and measure', + ]); + }); + cy.contains('393 Claude Code sessions').should('be.visible'); + cy.contains('Claude Code 2.1.139 or newer').should('be.visible'); + cy.contains('SPEED-Bench').should('be.visible'); + cy.contains('Its synthetic payloads do not support model-quality evaluation.').should( + 'be.visible', + ); + cy.get('[data-testid="agentx-methodology-cta"]') + .should('contain.text', 'Read the full methodology') + .and('have.attr', 'href', '/agentx/methodology'); + }); + }); + + it('ships the same methodology on the Simplified Chinese page', () => { + cy.visit('/zh/agentx', { onBeforeLoad: unlockAgenticGate }); + + cy.get('[data-testid="agentx-methodology"]').within(() => { + cy.get('h1').should('have.text', 'AgentX 基准测试数据集'); + cy.get('[data-testid="agentx-methodology-step"]').should('have.length', 4); + cy.contains('AgentX 如何构建一次回放').should('be.visible'); + cy.contains('回放控制').should('be.visible'); + cy.contains('合成 payload 不适合评估模型回答质量').should('be.visible'); + cy.get('[data-testid="agentx-methodology-cta"]') + .should('contain.text', '深入了解 AgentX 方法论') + .and('have.attr', 'href', '/zh/agentx/methodology'); + }); + }); + + it('publishes the full English methodology with sourced figures and locale pairing', () => { + cy.visit('/agentx/methodology', { onBeforeLoad: unlockAgenticGate }); + + cy.get('[data-testid="agentx-methodology-article"]').within(() => { + cy.get('h1').should('have.text', 'AgentX Methodology'); + cy.contains('393 sessions built on June 21, 2026').should('be.visible'); + cy.contains('directed acyclic graph (DAG)').should('be.visible'); + cy.contains('following one-hour profiling window').should('be.visible'); + cy.contains('capped at 3 TB').should('be.visible'); + cy.get('figure[data-testid^="agentx-methodology-figure-"]').should('have.length', 21); + cy.get('[data-testid="agentx-methodology-figure-corpus"]') + .should('contain.text', 'View full-resolution image') + .parent('a') + .should('have.attr', 'href', '/images/agentx-methodology/corpus-scale.png') + .and('have.attr', 'target', '_blank'); + cy.get('[data-testid="agentx-methodology-figure-corpus"] img') + .invoke('attr', 'src') + .should('include', 'q=100'); + [ + 'requestDistributions256k', + 'subagentDistributions256k', + 'replayJoined', + 'replayFlatspawn', + 'replaySidecars', + ].forEach((figure) => { + cy.get(`[data-testid="agentx-methodology-figure-${figure}"] img`) + .should('be.visible') + .invoke('attr', 'alt') + .should('not.be.empty'); + }); + cy.get('a[href="https://arxiv.org/abs/2604.09557"]').should('exist'); + cy.contains('mostly vibe coded').should('not.exist'); + cy.contains('Distillation is bad').should('not.exist'); + }); + + cy.get('[data-testid="language-toggle"]').should('have.attr', 'href', '/zh/agentx/methodology'); + cy.get('link[rel="alternate"][hreflang="en"]').should('exist'); + cy.get('link[rel="alternate"][hreflang="zh-CN"]').should('exist'); + }); + + it('publishes the natural Simplified Chinese methodology sibling', () => { + cy.visit('/zh/agentx/methodology', { onBeforeLoad: unlockAgenticGate }); + + cy.get('[data-testid="agentx-methodology-article"]').within(() => { + cy.get('h1').should('have.text', 'AgentX 方法论'); + cy.contains('2026 年 6 月 21 日构建').should('be.visible'); + cy.contains('有向无环图(DAG)').should('be.visible'); + cy.contains('上限为 3 TB').should('be.visible'); + cy.get('figure[data-testid^="agentx-methodology-figure-"]').should('have.length', 21); + cy.get('[data-testid="agentx-methodology-figure-corpus"]') + .should('contain.text', '查看原始分辨率图片') + .parent('a') + .should('have.attr', 'href', '/images/agentx-methodology/corpus-scale.png'); + }); + + cy.get('[data-testid="language-toggle"]').should('have.attr', 'href', '/agentx/methodology'); + }); + + it('permanently redirects legacy dataset routes without dropping path or query', () => { + cy.request({ + url: '/datasets/test-set/conversations/abc?turn=3', + followRedirect: false, + }).then((response) => { + expect(response.status).to.eq(308); + expect(response.headers.location).to.eq('/agentx/test-set/conversations/abc?turn=3'); + }); + + cy.request({ url: '/zh/datasets', followRedirect: false }).then((response) => { + expect(response.status).to.eq(308); + expect(response.headers.location).to.eq('/zh/agentx'); + }); + }); +}); diff --git a/packages/app/cypress/e2e/landing-performance.cy.ts b/packages/app/cypress/e2e/landing-performance.cy.ts index ed580a3d4..209284f83 100644 --- a/packages/app/cypress/e2e/landing-performance.cy.ts +++ b/packages/app/cypress/e2e/landing-performance.cy.ts @@ -58,8 +58,8 @@ describe('Landing page performance', () => { cy.visit('/', { onBeforeLoad(win) { - win.localStorage.removeItem('inferencex-kimi-k3-modal-dismissed'); - win.localStorage.removeItem('inferencex-kimi-k3-banner-dismissed'); + win.localStorage.removeItem('inferencex-agentic-results-modal-dismissed'); + win.localStorage.removeItem('inferencex-agentic-results-banner-dismissed'); observeLayoutShifts(win); }, }); @@ -77,7 +77,7 @@ describe('Landing page performance', () => { cy.viewport(412, 823); cy.visit('/', { onBeforeLoad(win) { - win.localStorage.setItem('inferencex-kimi-k3-banner-dismissed', '1'); + win.localStorage.setItem('inferencex-agentic-results-banner-dismissed', '1'); observeLayoutShifts(win); }, }); diff --git a/packages/app/cypress/e2e/navigation.cy.ts b/packages/app/cypress/e2e/navigation.cy.ts index 4f31b6e29..a20b53cea 100644 --- a/packages/app/cypress/e2e/navigation.cy.ts +++ b/packages/app/cypress/e2e/navigation.cy.ts @@ -47,8 +47,8 @@ describe('First-load navigation', () => { onBeforeLoad(win) { win.localStorage.removeItem('inferencex-starred'); win.localStorage.removeItem('inferencex-star-modal-dismissed'); - win.localStorage.removeItem('inferencex-kimi-k3-modal-dismissed'); - win.localStorage.removeItem('inferencex-kimi-k3-banner-dismissed'); + win.localStorage.removeItem('inferencex-agentic-results-modal-dismissed'); + win.localStorage.removeItem('inferencex-agentic-results-banner-dismissed'); }, }); @@ -77,9 +77,14 @@ describe('First-load navigation', () => { cy.location('pathname').should('eq', '/compare'); }); - it('navigates to datasets from the header with one click', () => { - cy.get('[data-testid="nav-link-datasets"]').should('have.attr', 'href', '/datasets').click(); - cy.location('pathname').should('eq', '/datasets'); + it('navigates to AgentX from the header with one click', () => { + cy.get('[data-testid="nav-link-agentx"]') + .should('have.attr', 'href', '/agentx') + .find('[data-nav-badge="agentx"]') + .should('be.visible') + .and('have.text', 'NEW'); + cy.get('[data-testid="nav-link-agentx"]').click(); + cy.location('pathname').should('eq', '/agentx'); }); it('navigates to overview and the full dashboard from the landing CTAs', () => { diff --git a/packages/app/cypress/e2e/nudge-system.cy.ts b/packages/app/cypress/e2e/nudge-system.cy.ts index a6d4fe031..8b7ea5308 100644 --- a/packages/app/cypress/e2e/nudge-system.cy.ts +++ b/packages/app/cypress/e2e/nudge-system.cy.ts @@ -14,8 +14,8 @@ function clearAllNudgeStorage(win: Cypress.AUTWindow) { const keys = [ 'inferencex-starred', 'inferencex-star-modal-dismissed', - 'inferencex-kimi-k3-modal-dismissed', - 'inferencex-kimi-k3-banner-dismissed', + 'inferencex-agentic-results-modal-dismissed', + 'inferencex-agentic-results-banner-dismissed', 'inferencex-reproducibility-nudge-shown', 'inferencex-star-nudge-shown', 'inferencex-export-nudge-shown', @@ -48,14 +48,75 @@ describe('Landing nudges — modals', () => { onBeforeLoad: clearAllNudgeStorage, }); // Banner (inline) and modal (overlay) occupy independent slots - cy.get('[data-testid="launch-banner"]').should('be.visible'); + cy.get('[data-testid="launch-banner"]') + .should('be.visible') + .and('contain.text', 'Agentic benchmark results are live') + .and('contain.text', 'View results'); cy.get('[data-testid="launch-modal"]') .should('be.visible') + .and('contain.text', 'Real-world agentic inference benchmark results are live') + .and('contain.text', 'Kimi K3, DeepSeek-V4-Pro, MiniMax-M3, Qwen3.5 397B, and GLM-5.2') + .and('contain.text', 'View results') .and('match', 'div[role="dialog"][aria-modal="false"]'); + cy.get('[data-new-badge]') + .should('have.length', 3) + .then(($badges) => { + const sizes = [...$badges].map((badge) => { + const rect = badge.getBoundingClientRect(); + return { width: rect.width, height: rect.height }; + }); + for (const size of sizes) { + expect(size.width).to.eq(sizes[0].width); + expect(size.height).to.eq(sizes[0].height); + } + expect(sizes[0]).to.deep.eq({ width: 32, height: 16 }); + + for (const badge of $badges) { + const label = badge.querySelector('[data-new-badge-label]'); + expect(label, 'badge label').not.to.eq(null); + + const badgeRect = badge.getBoundingClientRect(); + const labelRect = label!.getBoundingClientRect(); + const horizontalOffset = + labelRect.left + labelRect.width / 2 - (badgeRect.left + badgeRect.width / 2); + const verticalOffset = + labelRect.top + labelRect.height / 2 - (badgeRect.top + badgeRect.height / 2); + + expect(horizontalOffset).to.be.closeTo(0, 0.1); + expect(verticalOffset).to.eq(0); + + // The label box can sit dead centre while the glyphs themselves spill + // out of it, so measure the rendered text and not just its container. + const range = badge.ownerDocument.createRange(); + range.selectNodeContents(label!); + const inkRect = range.getBoundingClientRect(); + const inkOffset = + inkRect.left + inkRect.width / 2 - (badgeRect.left + badgeRect.width / 2); + + expect(inkRect.left, 'label ink stays inside the pill').to.be.at.least(badgeRect.left); + expect(inkRect.right, 'label ink stays inside the pill').to.be.at.most(badgeRect.right); + expect(inkOffset, 'label ink is centred').to.be.closeTo(0, 0.5); + } + }); // Only one overlay at a time — star modal should not appear cy.get('[data-testid="github-star-modal"]').should('not.exist'); }); + it('localizes the agentic benchmark launch title in Chinese', () => { + cy.visit('/zh', { + onBeforeLoad: clearAllNudgeStorage, + }); + cy.get('[data-testid="launch-banner"]') + .should('be.visible') + .and('contain.text', '智能体基准测试结果已上线') + .and('contain.text', '查看结果'); + cy.get('[data-testid="launch-modal"]') + .should('be.visible') + .and('contain.text', '真实场景智能体推理基准测试结果已上线') + .and('contain.text', 'Kimi K3、DeepSeek-V4-Pro、MiniMax-M3、Qwen3.5 397B 与 GLM-5.2') + .and('contain.text', '查看结果'); + }); + it('dismissing launch modal persists — not shown on reload', () => { cy.visit('/', { onBeforeLoad: clearAllNudgeStorage, @@ -68,19 +129,18 @@ describe('Landing nudges — modals', () => { cy.get('[data-testid="launch-modal"]').should('not.exist'); }); - it('launch modal Explore action persists dismissal in localStorage', () => { + it('launch modal View results action opens Agentic Traces and persists dismissal', () => { cy.visit('/', { onBeforeLoad: clearAllNudgeStorage, }); cy.get('[data-testid="launch-modal"]').should('be.visible'); - // The action writes localStorage synchronously before navigation. Check - // the storage value before the navigation completes; combined with the - // "Maybe Later" persists-across-reload test, this covers the explore - // path without needing to stub window.location. + // The action records engagement and opens the Agentic Traces results. cy.get('[data-testid="launch-modal-action"]').click(); + cy.location('pathname').should('eq', '/inference'); + cy.location('search').should('include', 'i_seq=agentic-traces'); cy.window().then((win) => { - expect(win.localStorage.getItem('inferencex-kimi-k3-modal-dismissed')).to.eq('1'); + expect(win.localStorage.getItem('inferencex-agentic-results-modal-dismissed')).to.eq('1'); }); }); @@ -88,7 +148,7 @@ describe('Landing nudges — modals', () => { cy.visit('/', { onBeforeLoad(win) { clearAllNudgeStorage(win); - win.localStorage.setItem('inferencex-kimi-k3-modal-dismissed', '1'); + win.localStorage.setItem('inferencex-agentic-results-modal-dismissed', '1'); }, }); cy.get('[data-testid="launch-modal"]').should('not.exist'); @@ -99,7 +159,7 @@ describe('Landing nudges — modals', () => { cy.visit('/', { onBeforeLoad(win) { clearAllNudgeStorage(win); - win.localStorage.setItem('inferencex-kimi-k3-modal-dismissed', '1'); + win.localStorage.setItem('inferencex-agentic-results-modal-dismissed', '1'); }, }); cy.get('[data-testid="github-star-modal"]').should('be.visible'); @@ -117,7 +177,7 @@ describe('Landing nudges — modals', () => { cy.visit('/', { onBeforeLoad(win) { clearAllNudgeStorage(win); - win.localStorage.setItem('inferencex-kimi-k3-modal-dismissed', '1'); + win.localStorage.setItem('inferencex-agentic-results-modal-dismissed', '1'); }, }); cy.get('[data-testid="github-star-modal"]').should('be.visible'); @@ -178,7 +238,7 @@ describe('Landing nudges — banner', () => { cy.get('[data-testid="launch-banner"]').should('be.visible'); cy.window().then((win) => { // Only the X button should persist a dismissal — show alone must not. - expect(win.localStorage.getItem('inferencex-kimi-k3-banner-dismissed')).to.eq(null); + expect(win.localStorage.getItem('inferencex-agentic-results-banner-dismissed')).to.eq(null); }); }); @@ -189,11 +249,12 @@ describe('Landing nudges — banner', () => { cy.get('[data-testid="launch-banner"]').should('be.visible'); cy.get('[data-testid="launch-banner"]').click(); cy.location('pathname', { timeout: 10000 }).should('eq', '/inference'); + cy.location('search').should('include', 'i_seq=agentic-traces'); // Body click must not write the dismissal key — the banner should still // render on a fresh visit to landing. cy.window().then((win) => { - expect(win.localStorage.getItem('inferencex-kimi-k3-banner-dismissed')).to.eq(null); + expect(win.localStorage.getItem('inferencex-agentic-results-banner-dismissed')).to.eq(null); }); cy.visit('/'); @@ -354,8 +415,8 @@ describe('Nudge scope isolation', () => { onBeforeLoad(win) { clearAllNudgeStorage(win); // Dismiss all landing nudges so nothing blocks visibility checks - win.localStorage.setItem('inferencex-kimi-k3-modal-dismissed', '1'); - win.localStorage.setItem('inferencex-kimi-k3-banner-dismissed', '1'); + win.localStorage.setItem('inferencex-agentic-results-modal-dismissed', '1'); + win.localStorage.setItem('inferencex-agentic-results-banner-dismissed', '1'); win.localStorage.setItem('inferencex-starred', '1'); }, }); diff --git a/packages/app/cypress/e2e/overview.cy.ts b/packages/app/cypress/e2e/overview.cy.ts index 776dc62f7..09be91781 100644 --- a/packages/app/cypress/e2e/overview.cy.ts +++ b/packages/app/cypress/e2e/overview.cy.ts @@ -27,8 +27,8 @@ const AGENTX_LABEL_ZH = '长上下文多轮真实智能体场景(AgentX)'; /** Shared by both locales: the scenario is named after its acronym. */ const AGENTX_SHORT = 'AgentX'; -const PAGE_TITLE = 'Inference Cost per Million Tokens'; -const PAGE_TITLE_ZH = '推理每百万 token 成本'; +const PAGE_TITLE = 'Agentic Inference Costs'; +const PAGE_TITLE_ZH = '智能体推理成本'; 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'; diff --git a/packages/app/cypress/e2e/zh-pages.cy.ts b/packages/app/cypress/e2e/zh-pages.cy.ts index a189e82ae..04f2979d2 100644 --- a/packages/app/cypress/e2e/zh-pages.cy.ts +++ b/packages/app/cypress/e2e/zh-pages.cy.ts @@ -5,6 +5,7 @@ describe('Chinese (/zh) pages', () => { }); it('renders the Chinese landing content', () => { + cy.get('[data-testid="intro-section"]').should('contain.text', '智能体推理基准测试'); cy.contains('h2', '探索 InferenceX').should('exist'); cy.contains('快速对比').should('exist'); }); @@ -27,20 +28,20 @@ describe('Chinese (/zh) pages', () => { cy.get('[data-testid="language-toggle"]').should('have.attr', 'href', '/'); }); - it('header links to the Chinese datasets page', () => { - cy.get('[data-testid="nav-link-datasets"]') - .should('contain.text', '数据集') - .and('have.attr', 'href', '/zh/datasets'); + it('header links to the Chinese AgentX page', () => { + cy.get('[data-testid="nav-link-agentx"]') + .should('contain.text', 'AgentX') + .and('have.attr', 'href', '/zh/agentx'); }); it('footer renders in Chinese with zh-internal links', () => { - cy.get('[data-testid="footer-brand-description"]').should('contain.text', '开源推理基准测试'); + cy.get('[data-testid="footer-brand-description"]').should('contain.text', '智能体推理'); cy.get('[data-testid="footer-link-supporters"]') .should('contain.text', '支持者') .and('have.attr', 'href', '/zh/quotes'); - cy.get('[data-testid="footer-link-datasets"]') - .should('contain.text', '数据集') - .and('have.attr', 'href', '/zh/datasets'); + cy.get('[data-testid="footer-link-agentx"]') + .should('contain.text', 'AgentX') + .and('have.attr', 'href', '/zh/agentx'); cy.get('[data-testid="footer-link-articles"]') .should('contain.text', '文章') .and('have.attr', 'href', '/zh/blog'); @@ -62,7 +63,8 @@ describe('Chinese (/zh) pages', () => { it('renders the Chinese SEO intro above the chart', () => { cy.get('[data-testid="zh-tab-intro"]').within(() => { - cy.contains('h1', 'AI 推理基准测试').should('exist'); + cy.contains('h1', '智能体推理基准测试').should('exist'); + cy.contains('长上下文、多轮').should('exist'); }); }); diff --git a/packages/app/cypress/support/e2e.ts b/packages/app/cypress/support/e2e.ts index 5f518e1a6..977dc2364 100644 --- a/packages/app/cypress/support/e2e.ts +++ b/packages/app/cypress/support/e2e.ts @@ -19,14 +19,14 @@ Cypress.on('window:before:load', (win) => { * Seed the shared feature-gate flag (the same localStorage key the ↑↑↓↓ konami * unlock writes — see use-feature-gate.ts). * - * The agentic surfaces (the "Agentic" scenario, /datasets, - * /inference/agentic/[id], and the Datasets nav link) are now PUBLIC by default + * The agentic surfaces (the "Agentic" scenario, /agentx, + * /inference/agentic/[id], and the AgentX nav link) are now PUBLIC by default * — they no longer sit behind this gate — so agentic specs no longer need it. * The helper is retained as a harmless no-op for those specs (and still unlocks * the remaining hidden features: the "Hidden" tab dropdown and Measured Energy). * * Call from a spec's `cy.visit(..., { onBeforeLoad })`: - * cy.visit('/datasets/x', { onBeforeLoad: unlockAgenticGate }); + * cy.visit('/agentx/x', { onBeforeLoad: unlockAgenticGate }); * or compose inside an existing hook: `unlockAgenticGate(win)`. */ export function unlockAgenticGate(win: Window): void { diff --git a/packages/app/next.config.ts b/packages/app/next.config.ts index b8445156c..bd96a0437 100644 --- a/packages/app/next.config.ts +++ b/packages/app/next.config.ts @@ -12,6 +12,20 @@ const nextConfig: NextConfig = { allowedDevOrigins: allowedDevOriginsFromEnv(), transpilePackages: ['@semianalysisai/inferencex-constants'], serverExternalPackages: ['shiki'], + redirects() { + return Promise.resolve([ + { + source: '/datasets/:path*', + destination: '/agentx/:path*', + permanent: true, + }, + { + source: '/zh/datasets/:path*', + destination: '/zh/agentx/:path*', + permanent: true, + }, + ]); + }, experimental: { optimizePackageImports: ['lucide-react', 'd3', '@tanstack/react-query'], // NOTE: experimental.inlineCss was evaluated (2026-07) for the PageSpeed @@ -26,6 +40,7 @@ const nextConfig: NextConfig = { ...(process.env.GITHUB_ACTIONS === 'true' && { turbopackFileSystemCacheForBuild: true }), }, images: { + qualities: [75, 100], remotePatterns: [ { hostname: 'placehold.co' }, { hostname: 'substack-post-media.s3.amazonaws.com' }, diff --git a/packages/app/public/images/agentx-methodology/corpus-scale.png b/packages/app/public/images/agentx-methodology/corpus-scale.png new file mode 100644 index 000000000..a526a6df4 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/corpus-scale.png differ diff --git a/packages/app/public/images/agentx-methodology/engine-acceptance-controls.png b/packages/app/public/images/agentx-methodology/engine-acceptance-controls.png new file mode 100644 index 000000000..0606f78b0 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/engine-acceptance-controls.png differ diff --git a/packages/app/public/images/agentx-methodology/golden-acceptance-length.png b/packages/app/public/images/agentx-methodology/golden-acceptance-length.png new file mode 100644 index 000000000..5e2893d73 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/golden-acceptance-length.png differ diff --git a/packages/app/public/images/agentx-methodology/hash-token-ratio.png b/packages/app/public/images/agentx-methodology/hash-token-ratio.png new file mode 100644 index 000000000..1730ca439 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/hash-token-ratio.png differ diff --git a/packages/app/public/images/agentx-methodology/pareto-b200-minimax-m3.png b/packages/app/public/images/agentx-methodology/pareto-b200-minimax-m3.png new file mode 100644 index 000000000..dd8158824 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/pareto-b200-minimax-m3.png differ diff --git a/packages/app/public/images/agentx-methodology/profiling-cache-sources.png b/packages/app/public/images/agentx-methodology/profiling-cache-sources.png new file mode 100644 index 000000000..d3a3c49e1 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/profiling-cache-sources.png differ diff --git a/packages/app/public/images/agentx-methodology/replay-flatspawn.png b/packages/app/public/images/agentx-methodology/replay-flatspawn.png new file mode 100644 index 000000000..19e99a110 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/replay-flatspawn.png differ diff --git a/packages/app/public/images/agentx-methodology/replay-linear.png b/packages/app/public/images/agentx-methodology/replay-linear.png new file mode 100644 index 000000000..75ab6d5aa Binary files /dev/null and b/packages/app/public/images/agentx-methodology/replay-linear.png differ diff --git a/packages/app/public/images/agentx-methodology/replay-multi-subagent.png b/packages/app/public/images/agentx-methodology/replay-multi-subagent.png new file mode 100644 index 000000000..5e8072111 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/replay-multi-subagent.png differ diff --git a/packages/app/public/images/agentx-methodology/replay-single-subagent.png b/packages/app/public/images/agentx-methodology/replay-single-subagent.png new file mode 100644 index 000000000..185068040 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/replay-single-subagent.png differ diff --git a/packages/app/public/images/agentx-methodology/replay-subagent-sidecars.png b/packages/app/public/images/agentx-methodology/replay-subagent-sidecars.png new file mode 100644 index 000000000..a60af7fed Binary files /dev/null and b/packages/app/public/images/agentx-methodology/replay-subagent-sidecars.png differ diff --git a/packages/app/public/images/agentx-methodology/replay-two-subagents-joined.png b/packages/app/public/images/agentx-methodology/replay-two-subagents-joined.png new file mode 100644 index 000000000..3e39e3de2 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/replay-two-subagents-joined.png differ diff --git a/packages/app/public/images/agentx-methodology/replay-two-subagents.png b/packages/app/public/images/agentx-methodology/replay-two-subagents.png new file mode 100644 index 000000000..54d03ed10 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/replay-two-subagents.png differ diff --git a/packages/app/public/images/agentx-methodology/request-distributions-256k.png b/packages/app/public/images/agentx-methodology/request-distributions-256k.png new file mode 100644 index 000000000..8f6e03660 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/request-distributions-256k.png differ diff --git a/packages/app/public/images/agentx-methodology/request-distributions.png b/packages/app/public/images/agentx-methodology/request-distributions.png new file mode 100644 index 000000000..640c7b68f Binary files /dev/null and b/packages/app/public/images/agentx-methodology/request-distributions.png differ diff --git a/packages/app/public/images/agentx-methodology/request-queue-depth.png b/packages/app/public/images/agentx-methodology/request-queue-depth.png new file mode 100644 index 000000000..724e4dba2 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/request-queue-depth.png differ diff --git a/packages/app/public/images/agentx-methodology/subagent-distributions-256k.png b/packages/app/public/images/agentx-methodology/subagent-distributions-256k.png new file mode 100644 index 000000000..e695991ca Binary files /dev/null and b/packages/app/public/images/agentx-methodology/subagent-distributions-256k.png differ diff --git a/packages/app/public/images/agentx-methodology/subagent-distributions.png b/packages/app/public/images/agentx-methodology/subagent-distributions.png new file mode 100644 index 000000000..01b72a3e3 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/subagent-distributions.png differ diff --git a/packages/app/public/images/agentx-methodology/warmup-cache-sources.png b/packages/app/public/images/agentx-methodology/warmup-cache-sources.png new file mode 100644 index 000000000..f1bdfd761 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/warmup-cache-sources.png differ diff --git a/packages/app/public/images/agentx-methodology/warmup-snapshot.png b/packages/app/public/images/agentx-methodology/warmup-snapshot.png new file mode 100644 index 000000000..d806e911f Binary files /dev/null and b/packages/app/public/images/agentx-methodology/warmup-snapshot.png differ diff --git a/packages/app/public/images/agentx-methodology/weka-trace-record.png b/packages/app/public/images/agentx-methodology/weka-trace-record.png new file mode 100644 index 000000000..43c8263c3 Binary files /dev/null and b/packages/app/public/images/agentx-methodology/weka-trace-record.png differ diff --git a/packages/app/src/app/about/page.tsx b/packages/app/src/app/about/page.tsx index 5e9348afe..d341551a7 100644 --- a/packages/app/src/app/about/page.tsx +++ b/packages/app/src/app/about/page.tsx @@ -21,21 +21,21 @@ const faqJsonLd = { })), }; +const ABOUT_DESCRIPTION = + 'InferenceX benchmarks agentic and fixed-sequence AI inference across accelerators and serving stacks. AgentX is its long-context, multi-turn coding scenario.'; + export const metadata: Metadata = { title: 'About', - description: - 'InferenceX is an independent, vendor neutral, reproducible benchmark which continuously benchmarks inference software across a wide range of AI accelerators.', + description: ABOUT_DESCRIPTION, alternates: enAlternates('/about'), openGraph: { title: 'About | InferenceX', - description: - 'InferenceX is an independent, vendor neutral, reproducible benchmark which continuously benchmarks inference software across a wide range of AI accelerators.', + description: ABOUT_DESCRIPTION, url: `${SITE_URL}/about`, }, twitter: { title: 'About | InferenceX', - description: - 'InferenceX is an independent, vendor neutral, reproducible benchmark which continuously benchmarks inference software across a wide range of AI accelerators.', + description: ABOUT_DESCRIPTION, }, }; @@ -47,8 +47,8 @@ export default function AboutPage() {

- Open Source Continuous Inference Benchmark trusted by Operators of Trillion Dollar - GigaWatt Scale Token Factories + Open-Source Continuous Agentic Inference Benchmark Trusted by Operators of + Trillion-Dollar, GigaWatt-Scale Token Factories

As the world progresses exponentially towards AGI, software development and model @@ -58,9 +58,9 @@ export default function AboutPage() {

InferenceX™ (formerly InferenceMAX) is our independent, vendor - neutral, reproducible benchmark which addresses these issues by continuously - benchmarking inference software across a wide range of AI accelerators that are - actually available to the ML community. + neutral, reproducible benchmark. It measures both fixed-sequence serving and AgentX, + our long-context, multi-turn agentic coding workload, across AI accelerators and + serving stacks available to the ML community.

Our open data & insights are widely adopted by the ML community, capacity planning diff --git a/packages/app/src/app/datasets/[slug]/conversations/[convId]/page.tsx b/packages/app/src/app/agentx/[slug]/conversations/[convId]/page.tsx similarity index 94% rename from packages/app/src/app/datasets/[slug]/conversations/[convId]/page.tsx rename to packages/app/src/app/agentx/[slug]/conversations/[convId]/page.tsx index 8957c8b4d..8a9d79226 100644 --- a/packages/app/src/app/datasets/[slug]/conversations/[convId]/page.tsx +++ b/packages/app/src/app/agentx/[slug]/conversations/[convId]/page.tsx @@ -19,7 +19,7 @@ export async function generateMetadata({ params }: Props): Promise { title, description, alternates: { - canonical: `${SITE_URL}/datasets/${slug}/conversations/${encodeURIComponent(convId)}`, + canonical: `${SITE_URL}/agentx/${slug}/conversations/${encodeURIComponent(convId)}`, }, robots: { index: false }, // per-conversation pages are too numerous to index }; diff --git a/packages/app/src/app/datasets/[slug]/page.tsx b/packages/app/src/app/agentx/[slug]/page.tsx similarity index 83% rename from packages/app/src/app/datasets/[slug]/page.tsx rename to packages/app/src/app/agentx/[slug]/page.tsx index 567f5588d..613ccde1a 100644 --- a/packages/app/src/app/datasets/[slug]/page.tsx +++ b/packages/app/src/app/agentx/[slug]/page.tsx @@ -10,16 +10,16 @@ interface Props { export async function generateMetadata({ params }: Props): Promise { const { slug } = await params; - const title = `${slug} | Agentic Datasets`; + const title = `${slug} | AgentX Datasets`; const description = `Distributions, token statistics, and per-conversation flamegraphs for the ${slug} agentic trace dataset.`; return { title, description, alternates: { - canonical: `${SITE_URL}/datasets/${slug}`, - languages: languageAlternates(`/datasets/${slug}`), + canonical: `${SITE_URL}/agentx/${slug}`, + languages: languageAlternates(`/agentx/${slug}`), }, - openGraph: { title: `${title} | InferenceX`, description, url: `${SITE_URL}/datasets/${slug}` }, + openGraph: { title: `${title} | InferenceX`, description, url: `${SITE_URL}/agentx/${slug}` }, twitter: { title: `${title} | InferenceX`, description }, }; } diff --git a/packages/app/src/app/agentx/methodology/page.tsx b/packages/app/src/app/agentx/methodology/page.tsx new file mode 100644 index 000000000..4aee25e6d --- /dev/null +++ b/packages/app/src/app/agentx/methodology/page.tsx @@ -0,0 +1,42 @@ +import type { Metadata } from 'next'; + +import { AgentXMethodologyArticle } from '@/components/datasets/agentx-methodology-article'; +import { JsonLd } from '@/components/json-ld'; +import { enAlternates } from '@/lib/i18n'; +import { SITE_URL } from '@semianalysisai/inferencex-constants'; + +const DESCRIPTION = + 'How AgentX transforms opt-in coding-agent traces into replay graphs with controlled KV-cache warmup and benchmark settings.'; + +export const metadata: Metadata = { + title: 'AgentX Methodology', + description: DESCRIPTION, + alternates: enAlternates('/agentx/methodology'), + openGraph: { + title: 'AgentX Methodology | InferenceX', + description: DESCRIPTION, + url: `${SITE_URL}/agentx/methodology`, + }, + twitter: { title: 'AgentX Methodology | InferenceX', description: DESCRIPTION }, +}; + +const jsonLd = { + '@context': 'https://schema.org', + '@type': 'TechArticle', + headline: 'AgentX Methodology', + description: DESCRIPTION, + url: `${SITE_URL}/agentx/methodology`, + inLanguage: 'en', + isPartOf: { '@type': 'WebSite', name: 'InferenceX', url: SITE_URL }, +}; + +export default function AgentXMethodologyPage() { + return ( +

+ +
+ +
+
+ ); +} diff --git a/packages/app/src/app/agentx/page.tsx b/packages/app/src/app/agentx/page.tsx new file mode 100644 index 000000000..41308e6ec --- /dev/null +++ b/packages/app/src/app/agentx/page.tsx @@ -0,0 +1,48 @@ +import type { Metadata } from 'next'; + +import { AgentXMethodology } from '@/components/datasets/agentx-methodology'; +import { DatasetList } from '@/components/datasets/dataset-list'; +import { JsonLd } from '@/components/json-ld'; +import { enAlternates } from '@/lib/i18n'; +import { SITE_URL } from '@semianalysisai/inferencex-constants'; + +const DESCRIPTION = + 'AgentX replays workload shapes derived from opt-in Claude Code sessions. Explore its methodology, distributions, and per-conversation flamegraphs.'; + +export const metadata: Metadata = { + title: 'AgentX Methodology and Datasets', + description: DESCRIPTION, + alternates: enAlternates('/agentx'), + openGraph: { + title: 'AgentX Methodology and Datasets | InferenceX', + description: DESCRIPTION, + url: `${SITE_URL}/agentx`, + }, + twitter: { title: 'AgentX Methodology and Datasets | InferenceX', description: DESCRIPTION }, +}; + +const jsonLd = { + '@context': 'https://schema.org', + '@type': 'CollectionPage', + name: 'InferenceX AgentX Datasets', + description: DESCRIPTION, + url: `${SITE_URL}/agentx`, +}; + +export default function AgentXPage() { + return ( +
+ +
+
+ +
+ +
+

Datasets

+ +
+
+
+ ); +} diff --git a/packages/app/src/app/blog/page.tsx b/packages/app/src/app/blog/page.tsx index bad1c01c1..b2a98ea2b 100644 --- a/packages/app/src/app/blog/page.tsx +++ b/packages/app/src/app/blog/page.tsx @@ -11,11 +11,11 @@ import { SITE_URL, SITE_NAME, AUTHOR_NAME } from '@semianalysisai/inferencex-con export const metadata: Metadata = { title: 'Articles', - description: `Technical articles from ${SITE_NAME} by ${AUTHOR_NAME} — AI inference benchmarking, chip performance analysis, and ML infrastructure insights.`, + description: `Technical articles from ${SITE_NAME} by ${AUTHOR_NAME} on agentic inference benchmarks, AgentX results, chip performance, and ML infrastructure.`, alternates: enAlternates('/blog'), openGraph: { title: `Articles | ${SITE_NAME} by ${AUTHOR_NAME}`, - description: 'AI inference benchmarking insights and chip performance analysis.', + description: 'Articles on agentic inference benchmarks, AgentX results, and chip performance.', url: `${SITE_URL}/blog`, }, }; @@ -49,7 +49,8 @@ export default async function BlogPage({

Articles

- Insights on AI inference benchmarking, chip performance, and ML infrastructure. + Articles on agentic inference, AgentX results, chip performance, and ML + infrastructure.

New to the terminology?{' '} diff --git a/packages/app/src/app/compare/page.tsx b/packages/app/src/app/compare/page.tsx index 2f1a0cb0c..9f2eaa786 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 chip 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 chip inference benchmark from SemiAnalysis, with verified, reproducible results updated as configurations change. ${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.`; export const metadata: Metadata = { title: 'Chip Comparisons', diff --git a/packages/app/src/app/datasets/page.tsx b/packages/app/src/app/datasets/page.tsx deleted file mode 100644 index 6bd33e439..000000000 --- a/packages/app/src/app/datasets/page.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import type { Metadata } from 'next'; - -import { Card } from '@/components/ui/card'; -import { JsonLd } from '@/components/json-ld'; -import { DatasetList } from '@/components/datasets/dataset-list'; -import { enAlternates } from '@/lib/i18n'; -import { SITE_URL } from '@semianalysisai/inferencex-constants'; - -const DESCRIPTION = - 'The real Claude Code agentic conversation traces that the InferenceX agentic benchmark replays — methodology, distributions, and per-conversation flamegraphs.'; - -export const metadata: Metadata = { - title: 'Agentic Datasets', - description: DESCRIPTION, - alternates: enAlternates('/datasets'), - openGraph: { - title: 'Agentic Datasets | InferenceX', - description: DESCRIPTION, - url: `${SITE_URL}/datasets`, - }, - twitter: { title: 'Agentic Datasets | InferenceX', description: DESCRIPTION }, -}; - -const jsonLd = { - '@context': 'https://schema.org', - '@type': 'CollectionPage', - name: 'InferenceX Agentic Datasets', - description: DESCRIPTION, - url: `${SITE_URL}/datasets`, -}; - -export default function DatasetsPage() { - return ( -

- -
-
- -

- Agentic Benchmark Datasets -

-

- InferenceX's agentic benchmark doesn't replay synthetic prompts — it replays - real Claude Code coding sessions captured as conversation traces. - Each trace is a full multi-turn session: the main agent's turns plus any - subagents it spawned, with per-turn input/output token counts and the 64-token - KV-cache block hashes needed to reconstruct prefix-cache reuse. The traces are - published openly on HuggingFace under semianalysisai/cc-traces-weka-*{' '} - (apache-2.0). -

- -

- How traces are captured -

-

- Production Claude Code sessions are recorded through a logging proxy that captures - every API request: its input and output token counts, the model used, timing (TTFT, - inter-token latency), and a list of hash_ids — one per 64-token KV block - of the request's input. Subagent invocations are grouped under their parent turn. - No prompt or completion text is stored; only token counts and block hashes, so the - corpus is shareable while remaining a faithful workload for replay. -

- -

- Cached prefix vs uncached suffix -

-

- Agentic workloads are dominated by prefix reuse: each turn resends the growing - conversation, so most of its input is already in the KV cache from prior turns. We - reconstruct this exactly. Walking a conversation in order under an idealized infinite - cache, a turn's cached prefix is its longest run of leading{' '} - hash_ids already seen; the rest is the uncached suffix{' '} - that must be (re)computed. Blocks are 64 tokens; the split is clamped so cached + - uncached equals the turn's effective input even on a partial final block. - Subagents run against a snapshot of the parent cache at spawn (their context is - separate and is not folded back into the parent). -

- -

Dataset variants

-
    -
  • - full — every captured request, unmodified. -
  • -
  • - 256k — requests whose input + output exceeds 256,000 tokens are - dropped so every turn fits a 256k context window (used when benchmarking engines - configured for a 256k max context). -
  • -
-
-
- -
-

Datasets

- -
-
-
- ); -} diff --git a/packages/app/src/app/glossary/page.tsx b/packages/app/src/app/glossary/page.tsx index c2b231bce..c97fc6cc2 100644 --- a/packages/app/src/app/glossary/page.tsx +++ b/packages/app/src/app/glossary/page.tsx @@ -11,13 +11,15 @@ import { AUTHOR_NAME, SITE_NAME, SITE_URL } from '@semianalysisai/inferencex-con const title = 'AI Inference Glossary'; const description = - 'Clear, technically grounded definitions for LLM inference benchmarks, serving metrics, distributed parallelism, numerical precision, chip hardware, and inference software.'; + 'Clear, technically grounded definitions for agentic inference, LLM benchmarks, serving metrics, distributed parallelism, numerical precision, chip hardware, and inference software.'; export const metadata: Metadata = { title, description, keywords: [ 'AI inference glossary', + 'agentic inference glossary', + 'AgentX benchmark terms', 'LLM inference terms', 'GPU benchmark terminology', 'inference serving glossary', @@ -100,9 +102,9 @@ export default function GlossaryPage() { The language behind the inference curve.

- Definitions for the metrics, serving techniques, numerical formats, and - distributed systems concepts used across InferenceX. Based on measured behavior, - not vendor peak specifications. + Definitions for agentic inference, benchmark metrics, serving techniques, + numerical formats, and distributed systems concepts used across InferenceX. + Entries describe measured behavior and published benchmark recipes.

@@ -173,6 +175,9 @@ export default function GlossaryPage() { speedups on unchanged chips.

+ + AgentX methodology → + Browse technical articles → diff --git a/packages/app/src/app/layout.tsx b/packages/app/src/app/layout.tsx index 0f8a9e5cd..841db6394 100644 --- a/packages/app/src/app/layout.tsx +++ b/packages/app/src/app/layout.tsx @@ -54,6 +54,11 @@ export const metadata: Metadata = { }, description: DESCRIPTION, keywords: [ + 'AgentX scenario', + 'agentic inference benchmark', + 'agentic coding benchmark', + 'long context inference benchmark', + 'multi-turn inference benchmark', 'AI inference benchmark', 'GPU benchmark', 'LLM benchmark', @@ -160,7 +165,7 @@ const jsonLd = { '@id': `${SITE_URL}/#application`, name: SITE_NAME, description: - 'Open-source AI inference benchmark dashboard. Compare chip performance for LLM inference across NVIDIA GB200, H100, AMD MI355X, and more.', + 'InferenceX is an open-source agentic inference benchmark dashboard. It compares the AgentX long-context, multi-turn coding scenario with fixed-sequence serving across NVIDIA, AMD, and other accelerators.', url: SITE_URL, applicationCategory: 'DeveloperApplication', operatingSystem: 'Web', diff --git a/packages/app/src/app/llms-full.txt/route.ts b/packages/app/src/app/llms-full.txt/route.ts index 9648617c2..ccf5b9f29 100644 --- a/packages/app/src/app/llms-full.txt/route.ts +++ b/packages/app/src/app/llms-full.txt/route.ts @@ -28,7 +28,7 @@ export async function GET() { `# ${SITE_NAME} Articles — Full Content`, `> By ${AUTHOR_NAME}`, '', - `This file contains the full text of all articles from ${SITE_NAME} (${SITE_URL}/blog).`, + `This file contains the full text of all articles from ${SITE_NAME} (${SITE_URL}/blog), covering agentic inference benchmarks including AgentX results, fixed-sequence AI inference, chip performance, and ML infrastructure.`, `It is intended for consumption by large language models and AI assistants.`, '', '---', diff --git a/packages/app/src/app/llms.txt/route.ts b/packages/app/src/app/llms.txt/route.ts index a53149eed..596c8ccdb 100644 --- a/packages/app/src/app/llms.txt/route.ts +++ b/packages/app/src/app/llms.txt/route.ts @@ -8,11 +8,13 @@ export async function GET() { const lines = [ `# ${SITE_NAME} by ${AUTHOR_NAME}`, '', - `> ${SITE_NAME} is the open-source AI inference benchmark dashboard. We compare chip performance for LLM inference across NVIDIA GB200, H100, AMD MI355X, and more.`, + `> ${SITE_NAME} is an open-source agentic inference benchmark dashboard. It compares the AgentX long-context, multi-turn coding scenario with fixed-sequence serving across NVIDIA, AMD, and other accelerators using public runs.`, '', `## Links`, '', `- [Dashboard](${SITE_URL})`, + `- [AgentX](${SITE_URL}/agentx)`, + `- [AgentX Methodology](${SITE_URL}/agentx/methodology)`, `- [Articles](${SITE_URL}/blog)`, `- [API Reference](${SITE_URL}/api)`, `- [OpenAPI 3.1 Specification](${SITE_URL}/api/openapi.json)`, diff --git a/packages/app/src/app/manifest.ts b/packages/app/src/app/manifest.ts index 26b9d5e46..fd80ad822 100644 --- a/packages/app/src/app/manifest.ts +++ b/packages/app/src/app/manifest.ts @@ -7,7 +7,7 @@ export default function manifest(): MetadataRoute.Manifest { name: `${SITE_NAME} by ${AUTHOR_NAME}`, short_name: SITE_NAME, description: - 'Open-source AI inference benchmark. Compare chip performance across NVIDIA, AMD, and more.', + 'Open-source agentic inference benchmark. Compare the AgentX scenario and fixed-sequence serving performance across NVIDIA, AMD, and more.', start_url: '/', display: 'standalone', background_color: '#09090b', diff --git a/packages/app/src/app/overview/page.tsx b/packages/app/src/app/overview/page.tsx index ae76ab5a4..bdb133bda 100644 --- a/packages/app/src/app/overview/page.tsx +++ b/packages/app/src/app/overview/page.tsx @@ -18,21 +18,21 @@ import { getOverviewPageData } from '@/lib/overview-data.server'; export const dynamic = 'force-dynamic'; const DESCRIPTION = - 'Compare hyperscaler cost per million total tokens across MI355X, B200, B300, GB200 and GB300 using the scenario shown for each active model.'; + 'Compare hyperscaler cost per million total tokens across MI355X, B200, B300, GB200, and GB300 for the AgentX long-context, multi-turn coding scenario and fixed-sequence scenarios where data is available.'; export const metadata: Metadata = { - title: 'Inference Cost Overview', + title: 'Agentic Inference Costs', description: DESCRIPTION, alternates: enAlternates('/overview'), openGraph: { - title: `Inference Cost Overview | ${SITE_NAME}`, + title: `Agentic Inference Costs | ${SITE_NAME}`, description: DESCRIPTION, url: `${SITE_URL}/overview`, type: 'website', }, twitter: { card: 'summary_large_image', - title: `Inference Cost Overview | ${SITE_NAME}`, + title: `Agentic Inference Costs | ${SITE_NAME}`, description: DESCRIPTION, }, }; diff --git a/packages/app/src/app/sitemap.ts b/packages/app/src/app/sitemap.ts index d85b07299..10397f2b0 100644 --- a/packages/app/src/app/sitemap.ts +++ b/packages/app/src/app/sitemap.ts @@ -94,7 +94,12 @@ export default async function sitemap(): Promise { changeFrequency: 'daily', priority: 0.8, }), - ...localizedPair('/datasets', { lastModified: now, changeFrequency: 'weekly', priority: 0.6 }), + ...localizedPair('/agentx', { lastModified: now, changeFrequency: 'weekly', priority: 0.6 }), + ...localizedPair('/agentx/methodology', { + lastModified: now, + changeFrequency: 'monthly', + priority: 0.6, + }), ...localizedPair('/api', { lastModified: now, changeFrequency: 'monthly', priority: 0.7 }), ...localizedPair('/blog', { lastModified: now, changeFrequency: 'weekly', priority: 0.8 }), ...localizedPair('/glossary', { diff --git a/packages/app/src/app/zh/about/page.tsx b/packages/app/src/app/zh/about/page.tsx index 91209d257..41eb7c921 100644 --- a/packages/app/src/app/zh/about/page.tsx +++ b/packages/app/src/app/zh/about/page.tsx @@ -22,22 +22,22 @@ const faqJsonLd = { })), }; +const ABOUT_DESCRIPTION = + 'InferenceX 对比各类加速器与服务栈的智能体推理和固定序列 AI 推理性能。AgentX 是其长上下文多轮编码场景。'; + export const metadata: Metadata = { title: '关于', - description: - 'InferenceX 是一个独立、厂商中立、可复现的基准测试平台,持续测试各类 AI 加速器上的推理软件性能。', + description: ABOUT_DESCRIPTION, alternates: zhAlternates('/about'), openGraph: { title: '关于 | InferenceX', - description: - 'InferenceX 是一个独立、厂商中立、可复现的基准测试平台,持续测试各类 AI 加速器上的推理软件性能。', + description: ABOUT_DESCRIPTION, url: `${SITE_URL}/zh/about`, locale: ZH_OG_LOCALE, }, twitter: { title: '关于 | InferenceX', - description: - 'InferenceX 是一个独立、厂商中立、可复现的基准测试平台,持续测试各类 AI 加速器上的推理软件性能。', + description: ABOUT_DESCRIPTION, }, }; @@ -49,7 +49,7 @@ export default function AboutPageZh() {

- 开源持续推理基准测试——受万亿美元级吉瓦规模 Token 工厂运营者的信赖 + 开源持续智能体推理基准测试——受万亿美元级吉瓦规模 Token 工厂运营者的信赖

随着世界以指数级速度迈向 @@ -57,8 +57,8 @@ export default function AboutPageZh() {

InferenceX™(原名 - InferenceMAX)是我们独立、厂商中立、可复现的基准测试平台,通过持续测试实际可用于 ML - 社区的各类 AI 加速器上的推理软件来解决这些问题。 + InferenceMAX)是我们独立、厂商中立、可复现的基准测试平台。它测试固定序列推理服务和 + AgentX 长上下文多轮智能体编码工作负载,覆盖 ML 社区实际可用的各类 AI 加速器与服务栈。

我们的开放数据与洞察已被 ML 社区广泛采用,包括万亿美元级 Token 工厂和 AI diff --git a/packages/app/src/app/zh/datasets/[slug]/conversations/[convId]/page.tsx b/packages/app/src/app/zh/agentx/[slug]/conversations/[convId]/page.tsx similarity index 91% rename from packages/app/src/app/zh/datasets/[slug]/conversations/[convId]/page.tsx rename to packages/app/src/app/zh/agentx/[slug]/conversations/[convId]/page.tsx index cbb99dec8..8704e889c 100644 --- a/packages/app/src/app/zh/datasets/[slug]/conversations/[convId]/page.tsx +++ b/packages/app/src/app/zh/agentx/[slug]/conversations/[convId]/page.tsx @@ -17,7 +17,7 @@ export async function generateMetadata({ params }: Props): Promise { title, description, alternates: { - canonical: `${SITE_URL}/zh/datasets/${slug}/conversations/${encodeURIComponent(convId)}`, + canonical: `${SITE_URL}/zh/agentx/${slug}/conversations/${encodeURIComponent(convId)}`, }, robots: { index: false }, }; diff --git a/packages/app/src/app/zh/datasets/[slug]/page.tsx b/packages/app/src/app/zh/agentx/[slug]/page.tsx similarity index 87% rename from packages/app/src/app/zh/datasets/[slug]/page.tsx rename to packages/app/src/app/zh/agentx/[slug]/page.tsx index a2aedc092..5291637f9 100644 --- a/packages/app/src/app/zh/datasets/[slug]/page.tsx +++ b/packages/app/src/app/zh/agentx/[slug]/page.tsx @@ -10,16 +10,16 @@ interface Props { export async function generateMetadata({ params }: Props): Promise { const { slug } = await params; - const title = `${slug} | Agentic 数据集`; + const title = `${slug} | AgentX 数据集`; const description = `${slug} agentic trace 数据集的分布、token 统计及逐对话火焰图。`; return { title, description, - alternates: zhAlternates(`/datasets/${slug}`), + alternates: zhAlternates(`/agentx/${slug}`), openGraph: { title: `${title} | InferenceX`, description, - url: `${SITE_URL}/zh/datasets/${slug}`, + url: `${SITE_URL}/zh/agentx/${slug}`, locale: ZH_OG_LOCALE, }, twitter: { title: `${title} | InferenceX`, description }, diff --git a/packages/app/src/app/zh/agentx/methodology/page.tsx b/packages/app/src/app/zh/agentx/methodology/page.tsx new file mode 100644 index 000000000..1cb63707f --- /dev/null +++ b/packages/app/src/app/zh/agentx/methodology/page.tsx @@ -0,0 +1,43 @@ +import type { Metadata } from 'next'; + +import { AgentXMethodologyArticle } from '@/components/datasets/agentx-methodology-article'; +import { JsonLd } from '@/components/json-ld'; +import { zhAlternates, ZH_LANG_TAG, ZH_OG_LOCALE } from '@/lib/i18n'; +import { SITE_URL } from '@semianalysisai/inferencex-constants'; + +const DESCRIPTION = + 'AgentX 如何将自愿采集的编码智能体 trace 转换为回放图,并统一 KV cache warmup 与基准测试配置。'; + +export const metadata: Metadata = { + title: 'AgentX 方法论', + description: DESCRIPTION, + alternates: zhAlternates('/agentx/methodology'), + openGraph: { + title: 'AgentX 方法论 | InferenceX', + description: DESCRIPTION, + url: `${SITE_URL}/zh/agentx/methodology`, + locale: ZH_OG_LOCALE, + }, + twitter: { title: 'AgentX 方法论 | InferenceX', description: DESCRIPTION }, +}; + +const jsonLd = { + '@context': 'https://schema.org', + '@type': 'TechArticle', + headline: 'AgentX 方法论', + description: DESCRIPTION, + url: `${SITE_URL}/zh/agentx/methodology`, + inLanguage: ZH_LANG_TAG, + isPartOf: { '@type': 'WebSite', name: 'InferenceX', url: SITE_URL }, +}; + +export default function AgentXMethodologyPageZh() { + return ( +

+ +
+ +
+
+ ); +} diff --git a/packages/app/src/app/zh/agentx/page.tsx b/packages/app/src/app/zh/agentx/page.tsx new file mode 100644 index 000000000..40c82a1e1 --- /dev/null +++ b/packages/app/src/app/zh/agentx/page.tsx @@ -0,0 +1,50 @@ +import type { Metadata } from 'next'; + +import { AgentXMethodology } from '@/components/datasets/agentx-methodology'; +import { DatasetList } from '@/components/datasets/dataset-list'; +import { JsonLd } from '@/components/json-ld'; +import { zhAlternates, ZH_LANG_TAG, ZH_OG_LOCALE } from '@/lib/i18n'; +import { SITE_URL } from '@semianalysisai/inferencex-constants'; + +const DESCRIPTION = + 'AgentX 回放从自愿提供的 Claude Code 会话衍生出的工作负载形态。本页提供方法论、分布及逐对话火焰图。'; + +export const metadata: Metadata = { + title: 'AgentX 方法论与数据集', + description: DESCRIPTION, + alternates: zhAlternates('/agentx'), + openGraph: { + title: 'AgentX 方法论与数据集 | InferenceX', + description: DESCRIPTION, + url: `${SITE_URL}/zh/agentx`, + locale: ZH_OG_LOCALE, + }, + twitter: { title: 'AgentX 方法论与数据集 | InferenceX', description: DESCRIPTION }, +}; + +const jsonLd = { + '@context': 'https://schema.org', + '@type': 'CollectionPage', + name: 'InferenceX AgentX 数据集', + description: DESCRIPTION, + url: `${SITE_URL}/zh/agentx`, + inLanguage: ZH_LANG_TAG, +}; + +export default function AgentXPageZh() { + return ( +
+ +
+
+ +
+ +
+

数据集

+ +
+
+
+ ); +} diff --git a/packages/app/src/app/zh/blog/page.tsx b/packages/app/src/app/zh/blog/page.tsx index ef6b77906..f90e4472e 100644 --- a/packages/app/src/app/zh/blog/page.tsx +++ b/packages/app/src/app/zh/blog/page.tsx @@ -11,11 +11,11 @@ import { SITE_URL, SITE_NAME, AUTHOR_NAME } from '@semianalysisai/inferencex-con export const metadata: Metadata = { title: '文章', - description: `${SITE_NAME} by ${AUTHOR_NAME} 的技术文章——AI 推理基准测试、Chip 性能分析与 ML 基础设施洞见。`, + description: `${SITE_NAME} by ${AUTHOR_NAME} 发布关于智能体推理基准测试、AgentX 结果、Chip 性能与 ML 基础设施的技术文章。`, alternates: zhAlternates('/blog'), openGraph: { title: `文章 | ${SITE_NAME} by ${AUTHOR_NAME}`, - description: 'AI 推理基准测试洞见与 Chip 性能分析。', + description: '关于智能体推理基准测试、AgentX 结果与 Chip 性能的文章。', url: `${SITE_URL}/zh/blog`, locale: ZH_OG_LOCALE, }, @@ -51,7 +51,7 @@ export default async function ZhBlogPage({

文章

- 关于 AI 推理基准测试、Chip 性能与 ML 基础设施的深度洞见。 + 关于智能体推理、AgentX 结果、Chip 性能与 ML 基础设施的文章。

不熟悉相关概念?{' '} diff --git a/packages/app/src/app/zh/compare/page.tsx b/packages/app/src/app/zh/compare/page.tsx index ee5efc30b..a1d60f1cd 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 推出的独立开源 Chip 推理基准测试平台,提供经过验证的、可复现的每夜测试结果。${SUPPORTERS_LINE_ZH}横向对比 DeepSeek V4 Pro、DeepSeek R1、Kimi K2、MiniMax M3、GLM 5、Qwen 3.5 等模型的延迟、吞吐量与成本。`; +const DESCRIPTION = `InferenceX 是 SemiAnalysis 推出的独立开源 Chip 推理基准测试平台,提供经过验证、可复现并随配置变化更新的测试结果。${SUPPORTERS_LINE_ZH}横向对比 DeepSeek V4 Pro、DeepSeek R1、Kimi K2、MiniMax M3、GLM 5、Qwen 3.5 等模型的延迟、吞吐量与成本。`; export const metadata: Metadata = { title: 'Chip 对比', diff --git a/packages/app/src/app/zh/datasets/page.tsx b/packages/app/src/app/zh/datasets/page.tsx deleted file mode 100644 index e224ff871..000000000 --- a/packages/app/src/app/zh/datasets/page.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import type { Metadata } from 'next'; - -import { Card } from '@/components/ui/card'; -import { JsonLd } from '@/components/json-ld'; -import { DatasetList } from '@/components/datasets/dataset-list'; -import { zhAlternates, ZH_OG_LOCALE, ZH_LANG_TAG } from '@/lib/i18n'; -import { SITE_URL } from '@semianalysisai/inferencex-constants'; - -const DESCRIPTION = - 'InferenceX agentic 基准测试所回放的真实 Claude Code 对话 trace——方法论、分布及逐对话火焰图。'; - -export const metadata: Metadata = { - title: 'Agentic 数据集', - description: DESCRIPTION, - alternates: zhAlternates('/datasets'), - openGraph: { - title: 'Agentic 数据集 | InferenceX', - description: DESCRIPTION, - url: `${SITE_URL}/zh/datasets`, - locale: ZH_OG_LOCALE, - }, - twitter: { title: 'Agentic 数据集 | InferenceX', description: DESCRIPTION }, -}; - -const jsonLd = { - '@context': 'https://schema.org', - '@type': 'CollectionPage', - name: 'InferenceX Agentic 数据集', - description: DESCRIPTION, - url: `${SITE_URL}/zh/datasets`, - inLanguage: ZH_LANG_TAG, -}; - -export default function DatasetsPageZh() { - return ( -

- -
-
- -

Agentic 基准测试数据集

-

- InferenceX 的 agentic 基准测试并非回放合成 prompt——而是回放真实的 Claude Code - 编码会话,以对话 trace - 的形式捕获。每条 trace 是一次完整的多轮会话:包括主 agent 的各轮对话及其调用的所有 - subagent,附带每轮的 input/output token 数以及重建 prefix-cache 复用所需的 64-token - KV-cache block hash。这些 trace 在 HuggingFace 上以{' '} - semianalysisai/cc-traces-weka-* 公开发布(apache-2.0 协议)。 -

- -

Trace 的采集方式

-

- 生产环境中的 Claude Code 会话通过日志代理录制,该代理捕获每个 API 请求的 input 和 - output token 数、使用的模型、时间指标(TTFT、token 间延迟),以及一组{' '} - hash_ids(每个对应请求 input 的一个 64-token KV block)。Subagent - 调用被归组到其父轮次下。不存储任何 prompt 或 completion 文本——仅保存 token 计数和 - block hash,因此语料库可共享,同时仍然是忠实的工作负载回放。 -

- -

- 缓存前缀与未缓存后缀 -

-

- Agentic 工作负载以 prefix 复用为主:每轮都会重新发送不断增长的对话,因此大部分 input - 已在前几轮的 KV cache 中。我们精确重建了这一过程。在理想化的无限 cache - 下按顺序遍历对话,某一轮的缓存前缀是其 hash_ids{' '} - 中已出现过的最长前导序列;其余部分是需要(重新)计算的未缓存后缀 - 。每个 block 为 64 个 token;拆分时会限制使缓存 + 未缓存等于该轮的有效 - input,即使最后一个 block 不完整。Subagent 在 spawn 时针对父 cache - 的快照运行(其上下文独立,不会合并回父级)。 -

- -

数据集变体

-
    -
  • - full — 所有捕获的请求,不做修改。 -
  • -
  • - 256k — 丢弃 input + output 超过 256,000 token 的请求,确保每轮都在 - 256k 上下文窗口内(用于在配置 256k 最大上下文的引擎上进行基准测试)。 -
  • -
-
-
- -
-

数据集

- -
-
-
- ); -} diff --git a/packages/app/src/app/zh/glossary/page.tsx b/packages/app/src/app/zh/glossary/page.tsx index b3d772d2e..a934cfaf2 100644 --- a/packages/app/src/app/zh/glossary/page.tsx +++ b/packages/app/src/app/zh/glossary/page.tsx @@ -20,7 +20,7 @@ import { AUTHOR_NAME, SITE_NAME, SITE_URL } from '@semianalysisai/inferencex-con const title = 'AI 推理术语表'; const description = - '清晰、技术严谨的 LLM 推理基准、服务指标、分布式并行、数值精度、Chip 硬件与推理软件术语定义。'; + '清晰、技术严谨的智能体推理、LLM 基准测试、服务指标、分布式并行、数值精度、Chip 硬件与推理软件术语定义。'; const browserLabels: GlossaryBrowserLabels = { searchLabel: '搜索 AI 推理术语表', searchPlaceholder: '搜索 MTP、延迟、FP4…', @@ -40,7 +40,15 @@ const browserLabels: GlossaryBrowserLabels = { export const metadata: Metadata = { title, description, - keywords: ['AI 推理术语表', 'LLM 推理术语', 'GPU 基准术语', '分布式推理', 'LLM 性能指标'], + keywords: [ + 'AI 推理术语表', + '智能体推理术语', + 'AgentX 基准测试术语', + 'LLM 推理术语', + 'Chip 基准术语', + '分布式推理', + 'LLM 性能指标', + ], alternates: zhAlternates('/glossary'), openGraph: { title: `${title} | ${SITE_NAME}`, @@ -120,8 +128,8 @@ export default function ZhGlossaryPage() { 读懂推理曲线背后的语言。

- 解释 InferenceX - 使用的性能指标、服务技术、数值格式和分布式系统概念。所有定义都来自实测行为,而非厂商峰值规格。 + 解释 InferenceX 使用的智能体推理、基准指标、服务技术、数值格式与分布式系统概念。 + 各条目以实测行为和已发布的基准测试方案为依据。

@@ -193,6 +201,9 @@ export default function ZhGlossaryPage() { Wide EP 扩展,以及硬件不变时的软件性能提升。

+ + AgentX 方法说明 → + 浏览技术文章 → diff --git a/packages/app/src/app/zh/overview/page.tsx b/packages/app/src/app/zh/overview/page.tsx index 742dcc863..ddc373d41 100644 --- a/packages/app/src/app/zh/overview/page.tsx +++ b/packages/app/src/app/zh/overview/page.tsx @@ -18,14 +18,14 @@ import { getOverviewPageData } from '@/lib/overview-data.server'; export const dynamic = 'force-dynamic'; const DESCRIPTION = - '按各活跃模型标注的场景,对比 MI355X、B200、B300、GB200 与 GB300 的每百万总 token 超大规模云成本。'; + '在具备对应数据的模型上,分别按 AgentX 长上下文多轮编码场景与固定序列场景,对比 MI355X、B200、B300、GB200 与 GB300 的每百万总 token 超大规模云成本。'; export const metadata: Metadata = { - title: '推理成本总览', + title: '智能体推理成本', description: DESCRIPTION, alternates: zhAlternates('/overview'), openGraph: { - title: `推理成本总览 | ${SITE_NAME}`, + title: `智能体推理成本 | ${SITE_NAME}`, description: DESCRIPTION, url: `${SITE_URL}/zh/overview`, type: 'website', @@ -33,7 +33,7 @@ export const metadata: Metadata = { }, twitter: { card: 'summary_large_image', - title: `推理成本总览 | ${SITE_NAME}`, + title: `智能体推理成本 | ${SITE_NAME}`, description: DESCRIPTION, }, }; diff --git a/packages/app/src/components/about/faq-data-zh.ts b/packages/app/src/components/about/faq-data-zh.ts index 2d161e70d..2c50ecd30 100644 --- a/packages/app/src/components/about/faq-data-zh.ts +++ b/packages/app/src/components/about/faq-data-zh.ts @@ -39,7 +39,7 @@ export const FAQ_ITEMS_ZH: FaqItem[] = [ { question: '什么是 InferenceX?', answer: - 'InferenceX(原名 InferenceMAX)是一个开源、厂商中立的基准测试(benchmark)平台,持续衡量各类 Chip 和软件栈的 AI 推理性能。每当配置发生变化时,基准测试会重新运行,确保结果始终跟随模型和框架的演进保持最新。', + 'InferenceX(原名 InferenceMAX)持续衡量各类 Chip 和软件栈的智能体推理与固定序列推理性能。AgentX 是其长上下文多轮编码场景。配置发生变化时,基准测试会重新运行。', }, { question: 'InferenceX 由谁开发?', @@ -52,7 +52,8 @@ export const FAQ_ITEMS_ZH: FaqItem[] = [ }, { question: '测试了哪些 AI 模型?', - answer: '每个模型均在多种序列长度配置(1k/1k、1k/8k、8k/1k tokens)和并发级别下进行测试。', + answer: + '各模型会在其已有数据所覆盖的固定序列配置(1k/1k、1k/8k、8k/1k tokens)与多个并发级别下进行测试。具备对应数据的模型还包含 AgentX 长上下文多轮智能体编码运行。', list: modelNames, }, { @@ -76,6 +77,7 @@ export const FAQ_ITEMS_ZH: FaqItem[] = [ '每 Chip 输入和输出吞吐量', '每兆瓦 token 吞吐量(tok/s/MW)', 'P99 首 token 延迟(TTFT)', + 'AgentX 场景的端到端延迟、token 间延迟(ITL)、输出吞吐量、prefix cache 行为以及会话与 subagent 执行情况', '每百万 token 成本(总计、输入、输出)——涵盖超大规模云、NeoCoud 和裸机租赁定价', '每 token 能耗(焦耳,总计、输入、输出)', '用户自定义成本和功耗计算', @@ -97,7 +99,7 @@ export const FAQ_ITEMS_ZH: FaqItem[] = [ { question: 'InferenceX 与其他 AI 基准测试有何不同?', answer: - '大多数 AI 基准测试是静态的、单时间点测量,参与者提交的是专为基准测试定制的镜像,无法反映真实的线上推理性能。InferenceX 在真实硬件上持续运行,采用完全可复现的配置。所有测试脚本均提交至代码仓库,基准测试日志在 GitHub Actions 上公开可见,结果端到端可审计。', + 'InferenceX 在真实硬件上运行固定序列工作负载与 AgentX 长上下文多轮编码场景。测试配方保存在代码仓库中,每项结果均链接至对应的 GitHub Actions 运行。', }, { question: '结果如何实现可复现?', diff --git a/packages/app/src/components/about/faq-data.ts b/packages/app/src/components/about/faq-data.ts index 6cd77e186..7f18e69ac 100644 --- a/packages/app/src/components/about/faq-data.ts +++ b/packages/app/src/components/about/faq-data.ts @@ -54,7 +54,7 @@ export const FAQ_ITEMS: FaqItem[] = [ { question: 'What is InferenceX?', answer: - 'InferenceX (formerly InferenceMAX) is an open-source, vendor-neutral benchmark that continuously measures AI inference performance across chips and software stacks. Benchmarks re-run whenever a configuration changes, so results stay current as models and frameworks evolve.', + 'InferenceX (formerly InferenceMAX) continuously measures agentic and fixed-sequence inference performance across chips and software stacks. AgentX is its long-context, multi-turn coding scenario. Runs repeat whenever a configuration changes.', }, { question: 'Who is behind InferenceX?', @@ -68,7 +68,7 @@ export const FAQ_ITEMS: FaqItem[] = [ { question: 'Which AI models are tested?', answer: - 'Each model is tested across multiple sequence length configurations (1k/1k, 1k/8k, 8k/1k tokens) and concurrency levels.', + 'Models are tested across the fixed-sequence configurations available for them (1k/1k, 1k/8k, and 8k/1k tokens) and multiple concurrency levels. Supported models with corresponding data also include AgentX long-context, multi-turn agentic coding runs.', list: modelNames, }, { @@ -92,6 +92,7 @@ export const FAQ_ITEMS: FaqItem[] = [ 'Input and output throughput per chip', 'Token throughput per MW (tok/s/MW)', 'P99 time to first token (TTFT)', + 'For AgentX: end-to-end latency, ITL, output throughput, prefix-cache behavior, and session/subagent execution', 'Cost per million tokens (total, input, output) across hyperscaler, neocloud, and rental pricing', 'Joules per token (total, input, output)', 'Custom user-defined cost and power calculations', @@ -113,7 +114,7 @@ export const FAQ_ITEMS: FaqItem[] = [ { question: 'How is InferenceX different from other AI benchmarks?', answer: - 'Most AI benchmarks are static, point-in-time measurements where participants submit purpose-built images that do not reflect real-world serving performance. InferenceX runs continuously on real hardware with fully reproducible configurations. Every recipe is in the repo, benchmark logs are visible on GitHub Actions, and all results are auditable end-to-end.', + 'InferenceX runs fixed-sequence workloads and the AgentX long-context, multi-turn coding scenario on real hardware. Test recipes are in the repository, and each result links to its GitHub Actions run.', }, { question: 'How are results reproducible?', diff --git a/packages/app/src/components/datasets/agentx-methodology-article.tsx b/packages/app/src/components/datasets/agentx-methodology-article.tsx new file mode 100644 index 000000000..689ddcc76 --- /dev/null +++ b/packages/app/src/components/datasets/agentx-methodology-article.tsx @@ -0,0 +1,641 @@ +import Image from 'next/image'; + +import { AgentXMethodologyLink } from './agentx-methodology-link'; + +type Locale = 'en' | 'zh'; + +const ASSET_ROOT = '/images/agentx-methodology'; + +const FIGURE_ASSETS = { + corpus: { src: `${ASSET_ROOT}/corpus-scale.png`, width: 4200, height: 1980 }, + hashRatio: { src: `${ASSET_ROOT}/hash-token-ratio.png`, width: 4200, height: 3690 }, + traceRecord: { src: `${ASSET_ROOT}/weka-trace-record.png`, width: 4200, height: 4746 }, + requestDistributions: { + src: `${ASSET_ROOT}/request-distributions.png`, + width: 4200, + height: 4110, + }, + requestDistributions256k: { + src: `${ASSET_ROOT}/request-distributions-256k.png`, + width: 4200, + height: 4110, + }, + subagentDistributions: { + src: `${ASSET_ROOT}/subagent-distributions.png`, + width: 4200, + height: 2850, + }, + subagentDistributions256k: { + src: `${ASSET_ROOT}/subagent-distributions-256k.png`, + width: 4200, + height: 2850, + }, + replayLinear: { src: `${ASSET_ROOT}/replay-linear.png`, width: 4200, height: 2397 }, + replaySingle: { + src: `${ASSET_ROOT}/replay-single-subagent.png`, + width: 4200, + height: 3546, + }, + replayJoined: { + src: `${ASSET_ROOT}/replay-two-subagents-joined.png`, + width: 4200, + height: 4080, + }, + replayTwo: { + src: `${ASSET_ROOT}/replay-two-subagents.png`, + width: 4200, + height: 4479, + }, + replayFlatspawn: { + src: `${ASSET_ROOT}/replay-flatspawn.png`, + width: 4200, + height: 4134, + }, + replaySidecars: { + src: `${ASSET_ROOT}/replay-subagent-sidecars.png`, + width: 4200, + height: 4818, + }, + replayMulti: { + src: `${ASSET_ROOT}/replay-multi-subagent.png`, + width: 4200, + height: 5130, + }, + queueDepth: { src: `${ASSET_ROOT}/request-queue-depth.png`, width: 1360, height: 612 }, + pareto: { src: `${ASSET_ROOT}/pareto-b200-minimax-m3.png`, width: 2048, height: 1167 }, + warmup: { src: `${ASSET_ROOT}/warmup-snapshot.png`, width: 4200, height: 2712 }, + warmupCache: { src: `${ASSET_ROOT}/warmup-cache-sources.png`, width: 2048, height: 895 }, + profilingCache: { + src: `${ASSET_ROOT}/profiling-cache-sources.png`, + width: 2048, + height: 897, + }, + acceptanceControls: { + src: `${ASSET_ROOT}/engine-acceptance-controls.png`, + width: 2048, + height: 1376, + }, + goldenAl: { src: `${ASSET_ROOT}/golden-acceptance-length.png`, width: 747, height: 662 }, +} as const; + +const CONTENT = { + en: { + eyebrow: 'Field guide / AI infrastructure', + title: 'AgentX Methodology', + lead: 'AgentX converts opt-in Claude Code proxy traces into deterministic AIPerf workloads. This page documents how collection metadata becomes a replay and which controls define a valid benchmark result.', + facts: [ + { value: '393', label: 'published sessions' }, + { value: '64', label: 'tokens per hash block' }, + { value: '1 hour', label: 'profiling window' }, + { value: '25–75%', label: 'seeded start range' }, + ], + collectionTitle: 'Dataset collection', + collectionParagraphs: [ + 'Participants opt in to an HTTP proxy that records request arrival and completion times, input and output token counts, conversation IDs, and subagent IDs. The published corpus does not contain prompts, source code, tool arguments, or tool results.', + 'The proxy represents each input as session-scoped chained hashes in 64-token blocks. Matching block IDs preserve shared prefixes within a session. AIPerf replaces the blocks with deterministic synthetic coding and tool-use tokens before replay.', + 'The client cannot see provider-side chat templates, proprietary tokenizers, server tools, encrypted reasoning content, or the exact token expansion of images and documents. Model-specific padding and deterministic placeholders approximate those fields. The placeholders and padding do not contain original prompts, code, or tool payloads.', + ], + datasetTitle: 'The v1.0 dataset', + datasetParagraphs: [ + 'The v1.0 release contains 393 sessions built on June 21, 2026. Each selected session has at least 20 requests, uses Claude Code 2.1.139 or newer, and has no more than 10 concurrent subagents. Processing removes exact duplicates, short classifier calls used for security monitoring or title generation, and requests whose reconstructed input exceeds 990k tokens.', + 'The full variant retains contexts up to 1M tokens. The 256k variant removes requests above its cap while retaining the relative timing and subagent overlap of the requests that remain. Both use the WEKA trace format consumed by AIPerf.', + ], + replayTitle: 'From trace to replay graph', + replayParagraphs: [ + 'AIPerf converts each trace into a directed acyclic graph (DAG). Main-agent requests form a linear chain. Subagent requests form separate chains that spawn after an eligible parent request and join before the next dependent main-agent request. One-off auxiliary requests can run without a join edge.', + 'The trace contains request timestamps and observed branch IDs, not the tool-level event that caused each branch. Replay therefore preserves recorded ordering, branch overlap, and inter-turn delays without claiming a provider-internal causal history.', + ], + measurementTitle: 'Concurrency and reported metrics', + measurementParagraphs: [ + 'Concurrency is the number of live agent clients. It is not a fixed HTTP request batch because one client can fan out into several subagent requests. The server can have more in-flight requests than the configured client concurrency.', + 'AgentX runs closed loop: a client submits its next eligible request after dependencies complete. Faster systems progress farther through their sampled sessions during the same hour, so the exact request mix can vary, especially at low concurrency. Results should report throughput with time to first token (TTFT) and interactivity. A single latency value does not describe the run.', + ], + warmupTitle: 'Warmup, timing, and determinism', + warmupParagraphs: [ + 'A fixed seed selects each replay start uniformly from 25% to 75% of the recorded session duration. A max_tokens=1 primer materializes the active main-agent and subagent prefixes. Each replay lane then completes 10 additional warmup requests before the measurement barrier opens.', + 'Only the following one-hour profiling window contributes reported metrics. The seed fixes session sampling, start points, and synthetic payloads. A unique cache-bust marker is added to each recycled play so unrelated replays cannot accumulate a shared prefix.', + ], + acceptanceTitle: 'Synthetic payloads and speculative decoding', + acceptanceParagraphs: [ + 'Synthetic tokens preserve input length and prefix structure, but their draft-token acceptance does not match natural model output. AgentX therefore uses a measured acceptance length from the coding category of SPEED-Bench for each model, speculative method, draft length, and thinking mode.', + 'The serving engines expose a forced-acceptance control, and InferenceX records the selected values in versioned golden acceptance-length files. This separates serving-system performance from acceptance variation caused by the synthetic payload. AgentX does not evaluate model answer quality.', + ], + dramTitle: 'DRAM offload rules', + dramParagraphs: [ + 'KV-cache offload changes the capacity available to long-running sessions. Servers without a standardized DRAM configuration are capped at 3 TB. Standard GB200 NVL72, GB300 NVL72, and TPUv7 systems may use their installed capacity.', + 'A benchmark configuration can access only the fraction of host DRAM proportional to its GPU allocation. This prevents a small GPU partition from claiming the memory budget of the entire server.', + ], + limitsTitle: 'Scope and reproducibility', + limits: + 'The replay preserves client-visible request lengths, timing, branch structure, and KV-prefix reuse. It cannot reproduce provider-hidden transformations or the semantic content of the original session. Use the published corpus and locked scenario settings when comparing systems.', + sourcesTitle: 'Primary sources', + sources: [ + { label: 'AgentX v1.0 full dataset', target: 'dataset-full' }, + { label: 'AgentX v1.0 256k dataset', target: 'dataset-256k' }, + { label: 'AIPerf WEKA trace replay guide', target: 'aiperf-weka' }, + { label: 'SPEED-Bench paper', target: 'speed-bench' }, + { label: 'SGLang forced acceptance control', target: 'sglang-pr' }, + { label: 'TensorRT-LLM forced acceptance control', target: 'trtllm-pr' }, + { label: 'vLLM synthetic acceptance control', target: 'vllm-pr' }, + { label: 'ATOM synthetic acceptance control', target: 'atom-pr' }, + { label: 'InferenceX golden acceptance-length values', target: 'golden-al' }, + ], + figures: { + corpus: { + alt: 'Corpus dashboard showing 8,271 sessions, 3.41 million requests, 613.27 billion tokens, 99% cache-hit rate, and token-source shares.', + caption: + 'Corpus snapshot used during dataset selection. The displayed cost is a list-price estimate for this snapshot; it is not a benchmark output.', + }, + hashRatio: { + alt: 'Median reconstructed-hash-token to provider-token ratio by sequence length, overall and split by model.', + caption: + 'Across 135,282 requests from 393 sessions, the median reconstructed/provider token ratio is 1.004. Shaded bands report p25–p75, not a per-request bound.', + }, + traceRecord: { + alt: 'Annotated AgentX trace JSON showing session ID, 64-token hash blocks, request timing, input and output counts, and a subagent group.', + caption: + 'An abridged WEKA record. Block IDs are local to one session; repeated IDs identify the prompt prefix shared by later requests.', + }, + requestDistributions: { + alt: 'Log-scale distributions for inter-turn latency, input sequence length, and output sequence length in the v1.0 dataset.', + caption: + 'Request distributions in the published v1.0 corpus. The median request has 142,016 input tokens and 444 output tokens.', + }, + requestDistributions256k: { + alt: 'Log-scale inter-turn latency, input length, and output length distributions for the AgentX 256k dataset variant.', + caption: + 'After requests above the 256k input cap are removed, the variant retains 68,266 requests. Median input length is 88,768 tokens; median output length is 376 tokens.', + }, + subagentDistributions: { + alt: 'Distributions of subagent wall-clock duration and number of subagent groups per session.', + caption: + 'The 175 sessions with subagents contain 1,697 groups. Median group duration is 2.27 minutes, and the median participating session has four groups.', + }, + subagentDistributions256k: { + alt: 'Subagent group duration and groups-per-session distributions for the AgentX 256k dataset variant.', + caption: + 'The 256k variant retains 1,697 subagent groups. Median duration is 2.27 minutes, and p95 duration is 18.5 minutes.', + }, + replayLinear: { + alt: 'A linear four-request trace converted from recorded timing into a replay dependency chain.', + caption: + 'A session without subagents becomes a linear dependency chain with recorded inter-turn delays.', + }, + replaySingle: { + alt: 'A main-agent trace with one two-request subagent converted into a dependency graph with a join gate.', + caption: + 'One subagent branch spawns after the first main request and joins before the next dependent main request.', + }, + replayJoined: { + alt: 'Two subagent chains branching from a main agent and rejoining at one dependency gate.', + caption: + 'Two subagent chains spawn after the same main request and share one join gate before the main chain resumes.', + }, + replayTwo: { + alt: 'Two parallel subagents joining the main agent and a one-off auxiliary request that does not rejoin.', + caption: + 'Parallel subagents share a join gate. The auxiliary request runs independently and has no join edge.', + }, + replayFlatspawn: { + alt: 'Two subagent chains and one auxiliary request running in parallel before a three-way join.', + caption: + 'A flat-spawn group runs two subagent chains and one auxiliary request in parallel, then joins all three before the main chain resumes.', + }, + replaySidecars: { + alt: 'Two subagent chains and two plain sidecar requests running in parallel before one join gate.', + caption: + 'Two plain sidecar requests without duration metadata run beside two subagent chains. Replay waits for all four at one join.', + }, + replayMulti: { + alt: 'Four parallel subagents grouped by two join points, plus an auxiliary request, shown as a replay dependency graph.', + caption: + 'Multiple subagent groups retain their separate join points, while the auxiliary branch remains detached.', + }, + queueDepth: { + alt: 'Request queue depth over about one hour, separating running, waiting, and total requests for a concurrent AgentX replay.', + caption: + 'A 50-client replay produces a changing number of running and waiting HTTP requests as session graphs fan out and join.', + }, + pareto: { + alt: 'B200 vLLM MiniMax-M3 throughput per chip versus p90 interactivity curve across client concurrency levels.', + caption: + 'Each labeled point is a client-concurrency setting. Higher concurrency raises throughput while reducing per-client interactivity.', + }, + warmup: { + alt: 'Four replay trajectories showing seeded 25–75% warmup points and primer requests for active main-agent and subagent streams.', + caption: + 'The fixed seed chooses t* within the shaded 25–75% interval. Primers establish the active prefix state before profiling.', + }, + warmupCache: { + alt: 'Warmup prompt-token share shifting from cache misses toward HBM cache hits over roughly one minute.', + caption: + 'Warmup begins with cache misses, then materializes enough prefix state for most prompt tokens to hit HBM.', + }, + profilingCache: { + alt: 'One-hour profiling prompt-token share dominated by HBM cache hits after the initial seconds.', + caption: + 'The measured hour starts after warmup. HBM cache hits dominate the prompt-token source throughout the window.', + }, + acceptanceControls: { + alt: 'Merged SGLang, TensorRT-LLM, vLLM, and ATOM pull requests adding forced speculative-decoding acceptance controls.', + caption: + 'Merged engine changes expose the controls required to apply the same acceptance assumption across serving stacks.', + }, + goldenAl: { + alt: 'InferenceX golden acceptance-length YAML for DeepSeek-V4-Pro, listing values by speculative-token count and thinking mode.', + caption: + 'A versioned golden acceptance-length file records the SPEED-Bench measurement used for each draft length and thinking mode.', + }, + }, + }, + zh: { + eyebrow: 'Field guide / AI infrastructure', + title: 'AgentX 方法论', + lead: 'AgentX 将自愿采集的 Claude Code 代理 trace 转换为确定性的 AIPerf 工作负载。本页说明采集元数据如何生成回放,以及有效基准测试结果所遵循的控制规则。', + facts: [ + { value: '393', label: '个公开会话' }, + { value: '64', label: '每个 hash block 的 token 数' }, + { value: '1 小时', label: 'profiling 窗口' }, + { value: '25–75%', label: '固定 seed 起点范围' }, + ], + collectionTitle: '数据采集', + collectionParagraphs: [ + '参与者主动启用 HTTP 代理后,代理会记录请求到达与完成时间、input 和 output token 数、conversation ID 与 subagent ID。公开语料不包含 prompt、源代码、tool argument 或 tool result。', + '代理以 64-token block 为单位,将每段 input 表示为会话内串联 hash。同一会话中相同的 block ID 会保留共享 prefix。回放前,AIPerf 会使用确定性的合成编码与 tool-use token 替换这些 block。', + '客户端无法看到服务端 chat template、专有 tokenizer、服务端 tool、加密的 reasoning 内容,也无法精确得知图片和文档最终展开成多少 token。AgentX 使用针对模型校准的 padding 和确定性 placeholder 处理这些字段;其中不包含原始 prompt、代码或 tool payload。', + ], + datasetTitle: 'v1.0 数据集', + datasetParagraphs: [ + 'v1.0 于 2026 年 6 月 21 日构建,共包含 393 个会话。每个入选会话至少有 20 个请求,Claude Code 版本不低于 2.1.139,并且同时运行的 subagent 不超过 10 个。处理流程会移除完全重复的请求、用于安全监控或标题生成的短 classifier 调用,以及重建后 input 超过 990k token 的请求。', + 'full 变体保留最高 1M token 的上下文。256k 变体会移除超过上限的请求,同时保留其余请求的相对时间与 subagent 重叠关系。两者均采用 AIPerf 可读取的 WEKA trace 格式。', + ], + replayTitle: '从 trace 到回放图', + replayParagraphs: [ + 'AIPerf 将每条 trace 转换为有向无环图(DAG)。主 agent 请求形成线性链;subagent 请求形成独立链,在符合条件的父请求完成后启动,并在下一个依赖它的主 agent 请求前汇合。一次性辅助请求可以在没有 join edge 的情况下运行。', + 'Trace 记录请求时间戳和可观测的分支 ID,但不记录触发分支的 tool 级事件。回放会保留请求顺序、分支重叠与轮次间延迟,但不会推断服务端内部因果关系。', + ], + measurementTitle: 'Concurrency 与结果指标', + measurementParagraphs: [ + 'Concurrency 表示同时运行的 agent 客户端数量,不是固定的 HTTP request batch。一个客户端可能展开为多个 subagent 请求,因此服务器上的瞬时请求数可以高于配置的客户端 concurrency。', + 'AgentX 采用 closed-loop 模式:依赖满足后,客户端才提交下一个可执行请求。更快的系统会在同一小时内推进到采样会话的更后位置,因此实际请求组合可能略有不同,低并发时尤为明显。报告结果时应同时给出吞吐量、首 token 延迟(TTFT)和 interactivity;单一 latency 值无法描述完整运行。', + ], + warmupTitle: 'Warmup、计时与确定性', + warmupParagraphs: [ + '固定 seed 会在每段会话记录时长的 25% 至 75% 区间内均匀选择回放起点。随后使用 max_tokens=1 的 primer 建立当前主 agent 与 subagent 的 prefix,再让每条回放 lane 完成 10 个额外 warmup 请求,最后才开启测量 barrier。', + '对外指标只统计随后一小时的 profiling 窗口。Seed 会固定会话采样、起点和合成 payload。每次循环使用唯一的 cache-bust 标记,避免无关回放逐步形成共享 prefix。', + ], + acceptanceTitle: '合成 payload 与 speculative decoding', + acceptanceParagraphs: [ + '合成 token 会保留 input 长度和 prefix 结构,但其 draft token 接受情况与自然模型输出不同。因此,AgentX 会针对每组模型、speculative 方法、draft length 与 thinking mode,使用 SPEED-Bench 编码类别测得的 acceptance length。', + '推理引擎提供强制 acceptance 控制,InferenceX 则把选定值记录在带版本的 golden acceptance-length 文件中。这样可以把推理系统性能与合成 payload 引起的 acceptance 波动分开。AgentX 不评估模型回答质量。', + ], + dramTitle: 'DRAM offload 规则', + dramParagraphs: [ + 'KV cache offload 会改变长会话可用的容量。没有标准化 DRAM 配置的服务器上限为 3 TB;GB200 NVL72、GB300 NVL72 和 TPUv7 等标准化系统可使用实际装机容量。', + '每种基准测试配置只能按其 GPU 占比使用对应的 host DRAM,避免较小的 GPU 分区占用整台服务器的内存预算。', + ], + limitsTitle: '适用范围与复现', + limits: + '回放会保留客户端可见的请求长度、时间关系、分支结构和 KV prefix 复用,但无法复现服务端隐藏转换或原始会话的语义内容。比较不同系统时,应使用公开语料和锁定的场景配置。', + sourcesTitle: '主要来源', + sources: [ + { label: 'AgentX v1.0 full 数据集', target: 'dataset-full' }, + { label: 'AgentX v1.0 256k 数据集', target: 'dataset-256k' }, + { label: 'AIPerf WEKA trace 回放指南', target: 'aiperf-weka' }, + { label: 'SPEED-Bench 论文', target: 'speed-bench' }, + { label: 'SGLang 强制 acceptance 控制', target: 'sglang-pr' }, + { label: 'TensorRT-LLM 强制 acceptance 控制', target: 'trtllm-pr' }, + { label: 'vLLM 合成 acceptance 控制', target: 'vllm-pr' }, + { label: 'ATOM 合成 acceptance 控制', target: 'atom-pr' }, + { label: 'InferenceX golden acceptance-length 数值', target: 'golden-al' }, + ], + figures: { + corpus: { + alt: '语料仪表板显示 8,271 个会话、341 万个请求、6132.7 亿 token、99% cache-hit rate 及 token 来源占比。', + caption: + '筛选数据集时使用的语料快照。图中的费用按该快照和公开 API 标价估算,并非基准测试输出指标。', + }, + hashRatio: { + alt: '按序列长度展示重建 hash token 与服务商 token 数的中位比值,并分别给出整体和各模型结果。', + caption: + '393 个会话的 135,282 个请求中,重建 token 数与服务商 token 数之比的中位数为 1.004。阴影表示 p25–p75 区间,不代表每个请求都有固定误差上限。', + }, + traceRecord: { + alt: '带注释的 AgentX trace JSON,包含 session ID、64-token hash block、请求时间、input 和 output 数量及一个 subagent group。', + caption: + '一条删节后的 WEKA 记录。Block ID 只在单个会话内有效;重复 ID 表示后续请求共享的 prompt prefix。', + }, + requestDistributions: { + alt: 'v1.0 数据集中轮次间延迟、input sequence length 与 output sequence length 的对数分布。', + caption: + 'v1.0 公开语料的请求分布。单请求 input token 中位数为 142,016,output token 中位数为 444。', + }, + requestDistributions256k: { + alt: 'AgentX 256k 数据集变体中轮次间延迟、input 长度与 output 长度的对数分布。', + caption: + '移除超过 256k input 上限的请求后,该变体保留 68,266 个请求。input token 中位数为 88,768,output token 中位数为 376。', + }, + subagentDistributions: { + alt: 'Subagent wall-clock duration 以及每个会话中 subagent group 数量的分布。', + caption: + '175 个包含 subagent 的会话共有 1,697 个 group。Group 时长中位数为 2.27 分钟;这些会话的 group 数中位数为 4。', + }, + subagentDistributions256k: { + alt: 'AgentX 256k 数据集变体中的 subagent group 时长与每会话 group 数分布。', + caption: + '256k 变体保留 1,697 个 subagent group。时长中位数为 2.27 分钟,p95 为 18.5 分钟。', + }, + replayLinear: { + alt: '线性四请求 trace 根据记录时间转换为回放依赖链。', + caption: '不含 subagent 的会话会转换为线性依赖链,并保留记录中的轮次间延迟。', + }, + replaySingle: { + alt: '一个包含双请求 subagent 的主 agent trace 被转换为带 join gate 的依赖图。', + caption: + 'Subagent 分支在第一个主请求后启动,并在下一个依赖它的主请求前通过 join gate 汇合。', + }, + replayJoined: { + alt: '两条 subagent 链从主 agent 分支,并在同一个依赖 gate 汇合。', + caption: '两条 subagent 链在同一个主请求完成后启动,并在主链继续前共用一个 join gate。', + }, + replayTwo: { + alt: '两个并行 subagent 汇合到主 agent,另有一个不会汇合的一次性辅助请求。', + caption: '并行 subagent 共享 join gate;辅助请求独立运行,不带 join edge。', + }, + replayFlatspawn: { + alt: '两条 subagent 链与一个辅助请求并行运行,随后通过三路 join 汇合。', + caption: + 'Flat-spawn group 并行运行两条 subagent 链和一个辅助请求,三者汇合后主链才继续执行。', + }, + replaySidecars: { + alt: '两条 subagent 链与两个普通 sidecar 请求并行运行,随后汇合到同一个 join gate。', + caption: + '两个不带 duration 元数据的普通 sidecar 请求与两条 subagent 链并行运行;回放会在同一个 join 等待四者完成。', + }, + replayMulti: { + alt: '四个并行 subagent 按两个 join point 分组,并带有辅助请求的回放依赖图。', + caption: '多个 subagent group 保留各自的 join point,辅助分支仍保持独立。', + }, + queueDepth: { + alt: '约一小时内的请求队列深度,分别显示并发 AgentX 回放中的 running、waiting 与 total request。', + caption: + '在 50 个客户端的回放中,会话图持续展开和汇合,running 与 waiting HTTP 请求数也随之变化。', + }, + pareto: { + alt: 'B200 vLLM MiniMax-M3 在不同客户端 concurrency 下的单 Chip 吞吐量与 p90 interactivity 曲线。', + caption: + '每个标记点对应一种客户端 concurrency。提高 concurrency 会增加吞吐量,同时降低每个客户端的 interactivity。', + }, + warmup: { + alt: '四条回放轨迹,显示固定 seed 的 25–75% warmup 起点,以及主 agent 和 subagent 活跃流的 primer 请求。', + caption: + '固定 seed 在阴影所示的 25–75% 区间选择 t*;primer 会在 profiling 前建立活跃 prefix 状态。', + }, + warmupCache: { + alt: '约一分钟内,warmup prompt token 来源从 cache miss 转向 HBM cache hit。', + caption: + 'Warmup 初期以 cache miss 为主,随后建立 prefix 状态,使大部分 prompt token 命中 HBM。', + }, + profilingCache: { + alt: '一小时 profiling 中,初始几秒后 prompt token 来源以 HBM cache hit 为主。', + caption: + '测量窗口在 warmup 后开始,整个 profiling 小时内 prompt token 来源主要为 HBM cache hit。', + }, + acceptanceControls: { + alt: 'SGLang、TensorRT-LLM、vLLM 与 ATOM 中加入强制 speculative-decoding acceptance 控制的已合并 PR。', + caption: + '这些已合并的推理引擎变更提供所需控制,使不同 serving stack 可以采用相同的 acceptance 假设。', + }, + goldenAl: { + alt: 'InferenceX DeepSeek-V4-Pro golden acceptance-length YAML,按 speculative-token 数量和 thinking mode 列出数值。', + caption: + '带版本的 golden acceptance-length 文件记录每种 draft length 与 thinking mode 所使用的 SPEED-Bench 测量值。', + }, + }, + }, +} as const; + +const SOURCE_HREFS = { + 'dataset-full': 'https://huggingface.co/datasets/semianalysisai/cc-traces-weka-062126', + 'dataset-256k': 'https://huggingface.co/datasets/semianalysisai/cc-traces-weka-062126-256k', + 'aiperf-weka': 'https://github.com/ai-dynamo/aiperf/blob/main/docs/tutorials/weka-trace.md', + 'speed-bench': 'https://arxiv.org/abs/2604.09557', + 'sglang-pr': 'https://github.com/sgl-project/sglang/pull/10771', + 'trtllm-pr': 'https://github.com/NVIDIA/TensorRT-LLM/pull/9371', + 'vllm-pr': 'https://github.com/vllm-project/vllm/pull/40662', + 'atom-pr': 'https://github.com/ROCm/ATOM/pull/1850', + 'golden-al': + 'https://github.com/SemiAnalysisAI/InferenceX/blob/main/golden_al_distribution/dsv4_mtp.yaml', +} as const; + +type FigureKey = keyof typeof FIGURE_ASSETS; +interface FigureCopy { + alt: string; + caption: string; +} + +function MethodFigure({ + figure, + copy, + locale, +}: { + figure: FigureKey; + copy: FigureCopy; + locale: Locale; +}) { + const asset = FIGURE_ASSETS[figure]; + return ( + +
+ {copy.alt} +
+ {copy.caption} + + {locale === 'zh' ? '查看原始分辨率图片' : 'View full-resolution image'} ↗ + +
+
+
+ ); +} + +function Paragraphs({ items }: { items: readonly string[] }) { + return ( +
+ {items.map((item) => ( +

{item}

+ ))} +
+ ); +} + +function SectionHeading({ id, children }: { id: string; children: React.ReactNode }) { + return ( +

+ {children} +

+ ); +} + +export function AgentXMethodologyArticle({ locale }: { locale: Locale }) { + const t = CONTENT[locale]; + const prefix = locale === 'zh' ? '/zh' : ''; + + return ( +
+
+ + {locale === 'zh' ? '← 返回 AgentX' : '← Back to AgentX'} + +

+ {t.eyebrow} +

+

+ {t.title} +

+

{t.lead}

+
+ {t.facts.map((fact) => ( +
+
{fact.label}
+
+ {fact.value} +
+
+ ))} +
+
+ +
+
+ {t.collectionTitle} + + + +
+ +
+ {t.datasetTitle} + + + + + + +
+ +
+ {t.replayTitle} + + + + + + + + +
+ +
+ {t.measurementTitle} + + + +
+ +
+ {t.warmupTitle} + + +
+ + +
+
+ +
+ {t.acceptanceTitle} + + +
+ +
+
+ +
+ {t.dramTitle} + +
+ +
+ {t.limitsTitle} +

{t.limits}

+

{t.sourcesTitle}

+
    + {t.sources.map((source) => ( +
  • + + {source.label} ↗ + +
  • + ))} +
+
+
+
+ ); +} diff --git a/packages/app/src/components/datasets/agentx-methodology-link.tsx b/packages/app/src/components/datasets/agentx-methodology-link.tsx new file mode 100644 index 000000000..a431a70c7 --- /dev/null +++ b/packages/app/src/components/datasets/agentx-methodology-link.tsx @@ -0,0 +1,35 @@ +'use client'; + +import Link from 'next/link'; + +import { track } from '@/lib/analytics'; + +interface AgentXMethodologyLinkProps extends Omit, 'href'> { + href: string; + analyticsEvent: + | 'agentx_methodology_opened' + | 'agentx_methodology_returned' + | 'agentx_methodology_figure_opened' + | 'agentx_methodology_source_opened'; + analyticsTarget?: string; +} + +export function AgentXMethodologyLink({ + href, + analyticsEvent, + analyticsTarget, + onClick, + ...props +}: AgentXMethodologyLinkProps) { + return ( + { + onClick?.(event); + if (event.defaultPrevented) return; + track(analyticsEvent, analyticsTarget ? { target: analyticsTarget } : undefined); + }} + /> + ); +} diff --git a/packages/app/src/components/datasets/agentx-methodology.tsx b/packages/app/src/components/datasets/agentx-methodology.tsx new file mode 100644 index 000000000..f33d66fc4 --- /dev/null +++ b/packages/app/src/components/datasets/agentx-methodology.tsx @@ -0,0 +1,277 @@ +import { Card } from '@/components/ui/card'; +import { AgentXMethodologyLink } from './agentx-methodology-link'; + +type Locale = 'en' | 'zh'; + +const CONTENT = { + en: { + eyebrow: 'AgentX v1.0 methodology', + title: 'AgentX Benchmark Datasets', + intro: + 'AgentX derives replay workloads from opt-in Claude Code sessions. The published traces remove prompt, code, and tool payloads while retaining request lengths, prefix reuse, subagent branches, and timing.', + processTitle: 'How an AgentX run is built', + steps: [ + { + title: 'Capture', + description: + 'An opt-in HTTP proxy records request and response timing, token counts, conversation IDs, and subagent IDs as sessions run.', + }, + { + title: 'Transform', + description: + 'Original prompts, source code, tool arguments, and tool results are removed. Inputs become session-scoped chained hashes in 64-token blocks, preserving matching prefixes without revealing content.', + }, + { + title: 'Reconstruct', + description: + 'AIPerf fills those blocks with deterministic synthetic coding and tool-use tokens, then rebuilds each session as a directed acyclic graph (DAG) of main-agent turns, parallel subagents, auxiliary requests, and inter-turn tool time.', + }, + { + title: 'Replay and measure', + description: + 'A seeded warmup establishes cache state before each configuration is profiled for one hour across a sweep of concurrent clients. Per-replay cache-bust markers stop unrelated sessions from sharing prefixes.', + }, + ], + datasetTitle: 'What is in the v1.0 dataset', + datasetIntro: + 'AgentX v1.0 uses 393 Claude Code sessions selected from an internal, opt-in trace corpus. Eligible sessions contain at least 20 requests, use Claude Code 2.1.139 or newer, and have no more than 10 concurrent subagents. Processing removes duplicate requests, client-specific security-monitor and title-generation calls, and reconstructed inputs above 990k tokens.', + profileLabel: 'v1.0 trace profile', + stats: [ + { value: '393', label: 'sessions' }, + { value: '142k', label: 'median input tokens / request' }, + { value: '444', label: 'median output tokens / request' }, + { value: '44%', label: 'sessions with subagents' }, + ], + controlsTitle: 'Replay controls', + controls: [ + { + title: 'Steady-state start', + description: + 'A fixed seed selects a point 25–75% through each conversation. Primer requests and 10 additional warmup requests per replay lane materialize KV cache before profiling begins.', + }, + { + title: 'Deterministic replay', + description: + 'The seed fixes conversation sampling, starting points, and synthetic content. Reported metrics cover only the one-hour profiling window, not warmup.', + }, + { + title: 'Speculative decoding', + description: + 'Because synthetic tokens can distort draft-token acceptance, AgentX forces an acceptance length measured with SPEED-Bench for each model, speculator, draft length, and thinking-mode combination.', + }, + { + title: 'DRAM offload', + description: + 'Servers without standardized DRAM are capped at 3 TB. Standard GB200 NVL72, GB300 NVL72, and TPUv7 systems use installed capacity, and every configuration may access only the share proportional to its GPU allocation.', + }, + ], + readingTitle: 'How to read AgentX results', + reading: + 'Concurrency means concurrent agent clients, not a fixed request batch. AgentX is closed loop, so faster configurations complete more requests and can encounter a slightly different workload mix. This variation is most visible at low concurrency. Report throughput with time to first token (TTFT) and interactivity; a single latency statistic does not describe the full run.', + qualityNote: + 'AgentX measures serving-system performance. Its synthetic payloads do not support model-quality evaluation.', + limits: + 'The client cannot observe provider-side chat templates, proprietary tokenizers, server tools, encrypted reasoning content, or the exact token expansion of images and documents. AgentX uses deterministic placeholders and model-specific padding for those inputs. The resulting traces reproduce request lengths, timing, conversation topology, and KV-reuse patterns. They do not contain the original conversations.', + variantsLabel: 'Dataset variants', + variants: [ + { + title: 'full', + description: 'The complete AgentX v1.0 replay set, including contexts up to 1M tokens.', + }, + { + title: '256k', + description: + 'A context-limited variant for models and inference engines configured with a maximum context of 256k tokens.', + }, + ], + methodologyCta: 'Read the full methodology', + }, + zh: { + eyebrow: 'AgentX v1.0 方法论', + title: 'AgentX 基准测试数据集', + intro: + 'AgentX 根据自愿提供的 Claude Code 会话生成回放负载。公开 trace 会移除 prompt、代码和 tool payload,同时保留请求长度、prefix 复用、subagent 分支和时间信息。', + processTitle: 'AgentX 如何构建一次回放', + steps: [ + { + title: '采集', + description: + '参与者主动启用 HTTP 代理后,代理会在会话运行期间记录请求与响应时间、token 数、conversation ID 和 subagent ID。', + }, + { + title: '转换', + description: + '原始 prompt、源代码、tool argument 和 tool result 均会移除。Input 按 64-token block 转换为会话内串联 hash,在不暴露内容的前提下保留相同 prefix。', + }, + { + title: '重建', + description: + 'AIPerf 使用确定性的合成编码与 tool-use token 填充这些 block,再把每个会话重建为有向无环图(DAG),涵盖主 agent 轮次、并行 subagent、辅助请求以及轮次间的 tool 执行时间。', + }, + { + title: '回放与测量', + description: + '每种配置先通过固定 seed 的 warmup 建立 cache 状态,随后在不同并发客户端数量下进行一小时 profiling。每次回放使用独立的 cache-bust 标记,防止无关会话意外共享 prefix。', + }, + ], + datasetTitle: 'v1.0 数据集包含什么', + datasetIntro: + 'AgentX v1.0 从内部自愿参与的 trace 语料中筛选出 393 个 Claude Code 会话。入选会话至少包含 20 个请求,Claude Code 版本不低于 2.1.139,并且同时运行的 subagent 不超过 10 个。后处理还会移除重复请求、Claude Code 特有的安全监控与标题生成请求,以及重建后 input 超过 990k token 的请求。', + profileLabel: 'v1.0 trace 概况', + stats: [ + { value: '393', label: '个会话' }, + { value: '142k', label: '单请求 input token 中位数' }, + { value: '444', label: '单请求 output token 中位数' }, + { value: '44%', label: '包含 subagent 的会话' }, + ], + controlsTitle: '回放控制', + controls: [ + { + title: '从稳态开始', + description: + '固定 seed 会在每段会话 25%–75% 的位置选择起点。Primer 请求和每条回放 lane 额外 10 个 warmup 请求会在 profiling 前建立 KV cache。', + }, + { + title: '确定性回放', + description: + 'Seed 固定会话采样、起点和合成内容。对外报告的指标只覆盖一小时 profiling 窗口,不包含 warmup。', + }, + { + title: 'Speculative decoding', + description: + '合成 token 可能扭曲 draft token 的接受情况,因此 AgentX 会针对每组 model、speculator、draft length 和 thinking mode,使用 SPEED-Bench 测得并固定 acceptance length。', + }, + { + title: 'DRAM offload', + description: + '没有标准化 DRAM 配置的服务器上限为 3 TB;GB200 NVL72、GB300 NVL72 和 TPUv7 等标准化系统使用装机容量。每种配置只能按其 GPU 占比使用对应的 DRAM。', + }, + ], + readingTitle: '如何解读 AgentX 结果', + reading: + '这里的 concurrency 表示同时运行的 agent 客户端数量,不是固定 request batch。AgentX 采用 closed-loop 模式,因此更快的配置会完成更多请求,遇到的负载组合也可能略有不同;这种波动在低并发时最明显。报告结果时,应同时给出吞吐量、首 token 延迟(TTFT)和 interactivity,单一 latency 指标不足以描述完整运行。', + qualityNote: 'AgentX 衡量推理系统性能。合成 payload 不适合评估模型回答质量。', + limits: + '客户端无法观测服务端 chat template、专有 tokenizer、服务端 tool、加密的 reasoning 内容,也无法精确得知图片和文档最终展开成多少 token。AgentX 使用确定性 placeholder 和针对不同模型校准的 padding 处理这些输入。重建后的 trace 会复现请求长度、时间关系、对话拓扑和 KV 复用模式,但不包含原始会话。', + variantsLabel: '数据集变体', + variants: [ + { + title: 'full', + description: '完整的 AgentX v1.0 回放集,包含最高 1M token 的上下文。', + }, + { + title: '256k', + description: '面向最大上下文配置为 256k token 的模型与推理引擎的限制版。', + }, + ], + methodologyCta: '深入了解 AgentX 方法论', + }, +} as const; + +export function AgentXMethodology({ locale }: { locale: Locale }) { + const t = CONTENT[locale]; + + return ( + +
+

+ {t.eyebrow} +

+

{t.title}

+

{t.intro}

+
+ +
+
+

+ {t.processTitle} +

+
    + {t.steps.map((step, index) => ( +
  1. +
    + + {String(index + 1).padStart(2, '0')} + +

    {step.title}

    +
    +

    {step.description}

    +
  2. + ))} +
+
+ +
+

+ {t.datasetTitle} +

+

{t.datasetIntro}

+
+

+ {t.profileLabel} +

+
+ {t.stats.map((stat) => ( +
+
+ {stat.label} +
+
+ {stat.value} +
+
+ ))} +
+
+
    + {t.variants.map((variant) => ( +
  • + {variant.title}:{' '} + {variant.description} +
  • + ))} +
+
+ +
+

+ {t.controlsTitle} +

+
+ {t.controls.map((control) => ( +
+
{control.title}
+
+ {control.description} +
+
+ ))} +
+
+ +
+

+ {t.readingTitle} +

+

{t.reading}

+

+ {t.qualityNote} +

+

{t.limits}

+ + {t.methodologyCta} → + +
+
+
+ ); +} diff --git a/packages/app/src/components/datasets/conversation-view.tsx b/packages/app/src/components/datasets/conversation-view.tsx index 71f3098de..84a587701 100644 --- a/packages/app/src/components/datasets/conversation-view.tsx +++ b/packages/app/src/components/datasets/conversation-view.tsx @@ -14,8 +14,8 @@ const STRINGS = { en: { loading: 'Loading conversation…', notFound: 'Conversation not found.', - backToDataset: 'Back to dataset', - breadcrumbDatasets: 'Datasets', + backToDataset: 'Back to AgentX dataset', + breadcrumbDatasets: 'AgentX', breadcrumbConversation: 'conversation', mainTurns: 'Main turns', subagentGroups: 'Subagent groups', @@ -30,8 +30,8 @@ const STRINGS = { zh: { loading: '正在加载对话…', notFound: '未找到对话。', - backToDataset: '返回数据集', - breadcrumbDatasets: '数据集', + backToDataset: '返回 AgentX 数据集', + breadcrumbDatasets: 'AgentX', breadcrumbConversation: '对话', mainTurns: '主轮次', subagentGroups: 'Subagent 组', @@ -69,7 +69,7 @@ export function ConversationView({ slug, convId }: { slug: string; convId: strin return (
{t.notFound}{' '} - + {t.backToDataset}
@@ -82,11 +82,11 @@ export function ConversationView({ slug, convId }: { slug: string; convId: strin
- + {t.breadcrumbDatasets} / - + {slug} / diff --git a/packages/app/src/components/datasets/dataset-detail.tsx b/packages/app/src/components/datasets/dataset-detail.tsx index eb2a12422..913d5e3a0 100644 --- a/packages/app/src/components/datasets/dataset-detail.tsx +++ b/packages/app/src/components/datasets/dataset-detail.tsx @@ -28,8 +28,8 @@ const STRINGS = { en: { loading: 'Loading dataset…', notFound: 'Dataset not found.', - backToDatasets: 'Back to datasets', - breadcrumbDatasets: '← Datasets', + backToDatasets: 'Back to AgentX', + breadcrumbDatasets: '← AgentX', viewOnHf: 'View on HuggingFace ↗', conversations: 'Conversations', medianReqConvo: 'Median requests / convo', @@ -70,8 +70,8 @@ const STRINGS = { zh: { loading: '正在加载数据集…', notFound: '未找到数据集。', - backToDatasets: '返回数据集列表', - breadcrumbDatasets: '← 数据集', + backToDatasets: '返回 AgentX', + breadcrumbDatasets: '← AgentX', viewOnHf: '在 HuggingFace 查看 ↗', conversations: '对话数', medianReqConvo: '每对话中位请求数', @@ -142,7 +142,7 @@ export function DatasetDetail({ slug }: { slug: string }) { return (
{t.notFound}{' '} - + {t.backToDatasets}
@@ -160,7 +160,7 @@ export function DatasetDetail({ slug }: { slug: string }) {
{t.breadcrumbDatasets} @@ -333,7 +333,7 @@ export function DatasetDetail({ slug }: { slug: string }) { > track('datasets_conversation_clicked', { slug })} className="font-mono text-xs text-primary hover:underline" > diff --git a/packages/app/src/components/datasets/dataset-list.tsx b/packages/app/src/components/datasets/dataset-list.tsx index a18869854..49971fe45 100644 --- a/packages/app/src/components/datasets/dataset-list.tsx +++ b/packages/app/src/components/datasets/dataset-list.tsx @@ -46,7 +46,7 @@ function DatasetCard({ d, locale }: { d: DatasetRecord; locale: 'en' | 'zh' }) { const prefix = locale === 'zh' ? '/zh' : ''; return ( track('datasets_card_clicked', { slug: d.slug })} className="block transition-colors hover:[&_*]:border-primary/40" > diff --git a/packages/app/src/components/footer/footer.tsx b/packages/app/src/components/footer/footer.tsx index a4d36179a..17731c391 100644 --- a/packages/app/src/components/footer/footer.tsx +++ b/packages/app/src/components/footer/footer.tsx @@ -12,7 +12,7 @@ import { StarButton } from './footer-star-cta'; const STRINGS = { en: { description: - 'Continuous open-source inference benchmarking. Real-world, reproducible, auditable performance data trusted by trillion dollar AI infrastructure operators like OpenAI, Meta, Oracle, Microsoft, etc.', + 'InferenceX continuously benchmarks agentic and fixed-sequence AI inference, including AgentX results. Each result links to its public run.', semianalysis: 'SemiAnalysis', mainSite: 'Main Site', newsletter: 'Newsletter', @@ -26,7 +26,7 @@ const STRINGS = { frontend: 'Frontend', more: 'More', supporters: 'Supporters', - datasets: 'Datasets', + agentx: 'AgentX', articles: 'Articles', apiReference: 'API Reference', gpuReliability: 'Chip Reliability', @@ -40,7 +40,7 @@ const STRINGS = { }, zh: { description: - '持续的开源推理基准测试。真实、可复现、可审计的性能数据,获得 OpenAI、Meta、Oracle、Microsoft 等万亿美元级 AI 基础设施运营方的信赖。', + 'InferenceX 持续开展智能体推理与固定序列 AI 推理基准测试,并提供 AgentX 结果。每项结果均链接至对应的公开运行。', semianalysis: 'SemiAnalysis', mainSite: '官方网站', newsletter: '订阅通讯', @@ -54,7 +54,7 @@ const STRINGS = { frontend: '前端仓库', more: '更多', supporters: '支持者', - datasets: '数据集', + agentx: 'AgentX', articles: '文章', gpuReliability: 'Chip 可靠性', apiReference: 'API 参考文档', @@ -197,12 +197,12 @@ export const Footer = ({ starCount }: { starCount?: number | null }) => { {t.supporters} track('footer_datasets_clicked')} + data-testid="footer-link-agentx" + href={`${prefix}/agentx`} + onClick={() => track('footer_agentx_clicked')} className="text-sm text-muted-foreground hover:text-foreground transition-colors" > - {t.datasets} + {t.agentx} { ? NAV_LINKS.map((link) => ({ ...link, label: NAV_LABELS_ZH[link.href] ?? link.label, + badgeLabel: link.badge?.zh, displayHref: hasZhSibling(link.href) ? zhPath(link.href) : link.href, })) - : NAV_LINKS.map((link) => ({ ...link, displayHref: link.href })); + : NAV_LINKS.map((link) => ({ + ...link, + badgeLabel: link.badge?.en, + displayHref: link.href, + })); // Close menu on route change useEffect(() => { @@ -208,15 +226,15 @@ export const Header = ({ starCount }: { starCount?: number | null }) => { {/* Desktop nav */} -
diff --git a/packages/app/src/components/ui/new-badge.tsx b/packages/app/src/components/ui/new-badge.tsx new file mode 100644 index 000000000..b1efdef73 --- /dev/null +++ b/packages/app/src/components/ui/new-badge.tsx @@ -0,0 +1,23 @@ +import type { ComponentPropsWithoutRef } from 'react'; + +import { cn } from '@/lib/utils'; + +export function NewBadge({ children, className, ...props }: ComponentPropsWithoutRef<'span'>) { + return ( + + + {children} + + + ); +} diff --git a/packages/app/src/lib/glossary-zh.ts b/packages/app/src/lib/glossary-zh.ts index aff5cf860..1d272a8e4 100644 --- a/packages/app/src/lib/glossary-zh.ts +++ b/packages/app/src/lib/glossary-zh.ts @@ -8,6 +8,7 @@ import { export const GLOSSARY_CATEGORY_LABELS_ZH: Readonly> = { 'Benchmark metrics': '基准指标', Serving: '推理服务', + 'Agentic inference': '智能体推理', Parallelism: '并行策略', Hardware: '硬件', 'Numerical precision': '数值精度', @@ -41,6 +42,88 @@ const translations: Readonly> = { benchmarkContext: 'InferenceX 测试完整的推理方案,因为芯片峰值规格无法代表实际服务性能。每条曲线都对应明确的模型、引擎、精度、并行策略、Chip 系统、序列长度和并发扫描。', }, + 'agentic-inference': { + term: '智能体推理', + aliases: ['agentic inference', 'AI 智能体推理', 'agent 推理'], + plainEnglish: + '智能体会通过多次模型请求完成一项任务,期间可能调用工具、保留会话状态,也可能把部分工作交给 subagent。', + definition: + '智能体推理是为 AI agent 提供模型服务的过程。此类 agent 会在多个轮次间保留状态、调用工具、复用不断增长的上下文,并可能并行运行 subagent。', + explanation: + '一次智能体会话会在模型请求、工具执行和等待之间交替。后续请求通常携带大部分历史对话,因此 prefix cache 和 KV cache 容量会直接影响速度与成本。并行 subagent 还会产生各自具有时间关系和上下文增长过程的请求分支。', + significance: + '固定 input 和 output 长度无法覆盖智能体带来的全部服务压力。长共享前缀会改变 cache 行为,工具等待会让流量呈现突发性,并行分支则会争用推理容量。同一组软硬件在这种请求模式下可能出现不同的性能排序。', + benchmarkContext: + 'InferenceX 使用 AgentX 测量智能体推理。AgentX 与固定序列场景回答不同的容量问题,应分别比较。AgentX 采用闭环会话回放,同一会话中的后续请求会受前一轮完成时间影响。', + }, + agentx: { + term: 'AgentX', + aliases: ['AgentX 基准测试', 'AgentX 场景'], + plainEnglish: 'AgentX 是 InferenceX 用来测试完整长上下文、多轮编码智能体会话的工作负载。', + definition: + 'AgentX 是 InferenceX 的智能体推理基准测试场景,其工作负载形状来自自愿提供的编码智能体轨迹,并在移除原始内容后构建。', + explanation: + 'AgentX 使用确定性合成 token 重建会话结构。回放会保留请求长度、轮次间隔、共享前缀增长、工具等待以及主 agent 与 subagent 的依赖关系;原始提示词、生成代码和工具 payload 不会进入测试数据。推理栈只接收请求模式。', + significance: + '长上下文考验 KV cache 容量,重复前缀考验 cache 复用,分支时序则考验请求调度。这些影响在短小独立请求中较少出现。最终曲线反映推理系统在智能体流量下的整体表现。', + benchmarkContext: + '具备对应数据的模型默认显示 Agentic 场景。比较 AgentX 结果时,应使用兼容设置下的其他 AgentX 运行,并同时查看吞吐量、延迟与交互性。固定序列场景适合分析传统请求流。', + }, + 'agentic-coding-workload': { + term: '智能体编码工作负载', + aliases: ['agentic coding workload', '编码智能体工作负载', '软件工程智能体工作负载'], + plainEnglish: + '编码智能体读取代码仓库、修改代码并运行工具,随后继续请求模型,直到完成任务;这一连串请求就是智能体编码工作负载。', + definition: + '智能体编码工作负载由软件 agent 产生,包含多轮模型生成、代码仓库检查、工具调用、代码修改以及委派给 subagent 的子任务。', + explanation: + '随着 agent 累积指令、文件、工具结果和历史回答,请求长度会持续增长。许多轮次会复用较大的共享前缀。工具执行造成不均匀的停顿,subagent 则可能生成时间重叠的请求分支,因此其流量形状与固定长度提示词不同。', + significance: + '编码智能体可能通过一串相互依赖的调用让推理系统持续工作数分钟甚至数小时。Cache 策略、调度公平性、内存容量和尾延迟都会影响任务进度,仅看峰值 decode 吞吐量无法描述这种体验。', + benchmarkContext: + 'AgentX 使用从轨迹提取的请求形状与确定性合成内容表示该工作负载。它测量推理系统性能。模型能否完成编码任务需要单独做质量评估,因此质量分数与 AgentX 服务结果应分别解读。', + }, + 'trace-replay': { + term: '轨迹回放', + aliases: ['trace replay', '工作负载回放', '会话回放'], + plainEnglish: + '轨迹回放重现已记录会话的请求大小、先后关系与时间间隔,让基准测试按照原始工作负载的节奏发送请求。', + definition: + '轨迹回放是一种基准测试方法,它把记录下来的请求关系、长度和时间信息转化为可重复运行的系统工作负载。', + explanation: + '回放可以保留由主 agent 轮次、并行 subagent 分支和辅助请求组成的有向图。确定性合成 token 会替换私有内容,同时保留 token 数量与前缀关系。轮次间记录的停顿则重现 agent 使用工具或等待依赖项的时间。', + significance: + '这种方法能够表达独立提示词列表缺少的流量特征,也能使用相同会话形状重复比较不同软硬件。AgentX 会在公开回放数据前移除源会话内容。', + benchmarkContext: + 'AgentX 通过 AIPerf 回放由轨迹衍生的会话。固定 seed 决定会话采样、起点和合成内容。对外结果只统计 cache warmup 后的 profiling 窗口,使多次运行聚焦于稳态服务表现。', + }, + 'closed-loop-benchmark': { + term: '闭环基准测试', + aliases: ['closed-loop benchmark', '闭环负载测试', '闭环工作负载'], + plainEnglish: + '在闭环基准测试中,每个模拟用户会等待当前步骤完成,再按照该会话的依赖关系发送下一步请求。', + definition: + '闭环基准测试中的客户端会在前一个依赖请求完成后生成新工作,同时遵循工作负载记录的等待时间和分支结构。', + explanation: + 'Concurrency 表示活跃客户端或会话数量,同时存在的请求数会随时间变化。更快的系统更早完成轮次,因此会在同一个 profiling 窗口内发出更多请求。每条采样会话的推进速度取决于请求完成时间,实际请求组合可能有小幅变化。', + significance: + '这种负载模型符合交互式 agent 的运行方式,因为下一步动作依赖上一步结果。响应更快时,会话也会更快地产生后续工作,所以吞吐量与延迟相互关联。低并发运行的采样波动通常会比大型请求池更明显。', + benchmarkContext: + 'AgentX 使用闭环 concurrency。该数值表示同时运行的 agent 客户端数量;request batch 会随着会话推进而变化。解读结果时需要结合吞吐量、首 token 延迟与交互性。', + }, + subagent: { + term: '子智能体', + aliases: ['subagent', 'child agent', '委派智能体'], + plainEnglish: '子智能体由主 agent 启动,负责同一任务中的较小部分,并可能与其他工作同时运行。', + definition: + '子智能体是一次受委派的 agent 执行,拥有独立会话状态和模型请求,并通过任务关系与依赖关系连接到父会话。', + explanation: + '主 agent 可以启动一个或多个 subagent,稍后再使用它们的结果。Subagent 的请求可能与父会话或其他分支重叠,从而形成会话图中的分支。每个分支可以增长独立上下文,同时复用部分初始指令或代码仓库状态。', + significance: + 'Subagent 会让智能体流量不再完全串行。一个用户任务可能在短时间内产生多条长上下文请求,调度策略会影响各分支的完成速度。系统总吞吐量上升时,单个分支仍可能等待更久。', + benchmarkContext: + 'AgentX 会保留轨迹衍生工作负载中的 subagent 分支及其依赖关系。委派质量不在测试范围内。基准测试测量推理系统如何处理由此产生的并行请求、共享前缀和完成时序。', + }, 'inference-engine': { term: '推理引擎', aliases: ['inference engine', '服务引擎', 'LLM 服务框架'], diff --git a/packages/app/src/lib/glossary.test.ts b/packages/app/src/lib/glossary.test.ts index 18eb6cc9c..e524c5805 100644 --- a/packages/app/src/lib/glossary.test.ts +++ b/packages/app/src/lib/glossary.test.ts @@ -55,6 +55,16 @@ describe('glossary content', () => { } }); + it('defines the AgentX workload and its agentic inference concepts', () => { + expect(GLOSSARY_CATEGORIES).toContain('Agentic inference'); + expect(getGlossaryEntry('agentic-inference')?.category).toBe('Agentic inference'); + expect(getGlossaryEntry('agentx')?.definition).toContain('agentic inference benchmark'); + expect(getGlossaryEntry('agentic-coding-workload')?.relatedTerms).toContain('agentx'); + expect(getGlossaryEntry('trace-replay')?.benchmarkContext).toContain('AIPerf'); + expect(getGlossaryEntry('closed-loop-benchmark')?.benchmarkContext).toContain('agent clients'); + expect(getGlossaryEntry('subagent')?.relatedTerms).toContain('trace-replay'); + }); + it('links every glossary source to a real article and covers the complete article library', () => { const entries = getAllGlossaryEntries(); const referencedArticles = new Set(entries.flatMap((entry) => entry.articleSlugs)); @@ -107,6 +117,12 @@ describe('Chinese glossary content', () => { }); it('resolves canonical slugs and walks the Chinese term order without gaps', () => { + expect(GLOSSARY_CATEGORY_LABELS_ZH['Agentic inference']).toBe('智能体推理'); + expect(getZhGlossaryEntry('agentic-inference')?.term).toBe('智能体推理'); + expect(getZhGlossaryEntry('agentx')?.term).toBe('AgentX'); + expect(getZhGlossaryEntry('trace-replay')?.term).toBe('轨迹回放'); + expect(getZhGlossaryEntry('closed-loop-benchmark')?.term).toBe('闭环基准测试'); + expect(getZhGlossaryEntry('subagent')?.term).toBe('子智能体'); expect(getZhGlossaryEntry('multi-token-prediction')?.term).toBe('多 token 预测'); expect(getZhGlossaryEntry('not-a-real-term')).toBeUndefined(); diff --git a/packages/app/src/lib/glossary.ts b/packages/app/src/lib/glossary.ts index cdacf6f0c..13582f806 100644 --- a/packages/app/src/lib/glossary.ts +++ b/packages/app/src/lib/glossary.ts @@ -1,6 +1,7 @@ export const GLOSSARY_CATEGORIES = [ 'Benchmark metrics', 'Serving', + 'Agentic inference', 'Parallelism', 'Hardware', 'Numerical precision', @@ -66,6 +67,126 @@ const entries = [ relatedTerms: ['inference-engine', 'prefill', 'decode', 'throughput', 'interactivity'], articleSlugs: [INFERENCEMAX, INFERENCEX_V2], }, + { + slug: 'agentic-inference', + term: 'Agentic inference', + aliases: ['AI agent inference', 'agent inference'], + category: 'Agentic inference', + plainEnglish: + 'Agentic inference serves an AI system that works through a task over many model requests, often using tools and delegating work along the way.', + definition: + 'Agentic inference is model serving for agents that maintain state across multiple turns, call tools, reuse growing context, and may run subagents in parallel.', + explanation: + 'A single agent session can alternate between model requests, tool execution, and waiting periods. Later requests often include much of the earlier conversation, so prefix caching and KV-cache capacity affect both speed and cost. Parallel subagents add branches with their own request timing and context growth.', + significance: + 'Fixed input and output lengths miss several pressures created by agents. Long shared prefixes change cache behavior, tool delays make traffic bursty, and concurrent branches compete for serving capacity. Hardware and software can rank differently under this request pattern.', + benchmarkContext: + 'InferenceX uses AgentX to measure agentic inference. Read AgentX results alongside fixed-sequence scenarios because they answer different capacity questions. AgentX reports the behavior of a closed-loop session replay instead of treating every request as an independent batch item.', + relatedTerms: ['agentx', 'agentic-coding-workload', 'subagent', 'prefix-caching', 'kv-cache'], + articleSlugs: [TILERT, VR_RUBIN, INFERENCEX_V2], + }, + { + slug: 'agentx', + term: 'AgentX', + aliases: ['AgentX benchmark', 'AgentX scenario'], + category: 'Agentic inference', + plainEnglish: + 'AgentX is the InferenceX workload for testing how inference systems serve complete long-context, multi-turn coding-agent sessions.', + definition: + 'AgentX is InferenceX’s agentic inference benchmark scenario, built from workload shapes derived from opt-in coding-agent traces after original content is removed.', + explanation: + 'AgentX reconstructs session structure with deterministic synthetic tokens. Its replay keeps request lengths, turn timing, shared-prefix growth, tool pauses, and main-agent or subagent dependencies while excluding original prompts, generated code, and tool payloads. The serving stack receives the traffic pattern without receiving the source conversation.', + significance: + 'Long contexts pressure KV-cache capacity, repeated prefixes reward effective cache reuse, and branch timing tests request scheduling. These effects are small or absent in short, independent requests. The resulting curve describes the complete serving system under agent traffic.', + benchmarkContext: + 'The Agentic scenario appears by default for models with matching AgentX data. Compare its throughput, latency, and interactivity only with other AgentX runs at compatible settings. Use fixed-sequence scenarios when the target workload is a conventional request stream.', + relatedTerms: [ + 'agentic-inference', + 'agentic-coding-workload', + 'trace-replay', + 'closed-loop-benchmark', + 'subagent', + ], + articleSlugs: [TILERT, VR_RUBIN], + }, + { + slug: 'agentic-coding-workload', + term: 'Agentic coding workload', + aliases: ['coding-agent workload', 'software-engineering agent workload'], + category: 'Agentic inference', + plainEnglish: + 'This is the request pattern created when a coding agent reads a repository, edits code, runs tools, and revisits the model until the task is done.', + definition: + 'An agentic coding workload is a multi-turn inference workload produced by a software agent that combines model generation with repository inspection, tool calls, code changes, and delegated subtasks.', + explanation: + 'Request sizes grow as the agent accumulates instructions, files, tool results, and earlier responses. Many turns reuse a large common prefix. Tool execution inserts uneven delays, while subagents can create overlapping request branches. These properties produce a different traffic shape from fixed-length prompt benchmarks.', + significance: + 'Coding agents can keep a serving system busy for minutes or hours through a chain of dependent calls. Cache policy, scheduler fairness, memory capacity, and tail latency all affect task progress. Peak decode throughput alone cannot describe that behavior.', + benchmarkContext: + 'AgentX represents this workload with trace-derived request shapes and deterministic synthetic content. It measures inference-system performance. Model coding quality requires a separate evaluation, so quality scores and AgentX serving results answer separate questions.', + relatedTerms: ['agentic-inference', 'agentx', 'subagent', 'prefix-caching', 'trace-replay'], + articleSlugs: [TILERT, VR_RUBIN, INFERENCEX_V2], + }, + { + slug: 'trace-replay', + term: 'Trace replay', + aliases: ['workload replay', 'session replay'], + category: 'Agentic inference', + plainEnglish: + 'Trace replay recreates the timing and shape of recorded sessions so a benchmark sends requests like the original workload.', + definition: + 'Trace replay is a benchmarking method that converts recorded request relationships, lengths, and timing into a repeatable workload for a system under test.', + explanation: + 'A replay can preserve a directed graph of main-agent turns, parallel subagent branches, and auxiliary requests. Deterministic synthetic tokens replace private content while retaining token counts and prefix relationships. Recorded gaps between turns reproduce the periods when an agent was using tools or waiting on dependencies.', + significance: + 'The method captures traffic features that a list of independent prompts cannot express. It also makes repeated hardware and software comparisons possible from the same session shapes. AgentX removes source-conversation content before publishing replay data.', + benchmarkContext: + 'AgentX replays trace-derived sessions through AIPerf. A fixed seed selects sessions, starting points, and synthetic content. Reported results cover the profiling window after cache warmup, which keeps run-to-run comparisons focused on steady-state serving behavior.', + relatedTerms: ['agentx', 'closed-loop-benchmark', 'subagent', 'concurrency', 'kv-cache'], + articleSlugs: [TILERT, VR_RUBIN], + }, + { + slug: 'closed-loop-benchmark', + term: 'Closed-loop benchmark', + aliases: ['closed-loop load test', 'closed-loop workload'], + category: 'Agentic inference', + plainEnglish: + 'In a closed-loop benchmark, each simulated user waits for one step to finish before sending the next step in that session.', + definition: + 'A closed-loop benchmark generates new work from each client in response to completion of its previous dependent request, subject to the workload’s recorded delays and branch structure.', + explanation: + 'Concurrency is the number of active clients or sessions; the simultaneous request count changes over time. Faster systems complete turns sooner and therefore issue more requests during the same profiling period. The exact request mix can vary slightly because progress through each sampled session depends on completion time.', + significance: + 'This load model resembles interactive agents, where the next action depends on the previous result. Throughput and latency remain coupled: a faster response advances the session and creates later work sooner. Low-concurrency runs can show more sampling variation than large pooled runs.', + benchmarkContext: + 'AgentX uses closed-loop concurrency. Its concurrency value is the number of agent clients; request batch size changes as the sessions advance. Read throughput, time to first token, and interactivity together.', + relatedTerms: ['agentx', 'trace-replay', 'concurrency', 'throughput', 'latency'], + articleSlugs: [TILERT, INFERENCEX_V2], + }, + { + slug: 'subagent', + term: 'Subagent', + aliases: ['child agent', 'delegated agent'], + category: 'Agentic inference', + plainEnglish: + 'A subagent is an additional agent started by a main agent to handle a smaller piece of the same task, sometimes at the same time as other work.', + definition: + 'A subagent is a delegated agent execution with its own conversation state and model requests, connected to a parent session through task and dependency relationships.', + explanation: + 'The main agent can launch one or more subagents and later consume their results. Their requests may overlap with the parent or with each other, creating branches in the session graph. Each branch can grow a separate context while sharing some initial instructions or repository state.', + significance: + 'Subagents make agent traffic less sequential. A serving stack may receive bursts of long-context requests from one user task, and scheduler decisions affect how quickly branches finish. Aggregate throughput can rise while an individual branch waits longer for service.', + benchmarkContext: + 'AgentX preserves subagent branches from the trace-derived workload and replays their dependencies. Delegation quality is outside its scope. The benchmark measures how the inference system serves the resulting parallel requests, shared prefixes, and completion timing.', + relatedTerms: [ + 'agentic-inference', + 'agentic-coding-workload', + 'agentx', + 'trace-replay', + 'concurrency', + ], + articleSlugs: [TILERT, VR_RUBIN], + }, { slug: 'inference-engine', term: 'Inference engine', diff --git a/packages/app/src/lib/i18n.test.ts b/packages/app/src/lib/i18n.test.ts index 7d89f66bc..65991565d 100644 --- a/packages/app/src/lib/i18n.test.ts +++ b/packages/app/src/lib/i18n.test.ts @@ -57,8 +57,8 @@ describe('hasZhSibling', () => { }); it('matches datasets, gated tabs, and agentic detail pages', () => { - expect(hasZhSibling('/datasets')).toBe(true); - expect(hasZhSibling('/datasets/some-set/conversations/abc123')).toBe(true); + expect(hasZhSibling('/agentx')).toBe(true); + expect(hasZhSibling('/agentx/some-set/conversations/abc123')).toBe(true); expect(hasZhSibling('/ai-chart')).toBe(true); expect(hasZhSibling('/current-inferencex-image')).toBe(true); expect(hasZhSibling('/feedback')).toBe(true); @@ -107,8 +107,8 @@ describe('switchLocalePath', () => { }); it('switches datasets pages within the language trees', () => { - expect(switchLocalePath('/datasets')).toBe('/zh/datasets'); - expect(switchLocalePath('/zh/datasets/some-set')).toBe('/datasets/some-set'); + expect(switchLocalePath('/agentx')).toBe('/zh/agentx'); + expect(switchLocalePath('/zh/agentx/some-set')).toBe('/agentx/some-set'); }); it('falls back to the other homepage for unmirrored paths', () => { diff --git a/packages/app/src/lib/i18n.ts b/packages/app/src/lib/i18n.ts index 13f4e4e53..10843fe77 100644 --- a/packages/app/src/lib/i18n.ts +++ b/packages/app/src/lib/i18n.ts @@ -60,7 +60,7 @@ export const ZH_MIRRORED_ROUTES: readonly { path: string; exact?: boolean }[] = { path: '/compare-spec-decode' }, { path: '/blog' }, { path: '/glossary' }, - { path: '/datasets' }, + { path: '/agentx' }, ]; export function hasZhSibling(enPathname: string): boolean { diff --git a/packages/app/src/lib/nudges/landing-banner.ts b/packages/app/src/lib/nudges/landing-banner.ts index bd291f883..cf555fa8b 100644 --- a/packages/app/src/lib/nudges/landing-banner.ts +++ b/packages/app/src/lib/nudges/landing-banner.ts @@ -1,2 +1,2 @@ -export const LANDING_BANNER_STORAGE_KEY = 'inferencex-kimi-k3-banner-dismissed'; +export const LANDING_BANNER_STORAGE_KEY = 'inferencex-agentic-results-banner-dismissed'; export const LANDING_BANNER_DISMISSED_ATTRIBUTE = 'data-landing-banner-dismissed'; diff --git a/packages/app/src/lib/nudges/registry.test.ts b/packages/app/src/lib/nudges/registry.test.ts index 7d46c5fb3..1b9219625 100644 --- a/packages/app/src/lib/nudges/registry.test.ts +++ b/packages/app/src/lib/nudges/registry.test.ts @@ -62,14 +62,14 @@ describe('NUDGE_REGISTRY integrity', () => { it('contains the expected set of migrated nudges', () => { const ids = NUDGE_REGISTRY.map((n) => n.id).toSorted(); expect(ids).toEqual([ + 'agentic-results-launch-banner', + 'agentic-results-launch-modal', 'eval-samples', 'export', 'feedback-modal', 'filter-hint', 'github-star-modal', 'gradient-label', - 'kimi-k3-launch-banner', - 'kimi-k3-launch-modal', 'reproducibility', 'star-nudge', ]); diff --git a/packages/app/src/lib/nudges/registry.tsx b/packages/app/src/lib/nudges/registry.tsx index 1a2b991b9..d296a9902 100644 --- a/packages/app/src/lib/nudges/registry.tsx +++ b/packages/app/src/lib/nudges/registry.tsx @@ -284,22 +284,22 @@ export const NUDGE_REGISTRY: NudgeDefinition[] = [ // Landing modals // ------------------------------------------------------------------------- { - id: 'kimi-k3-launch-modal', + id: 'agentic-results-launch-modal', type: 'modal', trigger: { type: 'immediate' }, dismissal: { type: 'permanent' }, - storageKey: 'inferencex-kimi-k3-modal-dismissed', + storageKey: 'inferencex-agentic-results-modal-dismissed', priority: 50, scope: 'landing', content: { icon: Sparkles, iconClassName: 'text-brand', - title: 'Kimi K3 is live', - titleZh: 'Kimi K3 已上线', + title: 'Real-world agentic inference benchmark results are live', + titleZh: '真实场景智能体推理基准测试结果已上线', description: - 'Day-zero benchmarks for Kimi K3 are now available across the latest NVIDIA and AMD chips. Results are experimental — see how the new model performs across hardware.', + 'Compare AgentX results for Kimi K3, DeepSeek-V4-Pro, MiniMax-M3, Qwen3.5 397B, and GLM-5.2 across supported chips and serving stacks.', descriptionZh: - 'Kimi K3 的首日基准测试数据现已覆盖最新的 NVIDIA 和 AMD Chip。结果为实验性数据——来看看新模型在不同硬件上的表现。', + '查看 Kimi K3、DeepSeek-V4-Pro、MiniMax-M3、Qwen3.5 397B 与 GLM-5.2 在支持 Chip 和推理服务栈上的 AgentX 结果。', testId: 'launch-modal', containerClassName: 'border-brand/40', badge: 'New', @@ -307,18 +307,18 @@ export const NUDGE_REGISTRY: NudgeDefinition[] = [ dismissLabel: 'Maybe Later', dismissLabelZh: '稍后再看', primaryAction: { - label: 'Explore', - labelZh: '开始探索', + label: 'View results', + labelZh: '查看结果', icon: , onClick: () => { - window.location.href = '/inference?preset=kimi-k3-launch'; + window.location.href = '/inference?i_seq=agentic-traces'; }, }, }, analytics: { - shown: 'kimi_k3_modal_shown', - dismissed: 'kimi_k3_modal_dismissed', - action: 'kimi_k3_modal_explored', + shown: 'agentic_results_modal_shown', + dismissed: 'agentic_results_modal_dismissed', + action: 'agentic_results_modal_viewed', }, }, { @@ -365,7 +365,7 @@ export const NUDGE_REGISTRY: NudgeDefinition[] = [ // Landing banner // ------------------------------------------------------------------------- { - id: 'kimi-k3-launch-banner', + id: 'agentic-results-launch-banner', type: 'banner', trigger: { type: 'immediate' }, dismissal: { type: 'permanent' }, @@ -376,23 +376,25 @@ export const NUDGE_REGISTRY: NudgeDefinition[] = [ content: { icon: Sparkles, iconClassName: 'text-brand', - title: 'Kimi K3 benchmarks are live', - titleZh: 'Kimi K3 基准测试已上线', - description: 'First inference numbers across NVIDIA and AMD chips, click to explore.', - descriptionZh: 'NVIDIA 和 AMD Chip 的首批推理数据,点击探索。', + title: 'Agentic benchmark results are live', + titleZh: '智能体基准测试结果已上线', + description: 'Compare AgentX across supported models, chips, and serving stacks.', + descriptionZh: '对比 AgentX 在支持模型、Chip 与推理服务栈上的表现。', testId: 'launch-banner', badge: 'New', badgeZh: '最新', - href: '/inference?preset=kimi-k3-launch', + href: '/inference?i_seq=agentic-traces', + linkLabel: 'View results', + linkLabelZh: '查看结果', onLinkClick: () => { - window.location.href = '/inference?preset=kimi-k3-launch'; + window.location.href = '/inference?i_seq=agentic-traces'; }, }, analytics: { - shown: 'launch_banner_shown', - dismissed: 'launch_banner_dismissed', - action: 'launch_banner_clicked', - properties: { banner_id: 'kimi-k3-launch', preset_id: 'kimi-k3-launch' }, + shown: 'agentic_results_banner_shown', + dismissed: 'agentic_results_banner_dismissed', + action: 'agentic_results_banner_clicked', + properties: { banner_id: 'agentic-results-launch', scenario: 'agentic-traces' }, }, }, ]; diff --git a/packages/app/src/lib/nudges/types.ts b/packages/app/src/lib/nudges/types.ts index 6605d1c9f..c19afcaa1 100644 --- a/packages/app/src/lib/nudges/types.ts +++ b/packages/app/src/lib/nudges/types.ts @@ -96,6 +96,9 @@ export interface NudgeContent { href?: string; /** Called when the banner link is clicked (for analytics). */ onLinkClick?: () => void; + /** Short action label shown at the end of the banner link. */ + linkLabel?: string; + linkLabelZh?: string; } // --------------------------------------------------------------------------- diff --git a/packages/app/src/lib/tab-meta-zh.test.ts b/packages/app/src/lib/tab-meta-zh.test.ts index 404871aec..5360ee9c8 100644 --- a/packages/app/src/lib/tab-meta-zh.test.ts +++ b/packages/app/src/lib/tab-meta-zh.test.ts @@ -5,6 +5,7 @@ import { SITE_URL } from '@semianalysisai/inferencex-constants'; import { isValidTab, TAB_META } from './tab-meta'; import { isZhTab, + LANDING_META_ZH, TAB_INTRO_ZH, TAB_LABELS_ZH, TAB_META_ZH, @@ -14,6 +15,19 @@ import { const HAN_REGEX = /\p{Script=Han}/u; +describe('Chinese agentic inference positioning', () => { + it('uses the category name for titles and AgentX for the scenario', () => { + expect(LANDING_META_ZH.title).toContain('智能体推理基准测试'); + expect(LANDING_META_ZH.title).not.toContain('AgentX'); + expect(LANDING_META_ZH.description).toMatch(/AgentX.*场景/u); + expect(LANDING_META_ZH.description).toContain('固定序列'); + expect(TAB_META_ZH.inference.title).toContain('智能体推理基准测试'); + expect(TAB_META_ZH.inference.title).not.toContain('AgentX'); + expect(TAB_META_ZH.inference.description).toMatch(/AgentX.*工作负载/u); + expect(TAB_INTRO_ZH.inference).toContain('固定序列'); + }); +}); + describe('ZH_TAB_KEYS', () => { it.each(ZH_TAB_KEYS)('mirrors a valid English tab "%s"', (tab) => { expect(isValidTab(tab)).toBe(true); diff --git a/packages/app/src/lib/tab-meta-zh.ts b/packages/app/src/lib/tab-meta-zh.ts index 206d5400d..371846ca5 100644 --- a/packages/app/src/lib/tab-meta-zh.ts +++ b/packages/app/src/lib/tab-meta-zh.ts @@ -4,9 +4,9 @@ import { AUTHOR_NAME, SITE_NAME, SITE_URL } from '@semianalysisai/inferencex-con import { ZH_OG_LOCALE, zhAlternates, zhPath } from '@/lib/i18n'; export const LANDING_META_ZH = { - title: '开源 AI 推理基准测试', + title: '开源智能体推理基准测试', description: - '跨 Chip 与推理框架对比 AI 推理性能。基于 NVIDIA GB200、B200、AMD MI355X 等硬件的真实基准测试。免费、开源、持续更新。', + '跨 Chip 与推理框架,对比 AgentX 长上下文多轮编码场景与固定序列 AI 推理。NVIDIA 与 AMD 的公开运行会在配置变更时更新。', }; export const ZH_TAB_KEYS = [ @@ -32,9 +32,9 @@ export function isZhTab(tab: string): tab is ZhTabKey { export const TAB_META_ZH: Record = { inference: { - title: 'AI 推理基准测试', + title: '智能体推理基准测试', description: - '跨 Chip 与云服务商对比 AI 推理延迟、吞吐量与首 token 延迟(TTFT)。基于 NVIDIA GB200、H100、AMD MI355X 等硬件的真实基准测试。', + '跨 Chip 与推理框架,对比智能体推理和固定序列 AI 推理的延迟、吞吐量、成本与首 token 延迟(TTFT)。AgentX 提供长上下文多轮编码工作负载。', }, evaluation: { title: 'LLM 评估结果', @@ -95,7 +95,7 @@ export const TAB_META_ZH: Record = { inference: - '本页面展示 InferenceX 的 AI 推理基准测试结果:跨 Chip、推理框架与模型对比吞吐量(token/s/Chip)、交互性(token/s/用户)、首 token 延迟(TTFT)等指标。每个数据点都来自公开的 GitHub Actions 工作流,可复现、可审计。', + '本页面展示 InferenceX 的智能体推理与固定序列 AI 推理基准测试结果:跨 Chip、推理框架与模型对比吞吐量(token/s/Chip)、交互性(token/s/用户)、首 token 延迟(TTFT)等指标。智能体推理数据来自 AgentX;该场景对公开智能体编码轨迹衍生出的长上下文、多轮、含 subagent 工作负载进行回放。每个数据点都来自公开的 GitHub Actions 工作流,可复现、可审计。', evaluation: '本页面展示 LLM 评估(evaluation)结果:使用标准化评估集对比各模型与部署配置的准确率,验证推理优化不会损害模型质量。', historical: @@ -143,7 +143,7 @@ export const NAV_LABELS_ZH: Record = { '/overview': '总览', '/inference': '仪表板', '/compare': 'Chip 对比', - '/datasets': '数据集', + '/agentx': 'AgentX', '/about': '关于', }; diff --git a/packages/app/src/lib/tab-meta.test.ts b/packages/app/src/lib/tab-meta.test.ts index 743e0ac3f..0f91ea940 100644 --- a/packages/app/src/lib/tab-meta.test.ts +++ b/packages/app/src/lib/tab-meta.test.ts @@ -1,6 +1,19 @@ import { describe, expect, it } from 'vitest'; -import { getTabTitle, isValidTab, TAB_META, VALID_TABS } from './tab-meta'; +import { getTabTitle, isValidTab, LANDING_META, TAB_META, VALID_TABS } from './tab-meta'; + +describe('agentic inference positioning', () => { + it('uses agentic inference for the category and AgentX for the scenario', () => { + expect(LANDING_META.title).toContain('Agentic Inference Benchmark'); + expect(LANDING_META.title).not.toContain('AgentX'); + expect(LANDING_META.description).toMatch(/AgentX.*scenario/u); + expect(LANDING_META.description).toContain('fixed-sequence'); + expect(TAB_META.inference.title).toContain('Agentic Inference'); + expect(TAB_META.inference.title).not.toContain('AgentX'); + expect(TAB_META.inference.description).toMatch(/AgentX.*workload/u); + expect(TAB_META.inference.description).toContain('fixed-sequence'); + }); +}); describe('isValidTab', () => { it.each(VALID_TABS)('returns true for valid tab "%s"', (tab) => { diff --git a/packages/app/src/lib/tab-meta.ts b/packages/app/src/lib/tab-meta.ts index 0449e1dc5..4ac1649ab 100644 --- a/packages/app/src/lib/tab-meta.ts +++ b/packages/app/src/lib/tab-meta.ts @@ -4,9 +4,9 @@ import { AUTHOR_NAME, SITE_NAME, SITE_URL } from '@semianalysisai/inferencex-con import { hasZhSibling, languageAlternates } from '@/lib/i18n'; export const LANDING_META = { - title: 'Open Source AI Inference Benchmark', + title: 'Open-Source Agentic Inference Benchmark', description: - 'Compare AI inference performance across chips and frameworks. Real benchmarks on NVIDIA GB200, B200, AMD MI355X, and more. Free, open-source, continuously updated.', + "Compare AgentX, InferenceX's long-context, multi-turn coding scenario, with fixed-sequence AI inference across chips and frameworks. Public NVIDIA and AMD runs update when configurations change.", }; export const VALID_TABS = [ @@ -28,9 +28,9 @@ export type TabKey = (typeof VALID_TABS)[number]; export const TAB_META: Record = { inference: { - title: 'AI Inference Benchmarks', + title: 'Agentic Inference Benchmarks', description: - 'Compare AI inference latency, throughput, and time-to-first-token across chips and providers. Real benchmarks on NVIDIA GB200, H100, AMD MI355X, and more.', + 'Compare latency, throughput, cost, and time-to-first-token for agentic and fixed-sequence AI inference across chips and serving frameworks. AgentX supplies the long-context, multi-turn coding workload.', }, evaluation: { title: 'LLM Evaluation Results', diff --git a/packages/constants/src/seo.test.ts b/packages/constants/src/seo.test.ts new file mode 100644 index 000000000..6c25667c3 --- /dev/null +++ b/packages/constants/src/seo.test.ts @@ -0,0 +1,19 @@ +import { describe, expect, it } from 'vitest'; + +import { DESCRIPTION, DESCRIPTION_ZH, SITE_TITLE, SITE_TITLE_ZH } from './seo'; + +describe('site positioning', () => { + it('uses agentic inference for the category and AgentX for the scenario in English', () => { + expect(SITE_TITLE).toContain('Agentic Inference Benchmark'); + expect(SITE_TITLE).not.toContain('AgentX'); + expect(DESCRIPTION).toMatch(/agentic inference benchmark.*AgentX.*scenario/u); + expect(DESCRIPTION).toContain('fixed-sequence'); + }); + + it('mirrors the category and scenario distinction in Simplified Chinese', () => { + expect(SITE_TITLE_ZH).toContain('智能体推理基准测试'); + expect(SITE_TITLE_ZH).not.toContain('AgentX'); + expect(DESCRIPTION_ZH).toMatch(/智能体推理基准测试.*AgentX.*场景/u); + expect(DESCRIPTION_ZH).toContain('固定序列'); + }); +}); diff --git a/packages/constants/src/seo.ts b/packages/constants/src/seo.ts index f50074d49..ec05ad4f9 100644 --- a/packages/constants/src/seo.ts +++ b/packages/constants/src/seo.ts @@ -3,9 +3,9 @@ export const SITE_URL = 'https://inferencex.semianalysis.com'; export const AUTHOR_NAME = 'SemiAnalysis'; export const AUTHOR_URL = 'https://semianalysis.com'; export const AUTHOR_HANDLE = '@SemiAnalysis_'; -export const SITE_TITLE = `${SITE_NAME} by ${AUTHOR_NAME} — AI Inference Benchmark`; +export const SITE_TITLE = `${SITE_NAME} by ${AUTHOR_NAME} — Agentic Inference Benchmark`; export const DESCRIPTION = - 'InferenceX is the open-source AI inference benchmark that matches the rapid pace of modern AI development. Powered by one of the largest open-source chip CI/CD fleets with NVIDIA GB200, AMD MI355X & many more.'; + 'InferenceX is an open-source agentic inference benchmark. It compares the AgentX long-context, multi-turn coding scenario with fixed-sequence serving on NVIDIA, AMD, and other accelerators.'; /** * Social-proof line woven into page meta descriptions to lift search CTR. The * named supporters mirror the published /quotes supporters page so the copy @@ -21,7 +21,7 @@ export const OG_IMAGE = `${SITE_URL}/og-image.png`; * names (InferenceX, SemiAnalysis, GPU SKUs) stay in English per the * translation quality bar in AGENTS.md. */ -export const SITE_TITLE_ZH = `${SITE_NAME} by ${AUTHOR_NAME} — AI 推理基准测试`; +export const SITE_TITLE_ZH = `${SITE_NAME} by ${AUTHOR_NAME} — 智能体推理基准测试`; export const DESCRIPTION_ZH = - 'InferenceX 是紧跟现代 AI 发展节奏的开源 AI 推理基准测试,由规模领先的开源 Chip CI/CD 集群持续驱动,涵盖 NVIDIA GB200、AMD MI355X 等众多硬件。'; + 'InferenceX 是开源智能体推理基准测试平台,对比 AgentX 长上下文多轮编码场景与固定序列服务在 NVIDIA、AMD 等加速器上的性能。'; export const SUPPORTERS_LINE_ZH = '获得 OpenAI、Microsoft 与 PyTorch 基金会的支持。';