// @vitest-environment node import { generateText, type ModelMessage } from "ai" import { afterEach, describe, expect, it, vi } from "vitest" import { CACHE_POINT, getAIModel } from "@/lib/ai-providers" afterEach(() => { vi.unstubAllGlobals() }) // The chat route marks its system messages like this const messages: ModelMessage[] = [ { role: "system", content: "Instructions", providerOptions: CACHE_POINT }, { role: "user", content: "hi" }, ] /** Send the messages through a real provider and return the request body */ async function requestBody( provider: "anthropic" | "openrouter", reply: unknown, ) { let body: any vi.stubGlobal( "fetch", vi.fn(async (_url: string, init: RequestInit) => { body = JSON.parse(init.body as string) return new Response(JSON.stringify(reply), { headers: { "content-type": "application/json" }, }) }), ) const { model } = getAIModel({ provider, modelId: provider === "anthropic" ? "claude-sonnet-4-5" : "anthropic/claude-sonnet-4.5", }) await generateText({ model, messages, maxRetries: 0 }).catch(() => {}) return body } describe("prompt cache breakpoints", () => { it("reach the Anthropic API", async () => { vi.stubEnv("ANTHROPIC_API_KEY", "test-key") const body = await requestBody("anthropic", { id: "msg_1", type: "message", role: "assistant", content: [{ type: "text", text: "ok" }], stop_reason: "end_turn", usage: { input_tokens: 1, output_tokens: 1 }, }) expect(body.system).toEqual([ { type: "text", text: "Instructions", cache_control: { type: "ephemeral" }, }, ]) }) it("reach OpenRouter", async () => { vi.stubEnv("OPENROUTER_API_KEY", "test-key") const body = await requestBody("openrouter", { id: "gen-1", choices: [ { index: 0, message: { role: "assistant", content: "ok" }, finish_reason: "stop", }, ], }) expect(JSON.stringify(body.messages[0])).toContain( '"cache_control":{"type":"ephemeral"}', ) }) })