From 6bc6f77af1977ca35819b9a6ffea636203df2fbc Mon Sep 17 00:00:00 2001 From: RockChinQ <1010553892@qq.com> Date: Thu, 16 May 2024 20:25:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=9A=E8=BF=87=20base64=20=E4=BC=A0?= =?UTF-8?q?=E8=BE=93=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/provider/modelmgr/apis/chatcmpl.py | 15 +++++++++- pkg/utils/constants.py | 2 +- pkg/utils/image.py | 41 ++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 pkg/utils/image.py diff --git a/pkg/provider/modelmgr/apis/chatcmpl.py b/pkg/provider/modelmgr/apis/chatcmpl.py index c2bdf8c2..c2242a9a 100644 --- a/pkg/provider/modelmgr/apis/chatcmpl.py +++ b/pkg/provider/modelmgr/apis/chatcmpl.py @@ -3,16 +3,19 @@ from __future__ import annotations import asyncio import typing import json +import base64 from typing import AsyncGenerator import openai import openai.types.chat.chat_completion as chat_completion import httpx +import aiohttp from .. import api, entities, errors from ....core import entities as core_entities, app from ... import entities as llm_entities from ...tools import entities as tools_entities +from ....utils import image @api.requester_class("openai-chat-completions") @@ -91,7 +94,8 @@ class OpenAIChatCompletions(api.LLMAPIRequester): if 'content' in msg and isinstance(msg["content"], list): for me in msg["content"]: if me["type"] == "image_url": - me["image_url"]['url'] = await self.get_oss_url(me["image_url"]['url']) + # me["image_url"]['url'] = await self.get_oss_url(me["image_url"]['url']) + me["image_url"]['url'] = await self.get_base64_str(me["image_url"]['url']) args["messages"] = messages @@ -144,3 +148,12 @@ class OpenAIChatCompletions(api.LLMAPIRequester): self.cached_image_oss_url[original_url] = oss_url return oss_url + + async def get_base64_str( + self, + original_url: str, + ) -> str: + + base64_image = await image.qq_image_url_to_base64(original_url) + + return f"data:image/jpeg;base64,{base64_image}" diff --git a/pkg/utils/constants.py b/pkg/utils/constants.py index 0addd9f1..81ca04a3 100644 --- a/pkg/utils/constants.py +++ b/pkg/utils/constants.py @@ -1 +1 @@ -semantic_version = "v3.1.1" +semantic_version = "v3.2.0" diff --git a/pkg/utils/image.py b/pkg/utils/image.py new file mode 100644 index 00000000..34acc2f5 --- /dev/null +++ b/pkg/utils/image.py @@ -0,0 +1,41 @@ +import base64 +import typing +from urllib.parse import urlparse, parse_qs +import ssl + +import aiohttp + + +async def qq_image_url_to_base64( + image_url: str +) -> str: + """将QQ图片URL转为base64 + + Args: + image_url (str): QQ图片URL + + Returns: + str: base64编码 + """ + parsed = urlparse(image_url) + query = parse_qs(parsed.query) + + # Flatten the query dictionary + query = {k: v[0] for k, v in query.items()} + + ssl_context = ssl.create_default_context() + ssl_context.check_hostname = False + ssl_context.verify_mode = ssl.CERT_NONE + + async with aiohttp.ClientSession(trust_env=False) as session: + async with session.get( + f"http://{parsed.netloc}{parsed.path}", + params=query, + ssl=ssl_context + ) as resp: + resp.raise_for_status() # 检查HTTP错误 + file_bytes = await resp.read() + + base64_str = base64.b64encode(file_bytes).decode() + + return base64_str