harness 对外说一种流。Codex、Claude 等在里面各跑各的。
AGENT ENGINE SURVEY
把几套 Agent 引擎摊开看
这页只回答一个问题: 这些项目里,Codex 到底是从哪里进来的,谁握着主循环, 事件又被翻成什么样子。
READING MAP
先看四个判断
daemon 从卡片取任务。runtime 选 Codex 时才进入 Codex provider。
Hermes 有自己的 session、tools、MCP、Kanban。Codex 是其中一种后端选择。
Engine Adapter 收口。Codex 还能走 appserver fork,再 CLI resume。
LAYER VIEW
谁握着主循环,一眼分清
真正要看的不是“支不支持 Codex”,而是谁在做 agent 的主循环。 LiteLLM、agent-kanban 把 Codex 当后端;Hermes 自己跑 agent; Tobatsu 让 native CLI 保持主角。
LITELLM DETAIL
LiteLLM:Codex 被包成 provider
LiteLLM 的重点是“外口像一种协议”。Codex 不是被重写了, 只是被 provider 包住,然后事件被翻成 harness 想要的形状。
AGENT-KANBAN DETAIL
agent-kanban:卡片派给 Codex provider
agent-kanban 的核心不是 Codex 本身,而是“任务卡如何被机器接走”。 Codex 只是 provider registry 里的一个选项。
HERMES DETAIL
Hermes:自己跑 agent,Codex 是可选后端
Hermes 比较像“自己有完整 agent,再选择模型和 runtime”。 所以它和 LiteLLM、agent-kanban 的 provider 包装不一样。
INSFORGE DETAIL
InsForge:它不是跑 agent 的地方
这类项目可以借鉴工具面和资源面,但不能拿来对比 agent runtime。 它服务 agent,不替 agent 跑。
TOBATSU COMPARE
Tobatsu:你现在这套不是没有 Adapter
所以现在的问题不是“要不要有 Engine Adapter”。 你已经有了。真正的取舍是:以后要不要再多一层 SDK provider 接法。 这不是今天必须改的事。
CODE REFERENCES
源码定位,方便回头查
`src/lite-harness-sdk/server/session.mjs` 调 `provider.createRuntime()`。
`providers/codex/index.mjs` 里 `new Codex()`、`startThread()`、`runStreamed()`。
`packages/cli/src/providers/registry.ts` 注册 `codexProvider`。
`providers/codex.ts` 里 `startThread()` / `resumeThread()`,输出 `AgentEvent`。
`hermes_cli/runtime_provider.py` 解析 `openai-codex`。
`codex_runtime_switch.py` 切 `auto` / `codex_app_server`。
`engine_profiles.py` 的 Adapter 负责 launch / resume / fork。
`codex_appserver.py` 调 `thread/fork`,`subprocess_runner.py` 再 CLI resume。
最短结论: LiteLLM 和 agent-kanban 是“把 Codex 包成可插拔后端”; Hermes 是“自己跑 agent,再选择 Codex 相关后端”; Tobatsu 是“保留 CLI/native 能力,由 Adapter 收口”。