Initial commit: 让多个 AI 智能体通过文件总线在共享聊天室里互相 @、协作与交接任务

This commit is contained in:
WpyQwq
2026-09-19 11:52:42 +08:00
commit 103f0b32f5
28 changed files with 5834 additions and 0 deletions
+112
View File
@@ -0,0 +1,112 @@
# 唤醒通道(transports)
每个成员在被 `aig wake` 调用时,用的都是**它自己的 CLI 的无头模式**。本机实测过的路径如下(2026-09-18)。
## dsh — DeepSeek Harness
```bash
node <node> "%APPDATA%\npm\node_modules\@deepseek-ai\dsh\lib\bin.js" --profile headless "<prompt>"
```
- 走 `lib/bin.js` 而不是 `dsh.cmd`:**直接 node + argv,绕开 cmd 的引号地狱**(提示词里有中文、引号、换行)。
- `--profile headless` 需要存在;本机 `dsh --help` 明确写了 `dsh --profile headless "run the tests"` 会「答一次、打印、退出」。
- 覆盖入口:`AIGROUP_DSH_BIN`(指向别处的 bin.js);`AIGROUP_DSH_NODE`(换 node)。
- 注意:headless 启动会写 `$DSH_HOME`(profile 目录、日志),在受限沙箱里会 `EPERM`。
## opencode
```bash
"%APPDATA%\npm\node_modules\opencode-ai\bin\opencode.exe" run -m <model> [-c] [--dir <dir>] "<prompt>"
```
- 直接调 `bin/opencode.exe`(真 EXE,不需要 shell)。
- `-c/--continue` 会接上该项目目录下**最近一次会话**。默认**不加**:免得和用户自己开着的 TUI 会话串味。要连续对话再 `aig join opencode --note "..."` 后手工加 `continue: true`。
- 模型(**全免费档**):默认 `opencode/big-pickle`,备选 `opencode/nemotron-3.5-lightning-free`
(`members.json` 里的 `fallback_model`:主模型不可用时自动换备选再试一次,并把换模型的事实写进消息 `meta`)。
其它可用免费档(`opencode models` 实测):`ling-3.0-flash-fin-free`、`mimo-v2.5-free`、`nemotron-3-ultra-free`、
`muse-spark-1.2/1.3-contributor-free`(后两个**本机地域封锁**,报 `This model is not available in your country.`)。
### 免费档排名(同题实测,2026-09-18)
第一轮基础题(5 题,`tools/model-shootout.mjs`,判分修正后):五个可用免费档**全部满分**,
耗时差得很明显——`big-pickle` 6.3s · `ling-3.0-flash` 6.6s · `nemotron-3.5-lightning` 16.5s ·
`mimo-v2.5` 19.6s · `nemotron-3-ultra` 57.7s。muse-spark 两个地域封锁直接出局。
决赛轮难题(7 分制,`tools/model-shootout2.mjs`,含一题**真的把模型输出的函数跑断言**):
| 模型 | 得分 | 耗时 | 备注 |
|---|---|---|---|
| `big-pickle` | **6/7** | **16.5s** | 与两个 nemotron 同分,但快 5–6 倍 |
| `nemotron-3-ultra-free` | 6/7 | 94.4s | 上下文 1M,长上下文场景的备选 |
| `nemotron-3.5-lightning-free` | 6/7 | 103.2s | 开源权重,262k |
| `ling-3.0-flash-fin-free` | 5/7 | 19.1s | 快,但「1..100 里数字 1 出现几次」答 20(正确 21) |
| `mimo-v2.5-free` | 5/7 | 26.8s | 同上 |
- **H5(改 bug 后跑断言)五个模型全部 0 分**:都用了 `arr.slice(-n)`,而 JS 里 `slice(-0)` 等于 `slice(0)`,
n=0 的边界全错。这是所有免费档共同的坑,不是哪一家的问题。
- 结论:选 `big-pickle` 作默认(同分最快);它是 Zen 的**隐身模型**,可能某天下线——
所以配了 `fallback_model`。要换回来一条命令:`aig join opencode --model opencode/nemotron-3.5-lightning-free`。
- **免费档不需要 API key**:实测 `opencode run -m opencode/nemotron-3-ultra-free "…"` 直接返回内容。
这条很关键——意味着群聊里 opencode 这一侧零成本。
- 覆盖入口:`AIGROUP_OPENCODE_BIN`。
## workbuddy — WorkBuddy 桌面端(走它随附的 CodeBuddy CLI)
```bash
"<~>\.workbuddy\binaries\node\versions\22.22.2-3\node.exe" "H:\workbuddy\resources\app.asar.unpacked\cli\bin\codebuddy" -p "<prompt>" --model <model>
```
- WorkBuddy 桌面端本体(`H:\workbuddy\WorkBuddy.exe`)没有命令行入口,但它的安装目录里**带了一套
CodeBuddy CLI**(`@genie/agent-cli`,`codebuddy` / `cbc`),支持 `-p/--print` 无头输出,直接可用。
- 用 WorkBuddy **自带的 node**(`~/.workbuddy/binaries/node/versions/*/node.exe`),避免宿主 node 版本差异。
- 模型:`hy4-preview-f`(Hy4 preview 免费档)。WorkBuddy 的模型分档在
`~/.workbuddy/cache/*acc-product-config-v3.json` 里写着:`Hy4 preview` → 免费 `hy4-preview-f` / 付费 `hy4-preview`;
`Hy3` → 免费 `hy3` / 付费 `hy3-x`。桌面端两个现存会话本来就在用 `hy4-preview-f`。
- 登录态:CLI 复用桌面端的凭据(实测 `-p` 直接有回答,无需额外登录)。它会写 `~/.codebuddy/`,
受限沙箱里会 `EPERM: mkdir '~/.codebuddy/local_storage'`。
- 覆盖入口:`AIGROUP_CODEBUDDY_BIN`、`AIGROUP_CODEBUDDY_NODE`。
## 免费档怎么挑的(有实测,不是感觉)
`tools/model-shootout.mjs` + `tools/model-shootout2.mjs` 用同一套题跑遍 opencode 的免费档,
题是**客观可判分**的(数值、枚举、以及真的把模型输出的函数跑断言)。结论与原始数据见同目录
`shootout-result.json` / `shootout2-result.json`,切换模型:
```bash
node aig.mjs join opencode --model opencode/ling-3.0-flash-fin-free # 单个成员改
node aig.mjs wake opencode --model opencode/big-pickle --dry-run # 只这一次改
```
## 加一个新成员
```bash
node aig.mjs join reviewer --kind custom --model whatever
```
然后在 `rooms/<room>/members.json` 里给它加通道画像(`transport` 必须是 `aig.mjs` 里 `resolveTransport`
认识的类型,或者你自己在 `resolveTransport` 加一个分支):
```json
{
"reviewer": {
"kind": "custom",
"transport": "opencode",
"model": "opencode/big-pickle",
"dir": "E:/proj",
"note": "只做代码审查"
}
}
```
## 身份识别顺序
`aig` 判断「我是谁」的顺序:
1. `--as <member>`(最优先)
2. `AIGROUP_MEMBER` 环境变量
3. 宿主环境变量:`DSH_SESSION_ID`/`DSH_HOME` → dsh;`OPENCODE_*` → opencode;`CODEBUDDY_*`/`CBC_*` → workbuddy
4. 安装目录里的 `.aig-host.json`(由 `install.mjs` 写入)
5. 父进程链(向上找 `opencode.exe` / `WorkBuddy.exe` / `dsh`,需要 `detect` 或深度识别时才算)
6. 兜底 `anon`
`aig detect` 会把这三类证据全打出来,认错身份时先看它。