fix(ui): context stale in prompt input (#12695)
This commit is contained in:
@@ -79,15 +79,16 @@ describe("getSessionContextMetrics", () => {
|
|||||||
expect(metrics.context?.usage).toBeNull()
|
expect(metrics.context?.usage).toBeNull()
|
||||||
})
|
})
|
||||||
|
|
||||||
test("memoizes by message and provider array identity", () => {
|
test("recomputes when message array is mutated in place", () => {
|
||||||
const messages = [assistant("a1", { input: 10, output: 10, reasoning: 10, read: 10, write: 10 }, 0.25)]
|
const messages = [assistant("a1", { input: 10, output: 10, reasoning: 10, read: 10, write: 10 }, 0.25)]
|
||||||
const providers = [{ id: "openai", models: {} }]
|
const providers = [{ id: "openai", models: {} }]
|
||||||
|
|
||||||
const one = getSessionContextMetrics(messages, providers)
|
const one = getSessionContextMetrics(messages, providers)
|
||||||
|
messages.push(assistant("a2", { input: 100, output: 20, reasoning: 0, read: 0, write: 0 }, 0.75))
|
||||||
const two = getSessionContextMetrics(messages, providers)
|
const two = getSessionContextMetrics(messages, providers)
|
||||||
const three = getSessionContextMetrics([...messages], providers)
|
|
||||||
|
|
||||||
expect(two).toBe(one)
|
expect(one.context?.message.id).toBe("a1")
|
||||||
expect(three).not.toBe(one)
|
expect(two.context?.message.id).toBe("a2")
|
||||||
|
expect(two.totalCost).toBe(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -34,8 +34,6 @@ type Metrics = {
|
|||||||
context: Context | undefined
|
context: Context | undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
const cache = new WeakMap<Message[], WeakMap<Provider[], Metrics>>()
|
|
||||||
|
|
||||||
const tokenTotal = (msg: AssistantMessage) => {
|
const tokenTotal = (msg: AssistantMessage) => {
|
||||||
return msg.tokens.input + msg.tokens.output + msg.tokens.reasoning + msg.tokens.cache.read + msg.tokens.cache.write
|
return msg.tokens.input + msg.tokens.output + msg.tokens.reasoning + msg.tokens.cache.read + msg.tokens.cache.write
|
||||||
}
|
}
|
||||||
@@ -80,15 +78,5 @@ const build = (messages: Message[], providers: Provider[]): Metrics => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function getSessionContextMetrics(messages: Message[], providers: Provider[]) {
|
export function getSessionContextMetrics(messages: Message[], providers: Provider[]) {
|
||||||
const byProvider = cache.get(messages)
|
return build(messages, providers)
|
||||||
if (byProvider) {
|
|
||||||
const hit = byProvider.get(providers)
|
|
||||||
if (hit) return hit
|
|
||||||
}
|
|
||||||
|
|
||||||
const value = build(messages, providers)
|
|
||||||
const next = byProvider ?? new WeakMap<Provider[], Metrics>()
|
|
||||||
next.set(providers, value)
|
|
||||||
if (!byProvider) cache.set(messages, next)
|
|
||||||
return value
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user