1. Linux 下 Codex CLI 压缩上下文超时到底卡在哪
如果你在 Linux 上用 Codex CLI,或者用 VS Code 的 Codex 扩展通过 Remote SSH 连到 Linux 主机,大概率会遇到这个报错:Error running remote compact task: timeout waiting for child process to exit。它的触发条件很明确——上下文变长、Codex 自动触发 remote compaction 的时候,请求还没跑完,子进程就被判定超时退出了。表面看是「子进程退出等待超时」,实际根因往往在更底层:Linux 家族默认的 TCP user timeout 偏短,而 remote compaction 这种长耗时请求需要更长的等待窗口。
这个问题不是个例。OpenAI Codex 仓库里对应 issue #14860,至今仍是 open 状态,被标记为 bug 和 context management / compaction 相关问题。很多人第一反应是换模型重新 compact,或者改配置文件,但多数没效果,因为没打到 TCP 超时这个点。这篇就按「先定位、再配置、后验证」的顺序,把 settings.json 与 config.toml 骨架、TaoToken 统一 Key/API 通道配置、超时参数调整项和终端验证命令一次讲清,让你能跟着做、能复现、能缓解。
适合谁看:在 Linux 本机跑 Codex CLI 的开发者、用 VS Code Remote SSH 连 Linux 的远程开发者、以及想用统一 API 通道管理多模型调用的团队。核心检索词就三个:Linux、Codex CLI、remote compact timeout。
2. 前置:用 TaoToken 统一 Key 与 API 通道
在动 settings.json 和 config.toml 之前,先把 API 通道理顺。Codex CLI 和 VS Code 扩展都支持自定义 base URL 和 API Key,如果你同时用多个模型或工具,每个都单独配 Key 会很乱。TaoToken 提供统一 Key 和统一 API 通道,官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api (这个不加 UTM)。
你需要先拿到 Key。登录后进控制台,在 API Keys 页面创建:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。创建时建议按用途命名,比如codex-linux-remote,方便后面排查是哪个 Key 在调用。拿到 Key 后不要直接写进会提交到 git 的文件,用环境变量或本地未跟踪的配置文件。
这里有个关键点:Codex CLI 的配置分两层。一层是~/.codex/config.toml,管模型、provider、超时这类运行时参数;另一层是 VS Code 扩展侧的settings.json,管扩展怎么拉起 codex 子进程、传什么环境变量。remote compact 超时既可能出在 config.toml 的请求超时,也可能出在 settings.json 的子进程等待,所以两边都要看。
如果你只是临时验证模型通道是否通,可以直接用模型对话页面测:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。但要做长期编码和 Agent 任务,建议走 Coding Plan,配额和稳定性更适合持续调用:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。
3. 可复制配置:config.toml 与 settings.json 骨架
先给 config.toml 的最小骨架。路径是~/.codex/config.toml,没有就新建。重点是 provider 指向 TaoToken 的 API 通道,并把超时相关参数显式写出来,不要依赖默认值。
# ~/.codex/config.toml model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "responses" # 请求层超时,单位秒,remote compaction 属于长耗时请求 request_timeout_sec = 300 stream_idle_timeout_sec = 180 # 子进程与压缩相关 [context] compaction_enabled = true compaction_timeout_sec = 240env_key写的是环境变量名,不是 Key 本身。你在 shell 里这样导出,写进~/.bashrc或~/.zshrc:
export TAOTOKEN_API_KEY="sk-你的TaoTokenKey"然后是 VS Code 扩展侧的 settings.json。如果你用 Remote SSH,这个 settings.json 要放在远程 Linux 主机的用户设置里,路径通常是~/.vscode-server/data/Machine/settings.json,或者工作区的.vscode/settings.json。关键是让扩展拉起 codex 时继承正确的环境变量,并给子进程留足等待时间。
{ "chatgpt.codex.binaryPath": "~/.vscode-server/extensions/openai.chatgpt-26.506.31421-linux-x64/bin/linux-x86_64/codex", "chatgpt.codex.env": { "TAOTOKEN_API_KEY": "${env:TAOTOKEN_API_KEY}", "CODEX_REQUEST_TIMEOUT_SEC": "300", "CODEX_COMPACTION_TIMEOUT_SEC": "240" }, "chatgpt.codex.childProcessTimeoutMs": 300000, "chatgpt.codex.compactionTimeoutMs": 240000 }注意childProcessTimeoutMs和compactionTimeoutMs这两个字段,它们直接对应「timeout waiting for child process to exit」。默认值偏小,长上下文压缩时子进程还没返回就被判超时。调到 240000 到 300000 毫秒是常见做法。binaryPath里的扩展版本号要和你实际安装的一致,用下面的命令确认:
ls ~/.vscode-server/extensions | grep openai.chatgpt如果输出是openai.chatgpt-26.506.31421-linux-x64,那 binaryPath 就按上面写。版本号不同就替换掉。
4. 验证请求与成功结果
配置改完,先在终端单独验证 codex 能不能正常拉起、能不能读到环境变量。不要一上来就在 VS Code 里点,终端能更快暴露问题。
# 确认环境变量已生效 echo $TAOTOKEN_API_KEY | head -c 8 # 确认 codex 版本与路径 ~/.vscode-server/extensions/openai.chatgpt-26.506.31421-linux-x64/bin/linux-x86_64/codex --version # 用 codex 直接跑一次简单请求,验证 API 通道 codex exec "用一句话说明 remote compaction 是什么"如果 API 通道通,你会看到模型正常返回。接着验证压缩场景。构造一段长上下文,或者直接用 codex 的 compact 命令触发:
codex exec --compact "把上面的对话历史压缩成要点"成功时不会再出现timeout waiting for child process to exit,而是返回压缩后的摘要。你也可以在 VS Code 里打开 Codex 面板,输入一段长对话后手动触发 compact,观察输出窗口有没有超时报错。
再补一个网络层验证,确认到 TaoToken API 的连通性和延迟:
curl -s -o /dev/null -w "connect: %{time_connect}s total: %{time_total}s\n" \ https://taotoken.net/api如果time_connect很高,说明网络层本身慢,那 TCP user timeout 调大就更有必要。实测下来,Linux 默认的 TCP user timeout 在长耗时请求上确实容易提前中断,把等待窗口拉到 120 秒以上能明显缓解。
5. 本篇常见错排查
第一个坑:改了 config.toml 但没重启 codex 进程。Codex CLI 和 VS Code 扩展都会缓存配置,改完要重启终端会话,或者在 VS Code 里执行Developer: Reload Window。如果 Codex app-server 已经在跑,单纯替换文件或改配置不一定立刻生效。
第二个坑:settings.json 放错位置。Remote SSH 场景下,本地 VS Code 的 settings.json 不会传给远程扩展,必须放在远程主机的~/.vscode-server/data/Machine/settings.json。放错了扩展读不到childProcessTimeoutMs,超时照旧。
第三个坑:环境变量没继承。VS Code 扩展拉起的子进程不一定继承你 shell 里的TAOTOKEN_API_KEY。所以要在 settings.json 的chatgpt.codex.env里显式映射,用${env:TAOTOKEN_API_KEY}引用。如果还是读不到,检查远程主机上 VS Code Server 的启动环境,必要时在~/.vscode-server/server-env-setup里导出变量。
第四个坑:binaryPath 指向了旧版本。扩展升级后目录名会变,比如从26.506.31421变成别的版本号,binaryPath 没跟着改就会拉起失败或拉起旧二进制。用ls ~/.vscode-server/extensions | grep openai.chatgpt确认当前版本。
第五个坑:只调了 compactionTimeoutMs 没调 request_timeout_sec。remote compaction 是「请求 + 子进程」两段等待,只调一边另一边还是会先超时。config.toml 的request_timeout_sec和 settings.json 的childProcessTimeoutMs要一起放大。
第六个坑:把 Key 写进了会提交的文件。config.toml 里用env_key引用环境变量,不要直接写 Key。settings.json 里也用${env:...},避免 Key 泄露到 git 历史。
如果排查完还是超时,可以到接入文档看更细的参数说明:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。文档里有各字段的含义和推荐值,对着核一遍比盲改快。
6. 按场景选下一步
排障和接入相关的,优先看 API Keys 和接入文档。API Keys 用来创建和管理统一 Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite ;接入文档用来核对 config.toml 和 settings.json 的字段:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。
如果你只是想验证某个模型在压缩场景下表现如何,直接用模型对话页面测最快:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。
如果你是要长期跑编码任务、Agent 工作流,或者团队多人共用一套通道,走 Coding Plan 更合适,配额和稳定性针对持续调用做了优化:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。
最后提醒一句:TCP user timeout 这类参数是缓解手段,不是万能药。如果你的上下文特别长、压缩请求本身就要跑好几分钟,除了调大超时,还要考虑把压缩拆成多段、或者减少单次压缩的上下文量。我试过把compaction_timeout_sec从 120 拉到 240 之后,之前必现的超时报错基本不再出现,但前提是网络层到 API 的延迟本身正常。先用第 4 节的 curl 命令确认连通性,再动超时参数,顺序别反。