Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 2 additions & 22 deletions docs/tco-calculator.md
Original file line number Diff line number Diff line change
Expand Up @@ -460,31 +460,11 @@ gigawatt-year buys for that SKU (`gw-year`).
Both tabs offer the same model list. A model needs AgentX (`agentic_traces`)
measurements with an interpolable operating point and a token price source.
The page intersects its supported routes with live AgentX availability, so a
model without current trace data disappears from the selector. Muse Spark Open,
Qwen3.5, Qwen3.8 Flash Next, and MiniMax M3.1 Flash use OpenRouter pricing by
default; users can supply custom prices. GLM-5 currently has too little trace
data to interpolate a profit row.
model without current trace data disappears from the selector.
The public profit view APIs accept any known model and may return empty rows;
their `model` parameter is not restricted to the dashboard's list.

The four additions use model-specific default P90 interactivity targets. On
2026-10-24, a sweep of the public profit view API at every 5 tok/s/user from 5
to 150 found these lowest targets that maximize priced official SKU rows in
that range (using custom token prices to keep price availability independent of
curve coverage):

| Model | Rows at 45 | Default target (tok/s/user) | Rows at default |
| ------------------ | ---------: | --------------------------: | --------------: |
| Muse Spark Open | 1 | 85 | 7 |
| MiniMax M3.1 Flash | 2 | 125 | 7 |
| Qwen3.5 | 2 | 115 | 10 |
| Qwen3.8 Flash Next | 3 | 90 | 6 |

Both per-chip-hour and per-GW-year views returned the same row counts at these
targets. New benchmark runs can change the coverage. The target remains an
editable operating-point assumption, not a hosted API speed claim.

The five earlier models now follow the same rule. A 2026-10-25 public API sweep
Each model uses a default P90 interactivity target. A 2026-10-25 public API sweep
at every 5 tok/s/user from 5 to 300 found these lowest targets that maximize
priced official SKU rows in that range, again using custom token prices to
isolate curve coverage:
Expand Down
56 changes: 7 additions & 49 deletions packages/app/cypress/e2e/profit-estimator.cy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@ import {

const OPENROUTER_MODELS = {
data: [
{
id: 'meta/muse-spark-open',
pricing: { prompt: '0.00000125', completion: '0.00000425', input_cache_read: '0.00000015' },
},
{
id: 'moonshotai/kimi-k3',
pricing: { prompt: '0.0000006', completion: '0.0000025', input_cache_read: '0.0000001' },
Expand All @@ -37,18 +33,6 @@ const OPENROUTER_MODELS = {
id: 'deepseek/deepseek-v4.1-flash',
pricing: { prompt: '0.00000015', completion: '0.0000006', input_cache_read: '0.000000003' },
},
{
id: 'minimax/minimax-m3.1-flash',
pricing: { prompt: '0.00000015', completion: '0.0000006', input_cache_read: '0.00000003' },
},
{
id: 'qwen/qwen3.5-397b-a17b',
pricing: { prompt: '0.0000005', completion: '0.0000036', input_cache_read: '0.00000005' },
},
{
id: 'qwen/qwen3.8-flash',
pricing: { prompt: '0.00000015', completion: '0.00000047', input_cache_read: '0.00000002' },
},
],
};

Expand Down Expand Up @@ -85,31 +69,6 @@ function coverageRows(dbKey: string, target: number) {
});
}

describe('New agentic models on profit estimators', () => {
for (const [slug, label, dbKey, target] of [
['muse-spark-open', 'Muse Spark Open', 'musespark', 85],
['minimax-m31-flash', 'MiniMax M3.1 Flash', 'minimaxm31flash', 125],
['qwen-3-5', 'Qwen3.5', 'qwen3.5', 115],
['qwen-3-8-flash-next', 'Qwen3.8 Flash Next', 'qwen3.8next', 90],
] as const) {
for (const basis of ['profit-estimator', 'profit-estimator-per-gigawatt'] as const) {
it(`opens ${label} on ${basis} with more measured SKUs than target 45`, () => {
stubOpenRouter();
cy.intercept('GET', '/api/v1/benchmarks*', { body: coverageRows(dbKey, target) });
cy.visit(`/${basis}/${slug}`, { onBeforeLoad: suppressNudges });
cy.location('pathname').should('eq', `/${basis}/${slug}`);
cy.get('[data-testid="profit-model-selector"]').should('contain.text', label);
cy.get('button#profit-price-source').should('contain.text', 'OpenRouter');
cy.get('[data-testid="profit-target-input"]').should('have.value', String(target));
chart().find('text.revenue-label').should('have.length', 4);

cy.get('[data-testid="profit-target-input"]').clear().type('45').blur();
chart().find('text.revenue-label').should('have.length', 1);
});
}
}
});

describe('Earlier agentic models on profit estimators', () => {
for (const [slug, label, dbKey, previousTarget, target, previousBars] of [
['kimi-k3', 'Kimi K3', 'kimik3', 45, 60, 1],
Expand Down Expand Up @@ -639,16 +598,12 @@ describe('Profit Estimator per GW', () => {
cy.get('[data-testid="profit-precision-selector"]').should('not.exist');
cy.get('[data-testid="profit-model-selector"]').should('contain.text', 'Kimi K3').click();
cy.get('[role="option"]')
.should('have.length', 9)
.and('contain.text', 'Muse Spark Open')
.should('have.length', 5)
.and('contain.text', 'Kimi K3')
.and('contain.text', 'GLM5.2/GLM5.3')
.and('contain.text', 'MiniMax M3')
.and('contain.text', 'DeepSeek V4 Pro')
.and('contain.text', 'DeepSeek V4.1 Flash')
.and('contain.text', 'MiniMax M3.1 Flash')
.and('contain.text', 'Qwen3.5')
.and('contain.text', 'Qwen3.8 Flash Next');
.and('contain.text', 'DeepSeek V4.1 Flash');
cy.get('body').type('{esc}');
cy.get('button#profit-price-source').click();
cy.get('[role="option"]')
Expand Down Expand Up @@ -1148,9 +1103,12 @@ describe('Profit Estimator per GW — per-model route', () => {
cy.get('[data-testid="profit-scenario-selector"]').should('not.exist');
cy.get('[data-testid="profit-fixed-workload-note"]').should('not.exist');
});
cy.request(`${prefix}/profit-estimator-per-gigawatt/qwen-3-5`)
cy.request({
url: `${prefix}/profit-estimator-per-gigawatt/qwen-3-5`,
failOnStatusCode: false,
})
.its('status')
.should('eq', 200);
.should('eq', 404);
});
}
});
Expand Down
4 changes: 0 additions & 4 deletions packages/app/cypress/support/profit-fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,11 @@ export const PROFIT_MINIMAX_DB_KEY = 'minimaxm3';
export const PROFIT_DEEPSEEK_DB_KEY = 'dsv4';
export const PROFIT_DEEPSEEK_FLASH_DB_KEY = 'dsv41flash';
const PROFIT_DB_KEY_BY_DISPLAY_MODEL: Record<string, string> = {
'Muse-Spark-Open': 'musespark',
'Kimi-K3': PROFIT_MODEL_DB_KEY,
'GLM-5.2': PROFIT_GLM_DB_KEY,
'MiniMax-M3': PROFIT_MINIMAX_DB_KEY,
'DeepSeek-V4-Pro': PROFIT_DEEPSEEK_DB_KEY,
'DeepSeek-V4.1-Flash': PROFIT_DEEPSEEK_FLASH_DB_KEY,
'MiniMax-M3.1-Flash': 'minimaxm31flash',
'Qwen-3.5-397B-A17B': 'qwen3.5',
'Qwen3.8-Flash-Next': 'qwen3.8next',
};
const PROFIT_DB_KEYS = Object.values(PROFIT_DB_KEY_BY_DISPLAY_MODEL);
export const PROFIT_DATE = '2026-08-31';
Expand Down
4 changes: 0 additions & 4 deletions packages/app/src/app/api/v1/views/extensions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -327,10 +327,6 @@ describe('new dashboard projections', () => {
[Model.MiniMax_M3, 'minimaxm3', 115],
[Model.DeepSeek_V4_Pro, 'dsv4', 170],
[Model.DeepSeek_V4_1_Flash, 'dsv41flash', 150],
[Model.Muse_Spark_Open, 'musespark', 85],
[Model.MiniMax_M3_1_Flash, 'minimaxm31flash', 125],
[Model.Qwen3_5, 'qwen3.5', 115],
[Model.Qwen3_8_Flash_Next, 'qwen3.8next', 90],
] as const)(
'prices supported agentic model %s at its default through both public profit views',
async (model, dbKey, target) => {
Expand Down
13 changes: 0 additions & 13 deletions packages/app/src/components/calculator/profit-estimator.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -333,19 +333,6 @@ describe('parseTokenPriceInput', () => {
});

describe('profitModelDefaults', () => {
it.each([
[Model.Muse_Spark_Open, 85],
[Model.MiniMax_M3_1_Flash, 125],
[Model.Qwen3_5, 115],
[Model.Qwen3_8_Flash_Next, 90],
] as const)('opens %s at a 5-step target chosen for broader SKU coverage', (model, target) => {
const defaults = profitModelDefaults(model);
expect(defaults.interactivity).toBe(target);
expect(defaults.interactivity % 5).toBe(0);
expect(defaults.listPricing).toBeNull();
expect(defaults.labCutPct).toBe(DEFAULT_LAB_CUT_PCT);
});

it.each([
[Model.Kimi_K3, 60],
[Model.GLM_5_2, 135],
Expand Down
26 changes: 2 additions & 24 deletions packages/app/src/components/calculator/profit-estimator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,8 @@ export interface ProfitModelDefaults {
}

/**
* Per-model defaults. On 2026-10-24, the four newest models took the first
* 5-tok/s/user step that maximized priced AgentX SKU coverage in a 5–150 sweep:
* Muse Spark Open 85, MiniMax M3.1 Flash 125, Qwen3.5 115, Qwen3.8 Flash Next 90.
* On 2026-10-25, the same rule over 5–300 selected Kimi K3 60, GLM 5.2/5.3
* Per-model defaults. On 2026-10-25, the first 5-tok/s/user step that
* maximized priced AgentX SKU coverage in a 5–300 sweep selected Kimi K3 60, GLM 5.2/5.3
* 135, MiniMax M3 115, DeepSeek V4 Pro 170, and DeepSeek V4.1 Flash 150.
* These editable P90 targets show measured configurations; they are not claims
* about hosted API speeds. Curves outside the target range stay unpriced.
Expand All @@ -77,26 +75,6 @@ export interface ProfitModelDefaults {
* list prices and a 0% fee because their weights ship under the MIT license.
*/
const PROFIT_MODEL_DEFAULTS: Partial<Record<Model, ProfitModelDefaults>> = {
[Model.Muse_Spark_Open]: {
interactivity: 85,
labCutPct: DEFAULT_LAB_CUT_PCT,
listPricing: null,
},
[Model.MiniMax_M3_1_Flash]: {
interactivity: 125,
labCutPct: DEFAULT_LAB_CUT_PCT,
listPricing: null,
},
[Model.Qwen3_5]: {
interactivity: 115,
labCutPct: DEFAULT_LAB_CUT_PCT,
listPricing: null,
},
[Model.Qwen3_8_Flash_Next]: {
interactivity: 90,
labCutPct: DEFAULT_LAB_CUT_PCT,
listPricing: null,
},
[Model.DeepSeek_V4_Pro]: {
interactivity: 170,
labCutPct: 0,
Expand Down
2 changes: 1 addition & 1 deletion packages/app/src/lib/api/api-route-catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1361,7 +1361,7 @@ export const apiContractSourceDigests = [
},
{
source: 'src/components/calculator/profit-estimator.ts',
sourceSha256: '7ccc4a040faef875fef299bd4c29f33645a914efc69f9b73b53cda676d7b4aa7',
sourceSha256: '0eeaaed822068e9aa782e6b40ad1bb9ae31f70ef755f67622767f3b89ade4d1a',
reviewArea: {
en: 'Shared profit-estimator defaults and calculation parity, including model-specific target assumptions.',
zh: '利润估算器的共享默认值与计算一致性,包括各模型的目标假设。',
Expand Down
7 changes: 5 additions & 2 deletions packages/app/src/lib/catalog/data-mappings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -396,12 +396,15 @@ describe('getModelLabel', () => {
});

describe('getOpenRouterModelId', () => {
it('maps catalog models to exact OpenRouter ids', () => {
it('maps catalog models to exact OpenRouter ids without inventing one for Muse', () => {
for (const model of MODEL_OPTIONS) {
if (model === Model.Muse_Spark_Open) {
expect(getOpenRouterModelId(model)).toBeNull();
continue;
}
expect(getOpenRouterModelId(model), model).toMatch(/^[^/]+\/[^/]+$/u);
}
expect(getOpenRouterModelId(Model.DeepSeek_V4_Pro)).toBe('deepseek/deepseek-v4-pro-0813');
expect(getOpenRouterModelId(Model.Muse_Spark_Open)).toBe('meta/muse-spark-open');
});
});

Expand Down
1 change: 0 additions & 1 deletion packages/app/src/lib/catalog/data-mappings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ const MODEL_CONFIG: Record<Model, ModelConfig> = {
label: 'Muse Spark Open 816B',
prefix: 'musespark',
category: 'default',
openRouterModelId: 'meta/muse-spark-open',
logo: 'muse-mascot.webp',
},
[Model.DeepSeek_V4_Pro]: {
Expand Down
11 changes: 2 additions & 9 deletions packages/app/src/lib/routing/model-routes.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -175,23 +175,16 @@ describe('modelRoutePathnameRewrite', () => {
});

describe('modelRoutesForTab', () => {
it('serves agentic models with priced interpolation on both profit estimators and every model elsewhere', () => {
it('serves Kimi K3, GLM 5.2/5.3, MiniMax M3, DeepSeek V4 Pro and DeepSeek V4.1 Flash on the profit estimators and every model elsewhere', () => {
for (const tab of ['profit-estimator', 'profit-estimator-per-gigawatt'] as const) {
expect(modelRoutesForTab(tab).map((route) => route.model)).toEqual([
Model.Muse_Spark_Open,
Model.DeepSeek_V4_Pro,
Model.DeepSeek_V4_1_Flash,
Model.Kimi_K3,
Model.MiniMax_M3,
Model.MiniMax_M3_1_Flash,
Model.GLM_5_2,
Model.Qwen3_5,
Model.Qwen3_8_Flash_Next,
]);
expect(modelRouteAvailableForTab(tab, Model.Qwen3_5)).toBe(true);
expect(modelRouteAvailableForTab(tab, Model.Qwen3_8_Flash_Next)).toBe(true);
expect(modelRouteAvailableForTab(tab, Model.MiniMax_M3_1_Flash)).toBe(true);
expect(modelRouteAvailableForTab(tab, Model.Muse_Spark_Open)).toBe(true);
expect(modelRouteAvailableForTab(tab, Model.Qwen3_5)).toBe(false);
expect(modelRouteAvailableForTab(tab, Model.GLM_5_2)).toBe(true);
expect(modelRouteAvailableForTab(tab, Model.MiniMax_M3)).toBe(true);
expect(modelRoutesForTab(tab).find((route) => route.model === Model.MiniMax_M3)?.slug).toBe(
Expand Down
4 changes: 0 additions & 4 deletions packages/app/src/lib/routing/model-routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,11 @@ export function defaultRouteModel(tab: ModelRouteTab): Model {
}

const PROFIT_ESTIMATOR_MODELS: readonly Model[] = [
Model.Muse_Spark_Open,
Model.Kimi_K3,
Model.GLM_5_2,
Model.MiniMax_M3,
Model.MiniMax_M3_1_Flash,
Model.DeepSeek_V4_Pro,
Model.DeepSeek_V4_1_Flash,
Model.Qwen3_5,
Model.Qwen3_8_Flash_Next,
];
const MODEL_ROUTE_TAB_MODELS: Partial<Record<ModelRouteTab, readonly Model[]>> = {
'profit-estimator': PROFIT_ESTIMATOR_MODELS,
Expand Down
4 changes: 2 additions & 2 deletions packages/app/src/lib/views-api/docs/extensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ const PARAMETER_NOTES: Record<string, [string, string]> = {
'比较范围结束日期 YYYY-MM-DD,不得早于 start。历史视图将其用作含终点的数据范围。',
],
target: [
'Positive operating-point target, tok/s/user in interactivity-to-throughput mode. Both profit views use model-specific defaults: Kimi K3 60, GLM-5.2/5.3 135, MiniMax M3 115, DeepSeek V4 Pro 170, DeepSeek V4.1 Flash 150, Muse Spark Open 85, MiniMax M3.1 Flash 125, Qwen3.5 115, and Qwen3.8 Flash Next 90 tok/s/user. Dashboard links use /<model>/target/<value> route segments; this API continues to accept the target query parameter. These are editable SKU-coverage assumptions, not OpenRouter P90-equivalent measurements.',
'正数工作点目标;交互性转吞吐量模式下单位为 tok/s/user。两个利润视图按模型设置默认值:Kimi K3 为 60、GLM-5.2/5.3 为 135、MiniMax M3 为 115、DeepSeek V4 Pro 为 170、DeepSeek V4.1 Flash 为 150、Muse Spark Open 为 85、MiniMax M3.1 Flash 为 125、Qwen3.5 为 115、Qwen3.8 Flash Next 为 90 tok/s/user。仪表板链接通过 /<model>/target/<value> 路径片段传递目标值;本 API 仍使用 target 查询参数。这些默认值是用于扩大 SKU 覆盖范围的可修改假设,并非与 OpenRouter P90 等价的实测值。',
'Positive operating-point target, tok/s/user in interactivity-to-throughput mode. Both profit views use model-specific defaults: Kimi K3 60, GLM-5.2/5.3 135, MiniMax M3 115, DeepSeek V4 Pro 170 and DeepSeek V4.1 Flash 150 tok/s/user. Dashboard links use /<model>/target/<value> route segments; this API continues to accept the target query parameter. These are editable SKU-coverage assumptions, not OpenRouter P90-equivalent measurements.',
'正数工作点目标;交互性转吞吐量模式下单位为 tok/s/user。两个利润视图按模型设置默认值:Kimi K3 为 60、GLM-5.2/5.3 为 135、MiniMax M3 为 115、DeepSeek V4 Pro 为 170、DeepSeek V4.1 Flash 为 150 tok/s/user。仪表板链接通过 /<model>/target/<value> 路径片段传递目标值;本 API 仍使用 target 查询参数。这些默认值是用于扩大 SKU 覆盖范围的可修改假设,并非与 OpenRouter P90 等价的实测值。',
],
costProvider: [
'costh = owning, costr = renting. Profit views additionally accept custom with customCosts. No costn provider.',
Expand Down
2 changes: 1 addition & 1 deletion packages/skills/skills/inferencex-api/integrity.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"references/cli-contract.md": "4f070877eeefffad2860c58f79f68432fbe27aa21fc578a1c696f0309a3d7d7b",
"references/cli.md": "11e1183f7ed70d669019e8435ac16a6a9f873de027507b8850a9943f6659bfd9",
"references/collectivex.md": "f79cf8e2779a9289ab69f79f4a4b338e0b9a5f76a3750a3e969f33a744e726a1",
"references/dashboard-views.md": "333e4473a6027a45992a01bc2e908437dc6b5c43542dd481b0929ba95027f506",
"references/dashboard-views.md": "db9ba48896f75acf6531bd49d26062ee09307c6348f1e10b055cf62e093df85d",
"references/offline-exports.md": "95aa565dcd4c9e592159baa560a9a58217bc61e395de1c6daf0576795c7f4ec9",
"references/pareto.md": "1b4d2d163f982e3f2d97addce310789eae9c1e5badd82dd7501708c9e0385027",
"references/powerx.md": "5af5527d54a7e6191a5769080c122638b333b1ceb59e19fdee7df662a5cd3c8f",
Expand Down
Loading
Loading