This commit is contained in:
AxelRay 2026-10-04 11:52:27 -04:00 • committed by GitHub
commit 6fd53e7d1e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 30 additions and 1 deletions

View file

@ -561,8 +561,11 @@ class AmazonAnthropicClaudeMessagesConfig(
if anthropic_model_info.is_eager_input_streaming_used(tools):
beta_set.add(ANTHROPIC_FINE_GRAINED_TOOL_STREAMING_BETA_HEADER)
dangerous_tool_use_beta: Final = ANTHROPIC_BETA_HEADER_VALUES.DANGEROUS_TOOL_USE_2026_09_03.value
if anthropic_messages_optional_request_params.get("safeguards") is not None:
beta_set.add(ANTHROPIC_BETA_HEADER_VALUES.DANGEROUS_TOOL_USE_2026_09_03.value)
beta_set.add(dangerous_tool_use_beta)
else:
beta_set.discard(dangerous_tool_use_beta)
self._filter_context_management_for_bedrock_invoke(
anthropic_messages_request=anthropic_messages_request,

View file

@ -1670,6 +1670,32 @@ def test_bedrock_messages_does_not_add_dangerous_tool_use_beta_without_safeguard
assert "dangerous-tool-use-2026-09-03" not in result.get("anthropic_beta", [])
def test_bedrock_messages_drops_client_dangerous_tool_use_beta_without_safeguards(
local_model_cost_map, local_beta_headers_config
):
from litellm.types.router import GenericLiteLLMParams
cfg = AmazonAnthropicClaudeMessagesConfig()
schema_format = {
"type": "json_schema",
"schema": {"type": "object", "properties": {"name": {"type": "string"}}},
}
result = cfg.transform_anthropic_messages_request(
model="us.anthropic.claude-haiku-4-5-20251001-v1:0",
messages=[{"role": "user", "content": [{"type": "text", "text": "Name a color."}]}],
anthropic_messages_optional_request_params={
"max_tokens": 64,
"output_config": {"format": schema_format},
},
litellm_params=GenericLiteLLMParams(),
headers={"anthropic-beta": "dangerous-tool-use-2026-09-03"},
)
assert result.get("output_config") == {"format": schema_format}
assert "dangerous-tool-use-2026-09-03" not in result.get("anthropic_beta", [])
def test_bedrock_messages_stream_decoder_keeps_safeguard_results():
"""Bedrock streams the classifier verdicts on message_start and on the final message_delta, exactly as api.anthropic.com does."""
decoder = AmazonAnthropicClaudeMessagesStreamDecoder(model="us.anthropic.claude-sonnet-5")