Codex 会话一致性解决方案
一句话结论
同一台服务器上,只要使用同一 Linux 用户、同一 Codex 入口和同一个CODEX_HOME,无论通过127.0.0.1、192.168.x.x或其他网卡 IP 登录,也无论启动默认codex还是任意 profile,/resume都应读取同一份跨 provider 会话列表。
问题现象
修复前,不同入口看到的/resume列表不一致:
默认
codex主要显示 xiaosi provider 的会话;codex3060主要显示 3060 Ollama provider 的会话;从不同目录或不同环境进入时,还可能受到
cwd、会话类型或CODEX_HOME的影响;结果是会话文件仍然存在,但目标会话没有出现在列表中,无法从当前 profile 切入。
完整逻辑链
这条逻辑包含两个缺一不可的层次:
存储层一致:所有入口必须读取同一个
CODEX_HOME和同一个sessions目录。列表层一致:恢复选择器必须取消 provider、
cwd和会话来源造成的过滤。
只统一会话目录而不取消过滤,会出现“文件在,但列表看不到”;只取消过滤而使用不同CODEX_HOME,会出现“列表逻辑相同,但读取的是不同数据”。
根因
根因一:会话根目录可能分叉
Codex 根据CODEX_HOME确定配置、状态和会话目录。如果两个终端使用不同用户或不同CODEX_HOME,它们读取的会话数据天然不同。
本机统一后的会话目录是:
/home/zhuyq/.codex/sessions
根因二:恢复列表存在过滤
即使会话文件位于同一目录,官方恢复选择器仍可能按以下条件过滤:
当前 model provider;
当前工作目录
cwd;是否属于非交互会话。
默认 xiaosi、3060 Ollama 和其他 profile 使用不同 provider,因此旧运行时下的/resume会显示不同集合。
实际修复
1. 固定唯一 Codex 入口
日常执行的codex是以下包装入口:
/home/zhuyq/.local/bin/codex
它固定设置:
export CODEX_HOME=/home/zhuyq/.codex
因此默认入口和所有 profile 共用同一配置根目录与会话目录。
2. 使用跨 provider 运行时
包装入口调用:
/home/zhuyq/.local/libexec/codexdp-resume-any-provider-zh
该运行时让 TUI 的/resume使用跨 provider 恢复视图,不再只显示当前 provider 创建的会话。
3. 补齐命令行恢复参数
执行顶层codex resume时,包装入口自动补充:
--all --include-non-interactive
参数作用:
| 参数 | 作用 |
|---|---|
--all | 取消当前cwd过滤 |
--include-non-interactive | 包含exec等非交互会话 |
4. 统一默认 xiaosi 配置
默认配置和xiaosiprofile 使用相同的ai-xiaosiprovider、base_url、wire_api和内置 bearer token:
/home/zhuyq/.codex/config.toml /home/zhuyq/.codex/xiaosi.config.toml
密钥不会写入本文档。
多网卡和不同 IP
IP 地址本身不是 Codex 会话的存储键。以下连接只要最终进入同一台机器、同一用户环境,就应读取同一列表:
127.0.0.1 192.168.x.x 服务器其他局域网或公网 IP
不同 IP 出现列表不一致时,真正需要检查的是:
whoami printf '%s\n' "$CODEX_HOME" readlink -f "$(command -v codex)"
正确结果应满足:
| 检查项 | 期望值 |
|---|---|
| 用户 | zhuyq |
CODEX_HOME | /home/zhuyq/.codex |
codex入口 | /home/zhuyq/.local/bin/codex |
如果三项一致,网络入口不会导致会话分裂。
使用方法
默认入口:
codex
3060 profile:
codex3060
进入 TUI 后执行:
/resume
也可以直接按 ID 恢复:
codex resume <SESSION_ID> codex -p 3060 resume <SESSION_ID>
手工验收流程
验收必须比较真实 TUI 的/resume,不能只以codex --version或 CLI 能启动作为通过依据。
退出所有修改前已打开的 Codex TUI 和 App Server。
新开终端运行
codex,输入/resume,记录列表中的会话数量和若干目标会话。退出后运行
codex3060,输入/resume,核对数量和目标会话是否相同。对其他 profile 重复上述步骤。
如需验证多网卡,分别通过
127.0.0.1和192.168.x.x登录,在两边先核对用户、CODEX_HOME和codex入口,再比较/resume。从任意 profile 选择由另一个 provider 创建的会话,确认能够实际进入,而不只是列表中可见。
验收条件:
所有入口的
/resume显示同一会话集合;跨 provider 会话能够实际切入;
不同网络入口使用相同用户、
CODEX_HOME和codex路径。
已验证与未验证
2026-08-06 曾对默认、3060、claude-code-router、deepseek、huoshen和xiaosi六个配置入口进行程序化列表对比,当时均返回 145 个活动会话,排序后的 ID 哈希均为f4a954577286e790。该结果是当时状态,不代表会话数量永久保持 145。
原验收回归脚本已按要求删除,当前不再提供该脚本。
尚未完成的验证:没有在本文档本次更新中分别通过127.0.0.1和192.168.x.x建立两个真实远程 TUI 做对照。因此,多 IP 结论来自已统一的本机用户、入口和CODEX_HOME机制;实际网络验收应按上一节执行。
解决范围与边界
已解决的范围
默认
codex与codex3060;当前所有 profile;
不同工作目录;
同一服务器、同一用户下的不同网卡或 IP 登录;
交互会话和非交互会话的命令行恢复列表。
不会自动合并的情况
实际连接的是不同服务器;
登录的是不同 Linux 用户;
容器或虚拟机没有共享
/home/zhuyq/.codex;第三方启动器覆盖了
CODEX_HOME;PATH优先命中了另一套 Codex 安装;会话已经归档或删除。
这些情况需要先统一文件系统、用户环境或启动入口,不能仅靠跨 provider 运行时解决。
修改文件清单
| 路径 | 作用 |
|---|---|
/home/zhuyq/.local/bin/codex | 固定CODEX_HOME、转发启动参数、补齐resume参数 |
/home/zhuyq/.local/libexec/codexdp-resume-any-provider-zh | 提供跨 provider 的 TUI 恢复视图 |
/home/zhuyq/.codex/config.toml | 默认 xiaosi 配置 |
/home/zhuyq/.codex/xiaosi.config.toml | xiaosi profile 配置 |
/home/zhuyq/.bashrc | 固定环境变量并定义codex3060等别名 |
重启要求
已经打开的 Codex TUI 或 App Server 不会自动重新加载入口脚本和配置。修改后必须退出旧进程,重新执行codex或相应 profile 命令,再使用/resume。