From bcb7ed00c7aa5df377b5cfa687842e9b248f64d1 Mon Sep 17 00:00:00 2001 From: NOXX - Commiter Date: Sun, 14 Jun 2026 16:24:24 +0300 Subject: [PATCH] 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 --- file-size-baseline.json | 9 +++--- src/shared/constants/pricing.ts | 38 ++++++++++++++++++++++++++ tests/unit/catalog-updates-v3x.test.ts | 28 +++++++++++++++++++ 3 files changed, 71 insertions(+), 4 deletions(-) diff --git a/file-size-baseline.json b/file-size-baseline.json index 39e3377f1..9f1468ce3 100644 --- a/file-size-baseline.json +++ b/file-size-baseline.json @@ -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." } diff --git a/src/shared/constants/pricing.ts b/src/shared/constants/pricing.ts index 7fa507317..d245c9aab 100644 --- a/src/shared/constants/pricing.ts +++ b/src/shared/constants/pricing.ts @@ -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, + }, }, }; diff --git a/tests/unit/catalog-updates-v3x.test.ts b/tests/unit/catalog-updates-v3x.test.ts index 53623a5e8..5c7b0ea31 100644 --- a/tests/unit/catalog-updates-v3x.test.ts +++ b/tests/unit/catalog-updates-v3x.test.ts @@ -81,3 +81,31 @@ test("Kiro catalog exposes Claude Opus 4.8 alongside 4.7 with matching pricing", const kiroPricing = (DEFAULT_PRICING as Record>).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); +});