test: dedupe vertex stream payload fixture

This commit is contained in:
Peter Steinberger
2026-04-18 22:05:51 +01:00
parent 23ff2a9cf7
commit 127bafa0b9

View File

@@ -63,6 +63,33 @@ function makeModel(params: { id: string; maxTokens?: number }): Model<"anthropic
} as Model<"anthropic-messages">;
}
const CACHE_BOUNDARY_PROMPT = `Stable prefix${SYSTEM_PROMPT_CACHE_BOUNDARY}Dynamic suffix`;
type PayloadHook = (payload: unknown, payloadModel: unknown) => Promise<unknown>;
function captureCacheBoundaryPayloadHook(onPayload: PayloadHook) {
const streamFn = createAnthropicVertexStreamFn("vertex-project", "us-east5");
const model = makeModel({ id: "claude-sonnet-4-6", maxTokens: 64000 });
void streamFn(
model,
{
systemPrompt: CACHE_BOUNDARY_PROMPT,
messages: [{ role: "user", content: "Hello" }],
} as never,
{
cacheRetention: "short",
onPayload,
} as never,
);
const transportOptions = hoisted.streamAnthropicMock.mock.calls[0]?.[2] as {
onPayload?: PayloadHook;
};
return { model, onPayload: transportOptions.onPayload };
}
describe("createAnthropicVertexStreamFn", () => {
beforeAll(async () => {
({ createAnthropicVertexStreamFn, createAnthropicVertexStreamFnForModel } =
@@ -163,37 +190,20 @@ describe("createAnthropicVertexStreamFn", () => {
});
it("applies Anthropic cache-boundary shaping before forwarding payload hooks", async () => {
const streamFn = createAnthropicVertexStreamFn("vertex-project", "us-east5");
const model = makeModel({ id: "claude-sonnet-4-6", maxTokens: 64000 });
const onPayload = vi.fn(async (payload: unknown) => payload);
void streamFn(
model,
{
systemPrompt: `Stable prefix${SYSTEM_PROMPT_CACHE_BOUNDARY}Dynamic suffix`,
messages: [{ role: "user", content: "Hello" }],
} as never,
{
cacheRetention: "short",
onPayload,
} as never,
);
const transportOptions = hoisted.streamAnthropicMock.mock.calls[0]?.[2] as {
onPayload?: (payload: unknown, payloadModel: unknown) => Promise<unknown>;
};
const { model, onPayload: transportPayloadHook } = captureCacheBoundaryPayloadHook(onPayload);
const payload = {
system: [
{
type: "text",
text: `Stable prefix${SYSTEM_PROMPT_CACHE_BOUNDARY}Dynamic suffix`,
text: CACHE_BOUNDARY_PROMPT,
cache_control: { type: "ephemeral" },
},
],
messages: [{ role: "user", content: "Hello" }],
};
const nextPayload = await transportOptions.onPayload?.(payload, model);
const nextPayload = await transportPayloadHook?.(payload, model);
expect(onPayload).toHaveBeenCalledWith(
{
@@ -251,39 +261,23 @@ describe("createAnthropicVertexStreamFn", () => {
});
it("reapplies Anthropic cache-boundary shaping when payload hooks return a fresh payload", async () => {
const streamFn = createAnthropicVertexStreamFn("vertex-project", "us-east5");
const model = makeModel({ id: "claude-sonnet-4-6", maxTokens: 64000 });
const onPayload = vi.fn(async () => ({
system: [
{
type: "text",
text: `Stable prefix${SYSTEM_PROMPT_CACHE_BOUNDARY}Dynamic suffix`,
text: CACHE_BOUNDARY_PROMPT,
},
],
messages: [{ role: "user", content: "Hello again" }],
}));
const { model, onPayload: transportPayloadHook } = captureCacheBoundaryPayloadHook(onPayload);
void streamFn(
model,
{
systemPrompt: `Stable prefix${SYSTEM_PROMPT_CACHE_BOUNDARY}Dynamic suffix`,
messages: [{ role: "user", content: "Hello" }],
} as never,
{
cacheRetention: "short",
onPayload,
} as never,
);
const transportOptions = hoisted.streamAnthropicMock.mock.calls[0]?.[2] as {
onPayload?: (payload: unknown, payloadModel: unknown) => Promise<unknown>;
};
const nextPayload = await transportOptions.onPayload?.(
const nextPayload = await transportPayloadHook?.(
{
system: [
{
type: "text",
text: `Stable prefix${SYSTEM_PROMPT_CACHE_BOUNDARY}Dynamic suffix`,
text: CACHE_BOUNDARY_PROMPT,
},
],
messages: [{ role: "user", content: "Hello" }],