diff --git a/.changeset/quick-caches-roll.md b/.changeset/quick-caches-roll.md new file mode 100644 index 00000000000..3ab9e9b740a --- /dev/null +++ b/.changeset/quick-caches-roll.md @@ -0,0 +1,5 @@ +--- +"@opencode-ai/ai": patch +--- + +Improve Anthropic and Bedrock prompt reuse with layered cache breakpoints that roll through long tool loops. diff --git a/packages/ai/README.md b/packages/ai/README.md index 597ff8eaab5..377e09306fd 100644 --- a/packages/ai/README.md +++ b/packages/ai/README.md @@ -207,7 +207,9 @@ Prompt caching is **on by default**. Every `LLMRequest` resolves to `cache: "aut ### Auto placement -`"auto"` places three breakpoints — last tool definition, last system part, latest user message. The last-user-message boundary is the load-bearing detail: in a tool-use loop, a single user turn expands into many assistant/tool round-trips, all sharing that prefix. Caching at that boundary lets every intra-turn API call hit. +`"auto"` places up to four breakpoints — the last tool definition, the first system part, the last system part when distinct, and the final message boundary. These expose successively larger reusable prefixes for tools, the base agent, project instructions, and the active conversation. The rolling final-message boundary is the load-bearing detail in tool loops: it advances on every request so the previous cache entry stays within Anthropic's 20-block lookback. + +Tools precede every system and conversation block in the provider prefix, so tool definitions must remain byte-stable and deterministically ordered for downstream breakpoints to remain reusable. The math justifies the default: Anthropic's 5-minute cache write is 1.25× base, read is 0.1×, so a single reuse within 5 minutes already wins. One-shot completions below the per-model minimum-cacheable-token threshold silently no-op on the wire, so the worst case is harmless. @@ -235,7 +237,7 @@ cache: { ### Manual hints -Inline `CacheHint` on any text / system / tool / tool-result part overrides automatic placement. The auto policy preserves manual hints; it only fills gaps. +Inline `CacheHint` on any text / system / tool / tool-result part overrides automatic placement. The auto policy preserves manual hints, counts them against Anthropic and Bedrock's four-breakpoint limit, and only fills the remaining slots. ```ts LLM.request({ @@ -251,8 +253,8 @@ LLM.request({ | Protocol | `cache: "auto"` | | ----------------------- | ------------------------------------------------------------------------- | -| Anthropic Messages | emits up to 3 `cache_control` markers (4-breakpoint cap enforced) | -| Bedrock Converse | emits up to 3 `cachePoint` blocks (4-breakpoint cap enforced) | +| Anthropic Messages | emits up to 4 `cache_control` markers (4-breakpoint cap enforced) | +| Bedrock Converse | emits up to 4 `cachePoint` blocks (4-breakpoint cap enforced) | | OpenAI Chat / Responses | no-op (implicit caching above 1024 tokens) | | Gemini | no-op (implicit caching on 2.5+; explicit `CachedContent` is out-of-band) | diff --git a/packages/ai/src/cache-policy.ts b/packages/ai/src/cache-policy.ts index 60f96dc69aa..7679c7cf543 100644 --- a/packages/ai/src/cache-policy.ts +++ b/packages/ai/src/cache-policy.ts @@ -2,32 +2,31 @@ // the policy designates. Runs once at compile time, before the per-protocol // body builder, so the existing inline-hint lowering path handles the rest. // -// The default `"auto"` shape places one breakpoint at the last tool definition, -// one at the last system part, and one at the latest user message. This -// matches what production agent harnesses (LangChain's caching middleware, -// kern-ai's 10x cost-reduction playbook) converge on for tool-use loops: the -// latest user message stays put while a single turn explodes into many -// assistant/tool round-trips, so caching at that boundary lets every -// intra-turn API call hit the prefix. +// The default `"auto"` shape places breakpoints at the last tool definition, +// the first and last distinct system parts, and the conversation tail. This +// exposes reusable tool, base-agent, project, and session prefixes while +// advancing the tail after each tool result keeps the previous cache entry +// within Anthropic's 20-block lookback during long agent turns. // -// Manual `cache: CacheHint` placements on individual parts are preserved — -// this function only fills gaps the caller left empty. +// Manual `cache: CacheHint` placements on individual parts are preserved and +// count against the four-breakpoint budget; auto only fills remaining slots. import { CacheHint, type CachePolicy, type CachePolicyObject } from "./schema/options" import { LLMRequest, Message, ToolDefinition, type ContentPart } from "./schema/messages" const AUTO: CachePolicyObject = { tools: true, system: true, - messages: "latest-user-message", + messages: { tail: 1 }, } const NONE: CachePolicyObject = {} +const BREAKPOINT_CAP = 4 // Resolution rules: // - undefined → "auto" — caching is on by default. The math favors it: // Anthropic 5m-cache write is 1.25x base, read is 0.1x, // so a single reuse within 5 minutes already wins. -// - "auto" → tools + system + latest user msg. +// - "auto" → tools + first/last system + final message boundary. // - "none" → no auto placement; manual `CacheHint`s still flow. // - object form → exactly what the caller asked for. const resolve = (policy: CachePolicy | undefined): CachePolicyObject => { @@ -44,18 +43,32 @@ const RESPECTS_INLINE_HINTS = new Set(["anthropic-messages", "bedrock-converse"] const makeHint = (ttlSeconds: number | undefined): CacheHint => ttlSeconds !== undefined ? new CacheHint({ type: "ephemeral", ttlSeconds }) : new CacheHint({ type: "ephemeral" }) -const markLastTool = (tools: ReadonlyArray, hint: CacheHint): ReadonlyArray => { +interface Budget { + remaining: number +} + +const markLastTool = ( + tools: ReadonlyArray, + hint: CacheHint, + budget: Budget, +): ReadonlyArray => { if (tools.length === 0) return tools const last = tools.length - 1 - if (tools[last]!.cache) return tools + if (tools[last]!.cache || budget.remaining === 0) return tools + budget.remaining -= 1 return tools.map((tool, i) => (i === last ? new ToolDefinition({ ...tool, cache: hint }) : tool)) } -const markLastSystem = (system: LLMRequest["system"], hint: CacheHint): LLMRequest["system"] => { +const markSystemBoundaries = (system: LLMRequest["system"], hint: CacheHint, budget: Budget): LLMRequest["system"] => { if (system.length === 0) return system - const last = system.length - 1 - if (system[last]!.cache) return system - return system.map((part, i) => (i === last ? { ...part, cache: hint } : part)) + let changed = false + const next = system.map((part, index) => { + if ((index !== 0 && index !== system.length - 1) || part.cache || budget.remaining === 0) return part + budget.remaining -= 1 + changed = true + return { ...part, cache: hint } + }) + return changed ? next : system } const lastIndexOfRole = (messages: ReadonlyArray, role: Message["role"]): number => @@ -64,14 +77,20 @@ const lastIndexOfRole = (messages: ReadonlyArray, role: Message["role"] // Mark the last text part of `messages[index]`. If no text part exists, mark // the last content part regardless of type — that's the breakpoint position // in tool-result-only messages too. -const markMessageAt = (messages: ReadonlyArray, index: number, hint: CacheHint): ReadonlyArray => { +const markMessageAt = ( + messages: ReadonlyArray, + index: number, + hint: CacheHint, + budget: Budget, +): ReadonlyArray => { if (index < 0 || index >= messages.length) return messages const target = messages[index]! if (target.content.length === 0) return messages const lastTextIndex = target.content.findLastIndex((part) => part.type === "text") const markAt = lastTextIndex >= 0 ? lastTextIndex : target.content.length - 1 const existing = target.content[markAt]! - if ("cache" in existing && existing.cache) return messages + if (("cache" in existing && existing.cache) || budget.remaining === 0) return messages + budget.remaining -= 1 const nextContent = target.content.map((part, i) => (i === markAt ? ({ ...part, cache: hint } as ContentPart) : part)) const next = new Message({ ...target, content: nextContent }) // Single pass over `messages`, substituting the one updated entry. Long @@ -86,25 +105,42 @@ const markMessages = ( messages: ReadonlyArray, strategy: NonNullable, hint: CacheHint, + budget: Budget, ): ReadonlyArray => { if (messages.length === 0) return messages - if (strategy === "latest-user-message") return markMessageAt(messages, lastIndexOfRole(messages, "user"), hint) - if (strategy === "latest-assistant") return markMessageAt(messages, lastIndexOfRole(messages, "assistant"), hint) + if (strategy === "latest-user-message") + return markMessageAt(messages, lastIndexOfRole(messages, "user"), hint, budget) + if (strategy === "latest-assistant") + return markMessageAt(messages, lastIndexOfRole(messages, "assistant"), hint, budget) const start = Math.max(0, messages.length - strategy.tail) let next = messages - for (let i = start; i < messages.length; i++) next = markMessageAt(next, i, hint) + for (let i = start; i < messages.length; i++) next = markMessageAt(next, i, hint, budget) return next } +const countHints = (request: LLMRequest) => + request.tools.reduce((count, tool) => count + (tool.cache === undefined ? 0 : 1), 0) + + request.system.reduce((count, part) => count + (part.cache === undefined ? 0 : 1), 0) + + request.messages.reduce( + (count, message) => + count + + message.content.reduce( + (contentCount, part) => contentCount + ("cache" in part && part.cache !== undefined ? 1 : 0), + 0, + ), + 0, + ) + export const applyCachePolicy = (request: LLMRequest): LLMRequest => { if (!RESPECTS_INLINE_HINTS.has(request.model.route.id)) return request const policy = resolve(request.cache) if (!policy.tools && !policy.system && !policy.messages) return request const hint = makeHint(policy.ttlSeconds) - const tools = policy.tools ? markLastTool(request.tools, hint) : request.tools - const system = policy.system ? markLastSystem(request.system, hint) : request.system - const messages = policy.messages ? markMessages(request.messages, policy.messages, hint) : request.messages + const budget = { remaining: Math.max(0, BREAKPOINT_CAP - countHints(request)) } + const tools = policy.tools ? markLastTool(request.tools, hint, budget) : request.tools + const system = policy.system ? markSystemBoundaries(request.system, hint, budget) : request.system + const messages = policy.messages ? markMessages(request.messages, policy.messages, hint, budget) : request.messages if (tools === request.tools && system === request.system && messages === request.messages) return request return LLMRequest.update(request, { tools, system, messages }) diff --git a/packages/ai/src/schema/options.ts b/packages/ai/src/schema/options.ts index b7ef9325278..c80bce0fda4 100644 --- a/packages/ai/src/schema/options.ts +++ b/packages/ai/src/schema/options.ts @@ -251,11 +251,11 @@ export class CacheHint extends Schema.Class("LLM.CacheHint")({ // Auto-placement policy for prompt caching. The protocol-neutral lowering step // reads this and injects `CacheHint`s at the configured boundaries; the // per-protocol body builders then translate those hints into wire markers as -// usual. `"auto"` is the recommended default for agent loops — it places one -// breakpoint at the last tool definition, one at the last system part, and one -// at the latest user message. The combination of provider invalidation -// hierarchy (tools → system → messages) and Anthropic/Bedrock's 20-block -// lookback means three trailing breakpoints reliably cover the static prefix. +// usual. `"auto"` is the recommended default for agent loops — it places +// breakpoints at the last tool definition, the first and last distinct system +// parts, and the conversation tail. The rolling message breakpoint keeps a +// prior cache entry within Anthropic/Bedrock's 20-block lookback during long +// tool loops. // // Pass `"none"` to opt out entirely (the legacy behavior). Pass the granular // object form to override individual choices. diff --git a/packages/ai/test/cache-policy.test.ts b/packages/ai/test/cache-policy.test.ts index a126d9502c5..8e2535b54ba 100644 --- a/packages/ai/test/cache-policy.test.ts +++ b/packages/ai/test/cache-policy.test.ts @@ -39,8 +39,8 @@ describe("applyCachePolicy", () => { }), ) - // No explicit cache field → auto policy fires → last system part + latest - // user message both get cache_control markers. + // A single system block is both the first and last boundary, so the auto + // policy deduplicates it and still marks the conversation tail. expect(prepared.body).toMatchObject({ system: [{ type: "text", text: "You are concise.", cache_control: { type: "ephemeral" } }], messages: [{ role: "user", content: [{ type: "text", text: "hi", cache_control: { type: "ephemeral" } }] }], @@ -48,12 +48,15 @@ describe("applyCachePolicy", () => { }), ) - it.effect("'auto' marks the last tool, last system part, and latest user message on Anthropic", () => + it.effect("'auto' marks the last tool, first and last system parts, and final message boundary on Anthropic", () => Effect.gen(function* () { const prepared = yield* LLMClient.prepare( LLM.request({ model: anthropicModel, - system: "Sys A", + system: [ + { type: "text", text: "Base agent" }, + { type: "text", text: "Project instructions" }, + ], tools: [{ name: "t1", description: "t1", inputSchema: { type: "object", properties: {} } }], messages: [ Message.user("first user"), @@ -66,7 +69,10 @@ describe("applyCachePolicy", () => { expect(prepared.body).toMatchObject({ tools: [{ name: "t1", cache_control: { type: "ephemeral" } }], - system: [{ type: "text", text: "Sys A", cache_control: { type: "ephemeral" } }], + system: [ + { type: "text", text: "Base agent", cache_control: { type: "ephemeral" } }, + { type: "text", text: "Project instructions", cache_control: { type: "ephemeral" } }, + ], messages: [ { role: "user", content: [{ type: "text", text: "first user" }] }, { role: "assistant", content: [{ type: "text", text: "assistant reply" }] }, @@ -120,7 +126,10 @@ describe("applyCachePolicy", () => { const prepared = yield* LLMClient.prepare( LLM.request({ model: bedrockModel, - system: "Sys", + system: [ + { type: "text", text: "Base agent" }, + { type: "text", text: "Project instructions" }, + ], tools: [{ name: "t1", description: "t1", inputSchema: { type: "object", properties: {} } }], messages: [Message.user("first user"), Message.assistant("reply"), Message.user("latest user")], cache: "auto", @@ -131,7 +140,12 @@ describe("applyCachePolicy", () => { toolConfig: { tools: [{ toolSpec: { name: "t1" } }, { cachePoint: { type: "default" } }], }, - system: [{ text: "Sys" }, { cachePoint: { type: "default" } }], + system: [ + { text: "Base agent" }, + { cachePoint: { type: "default" } }, + { text: "Project instructions" }, + { cachePoint: { type: "default" } }, + ], messages: [ { role: "user", content: [{ text: "first user" }] }, { role: "assistant", content: [{ text: "reply" }] }, @@ -193,9 +207,55 @@ describe("applyCachePolicy", () => { }), ) - const body = prepared.body as { system: Array<{ text: string; cache_control?: unknown }> } + const body = prepared.body as { + system: Array<{ text: string; cache_control?: unknown }> + messages: Array<{ content: Array<{ cache_control?: unknown }> }> + } expect(body.system[0]?.cache_control).toEqual({ type: "ephemeral", ttl: "1h" }) expect(body.system[1]?.cache_control).toEqual({ type: "ephemeral" }) + expect(body.messages[0]?.content[0]?.cache_control).toEqual({ type: "ephemeral" }) + }), + ) + + it.effect("auto policy stays within the four-breakpoint cap when preserving manual hints", () => + Effect.gen(function* () { + const request = LLM.request({ + model: anthropicModel, + system: [ + { type: "text", text: "Base agent" }, + { + type: "text", + text: "Manual context", + cache: new CacheHint({ type: "ephemeral", ttlSeconds: 3600 }), + }, + { type: "text", text: "Project instructions" }, + ], + tools: [{ name: "t1", description: "t1", inputSchema: { type: "object", properties: {} } }], + prompt: "hi", + cache: "auto", + }) + const applied = applyCachePolicy(request) + expect(applied.tools[0]?.cache).toBeDefined() + expect(applied.system.map((part) => part.cache !== undefined)).toEqual([true, true, true]) + const tail = applied.messages[0]!.content[0]! + expect("cache" in tail ? tail.cache : undefined).toBeUndefined() + expect(applyCachePolicy(applied)).toBe(applied) + + const prepared = yield* LLMClient.prepare(request) + + const body = prepared.body as { + tools: Array<{ cache_control?: unknown }> + system: Array<{ cache_control?: unknown }> + messages: Array<{ content: Array<{ cache_control?: unknown }> }> + } + const marked = [ + ...body.tools.map((tool) => tool.cache_control), + ...body.system.map((part) => part.cache_control), + ...body.messages.flatMap((message) => message.content.map((part) => part.cache_control)), + ].filter((cache) => cache !== undefined) + expect(marked).toHaveLength(4) + expect(body.system[1]?.cache_control).toEqual({ type: "ephemeral", ttl: "1h" }) + expect(body.messages[0]?.content[0]?.cache_control).toBeUndefined() }), ) diff --git a/packages/ai/test/fixtures/recordings/anthropic-messages-cache/keeps-a-long-tool-turn-inside-the-cache-lookback.json b/packages/ai/test/fixtures/recordings/anthropic-messages-cache/keeps-a-long-tool-turn-inside-the-cache-lookback.json new file mode 100644 index 00000000000..cf349fb8526 --- /dev/null +++ b/packages/ai/test/fixtures/recordings/anthropic-messages-cache/keeps-a-long-tool-turn-inside-the-cache-lookback.json @@ -0,0 +1,54 @@ +{ + "version": 1, + "metadata": { + "tags": [ + "prefix:anthropic-messages-cache", + "provider:anthropic", + "protocol:anthropic-messages", + "cache", + "tool" + ], + "name": "anthropic-messages-cache/keeps-a-long-tool-turn-inside-the-cache-lookback", + "recordedAt": "2026-07-24T16:22:29.494Z" + }, + "interactions": [ + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://api.anthropic.com/v1/messages", + "headers": { + "anthropic-version": "2023-06-01", + "content-type": "application/json" + }, + "body": "{\"model\":\"claude-haiku-4-5-20251001\",\"system\":[{\"type\":\"text\",\"text\":\"You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. \",\"cache_control\":{\"type\":\"ephemeral\"}}],\"messages\":[{\"role\":\"user\",\"content\":[{\"type\":\"text\",\"text\":\"Run the fixture lookups.\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_0\",\"name\":\"lookup\",\"input\":{\"index\":0}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_0\",\"content\":\"\\\"Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_1\",\"name\":\"lookup\",\"input\":{\"index\":1}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_1\",\"content\":\"\\\"Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_2\",\"name\":\"lookup\",\"input\":{\"index\":2}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_2\",\"content\":\"\\\"Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_3\",\"name\":\"lookup\",\"input\":{\"index\":3}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_3\",\"content\":\"\\\"Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_4\",\"name\":\"lookup\",\"input\":{\"index\":4}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_4\",\"content\":\"\\\"Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_5\",\"name\":\"lookup\",\"input\":{\"index\":5}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_5\",\"content\":\"\\\"Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_6\",\"name\":\"lookup\",\"input\":{\"index\":6}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_6\",\"content\":\"\\\"Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_7\",\"name\":\"lookup\",\"input\":{\"index\":7}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_7\",\"content\":\"\\\"Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_8\",\"name\":\"lookup\",\"input\":{\"index\":8}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_8\",\"content\":\"\\\"Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_9\",\"name\":\"lookup\",\"input\":{\"index\":9}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_9\",\"content\":\"\\\"Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_10\",\"name\":\"lookup\",\"input\":{\"index\":10}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_10\",\"content\":\"\\\"Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. \\\"\",\"cache_control\":{\"type\":\"ephemeral\"}}]}],\"tools\":[{\"name\":\"lookup\",\"description\":\"Look up a fixture value.\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"index\":{\"type\":\"number\"}},\"required\":[\"index\"],\"additionalProperties\":false},\"cache_control\":{\"type\":\"ephemeral\"}}],\"stream\":true,\"max_tokens\":16,\"temperature\":0}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream; charset=utf-8" + }, + "body": "event: message_start\ndata: {\"type\":\"message_start\",\"message\":{\"model\":\"claude-haiku-4-5-20251001\",\"id\":\"msg_011CdMBzDZ4qqmkyuCMbZ81z\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":5,\"cache_creation_input_tokens\":12288,\"cache_read_input_tokens\":0,\"cache_creation\":{\"ephemeral_5m_input_tokens\":12288,\"ephemeral_1h_input_tokens\":0},\"output_tokens\":2,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"}} }\n\nevent: content_block_start\ndata: {\"type\":\"content_block_start\",\"index\":0,\"content_block\":{\"type\":\"text\",\"text\":\"\"} }\n\nevent: ping\ndata: {\"type\": \"ping\"}\n\nevent: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":0,\"delta\":{\"type\":\"text_delta\",\"text\":\"Fixture\"} }\n\nevent: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":0,\"delta\":{\"type\":\"text_delta\",\"text\":\" lookups complete. Results:\\n\\n- Index 0: Fixture\"}}\n\nevent: content_block_stop\ndata: {\"type\":\"content_block_stop\",\"index\":0 }\n\nevent: message_delta\ndata: {\"type\":\"message_delta\",\"delta\":{\"stop_reason\":\"max_tokens\",\"stop_sequence\":null,\"stop_details\":null},\"usage\":{\"input_tokens\":5,\"cache_creation_input_tokens\":12288,\"cache_read_input_tokens\":0,\"output_tokens\":16} }\n\nevent: message_stop\ndata: {\"type\":\"message_stop\" }\n\n" + } + }, + { + "transport": "http", + "request": { + "method": "POST", + "url": "https://api.anthropic.com/v1/messages", + "headers": { + "anthropic-version": "2023-06-01", + "content-type": "application/json" + }, + "body": "{\"model\":\"claude-haiku-4-5-20251001\",\"system\":[{\"type\":\"text\",\"text\":\"You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. You are a concise, factual assistant. Answer precisely and avoid filler. Cite numbers when known. \",\"cache_control\":{\"type\":\"ephemeral\"}}],\"messages\":[{\"role\":\"user\",\"content\":[{\"type\":\"text\",\"text\":\"Run the fixture lookups.\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_0\",\"name\":\"lookup\",\"input\":{\"index\":0}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_0\",\"content\":\"\\\"Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. Fixture result 0. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_1\",\"name\":\"lookup\",\"input\":{\"index\":1}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_1\",\"content\":\"\\\"Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. Fixture result 1. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_2\",\"name\":\"lookup\",\"input\":{\"index\":2}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_2\",\"content\":\"\\\"Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. Fixture result 2. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_3\",\"name\":\"lookup\",\"input\":{\"index\":3}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_3\",\"content\":\"\\\"Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. Fixture result 3. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_4\",\"name\":\"lookup\",\"input\":{\"index\":4}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_4\",\"content\":\"\\\"Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. Fixture result 4. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_5\",\"name\":\"lookup\",\"input\":{\"index\":5}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_5\",\"content\":\"\\\"Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. Fixture result 5. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_6\",\"name\":\"lookup\",\"input\":{\"index\":6}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_6\",\"content\":\"\\\"Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. Fixture result 6. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_7\",\"name\":\"lookup\",\"input\":{\"index\":7}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_7\",\"content\":\"\\\"Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. Fixture result 7. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_8\",\"name\":\"lookup\",\"input\":{\"index\":8}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_8\",\"content\":\"\\\"Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. Fixture result 8. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_9\",\"name\":\"lookup\",\"input\":{\"index\":9}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_9\",\"content\":\"\\\"Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. Fixture result 9. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"tool_use\",\"id\":\"lookup_10\",\"name\":\"lookup\",\"input\":{\"index\":10}}]},{\"role\":\"user\",\"content\":[{\"type\":\"tool_result\",\"tool_use_id\":\"lookup_10\",\"content\":\"\\\"Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. Fixture result 10. \\\"\"}]},{\"role\":\"assistant\",\"content\":[{\"type\":\"text\",\"text\":\"The fixture lookups are complete.\"}]},{\"role\":\"user\",\"content\":[{\"type\":\"text\",\"text\":\"Reply exactly: OK\",\"cache_control\":{\"type\":\"ephemeral\"}}]}],\"tools\":[{\"name\":\"lookup\",\"description\":\"Look up a fixture value.\",\"input_schema\":{\"type\":\"object\",\"properties\":{\"index\":{\"type\":\"number\"}},\"required\":[\"index\"],\"additionalProperties\":false},\"cache_control\":{\"type\":\"ephemeral\"}}],\"stream\":true,\"max_tokens\":16,\"temperature\":0}" + }, + "response": { + "status": 200, + "headers": { + "content-type": "text/event-stream; charset=utf-8" + }, + "body": "event: message_start\ndata: {\"type\":\"message_start\",\"message\":{\"model\":\"claude-haiku-4-5-20251001\",\"id\":\"msg_011CdMBzKTWjSsCrp7u47Xem\",\"type\":\"message\",\"role\":\"assistant\",\"content\":[],\"stop_reason\":null,\"stop_sequence\":null,\"stop_details\":null,\"usage\":{\"input_tokens\":3,\"cache_creation_input_tokens\":19,\"cache_read_input_tokens\":12288,\"cache_creation\":{\"ephemeral_5m_input_tokens\":19,\"ephemeral_1h_input_tokens\":0},\"output_tokens\":1,\"service_tier\":\"standard\",\"inference_geo\":\"not_available\"}} }\n\nevent: content_block_start\ndata: {\"type\":\"content_block_start\",\"index\":0,\"content_block\":{\"type\":\"text\",\"text\":\"\"} }\n\nevent: ping\ndata: {\"type\": \"ping\"}\n\nevent: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":0,\"delta\":{\"type\":\"text_delta\",\"text\":\"OK\"} }\n\nevent: content_block_stop\ndata: {\"type\":\"content_block_stop\",\"index\":0 }\n\nevent: message_delta\ndata: {\"type\":\"message_delta\",\"delta\":{\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"stop_details\":null},\"usage\":{\"input_tokens\":3,\"cache_creation_input_tokens\":19,\"cache_read_input_tokens\":12288,\"output_tokens\":4} }\n\nevent: message_stop\ndata: {\"type\":\"message_stop\"}\n\n" + } + } + ] +} diff --git a/packages/ai/test/provider/anthropic-messages-cache.recorded.test.ts b/packages/ai/test/provider/anthropic-messages-cache.recorded.test.ts index 910c13fbb22..c6b9814e3c5 100644 --- a/packages/ai/test/provider/anthropic-messages-cache.recorded.test.ts +++ b/packages/ai/test/provider/anthropic-messages-cache.recorded.test.ts @@ -1,6 +1,6 @@ import { describe, expect } from "bun:test" import { Effect } from "effect" -import { CacheHint, LLM } from "../../src" +import { CacheHint, LLM, LLMRequest, Message, ToolCallPart, ToolDefinition } from "../../src" import { LLMClient } from "../../src/route" import * as Anthropic from "../../src/providers/anthropic" import { LARGE_CACHEABLE_SYSTEM } from "../recorded-scenarios" @@ -24,6 +24,39 @@ const cacheRequest = LLM.request({ generation: { maxTokens: 16, temperature: 0 }, }) +const lookup = ToolDefinition.make({ + name: "lookup", + description: "Look up a fixture value.", + inputSchema: { + type: "object", + properties: { index: { type: "number" } }, + required: ["index"], + additionalProperties: false, + }, +}) +const longToolTurn = [ + Message.user("Run the fixture lookups."), + ...Array.from({ length: 11 }, (_, index) => { + const id = `lookup_${index}` + return [ + Message.assistant(ToolCallPart.make({ id, name: lookup.name, input: { index } })), + Message.tool({ + id, + name: lookup.name, + result: `Fixture result ${index}. `.repeat(80), + }), + ] + }).flat(), +] +const longToolTurnRequest = LLM.request({ + id: "recorded_anthropic_cache_long_tool_turn", + model, + system: LARGE_CACHEABLE_SYSTEM, + messages: longToolTurn, + tools: [lookup], + generation: { maxTokens: 16, temperature: 0 }, +}) + const recorded = recordedTests({ prefix: "anthropic-messages-cache", provider: "anthropic", @@ -50,4 +83,28 @@ describe("Anthropic Messages cache recorded", () => { expect(second.usage?.cacheReadInputTokens ?? 0).toBeGreaterThan(0) }), ) + + recorded.effect.with("keeps a long tool turn inside the cache lookback", { tags: ["cache", "tool"] }, () => + Effect.gen(function* () { + const first = yield* LLMClient.generate(longToolTurnRequest) + const firstRead = first.usage?.cacheReadInputTokens ?? 0 + const firstWrite = first.usage?.cacheWriteInputTokens ?? 0 + const firstCached = firstRead + firstWrite + // The prefix may already be warm when recording, so either a read or a + // write establishes that Anthropic recognized the cache boundary. + expect(firstCached).toBeGreaterThan(0) + + const second = yield* LLMClient.generate( + LLMRequest.update(longToolTurnRequest, { + messages: [ + ...longToolTurn, + Message.assistant("The fixture lookups are complete."), + Message.user("Reply exactly: OK"), + ], + }), + ) + expect(second.usage?.cacheReadInputTokens ?? 0).toBeGreaterThanOrEqual(firstCached) + expect(second.usage?.cacheWriteInputTokens ?? 0).toBeLessThan(firstCached) + }), + ) }) diff --git a/packages/ai/test/provider/bedrock-converse.test.ts b/packages/ai/test/provider/bedrock-converse.test.ts index 86f2240488c..5cc8af1378a 100644 --- a/packages/ai/test/provider/bedrock-converse.test.ts +++ b/packages/ai/test/provider/bedrock-converse.test.ts @@ -939,6 +939,7 @@ describe("Bedrock Converse route", () => { const prepared = yield* LLMClient.prepare( LLM.request({ model, + cache: "none", messages: [ Message.assistant([ToolCallPart.make({ id: "call_1", name: "read", input: { path: "report.pdf" } })]), Message.tool({