53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
from io import BytesIO
|
|
import base64
|
|
import re
|
|
from loguru import logger
|
|
from nonebot import on_message
|
|
from nonebot.rule import Rule
|
|
|
|
from konabot.common.apis.ali_content_safety import AlibabaGreen
|
|
from konabot.common.llm import get_llm
|
|
from konabot.common.longtask import DepLongTaskTarget
|
|
from konabot.common.nb.extract_image import DepPILImage
|
|
from konabot.common.nb.match_keyword import match_keyword
|
|
|
|
|
|
cmd = on_message(rule=Rule(match_keyword(re.compile(r"^千问识图\s*$"))))
|
|
|
|
|
|
@cmd.handle()
|
|
async def _(img: DepPILImage, target: DepLongTaskTarget):
|
|
if 1:
|
|
return #TODO:这里还没写完,还有 Bug 要修
|
|
jpeg_data = BytesIO()
|
|
if img.width > 2160:
|
|
img = img.resize((2160, img.height * 2160 // img.width))
|
|
if img.height > 2160:
|
|
img = img.resize((img.width * 2160 // img.height, 2160))
|
|
img = img.convert("RGB")
|
|
img.save(jpeg_data, format="jpeg", optimize=True, quality=85)
|
|
data_url = "data:image/jpeg;base64,"
|
|
data_url += base64.b64encode(jpeg_data.getvalue()).decode('ascii')
|
|
|
|
llm = get_llm("qwen3-vl-plus")
|
|
res = await llm.chat([
|
|
{ "role": "user", "content": [
|
|
{ "type": "image_url", "image_url": {
|
|
"url": data_url
|
|
} },
|
|
{ "type": "text", "text": "请你提取这张图片中的所有文字,并尽量按照原图的排版输出,不需要其他内容" },
|
|
] }
|
|
])
|
|
result = res.content
|
|
logger.info(res)
|
|
if result is None:
|
|
await target.send_message("提取失败:可能存在网络异常")
|
|
return
|
|
|
|
if not await AlibabaGreen.detect(result):
|
|
await target.send_message("提取失败:图片中可能存在一些不合适的内容")
|
|
return
|
|
|
|
await target.send_message(result, at=False)
|
|
|