From ce0a024757ae7ae14e7473f6150fe702a80ad74e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=82=E5=A3=B9?= <137363396+KBVsent@users.noreply.github.com> Date: Wed, 14 Jan 2026 11:50:56 +0900 Subject: [PATCH] fix: sending OpenAI-style image_url causes Anthropic 400 invalid tag error (#4444) --- .../core/provider/sources/anthropic_source.py | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/astrbot/core/provider/sources/anthropic_source.py b/astrbot/core/provider/sources/anthropic_source.py index edd7448ee..566569e03 100644 --- a/astrbot/core/provider/sources/anthropic_source.py +++ b/astrbot/core/provider/sources/anthropic_source.py @@ -127,6 +127,50 @@ class ProviderAnthropic(Provider): ], }, ) + elif message["role"] == "user": + if isinstance(message.get("content"), list): + converted_content = [] + for part in message["content"]: + if part.get("type") == "image_url": + # Convert OpenAI image_url format to Anthropic image format + image_url_data = part.get("image_url", {}) + url = image_url_data.get("url", "") + if url.startswith("data:"): + try: + _, base64_data = url.split(",", 1) + # Detect actual image format from binary data + image_bytes = base64.b64decode(base64_data) + media_type = self._detect_image_mime_type( + image_bytes + ) + converted_content.append( + { + "type": "image", + "source": { + "type": "base64", + "media_type": media_type, + "data": base64_data, + }, + } + ) + except ValueError: + logger.warning( + f"Failed to parse image data URI: {url[:50]}..." + ) + else: + logger.warning( + f"Unsupported image URL format for Anthropic: {url[:50]}..." + ) + else: + converted_content.append(part) + new_messages.append( + { + "role": "user", + "content": converted_content, + } + ) + else: + new_messages.append(message) else: new_messages.append(message)