fix(tui): flag likely cache busts accurately (#38727)
This commit is contained in:
parent
ee5460a152
commit
3193f3aa95
3 changed files with 131 additions and 20 deletions
|
|
@ -1,6 +1,92 @@
|
|||
import { expect, test } from "bun:test"
|
||||
import type { SessionMessageAssistant, SessionMessageInfo } from "@opencode-ai/client"
|
||||
import { messageBoundaryIDs, reduceSessionRows } from "../../../src/routes/session/rows"
|
||||
import { cacheReuseDrop, messageBoundaryIDs, reduceSessionRows } from "../../../src/routes/session/rows"
|
||||
|
||||
test("filters OpenAI cache quantization from cache reuse drops", () => {
|
||||
const openai = { id: "gpt", providerID: "openai" }
|
||||
expect(cacheReuseDrop(undefined, { read: 10_000, model: openai })).toBeUndefined()
|
||||
expect(cacheReuseDrop({ read: 10_000, model: openai }, { read: 11_000, model: openai })).toBeUndefined()
|
||||
expect(cacheReuseDrop({ read: 10_000, model: openai }, { read: 8_977, model: openai })).toBe(1_023)
|
||||
expect(cacheReuseDrop({ read: 10_000, model: openai }, { read: 8_976, model: openai })).toBeUndefined()
|
||||
expect(cacheReuseDrop({ read: 10_000, model: openai }, { read: 8_500, model: openai })).toBeUndefined()
|
||||
expect(cacheReuseDrop({ read: 10_000, model: openai }, { read: 7_952, model: openai })).toBeUndefined()
|
||||
expect(cacheReuseDrop({ read: 10_000, model: openai }, { read: 7_951, model: openai })).toBe(2_049)
|
||||
})
|
||||
|
||||
test("compares cache reuse only for the same model", () => {
|
||||
const previous = { read: 10_000, model: { id: "claude", providerID: "anthropic" } }
|
||||
expect(cacheReuseDrop(previous, { read: 8_976, model: { id: "gpt", providerID: "openai" } })).toBeUndefined()
|
||||
expect(cacheReuseDrop(previous, { read: 8_976, model: { id: "claude", providerID: "anthropic" } })).toBe(1_024)
|
||||
expect(
|
||||
cacheReuseDrop(
|
||||
{ read: 10_000, model: { id: "gpt", providerID: "openai", variant: "low" } },
|
||||
{ read: 8_976, model: { id: "gpt", providerID: "openai", variant: "high" } },
|
||||
),
|
||||
).toBeUndefined()
|
||||
})
|
||||
|
||||
test("carries model identity with the cross-turn cache baseline", () => {
|
||||
const first = assistant("assistant-1", [])
|
||||
first.model = { id: "claude", providerID: "anthropic" }
|
||||
first.finish = "stop"
|
||||
first.tokens = { input: 1, output: 0, reasoning: 0, cache: { read: 10_000, write: 0 } }
|
||||
const second = assistant("assistant-2", [])
|
||||
second.model = { id: "gpt", providerID: "openai" }
|
||||
second.finish = "stop"
|
||||
second.tokens = { input: 1, output: 0, reasoning: 0, cache: { read: 8_976, write: 0 } }
|
||||
|
||||
const rows = reduceSessionRows(
|
||||
[
|
||||
{ type: "user", id: "user-1", text: "First", time: { created: 0 } },
|
||||
first,
|
||||
{ type: "user", id: "user-2", text: "Second", time: { created: 2 } },
|
||||
second,
|
||||
],
|
||||
new Set(),
|
||||
true,
|
||||
).filter((row) => row.type === "turn-usage")
|
||||
|
||||
expect(rows).toEqual([
|
||||
{ type: "turn-usage", messageIDs: ["assistant-1"] },
|
||||
{
|
||||
type: "turn-usage",
|
||||
messageIDs: ["assistant-2"],
|
||||
previousCache: { read: 10_000, model: { id: "claude", providerID: "anthropic" } },
|
||||
},
|
||||
])
|
||||
})
|
||||
|
||||
test("resets the cross-turn cache baseline after compaction", () => {
|
||||
const first = assistant("assistant-1", [])
|
||||
first.finish = "stop"
|
||||
first.tokens = { input: 1, output: 0, reasoning: 0, cache: { read: 370_176, write: 0 } }
|
||||
const second = assistant("assistant-2", [])
|
||||
second.finish = "stop"
|
||||
second.tokens = { input: 1, output: 0, reasoning: 0, cache: { read: 13_824, write: 0 } }
|
||||
|
||||
const rows = reduceSessionRows(
|
||||
[
|
||||
first,
|
||||
{
|
||||
type: "compaction",
|
||||
id: "compaction-1",
|
||||
status: "completed",
|
||||
reason: "auto",
|
||||
summary: "Compacted context",
|
||||
recent: "",
|
||||
time: { created: 2 },
|
||||
},
|
||||
second,
|
||||
],
|
||||
new Set(),
|
||||
true,
|
||||
).filter((row) => row.type === "turn-usage")
|
||||
|
||||
expect(rows).toEqual([
|
||||
{ type: "turn-usage", messageIDs: ["assistant-1"] },
|
||||
{ type: "turn-usage", messageIDs: ["assistant-2"] },
|
||||
])
|
||||
})
|
||||
|
||||
test("assigns assistant boundaries to the first rendered row instead of the first text row", () => {
|
||||
const messages: SessionMessageInfo[] = [
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue