「BUG 反馈」服务器 Linux 环境创建的 Codex 智能体被注入 MacBook 侧已删除的自定义 Provider

【本次反馈为】Bug 反馈

【具体描述】

我此前在本机 MacBook 环境下为 Codex 配置过自定义 provider,其中包含 https://right.codes/codex/v1。后来我已经删除了 MacBook 本机环境中这部分自定义 provider 配置。

但在服务器 Linux 环境中,我通过 Loop 创建并启动 Codex 智能体时,预期它应使用服务器当前本地默认 Codex 配置,或者使用 Loop 平台明确为该机器下发的配置。

实际运行时,Loop 启动的 Codex 子进程仍然被注入了如下 provider 配置:

-c model_provider="loop"
-c model_providers.loop.name="Loop"
-c model_providers.loop.base_url="https://right.codes/codex/v1"
-c model_providers.loop.wire_api="responses"

随后该智能体请求打到了:

https://right.codes/codex/v1/responses

并持续报错:

unexpected status 401 Unauthorized: {"error":"无效的API Key"}, url: https://right.codes/codex/v1/responses

影响是:服务器上创建的 runtime=codexmodel=gpt-5.5 智能体无法正常响应消息,会反复进入 thinking / 401 Unauthorized / turn_end。同一台服务器上的 Loop daemon 与 Loop server 连接正常,channel 正常,Claude/sonnet runtime 也能正常运行;问题集中在 Codex runtime 启动时被注入了不符合服务器环境预期的 provider。

我参考了 Loop 文档中的 Machine Troubleshooting 页面:

https://loop.pingkai.cn/docs/machines/troubleshooting

按照文档建议已排查以下层级:

  • 机器在线,Loop daemon 正常运行。
  • server-url 和 machine API key 可用,daemon 能连接 Loop server。
  • loop journal --tail 100 可以正常读取 daemon 日志。
  • 本地 Codex runtime 能被启动,问题发生在 Codex runtime 启动后的模型请求阶段。
  • agent instance 位于当前服务器机器上,并非投递到错误机器。

文档中提到的 daemon 未运行、机器离线、连接信息失效、MCP loopback proxy 等排查项,和当前现象不匹配。当前关键证据显示:Loop 启动 Codex 子进程时显式注入了 model_providers.loop.base_url="https://right.codes/codex/v1",因此这更像是 Loop 平台侧/agent 配置同步侧把其他设备历史 provider 配置带到了服务器环境,或没有在 MacBook 侧删除 provider 后正确清理/同步到服务器创建的 agent。

期望行为:

  • 在服务器 Linux 环境创建的智能体,应使用该服务器环境对应的本地默认 Codex provider 配置。
  • 如果 Loop 平台需要下发 provider 配置,应确保配置来源与当前机器/当前 agent 一致,不应继承已删除的 MacBook 侧历史 provider。
  • 如果 provider 配置来自平台侧缓存,应在用户删除 provider 后同步清理,并避免新建 agent 继续注入旧的 right.codes base_url。

附件/日志:

loop-codex-process.log (3.1 KB)
loop-journal-401.log (3.2 KB)
loop-journal-tail-100-full.log (31.9 KB)
ps-ef-grep-codex-full.log (7.5 KB)

  • issue-evidence/ps-ef-grep-codex-full.log

    • ps -ef | grep codex 的完整输出。
    • 可看到 Codex 子进程启动参数中包含 model_providers.loop.base_url="https://right.codes/codex/v1"
  • issue-evidence/loop-journal-tail-100-full.log

    • loop journal --tail 100 的完整输出。
    • 可看到请求 https://right.codes/codex/v1/responses 后返回 401 Unauthorized无效的API Key
  • issue-evidence/loop-codex-process.log

    • 精简版进程证据,便于快速定位关键启动参数。
  • issue-evidence/loop-journal-401.log

    • 精简版 401 日志证据,便于快速定位错误时间线。

补充一个服务器侧环境信息,作为排查依据:

Linux 服务器上的 Codex 当前是通过 codex login / auth 模式登录的,不是通过 OPENAI_API_KEYright.codes API key 方式配置的。脱敏后的 /root/.codex/auth.json 关键内容如下:

{
  "auth_mode": "chatgpt",
  "OPENAI_API_KEY": null,
  "tokens": {
    "id_token": "<redacted>",
    "access_token": "<redacted>",
    "refresh_token": "<redacted>",
    "account_id": "07e224e6-786c-4ea9-9689-c7380ed21be2"
  },
  "last_refresh": "2026-05-26T04:52:58.399864048Z"
}

这意味着服务器本地 Codex 的预期认证路径是 ChatGPT/auth 登录态,而不是 OpenAI-compatible proxy API key。当前 Loop 启动 Codex runtime 时注入:

-c model_provider="loop"
-c model_providers.loop.base_url="https://right.codes/codex/v1"
-c model_providers.loop.wire_api="responses"

会把请求导向 https://right.codes/codex/v1/responses,但服务器环境并没有对应的 right.codes API key,因此出现:

401 Unauthorized: {"error":"无效的API Key"}

所以这个问题不只是 provider URL 不符合预期,也包含认证方式不匹配:服务器 Codex 已经是 auth 登录状态,但 Loop 注入的 model_providers.loop 看起来要求走 API key proxy 路径。

收到反馈,感谢!

【Follow-up:本地临时规避方案与验证结果】

Linux 服务器侧已做临时 wrapper hack,用于规避 Loop daemon 启动 Codex 子进程时注入错误 provider 配置的问题。

验证发现 Loop daemon 仍会下发:
-c model_provider=“loop”
-c model_providers.loop.name=“Loop”
-c model_providers.loop.base_url=“https://right.codes/codex/v1
-c model_providers.loop.wire_api=“responses”

这些参数会覆盖服务器本地 Codex auth 登录配置,导致请求 https://right.codes/codex/v1/responses 并返回 401。

临时方案是在 /root/.local/bin/codex 放 shim,转发到 /root/.loop/hacks/bin/codex wrapper;wrapper 过滤上述 provider 覆盖项后再 exec 真实 Codex。

本轮验证中 wrapper 记录:
2026-05-27T11:13:11Z stripped Loop provider override: … model_providers.loop.base_url="https://right.codes/codex/v1\" …

过滤后 Codex 子进程只保留 sandbox 和 MCP 参数,不再包含 right.codes provider override。新 agent 已成功启动并完成消息处理,未再出现新的 401。

该方案只是本机临时规避,不是根因修复。建议平台侧修复 Loop agent/provider 配置来源,避免把其他机器历史自定义 provider 注入到 Linux 服务器新建 agent。

昨天发版,已解决这个问题~