Skip to content

插件命令开发

插件可以直接注册命令,将管理能力、运维操作和调试功能作为结构化命令暴露到命令中心,而不必把所有逻辑都做成沙盒方法。

适合做成命令的场景:

  • 管理员主动触发的操作
  • 需要明确权限边界的功能
  • 需要出现在命令中心并支持 WebUI 执行的能力
  • 需要结构化参数的指令

适合继续做成沙盒方法的场景:

  • 主要由 AI 在任务执行时自动调用
  • 不需要用户直接触发

基础写法

使用 plugin.mount_command(...) 注册命令:

python
from typing import Annotated

from nekro_agent.api.plugin import (
    NekroPlugin, CmdCtl, Arg,
    CommandPermission, CommandExecutionContext, CommandResponse,
)

plugin = NekroPlugin(
    name="示例插件",
    module_name="example_plugin",
    description="命令示例",
    version="0.1.0",
    author="your_name",
    url="https://example.com",
)

@plugin.mount_command(
    name="hello",
    description="返回一条问候语",
    aliases=["hi"],
    permission=CommandPermission.PUBLIC,
    usage="hello [name]",
    category="示例",
)
async def hello_command(
    context: CommandExecutionContext,
    name: Annotated[str, Arg("称呼对象", positional=True)] = "Nekro",
) -> CommandResponse:
    return CmdCtl.success(f"你好,{name}")

核心概念

CommandExecutionContext

命令执行上下文,区别于沙盒方法中的 AgentCtx。主要提供:

  • 当前命令来源的频道
  • 操作者身份与权限
  • 当前语言设置

CommandPermission

命令权限级别:

说明
PUBLIC所有用户可用
USER注册用户可用
ADVANCED高级用户可用
SUPER_USER超级管理员专用

破坏性或运维性质的命令建议至少限制到 ADVANCEDSUPER_USER

Arg

Arg 描述命令参数的语义,配合 Annotated 使用:

python
name: Annotated[str, Arg("称呼对象", positional=True)]

positional=True 表示该参数为位置参数,可以直接按顺序传入,无需写参数名。

用 CmdCtl 返回结果

方法说明
CmdCtl.success(msg)操作成功
CmdCtl.failed(msg)操作失败
CmdCtl.message(msg)中间消息(流式命令中使用)
CmdCtl.wait(msg)等待状态

流式命令

执行时间较长的命令可以使用 yield 持续输出中间状态:

python
@plugin.mount_command(
    name="rebuild",
    description="重建数据",
    permission=CommandPermission.SUPER_USER,
)
async def rebuild_command(context: CommandExecutionContext):
    yield CmdCtl.message("开始重建...")
    await do_step_one()
    yield CmdCtl.message("步骤一完成,继续处理...")
    await do_step_two()
    yield CmdCtl.success("重建完成")

流式命令适用于重建、扫描、批处理等耗时操作,输出结果可在命令中心的命令输出页实时查看。

命令组

多命令插件建议用命令组组织:

python
config_group = plugin.mount_command_group(
    name="config",
    description="配置管理",
    permission=CommandPermission.ADVANCED,
    category="配置",
)

@config_group.command(
    name="set",
    description="设置配置项",
    usage="config.set <key> <value>",
)
async def config_set(
    context: CommandExecutionContext,
    key: Annotated[str, Arg("配置键", positional=True)],
    value: Annotated[str, Arg("配置值", positional=True)],
):
    return CmdCtl.success(f"已设置 {key} = {value}")

命令组适合配置类、调试类、多子功能的插件。

与命令中心的关系

插件注册的命令会进入命令系统,在以下位置可见:

  • 命令管理页(查看、启用/禁用)
  • 命令输出页(实时查看执行结果)
  • WebUI 执行入口(直接触发,不经过聊天平台)

命令的描述、分类、权限和使用说明都会影响命令中心的展示质量,应认真填写。

相关文档