From d8135c5d7b94311ebf03752d3da249018decc2c5 Mon Sep 17 00:00:00 2001 From: qdivan <77005282+qdivan@users.noreply.github.com> Date: Fri, 4 Sep 2026 21:58:01 +0800 Subject: [PATCH] fix(bedrock): preserve tool reference results --- .../prompt_templates/factory.py | 7 ++- ...llm_core_utils_prompt_templates_factory.py | 44 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/litellm/litellm_core_utils/prompt_templates/factory.py b/litellm/litellm_core_utils/prompt_templates/factory.py index ba59e3fa997..5dd8b36500a 100644 --- a/litellm/litellm_core_utils/prompt_templates/factory.py +++ b/litellm/litellm_core_utils/prompt_templates/factory.py @@ -3795,7 +3795,12 @@ def _build_bedrock_tool_result_content_blocks( if isinstance(message_content, str): return [BedrockToolResultContentBlock(text=message_content)], False if isinstance(message_content, list): - return _parse_bedrock_tool_result_content_list(message_content), False + parsed_content: Final = _parse_bedrock_tool_result_content_list(message_content) + if parsed_content: + return parsed_content, False + if any(content.get("type") == "tool_reference" for content in message_content): + return [BedrockToolResultContentBlock(text="")], False + return parsed_content, False return [], False diff --git a/tests/test_litellm/litellm_core_utils/prompt_templates/test_litellm_core_utils_prompt_templates_factory.py b/tests/test_litellm/litellm_core_utils/prompt_templates/test_litellm_core_utils_prompt_templates_factory.py index dd2d45f00c6..70f25e6a4fd 100644 --- a/tests/test_litellm/litellm_core_utils/prompt_templates/test_litellm_core_utils_prompt_templates_factory.py +++ b/tests/test_litellm/litellm_core_utils/prompt_templates/test_litellm_core_utils_prompt_templates_factory.py @@ -2,7 +2,7 @@ import base64 import json import logging import os -from typing import Final +from typing import Final, cast from unittest.mock import MagicMock, patch import pytest @@ -55,6 +55,48 @@ def test_ollama_pt_simple_messages(): assert result["images"] == [] +def test_bedrock_converse_tool_reference_result_keeps_empty_result(): + messages = [ + { + "role": "assistant", + "content": None, + "tool_calls": [ + { + "id": "toolu_01", + "type": "function", + "function": {"name": "ToolSearch", "arguments": "{}"}, + } + ], + }, + { + "role": "tool", + "tool_call_id": "toolu_01", + "content": [{"type": "tool_reference", "tool_name": "mcp__deferred__search"}], + }, + ] + + translated: Final[list[dict[str, object]]] = cast( + list[dict[str, object]], _bedrock_converse_messages_pt(messages=messages, model="", llm_provider="") + ) + + assert translated[1]["content"] == [{"toolResult": {"content": [{"text": ""}], "toolUseId": "toolu_01"}}] + + +def test_bedrock_converse_tool_reference_result_preserves_text_content(): + message = { + "role": "tool", + "tool_call_id": "toolu_01", + "content": [ + {"type": "text", "text": "loaded"}, + {"type": "tool_reference", "tool_name": "mcp__deferred__search"}, + ], + } + + result: Final[dict[str, object]] = cast(dict[str, object], _convert_to_bedrock_tool_call_result(message)) + + assert result == {"toolResult": {"content": [{"text": "loaded"}], "toolUseId": "toolu_01"}} + + def test_ollama_pt_consecutive_user_messages(): """Test handling consecutive user messages""" messages = [