|
@@ -1,5 +1,4 @@
|
|
import base64
|
|
import base64
|
|
-import io
|
|
|
|
import json
|
|
import json
|
|
from collections.abc import Generator, Sequence
|
|
from collections.abc import Generator, Sequence
|
|
from typing import Optional, Union, cast
|
|
from typing import Optional, Union, cast
|
|
@@ -18,7 +17,6 @@ from anthropic.types import (
|
|
)
|
|
)
|
|
from anthropic.types.beta.tools import ToolsBetaMessage
|
|
from anthropic.types.beta.tools import ToolsBetaMessage
|
|
from httpx import Timeout
|
|
from httpx import Timeout
|
|
-from PIL import Image
|
|
|
|
|
|
|
|
from core.model_runtime.callbacks.base_callback import Callback
|
|
from core.model_runtime.callbacks.base_callback import Callback
|
|
from core.model_runtime.entities import (
|
|
from core.model_runtime.entities import (
|
|
@@ -498,22 +496,19 @@ class AnthropicLargeLanguageModel(LargeLanguageModel):
|
|
sub_messages.append(sub_message_dict)
|
|
sub_messages.append(sub_message_dict)
|
|
elif message_content.type == PromptMessageContentType.IMAGE:
|
|
elif message_content.type == PromptMessageContentType.IMAGE:
|
|
message_content = cast(ImagePromptMessageContent, message_content)
|
|
message_content = cast(ImagePromptMessageContent, message_content)
|
|
- if not message_content.data.startswith("data:"):
|
|
|
|
|
|
+ if not message_content.base64_data:
|
|
# fetch image data from url
|
|
# fetch image data from url
|
|
try:
|
|
try:
|
|
- image_content = requests.get(message_content.data).content
|
|
|
|
- with Image.open(io.BytesIO(image_content)) as img:
|
|
|
|
- mime_type = f"image/{img.format.lower()}"
|
|
|
|
|
|
+ image_content = requests.get(message_content.url).content
|
|
base64_data = base64.b64encode(image_content).decode("utf-8")
|
|
base64_data = base64.b64encode(image_content).decode("utf-8")
|
|
except Exception as ex:
|
|
except Exception as ex:
|
|
raise ValueError(
|
|
raise ValueError(
|
|
f"Failed to fetch image data from url {message_content.data}, {ex}"
|
|
f"Failed to fetch image data from url {message_content.data}, {ex}"
|
|
)
|
|
)
|
|
else:
|
|
else:
|
|
- data_split = message_content.data.split(";base64,")
|
|
|
|
- mime_type = data_split[0].replace("data:", "")
|
|
|
|
- base64_data = data_split[1]
|
|
|
|
|
|
+ base64_data = message_content.base64_data
|
|
|
|
|
|
|
|
+ mime_type = message_content.mime_type
|
|
if mime_type not in {"image/jpeg", "image/png", "image/gif", "image/webp"}:
|
|
if mime_type not in {"image/jpeg", "image/png", "image/gif", "image/webp"}:
|
|
raise ValueError(
|
|
raise ValueError(
|
|
f"Unsupported image type {mime_type}, "
|
|
f"Unsupported image type {mime_type}, "
|
|
@@ -526,19 +521,17 @@ class AnthropicLargeLanguageModel(LargeLanguageModel):
|
|
}
|
|
}
|
|
sub_messages.append(sub_message_dict)
|
|
sub_messages.append(sub_message_dict)
|
|
elif isinstance(message_content, DocumentPromptMessageContent):
|
|
elif isinstance(message_content, DocumentPromptMessageContent):
|
|
- data_split = message_content.data.split(";base64,")
|
|
|
|
- mime_type = data_split[0].replace("data:", "")
|
|
|
|
- base64_data = data_split[1]
|
|
|
|
- if mime_type != "application/pdf":
|
|
|
|
|
|
+ if message_content.mime_type != "application/pdf":
|
|
raise ValueError(
|
|
raise ValueError(
|
|
- f"Unsupported document type {mime_type}, " "only support application/pdf"
|
|
|
|
|
|
+ f"Unsupported document type {message_content.mime_type}, "
|
|
|
|
+ "only support application/pdf"
|
|
)
|
|
)
|
|
sub_message_dict = {
|
|
sub_message_dict = {
|
|
"type": "document",
|
|
"type": "document",
|
|
"source": {
|
|
"source": {
|
|
- "type": message_content.encode_format,
|
|
|
|
- "media_type": mime_type,
|
|
|
|
- "data": base64_data,
|
|
|
|
|
|
+ "type": "base64",
|
|
|
|
+ "media_type": message_content.mime_type,
|
|
|
|
+ "data": message_content.data,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
sub_messages.append(sub_message_dict)
|
|
sub_messages.append(sub_message_dict)
|