mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-14 21:52:56 +08:00
* ✨ feat(llm): 增强LLM服务,支持图片生成、响应验证与OpenRouter集成 - 【新功能】统一图片生成与编辑API `create_image`,支持文生图、图生图及多图输入 - 【新功能】引入LLM响应验证机制,通过 `validation_policy` 和 `response_validator` 确保响应内容符合预期,例如强制返回图片 - 【新功能】适配OpenRouter API,扩展LLM服务提供商支持,并添加OpenRouter特定请求头 - 【重构】将日志净化逻辑重构至 `log_sanitizer` 模块,提供统一的净化入口,并应用于NoneBot消息、LLM请求/响应日志 - 【修复】优化Gemini适配器,正确解析图片生成响应中的Base64图片数据,并更新模型能力注册表 * ✨ feat(image): 优化图片生成响应并返回完整LLMResponse * ✨ feat(llm): 为 OpenAI 兼容请求体添加日志净化 * 🐛 fix(ui): 截断UI调试HTML日志中的长base64图片数据 --------- Co-authored-by: webjoin111 <455457521@qq.com>
89 lines
2.8 KiB
Python
89 lines
2.8 KiB
Python
from typing import Any
|
||
|
||
from nonebot.adapters import Bot, Message
|
||
|
||
from zhenxun.configs.config import Config
|
||
from zhenxun.models.bot_message_store import BotMessageStore
|
||
from zhenxun.services.log import logger
|
||
from zhenxun.utils.enum import BotSentType
|
||
from zhenxun.utils.log_sanitizer import sanitize_for_logging
|
||
from zhenxun.utils.manager.message_manager import MessageManager
|
||
from zhenxun.utils.platform import PlatformUtils
|
||
|
||
LOG_COMMAND = "MessageHook"
|
||
|
||
|
||
def replace_message(message: Message) -> str:
|
||
"""将消息中的at、image、record、face替换为字符串
|
||
|
||
参数:
|
||
message: Message
|
||
|
||
返回:
|
||
str: 文本消息
|
||
"""
|
||
result = ""
|
||
for msg in message:
|
||
if isinstance(msg, str):
|
||
result += msg
|
||
elif msg.type == "at":
|
||
result += f"@{msg.data['qq']}"
|
||
elif msg.type == "image":
|
||
result += "[image]"
|
||
elif msg.type == "record":
|
||
result += "[record]"
|
||
elif msg.type == "face":
|
||
result += f"[face:{msg.data['id']}]"
|
||
elif msg.type == "reply":
|
||
result += ""
|
||
else:
|
||
result += str(msg)
|
||
return result
|
||
|
||
|
||
@Bot.on_called_api
|
||
async def handle_api_result(
|
||
bot: Bot, exception: Exception | None, api: str, data: dict[str, Any], result: Any
|
||
):
|
||
if exception or api != "send_msg":
|
||
return
|
||
user_id = data.get("user_id")
|
||
group_id = data.get("group_id")
|
||
message_id = result.get("message_id")
|
||
message: Message = data.get("message", "")
|
||
message_type = data.get("message_type")
|
||
try:
|
||
if user_id and message_id:
|
||
MessageManager.add(str(user_id), str(message_id))
|
||
logger.debug(
|
||
f"收集消息id,user_id: {user_id}, msg_id: {message_id}", LOG_COMMAND
|
||
)
|
||
except Exception as e:
|
||
logger.warning(
|
||
f"收集消息id发生错误...data: {data}, result: {result}", LOG_COMMAND, e=e
|
||
)
|
||
if not Config.get_config("hook", "RECORD_BOT_SENT_MESSAGES"):
|
||
return
|
||
try:
|
||
await BotMessageStore.create(
|
||
bot_id=bot.self_id,
|
||
user_id=user_id,
|
||
group_id=group_id,
|
||
sent_type=BotSentType.GROUP
|
||
if message_type == "group"
|
||
else BotSentType.PRIVATE,
|
||
text=replace_message(message),
|
||
plain_text=message.extract_plain_text()
|
||
if isinstance(message, Message)
|
||
else replace_message(message),
|
||
platform=PlatformUtils.get_platform(bot),
|
||
)
|
||
sanitized_message = sanitize_for_logging(message, context="nonebot_message")
|
||
logger.debug(f"消息发送记录,message: {sanitized_message}")
|
||
except Exception as e:
|
||
logger.warning(
|
||
f"消息发送记录发生错误...data: {data}, result: {result}",
|
||
LOG_COMMAND,
|
||
e=e,
|
||
)
|