mirror of
https://github.com/FuQuan233/nonebot-plugin-llmchat.git
synced 2026-08-13 10:09:27 +00:00
112 lines
4.5 KiB
Python
112 lines
4.5 KiB
Python
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}思维输出")
|