46 lines
1.7 KiB
TypeScript
46 lines
1.7 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import {
|
|
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);
|
|
});
|