MaiBot Agent Skills & AI Rules

GitHub

MaiSaka, an LLM-based intelligent agent, is a digital lifeform devoted to understanding you and interacting in the style of a real human.

5,690 stars Python Python 1 file · ~1,917 tokens #agent#chat#chatbot#llm#llm-agent#llms#python#qq-bot
RAW Rules
2 Discovered Rules • ~3,056 Estimated Tokens
Quick:
Loading skill content...

AI Agent Protocol & Instructions

AGENTS.md root-instruction ~2,799 tokens
Raw
# 代码规范
# import 规范
在从外部库进行导入时候,请遵循以下顺序:
1. 对于标准库和第三方库的导入,请按照如下顺序:
    - 需要使用`from ... import ...`语法的导入放在前面。
    - 直接使用`import ...`语法的导入放在后面。
    - 对于使用`from ... import ...`导入的多个项,请**在保证不会引起import错误的前提下**,按照**字母顺序**排列。
    - 对于使用`import ...`导入的多个项,请**在保证不会引起import错误的前提下**,按照**字母顺序**排列。
2. 对于本地模块的导入,请按照如下顺序:
    - 对于同一个文件夹下的模块导入,使用相对导入,排列顺序按照**不发生import错误的前提下**,随便排列。
    - 对于不同文件夹下的模块导入,使用绝对导入。这些导入应该以`from src`开头,并且按照**不发生import错误的前提下**,尽量使得第二层的文件夹名称相同的导入放在一起;第二层文件夹名称排列随机。
3. 标准库和第三方库的导入应该放在本地模块导入的前面。

## 注释规范
1. 如果原来的代码中有注释,则重构的时候,除非这部分代码被删除,否则相同功能的代码应该保留注释(可以对注释进行修改以保持准确性,但不应该删除注释)。
2. 如果原来的代码中没有注释,则重构的时候,如果某个功能块的代码较长或者逻辑较为复杂,则应该添加注释来解释这部分代码的功能和逻辑。
## 类型注解规范
1. 重构代码时,如果原来的代码中有类型注解,则相同功能的代码应该保留类型注解(可以对类型注解进行修改以保持准确性,但不应该删除类型注解)。
2. 重构代码时,如果原来的代码中没有类型注解,则重构的时候,如果某个函数的功能较为复杂或者参数较多,则应该添加类型注解来提高代码的可读性和可维护性。(对于简单的变量,可以不添加类型注解)
3. 对于参数化泛型,应该使用`typing`模块中的类型注解来指定参数化泛型的类型。
    - 例如,使用`List[int]`来表示一个包含整数的列表,使用`Dict[str, Any]`来表示一个键为字符串,值为任意类型的字典。

## 变量规范
1. 当确定某个变量/实例是某种类型的时候(优先按照类型注解确定,除非你分析出类型注解是错误的),可以不必使用`or`进行fallback。
    - 例如,`bot_nickname = (global_config.bot.nickname or "").strip()` 可以改为 `bot_nickname = global_config.bot.nickname.strip()`,前提是我们确定`global_config.bot.nickname`一定是一个字符串。

## 类属性使用规范
1. 应该尽量减少使用getattr和setattr方法,除非是在对一个动态类进行处理或者使用Monkeypatch完成Pytest
2. 在重构代码时,如果遇到getattr和setattr,应该尝试检查这个类实例是否有这个属性,如果有,则直接替换为类属性访问写法。
    - 举例:`v = getattr(instance, "value", "")` 在检查到`instance`有`value`属性后应该改为`v = instance.value`

## debug规范
1. 不要总是想找兜底,一定要精准的找到问题的核心,然后提出建议,兜底是不合适,难以维护的。
2. 不要总是考虑fallback,如果哪里有错误,一定要让他及时完整的暴露,而不是用fall_back兜底掩盖过去

## 验证与排查纪律
1. 修 CI 报错先判存量:查父提交同 workflow 的 run 结论,分支早就红的问题不是你刚改的,别先背锅再动手;但若要 CI 转绿,存量失败该修也要修。
2. 验证适度,高成本验证先缩小范围:全量测试一轮几分钟,先单独跑目标文件;单独跑过、全量下才挂(尤其 waitFor 超时)即环境抖动。回头成本低时按最可能解释先推进,不要为每个结论做 stash 对比、多轮重跑。
3. 下「环境问题/存量失败」结论前先确认环境一致性:本地依赖与 CI lockfile 不一致(如本地 pnpm、CI bun)会产生假失败;判定以干净装依赖的环境(同 lockfile)为准。
4. 往沙箱/临时目录复制文件必须保真:PowerShell `Out-File`(尤其 `-NoNewline`)会吞换行制造幽灵失败,用 `Copy-Item` 或 Python 二进制读写;复制后先哈希或 diff 比对再下结论。

# 运行/调试/构建/测试/依赖
优先使用uv
依赖项以 pyproject.toml 为准,要同步更新requirements.txt

# Webui规范
对于dashboard的前端测试,在细节改动,改动范围小时,别测试,别写测试,别build,直接快速做,避免无谓的时间浪费和代码浪费
修改完webui,如果是小改动小修复,不用急着npm run build。当完成一个较大功能新增或者较广重构时,才需要运行 npm run build。

WebUI 开发服务固定起到 7999 端口。

# 配置文件修改
如果你需要改动配置文件,不需要修改实际的bot_config.toml或者model_config.toml,只需要修改配置文件模版,并新增一个版本号即可,也不必要为配置改动创建测试文件。
除非明确说明,否则不要擅自新增 ConfigUpgradeHook
禁止改动 legacy_migration,此文件以固定

# 事件循环规范
不要阻塞事件循环。同一进程里有两个事件循环(bot 主循环、WebUI 独立线程的循环),任何一个被同步工作占住,界面上对应的一侧就会整体卡住。

- 路由处理器只做同步工作(查数据库、读文件、算数据)时写成普通 `def`,不要写 `async def`:FastAPI 会把 `def` 端点交给线程池执行,而 `async def` 会占用事件循环。只有确实需要 `await`,或需要「当前有运行中的事件循环」(`asyncio.create_task`、`asyncio.get_running_loop` 等)时,才写 `async def`。
- `async def` 函数体内不要直接调用同步阻塞接口:`get_db_session()`、`session.exec()`、`find_messages()`、`metadata_store.query()`、批量文件读写等,应放进 `asyncio.to_thread(...)`。
- WebUI 同步端点的并发数由 `src/webui/app.py` 的 `limit_sync_endpoint_concurrency()` 限制在 SQLite 连接池容量以内,新增同步端点不需要再单独控制并发。
- 主循环与 WebUI 循环各挂一个卡顿看门狗(`src/common/event_loop_watchdog.py`)。日志里出现「事件循环卡顿: loop=... 迟到=...s」即可看出是哪一侧被阻塞、卡了多久。

# 会话 ID 规范
除聊天流创建/注册链路外,业务模块不应自行调用 `SessionUtils.calculate_session_id` 计算资源归属 ID。表达学习、黑话、记忆、WebUI、配置匹配等模块应通过 `chat_manager` 的内部接口,基于 platform、目标 ID 和聊天类型解析已存在的真实聊天流;如果解析不到真实 `ChatSession.session_id`,不要把自行计算的 fallback hash 写入数据库。

webui中设计聊天会话流的,涉及显示聊天流信息的,优先显示聊天流实际名称(群名称或 xxx的私聊),而不是session_id

# 关于 A_memorix 修改
如果修改涉及 `src/A_memorix`,请先阅读 `src/A_memorix/MODIFICATION_POLICY.md`。

1. `src/A_memorix` 的实现层改动应优先遵守 `src/A_memorix/MODIFICATION_POLICY.md` 中的归属约束。
2. 不要提交无边界的 `ruff`、格式化、导入整理或大面积实现整理。
3. 本地实验目录或依赖其运行的测试,除非明确说明并确认,否则不要进入共享历史。

# prompt模板、
涉及对prompt模板的修改,要同步修改英文和日文的文件,对齐到中文

# maibot插件开发文档
https://github.com/Mai-with-u/maibot-plugin-sdk/blob/main/docs/guide.md

如果你要编写插件,不要改动根目录的.gitignore,而是在/plugins下创建独立仓库,然后进行编写
如果你要编写插件有需求需要改动主程序代码,请你先请求许可。

# 如何提交maibot插件
https://github.com/Mai-with-u/plugin-repo/blob/main/CONTRIBUTING.md

# changelog编写
建议分为两部分,一部分是主要功能,一部分是细节(包含修复和插件sdk,api改动)。最好一个功能一行,按模块分。
不用修改changelog.dev,改动应该都写changelog.md
一般不写入changelog的内容:
版本号提升或更新项目依赖