@@ -60,6 +60,24 @@ def _format_tools(tools: list[Tool] | None = None) -> dict[str, Any] | None:
6060 return {"tools" : tool_specs } if tool_specs else None
6161
6262
63+ def _convert_image_content_to_bedrock_format (image_content : ImageContent ) -> dict [str , Any ]:
64+ """
65+ Convert a Haystack ImageContent to Bedrock format.
66+ """
67+
68+ image_format = image_content .mime_type .split ("/" )[- 1 ] if image_content .mime_type else None
69+ if image_format not in IMAGE_SUPPORTED_FORMATS :
70+ err_msg = (
71+ f"Unsupported image format: { image_format } . "
72+ f"Bedrock supports the following image formats: { IMAGE_SUPPORTED_FORMATS } "
73+ )
74+ raise ValueError (err_msg )
75+
76+ source = {"bytes" : base64 .b64decode (image_content .base64_image )}
77+
78+ return {"image" : {"format" : image_format , "source" : source }}
79+
80+
6381def _format_tool_call_message (tool_call_message : ChatMessage ) -> dict [str , Any ]:
6482 """
6583 Format a Haystack ChatMessage containing tool calls into Bedrock format.
@@ -94,19 +112,30 @@ def _format_tool_result_message(tool_call_result_message: ChatMessage) -> dict[s
94112 """
95113 # Assuming tool call result messages will only contain tool results
96114 tool_results = []
97- for result in tool_call_result_message .tool_call_results :
98- try :
99- json_result = json .loads (result .result )
100- content = [{"json" : json_result }]
101- except json .JSONDecodeError :
102- content = [{"text" : result .result }]
115+ for tool_call_result in tool_call_result_message .tool_call_results :
116+ if isinstance (tool_call_result .result , str ):
117+ try :
118+ json_result = json .loads (tool_call_result .result )
119+ content = [{"json" : json_result }]
120+ except json .JSONDecodeError :
121+ content = [{"text" : tool_call_result .result }]
122+ elif isinstance (tool_call_result .result , list ):
123+ content = []
124+ for item in tool_call_result .result :
125+ if isinstance (item , TextContent ):
126+ content .append ({"text" : item .text })
127+ elif isinstance (item , ImageContent ):
128+ content .append (_convert_image_content_to_bedrock_format (item ))
129+ else :
130+ err_msg = "Unsupported content type in tool call result"
131+ raise ValueError (err_msg )
103132
104133 tool_results .append (
105134 {
106135 "toolResult" : {
107- "toolUseId" : result .origin .id ,
136+ "toolUseId" : tool_call_result .origin .id ,
108137 "content" : content ,
109- ** ({"status" : "error" } if result .error else {}),
138+ ** ({"status" : "error" } if tool_call_result .error else {}),
110139 }
111140 }
112141 )
@@ -217,16 +246,7 @@ def _format_text_image_message(message: ChatMessage) -> dict[str, Any]:
217246 if message .is_from (ChatRole .ASSISTANT ):
218247 err_msg = "Image content is not supported for assistant messages"
219248 raise ValueError (err_msg )
220-
221- image_format = part .mime_type .split ("/" )[- 1 ] if part .mime_type else None
222- if image_format not in IMAGE_SUPPORTED_FORMATS :
223- err_msg = (
224- f"Unsupported image format: { image_format } . "
225- f"Bedrock supports the following image formats: { IMAGE_SUPPORTED_FORMATS } "
226- )
227- raise ValueError (err_msg )
228- source = {"bytes" : base64 .b64decode (part .base64_image )}
229- bedrock_content_blocks .append ({"image" : {"format" : image_format , "source" : source }})
249+ bedrock_content_blocks .append (_convert_image_content_to_bedrock_format (part ))
230250
231251 return {"role" : message .role .value , "content" : bedrock_content_blocks }
232252
0 commit comments