Codex 应用服务器运行时
Hermes 可选择将 openai/* 和 openai-codex/* 的请求交由 Codex CLI 应用服务器 处理,而非自行运行工具循环。启用后,终端命令、文件编辑、沙箱操作以及 MCP 工具调用均在 Codex 的运行时环境中执行 —— Hermes 成为围绕它的外壳(会话数据库、斜杠命令、网关、记忆与技能回顾)。
此功能为可选开启。默认情况下 Hermes 行为保持不变,除非你主动切换该开关。Hermes 永远不会自动将你路由至该运行时。
为何使用?
- 使用你的 ChatGPT 订阅账户 运行 OpenAI 代理任务(无需 API 密钥),采用与 Codex CLI 相同的认证流程。
- 使用 Codex 自身的工具集和沙箱环境 ——
shell用于终端读写/搜索,apply_patch用于结构化编辑,update_plan用于规划,所有操作均在 seatbelt/landlock 沙箱保护下运行。 - 原生 Codex 插件 —— Linear、GitHub、Gmail、日历、Canva 等 —— 通过
codex plugin安装的插件会自动迁移并在你的 Hermes 会话中激活。 - Hermes 更丰富的工具能力随行 —— web_search、web_extract、浏览器自动化、视觉识别、图像生成、技能系统以及 TTS 功能,通过 MCP 回调实现。Codex 会回调 Hermes 获取其未内置的工具。
- 记忆与技能提示机制持续生效 —— Codex 的事件被映射为 Hermes 的消息格式,使自我优化循环仍能以正常对话形式处理。
模型实际拥有的工具
这是大多数用户最关心的部分。当启用此运行时后,模型在执行你的回合时,拥有三个独立的工具来源:
1. Codex 内置工具集(始终启用)
这些工具随 codex app-server 一同提供 —— 无需 Hermes 参与,无需 MCP,也无需插件。一旦运行时启动,五个工具立即可用:
shell—— 在沙箱内运行任意 shell 命令。模型借此读取文件(cat,head,tail)、写入文件(echo > foo, heredocs)、搜索文件(find,rg,grep)、导航目录(ls,cd)、运行构建、管理进程等,完成你在 bash 中可做的一切。apply_patch—— 以 Codex 的补丁格式应用多文件结构化变更。模型用于非简单代码修改(如添加函数、跨文件重构);单次写入仍可通过 shell heredocs 实现。update_plan—— Codex 内部的任务/计划追踪器。相当于 Hermes 的todo工具,但完全由 Codex 运行时管理。view_image—— 将本地图片文件载入对话,供模型查看。web_search—— Codex 自带网页搜索功能(需配置)。Hermes 同时通过下方回调暴露web_search(基于 Firecrawl);模型可自由选择偏好。
因此,任何你本打算通过终端完成的操作——读/写/搜/找/运行——Codex 都原生支持。沙箱配置(默认为 :workspace,启用运行时时设定)决定哪些内容可写。
2. 原生 Codex 插件(从你的 codex plugin 安装自动迁移)
启用运行时后,Hermes 查询 Codex 的 plugin/list RPC 接口,并为每个已安装的插件创建一条 [plugins."<name>@openai-curated"] 条目。插件本身由 Codex 管理,并通过 Codex 自身 UI 完成一次授权。
示例(OpenClaw 线程中被称为“适合 YouTube 视频”的那些):
- Linear —— 查找/更新任务
- GitHub —— 搜索代码、查看 PR、评论
- Gmail —— 读取/发送邮件
- Google 日历 —— 创建/查找事件
- Outlook 日历/邮件 —— 通过 Microsoft 连接器实现相同功能
- Canva —— 生成设计
- ……以及其他通过
codex plugin marketplace add openai-curated+codex plugin install ...安装的内容
未迁移的内容:
- 尚未安装的插件 —— 请先在 Codex 中安装。
- ChatGPT 应用市场条目(
app/list)—— 这些已因账号认证而在 Codex 内自动启用。
3. Hermes 工具回调(MCP 服务端,注册于 ~/.codex/config.toml)
Hermes 注册自身为一个 MCP 服务端,以便 Codex 在需要时回调获取其未内置的工具。可通过回调访问以下功能:
web_search/web_extract—— 基于 Firecrawl;通常比普通爬虫更干净地提取结构化内容。browser_navigate/browser_click/browser_type/browser_press/browser_snapshot/browser_scroll/browser_back/browser_get_images/browser_console/browser_vision—— 通过 Camofox 或 Browserbase 实现完整浏览器自动化。vision_analyze—— 调用独立视觉模型来分析图像(不同于 Codex 的view_image,后者仅用于加载图像到对话中)。image_generate—— 通过 Hermes 的 image_gen 插件链生成图像。skill_view/skills_list—— 从 Hermes 的技能库中读取内容。text_to_speech—— 通过 Hermes 配置的语音合成提供商实现 TTS。
当模型需要这些功能时,Codex 通过 stdio MCP 启动 hermes_tools_mcp_server 子进程,调用经由 model_tools.handle_function_call()(与 Hermes 默认运行时相同的代码路径)分发,结果如同其他 MCP 响应一样返回给 Codex。
此运行时不可用的功能
这四项 Hermes 工具依赖于正在运行的 AIAgent 上下文(中间状态),而无状态的 MCP 回调无法驱动它们。若你需要其中任一项,请切换回默认运行时(/codex-runtime auto):
delegate_task—— 启动子代理memory—— Hermes 的持久化记忆存储session_search—— 跨会话搜索todo—— Hermes 的待办事项存储(Codex 的update_plan是其运行时等价物)
工作流特性(/goal、看板、定时任务)
/goal(Ralph 循环)
在此运行时中正常工作。 目标在 state_meta 中按会话 ID 持久化,后续提示作为普通用户消息通过 run_conversation() 回传,Codex 以原生方式执行下一回合。目标判断器通过辅助客户端(在 config.yaml 中通过 auxiliary.goal_judge 配置)运行,与当前运行时无关。若 Codex 在审批环节卡住,判断器的“阻塞,需用户输入”结论可作为清晰退出机制。
需要注意的一点是: 每个后续提示都是一次全新的 Codex 回合,意味着 Codex 会从头重新评估命令审批策略。如果你正在进行一个长时间的目标且涉及大量写入操作,相比单一会话内的任务,你会遇到更多审批提示。建议设置 default_permissions = ":workspace"(Hermes 在启用运行时时会自动设置),以避免简单的项目空间写入也需要频繁确认。
看板(多代理工作树调度)
在此运行时中可用,但有一个细微依赖。 看板调度器会为每个工作代理启动独立的 hermes chat -q 子进程,读取用户的配置 —— 这意味着如果 model.openai_runtime: codex_app_server 全局设置,则工作代理也会以 Codex 运行时启动。
在 Codex 运行时的工作代理内部,以下功能可用:
- Codex 完整工具集(shell、apply_patch、update_plan、view_image、web_search)—— 代理可原生完成实际任务
- 已迁移的 Codex 插件 —— 如 Linear、GitHub 等
- Hermes 工具回调:browser_*、vision、image_gen、skills、TTS以下是你提供的英文文档的中文翻译,已根据技术上下文进行准确、流畅的表达,同时保留所有占位符(如
HERMESINLINEXXXTOKEN)和结构化内容:
同样有效的原因在于 MCP 回调暴露了这些功能:
kanban_complete/kanban_block/kanban_comment/kanban_heartbeat— 工作员交接工具。它们读取环境变量HERMES_KANBAN_TASK(由调度器设置),正确控制访问权限,并将数据写入由HERMES_KANBAN_DB锁定的每个看板的 SQLite 数据库。若回调中没有这些工具,运行时上的工作员虽可执行任务,却无法回传结果,最终因调度器超时而挂起。kanban_show/kanban_list— 仅读取的看板查询工具,供工作员检查自身上下文。kanban_create/kanban_unblock/kanban_link— 仅限协调器使用的操作。适用于在 codex 运行时上运行的协调器代理,需要分派新任务时使用。
看板工具受 HERMES_KANBAN_TASK 环境变量保护,该变量由调度器设置,并传递至 codex 子进程(codex 继承环境变量),再由其传递给启动的 hermes-tools MCP 服务器子进程。因此,这些工具能正确识别当前任务 ID 并实现恰当的权限控制。对于 Codex 应用服务器工作器,当 HERMES_KANBAN_TASK 存在时,Hermes 还会传递特定的应用服务器沙箱覆盖规则:保持 workspace-write 沙箱机制,仅将当前看板目录(由 HERMES_KANBAN_DB 推导得出)作为额外可写根目录,并默认禁用网络连接。这避免了脆弱的 :danger-no-sandbox 临时方案,同时允许 kanban_complete 和 kanban_block 更新看板数据库。
定时任务(Cron Jobs)
未专门测试。 定时任务通过 cronjob` → `AIAgent.run_conversation 路径运行,与 CLI 使用相同的代码路径。如果定时任务配置中包含 openai_runtime: codex_app_server,则会在 codex 上运行。同样的工具可用性规则适用:codex 内建功能 + 插件 + MCP 回调可用,但代理循环类工具(如 delegate_task, memory, session_search, todo)不可用。若你的定时任务依赖这些工具,请将其作用范围限定在使用默认运行时的配置文件中。
权衡对比
| 功能 | Hermes 默认运行时 | Codex 应用服务器(可选) |
|---|---|---|
delegate_task 子代理 | ✅ 可用 | ❌ 不可用 — 需要代理循环上下文 |
memory, session_search, todo | ✅ 可用 | ❌ 不可用 — 需要代理循环上下文 |
web_search, web_extract | ✅ 可用 | ✅ 可用(通过 MCP 回调) |
| 浏览器自动化(Camofox/Browserbase) | ✅ 可用 | ✅ 可用(通过 MCP 回调) |
vision_analyze, image_generate | ✅ 可用 | ✅ 可用(通过 MCP 回调) |
skill_view, skills_list | ✅ 可用 | ✅ 可用(通过 MCP 回调) |
text_to_speech | ✅ 可用 | ✅ 可用(通过 MCP 回调) |
Codex 的 shell(终端读写/搜索/查找/运行) | — | ✅ 可用(Codex 内建) |
Codex 的 apply_patch(结构化多文件编辑) | — | ✅ 可用(Codex 内建) |
Codex 的 update_plan(运行时待办事项) | — | ✅ 可用(Codex 内建) |
Codex 的 view_image(加载图片到对话) | — | ✅ 可用(Codex 内建) |
| Codex 沙箱(安全带/landlock、配置文件) | — | ✅ 可用(Codex 内建) |
| ChatGPT 订阅认证 | — | ✅ 可用(通过 openai-codex 提供商) |
| 原生 Codex 插件(Linear、GitHub 等) | — | ✅ 可用(自动迁移) |
| 用户自定义 MCP 服务器 | ✅ 可用 | ✅ 可用(自动迁移到 codex) |
| 内存 + 技能回顾(后台) | ✅ 可用 | ✅ 可用(通过项目投影) |
| 多轮对话 | ✅ 可用 | ✅ 可用 |
/goal(Ralph 循环) | ✅ 可用 | ✅ 可用 |
| 看板工作员分派 | ✅ 可用 | ✅ 可用(通过回调) |
| 看板协调器工具 | ✅ 可用 | ✅ 可用(通过回调) |
| 所有网关平台 | ✅ 可用 | ✅ 可用 |
| 非 OpenAI 提供商 | ✅ 可用 | ❌ 不适用 — 仅限 OpenAI/Codex 作用域 |
先决条件
- 已安装 Codex CLI:
` ```bash npm i -g @openai/codex codex --version # 0.130.0 or newer - 完成 Codex OAuth 登录。
codex 子进程会读取~/.codex/auth.json。有两种方式填充该值: ` ```bash codex login # writes tokens to ~/.codex/auth.jsonHermes 自身的 ``hermes auth login codex`` 会写入 ``~/.hermes/auth.json`` —— 这是一个独立会话。**如果你尚未执行过,需单独运行 ``codex login``。** - (可选)安装你想要的 Codex 插件。
当启用该运行时后,Hermes 会自动迁移你通过 Codex CLI 已安装的精选插件:
` ```bash codex plugin marketplace add openai-curatedthen via codex's TUI, install Linear / GitHub / Gmail / etc.
Hermes 将自动发现这些插件,并向 ``~/.codex/config.toml`` 中写入 ``[plugins."<name>@openai-curated"]`` 条目。
启用方法
在 Hermes 会话中执行:
/codex-runtime codex_app_server
该命令将:
- 验证
codexCLI 是否已安装(若未安装则阻塞并提示安装建议); - 将
model.openai_runtime: codex_app_server持久化保存至config.yaml; - 将用户自定义的 MCP 服务器从
~/.hermes/config.yaml迁移至~/.codex/config.toml; - 自动发现并迁移已安装的原生 Codex 插件(如 Linear、GitHub、Gmail、日历、Canva 等),通过查询 Codex 的
plugin/listRPC 实现; - 将 Hermes 自有的工具注册为一个 MCP 服务器,以便 codex 子进程可回调调用 codex 本身不内置的工具;
- 写入
default_permissions = ":workspace",使沙箱允许在工作区中自由写入,无需对每次操作都弹出确认; - 输出已迁移的内容。更改将在 下次会话 生效 —— 当前缓存的代理仍保留旧的运行时,以确保提示缓存有效性。
别名:/codex-runtime on, /codex-runtime off, /codex-runtime auto。
如需检查当前状态而不做任何更改:
/codex-runtime
你也可以手动在 ~/.hermes/config.yaml 中设置:
model:
openai_runtime: codex_app_server # default is "auto" (= Hermes runtime)
自我提升循环(记忆 + 技能提醒)
Hermes 的后台自我提升机制在计数阈值触发时启动:
- 每 10 个用户提示 → 分叉一个审查代理,分析对话内容,判断是否应将信息保存至记忆;
- 每 10 次单轮内的工具迭代 → 同理,用于技能评估(
skill_manage写入)。
两者在 codex 运行时下依然正常工作。 codex 路径会将每个完成的 commandExecution / fileChange / mcpToolCall / dynamicToolCall 项投影为一个合成的 assistant tool_call + tool 结果消息,因此当审查运行时,其看到的结构与默认 Hermes 运行时完全一致。
如何保持等效性:
| 默认运行时 | Codex 运行时 | |
|---|---|---|
_turns_since_memory 增量 | 每次用户提示,在 run_conversation 预循环阶段递增 | 相同代码路径,在提前返回前递增 |
_iters_since_skill 增量 | 在聊天补全循环中每执行一次工具迭代即递增 | 由 turn.tool_iterations 在 codex 轮次返回后递增 |
记忆触发(_turns_since_memory >= _memory_nudge_interval) | 在预循环中计算,响应后触发 | 在预循环中计算,传递至 codex 辅助函数 |
技能触发(_iters_since_skill >= _skill_nudge_interval) | 在循环结束后计算 | 在 codex 轮次结束后计算 |
_spawn_background_review(messages_snapshot=..., review_memory=..., review_skills=...) | 任一触发条件满足时调用 | 任一触发条件满足时以相同方式调用 |
一个小细节:审查分叉本身需要调用 Hermes 的代理循环工具(memory, skill_manage),而这需要 Hermes 自身的调度机制。因此,当父代理运行在 codex_app_server 时,审查分叉会被 降级为 codex_responses —— 保持相同的 OAuth 凭证和 openai-codex 提供商,但直接调用 OpenAI 的 Responses API,由 Hermes 主导循环流程,从而保证代理循环工具可用。这一过程对用户完全透明。
最终效果:启用 codex 运行时后,你的记忆与技能提醒将继续按预期精准触发,与之前无异。
审批机制说明
Codex 在执行命令或应用补丁前会请求审批。这些请求会被转换为 Hermes 标准的“危险命令”提示:
╭───────────────────────────────────────╮
│ Dangerous Command │
│ │
│ /bin/bash -lc 'echo hello > foo.txt' │
│ │
│ ❯ 1. Allow once │
│ 2. Allow for this session │
│ 3. Deny │
│ │
│ Codex requests exec in /your/cwd │
╰───────────────────────────────────────╯
- 仅允许一次 → 仅批准此单一命令;
- 本会话内始终允许 → Codex 不会再次提示类似命令;
- 拒绝 → 命令被拒绝;Codex 继续以只读模式运行。
对于 apply_patch(文件编辑)的审批,当 codex 通过对应的 fileChange 项提供数据时,Hermes 会显示变更摘要(1 add, 1 update: /tmp/new.py, /tmp/old.py)。
权限配置文件(Permission Profiles)
(此处原文未提供具体内容,建议后续补充)Codex 内置了三个权限配置文件:
:read-only— 无写入权限;每个 shell 命令都需要审批:workspace— 允许在当前工作区进行写入操作,无需提示(启用运行时后 Hermes 的默认设置):danger-no-sandbox— 完全禁用沙箱(除非你完全理解其含义,否则不要使用)
你可以通过在 Hermes 管理区块外覆盖默认设置来修改配置:
default_permissions = ":read-only"
(只要你的修改位于 # managed by hermes-agent 标记之外,Hermes 在重新迁移时会保留你的自定义设置。)
辅助任务与 ChatGPT 订阅令牌成本
当此运行时启用且使用 openai-codex 提供商时,辅助任务(标题生成、上下文压缩、视觉自动检测、后台自我改进审查分支)默认会通过你的 ChatGPT 订阅计费,因为 Hermes 的辅助客户端在未设置每项任务的覆盖时,会使用主提供方/模型。
这不仅适用于 codex_app_server — 对现有的 codex_responses 路径也同样适用 — 但在此处更为明显,因为你明确选择了订阅计费模式。
若希望将特定辅助任务路由至更便宜或不同的模型,请在 ~/.hermes/config.yaml 中设置显式覆盖:
auxiliary:
title_generation:
provider: openrouter
model: google/gemini-3-flash-preview
context_compression:
provider: openrouter
model: google/gemini-3-flash-preview
vision_detect:
provider: openrouter
model: google/gemini-3-flash-preview
goal_judge:
provider: openrouter
model: google/gemini-3-flash-preview
自我改进审查分支继承主运行时配置(通过 _current_main_runtime()),Hermes 会自动将其从 codex_app_server 降级为 codex_responses(以便该分支能实际调用 memory 和 skill_manage — Hermes 自身的 agent-loop 工具)。该分支仍使用你的订阅认证,除非你已将辅助任务重定向至其他位置。
安全编辑 ~/.codex/config.toml
Hermes 将其管理的所有内容包裹在两个标记注释之间:
# managed by hermes-agent — `hermes codex-runtime migrate` regenerates this section
default_permissions = ":workspace"
[mcp_servers.filesystem]
...
[plugins."github@openai-curated"]
...
# end hermes-agent managed section
任何 标记之外的内容 都属于你。重新运行迁移(通过 /codex-runtime codex_app_server 或每次切换运行时)时,只会替换管理区块内部内容,而完整保留其上方和下方的用户内容。这意味着你可以:
- 添加 Hermes 不了解的自定义 MCP 服务器
- 若偏好每次操作都提示,可将
default_permissions覆盖为:read-only - 配置仅 Codex 有效的选项(模型、提供方、otel 等)
- 在
[permissions.<name>]表格中添加自定义权限配置文件
任何添加到 管理区块内部 的内容将在下一次迁移时被覆盖。如需对管理区块进行修改,建议提交 issue,我们将为你添加相应功能开关。
多配置文件 / 多租户设置
默认情况下,Hermes 无论激活哪个 Hermes 配置文件,都会将 codex 子进程指向 ~/.codex/。这意味着 hermes -p work 和 hermes -p personal 共享相同的 Codex 认证、插件和配置。对大多数用户而言这是正确行为 — 与直接运行 codex CLI 的结果一致。
如果你希望每个配置文件拥有独立的 Codex 隔离环境(独立认证、独立安装的插件、独立配置),请为每个配置文件显式设置 CODEX_HOME。最清晰的方式是将其指向你 HERMES_HOME 下的一个目录:
# Inside the work profile, you might wrap hermes:
CODEX_HOME=~/.hermes/profiles/work/codex hermes chat
你需要在设置好该 CODEX_HOME 后,重新运行一次 codex login,以确保 OAuth 令牌被写入到该配置文件作用域的位置。之后,hermes -p work 将在隔离的 Codex 状态下运行。
我们不会自动启用此功能,因为迁移现有用户的 ~/.codex/ 会无声地使他们的 Codex CLI 认证失效 — 所有已运行过 codex login 的用户都需重新认证。选择“主动开启”比“意外触发”更安全。
HOME 环境变量透传
Hermes 不会 在启动 codex app-server 子进程时重写 HOME(我们使用 os.environ.copy(),仅叠加 CODEX_HOME 和 RUST_LOG)。这意味着:
- 通过 codex 的
shell工具执行的命令能看到真实的用户HOME,并正确找到~/.gitconfig、~/.gh/、~/.aws/、~/.npmrc等。 - Codex 的内部状态通过
CODEX_HOME保持隔离(默认指向~/.codex/)。
这与 OpenClaw 经过早期实验后确定的边界一致:隔离 Codex 的状态,保留用户的 home 目录不变。(参见 openclaw/openclaw#81562。)
MCP 服务器迁移
Hermes 的 mcp_servers 配置会自动转换为 Codex 所需的 TOML 格式。每次启用运行时都会执行迁移,且具有幂等性 — 重复运行会替换管理部分,但保留任何用户手动编辑的 Codex 配置。
转换内容:
Hermes (config.yaml) | Codex (config.toml) |
|---|---|
command + args + env | stdio 传输 |
url + headers | streamable_http 传输 |
timeout | tool_timeout_sec |
connect_timeout | startup_timeout_sec |
enabled: false | enabled = false |
未迁移内容:
- Hermes 特有的键值,如
sampling(Codex 的 MCP 客户端没有对应项 — 这些会被丢弃,并发出每服务器警告)。
原生 Codex 插件迁移
通过 codex plugin 安装的插件(Linear、GitHub、Gmail、日历、Canva 等)由 Codex 的 plugin/list RPC 发现。对于每个存在 installed: true 的插件,Hermes 会写入一个 [plugins."<name>@openai-curated"] 块,以在你的 Hermes 会话中启用该插件。
这意味着:当你的朋友说“我在我的 Codex CLI 中设置了日历和 GitHub”,并启用 Hermes 的 codex 运行时后,这些插件会自动激活,无需重新配置。
未迁移内容:
- 尚未安装的插件 — 请先在 Codex 中安装。
- Codex 报告
availability != AVAILABLE的插件(安装损坏、OAuth 过期、已从市场移除等)—— 跳过以避免写入会在激活时失败的配置。 - ChatGPT 应用市场条目(按账户的
app/list结果)—— 这些已因账户认证而在 Codex 内部启用。 - 插件 OAuth 认证 — 每个插件只需在 Codex 本身授权一次;Hermes 不会触碰凭证。
Hermes 工具回调(新的 MCP 服务器)
Codex 内建工具集涵盖 shell/file 操作/补丁,但不包含网页搜索、浏览器自动化、视觉识别、图像生成等功能。为在 codex 会话中保持这些能力可用,Hermes 在 ~/.codex/config.toml 中注册自身为一个 MCP 服务器:
[mcp_servers.hermes-tools]
command = "/path/to/python"
args = ["-m", "agent.transports.hermes_tools_mcp_server"]
env = { HERMES_HOME = "/your/.hermes", PYTHONPATH = "...", HERMES_QUIET = "1" }
startup_timeout_sec = 30.0
tool_timeout_sec = 600.0
当模型调用 web_search(或其他暴露的 Hermes 工具)时,codex 通过 stdio 启动 hermes_tools_mcp_server 子进程,请求经由 model_tools.handle_function_call() 分发,最终结果像其他 MCP 响应一样返回给 codex。
可通过回调使用的工具:
web_search, web_extract, browser_navigate, browser_click, browser_type, browser_press, browser_snapshot, browser_scroll, browser_back, browser_get_images, browser_console, browser_vision, vision_analyze, image_generate, skill_view, skills_list, text_to_speech
不可用的工具:
delegate_task, memory, session_search, todo
这些需要正在运行的 AIAgent 上下文(中间循环状态),而无状态的 MCP 回调无法驱动它们。如需使用这些功能,请使用默认的 Hermes 运行时(/codex-runtime auto)。
禁用
随时可切换回:
/codex-runtime auto
在下次会话生效。Codex 管理区块将保留在 ~/.codex/config.toml 中,方便后续重新启用而不丢失配置 — 或者你也可以手动删除它。
限制说明
此运行时为 可选测试版。自 Hermes Agent 2026.5 + Codex CLI 0.130.0 起可用:- 多轮对话支持
- 通过 Hermes UI 完成
commandExecution和fileChange(apply_patch)审批 - MCP 工具调用(已验证与
@modelcontextprotocol/server-filesystem及新版本hermes-tools回调的兼容性) - 原生 Codex 插件迁移(已验证与 Linear / GitHub / 日历库存的兼容性)
- 拒绝/取消路径支持
- 开关切换循环机制
- 内存与技能提示计数器(通过集成测试实时验证)
- 通过 Codex 实现 Hermes web_search(已实时验证:搜索“OpenAI Codex CLI – Getting Started”返回完整端到端结果)
已知限制:
- Hermes 认证与 Codex 认证为独立会话。 为获得最佳用户体验,您需要同时拥有
codex login和hermes auth login codex(运行时使用 Codex 的会话进行 LLM 调用)。这是 Hermes 在_import_codex_cli_tokens中的有意设计——Hermes 不会与 Codex CLI 共享 OAuth 状态,以避免在令牌刷新时相互覆盖。 delegate_task、memory、session_search、todo在此运行时不可用。 这些参数需要正在运行的 AIAgent 上下文,而无状态的 MCP 回调无法提供。如需使用这些功能,请使用/codex-runtime auto。- 当 Codex 未追踪变更集时,审批提示中不显示内联补丁预览。 Codex 的
fileChange审批参数并不总是携带变更集信息。Hermes 会在可能的情况下缓存对应item/started通知中的数据,但如果审批请求在内容流传输完成前到达,则提示将回退至 Codex 提供的reason内容。 - 无法保证亚秒级取消。 流式响应过程中的中断(如 Codex 响应期间按 Ctrl+C)通过
turn/interrupt发送,但若 Codex 已经输出最终消息,则仍会返回完整响应。
如发现 Bug,请提交 Issue,并附上 hermes logs --since 5m 的输出内容。请在标题中注明 codex-runtime,以便快速分类处理。
架构说明
┌─── Hermes shell (CLI / TUI / gateway) ───┐
│ sessions DB · slash commands · memory │
│ & skill review · cron · session pickers │
└──┬──────────────────────────────────────┬┘
│ user_message final │
▼ text + │
┌──────────────────────────────────┐ projected │
│ AIAgent.run_conversation() │ messages │
│ if api_mode == codex_app_server │ │
│ → CodexAppServerSession │ │
│ else: chat_completions / codex_responses (default)
└────┬─────────────────────────────┘ │
│ JSON-RPC over stdio │
▼ │
┌──────────────────────────────────┐ │
│ codex app-server (subprocess) │──────────────┘
│ thread/start, turn/start │
│ item/* notifications │
│ shell + apply_patch + update_plan│
│ view_image + sandbox │
│ ┌─────────────────────────┐ │
│ │ MCP client │ │
│ │ ├─ user MCP servers │ │
│ │ ├─ native plugins │ │
│ │ │ (linear, github, │ │
│ │ │ gmail, calendar, │ │
│ │ │ canva, ...) │ │
│ │ └─ hermes-tools ───────┼─────────────────┐
│ │ (callback to │ │ │
│ │ Hermes' richer │ │ │
│ │ tools) │ │ │
│ └─────────────────────────┘ │ │
└──────────────────────────────────┘ │
│
▼
┌──────────────────────────────────────────────────────────┐
│ hermes_tools_mcp_server.py (subprocess on demand) │
│ web_search, web_extract, browser_*, vision_analyze, │
│ image_generate, skill_view, skills_list, text_to_speech│
└──────────────────────────────────────────────────────────┘
实现细节请参见 PR #24182 以及 Codex app-server 协议 README。