☰
Astra 很强,也真的贵:我从 Codex 会话文件里找到了 3 类可选上下文
2026/9/27 21:31:43 网站建设 项目流程

最近用 CodeX GPT-6 Astra 写代码时,我越来越明显地感觉到一件事:模型能力很强,但额度掉得也快。

这并不只是我的错觉。有人在 Reddit 记录了两项简单任务在10~15 分钟内耗尽 5 小时额度;Codex 仓库也有用户报告,两条 prompt、约 26 分钟就消耗了约 86%,对应会话累计约 796 万 Token,其中绝大多数是缓存输入。还有 Desktop 用户在几个普通的本地 MATLAB 编辑问题后耗尽了额度。Reddit 讨论、Codex issue #45073、Codex issue #32607、Codex issue #30404

这里先澄清一个容易误解的词:“5 小时额度”是一个使用窗口,现在几乎所有厂商的token plan都设置了这个窗口。 OpenAI 的说明明确写着,用户可能在 5 小时真正过去之前就耗尽该窗口;同一项任务的消耗还会随模型、输入输出长度、推理强度、Fast 模式和任务步骤数变化。Plus 用户使用 Astra 时,官方给出的只是每个 5 小时窗口约 5~45 条本地消息的估计范围,并非固定消息数。OpenAI:Managing usage with GPT-6 Astra。但实际上很少有人能在这个窗口内发满45条消息。

所以,我一直在思考一个问题:

在不影响我日常本地设计和编码的前提下,Codex 每次请求里有没有一部分确定存在、又可以选择不带的重复输入?

我试过几条路,最后选择直接读会话文件

最开始想到的办法都很自然:降低 reasoning effort、简单任务换便宜模型、把大任务拆小。这些做法有效,OpenAI 也建议按任务选择模型和推理强度;但它们没有回答“同一个模型为什么每轮要带这么多固定上下文”。

我又看了几个更具体的方向:

  • 精简AGENTS.md。它确实占上下文,但里面是项目的测试、安全和代码规范,删掉之后省下来的 Token 很可能会用返工补回去。
  • 按项目关闭某个 skill。实际测试发现,项目层[[skills.config]] ... enabled=false在当时的 Desktop 链路里并不能可靠地让对应条目从技能目录消失。
  • 单独关闭推荐插件列表。Core 独立进程能响应相关 feature gate,但真正新建 Desktop task 后,推荐列表仍然存在,说明还有 Host/Session 层覆盖。
  • 只扫描磁盘上的 skills、plugins 和配置文件。这样只能知道“装了什么”,不能证明“模型这一轮实际看到了什么”。

转折点是 Codex 的 rollout JSONL。一个完整的新 task 会把初始输入按内容种类记录下来:

  • response_item告诉我实际发送了哪些文本;
  • content_item_kinds告诉我每段文本属于哪个 block;
  • world_state记录后续上下文状态;
  • token_usage_record记录每次模型响应的输入、缓存输入、输出和模型;
  • compaction、fork 和 paginated history 也会留下边界,提醒我什么时候不能继续外推。

Codex 的会话前缀,到底装了什么

基于codex-cli 0.154.0-alpha.6.2验证。

“前缀”不是一整段无法区分的 system prompt。以我 2026-09-13 的一个完整 task 为例,Codex 把初始上下文拆成了 10 个有 metadata 的内容块。下表的 Token 使用项目当前的o200k_basetokenizer 对原文估算,不是服务端精确计数;内容和长度也会随 Desktop 版本、配置和 task 类型变化。

JSONL metadata kind作用该样本估算 Token我的处理
generic.developer_instructionsDesktop 通用行为、文件与界面约定1,423保留
memories.instructions本地记忆的使用说明和已注入记忆3,882纯本地编码时关闭
host_skills.instructions可用 skill 的名称、描述与路径目录1,805纯本地编码时关闭
permissions.instructions沙箱、审批、可写目录和命令边界1,035保留
collaboration_mode.instructions当前协作模式规则250保留
apps.instructionsApps/Connectors 的使用规则146按任务保留
plugins.usage_instructionsPlugins 的触发和使用规则209与 Plugins 功能一起关闭
plugins.recommendations尚未安装的远程推荐插件列表1,310与 Plugins 功能一起关闭
agents_md.instructions当前仓库的AGENTS.md1,121保留
environments.environment_contextcwd、shell、日期、时区、文件系统范围302保留

同一周的其他 task 还出现过multi_agent.role_instructions和multi_agent.mode_instructions;另一次验证中出现过tools.deferred_namespaces。企业或受管环境还可能有managed_developer_instructions。因此,“Codex 前缀有几个 block”没有一个永久固定的答案,应该以目标版本的新 task JSONL 为准。

还有一个重要区别:host_skills.instructions只是技能目录,通常包含名称、简介和SKILL.md路径,并不等于所有SKILL.md正文都已加载。真正选中某个 skill 后,其完整说明会作为另一段上下文进入会话。关闭目录也不等于删除技能文件,更不等于禁止模型在用户明确要求时读取它。

关闭哪些,留哪些?

严格测试之后,我把这些 block 分成三组。

第一组:我不关,也不建议只为省 Token 而关

block技术状态不建议关闭的原因
generic.developer_instructions没有面向普通项目的独立关闭项它定义 Desktop 的基本行为契约,官方不提供关闭配置肯定是有原因的
permissions.instructionsinclude_permissions_instructions=false已验证可隐藏沙箱和审批仍会执行,但模型不知道边界后更容易发起失败操作、反复试错
agents_md.instructionsproject_doc_max_bytes=0已验证可去掉这里是项目事实和工程约束;对仓库编码而言通常比省下的 Token 更有价值
environments.environment_contextinclude_environment_context=false已验证可隐藏模型会失去 cwd、shell、日期、时区和文件系统范围,命令与路径更容易出错
collaboration_mode.instructions/ multi-agent blocks协作说明可隐藏;角色块没有在本次调查中验证独立 hide-only 开关会影响模型对委派、并发和协作边界的理解;需要 subagent 时应保留
apps.instructionsinclude_apps_instructions=false已验证可隐藏使用日历、邮箱、云盘等 Connector 时,模型需要知道如何调用;不用 Apps 时可以关闭
tools.deferred_namespacesfeatures.deferred_tool_world_state=false已验证可隐藏不一定关闭工具本身,但会削弱延迟工具发现;工具密集任务不值得冒险
managed_developer_instructions不是普通项目开关这是组织管理要求,不应由项目为了省 Token 绕过

其中 permissions、environment、collaboration 和 deferred tools 在技术上确实可以关闭,但关闭后的效果我没验证过,因此不推荐。

第二组:能关,但必须接受功能损失

Plugins 是最典型的例子。当前 Desktop 中没有可靠的“只隐藏推荐列表、功能照常”的开关。以下配置经过新 task 验证,能同时去掉plugins.usage_instructions和plugins.recommendations:

# ~/.codex/config.toml:用户级,影响本机所有 Codex 项目的新 task [features] plugins = false

代价也很明确:插件工具和插件提供的 skill 发现能力一起关闭;已经安装的插件不会被卸载。

第三组:与我的编码方式匹配,可以选择关闭

我最终针对纯本地编码场景选择的是3 类开关、4 个 metadata block:

  1. 自动技能目录:host_skills.instructions;
  2. 记忆:memories.instructions;
  3. Plugins:plugins.usage_instructions与plugins.recommendations。

项目级配置只关当前仓库的自动技能目录:

# <项目>/.codex/config.toml [skills] include_instructions = false

用户级配置停止在未来 task 注入记忆,并关闭 Plugins:

# ~/.codex/config.toml [memories] use_memories = false [features] plugins = false

这里有四个边界必须说清楚:

  • 配置只影响新建 task,不会改写旧 task;
  • use_memories=false不删除本地记忆,也不关闭所有记忆生成逻辑。这个大家按自己的实际情况来,如果你本地只有1个项目目录,可以不用关。如果本地的项目较多建议关闭,因为占用太多token了!
  • include_instructions=false不删除 skills,需要时仍可明确点名并读取。
  • 如果配置文件里已经有[features]、[memories]或[skills],应合并键,不要重复创建 TOML table。

用我本地最有代表性的一周复算

我没有挑一个最好看的单次会话,扫描了这个项目全部可读历史,按自然周(周一至周日)分组:

  1. 先比较一周内出现过多少种真实content_item_kinds;
  2. block 种类相同时,再选活跃 task 更多的一周;
  3. 同一 task 的重复日志按 response ID 去重;
  4. 只统计当前项目精确 cwd,归档记录也保留在历史口径中。

先分清首次请求和后续请求

会话文件通常只在开头写一次完整 header,但这不代表它只参与第一次计费。只要这段前缀仍在有效上下文里,后面的模型响应仍会处理它;区别在于,它更可能落入缓存输入。

因此使用两个口径来计算:

  • 首次请求的文本减少量:完整初始头里三个目标 block 的 Token 之和。
  • 后续请求的累计减少量:对每一条响应,检查当时仍可追踪的 block,再累加该响应的D_i。

Token 公式:

D_i = 第 i 条响应中仍可证明存在、且计划关闭的 block Token 之和 累计输入减少 = Σ D_i

费用不能把所有D_i都按普通输入单价相乘,因为本地日志只给出整条请求的输入I_i和缓存输入C_i,不能证明某个 block 具体落在缓存的哪一段。I_i已经包含C_i,两者不能再相加。我按上下界计算:

该 block 至少属于缓存的 Token = max(0, D_i - (I_i - C_i)) 该 block 至多属于缓存的 Token = min(D_i, C_i) API 等价节省_i(R) = ((D_i - R) × 普通输入单价 + R × 缓存输入单价) / 1,000,000

这里的R分别取上述缓存归属的两端。估算只减少输入,假设输出、推理、工具调用、重试和任务质量不变;如果关闭 Plugins 改变了实际执行路径,这个静态估算就不再等于真实 A/B 结果。

截至 2026-09-21,Astra API 标准价是每百万输入 Token 10 美元、缓存输入 1 美元;超过 272K 输入的请求使用更高费率。本周样本的 Astra 输入最大为 235,419,且缓存写入均为 0,所以这里都使用基础费率。GPT-6 Astra API 模型与价格

周收益:只报证据覆盖到的部分

348 条 Astra 响应中,有 211 条至少能持续追踪三类目标中的一类:

目标有上下文与用量证据的 Astra 响应累计估算输入 Token
自动技能目录211364,938
记忆41159,534
Plugins 说明与推荐4454,361
可证覆盖部分合计—578,833

各行响应数会重叠,合计行是逐响应合并目标后再求和。只有 41 条响应能同时追踪三类上下文,它们合计 286,420 Token;其余响应要么只能证明其中一部分仍存在,要么在压缩/分页后无法重建。578,833 是已覆盖响应的累计估算,不是把未知响应当 0 后宣称的“全周完整收益”。

按每条请求的真实缓存边界折算,这部分相当于约0.75~3.80 美元的 Astra API 等价输入成本。它不是 Codex 订阅账单,也不能换算成“多用多少分钟”或“多发多少条消息”。

一个干净样本:第一次贵在哪里,后面又怎么算

这一周有一个新建的纯 Astra task,完整保留了三类 block,且 37 条模型响应都能追踪:

阶段响应数目标上下文累计 TokenAPI 等价输入成本
第一次模型响应16,988$0.06988
后续模型响应36251,568$0.2516~$1.1491
整个 task37258,556$0.3214~$1.2189

第一次响应的总输入为 30,770,缓存输入为 0,所以这 6,988 Token 可以按普通输入精确归属。后 36 次响应的缓存输入都足以容纳这段前缀,但只有整条请求的缓存总量,没有 block 级命中位置,所以我保留区间,不伪造一个精确金额。

为什么我的本地编码场景会关这三类

我的主要工作是单仓库内的 TypeScript 开发:读代码、改文件、跑测试、看 diff。项目规范已经写在AGENTS.md和仓库文档里;大多数任务使用本地文件、Git 和 shell,不需要邮箱、日历、云盘或设计工具。

在这个前提下,三类取舍分别是:

  • 技能目录:我需要 skill 时会在任务里明确点名,或者直接让 Codex 读取对应SKILL.md。每轮自动携带一份 1,700~1,800 Token 左右的目录,对我收益不高。
  • 记忆:工程规则应该以仓库文件为准。我宁愿保留可审查的AGENTS.md,也不希望旧项目偏好或历史总结在新 task 中自动参与判断。
  • Plugins:纯本地编码很少用外部服务。关闭 Plugins 既移除说明和推荐,也明确放弃插件工具与插件 skill 发现。

我保留 permissions、environment、AGENTS.md和协作/工具说明,因为它们直接影响命令是否能成功、路径是否正确、项目规范是否被遵守。省 Token 不是目标,正确完成任务、少返工才是。

我的判断可以压缩成下面这张表:

使用场景技能目录记忆Plugins
成熟仓库、纯本地编码、会显式点名 skill可关可关可关
不熟悉的仓库,希望 Codex 自动发现工作流开视情况视情况
长期个人项目,需要跨 task 保留偏好和背景视情况开视情况
Slack/Gmail/Drive/Figma/日历等跨应用任务视情况视情况开
探索性任务,不确定会用到什么能力开开开

如果只想做风险最低的一步,优先考虑项目级关闭技能目录;Memory 和 Plugins 是用户级设置,会影响本机其他 Codex 项目的新 task,决定前应逐个检查。

手工调查太容易出错,所以我做了个工具

这次调查最后变成了 Skill Doctor 里的 Codex 优化流程。它不会上传会话,也不会修改历史 JSONL;它做的是把“看证据、算范围、改配置、建新 task 验证”串在一起。

直接运行:

npx @evilstar2025/skill-doctor ui

第一步是选 Codex,进入“优化建议”,先看本周或本月的 task、turn、模型响应、输入/缓存/输出 Token 和 API 等价金额。明细最多显示 20 条,但周期总计不会截断。

第二步是逐项看影响。工具会显示作用范围、历史 block 证据、覆盖响应数、Token 与费用区间。Plugins 会明确标成全局高影响项。

无法可靠控制的项目会单独列出原因,例如推荐列表不能在 Desktop 中可靠地独立关闭、项目级单 skill 规则未生效、压缩后的上下文证据已经失效。证据不够时显示未知。

确认前可以看原始会话与配置后预览。右侧只移除勾选的 block,permissions、AGENTS.md、environment 等保留项不会被顺手删掉。

最后,用户级操作必须确认“影响本机所有 Codex 项目”。写入成功只代表配置已修改,页面仍会显示“待验证”;需要新建一个同项目 task,再读取新的完整会话头,确认目标 metadata kind 真正消失。

完整路径是:

  1. 选择 Codex 和统计周期;
  2. 先看会话开销与证据覆盖;
  3. 逐项阅读“会失去什么”;
  4. 查看会话前后差异;
  5. 确认项目级或用户级影响并写入;
  6. 新建 task;
  7. 回到工具验证目标 block 是否真的消失。

文中截图来自本地 UI 的另一统计时点,用于说明操作流程;截图金额采用工具内置价格表快照,不等于本文 2026-09-07 至 09-13 样本的复算结果,也不是订阅账单。


如果你愿意试用,欢迎把不同 Codex 版本、不同平台的验证结果和反例提到 GitHub Issues,也欢迎一起完善 block 映射、价格口径和测试样本。

Astra 的深度用户(Pro5x, Pro20X)还是很值得尝试的!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询