From 5b6c46bbd1f44bd7ec3efe64b7dcd6f4d235ec90 Mon Sep 17 00:00:00 2001 From: warren Date: Sun, 17 May 2026 10:21:01 +0800 Subject: [PATCH 1/2] fix(beta): drop unknown beta flags instead of forwarding to Bedrock Bedrock now strictly validates beta header values and returns 400 for unrecognized flags. Previously, the proxy passed unknown beta values through verbatim. This caused breakage when Claude Code clients automatically send Anthropic-specific headers (interleaved-thinking-2025-05-14, context-1m-2025-08-07, etc.) that Bedrock does not support. Changes: - Drop unknown beta flags in both converters instead of passing through - Add Claude Code client headers to the default blocklist: claude-code-20250219, context-1m-2025-08-07, interleaved-thinking-2025-05-14, context-management-2025-06-27, effort-2025-11-24 --- app/converters/anthropic_to_bedrock.py | 6 +++--- app/core/config.py | 8 +++++++- app/services/bedrock_service.py | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/converters/anthropic_to_bedrock.py b/app/converters/anthropic_to_bedrock.py index a2e9c39..3f4473d 100644 --- a/app/converters/anthropic_to_bedrock.py +++ b/app/converters/anthropic_to_bedrock.py @@ -141,7 +141,7 @@ def convert_request( additional_fields.update(thinking_config) # Add anthropic_beta features for Claude models (from client-provided headers) - # Rules loaded from DynamoDB (blocklist → filter, mapping → translate, else → passthrough) + # Rules loaded from DynamoDB (blocklist → filter, mapping → translate, else → drop) if self._is_claude_model() and anthropic_beta: from app.db.beta_header_cache import BetaHeaderConfigCache cache = BetaHeaderConfigCache.instance() @@ -159,8 +159,8 @@ def convert_request( bedrock_beta.extend(mapped) print(f"[CONVERTER] Mapped beta header '{beta_value}' → {mapped}") else: - bedrock_beta.append(beta_value) - print(f"[CONVERTER] Passing through beta header: {beta_value}") + # Drop unknown beta flags — Bedrock rejects unrecognized Anthropic-specific values + print(f"[CONVERTER] Dropping unknown beta header (not supported by Bedrock): {beta_value}") if bedrock_beta: additional_fields["anthropic_beta"] = bedrock_beta diff --git a/app/core/config.py b/app/core/config.py index b891a0c..8e4f1bf 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -222,7 +222,13 @@ class Settings(BaseSettings): default=[ "prompt-caching-scope-2026-01-05", "redact-thinking-2026-02-12", - "advisor-tool-2026-03-01" + "advisor-tool-2026-03-01", + # Claude Code client headers — Anthropic-specific, not supported by Bedrock + "claude-code-20250219", + "context-1m-2025-08-07", + "interleaved-thinking-2025-05-14", + "context-management-2025-06-27", + "effort-2025-11-24", ], alias="BETA_HEADERS_BLOCKLIST", description="Beta headers that should NOT be passed to Bedrock (unsupported)", diff --git a/app/services/bedrock_service.py b/app/services/bedrock_service.py index 95fee37..9c7b6f8 100644 --- a/app/services/bedrock_service.py +++ b/app/services/bedrock_service.py @@ -554,8 +554,8 @@ def _convert_to_anthropic_native_request( bedrock_beta.extend(mapped) print(f"[BEDROCK NATIVE] Mapped beta header '{beta_value}' → {mapped}") else: - bedrock_beta.append(beta_value) - print(f"[BEDROCK NATIVE] Passing through beta header: {beta_value}") + # Drop unknown beta flags — Bedrock rejects unrecognized Anthropic-specific values + print(f"[BEDROCK NATIVE] Dropping unknown beta header (not supported by Bedrock): {beta_value}") if bedrock_beta: native_request["anthropic_beta"] = bedrock_beta From 94c1a913daecb8f7e01f41224ca2d01555bfe28f Mon Sep 17 00:00:00 2001 From: warren Date: Sun, 17 May 2026 11:27:39 +0800 Subject: [PATCH 2/2] fix(bedrock): drop context_management and output_config fields unsupported by Bedrock These are Anthropic-specific fields (compact-2026-01-12 beta and effort level) that Claude Code clients now send but Bedrock rejects with 400 Extra inputs. --- app/services/bedrock_service.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/services/bedrock_service.py b/app/services/bedrock_service.py index 9c7b6f8..db75aca 100644 --- a/app/services/bedrock_service.py +++ b/app/services/bedrock_service.py @@ -510,13 +510,9 @@ def _convert_to_anthropic_native_request( if request.metadata: native_request["metadata"] = request.metadata.model_dump() if hasattr(request.metadata, "model_dump") else request.metadata - # Add output_config if present (e.g., effort level) - if request.output_config: - native_request["output_config"] = request.output_config + # output_config (effort level) is not supported by Bedrock — drop it - # Add context_management if present (e.g., compact-2026-01-12 beta) - if request.context_management: - native_request["context_management"] = request.context_management + # context_management (compact-2026-01-12 beta) is not supported by Bedrock — drop it # Auto-inject advanced-tool-use beta header if tools contain defer_loading # but the client didn't send the required beta header.