管理动作
有人在群里请人格对一个成员做管理操作,从这句话到 Discord 上真的动手,中间经过:模型判断是不是指令、模型挑动作和参数、本地按风险定门槛、查两边的权限、影响大的先确认、限速、动手前再查一遍、记审计。判断交给模型,护栏全在代码里。
前提
自然语言的管理、放歌请求要装着内置插件「对话指令」才会交给模型判断(3.7「内置插件」);没装,人格只聊天。人格自己还要在服务器里有对应的 Discord 权限(1.16)。
从一句话到一个动作
- 是不是指令(
src/aeria/instruction_judge.py):只有冲着人格说的话(私聊、@、叫名字、回复它、管理专线)才问一次模型:是不是在请它用机器人功能做事、属于哪几类(成员管理、消息、频道、身份组、音乐、机器人设置……)、是直接要求还是在商量。模型没给出判断(出错、超时、额度满),一律当成不是指令。 - 挑动作(
deepseek.parse_actions):只把那几类里的动作(actions/router.py的ACTION_DOMAINS)连同说明、所需权限、风险等级交给模型,让它挑动作、填参数、给出把握多大、是不是明确要求。一句话最多五个动作,挑了候选以外的丢掉。 - 对上人和东西(
actions/resolver.py):「他」「那个频道」「管理员身份组」落到具体的成员、频道、身份组、消息上;按编号或精确名字找,找不到、找到多个都不猜。改别人之前查身份组的上下级:不能动比自己高的人。 - 两个动作打架(
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 秒撤销窗口 |
加一个内置动作
actions/catalog.py的ACTION_SPECS加一条:名字、一句中文说明、要的 Discord 权限、风险等级(READ、REVERSIBLE、HARD_TO_REVERSE、STRUCTURAL、DESTRUCTIVE)、参数。模型看到的动作目录和执行器用的是这同一张表。actions/router.py把它放进一个或几个类别(ACTION_DOMAINS):模型只会在判断出这一类时看到它。actions/executor.py写处理函数并登记进handlers;参数解析用resolver.py里现成的。- 测:权限不够、把握不够、要确认的先确认、限速,各一条。
插件也能加动作:清单的 actions 里声明(名字必须以插件编号开头),context.register_action 登记处理函数(3.8、3.9)。插件的动作进同一张目录、走同一套护栏;插件停用时一起撤掉。
对应的代码
- 判断:
src/aeria/instruction_judge.py;挑动作:src/aeria/deepseek.py的parse_actions(提示词action_planner_messages)。 - 目录、类别、解析、冲突:
src/aeria/actions/catalog.py(124 个内置动作)、router.py、resolver.py、policy.py、intent.py。 - 执行:
src/aeria/actions/executor.py(required_confidence、ActionExecutor.execute);配置[management](planner_confidence= 0.84、reversible_confidence= 0.88、hard_confidence= 0.92、destructive_confidence= 0.95、dm_confidence_margin= 0.04、confirmation_ttl_seconds= 45、high_risk_max_actions= 3、high_risk_window_seconds= 60、undo_window_seconds= 60)。 - 插件动作:
src/aeria/plugins.py(PLUGIN_ACTION_HANDLERS、PLUGIN_ACTION_HINTS)。
没做到的
- 只在 Discord 上:QQ 的适配器会禁言、踢人,但自然语言的群管理还没接到 QQ 群。
- 「是不是指令」每次都要问一次模型:模型服务慢、额度满的时候,管理请求会被当成闲聊。
- 风险等级是动作写死的,不看对象:禁言一个新号和禁言管理员,门槛一样。