bf8ad0d1ff
Session history was silently clipped to the first 4000 characters of the last 12 messages, so follow-ups could not see timing or audit tables. Keep an append-only tail plus a checkpoint summary, retry overflow in the same request, and expose cache hit rate in admin usage. Co-authored-by: Cursor <cursoragent@cursor.com>
58 lines
2.2 KiB
TypeScript
58 lines
2.2 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import {
|
|
cachedHistoryMessage,
|
|
cachedSystemMessage,
|
|
mergePromptCacheUsage,
|
|
promptCacheUsage,
|
|
} from "../src/lib/agent-generation-settings.ts";
|
|
|
|
test("normalizes AI SDK cache token details", () => {
|
|
assert.deepEqual(promptCacheUsage({
|
|
inputTokenDetails: { cacheReadTokens: 120, cacheWriteTokens: 30, noCacheTokens: 10 },
|
|
}), { readTokens: 120, writeTokens: 30, noCacheTokens: 10 });
|
|
});
|
|
|
|
test("normalizes OpenAI and legacy cache usage", () => {
|
|
assert.deepEqual(promptCacheUsage({ prompt_tokens_details: { cached_tokens: 45 } }), {
|
|
readTokens: 45,
|
|
writeTokens: 0,
|
|
noCacheTokens: 0,
|
|
});
|
|
assert.deepEqual(promptCacheUsage({ cachedInputTokens: 12, cacheCreationInputTokens: 8 }), {
|
|
readTokens: 12,
|
|
writeTokens: 8,
|
|
noCacheTokens: 0,
|
|
});
|
|
});
|
|
|
|
test("merges cache usage and only reports a hit when reads exist", () => {
|
|
assert.deepEqual(mergePromptCacheUsage([
|
|
{ readTokens: 4, writeTokens: 5, noCacheTokens: 6 },
|
|
{ readTokens: 7, writeTokens: 0, noCacheTokens: 1 },
|
|
]), { readTokens: 11, writeTokens: 5, noCacheTokens: 7 });
|
|
assert.equal(promptCacheUsage({ inputTokenDetails: { cacheWriteTokens: 5 } })?.readTokens, 0);
|
|
assert.equal(promptCacheUsage({ inputTokenDetails: { cacheReadTokens: 5 } })?.readTokens, 5);
|
|
});
|
|
|
|
test("adds an Anthropic cache boundary and safely degrades for other providers", () => {
|
|
assert.deepEqual(cachedSystemMessage("stable", "anthropic/claude-sonnet"), {
|
|
role: "system",
|
|
content: "stable",
|
|
providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } } },
|
|
});
|
|
assert.equal(cachedSystemMessage("stable", "openai/gpt-5"), null);
|
|
assert.equal(cachedSystemMessage("stable", { providerId: "deepseek" }), null);
|
|
});
|
|
|
|
test("marks only the last Anthropic history message for cache", () => {
|
|
const last = { role: "assistant" as const, content: "先前结论" };
|
|
assert.deepEqual(cachedHistoryMessage(last, "anthropic/claude-sonnet"), {
|
|
role: "assistant",
|
|
content: "先前结论",
|
|
providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } } },
|
|
});
|
|
assert.equal(cachedHistoryMessage(last, "openai/gpt-5"), last);
|
|
assert.equal(cachedHistoryMessage(last, { providerId: "deepseek" }), last);
|
|
});
|