Skip to content

[Bug] Anthropic context_management not working in streaming - wrong field location #12148

@apeatling

Description

@apeatling

Describe the bug

The contextManagement field in providerMetadata is always null when using streamText with the Anthropic provider, even though the Anthropic API correctly returns context_management in the response.

Root Cause

Two issues:

  1. Schema location is wrong - The Zod schema in anthropic-messages-api.ts expects context_management inside delta, but Anthropic returns it at the event root level. This causes Zod to strip the field before it reaches the parsing code.

  2. Code reads from wrong location - The code in anthropic-messages-language-model.ts checks value.delta.context_management instead of value.context_management.

The Anthropic API returns context_management at the root level of the message_delta streaming event:

{
  "type": "message_delta",
  "delta": {"stop_reason": "end_turn", "stop_sequence": null},
  "usage": {"input_tokens": 16100, ...},
  "context_management": {"applied_edits": [...]}  // <-- at root level, sibling to delta and usage
}

Reproduction

import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

// Inspect raw streaming events
const stream = client.beta.messages.stream({
  model: "claude-sonnet-4-5-20250929",
  max_tokens: 256,
  messages: [...], // messages with tool history exceeding trigger threshold
  betas: ["context-management-2025-06-27"],
  context_management: {
    edits: [{ type: "clear_tool_uses_20250919", trigger: { type: "input_tokens", value: 15000 } }],
  },
});

for await (const event of stream) {
  if (event.type === "message_delta") {
    console.log("delta keys:", Object.keys(event.delta));  // ["stop_reason", "stop_sequence"]
    console.log("event keys:", Object.keys(event));        // includes "context_management" at root!
    console.log("context_management:", event.context_management); // ✅ has applied_edits
  }
}

Output shows context_management is at event root, not inside delta:

[EVENT] message_delta
  delta keys: [ "stop_reason", "stop_sequence" ]
  full event: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{...},"context_management":{"applied_edits":[...]}}

Expected behavior

providerMetadata.anthropic.contextManagement should contain the appliedEdits from the Anthropic API response.

Suggested Fix

Both fixes are required:

1. Update schema in anthropic-messages-api.ts (~line 1122-1170)

Move context_management from inside delta to the message_delta event root level (as a sibling to delta and usage):

  z.object({
    type: z.literal("message_delta"),
    delta: z.object({
      stop_reason: z.string().nullish(),
      stop_sequence: z.string().nullish(),
      container: z.object({...}).nullish(),
-     context_management: z.object({...}).nullish(),
    }),
    usage: z.looseObject({...}),
+   context_management: z.object({
+     applied_edits: z.array(...)
+   }).nullish(),
  }),

2. Update code in anthropic-messages-language-model.ts (~line 1984)

- if (value.delta.context_management) {
-   contextManagement = mapAnthropicResponseContextManagement(
-     value.delta.context_management,
-   );
- }
+ if (value.context_management) {
+   contextManagement = mapAnthropicResponseContextManagement(
+     value.context_management,
+   );
+ }

Verified Fix

I have confirmed this fix works by applying both changes via pnpm patch. After the fix:

Step 5: inputTokens=16100, contextManagement={"appliedEdits":[{"type":"clear_tool_uses_20250919","clearedToolUses":6,"clearedInputTokens":4325}]}

Versions

  • @ai-sdk/anthropic: 3.0.31
  • ai: 6.0.62
  • @anthropic-ai/sdk: 0.71.2 (used to verify correct API behavior)

Metadata

Metadata

Assignees

Labels

ai/providerrelated to a provider package. Must be assigned together with at least one `provider/*` labelbugSomething isn't working as documentedprovider/anthropicIssues related to the @ai-sdk/anthropic provider

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions