Improve MIME type detection for image URLs (#6531)

Co-authored-by: seayon <zhaoxuyang@shouqianba.com>
This commit is contained in:
Seayon 2024-08-25 13:36:16 +08:00 committed by GitHub
parent 47919983bf
commit 561a61e7fe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 16 additions and 9 deletions

View File

@ -1,6 +1,6 @@
import base64 import base64
import io
import json import json
import mimetypes
from collections.abc import Generator from collections.abc import Generator
from typing import Optional, Union, cast from typing import Optional, Union, cast
@ -18,6 +18,7 @@ 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.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta
@ -462,7 +463,8 @@ class AnthropicLargeLanguageModel(LargeLanguageModel):
# fetch image data from url # fetch image data from url
try: try:
image_content = requests.get(message_content.data).content image_content = requests.get(message_content.data).content
mime_type, _ = mimetypes.guess_type(message_content.data) with Image.open(io.BytesIO(image_content)) as img:
mime_type = f"image/{img.format.lower()}"
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(f"Failed to fetch image data from url {message_content.data}, {ex}") raise ValueError(f"Failed to fetch image data from url {message_content.data}, {ex}")

View File

@ -1,8 +1,8 @@
# standard import # standard import
import base64 import base64
import io
import json import json
import logging import logging
import mimetypes
from collections.abc import Generator from collections.abc import Generator
from typing import Optional, Union, cast from typing import Optional, Union, cast
@ -17,6 +17,7 @@ from botocore.exceptions import (
ServiceNotInRegionError, ServiceNotInRegionError,
UnknownServiceError, UnknownServiceError,
) )
from PIL.Image import Image
# local import # local import
from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta
@ -381,9 +382,8 @@ class BedrockLargeLanguageModel(LargeLanguageModel):
try: try:
url = message_content.data url = message_content.data
image_content = requests.get(url).content image_content = requests.get(url).content
if '?' in url: with Image.open(io.BytesIO(image_content)) as img:
url = url.split('?')[0] mime_type = f"image/{img.format.lower()}"
mime_type, _ = mimetypes.guess_type(url)
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(f"Failed to fetch image data from url {message_content.data}, {ex}") raise ValueError(f"Failed to fetch image data from url {message_content.data}, {ex}")

View File

@ -1,7 +1,7 @@
import base64 import base64
import io
import json import json
import logging import logging
import mimetypes
from collections.abc import Generator from collections.abc import Generator
from typing import Optional, Union, cast from typing import Optional, Union, cast
@ -12,6 +12,7 @@ import google.generativeai.client as client
import requests import requests
from google.generativeai.types import ContentType, GenerateContentResponse, HarmBlockThreshold, HarmCategory from google.generativeai.types import ContentType, GenerateContentResponse, HarmBlockThreshold, HarmCategory
from google.generativeai.types.content_types import to_part from google.generativeai.types.content_types import to_part
from PIL import Image
from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta
from core.model_runtime.entities.message_entities import ( from core.model_runtime.entities.message_entities import (
@ -371,7 +372,8 @@ class GoogleLargeLanguageModel(LargeLanguageModel):
# fetch image data from url # fetch image data from url
try: try:
image_content = requests.get(message_content.data).content image_content = requests.get(message_content.data).content
mime_type, _ = mimetypes.guess_type(message_content.data) with Image.open(io.BytesIO(image_content)) as img:
mime_type = f"image/{img.format.lower()}"
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(f"Failed to fetch image data from url {message_content.data}, {ex}") raise ValueError(f"Failed to fetch image data from url {message_content.data}, {ex}")

View File

@ -1,4 +1,5 @@
import base64 import base64
import io
import json import json
import logging import logging
from collections.abc import Generator from collections.abc import Generator
@ -18,6 +19,7 @@ from anthropic.types import (
) )
from google.cloud import aiplatform from google.cloud import aiplatform
from google.oauth2 import service_account from google.oauth2 import service_account
from PIL import Image
from vertexai.generative_models import HarmBlockThreshold, HarmCategory from vertexai.generative_models import HarmBlockThreshold, HarmCategory
from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta, LLMUsage from core.model_runtime.entities.llm_entities import LLMResult, LLMResultChunk, LLMResultChunkDelta, LLMUsage
@ -332,7 +334,8 @@ class VertexAiLargeLanguageModel(LargeLanguageModel):
# fetch image data from url # fetch image data from url
try: try:
image_content = requests.get(message_content.data).content image_content = requests.get(message_content.data).content
mime_type, _ = mimetypes.guess_type(message_content.data) with Image.open(io.BytesIO(image_content)) as img:
mime_type = f"image/{img.format.lower()}"
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(f"Failed to fetch image data from url {message_content.data}, {ex}") raise ValueError(f"Failed to fetch image data from url {message_content.data}, {ex}")