AIAGENT ai-agent / omo-orchestration-guide · 2026-10-27

harness / orchestration · github.com/code-yeongyu/oh-my-openagent

OmO 把一条 prompt
拆成一张排班表

oh-my-openagent(简称 OmO)是一个多模型编排的 agent harness:你只打一个 ulw, 主 agent 负责读代码、拆任务、派活、验收;真正动手的是按"任务类型"调度的 worker, 每一类跑在最适合它的模型上。它不是又一个套壳,而是把"一个人干所有事"换成"一支按型号排班的队伍"。

Latest release
v5.1.48 · 2026-10-25
Stars / forks
70.4k / 5.8k
Stack
TypeScript · Bun · Rust
License
SUL-1.0(source-available)
01

它到底是什么

先把名词拆干净。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 项目陆续抄过去。

02

三条产品线,先选一条

同一个项目对外有三种形态,装哪种取决于你原来的习惯。它们的配置文件、可用工具集并不完全一样,别混着看文档。

形态入口适合特征
OmO Native omo
npm 包 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
03

关键词:用词而不是命令切换模式

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。

04

编排骨架:谁派活,谁能写文件

理解 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 节。

05

两条工作路径:直接干,还是先立字据

路径 A:一个 ulw 直接开工

适合"目标清楚、上下文麻烦"的活。agent 自己探索、自己写实现笔记、自己拆、自己验。它不会在执行中途回头问你"要不要继续",也不会因为某个子任务失败就停工。

复杂度和说服力都在验证环节:每一小步都要有证据(测试、命令输出、界面截图),而不是"我做完了"。

路径 B:/ulw-plan → 批准 → /ulw-execute

适合多天工程、生产改动、需要留下决策痕迹的工作。计划模式最反常识的一点:它很粘。进入之后,"do X""fix X""just do it" 全都被理解成"plan X"。

  1. 探索并行派 explore / librarian,必要时拉 architect 与 ultrabrain 做只读设计咨询。
  2. 判断要不要访谈你意图清楚就只问真正属于你的决策(不可逆、花钱、破坏性);意图模糊则直接采用最佳实践默认值,并自动打开高精度评审。
  3. 起草草稿落在 .omo/drafts/<slug>.md,这是压缩上下文后的续跑点,包含意图、决策、审批门。
  4. 你点头批准只授权"写计划",不授权执行。执行是另一条命令。
  5. 缺口分析plan-consultant 把主 agent 脑子里的隐含前提逼到纸面上。
  6. 评审轮次plan-reviewer 一轮只看一份完整计划,只驳倒有证据的阻塞项;驳回就改完重提,只剩备注则视为通过。
  7. 定稿计划落到 .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。

06

并行: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。多数人第三档就够。

07

模型路由:名字你几乎不用记

主会话模型有三种定法,优先级从高到低:命令行/会话里显式指定 > 配置文件里写死的具体模型 > 按意图选的 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纠缠的调试、跨模块、研究型任务;难度升级走 highGPT-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 是废弃别名。
08

工程底座:让它不只是"会派活的壳"

编排之上的这些能力,决定了它能不能干真活。挑几个对使用影响最大的。

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 都会列出来给你看。

09

命令速查

会话内

命令作用
/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 installOpenCode / Codex 版的安装器(可 --platform、各订阅 flag)
bunx oh-my-openagent doctor插件侧诊断
bunx oh-my-openagent mcp oauthMCP 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 的两个名字。

10

该不该用:把营销话术剥掉

这个项目在 GitHub 上热度极高(7 万星),README 的措辞也很有煽动力。以下是我按文档与代码结构做出的判断,不是转述。

真实的价值

  • 把"多模型"落到可配置的路由表上,而不是概念演示
  • 计划与执行分离,且状态外置,断线可续
  • 每步验收有证据账本,worker 自述不作数
  • 对 Claude Code 资产兼容,迁移成本低
  • 只读专家 + 只读记忆侧车的边界设计克制

要留意的代价

  • 迭代极快:版本号已到 5.1.x,主分支是 dev,行为会漂移
  • 成本模型复杂——省在便宜任务,贵在主会话与评审轮
  • 没有对应订阅的类别会直接不可用,不是降级
  • 遥测默认开;企业环境要先关
  • 许可证是 source-available,不是 OSI 开源

适合谁

  • 已经在用两个以上模型订阅,想让它们各干各擅长的事。
  • 经常处理"半天说不清上下文"的中大型改造,愿意先花 10 分钟换计划。
  • 在意可审计性:每个勾都有人验、有证据、断了能续。

不适合谁

  • 只想改一行配置、跑个脚本——一个更强的单模型 agent 更省事。
  • 环境不允许遥测、或需要 OSI 许可才能在公司内部推广。
  • 团队没有统一订阅,很多类别会长期显示不可用。
真正的判断标准不是它有几个模型,而是你介入的次数有没有变少。如果用了之后你还是要不停纠正它,那这套编排对你就是负收益。 — 本文立场

试用的最小路径

  1. 装 Native 版:curl -fsSL https://get.omo.dev/install.sh | bash。
  2. omo 进入,/login 接你已有的订阅。
  3. omo doctor --models 看一眼哪些类别真的可用——这一步能提前暴露"模型没接上"的问题。
  4. 挑一个真实的中等任务,直接打 ulw,不要先上 plan 流程。
  5. 觉得验证不够,再试 /ulw-plan → /ulw-execute;觉得任务量大但独立,再用 mass ulw。
11

资料与出处

本文基于 2026-10-27 的 dev 分支文档与 v5.1.48 发布版本整理;型号、默认链与命令会随版本变化,以仓库文档与 omo doctor 输出为准。