From 84b8b9676a3912793f8bf38208b38760f6e79b17 Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Fri, 31 Jul 2026 16:03:59 +0200 Subject: [PATCH] fix(vscode): make cache hit rate write-aware --- .changeset/write-aware-cache-rate.md | 5 +++++ packages/kilo-vscode/tests/unit/model-usage.test.ts | 3 +++ .../webview-ui/src/components/chat/TaskUsage.tsx | 10 ++-------- .../kilo-vscode/webview-ui/src/context/model-usage.ts | 6 ++++++ 4 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 .changeset/write-aware-cache-rate.md diff --git a/.changeset/write-aware-cache-rate.md b/.changeset/write-aware-cache-rate.md new file mode 100644 index 00000000000..ad2d852104c --- /dev/null +++ b/.changeset/write-aware-cache-rate.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Show a write-aware cache hit rate in the VS Code session usage bar. diff --git a/packages/kilo-vscode/tests/unit/model-usage.test.ts b/packages/kilo-vscode/tests/unit/model-usage.test.ts index 4b6461f5308..4bdb344a4eb 100644 --- a/packages/kilo-vscode/tests/unit/model-usage.test.ts +++ b/packages/kilo-vscode/tests/unit/model-usage.test.ts @@ -1,6 +1,7 @@ import { describe, expect, test } from "bun:test" import type { Provider, SessionModelUsage } from "../../webview-ui/src/types/messages" import { + cacheRate, groupModelUsage, hasModelUsage, isSameSessionTree, @@ -44,6 +45,8 @@ describe("model usage", () => { }), ).toBeFalse() expect(tokenSummary(usage)).toEqual({ input: 10, output: 2, cached: 20 }) + expect(cacheRate(models[0])).toBe("57.1%") + expect(cacheRate({ ...models[0], tokens: { ...tokens, input: 0, cache: { read: 0, write: 0 } } })).toBe("-") expect(groupModelUsage(models, providers).map((group) => group.providerName)).toEqual(["Kilo Gateway", "MiniMax"]) expect(modelUsageName(models[0], providers)).toBe("Qwen 3.7 Plus") expect(modelUsageName(models[1], providers)).toBe("MiniMax M3") diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/TaskUsage.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/TaskUsage.tsx index 042a8754db2..ec27559a992 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/TaskUsage.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/TaskUsage.tsx @@ -5,7 +5,7 @@ import { Icon } from "@kilocode/kilo-ui/icon" import { useLanguage } from "../../context/language" import { useProvider } from "../../context/provider" import type { SessionModelUsage } from "../../types/messages" -import { groupModelUsage, modelUsageName, type TokenSummary } from "../../context/model-usage" +import { cacheRate, groupModelUsage, modelUsageName, type TokenSummary } from "../../context/model-usage" import { formatCompactCount } from "../../utils/format" interface TaskUsageProps { @@ -35,12 +35,6 @@ export const TaskUsage: Component = (props) => { if (value > 0 && value < 0.000001) return "<$0.000001" return money().format(value) } - const rate = (model: SessionModelUsage["models"][number]) => { - const total = model.tokens.input + model.tokens.cache.read - if (total === 0) return "-" - return `${((model.tokens.cache.read / total) * 100).toFixed(1)}%` - } - const Summary = () => ( <> Tokens @@ -102,7 +96,7 @@ export const TaskUsage: Component = (props) => {
Cache R {count(model.tokens.cache.read)} · W {count(model.tokens.cache.write)} · Hit Rate{" "} - {rate(model)} + {cacheRate(model)}
)} diff --git a/packages/kilo-vscode/webview-ui/src/context/model-usage.ts b/packages/kilo-vscode/webview-ui/src/context/model-usage.ts index 4bcb528e7ae..fcbfa7e72db 100644 --- a/packages/kilo-vscode/webview-ui/src/context/model-usage.ts +++ b/packages/kilo-vscode/webview-ui/src/context/model-usage.ts @@ -46,6 +46,12 @@ export function tokenSummary(usage: SessionModelUsage): TokenSummary { } } +export function cacheRate(model: SessionModelUsage["models"][number]) { + const total = model.tokens.input + model.tokens.cache.read + model.tokens.cache.write + if (total === 0) return "-" + return `${((model.tokens.cache.read / total) * 100).toFixed(1)}%` +} + export function groupModelUsage(models: SessionModelUsage["models"], providers: Record) { const groups = new Map() for (const model of models) {