mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-09-01 23:27:14 +00:00
feat: 通过 base64 传输图片
This commit is contained in:
@@ -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 @@
|
|||||||
semantic_version = "v3.1.1"
|
semantic_version = "v3.2.0"
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user