mirror of
https://github.com/FuQuan233/nonebot-plugin-llmchat.git
synced 2026-02-05 11:38:05 +00:00
✨ 合并私聊指令,更新相关权限和状态管理
This commit is contained in:
parent
53f3f185e7
commit
1f41ed084e
1 changed files with 75 additions and 150 deletions
|
|
@ -22,7 +22,7 @@ from nonebot import (
|
||||||
require,
|
require,
|
||||||
)
|
)
|
||||||
from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message, MessageSegment, PrivateMessageEvent
|
from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message, MessageSegment, PrivateMessageEvent
|
||||||
from nonebot.adapters.onebot.v11.permission import GROUP_ADMIN, GROUP_OWNER
|
from nonebot.adapters.onebot.v11.permission import GROUP_ADMIN, GROUP_OWNER, PRIVATE
|
||||||
from nonebot.params import CommandArg
|
from nonebot.params import CommandArg
|
||||||
from nonebot.permission import SUPERUSER
|
from nonebot.permission import SUPERUSER
|
||||||
from nonebot.plugin import PluginMetadata
|
from nonebot.plugin import PluginMetadata
|
||||||
|
|
@ -377,12 +377,19 @@ async def process_messages(context_id: int, is_group: bool = True):
|
||||||
"- 代码则不需要分段,用单独的一条消息发送。",
|
"- 代码则不需要分段,用单独的一条消息发送。",
|
||||||
"- 请使用发送者的昵称称呼发送者,你可以礼貌地问候发送者,但只需要在"
|
"- 请使用发送者的昵称称呼发送者,你可以礼貌地问候发送者,但只需要在"
|
||||||
"第一次回答这位发送者的问题时问候他。",
|
"第一次回答这位发送者的问题时问候他。",
|
||||||
"- 你有at群成员的能力,只需要在某条消息中插入[CQ:at,qq=(QQ号)],"
|
|
||||||
"也就是CQ码。at发送者是非必要的,你可以根据你自己的想法at某个人。",
|
|
||||||
"- 你有引用某条消息的能力,使用[CQ:reply,id=(消息id)]来引用。",
|
"- 你有引用某条消息的能力,使用[CQ:reply,id=(消息id)]来引用。",
|
||||||
"- 如果有多条消息,你应该优先回复提到你的,一段时间之前的就不要回复了,也可以直接选择不回复。",
|
"- 如果有多条消息,你应该优先回复提到你的,一段时间之前的就不要回复了,也可以直接选择不回复。",
|
||||||
"- 如果你选择完全不回复,你只需要直接输出一个<botbr>。",
|
"- 如果你选择完全不回复,你只需要直接输出一个<botbr>。",
|
||||||
"- 如果你需要思考的话,你应该尽量少思考,以节省时间。",
|
"- 如果你需要思考的话,你应该尽量少思考,以节省时间。",
|
||||||
|
]
|
||||||
|
|
||||||
|
if is_group:
|
||||||
|
system_lines += [
|
||||||
|
"- 你有at群成员的能力,只需要在某条消息中插入[CQ:at,qq=(QQ号)],"
|
||||||
|
"也就是CQ码。at发送者是非必要的,你可以根据你自己的想法at某个人。",
|
||||||
|
]
|
||||||
|
|
||||||
|
system_lines += [
|
||||||
"下面是关于你性格的设定,如果设定中提到让你扮演某个人,或者设定中有提到名字,则优先使用设定中的名字。",
|
"下面是关于你性格的设定,如果设定中提到让你扮演某个人,或者设定中有提到名字,则优先使用设定中的名字。",
|
||||||
default_prompt,
|
default_prompt,
|
||||||
]
|
]
|
||||||
|
|
@ -439,7 +446,7 @@ async def process_messages(context_id: int, is_group: bool = True):
|
||||||
}
|
}
|
||||||
|
|
||||||
if preset.support_mcp:
|
if preset.support_mcp:
|
||||||
available_tools = await mcp_client.get_available_tools()
|
available_tools = await mcp_client.get_available_tools(is_group)
|
||||||
client_config["tools"] = available_tools
|
client_config["tools"] = available_tools
|
||||||
|
|
||||||
response = await client.chat.completions.create(
|
response = await client.chat.completions.create(
|
||||||
|
|
@ -471,25 +478,12 @@ async def process_messages(context_id: int, is_group: bool = True):
|
||||||
# 发送工具调用提示
|
# 发送工具调用提示
|
||||||
await handler.send(Message(f"正在使用{mcp_client.get_friendly_name(tool_name)}"))
|
await handler.send(Message(f"正在使用{mcp_client.get_friendly_name(tool_name)}"))
|
||||||
|
|
||||||
# 执行工具调用,传递群组和机器人信息用于QQ工具
|
result = await mcp_client.call_tool(
|
||||||
if is_group:
|
tool_name,
|
||||||
result = await mcp_client.call_tool(
|
tool_args,
|
||||||
tool_name,
|
group_id=event.group_id,
|
||||||
tool_args,
|
bot_id=str(event.self_id)
|
||||||
group_id=event.group_id,
|
)
|
||||||
bot_id=str(event.self_id)
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
# 私聊时某些工具不可用(如群操作工具),跳过这些工具
|
|
||||||
if tool_name.startswith("ob__"):
|
|
||||||
result = f"私聊不支持{mcp_client.get_friendly_name(tool_name)}工具"
|
|
||||||
else:
|
|
||||||
result = await mcp_client.call_tool(
|
|
||||||
tool_name,
|
|
||||||
tool_args,
|
|
||||||
group_id=None,
|
|
||||||
bot_id=str(event.self_id)
|
|
||||||
)
|
|
||||||
|
|
||||||
new_messages.append({
|
new_messages.append({
|
||||||
"role": "tool",
|
"role": "tool",
|
||||||
|
|
@ -576,22 +570,33 @@ preset_handler = on_command("API预设", priority=1, block=True, permission=SUPE
|
||||||
|
|
||||||
|
|
||||||
@preset_handler.handle()
|
@preset_handler.handle()
|
||||||
async def handle_preset(event: GroupMessageEvent, args: Message = CommandArg()):
|
async def handle_preset(event: GroupMessageEvent | PrivateMessageEvent, args: Message = CommandArg()):
|
||||||
group_id = event.group_id
|
if isinstance(event, GroupMessageEvent):
|
||||||
|
context_id = event.group_id
|
||||||
|
state = group_states[context_id]
|
||||||
|
else: # PrivateMessageEvent
|
||||||
|
if not plugin_config.enable_private_chat:
|
||||||
|
return
|
||||||
|
context_id = event.user_id
|
||||||
|
state = private_chat_states[context_id]
|
||||||
|
|
||||||
preset_name = args.extract_plain_text().strip()
|
preset_name = args.extract_plain_text().strip()
|
||||||
|
|
||||||
if preset_name == "off":
|
if preset_name == "off":
|
||||||
group_states[group_id].preset_name = preset_name
|
state.preset_name = preset_name
|
||||||
await preset_handler.finish("已关闭llmchat")
|
if isinstance(event, GroupMessageEvent):
|
||||||
|
await preset_handler.finish("已关闭llmchat群聊功能")
|
||||||
|
else:
|
||||||
|
await preset_handler.finish("已关闭llmchat私聊功能")
|
||||||
|
|
||||||
available_presets = {p.name for p in plugin_config.api_presets}
|
available_presets = {p.name for p in plugin_config.api_presets}
|
||||||
if preset_name not in available_presets:
|
if preset_name not in available_presets:
|
||||||
available_presets_str = "\n- ".join(available_presets)
|
available_presets_str = "\n- ".join(available_presets)
|
||||||
await preset_handler.finish(
|
await preset_handler.finish(
|
||||||
f"当前API预设:{group_states[group_id].preset_name}\n可用API预设:\n- {available_presets_str}"
|
f"当前API预设:{state.preset_name}\n可用API预设:\n- {available_presets_str}"
|
||||||
)
|
)
|
||||||
|
|
||||||
group_states[group_id].preset_name = preset_name
|
state.preset_name = preset_name
|
||||||
await preset_handler.finish(f"已切换至API预设:{preset_name}")
|
await preset_handler.finish(f"已切换至API预设:{preset_name}")
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -599,16 +604,23 @@ edit_preset_handler = on_command(
|
||||||
"修改设定",
|
"修改设定",
|
||||||
priority=1,
|
priority=1,
|
||||||
block=True,
|
block=True,
|
||||||
permission=(SUPERUSER | GROUP_ADMIN | GROUP_OWNER),
|
permission=(SUPERUSER | GROUP_ADMIN | GROUP_OWNER | PRIVATE),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@edit_preset_handler.handle()
|
@edit_preset_handler.handle()
|
||||||
async def handle_edit_preset(event: GroupMessageEvent, args: Message = CommandArg()):
|
async def handle_edit_preset(event: GroupMessageEvent | PrivateMessageEvent, args: Message = CommandArg()):
|
||||||
group_id = event.group_id
|
if isinstance(event, GroupMessageEvent):
|
||||||
group_prompt = args.extract_plain_text().strip()
|
context_id = event.group_id
|
||||||
|
state = group_states[context_id]
|
||||||
|
else: # PrivateMessageEvent
|
||||||
|
if not plugin_config.enable_private_chat:
|
||||||
|
return
|
||||||
|
context_id = event.user_id
|
||||||
|
state = private_chat_states[context_id]
|
||||||
|
|
||||||
group_states[group_id].group_prompt = group_prompt
|
group_prompt = args.extract_plain_text().strip()
|
||||||
|
state.group_prompt = group_prompt
|
||||||
await edit_preset_handler.finish("修改成功")
|
await edit_preset_handler.finish("修改成功")
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -616,16 +628,23 @@ reset_handler = on_command(
|
||||||
"记忆清除",
|
"记忆清除",
|
||||||
priority=1,
|
priority=1,
|
||||||
block=True,
|
block=True,
|
||||||
permission=(SUPERUSER | GROUP_ADMIN | GROUP_OWNER),
|
permission=(SUPERUSER | GROUP_ADMIN | GROUP_OWNER | PRIVATE),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@reset_handler.handle()
|
@reset_handler.handle()
|
||||||
async def handle_reset(event: GroupMessageEvent, args: Message = CommandArg()):
|
async def handle_reset(event: GroupMessageEvent | PrivateMessageEvent, args: Message = CommandArg()):
|
||||||
group_id = event.group_id
|
if isinstance(event, GroupMessageEvent):
|
||||||
|
context_id = event.group_id
|
||||||
|
state = group_states[context_id]
|
||||||
|
else: # PrivateMessageEvent
|
||||||
|
if not plugin_config.enable_private_chat:
|
||||||
|
return
|
||||||
|
context_id = event.user_id
|
||||||
|
state = private_chat_states[context_id]
|
||||||
|
|
||||||
group_states[group_id].past_events.clear()
|
state.past_events.clear()
|
||||||
group_states[group_id].history.clear()
|
state.history.clear()
|
||||||
await reset_handler.finish("记忆已清空")
|
await reset_handler.finish("记忆已清空")
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -639,32 +658,38 @@ set_prob_handler = on_command(
|
||||||
|
|
||||||
@set_prob_handler.handle()
|
@set_prob_handler.handle()
|
||||||
async def handle_set_prob(event: GroupMessageEvent, args: Message = CommandArg()):
|
async def handle_set_prob(event: GroupMessageEvent, args: Message = CommandArg()):
|
||||||
group_id = event.group_id
|
context_id = event.group_id
|
||||||
prob = 0
|
state = group_states[context_id]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
prob = float(args.extract_plain_text().strip())
|
prob = float(args.extract_plain_text().strip())
|
||||||
if prob < 0 or prob > 1:
|
if prob < 0 or prob > 1:
|
||||||
raise ValueError
|
raise ValueError("概率值必须在0-1之间")
|
||||||
except Exception as e:
|
except ValueError as e:
|
||||||
await reset_handler.finish(f"输入有误,请使用 [0,1] 的浮点数\n{e!s}")
|
await set_prob_handler.finish(f"输入有误,请使用 [0,1] 的浮点数\n{e!s}")
|
||||||
|
|
||||||
group_states[group_id].random_trigger_prob = prob
|
state.random_trigger_prob = prob
|
||||||
await reset_handler.finish(f"主动回复概率已设为 {prob}")
|
await set_prob_handler.finish(f"主动回复概率已设为 {prob}")
|
||||||
|
|
||||||
|
|
||||||
# 预设切换命令
|
# 思维输出切换命令
|
||||||
think_handler = on_command(
|
think_handler = on_command(
|
||||||
"切换思维输出",
|
"切换思维输出",
|
||||||
priority=1,
|
priority=1,
|
||||||
block=True,
|
block=True,
|
||||||
permission=(SUPERUSER | GROUP_ADMIN | GROUP_OWNER),
|
permission=(SUPERUSER | GROUP_ADMIN | GROUP_OWNER | PRIVATE),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@think_handler.handle()
|
@think_handler.handle()
|
||||||
async def handle_think(event: GroupMessageEvent, args: Message = CommandArg()):
|
async def handle_think(event: GroupMessageEvent | PrivateMessageEvent, args: Message = CommandArg()):
|
||||||
state = group_states[event.group_id]
|
if isinstance(event, GroupMessageEvent):
|
||||||
|
state = group_states[event.group_id]
|
||||||
|
else: # PrivateMessageEvent
|
||||||
|
if not plugin_config.enable_private_chat:
|
||||||
|
return
|
||||||
|
state = private_chat_states[event.user_id]
|
||||||
|
|
||||||
state.output_reasoning_content = not state.output_reasoning_content
|
state.output_reasoning_content = not state.output_reasoning_content
|
||||||
|
|
||||||
await think_handler.finish(
|
await think_handler.finish(
|
||||||
|
|
@ -672,106 +697,6 @@ async def handle_think(event: GroupMessageEvent, args: Message = CommandArg()):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# region 私聊相关指令
|
|
||||||
|
|
||||||
# 私聊预设切换命令
|
|
||||||
private_preset_handler = on_command(
|
|
||||||
"私聊API预设",
|
|
||||||
priority=1,
|
|
||||||
block=True,
|
|
||||||
permission=SUPERUSER,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@private_preset_handler.handle()
|
|
||||||
async def handle_private_preset(event: PrivateMessageEvent, args: Message = CommandArg()):
|
|
||||||
if not plugin_config.enable_private_chat:
|
|
||||||
await private_preset_handler.finish("私聊功能未启用")
|
|
||||||
|
|
||||||
user_id = event.user_id
|
|
||||||
preset_name = args.extract_plain_text().strip()
|
|
||||||
|
|
||||||
if preset_name == "off":
|
|
||||||
private_chat_states[user_id].preset_name = preset_name
|
|
||||||
await private_preset_handler.finish("已关闭llmchat私聊功能")
|
|
||||||
|
|
||||||
available_presets = {p.name for p in plugin_config.api_presets}
|
|
||||||
if preset_name not in available_presets:
|
|
||||||
available_presets_str = "\n- ".join(available_presets)
|
|
||||||
await private_preset_handler.finish(
|
|
||||||
f"当前API预设:{private_chat_states[user_id].preset_name}\n可用API预设:\n- {available_presets_str}"
|
|
||||||
)
|
|
||||||
|
|
||||||
private_chat_states[user_id].preset_name = preset_name
|
|
||||||
await private_preset_handler.finish(f"已切换至API预设:{preset_name}")
|
|
||||||
|
|
||||||
|
|
||||||
# 私聊设定修改命令
|
|
||||||
private_edit_preset_handler = on_command(
|
|
||||||
"私聊修改设定",
|
|
||||||
priority=1,
|
|
||||||
block=True,
|
|
||||||
permission=SUPERUSER,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@private_edit_preset_handler.handle()
|
|
||||||
async def handle_private_edit_preset(event: PrivateMessageEvent, args: Message = CommandArg()):
|
|
||||||
if not plugin_config.enable_private_chat:
|
|
||||||
await private_edit_preset_handler.finish("私聊功能未启用")
|
|
||||||
|
|
||||||
user_id = event.user_id
|
|
||||||
user_prompt = args.extract_plain_text().strip()
|
|
||||||
|
|
||||||
private_chat_states[user_id].group_prompt = user_prompt
|
|
||||||
await private_edit_preset_handler.finish("修改成功")
|
|
||||||
|
|
||||||
|
|
||||||
# 私聊记忆清除命令
|
|
||||||
private_reset_handler = on_command(
|
|
||||||
"私聊记忆清除",
|
|
||||||
priority=1,
|
|
||||||
block=True,
|
|
||||||
permission=SUPERUSER,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@private_reset_handler.handle()
|
|
||||||
async def handle_private_reset(event: PrivateMessageEvent, args: Message = CommandArg()):
|
|
||||||
if not plugin_config.enable_private_chat:
|
|
||||||
await private_reset_handler.finish("私聊功能未启用")
|
|
||||||
|
|
||||||
user_id = event.user_id
|
|
||||||
|
|
||||||
private_chat_states[user_id].past_events.clear()
|
|
||||||
private_chat_states[user_id].history.clear()
|
|
||||||
await private_reset_handler.finish("记忆已清空")
|
|
||||||
|
|
||||||
|
|
||||||
# 私聊思维输出切换命令
|
|
||||||
private_think_handler = on_command(
|
|
||||||
"私聊切换思维输出",
|
|
||||||
priority=1,
|
|
||||||
block=True,
|
|
||||||
permission=SUPERUSER,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@private_think_handler.handle()
|
|
||||||
async def handle_private_think(event: PrivateMessageEvent, args: Message = CommandArg()):
|
|
||||||
if not plugin_config.enable_private_chat:
|
|
||||||
await private_think_handler.finish("私聊功能未启用")
|
|
||||||
|
|
||||||
state = private_chat_states[event.user_id]
|
|
||||||
state.output_reasoning_content = not state.output_reasoning_content
|
|
||||||
|
|
||||||
await private_think_handler.finish(
|
|
||||||
f"已{(state.output_reasoning_content and '开启') or '关闭'}思维输出"
|
|
||||||
)
|
|
||||||
|
|
||||||
# endregion
|
|
||||||
|
|
||||||
|
|
||||||
# region 持久化与定时任务
|
# region 持久化与定时任务
|
||||||
|
|
||||||
# 获取插件数据目录
|
# 获取插件数据目录
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue