feat: 通过 base64 传输图片

This commit is contained in:
RockChinQ
2024-05-16 20:25:51 +08:00
parent 2c478ccc25
commit 6bc6f77af1
3 changed files with 56 additions and 2 deletions
+14 -1
View File
@@ -3,16 +3,19 @@ from __future__ import annotations
import asyncio import asyncio
import typing import typing
import json import json
import base64
from typing import AsyncGenerator from typing import AsyncGenerator
import openai import openai
import openai.types.chat.chat_completion as chat_completion import openai.types.chat.chat_completion as chat_completion
import httpx import httpx
import aiohttp
from .. import api, entities, errors from .. import api, entities, errors
from ....core import entities as core_entities, app from ....core import entities as core_entities, app
from ... import entities as llm_entities from ... import entities as llm_entities
from ...tools import entities as tools_entities from ...tools import entities as tools_entities
from ....utils import image
@api.requester_class("openai-chat-completions") @api.requester_class("openai-chat-completions")
@@ -91,7 +94,8 @@ class OpenAIChatCompletions(api.LLMAPIRequester):
if 'content' in msg and isinstance(msg["content"], list): if 'content' in msg and isinstance(msg["content"], list):
for me in msg["content"]: for me in msg["content"]:
if me["type"] == "image_url": 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 args["messages"] = messages
@@ -144,3 +148,12 @@ class OpenAIChatCompletions(api.LLMAPIRequester):
self.cached_image_oss_url[original_url] = oss_url self.cached_image_oss_url[original_url] = oss_url
return 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}"
+1 -1
View File
@@ -1 +1 @@
semantic_version = "v3.1.1" semantic_version = "v3.2.0"
+41
View File
@@ -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