"""Tests for the 1M-context beta header on AWS Bedrock Claude models. Claude Opus 4.6/4.7 and Sonnet 4.6 support a 1M context window, but on AWS Bedrock (and Azure AI Foundry) that window is still gated behind the ``context-1m-2025-08-07`` beta header as of 2026-04. Without it, Bedrock caps these models at 200K even though ``model_metadata.py`` advertises 1M. These tests guard the invariant that the header is always emitted on the Bedrock client path, and that it survives the MiniMax bearer-auth strip. """ from unittest.mock import MagicMock, patch class TestBedrockContext1MBeta: """``context-1m-2025-08-07`` must reach Bedrock Claude requests.""" def test_common_betas_includes_1m(self): from agent.anthropic_adapter import _COMMON_BETAS, _CONTEXT_1M_BETA assert _CONTEXT_1M_BETA == "context-1m-2025-08-07" assert _CONTEXT_1M_BETA in _COMMON_BETAS def test_common_betas_for_native_anthropic_includes_1m(self): """Native Anthropic endpoints (and Bedrock with empty base_url) get 1M.""" from agent.anthropic_adapter import ( _common_betas_for_base_url, _CONTEXT_1M_BETA, ) assert _CONTEXT_1M_BETA in _common_betas_for_base_url(None) assert _CONTEXT_1M_BETA in _common_betas_for_base_url("") assert _CONTEXT_1M_BETA in _common_betas_for_base_url( "https://api.anthropic.com" ) def test_common_betas_strips_1m_for_minimax(self): """MiniMax bearer-auth endpoints host their own models — strip 1M beta.""" from agent.anthropic_adapter import ( _common_betas_for_base_url, _CONTEXT_1M_BETA, ) for url in ( "https://api.minimax.io/anthropic", "https://api.minimaxi.com/anthropic", ): betas = _common_betas_for_base_url(url) assert _CONTEXT_1M_BETA not in betas, ( f"1M beta must be stripped for MiniMax bearer endpoint {url}" ) # Other betas still present assert "interleaved-thinking-2025-05-14" in betas def test_build_anthropic_bedrock_client_sends_1m_beta(self): """AnthropicBedrock client must carry the 1M beta in default_headers. This is the load-bearing assertion for the reported bug: without this header Bedrock serves Opus 4.6/4.7 with a 200K cap. """ import agent.anthropic_adapter as adapter fake_sdk = MagicMock() fake_sdk.AnthropicBedrock = MagicMock() with patch.object(adapter, "_anthropic_sdk", fake_sdk): adapter.build_anthropic_bedrock_client(region="us-west-2") call_kwargs = fake_sdk.AnthropicBedrock.call_args.kwargs assert call_kwargs["aws_region"] == "us-west-2" default_headers = call_kwargs.get("default_headers") or {} beta_header = default_headers.get("anthropic-beta", "") assert "context-1m-2025-08-07" in beta_header, ( "Bedrock client must send context-1m-2025-08-07 or Opus 4.6/4.7 " "silently caps at 200K context" ) # Other common betas still present — no regression. assert "interleaved-thinking-2025-05-14" in beta_header assert "fine-grained-tool-streaming-2025-05-14" in beta_header def test_build_anthropic_kwargs_includes_1m_for_bedrock_fastmode(self): """Fast-mode requests (per-request extra_headers) still include 1M beta. Per-request extra_headers override client-level default_headers, so the fast-mode path must re-include everything in _COMMON_BETAS. """ from agent.anthropic_adapter import build_anthropic_kwargs kwargs = build_anthropic_kwargs( model="claude-opus-4-7", messages=[{"role": "user", "content": "hi"}], tools=None, max_tokens=1024, reasoning_config=None, is_oauth=False, # Empty base_url mirrors AnthropicBedrock (no HTTP base URL) base_url=None, fast_mode=True, ) beta_header = kwargs.get("extra_headers", {}).get("anthropic-beta", "") assert "context-1m-2025-08-07" in beta_header, ( "fast-mode extra_headers must carry the 1M beta or it overrides " "client-level default_headers and Bedrock drops back to 200K" )