Skip to content

Commit cd88c70

Browse files
Merge branch 'main' into feat/add-count-filtering-to-OpenSearchDocumentStore
2 parents da07149 + 617b9e8 commit cd88c70

5 files changed

Lines changed: 150 additions & 43 deletions

File tree

integrations/amazon_bedrock/src/haystack_integrations/components/generators/amazon_bedrock/chat/chat_generator.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -423,27 +423,31 @@ def _prepare_request_params(
423423

424424
def _resolve_flattened_generation_kwargs(self, generation_kwargs: dict[str, Any]) -> dict[str, Any]:
425425
generation_kwargs = generation_kwargs.copy()
426-
if "disable_parallel_tool_use" in generation_kwargs:
427-
disable_parallel_tool_use = generation_kwargs.pop("disable_parallel_tool_use")
428-
tool_choice = generation_kwargs.setdefault("tool_choice", {})
429-
tool_choice["disable_parallel_tool_use"] = disable_parallel_tool_use
430426

431-
if "parallel_tool_use" in generation_kwargs:
432-
parallel_tool_use = generation_kwargs.pop("parallel_tool_use")
427+
disable_parallel_tool_use = generation_kwargs.pop("disable_parallel_tool_use", None)
428+
parallel_tool_use = generation_kwargs.pop("parallel_tool_use", None)
429+
430+
if disable_parallel_tool_use is not None and parallel_tool_use is not None:
431+
msg = "Cannot set both disable_parallel_tool_use and parallel_tool_use"
432+
raise ValueError(msg)
433+
elif parallel_tool_use is not None:
433434
disable_parallel_tool_use = not parallel_tool_use
435+
436+
if disable_parallel_tool_use is not None:
434437
tool_choice = generation_kwargs.setdefault("tool_choice", {})
435438
tool_choice["disable_parallel_tool_use"] = disable_parallel_tool_use
439+
tool_choice.setdefault("type", "auto") # default value
436440

437-
if "tool_choice_type" in generation_kwargs:
438-
tool_choice_type = generation_kwargs.pop("tool_choice_type")
441+
tool_choice_type = generation_kwargs.pop("tool_choice_type", None)
442+
if tool_choice_type is not None:
439443
tool_choice = generation_kwargs.setdefault("tool_choice", {})
440444
tool_choice["type"] = tool_choice_type
441445

442-
if "thinking_budget_tokens" in generation_kwargs:
443-
thinking_budget_tokens = generation_kwargs.pop("thinking_budget_tokens")
446+
thinking_budget_tokens = generation_kwargs.pop("thinking_budget_tokens", None)
447+
if thinking_budget_tokens is not None:
444448
thinking = generation_kwargs.setdefault("thinking", {})
445449
thinking["budget_tokens"] = thinking_budget_tokens
446-
thinking["type"] = "enabled"
450+
thinking.setdefault("type", "enabled")
447451

448452
return generation_kwargs
449453

integrations/amazon_bedrock/tests/test_chat_generator.py

Lines changed: 57 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -409,21 +409,68 @@ def tool_fn(city: str) -> str:
409409
]
410410
}
411411

412-
def test_prepare_request_params_with_flattened_generation_kwargs(self, mock_boto3_session, set_env_variables):
412+
@pytest.mark.parametrize(
413+
"generation_kwargs,additional_model_request_fields",
414+
[
415+
(
416+
{
417+
"parallel_tool_use": False,
418+
"tool_choice_type": "any",
419+
"thinking_budget_tokens": 1024,
420+
},
421+
{
422+
"tool_choice": {"disable_parallel_tool_use": True, "type": "any"},
423+
"thinking": {"budget_tokens": 1024, "type": "enabled"},
424+
},
425+
),
426+
(
427+
{
428+
"parallel_tool_use": True,
429+
"tool_choice_type": "all",
430+
},
431+
{
432+
"tool_choice": {"disable_parallel_tool_use": False, "type": "all"},
433+
},
434+
),
435+
(
436+
{
437+
"parallel_tool_use": True,
438+
},
439+
{
440+
"tool_choice": {"disable_parallel_tool_use": False, "type": "auto"},
441+
},
442+
),
443+
(
444+
{
445+
"disable_parallel_tool_use": True,
446+
},
447+
{
448+
"tool_choice": {"disable_parallel_tool_use": True, "type": "auto"},
449+
},
450+
),
451+
(
452+
{
453+
"thinking_budget_tokens": None,
454+
"parallel_tool_use": None,
455+
"tool_choice_type": None,
456+
},
457+
{},
458+
),
459+
],
460+
)
461+
def test_prepare_request_params_with_flattened_generation_kwargs(
462+
self, mock_boto3_session, set_env_variables, generation_kwargs, additional_model_request_fields
463+
):
413464
generator = AmazonBedrockChatGenerator(model="anthropic.claude-3-5-sonnet-20240620-v1:0")
414465
request_params, _ = generator._prepare_request_params(
415466
messages=[ChatMessage.from_user("What's the capital of France?")],
416-
generation_kwargs={
417-
"parallel_tool_use": False,
418-
"tool_choice_type": "any",
419-
"thinking_budget_tokens": 1024,
420-
},
467+
generation_kwargs=generation_kwargs,
421468
)
422469

423-
assert request_params["additionalModelRequestFields"] == {
424-
"tool_choice": {"disable_parallel_tool_use": True, "type": "any"},
425-
"thinking": {"budget_tokens": 1024, "type": "enabled"},
426-
}
470+
if not additional_model_request_fields:
471+
assert "additionalModelRequestFields" not in request_params
472+
else:
473+
assert request_params["additionalModelRequestFields"] == additional_model_request_fields
427474

428475

429476
# In the CI, those tests are skipped if AWS Authentication fails

integrations/anthropic/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## [integrations/anthropic-v5.1.1] - 2026-01-15
4+
5+
### 🐛 Bug Fixes
6+
7+
- None value handling of flattened generation kwargs for AnthropicChatGenerator (#2753)
8+
9+
310
## [integrations/anthropic-v5.1.0] - 2026-01-13
411

512
### 🚀 Features

integrations/anthropic/src/haystack_integrations/components/generators/anthropic/chat/chat_generator.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -279,27 +279,31 @@ def _prepare_request_params(
279279

280280
def _resolve_flattened_generation_kwargs(self, generation_kwargs: dict[str, Any]) -> dict[str, Any]:
281281
generation_kwargs = generation_kwargs.copy()
282-
if "disable_parallel_tool_use" in generation_kwargs:
283-
disable_parallel_tool_use = generation_kwargs.pop("disable_parallel_tool_use")
284-
tool_choice = generation_kwargs.setdefault("tool_choice", {})
285-
tool_choice["disable_parallel_tool_use"] = disable_parallel_tool_use
286282

287-
if "parallel_tool_use" in generation_kwargs:
288-
parallel_tool_use = generation_kwargs.pop("parallel_tool_use")
283+
disable_parallel_tool_use = generation_kwargs.pop("disable_parallel_tool_use", None)
284+
parallel_tool_use = generation_kwargs.pop("parallel_tool_use", None)
285+
286+
if disable_parallel_tool_use is not None and parallel_tool_use is not None:
287+
msg = "Cannot set both disable_parallel_tool_use and parallel_tool_use"
288+
raise ValueError(msg)
289+
elif parallel_tool_use is not None:
289290
disable_parallel_tool_use = not parallel_tool_use
291+
292+
if disable_parallel_tool_use is not None:
290293
tool_choice = generation_kwargs.setdefault("tool_choice", {})
291294
tool_choice["disable_parallel_tool_use"] = disable_parallel_tool_use
295+
tool_choice.setdefault("type", "auto") # default value
292296

293-
if "tool_choice_type" in generation_kwargs:
294-
tool_choice_type = generation_kwargs.pop("tool_choice_type")
297+
tool_choice_type = generation_kwargs.pop("tool_choice_type", None)
298+
if tool_choice_type is not None:
295299
tool_choice = generation_kwargs.setdefault("tool_choice", {})
296300
tool_choice["type"] = tool_choice_type
297301

298-
if "thinking_budget_tokens" in generation_kwargs:
299-
thinking_budget_tokens = generation_kwargs.pop("thinking_budget_tokens")
302+
thinking_budget_tokens = generation_kwargs.pop("thinking_budget_tokens", None)
303+
if thinking_budget_tokens is not None:
300304
thinking = generation_kwargs.setdefault("thinking", {})
301305
thinking["budget_tokens"] = thinking_budget_tokens
302-
thinking["type"] = "enabled"
306+
thinking.setdefault("type", "enabled")
303307

304308
return generation_kwargs
305309

integrations/anthropic/tests/test_chat_generator.py

Lines changed: 56 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -344,26 +344,71 @@ def test_run_with_params(self, chat_messages, mock_anthropic_completion):
344344
assert response["replies"][0].meta["model"] == "claude-sonnet-4-5"
345345
assert response["replies"][0].meta["finish_reason"] == "stop"
346346

347-
def test_run_with_flattened_generation_kwargs(self, chat_messages, mock_anthropic_completion):
347+
@pytest.mark.parametrize(
348+
"generation_kwargs,expected_kwargs",
349+
[
350+
(
351+
{
352+
"parallel_tool_use": False,
353+
"tool_choice_type": "any",
354+
"thinking_budget_tokens": 1024,
355+
},
356+
{
357+
"tool_choice": {"disable_parallel_tool_use": True, "type": "any"},
358+
"thinking": {"budget_tokens": 1024, "type": "enabled"},
359+
},
360+
),
361+
(
362+
{
363+
"parallel_tool_use": True,
364+
"tool_choice_type": "all",
365+
},
366+
{
367+
"tool_choice": {"disable_parallel_tool_use": False, "type": "all"},
368+
},
369+
),
370+
(
371+
{
372+
"parallel_tool_use": True,
373+
},
374+
{
375+
"tool_choice": {"disable_parallel_tool_use": False, "type": "auto"},
376+
},
377+
),
378+
(
379+
{
380+
"disable_parallel_tool_use": True,
381+
},
382+
{
383+
"tool_choice": {"disable_parallel_tool_use": True, "type": "auto"},
384+
},
385+
),
386+
(
387+
{
388+
"thinking_budget_tokens": None,
389+
"parallel_tool_use": None,
390+
"tool_choice_type": None,
391+
},
392+
{},
393+
),
394+
],
395+
)
396+
def test_run_with_flattened_generation_kwargs(
397+
self, chat_messages, mock_anthropic_completion, generation_kwargs, expected_kwargs
398+
):
348399
"""
349400
Test that the AnthropicChatGenerator component can run with parameters.
350401
"""
351402
component = AnthropicChatGenerator(
352403
api_key=Secret.from_token("test-api-key"),
353-
generation_kwargs={
354-
"max_tokens": 10,
355-
"thinking_budget_tokens": 1024,
356-
"parallel_tool_use": False,
357-
"tool_choice_type": "any",
358-
},
404+
generation_kwargs=generation_kwargs,
359405
)
360406
component.run(chat_messages)
361407

362408
# Check that the component calls the Anthropic API with the correct parameters
363-
_, kwargs = mock_anthropic_completion.call_args
364-
assert kwargs["max_tokens"] == 10
365-
assert kwargs["thinking"] == {"budget_tokens": 1024, "type": "enabled"}
366-
assert kwargs["tool_choice"] == {"disable_parallel_tool_use": True, "type": "any"}
409+
actual_kwargs = mock_anthropic_completion.call_args.kwargs
410+
assert actual_kwargs.get("tool_choice") == expected_kwargs.get("tool_choice")
411+
assert actual_kwargs.get("thinking") == expected_kwargs.get("thinking")
367412

368413
def test_check_duplicate_tool_names(self, tools):
369414
"""Test that the AnthropicChatGenerator component fails to initialize with duplicate tool names."""

0 commit comments

Comments
 (0)