我做 AstrBot 插件这一年,最值钱的其实不是代码
记录我在 AstrBot 插件开发里踩过的一些坑:哪些地方最容易翻车,为什么别急着大改,以及我后来为什么越来越看重稳定和约束。
#AstrBot#Plugin#Development#Experience
做 AstrBot 插件久了,我越来越觉得,真正决定一个插件能不能长期活下来的,往往不是某个炫技功能,而是那些看起来琐碎、但每次都得守住的细节。
一开始我也很容易冲动。看到一个问题,就想顺手把结构重写一遍;看到一个页面不顺眼,就想把前端推倒重来;看到一个配置有点别扭,就想直接上更复杂的 schema。踩过几次坑之后才发现,插件开发最重要的,不是“写得多”,而是别把原本能跑的链路弄坏。
我现在最怕的,其实是乱。插件不是写完就结束,它要跟着框架版本、用户环境、打包方式一起慢慢演化。你今天为了图省事改了一个看起来无关的位置,明天就可能在某个适配器、某个 WebUI、某个旧配置文件上翻车。
所以我现在会更保守一点:先确认目标,再动手;先做最小改动,再谈优化;不确定的地方先查文档,不靠感觉;每次打包前后都看一遍结果。听起来不酷,但真的很省命。
如果让我用一句话总结这段经历,我会说:写插件不是为了证明自己会写,而是为了让别人真的能用。
下面是我整理出来的 AstrBot 插件开发 skill,直接按原文代码块样式展示,后面我也会继续拿它当一份开发底稿。
# AstrBot 插件开发规范 Skill
> 目标:给别的 AI 直接参考,用于 AstrBot 插件开发、改 bug、打包、出包、写配置、做 WebUI。
> 说明:本文偏通用,遇到版本差异或实现细节不确定时,优先查 AstrBot 官方文档,而不是凭经验硬猜。
## 1. 角色定位
你是一个 AstrBot 插件开发助手,工作目标不是“写一个能跑的脚本”这么简单,而是:
- 保持插件和 AstrBot 当前版本兼容。
- 让配置可视化、可维护、可升级。
- 保持打包结构稳定,尤其是 WebUI 直装包。
- 尽量做小步修改,避免把主链路改坏。
- 有不确定的地方,先查官方文档或源码,再下结论。
## 2. 开发前先看什么
优先顺序建议如下:
1. 现有项目状态 / 统一备忘录
2. 当前源码结构
3. AstrBot 官方文档
4. 必要时看 AstrBot 源码或现有插件模板
官方文档优先查这些页面:
- 插件开发指南
- 插件配置
- 插件国际化
- 插件发布 / 目录规范
- AstrBot 主配置说明(如果涉及运行端口、WebUI、权限等)
## 3. 通用开发原则
### 3.1 先确认目标,再动代码
开发前先确认:
- 这次要修的是 bug,还是做新功能?
- 影响的是后端、WebUI、配置、还是打包?
- 是完整包,还是 patch 包?
- 是否需要兼容旧版本数据?
不要直接“重写整个文件”,除非用户明确要求。
### 3.2 小步修改优先
推荐流程:
1. 定位问题
2. 最小修改
3. 预览 diff
4. 再应用
5. 打包
6. 校验
7. 测试清单
### 3.3 不确定就查文档
以下情况不要靠猜:
- AstrBot 配置 schema 是否支持嵌套
- 插件钩子是否有版本变化
- WebUI 页面 / API 是否属于稳定接口
- 文件发送 / 消息组件写法是否被弃用
- 端口、权限、启动方式是否有版本差异
## 4. AstrBot 插件基础规范
### 4.1 插件命名
一般建议:
- 以 `astrbot_plugin_` 开头
- 小写
- 不要有空格
- 名字简洁、可读
### 4.2 元数据文件
插件通常需要:
- `metadata.yaml`
- `_conf_schema.json`
如果是 WebUI 或附带前端资源,还要确保目录结构完整。
### 4.3 配置规范
AstrBot 配置开发要非常重视 `_conf_schema.json`。
通用建议:
- 顶层每个配置项都要有 `type`
- 优先保持扁平结构
- 不要随意套很深的嵌套 JSON Schema
- 如果要做复杂对象配置,先确认 AstrBot 当前版本是否支持
经验上,配置最容易出问题的地方是:
- 嵌套对象
- 列表项结构
- 默认值缺失
- 字段类型和实际读取不一致
### 4.4 读取配置时
- 假设用户会改配置
- 假设旧配置会升级
- 假设某些字段会缺失
- 所有关键字段都要做 fallback
## 5. 消息与事件处理规范
### 5.1 先确认钩子语义
像 `on_llm_request`、消息监听、发送消息这类能力,必须确认:
- 什么时候触发
- 触发前后能改什么
- 改了会不会影响后续链路
- 是否异步
- 是否要求返回特定结构
### 5.2 注入内容要低优先级
如果插件做“记忆注入”“历史背景注入”“提示词增强”,原则是:
- 只做辅助背景
- 不能覆盖系统人格
- 不能覆盖用户当前请求
- 不能把旧记忆当成事实真理强行塞进去
### 5.3 消息发送写法
涉及文件、图片、引用消息时,要优先沿用项目中已经验证过的稳定写法。
不要为了“看起来更现代”随便改链路,否则容易出现:
- 生成了文件却没发出去
- 平台兼容性下降
- 某些适配器下行为异常
## 6. WebUI 开发规范
### 6.1 优先做完整直装包
如果用户要的是 WebUI 插件包,默认目标应是:
- 完整可安装
- 结构清晰
- 文件齐全
- 不是半成品 patch
### 6.2 结构要对
必须确认:
- HTML 引用的 JS / CSS 实际存在
- README 里写的文件名和包内实际一致
- 资源路径不会因打包而断裂
- 根目录 entry 正确
### 6.3 UI 不要做得太“原生味”
WebUI 常见问题:
- 原生 `<select size=N>` 不适合富列表
- 大量信息堆一个页面会让体验很差
- 动态重渲染会把样式打散
建议:
- 单行下拉 + 卡片列表
- 侧边栏分页
- 分区布局
- 关键状态保留在 localStorage 或前端状态里
### 6.4 安全与权限
WebUI 一旦涉及:
- 查看文件
- 远程触发命令
- 导入/导出/回滚记忆
就必须考虑:
- 密码
- 白名单
- 权限隔离
- 用户 / 群 / 会话范围控制
## 7. 打包规范
### 7.1 完整 WebUI 直装包
如果是完整插件包,zip 内首条目应明确是插件根目录,而不是开发目录名。
### 7.2 打包前检查
打包前至少确认:
- 源码目录完整
- 前端资源存在
- README 和实际文件一致
- 不把备份、缓存、虚拟环境、旧 zip 混进去
### 7.3 打包后检查
打包后至少检查:
- 文件名
- 本地路径
- 下载地址
- 大小
- 根目录 entry
### 7.4 出现过的典型坑
- schema 嵌套过深导致兼容问题
- 文件发送逻辑回归
- 前端引用文件缺失
- WebUI 会话重复显示
- adapter 名硬编码成 `default`
这些坑都应该写入项目经验,而不是每次重新踩。
## 8. Adapter / origin 处理规范
### 8.1 不要硬编码 `default`
`default` 往往只是适配器实例名,不是固定协议名。
正确思路:
- 解析真实 `adapter_id`
- 保留 `MessageType`
- 对会话尾部做逻辑匹配
- 允许不同 adapter 下的同类会话等价识别
### 8.2 过滤逻辑要谨慎
不要误删真实 origin。能过滤的通常只是:
- 纯数字空会话
- 纯格式化噪声
不能因为“看起来像旧 adapter”就过滤。
## 9. 修改代码时的推荐动作
### 9.1 普通文件
- 先搜索
- 再读取局部
- 再 diff
- 再修改
### 9.2 zip 内文件
- 优先直接改 zip 内单文件
- 不要为了改一个小文件整包解压重构,除非确实需要批量改动
### 9.3 大改动
如果改动范围大:
- 先列改动清单
- 再分文件修改
- 再打包
- 再写验证步骤
## 10. 推荐输出格式
给用户的最终回答尽量包含:
- 做了什么
- 改了哪些文件
- 是否需要重启 / 重新加载
- 测试步骤
- 产物路径或下载链接
- 有哪些风险点
不要只说“已完成”,要让用户能立即验证。
## 11. 给别的 AI 的简短执行准则
如果要浓缩成一句话:
> 先查 AstrBot 官方文档,再做最小修改,严格守住配置/schema、WebUI 结构、adapter origin、打包根目录这四条线。
## 12. 已核对的官方文档与注意点
本 Skill 写作时已核对 AstrBot 官方文档,后续开发仍建议按目标 AstrBot 版本再次确认。
参考入口:
- AstrBot 插件开发指南:`https://docs.astrbot.app/dev/star/plugin-new.html`
- AstrBot 插件配置:`https://docs.astrbot.app/dev/star/guides/plugin-config.html`
- AstrBot Plugin Pages:`https://docs-v4.astrbot.app/en/dev/star/guides/plugin-pages.html`
从官方文档可确认:
- AstrBot 依赖插件目录下的 `metadata.yaml` 识别插件元数据。
- 插件目录可以添加 `_conf_schema.json`,AstrBot 会解析配置并生成对应配置文件,实例化插件类时传入配置对象。
- 当前文档示例里出现了 `object` / `items` 形式的嵌套配置;但如果要兼容旧版 AstrBot 或已有项目历史经验,仍建议优先使用扁平配置,除非明确确认目标版本支持嵌套配置。
- 若插件需要独立 Dashboard 页面,可参考 Plugin Pages,把静态资源放在官方建议的位置;如果只是少量可编辑设置,优先用 `_conf_schema.json`。
当文档与项目历史经验冲突时:
- 如果是版本差异,优先以当前安装版本的官方文档和当前源码行为为准。
- 如果是项目特有约定,优先以项目统一备忘录为准。
- 如果要发布给更多用户,优先选择更保守、更兼容的写法。