From 37a7a140fcb96c0db50f2621b9bf71dee6647470 Mon Sep 17 00:00:00 2001 From: snaily Date: Sat, 15 Mar 2025 21:11:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=94=B9=E8=BF=9B=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E5=99=A8=E4=B8=AD=E7=9A=84=E5=9B=BE=E5=83=8F?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=92=8C=E6=B6=88=E6=81=AF=E5=88=86=E5=89=B2?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 _get_mime_type_and_data 函数从 base64 字符串中提取 MIME 类型和数据 修改 _convert_image 函数使用动态检测的 MIME 类型,而非硬编码 将 _process_text_with_image 中的 MIME 类型从 image/jpeg 改为 image/png 简化异常处理逻辑 优化 OpenAIMessageConverter 中的消息分割逻辑,仅对最后一个 assistant 消息进行分割处理 --- app/services/chat/message_converter.py | 35 +++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/app/services/chat/message_converter.py b/app/services/chat/message_converter.py index 651c6b7..e282893 100644 --- a/app/services/chat/message_converter.py +++ b/app/services/chat/message_converter.py @@ -17,13 +17,36 @@ class MessageConverter(ABC): def convert(self, messages: List[Dict[str, Any]]) -> tuple[List[Dict[str, Any]], Optional[Dict[str, Any]]]: pass +def _get_mime_type_and_data(base64_string): + """ + 从 base64 字符串中提取 MIME 类型和数据。 + + 参数: + base64_string (str): 可能包含 MIME 类型信息的 base64 字符串 + + 返回: + tuple: (mime_type, encoded_data) + """ + # 检查字符串是否以 "data:" 格式开始 + if base64_string.startswith('data:'): + # 提取 MIME 类型和数据 + pattern = r'data:([^;]+);base64,(.+)' + match = re.match(pattern, base64_string) + if match: + mime_type = match.group(1) + encoded_data = match.group(2) + return mime_type, encoded_data + + # 如果不是预期格式,假定它只是数据部分 + return None, base64_string def _convert_image(image_url: str) -> Dict[str, Any]: if image_url.startswith("data:image"): + mime_type, encoded_data = _get_mime_type_and_data(image_url) return { "inline_data": { - "mime_type": "image/jpeg", - "data": image_url.split(",")[1] + "mime_type": mime_type, + "data": encoded_data } } return { @@ -70,11 +93,11 @@ def _process_text_with_image(text: str) -> List[Dict[str, Any]]: base64_data = _convert_image_to_base64(img_url) parts.append({ "inlineData": { - "mimeType": "image/jpeg", + "mimeType": "image/png", "data": base64_data } }) - except Exception as e: + except Exception: # 如果转换失败,回退到文本模式 parts.append({"text": text}) else: @@ -103,8 +126,8 @@ class OpenAIMessageConverter(MessageConverter): role = "model" parts = [] - # 特别处理assistant的消息,按\n\n分割 - if role == "assistant" and isinstance(msg["content"], str) and msg["content"]: + # 特别处理最后一个assistant的消息,按\n\n分割 + if idx == len(messages) - 1 and role == "assistant" and isinstance(msg["content"], str) and msg["content"]: # 按\n\n分割消息 content_parts = msg["content"].split("\n\n") for part in content_parts: