Aeria
GitHub
改 · 3.19

管理动作

最后核对 2026-10-08对应提交 db60e96依据 instruction_judge.py · deepseek.py · catalog.py · router.py · resolver.py · policy.py · executor.py · plugins.py · config.py

有人在群里请人格对一个成员做管理操作,从这句话到 Discord 上真的动手,中间经过:模型判断是不是指令、模型挑动作和参数、本地按风险定门槛、查两边的权限、影响大的先确认、限速、动手前再查一遍、记审计。判断交给模型,护栏全在代码里。

本页 6 节
  1. 前提
  2. 从一句话到一个动作
  3. 动手之前的护栏
  4. 加一个内置动作
  5. 对应的代码
  6. 没做到的

前提

自然语言的管理、放歌请求要装着内置插件「对话指令」才会交给模型判断(3.7「内置插件」);没装,人格只聊天。人格自己还要在服务器里有对应的 Discord 权限(1.16)。

从一句话到一个动作

  1. 是不是指令(src/aeria/instruction_judge.py):只有冲着人格说的话(私聊、@、叫名字、回复它、管理专线)才问一次模型:是不是在请它用机器人功能做事、属于哪几类(成员管理、消息、频道、身份组、音乐、机器人设置……)、是直接要求还是在商量。模型没给出判断(出错、超时、额度满),一律当成不是指令。
  2. 挑动作(deepseek.parse_actions):只把那几类里的动作(actions/router.py 的 ACTION_DOMAINS)连同说明、所需权限、风险等级交给模型,让它挑动作、填参数、给出把握多大、是不是明确要求。一句话最多五个动作,挑了候选以外的丢掉。
  3. 对上人和东西(actions/resolver.py):「他」「那个频道」「管理员身份组」落到具体的成员、频道、身份组、消息上;按编号或精确名字找,找不到、找到多个都不猜。改别人之前查身份组的上下级:不能动比自己高的人。
  4. 两个动作打架(actions/policy.py 的 detect_action_conflicts):同一个对象上互相矛盾的(一边加一边删、一边踢人一边改他、一边删频道一边改它),一个都不做,直接说出来。

动手之前的护栏

都在 actions/executor.py 的 ActionExecutor.execute 里,按顺序:

护栏 规矩
把握够不够 按风险定门槛:只读 0.84、可撤销 0.88、较难撤销 0.92、结构变更和破坏性的 0.95;私聊里发来的、不是只读的,再加 0.04。不够、或者不是明确要求,就不动
这个服务器开没开 每个服务器可以关掉某一项自然语言管理能力
权限 说话的人要有这项操作要的 Discord 权限,人格自己也要有;查不过记一条访问日志
查看敏感信息 看人物画像、记忆内部、决策记录这几项,只给服务器的所有者、有「管理员」权限的人,或者同时有「管理服务器」和「查看审计日志」的人
先确认 结构变更、破坏性的(删频道、封禁……)先问一句,45 秒内回「确认」才做
限速 较难撤销以上的操作,同一个人一分钟最多三次;名额在通过检查那一刻就占上,失败了还回去
动手前再查一遍 真正调用 Discord 之前,重新查一次权限和服务器开关(对象可能刚换了语音频道、权限可能刚被收回)
记下来 做成了的写管理审计(网页后台「管理审计」,配了审计频道的也发一条过去);能撤销的给 60 秒撤销窗口

加一个内置动作

  1. actions/catalog.py 的 ACTION_SPECS 加一条:名字、一句中文说明、要的 Discord 权限、风险等级(READ、REVERSIBLE、HARD_TO_REVERSE、STRUCTURAL、DESTRUCTIVE)、参数。模型看到的动作目录和执行器用的是这同一张表。
  2. actions/router.py 把它放进一个或几个类别(ACTION_DOMAINS):模型只会在判断出这一类时看到它。
  3. actions/executor.py 写处理函数并登记进 handlers;参数解析用 resolver.py 里现成的。
  4. 测:权限不够、把握不够、要确认的先确认、限速,各一条。

插件也能加动作:清单的 actions 里声明(名字必须以插件编号开头),context.register_action 登记处理函数(3.8、3.9)。插件的动作进同一张目录、走同一套护栏;插件停用时一起撤掉。

对应的代码

没做到的