mirror of
https://github.com/FuQuan233/nonebot-plugin-llmchat.git
synced 2026-08-13 10:09:27 +00:00
♻️ 大幅重构,拆分模块,增加一些MCP相关限制
This commit is contained in:
parent
41e6aeacb9
commit
0d6771eca6
17 changed files with 1142 additions and 912 deletions
112
nonebot_plugin_llmchat/commands.py
Normal file
112
nonebot_plugin_llmchat/commands.py
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
from nonebot import on_command
|
||||
from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message, PrivateMessageEvent
|
||||
from nonebot.adapters.onebot.v11.permission import GROUP_ADMIN, GROUP_OWNER, PRIVATE
|
||||
from nonebot.params import CommandArg
|
||||
from nonebot.permission import SUPERUSER
|
||||
|
||||
from .config import ScopedConfig
|
||||
from .state import ChatState, StateStore
|
||||
|
||||
|
||||
def _event_state(config: ScopedConfig, states: StateStore, event) -> ChatState | None:
|
||||
if isinstance(event, GroupMessageEvent):
|
||||
return states.group_states[event.group_id]
|
||||
if config.enable_private_chat:
|
||||
return states.private_states[event.user_id]
|
||||
return None
|
||||
|
||||
|
||||
def register_commands(config: ScopedConfig, states: StateStore) -> None:
|
||||
preset_handler = on_command("API预设", priority=1, block=True, permission=SUPERUSER)
|
||||
|
||||
@preset_handler.handle()
|
||||
async def handle_preset(event: GroupMessageEvent | PrivateMessageEvent, args: Message = CommandArg()):
|
||||
text = args.extract_plain_text().strip()
|
||||
parts = text.split(maxsplit=1)
|
||||
target_id: int | None = None
|
||||
is_group_target = isinstance(event, GroupMessageEvent)
|
||||
state = _event_state(config, states, event)
|
||||
if state is None:
|
||||
return
|
||||
preset_name = text
|
||||
if isinstance(event, PrivateMessageEvent) and parts and parts[0].isdigit():
|
||||
target_id = int(parts[0])
|
||||
is_group_target = target_id in states.group_states
|
||||
state = states.get(target_id, is_group_target)
|
||||
preset_name = parts[1] if len(parts) > 1 else ""
|
||||
|
||||
available = {preset.name for preset in config.api_presets}
|
||||
if not preset_name or preset_name not in available | {"off"}:
|
||||
names = "\n- ".join(sorted(available))
|
||||
await preset_handler.finish(f"当前API预设:{state.preset_name}\n可用API预设:\n- {names}")
|
||||
state.preset_name = preset_name
|
||||
if target_id is not None:
|
||||
kind = "群聊" if is_group_target else "私聊"
|
||||
await preset_handler.finish(f"已将 {kind} {target_id} 切换至API预设:{preset_name}")
|
||||
await preset_handler.finish(f"已切换至API预设:{preset_name}")
|
||||
|
||||
edit_handler = on_command(
|
||||
"修改设定",
|
||||
priority=1,
|
||||
block=True,
|
||||
permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER | PRIVATE,
|
||||
)
|
||||
|
||||
@edit_handler.handle()
|
||||
async def handle_edit(event: GroupMessageEvent | PrivateMessageEvent, args: Message = CommandArg()):
|
||||
state = _event_state(config, states, event)
|
||||
if state is None:
|
||||
return
|
||||
state.prompt = args.extract_plain_text().strip()
|
||||
await edit_handler.finish("修改成功")
|
||||
|
||||
reset_handler = on_command(
|
||||
"记忆清除",
|
||||
priority=1,
|
||||
block=True,
|
||||
permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER | PRIVATE,
|
||||
)
|
||||
|
||||
@reset_handler.handle()
|
||||
async def handle_reset(event: GroupMessageEvent | PrivateMessageEvent):
|
||||
state = _event_state(config, states, event)
|
||||
if state is None:
|
||||
return
|
||||
state.pending_events.clear()
|
||||
state.history.clear()
|
||||
await reset_handler.finish("记忆已清空")
|
||||
|
||||
probability_handler = on_command(
|
||||
"设置主动回复概率",
|
||||
priority=1,
|
||||
block=True,
|
||||
permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER,
|
||||
)
|
||||
|
||||
@probability_handler.handle()
|
||||
async def handle_probability(event: GroupMessageEvent, args: Message = CommandArg()):
|
||||
try:
|
||||
probability = float(args.extract_plain_text().strip())
|
||||
if not 0 <= probability <= 1:
|
||||
raise ValueError("概率必须在0到1之间")
|
||||
except ValueError as error:
|
||||
await probability_handler.finish(f"输入有误,请使用 [0,1] 的浮点数\n{error!s}")
|
||||
return
|
||||
states.group_states[event.group_id].random_trigger_prob = probability
|
||||
await probability_handler.finish(f"主动回复概率已设为 {probability}")
|
||||
|
||||
think_handler = on_command(
|
||||
"切换思维输出",
|
||||
priority=1,
|
||||
block=True,
|
||||
permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER | PRIVATE,
|
||||
)
|
||||
|
||||
@think_handler.handle()
|
||||
async def handle_think(event: GroupMessageEvent | PrivateMessageEvent):
|
||||
state = _event_state(config, states, event)
|
||||
if state is None:
|
||||
return
|
||||
state.output_reasoning_content = not state.output_reasoning_content
|
||||
status = "开启" if state.output_reasoning_content else "关闭"
|
||||
await think_handler.finish(f"已{status}思维输出")
|
||||
Loading…
Add table
Add a link
Reference in a new issue