fix(bedrock): forward a non-string reasoning_effort on the native route instead of crashing
Some checks failed
LiteLLM Rust / rust-lint (push) Waiting to run
LiteLLM Rust / rust-test (push) Waiting to run
LiteLLM Rust / rust-wheel (push) Waiting to run
Terraform Provider / gofmt, vet, build, test (push) Has been cancelled
Terraform Provider / Provider endpoints vs proxy OpenAPI schema (push) Has been cancelled

A list or dict reasoning_effort hit a frozenset membership test in
without_refused_reasoning_effort and raised TypeError, which the proxy
surfaced as a 500 APIConnectionError with no upstream call. The value is
now left alone unless it is a string Bedrock's native endpoint refuses,
so AWS answers the malformed value with its own 400 like it does for an int
This commit is contained in:
mateo-berri 2026-09-30 18:50:14 -07:00
parent 19176f6754
commit a0cef91f0b
2 changed files with 15 additions and 1 deletions

View file

@ -108,7 +108,8 @@ def chat_completions_reasoning_efforts_refused_for(model: str) -> frozenset[str]
def without_refused_reasoning_effort(model: str, params: Mapping[str, object]) -> Mapping[str, object]: def without_refused_reasoning_effort(model: str, params: Mapping[str, object]) -> Mapping[str, object]:
if params.get("reasoning_effort") not in chat_completions_reasoning_efforts_refused_for(model): effort: Final = params.get("reasoning_effort")
if not isinstance(effort, str) or effort not in chat_completions_reasoning_efforts_refused_for(model):
return params return params
return _without_params(params, frozenset(("reasoning_effort",))) return _without_params(params, frozenset(("reasoning_effort",)))

View file

@ -573,6 +573,19 @@ def test_map_openai_params_keeps_reasoning_effort_low_for_grok():
assert mapped["reasoning_effort"] == "low" assert mapped["reasoning_effort"] == "low"
@pytest.mark.parametrize("model", ["us.xai.grok-4.6", "global.openai.gpt-5.6-sol"])
@pytest.mark.parametrize("reasoning_effort", [["low"], {"effort": "low"}, 5])
def test_map_openai_params_forwards_a_malformed_reasoning_effort_for_aws_to_refuse(model, reasoning_effort):
cfg = AmazonBedrockRuntimeChatCompletionsConfig()
mapped = cfg.map_openai_params(
non_default_params={"reasoning_effort": reasoning_effort, "max_tokens": 64},
optional_params={},
model=model,
drop_params=False,
)
assert mapped["reasoning_effort"] == reasoning_effort
def test_map_openai_params_keeps_reasoning_effort_none_for_gpt56(): def test_map_openai_params_keeps_reasoning_effort_none_for_gpt56():
cfg = AmazonBedrockRuntimeChatCompletionsConfig() cfg = AmazonBedrockRuntimeChatCompletionsConfig()
mapped = cfg.map_openai_params( mapped = cfg.map_openai_params(