diff --git a/litellm/litellm_core_utils/prompt_templates/factory.py b/litellm/litellm_core_utils/prompt_templates/factory.py index 7b485501f61..88dd9b57584 100644 --- a/litellm/litellm_core_utils/prompt_templates/factory.py +++ b/litellm/litellm_core_utils/prompt_templates/factory.py @@ -4131,6 +4131,7 @@ async def _bedrock_converse_messages_pt_async( # noqa: PLR0915 OpenAIMessageContentListBlock, element ), block_type="content_block", + model=model, ) ) if _cache_point_block is not None: @@ -4142,7 +4143,7 @@ async def _bedrock_converse_messages_pt_async( # noqa: PLR0915 _part = BedrockContentBlock(text=messages[msg_i]["content"]) _cache_point_block = ( litellm.AmazonConverseConfig()._get_cache_point_block( - message_block, block_type="content_block" + message_block, block_type="content_block", model=model ) ) user_content.append(_part) @@ -4294,6 +4295,7 @@ async def _bedrock_converse_messages_pt_async( # noqa: PLR0915 OpenAIMessageContentListBlock, element ), block_type="content_block", + model=model, ) ) if _cache_point_block is not None: @@ -4311,7 +4313,7 @@ async def _bedrock_converse_messages_pt_async( # noqa: PLR0915 # Add cache point block for assistant string content _cache_point_block = ( litellm.AmazonConverseConfig()._get_cache_point_block( - assistant_message_block, block_type="content_block" + assistant_message_block, block_type="content_block", model=model ) ) if _cache_point_block is not None: @@ -4505,6 +4507,7 @@ def _bedrock_converse_messages_pt( # noqa: PLR0915 OpenAIMessageContentListBlock, element ), block_type="content_block", + model=model, ) ) if _cache_point_block is not None: @@ -4514,7 +4517,7 @@ def _bedrock_converse_messages_pt( # noqa: PLR0915 _part = BedrockContentBlock(text=messages[msg_i]["content"]) _cache_point_block = ( litellm.AmazonConverseConfig()._get_cache_point_block( - message_block, block_type="content_block" + message_block, block_type="content_block", model=model ) ) user_content.append(_part) @@ -4659,6 +4662,7 @@ def _bedrock_converse_messages_pt( # noqa: PLR0915 OpenAIMessageContentListBlock, element ), block_type="content_block", + model=model, ) ) if _cache_point_block is not None: @@ -4671,7 +4675,7 @@ def _bedrock_converse_messages_pt( # noqa: PLR0915 # Add cache point block for assistant string content _cache_point_block = ( litellm.AmazonConverseConfig()._get_cache_point_block( - assistant_message_block, block_type="content_block" + assistant_message_block, block_type="content_block", model=model ) ) if _cache_point_block is not None: 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 26395597166..ef2c63f7fa1 100644 --- a/tests/test_litellm/llms/bedrock/chat/test_converse_transformation.py +++ b/tests/test_litellm/llms/bedrock/chat/test_converse_transformation.py @@ -1318,6 +1318,47 @@ async def test_assistant_message_cache_control(): assert assistant_content[1]["cachePoint"]["type"] == "default" +@pytest.mark.asyncio +async def test_assistant_message_cache_control_with_ttl_claude_45(): + """Test cache_control TTL is preserved for Claude 4.5 Bedrock models.""" + from litellm.litellm_core_utils.prompt_templates.factory import ( + BedrockConverseMessagesProcessor, + _bedrock_converse_messages_pt, + ) + + messages = [ + {"role": "user", "content": "Hello"}, + { + "role": "assistant", + "content": "Hi there!", + "cache_control": {"type": "ephemeral", "ttl": "1h"}, + }, + ] + + model = "bedrock/anthropic.claude-sonnet-4.5-20250514-v1:0" + + result = _bedrock_converse_messages_pt( + messages=messages, + model=model, + llm_provider="bedrock_converse", + ) + + async_result = ( + await BedrockConverseMessagesProcessor._bedrock_converse_messages_pt_async( + messages=messages, + model=model, + llm_provider="bedrock_converse", + ) + ) + + assert result == async_result + + assistant_content = result[1]["content"] + assert "cachePoint" in assistant_content[1] + assert assistant_content[1]["cachePoint"]["type"] == "default" + assert assistant_content[1]["cachePoint"]["ttl"] == "1h" + + @pytest.mark.asyncio async def test_assistant_message_list_content_cache_control(): """Test assistant messages with list content and cache_control."""