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:
-
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.
-
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)
Describe the bug
The
contextManagementfield inproviderMetadatais alwaysnullwhen usingstreamTextwith the Anthropic provider, even though the Anthropic API correctly returnscontext_managementin the response.Root Cause
Two issues:
Schema location is wrong - The Zod schema in
anthropic-messages-api.tsexpectscontext_managementinsidedelta, but Anthropic returns it at the event root level. This causes Zod to strip the field before it reaches the parsing code.Code reads from wrong location - The code in
anthropic-messages-language-model.tschecksvalue.delta.context_managementinstead ofvalue.context_management.The Anthropic API returns
context_managementat the root level of themessage_deltastreaming 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
Output shows
context_managementis at event root, not insidedelta:Expected behavior
providerMetadata.anthropic.contextManagementshould contain theappliedEditsfrom the Anthropic API response.Suggested Fix
Both fixes are required:
1. Update schema in
anthropic-messages-api.ts(~line 1122-1170)Move
context_managementfrom insidedeltato themessage_deltaevent root level (as a sibling todeltaandusage):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)Verified Fix
I have confirmed this fix works by applying both changes via pnpm patch. After the fix:
Versions