合上盖子,换个地方,打开,它接着跑。
把 MacBook 合上,带到别处,再打开,连上网,run 接着跑。daemon 分得清「机器睡了」和「连接断了」:空档超过两个心跳续期周期时,它先给每个会话三个周期的时间重新发心跳,之后才判定掉线。启动时撞上网络错误也不判死:先等 30、60、120 秒,之后每 300 秒再试一次。离线时什么都不重启——重启任何会话之前先探网络,没网就只等,不消耗重试次数,也不换代。run 不暂停,不用人工恢复,网络一回答问题就继续。
项目经理
个人助理类 agent 已经能派子 agent、跑定时任务、在模型之间故障切换。fleetmux 补上的是项目经理做的事:
把 MacBook 合上,带到别处,再打开,连上网,run 接着跑。daemon 分得清「机器睡了」和「连接断了」:空档超过两个心跳续期周期时,它先给每个会话三个周期的时间重新发心跳,之后才判定掉线。启动时撞上网络错误也不判死:先等 30、60、120 秒,之后每 300 秒再试一次。离线时什么都不重启——重启任何会话之前先探网络,没网就只等,不消耗重试次数,也不换代。run 不暂停,不用人工恢复,网络一回答问题就继续。
产物是否存在、是否包含必需内容、测试是否通过,由 daemon 判定,不采信模型的自述。
上下文接近上限时,会话写交接单,由新会话接替;卡死的会话原位重启;daemon 与监工互相看护。
每次派工前,顾问依据能力矩阵(领域 × 任务类型 × 模型,每格附证据)选定模型与推理强度,所选结果须通过该矩阵的校验;撞上用量墙时,该槽位沿其角色的模型链换到下一个可用模型,或者暂停。
每个 agent 都是一个看得见的终端会话,随时可以旁观、随时可以介入。
每个 agent 都在厂商自己的 CLI 里、以你本人的登录运行;不抽取凭证、不伪装客户端、不经代理转发 API 调用。
预算卡限定调用次数、轮数、小时数和每个账号的额度;撞墙表决定是降一档模型,还是暂停运行、留待之后续跑。
一个 worker 可以成为它自己子 fleet 的组长,因此一个常驻 fleet 能同时跑几条业务线,每条线按自己的时钟起停。
怎么运转
任务自带「完成」的定义:必须产出哪些文件、每份多长、必须包含什么。
上下文窗口用到 60% 时,会话写一份三段式交接单,旧屏幕进 history 页,接班者在同一位置启动并读这份交接单。模型没写时用机器生成的骨架;单单缺交接单不会阻止换代。
卡死的会话原位重启;daemon 与监工互相看护。
混用 CLI
同一个 fleet 里可以混用官方 Claude Code、官方 Codex CLI、Pi(Codex 模型与本地模型)和 opencode。下表按配对表列出全部「监工 × worker」组合,task 与 service 两种模式分开标。
| 监工 ↓ / worker → | Claude Code | Codex CLI | Pi | opencode | dsh |
|---|---|---|---|---|---|
| Pi | 已通过 | 不支持 | 已通过 | 仅冒烟模式 | 已通过 |
| Codex CLI | 已通过 | 仅冒烟模式 | 已通过 | 已通过 | 不支持 |
| Claude Code | 已通过 | 不支持 | 已通过 | 不支持 | 不支持 |
| 监工 ↓ / worker → | Claude Code | Codex CLI | Pi | opencode | dsh |
|---|---|---|---|---|---|
| Pi | 已通过 | 不支持 | 已通过 | 已通过 | 不支持 |
| Codex CLI | 已通过 | 不支持 | 已通过 | 仅冒烟模式 | 不支持 |
| Claude Code | 已通过 | 不支持 | 已通过 | 不支持 | 不支持 |
--lifecycle smoke 才能启动)
不支持(配对表里没有)
Codex worker(codex+codex)仍未验证;opencode 只做 worker,dsh 只做 worker 且只有 task 模式。配对与状态(verified / unverified = 只能 --lifecycle smoke / 直接拒绝)都在 fleetmux/config/fleet.yaml#cli_pairs 里,表里没有的组合会在开跑前带原因被拒绝。
fleetmux start --supervisor-cli pi --worker-cli pi \
--supervisor-pi-model openai-codex/gpt-6-astra --supervisor-pi-thinking high \
--pi-model flashnext/<local-model> --workers 2 --lifecycle <mode> \
--allow-unsandboxed-pi --allow-development-v2
应用场景
每次 start 都要指定 --lifecycle,它规定「完成」的含义以及运行如何收尾。
有些环境只允许调用部署在自己机器上的模型,而本地模型很不擅长协作。fleetmux 把协作从模型手里拿走,交给 daemon:监工只决定下一步,worker 只执行这一步;回合何时结束、结果是否存在、会话何时换代,都由 daemon 决定。--max-busy 把并发请求控制在推理服务的内存上限以内;私有 Redis 只监听 Unix socket,不开任何端口。
价格与指标由你自己的程序盯着;触及某个档位或指标参数被越过时,程序发出一条请求,由负责该角色的 worker 做一次完整复盘并用 JSON 作答。指定了 to 的请求不经监工回合,回复字段先由 daemon 校验,你的程序再去读。fleet 不下单,也不认交易日历。
调用方自己的定时器在工作日的固定时点启动 fleet:一个监工加两个 Claude Code worker,研究用的 skill 和网络搜索 MCP 一并载入。任务目标里声明报告文件及其必含章节;daemon 按字面验收,给这次运行设硬性时限,结束时关闭工作区。
另一个程序发 JSON 请求;指定了 to 的请求直接交给该角色的 worker。daemon 按 reply.required 与 reply.allowed 校验每条回复,调用方在非工作时段用 pause 与 resume 把 fleet 挂起。
快速上手
打开一个 cmux 终端,配置好你的 Pi provider/model,并替换下面的 local/my-model。
new-surface --command);start 要在 cmux 终端里跑。redis-server(brew install redis);每个 run 起自己的私有实例,不碰 localhost:6379。requirements.txt 里的包。git clone https://github.com/justindbca/fleetmux && cd fleetmux
pip install -e .
fleetmux start --workers 2 --supervisor-cli pi --worker-cli pi --lifecycle <mode> \
--pi-model local/my-model --allow-unsandboxed-pi --allow-development-v2
echo '{"goal": "Survey the three most-cited papers on X and write a comparison",
"hours": 4,
"artifacts": [{"path": "worker-1/report.md", "min_chars": 800, "contains": ["Conclusion"]}]}' \
| fleetmux task - # hand the goal to the supervisor
fleetmux status # task + per-agent state, context usage, inbox depth
fleetmux stop # cancel; confirm runtime retirement before Redis shutdown
新的启动要求 Redis v2 并需显式的开发许可;这是开发期的接线,不是生产验收。