Fix converse handling for parallel_tool_calls

This commit is contained in:
Sameer Kankute 2026-02-27 13:00:57 +05:30
parent 8d1c75c48a
commit d0445e1e33
2 changed files with 60 additions and 41 deletions

View File

@ -1217,15 +1217,15 @@ class AmazonConverseConfig(BaseConfig):
# Handle parallel_tool_calls configuration # Handle parallel_tool_calls configuration
parallel_tool_use_config = additional_request_params.pop("_parallel_tool_use_config", None) parallel_tool_use_config = additional_request_params.pop("_parallel_tool_use_config", None)
if parallel_tool_use_config is not None: if parallel_tool_use_config is not None and is_claude_4_5_on_bedrock(model):
# Merge the tool_choice config from parallel_tool_calls into additional_request_params
for key, value in parallel_tool_use_config.items(): for key, value in parallel_tool_use_config.items():
if key in additional_request_params and isinstance(additional_request_params[key], dict) and isinstance(value, dict): if key in additional_request_params and isinstance(additional_request_params[key], dict) and isinstance(value, dict):
# Merge dictionaries
additional_request_params[key].update(value) additional_request_params[key].update(value)
else: else:
additional_request_params[key] = value additional_request_params[key] = value
additional_request_params.pop("parallel_tool_calls", None)
# Only set the topK value in for models that support it # Only set the topK value in for models that support it
additional_request_params.update( additional_request_params.update(
self._handle_top_k_value(model, inference_params) self._handle_top_k_value(model, inference_params)

View File

@ -3382,59 +3382,78 @@ def test_output_config_applies_additional_properties():
def test_parallel_tool_calls_in_request_transformation(): _TOOL_PARAM = [
"""Test that parallel_tool_calls is correctly placed in additionalModelRequestFields after full transformation""" {
config = AmazonConverseConfig() "type": "function",
"function": {
messages = [ "name": "get_weather",
{"role": "user", "content": "What's the weather in SF and NYC?"} "description": "Get the weather",
] "parameters": {
"type": "object",
non_default_params = { "properties": {
"parallel_tool_calls": False, "location": {
"tools": [ "type": "string",
{ "description": "The location to get weather for",
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the weather",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The location to get weather for"
}
},
"required": ["location"]
} }
} },
} "required": ["location"],
], },
"max_tokens": 100, },
} }
]
def test_parallel_tool_calls_newer_model_adds_disable_flag():
"""Newer Claude models (4.5+) should get disable_parallel_tool_use in additionalModelRequestFields."""
config = AmazonConverseConfig()
model = "anthropic.claude-sonnet-4-5-20250929-v1:0"
messages = [{"role": "user", "content": "What's the weather in SF and NYC?"}]
optional_params = config.map_openai_params( optional_params = config.map_openai_params(
non_default_params=non_default_params, non_default_params={"parallel_tool_calls": False, "tools": _TOOL_PARAM},
optional_params={}, optional_params={},
model="anthropic.claude-sonnet-4-5-v2:0", model=model,
drop_params=False, drop_params=False,
) )
# Transform the request
request_data = config.transform_request( request_data = config.transform_request(
model="anthropic.claude-sonnet-4-5-v2:0", model=model,
messages=messages, messages=messages,
optional_params=optional_params, optional_params=optional_params,
litellm_params={}, litellm_params={},
headers={}, headers={},
) )
# Verify the structure
assert "additionalModelRequestFields" in request_data assert "additionalModelRequestFields" in request_data
assert "tool_choice" in request_data["additionalModelRequestFields"] assert "tool_choice" in request_data["additionalModelRequestFields"]
assert "disable_parallel_tool_use" in request_data["additionalModelRequestFields"]["tool_choice"]
assert request_data["additionalModelRequestFields"]["tool_choice"]["disable_parallel_tool_use"] is True assert request_data["additionalModelRequestFields"]["tool_choice"]["disable_parallel_tool_use"] is True
assert "parallel_tool_calls" not in request_data["additionalModelRequestFields"]
def test_parallel_tool_calls_older_model_drops_disable_flag():
"""Older Claude models (pre-4.5) must NOT receive disable_parallel_tool_use — Bedrock rejects it."""
config = AmazonConverseConfig()
model = "anthropic.claude-3-5-sonnet-20241022-v2:0"
messages = [{"role": "user", "content": "What's the weather in SF and NYC?"}]
optional_params = config.map_openai_params(
non_default_params={"parallel_tool_calls": False, "tools": _TOOL_PARAM},
optional_params={},
model=model,
drop_params=False,
)
request_data = config.transform_request(
model=model,
messages=messages,
optional_params=optional_params,
litellm_params={},
headers={},
)
additional = request_data.get("additionalModelRequestFields", {})
assert "tool_choice" not in additional
assert "parallel_tool_calls" not in additional
class TestBedrockMinThinkingBudgetTokens: class TestBedrockMinThinkingBudgetTokens: