Merge branch 'dev' of https://github.com/Fairy-Oracle-Sanctuary/NeoBot into dev
This commit is contained in:
@@ -433,10 +433,17 @@ def require_admin(func):
|
|||||||
"""
|
"""
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
from neobot.models.events.message import MessageEvent
|
from neobot.models.events.message import MessageEvent
|
||||||
|
<<<<<<< HEAD
|
||||||
from neobot.core.managers import permission_manager
|
from neobot.core.managers import permission_manager
|
||||||
|
|
||||||
@wraps(func)
|
@wraps(func)
|
||||||
async def wrapper(event: MessageEvent, *args, **kwargs):
|
async def wrapper(event: MessageEvent, *args, **kwargs):
|
||||||
|
=======
|
||||||
|
|
||||||
|
@wraps(func)
|
||||||
|
async def wrapper(event: MessageEvent, *args, **kwargs):
|
||||||
|
from neobot.core.managers import permission_manager
|
||||||
|
>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc
|
||||||
pm = permission_manager
|
pm = permission_manager
|
||||||
if not await pm.is_admin(event.user_id):
|
if not await pm.is_admin(event.user_id):
|
||||||
await event.reply("此命令仅限管理员使用")
|
await event.reply("此命令仅限管理员使用")
|
||||||
|
|||||||
@@ -62,12 +62,17 @@ class PluginManager(Singleton):
|
|||||||
扫描并加载 `plugins` 目录下的所有插件。
|
扫描并加载 `plugins` 目录下的所有插件。
|
||||||
"""
|
"""
|
||||||
# 使用 pathlib 获取更可靠的路径
|
# 使用 pathlib 获取更可靠的路径
|
||||||
|
<<<<<<< HEAD
|
||||||
# 当前文件:core/managers/plugin_manager.py
|
# 当前文件:core/managers/plugin_manager.py
|
||||||
# 目标:neobot/plugins/
|
# 目标:neobot/plugins/
|
||||||
|
=======
|
||||||
|
# 当前文件:src/neobot/core/managers/plugin_manager.py
|
||||||
|
# 目标:src/neobot/plugins/
|
||||||
|
>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc
|
||||||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||||||
# 回退两级到项目根目录 (core/managers -> core -> root)
|
# 回退三级到项目根目录 (core/managers -> core -> neobot -> src)
|
||||||
root_dir = os.path.dirname(os.path.dirname(current_dir))
|
root_dir = os.path.dirname(os.path.dirname(os.path.dirname(current_dir)))
|
||||||
plugin_dir = os.path.join(root_dir, "plugins")
|
plugin_dir = os.path.join(root_dir, "src", "neobot", "plugins")
|
||||||
|
|
||||||
# 使用完整的包名:neobot.plugins
|
# 使用完整的包名:neobot.plugins
|
||||||
package_name = "neobot.plugins"
|
package_name = "neobot.plugins"
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ AI 聊天插件,支持向量数据库记忆功能
|
|||||||
"""
|
"""
|
||||||
import time
|
import time
|
||||||
import uuid
|
import uuid
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
<<<<<<< HEAD:src/neobot/plugins/ai_chat.py
|
||||||
|
>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc
|
||||||
import os
|
import os
|
||||||
import base64
|
import base64
|
||||||
from neobot.core.managers.command_manager import matcher
|
from neobot.core.managers.command_manager import matcher
|
||||||
@@ -12,6 +16,19 @@ from neobot.core.managers.vectordb_manager import vectordb_manager
|
|||||||
from neobot.core.managers.image_manager import image_manager
|
from neobot.core.managers.image_manager import image_manager
|
||||||
from neobot.core.utils.logger import ModuleLogger
|
from neobot.core.utils.logger import ModuleLogger
|
||||||
from neobot.core.config_loader import global_config
|
from neobot.core.config_loader import global_config
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
=======
|
||||||
|
import markdown
|
||||||
|
from core.managers.command_manager import matcher
|
||||||
|
from models.events.message import GroupMessageEvent, PrivateMessageEvent
|
||||||
|
from models.message import MessageSegment
|
||||||
|
from core.managers.vectordb_manager import vectordb_manager
|
||||||
|
from core.managers.image_manager import image_manager
|
||||||
|
from core.utils.logger import ModuleLogger
|
||||||
|
from core.config_loader import global_config
|
||||||
|
>>>>>>> origin/main:plugins/ai_chat.py
|
||||||
|
>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc
|
||||||
|
|
||||||
logger = ModuleLogger("AIChat")
|
logger = ModuleLogger("AIChat")
|
||||||
|
|
||||||
@@ -32,6 +49,13 @@ async def get_ai_response(user_id: int, group_id: int, user_message: str) -> str
|
|||||||
if not OPENAI_AVAILABLE:
|
if not OPENAI_AVAILABLE:
|
||||||
return "请先安装 openai 库: pip install openai"
|
return "请先安装 openai 库: pip install openai"
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
<<<<<<< HEAD:src/neobot/plugins/ai_chat.py
|
||||||
|
=======
|
||||||
|
# 从配置中获取 DeepSeek API 配置(复用跨平台插件的配置或全局配置)
|
||||||
|
>>>>>>> origin/main:plugins/ai_chat.py
|
||||||
|
>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc
|
||||||
api_key = getattr(global_config.cross_platform, 'deepseek_api_key', None) or "sk-f71322a9fbba4b05a7df969cb4004f06"
|
api_key = getattr(global_config.cross_platform, 'deepseek_api_key', None) or "sk-f71322a9fbba4b05a7df969cb4004f06"
|
||||||
api_url = getattr(global_config.cross_platform, 'deepseek_api_url', "https://api.deepseek.com/v1")
|
api_url = getattr(global_config.cross_platform, 'deepseek_api_url', "https://api.deepseek.com/v1")
|
||||||
model = getattr(global_config.cross_platform, 'deepseek_model', "deepseek-chat")
|
model = getattr(global_config.cross_platform, 'deepseek_model', "deepseek-chat")
|
||||||
@@ -138,10 +162,15 @@ async def chat_command(event: GroupMessageEvent | PrivateMessageEvent, args: lis
|
|||||||
user_message = " ".join(args)
|
user_message = " ".join(args)
|
||||||
user_id = event.user_id
|
user_id = event.user_id
|
||||||
group_id = getattr(event, 'group_id', 0)
|
group_id = getattr(event, 'group_id', 0)
|
||||||
|
user_name = event.sender.nickname or event.sender.card or str(user_id)
|
||||||
|
|
||||||
await event.reply("正在思考中...")
|
await event.reply("正在思考中...")
|
||||||
reply = await get_ai_response(user_id, group_id, user_message)
|
reply = await get_ai_response(user_id, group_id, user_message)
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
<<<<<<< HEAD:src/neobot/plugins/ai_chat.py
|
||||||
|
>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc
|
||||||
try:
|
try:
|
||||||
image_base64 = await generate_chat_image_base64(
|
image_base64 = await generate_chat_image_base64(
|
||||||
user_name=str(event.user_id),
|
user_name=str(event.user_id),
|
||||||
@@ -157,3 +186,38 @@ async def chat_command(event: GroupMessageEvent | PrivateMessageEvent, args: lis
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"生成聊天图片失败: {e}")
|
logger.error(f"生成聊天图片失败: {e}")
|
||||||
await event.reply(reply)
|
await event.reply(reply)
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
=======
|
||||||
|
# 将 Markdown 转换为 HTML
|
||||||
|
try:
|
||||||
|
# 启用扩展以支持代码块、表格等
|
||||||
|
html_reply = markdown.markdown(reply, extensions=['fenced_code', 'tables', 'nl2br'])
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Markdown 转换失败: {e}")
|
||||||
|
html_reply = reply.replace('\n', '<br>')
|
||||||
|
|
||||||
|
# 渲染图片
|
||||||
|
try:
|
||||||
|
template_data = {
|
||||||
|
"user_name": user_name,
|
||||||
|
"user_message": user_message,
|
||||||
|
"ai_reply": html_reply
|
||||||
|
}
|
||||||
|
|
||||||
|
base64_img = await image_manager.render_template_to_base64(
|
||||||
|
template_name="ai_chat.html",
|
||||||
|
data=template_data,
|
||||||
|
output_name=f"chat_{user_id}_{int(time.time())}.png",
|
||||||
|
image_type="png"
|
||||||
|
)
|
||||||
|
|
||||||
|
if base64_img:
|
||||||
|
await event.reply(MessageSegment.image(f"base64://{base64_img}"))
|
||||||
|
else:
|
||||||
|
await event.reply("图片生成失败,返回文本:\n" + reply)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"渲染聊天图片失败: {e}")
|
||||||
|
await event.reply("图片生成失败,返回文本:\n" + reply)
|
||||||
|
>>>>>>> origin/main:plugins/ai_chat.py
|
||||||
|
>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc
|
||||||
|
|||||||
@@ -17,7 +17,15 @@ class CrossPlatformConfig:
|
|||||||
self.ENABLE_CROSS_PLATFORM = True
|
self.ENABLE_CROSS_PLATFORM = True
|
||||||
|
|
||||||
# DeepSeek API 配置 - 从环境变量或配置文件加载
|
# DeepSeek API 配置 - 从环境变量或配置文件加载
|
||||||
|
<<<<<<< HEAD
|
||||||
self.DEEPSEEK_API_KEY = os.environ.get("DEEPSEEK_API_KEY", "sk-28b794e08e184f868d6c0107a46e0c3e")
|
self.DEEPSEEK_API_KEY = os.environ.get("DEEPSEEK_API_KEY", "sk-28b794e08e184f868d6c0107a46e0c3e")
|
||||||
|
=======
|
||||||
|
<<<<<<< HEAD:src/neobot/plugins/discord-cross/config.py
|
||||||
|
self.DEEPSEEK_API_KEY = os.environ.get("DEEPSEEK_API_KEY", "sk-28b794e08e184f868d6c0107a46e0c3e")
|
||||||
|
=======
|
||||||
|
self.DEEPSEEK_API_KEY = os.environ.get("DEEPSEEK_API_KEY", "sk-f71322a9fbba4b05a7df969cb4004f06")
|
||||||
|
>>>>>>> origin/main:plugins/discord-cross/config.py
|
||||||
|
>>>>>>> eb9079744c82f8e254de084a3a089ef91c37e9dc
|
||||||
self.DEEPSEEK_API_URL = os.environ.get("DEEPSEEK_API_URL", "https://api.deepseek.com/v1/chat/completions")
|
self.DEEPSEEK_API_URL = os.environ.get("DEEPSEEK_API_URL", "https://api.deepseek.com/v1/chat/completions")
|
||||||
self.DEEPSEEK_MODEL = os.environ.get("DEEPSEEK_MODEL", "deepseek-chat")
|
self.DEEPSEEK_MODEL = os.environ.get("DEEPSEEK_MODEL", "deepseek-chat")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user