Files

6.0 KiB
Raw Permalink Blame History

唤醒通道(transports)

每个成员在被 aig wake 调用时,用的都是它自己的 CLI 的无头模式。本机实测过的路径如下(2026-09-18)。

dsh — DeepSeek Harness

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

"%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)

"<~>\.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,切换模型:

node aig.mjs join opencode --model opencode/ling-3.0-flash-fin-free   # 单个成员改
node aig.mjs wake opencode --model opencode/big-pickle --dry-run      # 只这一次改

加一个新成员

node aig.mjs join reviewer --kind custom --model whatever

然后在 rooms/<room>/members.json 里给它加通道画像(transport 必须是 aig.mjs 里 resolveTransport 认识的类型,或者你自己在 resolveTransport 加一个分支):

{
  "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 会把这三类证据全打出来,认错身份时先看它。