多平台群聊智能助手 —— 接入飞书 / QQ 群,基于 RCM + DeepSeek 自动处理产品反馈、Bug 追踪和功能建议。
- 意图识别 — 自动分类 Bug、功能建议、使用问题、已知问题跟进
- 历史检索 — 基于记忆、近期上下文、静态仓库证据和必要的公开检索识别已知问题
- 代码扫描 — 自动定位相关模块和代码路径
- 记忆系统 — 沉淀产品知识,多轮对话保持上下文
- Synergy 开发转交 — 飞书中的新 Bug/功能请求通过 CardKit 提供三种选择:在原话题中召唤 Synergy-dev 并生成 Plan、只创建 GitHub Issue 后结束、或取消
- 多平台 — 统一管道,飞书和 QQ 共享同一套编排逻辑和记忆
# 1. 安装依赖
bun install
# 2. 配置环境变量
cp .env.example .env
# 编辑 .env:填写飞书、DeepSeek、AnySearch 凭证及绝对 RCM_BIN;Linux 还需配置 Bubblewrap 运行时边界
# 如需“只创建 Issue”,仅在 Linux 上额外配置 GITHUB_TOKEN 和绝对 GH_BIN
# 3. 启动
bun run bot.ts listen| 变量 | 必填 | 说明 |
|---|---|---|
FEISHU_APP_ID |
✓ | 飞书应用 App ID |
FEISHU_APP_SECRET |
✓ | 飞书应用 App Secret |
FEISHU_BOT_OPEN_ID |
可选兜底;启动时会自动解析当前机器人 open_id,API 解析失败时可手动配置 | |
SYNERGY_BOT_OPEN_ID |
✓(飞书) | 接收开发请求的 Synergy 机器人 open_id;用户确认授权后,在话题中真实 @该机器人 |
DEEPSEEK_API_KEY |
✓ | DeepSeek API Key |
ANYSEARCH_API_KEY |
✓ | AnySearch MCP API Key,不含 Bearer 前缀;仅通过精确构造的子进程环境传给 assistant RCM |
TARGET_REPO |
目标 GitHub 仓库,默认 SII-Holos/synergy |
|
GITHUB_TOKEN / GH_TOKEN |
仅 Linux 可选;只供 bot-owned Issue writer 使用,启动后从 process.env 删除,不传给 RCM |
|
GH_BIN |
GitHub 写入时 | gh 可执行文件绝对路径 |
REPO_PATH |
本地仓库绝对路径;默认 ./repo(相对 Chaos 根目录解析);assistant 沙箱内只读 |
|
RCM_BIN |
✓ | accelerate 可执行文件绝对路径 |
RCM_SANDBOX_BIN |
✓(Linux) | root-owned、不可被 group/world 写入的 Bubblewrap 可执行文件绝对路径 |
RCM_RUNTIME_ROOTS |
✓(Linux) | 以平台 PATH 分隔符连接的、人工审核过的运行时目录;host source 解析为 canonical path,guest 仍挂载到配置的绝对路径别名 |
RCM_RUNTIME_PATH |
RCM 沙箱内 PATH,默认 /opt/accelerate/bin:/usr/bin:/bin,每项必须由 guest runtime root 覆盖 |
|
ALLOW_UNSANDBOXED_RCM |
可选 | 显式设为 1 时无沙箱运行 RCM(受限容器/本地开发);Linux 下仍允许配置 GitHub token,非 Linux 禁止 |
RCM_RUN_TIMEOUT_SECONDS |
单次 RCM 超时,默认 420 秒 |
|
MEMPALACE_BIN |
可选语义检索命令,默认 mempalace |
|
MEMPALACE_ENABLED |
auto、true 或 false;默认 auto |
|
MEMPALACE_PALACE_PATH |
可选 Palace 数据路径 | |
PLATFORMS |
启用的平台,逗号分隔,默认 feishu(可选 qq) |
|
QQ_BRIDGE_PORT |
QQ 桥接端口,默认 18080 |
|
CHAOS_POLL_TIMEOUT_SECONDS |
AstrBot 插件轮询回复超时,默认 480 秒;需配置在 AstrBot 进程环境中 |
生产环境必须使用 Linux。每次启动和所有触发 RCM 的 CLI 命令都会先执行 fail-closed 预检:解析并校验绝对可执行文件、确认 RCM_BIN 位于审核过的 RCM_RUNTIME_ROOTS、探测 Bubblewrap 所需特性,并拒绝伪文件系统 runtime root、会被后续 synthetic/route mount 隐藏的 guest root、覆盖服务 HOME/Chaos 私有状态的 broad REPO_PATH,以及其他受保护路径重叠。
RCM 在 Bubblewrap 空根沙箱中运行,只获得合成的 HOME/PATH 和路由所需 API Key。runtime root 的 host source 会 canonicalize 后审核,但 guest destination 保留配置路径,因此 merged-/usr 系统的 /bin 等别名仍可达。assistant 对仓库、记忆和当前 chat 的归档子目录只有只读访问,不能搜索其他 chat 的原始归档;记忆路由只可写 memory/。synthetic /proc、/dev、/tmp、/home、/run、/work 和 /workspace 在 runtime roots 之后建立,任何会与这些 guest tree 重叠的 runtime root 都会在预检阶段被拒绝。网络当前为共享命名空间,以支持 DeepSeek 和 AnySearch,因此部署侧仍应实施出站网络策略。GitHub writer 不在 RCM 中运行:它使用独立绝对 GH_BIN、隔离的 HOME/config 和显式 token。
Linux 生产环境必须使用 Bubblewrap 隔离。缺少 Bubblewrap 所需内核能力的环境(如无法挂载 /proc 的受限容器)可显式设置 ALLOW_UNSANDBOXED_RCM=1 以无沙箱运行 RCM;Linux 无沙箱模式仍允许配置 GitHub token 并使用 只创建 Issue(token 不传给 RCM 子进程)。macOS 等非 Linux 系统仅支持显式设置 ALLOW_UNSANDBOXED_RCM=1 的本地开发,且配置任何 GitHub token 都会使预检失败;只创建 Issue 需在 Linux 隔离环境验证。
┌──────────────────────────────────────────────────┐
│ bot.ts(平台无关编排层) │
│ 去重 → 时效检查 → RCM → 回复 → 归档 → 记忆提炼 │
└──────┬───────────────────────┬───────────────────┘
│ │
platform-feishu.ts platform-qq.ts
Lark WebSocket HTTP 127.0.0.1:18080
│ │
│ astrbot-plugin-chaos
飞书群 │
QQ 群
| 层 | 说明 |
|---|---|
lib/config.ts |
运行时配置与私有状态目录 |
lib/platform.ts |
PlatformAdapter 接口定义 |
lib/platform-feishu.ts |
飞书适配器(WS 长连接 + 消息解析 + CardKit 卡片) |
lib/feishu-mention.ts |
飞书机器人身份识别与 @提及过滤 |
lib/platform-qq.ts |
QQ HTTP 桥接适配器 |
lib/dev-handoff.ts |
开发转交标记解析与校验 |
lib/dev-request.ts |
飞书开发转交输入组装 |
lib/dev-card.ts |
三选一卡片、回调状态机与投影恢复 |
lib/dev-card-state.ts |
卡片请求状态持久化 |
lib/dev-issue.ts |
确定性 GitHub Issue 创建器(去重、恢复与重试) |
lib/dispatch.ts |
RCM 调度、安全预检、Bubblewrap 沙箱与隔离的 GitHub writer |
lib/memory.ts |
双层记忆系统(Archive + Memory) |
| 命令 | 说明 |
|---|---|
bun run bot.ts listen |
启动所有已启用的平台适配器 |
bun run bot.ts once "msg" |
单次测试 |
bun run bot.ts import <file> |
导入文档到知识库 |
bun run bot.ts consolidate |
整理记忆条目 |
RCM assistant 通过 Streamable HTTP 连接 https://api.anysearch.com/mcp,并暴露 anysearch__search、anysearch__batch_search、anysearch__extract 和 anysearch__get_sub_domains。只有需要当前外部信息或本地证据不足时才搜索;专业垂直检索会先发现可用 sub-domain。
.env 中配置原始 API Key:
ANYSEARCH_API_KEY=as_sk_xxx模板缓存只保存 ${ANYSEARCH_API_KEY} 占位符;RCM 编译时从子进程环境解析并用于 Authorization header。
| 配置项 | 值 |
|---|---|
| 订阅方式 | 使用长连接接收事件 |
| 订阅事件 | im.message.receive_v1、card.action.trigger |
| 权限 | im:message、im:message:send_as_bot、im:message.group_at_msg.include_bot:readonly |
| 群聊唤醒 | 启动时解析当前机器人 open_id,仅处理 @ 当前机器人的消息;其他机器人、同名机器人和 @all 均忽略 |
| 开发请求 | CardKit 提供召唤 Synergy-dev 并生成 Plan、只创建 GitHub Issue 后结束、取消三种互斥操作 |
开发请求卡片只有原始报告者可以操作。召唤发送失败时,卡片会进入“召唤结果未知”状态;再次召唤可能重复发送,也可以直接结束。创建 Issue 和卡片终态会持久化,进程重启后自动恢复未完成的 Issue 创建与卡片投影。GitHub 创建结果若因超时、进程终止或创建后的对账失败而无法确认,卡片会进入无按钮的 issue_unknown 阻断态,禁止再次创建、召唤或取消;只有人工核对后重启触发的 reconciliation 可以恢复为已创建终态。Issue ledger 缺失视为新状态,但存在且损坏或含非法记录时会 fail-closed,绝不自动覆盖或创建第二个 Issue。
Card action chaos_dev_handoff/v1 增加了 create_issue;部署必须保持单实例并原子升级,不支持新旧服务同时处理新卡片,也不保证旧版本回滚后继续处理已创建的三选一卡片。
启用方式:.env 中 PLATFORMS=feishu
- 在
.env中设置PLATFORMS=feishu,qq - 将
astrbot-plugin-chaos/复制到 AstrBot 的 plugins 目录 - 可在 AstrBot 进程环境中设置
CHAOS_POLL_TIMEOUT_SECONDS,默认480秒 - 重启 Chaos 和 AstrBot
- 群聊中 @bot 即可触发;插件按
message_id独立领取回复,避免并发消息互相消费
MIT