From bb131c86c2484296a0c77272c5e6bdb5eb3e2791 Mon Sep 17 00:00:00 2001 From: FelixLyl <380287978@qq.com> Date: Tue, 21 Apr 2026 20:37:46 +0800 Subject: [PATCH] fix(bedrock): strip client_metadata from additionalModelRequestFields Responses API clients (e.g. Codex CLI) send a `client_metadata` field in the request body. This leaks through kwargs into Bedrock's `additionalModelRequestFields`, causing a 400 error: `client_metadata: Extra inputs are not permitted`. Strip it in `_prepare_request_params`, following the same pattern used for `parallel_tool_calls`. Co-Authored-By: Claude Opus 4.6 --- .../bedrock/chat/converse_transformation.py | 2 ++ .../chat/test_converse_transformation.py | 20 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/litellm/llms/bedrock/chat/converse_transformation.py b/litellm/llms/bedrock/chat/converse_transformation.py index db6784d042b..ac88662e92c 100644 --- a/litellm/llms/bedrock/chat/converse_transformation.py +++ b/litellm/llms/bedrock/chat/converse_transformation.py @@ -1249,6 +1249,8 @@ class AmazonConverseConfig(BaseConfig): additional_request_params ) + additional_request_params.pop("client_metadata", None) + return ( inference_params, additional_request_params, diff --git a/tests/test_litellm/llms/bedrock/chat/test_converse_transformation.py b/tests/test_litellm/llms/bedrock/chat/test_converse_transformation.py index 38a59c694e7..6b53727fc1c 100644 --- a/tests/test_litellm/llms/bedrock/chat/test_converse_transformation.py +++ b/tests/test_litellm/llms/bedrock/chat/test_converse_transformation.py @@ -4146,3 +4146,23 @@ def test_transform_response_finish_reason_stop_when_json_mode_filters_all_tools( # finish_reason must be "stop", not "tool_calls" assert result.choices[0].finish_reason == "stop" + + +def test_client_metadata_not_in_additional_model_request_fields(): + """client_metadata from Responses API clients (e.g. Codex) must not leak into additionalModelRequestFields.""" + config = AmazonConverseConfig() + model = "anthropic.claude-sonnet-4-5-20250929-v1:0" + messages = [{"role": "user", "content": "Hello"}] + + optional_params = {"client_metadata": {"client": "codex", "version": "0.121.0"}} + + request_data = config.transform_request( + model=model, + messages=messages, + optional_params=optional_params, + litellm_params={}, + headers={}, + ) + + additional = request_data.get("additionalModelRequestFields", {}) + assert "client_metadata" not in additional