它到底是什么
先把名词拆干净。OmO 的自我定位是 multi-model agent orchestration harness:一个跑在终端里的编码 agent,但它的中心不是"更强的模型",而是"更细的分工"。
传统编码 agent(Claude Code、Cursor 之类)是一个模型干完所有事:读库、写码、跑测试、写文档,都用同一个脑子。OmO 把这条流水线切开:
- 主 agent 跑你的会话模型,只做编排——探索、拆解、派活、验收、记账。
- 执行单元 是临时拉起的子会话,按"任务类别"分配模型与技能,干完回报,不参与上层决策。
- 只读专家(探索、查文档、计划挑刺、计划审核)永远只读,负责提供判断依据。
用作者自己的话说:"当你不得不把方向盘从 agent 手里夺回来时,那不叫协作,那叫系统失败。"整篇 Ultrawork Manifesto 都在论证一件事——人的介入次数是失败指标,不是安全感的来源。
它不是开源软件。许可证是 Sustainable Use License 1.0:允许个人或企业内部使用、修改,允许非商业免费分发;但不属于 OSI 定义的开源许可,商用二次分发要先读条款。仓库用 TypeScript(Bun)写主程序,桌面端有 Rust crate,体量不小。
为什么值得花时间理解:它把"多模型协作"这件事从 demo 变成了可操作的产品形态——模型名出现在配置里,而不是出现在 prompt 里;任务类型决定模型,而不是你自己记得哪个模型擅长什么。这套抽象(类别 / 技能 / 编排 / 记忆)正在被其他 agent 项目陆续抄过去。
三条产品线,先选一条
同一个项目对外有三种形态,装哪种取决于你原来的习惯。它们的配置文件、可用工具集并不完全一样,别混着看文档。
| 形态 | 入口 | 适合 | 特征 |
|---|---|---|---|
| OmO Native | omonpm 包 omo-ai |
从零开始用 OmO | 独立二进制,自带引擎 senpi(pi 的 fork),记忆、CodeMode、订阅登录全内置 |
| Ultimate OpenCode 版 |
bunx oh-my-openagent install |
已经是 OpenCode 用户 | 作为插件注册进 opencode.json,写 agent / model 配置,最完整的一份历史实现 |
| Light Codex 版 |
--platform=codex或 lazycodex |
主力是 ChatGPT 订阅 + Codex CLI | 只移植可移植组件(bootstrap、comment-checker、lsp、ultrawork 等),没有 OpenCode 的 agent 注册表 |
Native 的安装
一行命令,装原生二进制到 ~/.local/bin,安装脚本会核对 release 校验和;镜像不可达时回退到 GitHub Releases。
# macOS / Linux
curl -fsSL https://get.omo.dev/install.sh | bash
omo
# Windows PowerShell
irm https://get.omo.dev/install.ps1 | iex
# 指定预发布通道或固定版本(注意是 bash 之后的参数)
curl -fsSL https://get.omo.dev/install.sh | bash -s -- beta
curl -fsSL https://get.omo.dev/install.sh | bash -s -- 5.1.1
喜欢包管理器的话 bun add -g omo-ai 或 npm i -g omo-ai 装的是同一个东西。注意 npm 上另有一个叫 omo 的包,和这个项目无关。
第一次运行
- 在项目目录里敲
omo,直接描述任务,没有别的初始化步骤。 /login接订阅账号:Claude、ChatGPT、Kimi、GLM 都在里面。没有订阅也可以用 API key 的方式接。- 从 OpenCode 版或 LazyCodex 迁移过
omo setup:它会先打印一份迁移清单(凭据、MCP、技能、自定义 provider、模型选择),你同意一次才写入;OAuth 登录不会被导入,需要在 omo 里重新/login。 omo doctor体检,omo doctor --models打印每个类别、每个 agent 此刻会落到哪个模型、回退顺序是什么。
日常操作
| 想要 | 动作 |
|---|---|
| 调节思考强度 | /thinking <level>,或 Shift+Tab 循环 |
| 直接指定推理档位 | /efforts <level>(仅支持 effort 分级的模型) |
| 接着上次干 | 会话内 /resume 或 /sessions;终端 omo -c 续上次,omo -r 开选择器 |
| 升级 | 重跑安装命令;包管理器安装用 omo update |
| 卸载 | rm ~/.local/bin/omo,或 bun remove -g omo-ai |
关键词:用词而不是命令切换模式
OmO 最反直觉的设计是不要你记命令。把某个词写进句子里,模式就开了。匹配是纯正则的(项目里叫 IntentGate),不做语义分类:
| 写这个词 | OmO 进入的状态 |
|---|---|
ulw / ultrawork | 完整自主循环:先读代码,再规划,逐步验证,在真实界面上确认结果,直到任务完成 |
ulw loop | 先定义"怎样算做完"的检查项,再一步步推进到所有检查通过 |
ulw plan | 只探索、只写计划,一行代码都不改 |
ulw research | 派一队 agent 扫多来源,交回一份带出处的报告 |
mass ulw | 把大任务拆成依赖图,按波次并行执行(别名 mulw、ulw mass、meth) |
team mode | 多个成员 agent 互相发消息协作(需配置开启) |
匹配规则(踩坑点)
- 大小写不敏感;空格、连字符、无间隔等价:
ulw loop=ulw-loop=ulwloop。 - 只匹配完整单词,
ulwx不会触发。 - 行内代码和代码块里的词不算——你可以放心讨论这些关键词本身。
- 关键词可以叠加:
mass ulw research会把研究任务做成工作流。 - 只是提到关键词,等于"问 OmO 要不要进这个模式",不等于强制开启。
大多数情况下你只需要 ulw。要写的东西一句话说不清、又是多天工程,才升级到 /ulw-plan + /ulw-execute;任务之间有明显先后依赖,才用 mass ulw。
编排骨架:谁派活,谁能写文件
理解 OmO 的关键不是它支持多少模型,而是继承关系是单向的:主 agent 派活,worker 不能再派活。这个约束消灭了无限套娃,也让每层的行为可预测。
主 agent
就是你现在打字的会话,跑你的会话模型。它持有计划、todo 列表和证据账本,负责决定"这一步该谁做"。在 /ulw-execute 模式下它有一条硬规则:自己绝不写产品代码——所有实现、测试、QA、评审都必须派生出去。它的手只碰 .omo/ 状态、任务分解、调度和验收。
类别 worker
task(category: "...") 拉起一个全新的子会话,配置由类别决定(模型链 + 技能)。它只拿到一个 prompt,干完回报,不能继续派生。所以同一批里 quick 跑在便宜快模型、ultrabrain 跑在最强推理模型上,互不污染。
四类只读专家
| 名字 | 干什么 | 限制 |
|---|---|---|
explore | 仓库内快速搜索:"X 定义在哪、谁引用了 Y" | 只读,进程内 |
librarian | 查官方文档、开源实现、库 API | 只读,进程内 |
plan-consultant | 计划前的挑刺:隐藏意图、歧义、过度设计、缺失验收标准 | 仅 /ulw-plan 期间可召唤 |
plan-reviewer | 拿整份计划做一次性审核,只驳倒有证据的阻塞项 | 仅计划阶段,一次性,不能追问 |
另外还有三个 omo-native-* 评审员(code review、真实场景 QA、最终门禁),它们会写报告文件,所以不算在只读集合里。
Kibitzer:记忆不是向量库,是 git 里的 markdown
每个主会话配一个常驻的只读侧车。它接收会话里的 prompt、工具调用与结果(有长度上限、敏感信息先脱敏),只在遇到"有印象但还没判定过"的记忆时才唤醒模型去看一眼。一次唤醒最多 8 次只读工具调用,同机最多并行 2 个。
它的唯一输出是一条提醒:recalled memory: <hint>。不能写文件、不能改记忆、不会唤醒空闲会话。关掉它的开关是 memory.recall.enabled: false。
这个设计比"自动注入全部历史"克制得多:记忆不占主上下文,代价是提醒可能来得晚。
为什么用"类别"而不是模型名
prompt 里写模型名,等于把模型的自我认知带进任务;写类别,带进去的是意图:
task({ category: "ultrabrain", prompt: "..." }) // 一个真正难的逻辑问题
task({ category: "visual-engineering", prompt: "..." }) // 前端 / UI / 动效
task({ category: "quick", prompt: "..." }) // 机械改动、单文件、样板代码
task({ subagent_type: "explore", prompt: "..." }) // 只读检索
类别到模型的映射写在配置里,所以换模型不碰 prompt,换 prompt 不碰模型。九类内置的语义与默认模型见第 07 节。
两条工作路径:直接干,还是先立字据
路径 A:一个 ulw 直接开工
适合"目标清楚、上下文麻烦"的活。agent 自己探索、自己写实现笔记、自己拆、自己验。它不会在执行中途回头问你"要不要继续",也不会因为某个子任务失败就停工。
复杂度和说服力都在验证环节:每一小步都要有证据(测试、命令输出、界面截图),而不是"我做完了"。
路径 B:/ulw-plan → 批准 → /ulw-execute
适合多天工程、生产改动、需要留下决策痕迹的工作。计划模式最反常识的一点:它很粘。进入之后,"do X""fix X""just do it" 全都被理解成"plan X"。
- 探索并行派
explore/librarian,必要时拉 architect 与 ultrabrain 做只读设计咨询。 - 判断要不要访谈你意图清楚就只问真正属于你的决策(不可逆、花钱、破坏性);意图模糊则直接采用最佳实践默认值,并自动打开高精度评审。
- 起草草稿落在
.omo/drafts/<slug>.md,这是压缩上下文后的续跑点,包含意图、决策、审批门。 - 你点头批准只授权"写计划",不授权执行。执行是另一条命令。
- 缺口分析
plan-consultant把主 agent 脑子里的隐含前提逼到纸面上。 - 评审轮次
plan-reviewer一轮只看一份完整计划,只驳倒有证据的阻塞项;驳回就改完重提,只剩备注则视为通过。 - 定稿计划落到
.omo/plans/<slug>.md,每条可执行项是零缩进的- [ ] N. 标题,带引用、验收标准、QA 场景和推荐的执行类别。
执行阶段
命令是 /ulw-execute [plan-name] [--worktree <path>] [--make-pr] [--ship]。发生的事情按顺序是:
- 选计划:读
.omo/boulder.json,有活跃工作就续上;没有就按名字匹配、自动选中唯一一份,或就一个问题问你。 - 登记目标与 todo:每个勾选框一条,全部先建好,而不是走一步加一条。
- 逐项执行:判断轻/重,拆成 worker 粒度,并行的子任务一次性全发出去。
- 五道验收门:重读计划、自动验证、手动 QA 产物、对抗式 QA、清理回执。证据写进
.omo/ulw-execute/ledger.jsonl;worker 说"做完了"不算,要有独立评审员确认才能打勾。 - 收尾:跑计划级最终验证,同步
.omo/状态,按需走 PR 流程,打印ORCHESTRATION COMPLETE。
断了能续
这是它相对多数 agent 的真实差异点。计划执行的状态在外置文件里,不在上下文里:
周一 09:00 /ulw-plan "做用户认证" → 计划定稿、评审通过
周一 09:40 /ulw-execute → 建成 boulder 状态,任务 1–2 落地
周一 10:30 会话结束(关机 / 断网 / 崩了)
周一 14:00 /ulw-execute → "Resuming 'user-auth' - 2 of 8 tasks complete"
→ 从任务 3 继续
空闲时它会自己续跑,最多连续 8 次;每轮用户输入也会追加一条"读状态、按计划推进"的提醒。/stop-continuation 一次性关掉这些续跑机制。
对抗版本:/hyperplan
觉得一个规划者不够严,/hyperplan 会组建一支互相攻击的评审队,先把计划互相驳一遍再定稿。产物还是同一份 .omo/plans/*.md。它依赖 team mode 开启。
另一种"持续":/goal
/goal "目标" 给会话挂一个持久目标,每次空闲都重新注入续跑提示,直到 agent 在完成审计后主动标记完成。/goal pause 暂停续跑但保留目标,/goal clear 清除。目标子系统默认关闭,需要在配置里打开 goal.enabled。
并行:mass ulw 与 team mode
mass ulw:有依赖的任务图
当任务之间存在真实的先后关系(任务 C 要等 A、B 完成),关键词 mass ulw 会把工作变成一个 workflow:节点带 id、prompt、category、dependsOn。没有依赖的节点立刻开跑,一条波次跑完解锁下一波。
mass ulw fix every failing test in packages/api, one task per test file 是它文档里的典型例子:一个测试文件一个任务,谁先跑完谁解锁后续。
- 失败节点可以
retry、send(补一句指示)或amend(改任务),不用重跑已完成的。 - 一次 run 覆盖一个阶段,下一阶段是新 run。
- 桌面端的 Workflows 面板能看到每个任务的状态、依赖图和实时输出。
team mode:成员之间能对话
和 task 派活的区别是成员之间可以互相发消息,共享一份任务列表。默认关闭,要在配置里显式打开:
{
"team_mode": {
"enabled": true,
"max_parallel_members": 4,
"max_members": 8,
"tmux_visualization": false
}
}
打开后多出 12 个 team_* 工具:创建/销毁、成员关机协商、成员间信箱、共享任务列表、状态汇总。tmux_visualization 能给每个成员开一个 pane,实时看它在敲什么(需要跑在 tmux 里)。
边界写得很明确:最多 8 个成员、4 个并发;单条消息 32 KB,单收件人未读 256 KB;每次 run 最多 1 万条消息、120 分钟、每成员 500 轮。不允许嵌套团队,成员也不能再拉团队。team_send_message 是 fire-and-forget,没有同步等待。
任务彼此独立、只是量大 → mass ulw;任务互相依赖且需要中途交换发现 → team mode;一条线做到底 → 普通 ulw。多数人第三档就够。
模型路由:名字你几乎不用记
主会话模型有三种定法,优先级从高到低:命令行/会话里显式指定 > 配置文件里写死的具体模型 > 按意图选的 profile > 引擎默认。
profile 只写意图,不写型号:
{ "model_profile": "capable" } // 最强的通用模型,按序取第一个可用的
{ "model_profile": "deep work" } // 最重的推理
{ "model_profile": "anthropic/claude-opus-5-5" } // 带 / 就是钉死
会话开始时它会逐个走这条链,选第一个你已连上的 provider,并打印一条通知告诉你跳过了哪些档。这个切换只作用于当前会话,不写回 settings.json。
九个类别,一个路由表
| 类别 | 什么时候用 | 文档里的默认模型 |
|---|---|---|
quick | 机械改动、单文件、样板、配置 | GPT-6 Luna Fast(low) |
unspecified-low | 小活,但不属于任何类别 | Claude Sonnet 5.5(medium) |
unspecified-high | 跨几个文件、有现成模式的标准功能 | Claude Opus 5.5(medium) |
visual-engineering | 前端、UI/UX、样式、动画 | Fable 5.1(max)→ Opus 5.5 → Kimi K3 |
writing | 文档、散文、技术写作 | Claude Opus 5.5(low) |
deep / deep-low / deep-high | 纠缠的调试、跨模块、研究型任务;难度升级走 high | GPT-6.1 Sol(medium)/ GPT-6 Astra(high) |
ultrabrain | 一个真正难的逻辑问题,给目标而不是步骤 | GPT-6 Astra(max) |
artistry | 创意、非常规设计 | Fable 5.1(max)→ Kimi K3 → Opus 5.5 |
architect | 模块边界、拆解、权衡(只读咨询) | 配置项里显式指定,文档未给固定默认链 |
型号会随上游更新频繁变动,以上是 2026-10-27 文档里的默认链。以 omo doctor --models 的实时输出为准。
每个类别和每个专家都是一条回退链,按序找第一个你已连上的 provider。所以某些类别在你没接对应模型家族时会显示"不可用",而不是静默换成别的家族——这点比"看起来能用其实降级"要诚实。
覆盖某一格
{
"$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/dev/assets/omo.schema.json",
"categories": {
"ultrabrain": { "model": "openai/gpt-6-astra", "reasoning": "max" },
"writing": { "model": "anthropic/claude-opus-5-5", "reasoning": "low" }
},
"agents": {
"explore": { "models": ["openai/gpt-6-luna-fast"], "reasoning": "low" },
"librarian": { "models": ["openai/gpt-6-luna-fast"] }
}
}
model单个,models是有序回退链;后者是推荐写法。- 不想让某个模型出现在任何链里,用
exclude_models,比逐个类别删更彻底。 - 配置分两级:
~/.omo/omo.jsonc(用户)与项目里的.omo/omo.jsonc;离得近的那份赢。 reasoning统一取off / minimal / low / medium / high / xhigh / max / auto,旧的variant、reasoningEffort是废弃别名。
工程底座:让它不只是"会派活的壳"
编排之上的这些能力,决定了它能不能干真活。挑几个对使用影响最大的。
LSP 与结构化编辑
内置 lsp MCP 提供 9 个工具:诊断(编译前就知道错)、符号大纲、跳转定义、全库引用、跨文件重命名、格式化。对"改一个别名"这类任务,引用查询比全文搜索可靠得多。
哈希锚定编辑(默认关)
常见失败是模型复述不出原文那几行,编辑就失败。OmO 的做法是给每行 LINE#ID 哈希,应用前校验,过期就拒。这个能力默认关闭,要显式打开 hashline_edit: true。
AGENTS.md 分层注入
读某个文件时,从该文件目录一路向上到项目根,把沿途的 AGENTS.md 依次注入。项目根写全局约定,子目录写局部约束,不需要手工挂载。
技能带 MCP
技能不只是段落文字,可以捆绑自己的 MCP server,按任务临时挂载。二十个工具不会常驻上下文,只在需要时出现。内置技能包括 debugging、frontend、playwright、git-master、review-work、security-review、visual-qa 等;浏览器相关会按可用的 provider 只激活一个。
Claude Code 兼容层
它能直接读 Claude Code 的配置资产:命令(.claude/commands/)、技能(.claude/skills/)、agent(.claude/agents/)、MCP(.mcp.json、~/.claude.json)、条件规则(.claude/rules/)。迁移成本因此很低,也能逐项关掉:
{ "claude_code": { "mcp": false, "hooks": false, "plugins": false } }
非交互运行
omo run "<message>" 跑一次性会话,退出条件很严:主会话空闲、所有 todo 完成或取消、所有派生会话空闲、没有续跑挂起。--json 出结构化结果,--on-complete 接后续命令,适合进 CI 或脚本。
遥测与隐私
默认开启匿名遥测(PostHog,设备标识做 SHA-256 哈希)。关掉:OMO_SEND_ANONYMOUS_TELEMETRY=0 或 OMO_DISABLE_POSTHOG=1,插件配置里也可以写 "telemetry": false。会话内 /bug 提交报告前可以完整预览:环境、脱敏后的配置、会话记录、设备名、安装 ID 都会列出来给你看。
命令速查
会话内
| 命令 | 作用 |
|---|---|
/ulw-plan | 进入规划模式,访谈你并产出计划文件 |
/ulw-execute | 执行已批准的计划,可带 --worktree / --make-pr / --ship |
/hyperplan | 对抗式规划(需要 team mode) |
/goal | 挂/查看/暂停/恢复/清除会话目标 |
/refactor | 带 LSP、AST、架构分析与 TDD 验证的重构 |
/handoff | 生成交接摘要,方便换会话继续 |
/stop-continuation | 停掉所有续跑机制 |
/remove-ai-slops | 清掉分支改动里的 AI 味代码 |
/resume · /sessions · /help | 历史会话 / 帮助 |
终端
| 命令 | 作用 |
|---|---|
omo | 进入交互会话 |
omo setup | 迁移向导,从 OpenCode / LazyCodex 搬配置 |
omo doctor | 环境诊断;--models 看模型解析结果,--verbose/--json 辅助 |
omo run "..." | 非交互执行,完成所有条件才退出 |
omo -c / omo -r | 续上次会话 / 打开选择器 |
omo account show|token|export | 账号凭据的机器接口,JSON 输出,退出码有细分语义 |
bunx oh-my-openagent install | OpenCode / Codex 版的安装器(可 --platform、各订阅 flag) |
bunx oh-my-openagent doctor | 插件侧诊断 |
bunx oh-my-openagent mcp oauth | MCP server 的 OAuth 登录 / 登出 / 状态 |
omo-agent-toolkit config migrate | 把旧配置迁移到统一的 ~/.omo/omo.jsonc,支持 --dry-run |
omo-agent-toolkit worktree-sweep | 清理已合并、干净的陈旧 worktree,默认 dry-run |
omo-agent-toolkit 是发布包里的短名 bin;oh-my-openagent 与 oh-my-opencode 是同一份 CLI 的两个名字。
该不该用:把营销话术剥掉
这个项目在 GitHub 上热度极高(7 万星),README 的措辞也很有煽动力。以下是我按文档与代码结构做出的判断,不是转述。
真实的价值
- 把"多模型"落到可配置的路由表上,而不是概念演示
- 计划与执行分离,且状态外置,断线可续
- 每步验收有证据账本,worker 自述不作数
- 对 Claude Code 资产兼容,迁移成本低
- 只读专家 + 只读记忆侧车的边界设计克制
要留意的代价
- 迭代极快:版本号已到 5.1.x,主分支是
dev,行为会漂移 - 成本模型复杂——省在便宜任务,贵在主会话与评审轮
- 没有对应订阅的类别会直接不可用,不是降级
- 遥测默认开;企业环境要先关
- 许可证是 source-available,不是 OSI 开源
适合谁
- 已经在用两个以上模型订阅,想让它们各干各擅长的事。
- 经常处理"半天说不清上下文"的中大型改造,愿意先花 10 分钟换计划。
- 在意可审计性:每个勾都有人验、有证据、断了能续。
不适合谁
- 只想改一行配置、跑个脚本——一个更强的单模型 agent 更省事。
- 环境不允许遥测、或需要 OSI 许可才能在公司内部推广。
- 团队没有统一订阅,很多类别会长期显示不可用。
试用的最小路径
- 装 Native 版:
curl -fsSL https://get.omo.dev/install.sh | bash。 omo进入,/login接你已有的订阅。omo doctor --models看一眼哪些类别真的可用——这一步能提前暴露"模型没接上"的问题。- 挑一个真实的中等任务,直接打
ulw,不要先上 plan 流程。 - 觉得验证不够,再试
/ulw-plan→/ulw-execute;觉得任务量大但独立,再用mass ulw。
资料与出处
- 仓库主页 · 官网 · 在线文档
- What Is Oh My OpenAgent? —— 产品定位与 profile
- Keywords —— 关键词与匹配规则
- Orchestration System Guide —— 计划、执行、boulder 状态
- Features Reference —— 类别、工具、技能、钩子全表
- Team Mode · CLI Reference
- Ultrawork Manifesto —— 作者的设计立场
本文基于 2026-10-27 的 dev 分支文档与 v5.1.48 发布版本整理;型号、默认链与命令会随版本变化,以仓库文档与 omo doctor 输出为准。