fix(pricing): add missing Kiro model pricing rows (#3835)

The kiro table in DEFAULT_PRICING was missing models the Kiro registry serves
(most visibly claude-sonnet-4.6), so getPricingForModel() returned null and their
usage cost was reported as $0.00. Adds the missing rows.

Integrated into release/v3.8.25.

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
This commit is contained in:
NOXX - Commiter 2026-06-14 16:24:24 +03:00 committed by GitHub
parent 315ac98b49
commit bcb7ed00c7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 71 additions and 4 deletions

View file

@ -28,7 +28,7 @@
"open-sse/services/batchProcessor.ts": 828,
"open-sse/services/browserBackedChat.ts": 850,
"open-sse/services/claudeCodeCompatible.ts": 1202,
"open-sse/services/combo.ts": 5198,
"open-sse/services/combo.ts": 5203,
"open-sse/services/rateLimitManager.ts": 1017,
"open-sse/services/tokenRefresh.ts": 1997,
"open-sse/services/usage.ts": 3394,
@ -94,10 +94,10 @@
"src/lib/usage/providerLimits.ts": 949,
"src/lib/usage/usageHistory.ts": 854,
"src/shared/components/OAuthModal.tsx": 960,
"src/shared/components/RequestLoggerV2.tsx": 1276,
"src/shared/components/RequestLoggerV2.tsx": 1282,
"src/shared/components/analytics/charts.tsx": 1558,
"src/shared/constants/cliTools.ts": 875,
"src/shared/constants/pricing.ts": 1470,
"src/shared/constants/pricing.ts": 1508,
"src/shared/constants/providers.ts": 3147,
"src/shared/constants/sidebarVisibility.ts": 1006,
"src/shared/services/cliRuntime.ts": 1090,
@ -123,5 +123,6 @@
"_rebaseline_2026_06_13_2743d_skipbreaker": "Re-baseline #2743 gap-d (testar consumer do skipProviderBreaker): combo.ts 5131→5162 (+31). Crescimento = extração do boolean inline da decisão de circuit-breaker para o predicado puro EXPORTADO shouldRecordProviderBreakerFailure() (byte-idêntico) + JSDoc, para torná-lo unit-testável sem o harness completo de combo. Shrink estrutural segue com #3501.",
"_rebaseline_2026_06_13_v3825_prettier_reconcile": "Reconciliação tardia: o prettier do pre-commit reformatou 3 arquivos DEPOIS da medição de file-size dos PRs, inflando linhas além do baseline setado — OAuthModal.tsx 956→960 e providers.ts 3146→3147 (#3324), combo.ts 5162→5164 (#2743d). Bumps de reformatação automática (sem lógica nova). LIÇÃO: medir file-size pós-commit (pós-prettier), não antes.",
"_rebaseline_2026_06_14_3826_release_drift": "Re-baseline release/v3.8.25 drift already documented from #3809 owner changes: ProxyRegistryManager.tsx 1072→1089, sidebarVisibility.ts 990→1006, schemas.ts 2519→2522. This PR does not touch those source files; updating the frozen values restores Fast Quality Gates on the current release branch.",
"_rebaseline_2026_06_14_3825_combo_stickiness": "Re-baseline #3825 (sessionless combo stickiness + reasoning-aware readiness): combo.ts 5164→5198 (+34, pós-prettier). Crescimento = deriveComboSessionKey() + effectiveSessionId threading nos sites de read/write do pin server-side. streamReadinessPolicy.ts não-frozen (sob cap). Lógica coesa no handler de combo; não-extraível."
"_rebaseline_2026_06_14_3825_combo_stickiness": "Re-baseline #3825 (sessionless combo stickiness + reasoning-aware readiness): combo.ts 5164→5198 (+34, pós-prettier). Crescimento = deriveComboSessionKey() + effectiveSessionId threading nos sites de read/write do pin server-side. streamReadinessPolicy.ts não-frozen (sob cap). Lógica coesa no handler de combo; não-extraível.",
"_rebaseline_2026_06_14_r3_3835_kiro_pricing": "PR #3835 own growth: pricing.ts 1470→1508 (+38 = missing Kiro pricing rows, claude-sonnet-4.6 etc., pure data). Also carries inherited release/v3.8.25 drift not yet frozen by prior r2 merges: RequestLoggerV2.tsx 1276→1282 (#3820 resizable log table) and combo.ts 5198→5203 (#3811 round-robin replay-response fix). This PR does not touch RequestLoggerV2/combo.ts source; updating the frozen values restores Fast Quality Gates on the current release branch."
}

View file

@ -1348,6 +1348,13 @@ export const DEFAULT_PRICING = {
reasoning: 75.0,
cache_creation: 15.0,
},
"claude-sonnet-4.6": {
input: 3.0,
output: 15.0,
cached: 1.5,
reasoning: 15.0,
cache_creation: 3.0,
},
"deepseek-v3.2": {
input: 0.27,
output: 1.1,
@ -1355,6 +1362,14 @@ export const DEFAULT_PRICING = {
reasoning: 1.1,
cache_creation: 0.27,
},
// Registry exposes this model as "deepseek-3.2" (no "v") — keep both keys priced.
"deepseek-3.2": {
input: 0.27,
output: 1.1,
cached: 0.07,
reasoning: 1.1,
cache_creation: 0.27,
},
"minimax-m2.1": {
input: 0.4,
output: 1.6,
@ -1362,6 +1377,21 @@ export const DEFAULT_PRICING = {
reasoning: 1.6,
cache_creation: 0.4,
},
// MiniMax M2.5 — cheaper than M2.1, reasoning + tools
"minimax-m2.5": {
input: 0.27,
output: 0.95,
cached: 0.135,
reasoning: 1.425,
cache_creation: 0.27,
},
"glm-5": {
input: 1.0,
output: 3.2,
cached: 0.2,
reasoning: 4.8,
cache_creation: 1.0,
},
"qwen3-coder-next": {
input: 2.0,
output: 8.0,
@ -1377,6 +1407,14 @@ export const DEFAULT_PRICING = {
reasoning: 15.0,
cache_creation: 3.0,
},
// Registry exposes the Auto model as id "auto-kiro" — keep both keys priced.
"auto-kiro": {
input: 3.0,
output: 15.0,
cached: 1.5,
reasoning: 15.0,
cache_creation: 3.0,
},
},
};

View file

@ -81,3 +81,31 @@ test("Kiro catalog exposes Claude Opus 4.8 alongside 4.7 with matching pricing",
const kiroPricing = (DEFAULT_PRICING as Record<string, Record<string, unknown>>).kiro;
assert.ok(kiroPricing["claude-opus-4.8"], "kiro pricing must include claude-opus-4.8");
});
test("Every Kiro registry model resolves a non-zero pricing row (no $0.00 usage)", async () => {
const { getPricingForModel } = await import("../../src/shared/constants/pricing.ts");
const models = getModelsByProviderId("kiro");
assert.ok(models.length > 0, "kiro must expose models");
for (const model of models) {
const pricing = getPricingForModel("kiro", model.id) as
| { input?: number; output?: number }
| null;
assert.ok(pricing, `kiro pricing must include "${model.id}"`);
assert.equal(
typeof pricing?.input === "number" && typeof pricing?.output === "number",
true,
`kiro pricing for "${model.id}" must have numeric input/output`
);
}
// Regression guard for the reported issue: Sonnet 4.6 must be priced like Sonnet 4.5.
const sonnet46 = getPricingForModel("kiro", "claude-sonnet-4.6") as {
input: number;
output: number;
} | null;
assert.ok(sonnet46, "kiro pricing must include claude-sonnet-4.6");
assert.equal(sonnet46?.input, 3.0);
assert.equal(sonnet46?.output, 15.0);
});