From ad8e0acd7ab6727c373e8e953a5d82c104da0582 Mon Sep 17 00:00:00 2001 From: aaarc Date: Wed, 17 Jun 2026 23:54:31 +0530 Subject: [PATCH 1/2] feat(python): support both base64 and url image uploads in Anthropic user messages Update _format_user_message in nthropic/services/utils.py to handle now handle both base64 image bytes and image urls should resolve Issue #12944 --- .../connectors/ai/anthropic/services/utils.py | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/python/semantic_kernel/connectors/ai/anthropic/services/utils.py b/python/semantic_kernel/connectors/ai/anthropic/services/utils.py index e41905e1cc91..94648620616a 100644 --- a/python/semantic_kernel/connectors/ai/anthropic/services/utils.py +++ b/python/semantic_kernel/connectors/ai/anthropic/services/utils.py @@ -10,6 +10,7 @@ from semantic_kernel.contents.function_call_content import FunctionCallContent from semantic_kernel.contents.function_result_content import FunctionResultContent from semantic_kernel.contents.text_content import TextContent +from semantic_kernel.contents.image_content import ImageContent from semantic_kernel.contents.utils.author_role import AuthorRole from semantic_kernel.functions.kernel_function_metadata import KernelFunctionMetadata @@ -21,6 +22,7 @@ from semantic_kernel.connectors.ai.prompt_execution_settings import PromptExecutionSettings + def _format_user_message(message: ChatMessageContent) -> dict[str, Any]: """Format a user message to the expected object for the Anthropic client. @@ -30,10 +32,22 @@ def _format_user_message(message: ChatMessageContent) -> dict[str, Any]: Returns: The formatted user message. """ - return { - "role": "user", - "content": message.content, - } + if not any(isinstance(item, (ImageContent)) for item in message.items): + return {"role": "user","content": message.content} + else: + content_items :list[dict] = [] + for content in message.items: + if isinstance(content, TextContent): + content_items.append({"type": "text", "text": content.text}) + elif isinstance(content, ImageContent) and (content.data): + content_items.append({"type":"image","source":{"type": "base64","data":content.data_string,"media_type":content.mime_type if content.mime_type else content.default_mime_type}}) + elif isinstance(content, ImageContent) and (content.uri): + content_items.append({"type":"image","source":{"type":"url","url":f"{content.uri}"}}) + else: + logger.warning( + "Unsupported item type in User message while formatting chat history for Anthropic AI" + f" Inference: {type(content)}") + return {"role": "user","content": content_items} def _format_assistant_message(message: ChatMessageContent) -> dict[str, Any]: From 11700a9d7f9003c5b6cab837718028bdfcd97987 Mon Sep 17 00:00:00 2001 From: aaarc Date: Thu, 18 Jun 2026 00:07:19 +0530 Subject: [PATCH 2/2] feat(python): support both base64 and url image uploads in Anthropic user messages modified and made simple fixes to better follow pep8 guidelines should resolve Issue #12944 --- .../connectors/ai/anthropic/services/utils.py | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/python/semantic_kernel/connectors/ai/anthropic/services/utils.py b/python/semantic_kernel/connectors/ai/anthropic/services/utils.py index 94648620616a..b2fcac7f2175 100644 --- a/python/semantic_kernel/connectors/ai/anthropic/services/utils.py +++ b/python/semantic_kernel/connectors/ai/anthropic/services/utils.py @@ -32,21 +32,22 @@ def _format_user_message(message: ChatMessageContent) -> dict[str, Any]: Returns: The formatted user message. """ - if not any(isinstance(item, (ImageContent)) for item in message.items): + if not any(isinstance(item,ImageContent) for item in message.items): return {"role": "user","content": message.content} else: - content_items :list[dict] = [] + content_items: list[dict[str, Any]] = [] for content in message.items: if isinstance(content, TextContent): content_items.append({"type": "text", "text": content.text}) - elif isinstance(content, ImageContent) and (content.data): - content_items.append({"type":"image","source":{"type": "base64","data":content.data_string,"media_type":content.mime_type if content.mime_type else content.default_mime_type}}) - elif isinstance(content, ImageContent) and (content.uri): - content_items.append({"type":"image","source":{"type":"url","url":f"{content.uri}"}}) - else: - logger.warning( - "Unsupported item type in User message while formatting chat history for Anthropic AI" - f" Inference: {type(content)}") + elif isinstance(content, ImageContent): + if (content.data): + content_items.append({"type":"image","source":{"type": "base64","data":content.data_string,"media_type":content.mime_type if content.mime_type else content.default_mime_type}}) + elif (content.uri): + content_items.append({"type":"image","source":{"type":"url","url":f"{content.uri}"}}) + else: + logger.warning( + "Unsupported item type in User message while formatting chat history for Anthropic AI" + f" Inference: {type(content)}") return {"role": "user","content": content_items}