工作流

Codex 本地运行还会上传代码吗?推理请求、训练开关与本机记录的边界

Codex 本地运行不等于离线推理。按登录方式、执行端和数据通道核对代码发送、训练偏好与留存,检查 ChatGPT 数据管理、Codex 环境选项及 history.persistence,并明确本机验证的边界。

会有发送任务上下文的可能,不能因为终端、编辑器或文件在本机,就认为代码不会离开电脑。 使用远程模型时,模型需要接收推理请求;提示词、附带的文件片段、工具读取结果等可能成为上下文。具体发送什么取决于任务、客户端、模型提供方和启用的工具,不能反过来声称每次都会上传整个仓库。

例如,你没有执行 git push,但把一个函数贴进提示词,或让工具读取文件后将结果交给远程模型分析,这与把提交推到 GitHub 是不同的数据路径。是否推送过仓库,不能用来判断推理请求里有没有代码。

你真正需要分别核对三件事:哪些内容会发送给谁、是否用于训练、哪些地方还会保存记录。 关闭训练不等于停止推理请求;关掉一份本机历史也不等于删除服务端数据。下面按这三条线检查。

本文核验于 2026 年 10 月 22 日。已只读检查登录后的 ChatGPT 网页数据管理和 Codex 云端设置入口;未改动账号开关,未用真实代码或凭据做传输测试。桌面端、移动端、IDE、Windows/WSL 差异依据官方资料,未逐端实测;API 组织留存控制未在获批组织中实测。

先确定你要解决的是哪一种问题

你的问题 先查什么 不能作为结论的现象
本地运行的代码会不会发出去 执行位置、模型提供方、附件与工具结果 文件在本机、沙箱只读
Codex 如何关闭训练 登录账号、工作空间、训练偏好及单独的环境选项 CLI 没有训练按钮
数据保留多久 具体产品、对象、组织策略与第三方 已关闭训练、列表不再显示
本机还会不会写历史 当前客户端的配置目录、配置层和目标文件 只改了另一个终端的配置
公司代码是否可以使用 公司批准的账号、服务、工具及数据政策 个人开关关闭、一次抓包未发现正文

第一步:把执行端、登录方式和数据通道记清楚

先为正在使用的任务记一张小表:客户端及版本、项目实际所在机器、登录方式、当前工作空间、模型提供方、已启用的 MCP/插件/浏览器工具。只记类型和必要的脱敏标识,不复制令牌、完整配置或会话正文。

CLI 可先运行:

codex --version
codex login status

第一条确认你检查的可执行版本;第二条查看当前登录状态。官方说明凭据存在时它可返回退出码 0,这不证明训练已关闭、服务端零留存或每种请求都能成功。不要打开或上传凭据文件来代替这一步。CLI 命令参考

在 CLI 会话中可查看下面两项诊断:

/status
/debug-config

/status 核对当前模型、审批与可写范围;/debug-config 核对配置层和受管要求。它们不是完整请求正文、训练状态或全部配置键的导出器。若需要核对自定义提供方,在自己可访问的配置中只检查 provider 名称及 base_url 的目标主机;URL 也可能含凭据,不要直接贴出。配置来源不一致时,先按config.toml 不生效排查确认实际加载层。

客户端或通道 需要另外核对的部分
本地 CLI、桌面本地任务 命令在本机执行,模型服务请求仍可能出站;文件读取结果也可能进入上下文
VS Code 等 IDE 当前文件、选区、附件或工具结果可能提供上下文;不能只看有没有手动上传按钮
JetBrains 等集成 先确认实际授权来源及集成提供方,不能把另一个 OpenAI 账号的设置套过来
云端任务 环境、仓库内容与任务记录涉及云端执行,不能用本机日志路径代表它们
API Key 或自定义模型提供方 核对实际 API 组织、项目和服务地址;第三方提供方适用其自己的数据条款
MCP、插件、浏览器及其他服务 核对独立的传输与接收方;OpenAI 的训练开关不能替第三方承诺留存

VS Code 上下文以当前扩展行为为准;JetBrains 的授权和上下文可继续看逐步接入与验收。Windows 原生应用与 WSL CLI 的配置、认证和历史并不自动共用:前者通常在 Windows 用户目录,后者在 WSL 的 Linux 主目录。远程开发还要检查实际执行机器。IDE 官方文档、Windows 应用文档

验证结果: 你能指出“这一次任务在哪里执行、向哪个模型服务请求、另有哪些接收方”。若登录或执行位置仍不确定,先停止使用敏感任务,换无敏感内容的示例确认入口;不要用真实秘密测试是否会外传。

为什么命令禁网不能证明代码没有上传

官方 Permissions 文档明确把沙箱命令的网络代理,与模型、认证等客户端服务流量分开。托管网页搜索、独立 MCP 传输、应用连接、浏览器/电脑使用及云端任务也不能统统归入该命令网络规则。因此,“终端中的 curl 被拒绝”只能说明这次命令请求的结果,不能证明推理请求已停止。网络代理不控制的通道

同样,.gitignore 决定 Git 忽略规则,AGENTS.md 提供任务指令,都不能单独当成文件读取隔离。只读限制也不等于禁止读取。把秘密移出仓库有助于减少误选,但若任务仍有权限读到那个位置,不能据此宣布不可访问。需要限制路径时,应核对当前端支持的真实权限机制。相关诊断见终端能联网、任务却连不上。

第二步:核对训练开关,先分 ChatGPT 登录与 API

使用个人 ChatGPT 账号登录

  1. 在浏览器中确认登录的是实际用于 Codex 的账号及工作空间,再打开账号菜单 → 设置 → 数据管理(英文文档为 Data controls)。
  2. 找到 为所有用户改进模型 / Improve the model for everyone。如果你的目标是不让后续内容用于模型改进,按页面说明关闭;有保存或完成按钮时完成保存。
  3. 离开设置后重新打开,核对同一账号上的显示状态。记录核对日期及账号类型即可,不公开账号截图或个人身份。

本次网页版实际到达的是 ChatGPT 数据管理,不是旧版弹窗。官方说明,登录后的这项偏好跟随账号,适用于新的 ChatGPT 对话和 Codex 任务;移动端可从侧栏个人资料进入设置与 Data controls。不同语言、版本和工作空间的界面可能不同。数据控制说明

预期结果: 重新进入后显示你选择的状态。若没有该项,先核对账号、工作空间和管理员限制,不反复修改 CLI 配置,也不把“按钮缺失”当成已经退出训练。

还要单独核对 Include environments

官方数据控制文档另外列出 Codex 的 Include environments,涉及将 Codex 环境的额外上下文用于训练。更改 ChatGPT 训练偏好或通过 Privacy Portal 退出训练,不会同步改变这一环境选项。 从官方数据控制文章中的 Codex settings 链接进入,确认自己的可用设置。

本次点击官方链接后,实际重定向到 设置 → Codex 云端(旧版);“偏好”页只显示差异视图和分支格式,未显示 Include environments。这个观察只代表当时账号的这个入口,不能证明选项在所有账号中消失,也不能证明它已关闭。遇到相同情况,向组织管理员或 OpenAI 支持核实当前账号的适用范围与设置入口;在确认前,把这一项标为“未核实”。不要为找开关迁移环境或新建任务。

训练偏好管的是后续使用选择,不能作为撤回既有训练或删除数据的证明。个人服务中,即使退出训练,主动提交赞/踩等反馈时,关联的整段对话仍可能被用于改进;不要把含敏感内容的反馈当成无数据提交。模型改进的数据使用说明

使用 Business、Enterprise、Edu 或 API

Business、Enterprise、Edu 和 API 的业务数据默认不用于训练;实际适用关系仍要对应当前登录、组织及约定,不能根据客户端图标推断。Codex 与 ChatGPT 计划说明

API 用户应请有权限的组织管理员核对当前组织的数据共享选择、项目归属及合同约定。个人 ChatGPT 的开关不能替代 API 组织设置。拿到 API Key 也不代表获得 Zero Data Retention(ZDR);ZDR 和 Modified Abuse Monitoring 需要满足资格并经 OpenAI 批准,而且有端点和功能适用范围。API 数据控制

验证结果: 留下一条“账号/组织类型、设置位置、状态、日期、未确认事项”的记录。开关读回只验证可见偏好,不是对服务端训练管线的独立审计。

第三步:单独核对留存,不给所有数据套一个天数

“Codex 数据保留多久”必须先补上对象和产品:本机历史、云端任务、ChatGPT 对话、API 滥用监测、API 应用状态,还是第三方服务记录。它们不是同一份数据。

对象 核对方法与边界
本机历史、日志与运行状态 查实际机器、客户端配置目录和对应文件;本地删除不会自动删除远端副本
ChatGPT 对话与文件 按相应对象的官方留存规则;归档不等于删除,关闭训练也不删除聊天
Codex 云端任务与环境 核对当前产品、工作空间策略和组织约定;不能直接沿用本机或普通聊天的期限
API 滥用监测记录 默认可能含内容及元数据,通常最长 30 天,存在法律等例外;批准的控制另核
API 应用状态 逐端点、参数与功能核对;store=false 不能直接推出 ZDR 或所有日志为零
MCP 或其他接收方 查该服务自己的保存、删除和管理员策略,必要时由服务方确认

对普通 ChatGPT 保存的聊天,官方说明其保留到删除或适用的工作空间策略移除;删除后从界面消失与系统中的永久删除不是同一时刻。通常安排在 30 天内删除,存在去标识化、安全或法律例外。Library 文件还可能独立于聊天保存。不要把这段聊天政策直接当作所有 Codex 任务的统一留存期限。 聊天与文件留存说明

API 组织若已获批留存控制,可由管理员到 Settings → Organization → Data controls → Data Retention 查看组织与项目的配置,并对照正在使用的端点和功能。Responses 的应用状态、滥用监测日志及第三方 MCP 数据需分别核对;一个 store 参数不能回答全部问题。当前 API 留存与功能表

预期结果: 每一种对象都有明确依据;不能确认的,记录产品名称、组织类型、功能和问题后交给管理员或支持。客户端没有记录、会话列表为空、导出结果没有某项,都不足以证明服务端已经清除。

第四步:检查 history.persistence,只验证它承诺控制的记录

如果你的目标是“Codex 不保存本机历史”,先缩小为一个能检查的配置项。当前配置参考把 history.persistence 明确关联到 history.jsonl;不能扩展成所有会话、SQLite 状态、日志、远端任务和遥测都不保存。配置参考

  1. 在实际执行端确认配置目录。常见默认是用户主目录下的 .codex;设置了 CODEX_HOME 时用实际值。Windows 原生、WSL、容器和远程主机分别核对。
  2. 保留现有配置副本,在正确的 config.toml 中合并下面这一项。已有 [history] 时修改其中的 persistence,不要重复声明表,也不要覆盖整个文件。
[history]
persistence = "none"
  1. 新开 CLI 会话,检查配置层是否生效、有无启动参数或受管配置覆盖。诊断不能显示某个键时,不能把它没显示理解成值为 none。
  2. 若组织允许发送测试请求,可在只含虚构文本的空测试目录中做一次普通交互;前后只比较目标历史文件的元数据。不要拿生产仓库、真实凭据或用户数据做探针。存在其他活跃会话时,先排除它们对同一文件的写入干扰。

下面是可选的元数据检查器,保存为 history_probe.py。它仅检查你明确指定的一个路径,不读取文件正文,不搜索主目录,也不输出路径。需要本机有 Python 3。

import json
import stat
import sys
from pathlib import Path

if len(sys.argv) != 2:
    raise SystemExit("请显式传入目标 history.jsonl 路径")
try:
    info = Path(sys.argv[1]).expanduser().lstat()
except FileNotFoundError:
    result = {"exists": False}
except OSError:
    raise SystemExit("元数据读取失败;请在本机核对路径和权限")
else:
    regular = stat.S_ISREG(info.st_mode)
    result = {"exists": True, "regular_file": regular}
    if regular:
        result.update(bytes=info.st_size, mtime_ns=info.st_mtime_ns)
print(json.dumps(result))

只在已经确认没有自定义 CODEX_HOME 的 macOS/Linux CLI 中,可这样运行;测试前后各运行一次。在 Windows 或自定义目录中,替换为自己核实的实际路径和 Python 启动命令。

python3 history_probe.py "$HOME/.codex/history.jsonl"

预期结果: 在上述受控条件下,目标文件不新增或元数据不变化,与没有继续写入这份文件一致。但这不是对所有写入的完整监控。若文件变化,先核对其他会话、执行端、路径、配置覆盖与测试是否真的启动成功;不要删除已有历史来“修复”。若报告不是普通文件,先在本机确认链接或目录含义,不将它作为常规历史文件验收。

记录不存在或未变化,也可能因为路径选错、任务未成功、客户端使用另一份记录。该探针既不证明服务端零留存,也不证明没有会话状态或其他日志。需要恢复旧会话前,先了解恢复与历史查找的边界;不要为了隐私排查批量清空配置目录。

遥测与日志也要分开核对

当前配置参考还分别定义了以下控制,合并前应核对当前客户端、profile 和组织要求:

配置 官方限定的作用 不能据此推出
analytics.enabled 当前机器/profile 的分析;CLI 中设为 false 也关闭自定义 OTLP 指标导出 停止推理、停用所有客户端的日志或训练
otel.log_user_prompt 是否选择将原始提示词导出到 OTel 日志 false 时工具参数、输出和其他事件绝不含敏感内容
otel.exporter、otel.trace_exporter、otel.metrics_exporter 分别核对日志/事件、跟踪、指标导出 只改其中一个就关闭所有导出通道
log_dir、sqlite_home 日志或可恢复运行状态的存放位置 改目录就禁止记录,或云端存储随之移动

不要为了核对这些项目导出整份日志。优先在本机查看相关键、接收端主机与文件元数据;需要组织审计时,按批准的脱敏与提交流程操作。各配置项的当前定义

最后怎样确认问题已解决

完成后,应能给出以下具体答案,而不是一句“已关闭隐私开关”:

  • 发送: 明确客户端、执行机器、模型提供方和外部工具;知道沙箱命令禁网不能代表所有数据通道禁网。
  • 训练: 核对同一登录账号或 API 组织;可见偏好已读回,环境选项缺失等未核实事项已单独标记。
  • 留存: 按对象找到官方政策或组织约定,没有把“不训练”“不显示”“零留存”混在一起。
  • 本机记录: 只对检查过的路径与配置作出结论;没有把一个文件未变化当作所有副本不存在。

你可以自行验证界面状态、配置来源、文件元数据及自己有权观察的连接信息;无法仅凭这些证明服务端内部训练、备份清除或所有下游副本的情况。网络连接存在不说明完整正文内容,一次未观察到连接也不证明永久离线;加密流量和缓存更会限制观察。不要关闭证书校验或提交真实秘密来追求“验证”。

若公司要求代码绝不离开受控环境,先由管理员确认获批的部署、账号、数据路径与协议能满足要求;个人训练开关不能替代这项判断。需要求助时只提供客户端版本、登录类型、执行位置、脱敏后的现象、已核对步骤和日期,明确需要确认的是发送、训练还是留存,不附凭据、仓库正文或完整会话日志。

社区讨论

补充你的经验或问题

评论由 GitHub Discussions 承载;参与讨论需要登录 GitHub。