From 127bafa0b9aebaac32137441bb5a876c0c5e353b Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 18 Apr 2026 22:05:51 +0100 Subject: [PATCH] test: dedupe vertex stream payload fixture --- src/agents/anthropic-vertex-stream.test.ts | 74 ++++++++++------------ 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/src/agents/anthropic-vertex-stream.test.ts b/src/agents/anthropic-vertex-stream.test.ts index c1cb3a0b60c..8e9717f718d 100644 --- a/src/agents/anthropic-vertex-stream.test.ts +++ b/src/agents/anthropic-vertex-stream.test.ts @@ -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; + +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; - }; + 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; - }; - 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" }],