标签 codex CLi 下的文章

整理 | 华卫

 

用一个 PostgreSQL 主库和 50 个只读副本,就顶住了 ChatGPT 上的 8 亿用户!

 

近日,OpenAI 的工程师们不仅爆出了这一惊人消息,还直接把 Codex 的“大脑”给扒了个精光。在 OpenAI 官方工程博客主页,OpenAI 工程师、Technical Staff 成员 Michael Bolin 发布了一篇文章,以“揭秘 Codex 智能体循环”为题,深入揭秘了 Codex CLI 的核心框架:智能体循环(Agent Loop),并详细讲解了 Codex 在查询模型时如何构建和管理其上下文,以及适用于所有基于 Responses API 构建智能体循环的实用注意事项和最佳实践。

 

这些消息传出后,在 Hacker News 等技术论坛及社交平台上获得了高度关注。“看似平淡的技术最终会胜出。OpenAI 正在证明,优秀的架构远胜于花哨的工具。”

 

值得一提的是,有网友透露,前不久 Anthropic 的一位工程师称“他们用于 Claude Code UI 的架构糟糕且效率低下”。而就在刚刚,X 上出现一条爆料:Codex 已接管 OpenAI 100%的代码编写工作。

 

对于“你们有多少百分比的编码工作是基于 OpenAI 模型进行”的问题,roon 表示,“100%,我不再写代码了。”而此前,Sam Altman 曾公开发帖称,“roon 是我的小号。”

 

Codex 的“大脑”揭秘

“每个人工智能智能体的核心都是 Agent Loop,负责协调用户、模型以及模型调用以执行有意义的软件工作的工具之间的交互。”

 

据介绍,在 OpenAI 内部,“Codex”涵盖了一系列软件智能体产品,包括 Codex CLI、Codex Cloud 和 Codex VS Code 插件,而支撑它们的框架和执行逻辑是同一个。

 

Agent Loop 的简化示意图

 

首先,智能体会从用户那里接收输入,并将其纳入为模型准备的文本指令集,该指令集被称为提示词。下一步是通过向模型发送指令并要求其生成响应来查询模型,这个过程称为推理。推理过程中,文本提示词首先被转换为一系列输入 token,随后被用于对模型进行采样,生成新的输出 token 序列。输出 token 会被还原为文本,成为模型的回复。由于 token 是逐步生成的,该还原过程可与模型的运行同步进行,这也是众多基于大语言模型的应用支持流式输出的原因。实际应用中,推理功能通常封装在文本 API 后方,从而抽象化词元化的细节。

 

推理步骤完成后,模型会产生两种结果:(1)针对用户的原始输入生成最终回复;(2)要求智能体执行某项工具调用操作。若为第二种情况,智能体将执行该工具调用并将工具输出结果附加至原始提示词中。该输出结果会被用于生成新的输入内容,再次对模型进行查询;智能体随后会结合这些新信息,重新尝试完成任务。这一过程会不断重复,直至模型停止发出工具调用指令,转而生成面向用户的消息(在 OpenAI 的模型中,该消息被称为助手消息)。多数情况下,这条消息会直接解答用户的原始请求,也可能是向用户提出的跟进问题。

 

由于智能体可执行能对本地环境进行修改的工具调用,其 “输出” 并不仅限于助手消息。在很多场景下,软件智能体的核心输出是在用户设备上编写或编辑的代码。但无论何种情况,每一轮交互最终都会以一条助手消息收尾,该消息是智能体循环进入终止状态的信号。从智能体的角度来看,其任务已完成,操作控制权将交还给用户。

 

多轮智能体循环

 

这意味着,对话内容越丰富,用于模型采样的提示词长度也会随之增加。而所有模型都存在上下文窗口限制,即其单次推理调用可处理的 token 最大数量,智能体可能在单次对话轮次中发起数百次工具调用,这有可能耗尽上下文窗口的容量。因此,上下文窗口管理是智能体的多项职责之一。

这套智能体循环如何运行?

据介绍,Codex 正是借助响应 API 来驱动这套智能体循环的,博文曝出许多背后的实际运行细节,包括:

  • Codex 不会把用户的话直接给大模型用,而是会主动“拼接”出一整套精心设计的提示词结构,且涵盖多个角色的指令、用户输入的一句话在结尾才出现。

  • 模型推理与工具调用之间可能会进行多轮迭代,提示词的内容会持续增加。

构建初始提示词

作为终端用户,在调用响应 API 时无需逐字指定用于模型采样的提示词,只需在查询中指定各类输入类型,由响应 API 服务器决定如何将这些信息组织为模型可处理的提示词格式。在初始提示词中,列表中的每个条目均关联一个角色。该角色决定了对应内容的权重占比,优先级从高到低分为以下几类:系统、开发者、用户、助手。

 

响应 API 接收包含多个参数的 JSON 负载,其中三个核心参数有:

  • 指令:插入模型上下文的系统(或开发者)消息

  • 工具:模型生成回复过程中可调用的工具列表

  • 输入:向模型传入的文本、图片或文件输入列表

 

在 Codex 中,若已配置,指令字段的内容会从~/.codex/config.toml 配置文件中的模型指令文件读取;若未配置,则使用与该模型关联的基础指令。模型专属指令存储在 Codex 代码仓库中,并被打包至命令行工具中。工具字段为符合响应 API 定义的模式的工具定义列表。对于 Codex 而言,该列表包含三部分工具:Codex 命令行工具自带的工具、响应 API 提供且开放给 Codex 使用的工具,以及通常由用户通过 MCP 服务器提供的自定义工具。JSON 负载的输入字段为一个条目列表。在添加用户消息前,Codex 会先向该输入中插入以下条目:

 

1. 一条角色为开发者(role=developer)的消息,用于描述仅适用于工具部分中定义的 Codex 内置 Shell 工具的沙箱环境。也就是说,其他工具(如由 MCP 服务器提供的工具)并不受 Codex 的沙箱限制,需自行负责实施自身的防护规则。该消息基于模板构建,核心内容均来自打包在 Codex 命令行工具中的 Markdown 代码片段。

2.一条角色为开发者的消息,其内容为从用户的 config.toml 配置文件中读取的 developer_instructions 配置值。

3.一条角色为用户的消息,其内容为用户指令;该内容并非来源于单个文件,而是从多个数据源聚合而来。一般而言,表述越具体的指令,排序越靠后:

  • 加载 $CODEX_HOME 目录下 AGENTS.override.md 和 AGENTS.md 文件的内容

  • 在默认 32 千字节的大小限制内,从当前工作目录对应的 Git / 项目根目录(若存在)向上遍历至当前工作目录本身,加载任意 AGENTS.override.md、AGENTS.md 文件的内容,或加载 config.toml 配置文件中 project_doc_fallback_filenames 参数指定的任意文件内容

  • 若已配置相关技能,则补充以下内容:关于技能的简短引言、各技能对应的技能元数据、技能使用方法说明章节。

4. 一条角色为用户的消息,用于描述智能体当前的运行本地环境,其中会明确当前工作目录及用户所使用的终端 Shell 信息。

 

当 Codex 完成上述所有计算并完成输入初始化后,会追加用户消息以启动对话。需注意的是,输入中的每一个元素都是一个 JSON 对象,包含类型、角色和内容三个字段。当 Codex 构建好要发送至响应 API 的完整 JSON 负载后,会根据~/.codex/config.toml 中响应 API 端点的配置方式,携带授权请求头发起 HTTP POST 请求(若有指定,还会添加额外的 HTTP 请求头和查询参数)。当 OpenAI 响应 API 服务器接收到该请求后,会使用 JSON 数据来推导出模型的提示信息,(需要说明的是,Responses API 的自定义实现可能会采用不同的方法)。

 

可见,提示词中前三项的顺序由服务器决定,而非客户端。也就是说,这三项里仅系统消息的内容同样由服务器控制,工具与指令则均由客户端决定。紧随其后的是 JSON 负载中的输入内容,至此提示词拼接完成。

模型采样

提示词准备就绪后,模型才开始进行进行采样。

 

第一轮交互:此次向响应 API 发起的 HTTP 请求,将启动 Codex 中对话的第一轮交互。服务器会以服务器发送事件(SSE)流的形式进行响应,每个事件的数据均为一个 JSON 负载,其 type 字段以 response 开头。Codex 接收该事件流并将其重新发布为可供客户端调用的内部事件对象。`response.output_text.delta`这类事件用于为用户界面实现流式输出功能,而`response.output_item.added`等其他事件则会被转换为对象,附加至输入内容中,为后续的响应 API 调用所用。

 

若首次向响应 API 发起的请求返回两个`response.output_item.done`事件,一个类型为推理(reasoning),一个类型为函数调用(function_call),那么当结合工具调用的返回结果再次向模型发起查询时,这些事件必须在 JSON 的输入字段中进行体现。后续查询中用于模型采样的最终提示词结构如下:

 

需要特别注意的是,旧提示词是新提示词的完整前缀。这一设计是有意为之的,因为它能让用户借助提示词缓存提升后续请求的效率。

 

在 Codex 命令行工具中,会将助手消息展示给用户,并聚焦输入编辑区,以此提示用户轮到其继续对话。若用户做出回应,上一轮的助手消息以及用户的新消息均需附加至响应 API 请求的输入字段中,从而开启新一轮对话。同样,由于对话处于持续进行的状态,发送至响应 API 的输入内容长度也会不断增加。

 

弃用简单参数费力做优化,就为了用户隐私?

“在对话过程中,发送至响应 API 的 JSON 数据量,是否会让智能体循环的时间复杂度达到二次方级别?”答案是肯定的。

 

据悉,尽管响应 API 支持通过可选的 previous_response_id 参数缓解这一问题,但目前 Codex 并未启用该参数,主要是为了保证请求完全无状态,并兼容零数据保留(ZDR) 配置,即不存储用户对话数据。

 

取而代之的,是两套需投入大量研发精力、涉及复杂实施流程的技术策略。文中,OpenAI 详细介绍了这两项硬核优化的具体方案。

 

通常,模型采样的开销远高于网络传输的开销,采样环节会成为优化效率的核心目标,这也是提示词缓存至关重要的原因,它能复用前一次推理调用的计算结果。当缓存命中时,模型采样的时间复杂度将从二次方降至线性。OpenAI 相关的提示词缓存文档对这一机制有更详细的说明:仅当提示词存在完全匹配的前缀时,才有可能实现缓存命中。为充分发挥缓存的优势,需将指令、示例等静态内容置于提示词开头,而将用户专属信息等可变内容放在末尾。这一原则同样适用于图片和工具,且其内容在各次请求中必须保持完全一致。

 

基于这一原则,Codex 中可能有以下导致缓存未命中的操作:

  1. 在对话过程中修改模型可调用的工具列表;

  2. 更换响应 API 请求的目标模型(实际场景中,这会改变原始提示词中的第三项内容,因该部分包含模型专属指令);

  3. 修改沙箱配置、审批模式或当前工作目录。

 

因此,Codex 团队在为命令行工具开发新功能时,必须审慎考量,避免新功能破坏提示词缓存机制。例如,他们最初对 MCP 工具的支持曾出现一个漏洞:工具的枚举顺序无法保持一致,进而导致缓存未命中。需要注意的是,MCP 工具的处理难度尤为突出,因为 MCP 服务器可通过 notifications/tools/list_changed 通知,动态修改其提供的工具列表。若在长对话过程中响应该通知,极易引发高成本的缓存未命中问题。

 

在可能的情况下,针对对话过程中发生的配置变更,他们会通过在输入中追加新消息的方式体现变更,而非修改已有的早期消息:

  • 若沙箱配置或审批模式发生变更,我们会插入一条新的role=developer消息,格式与原始的条目保持一致;

  • 若当前工作目录发生变更,我们会插入一条新的role=user消息,格式与原始的条目保持一致。

 

据介绍,为保障性能,OpenAI 在实现缓存命中方面投入了大量精力。除此之外,他们还重点管理了一项核心资源:上下文窗口。

 

其规避上下文窗口耗尽的通用策略是:一旦词元数量超过某个阈值,就对对话进行压缩。具体来说,会用一个更精简、且能代表对话核心内容的新条目列表替代原有输入,让智能体在继续执行任务时仍能理解此前的对话过程。早期的压缩功能实现方案,需要用户手动调用/compact 命令,该命令会结合现有对话内容和自定义的摘要生成指令,向响应 API 发起查询;Codex 则会将返回的、包含对话摘要的助手消息,作为后续对话轮次的新输入。

 

此后,响应 API 不断迭代,新增了专用的/responses/compact 端点,能以更高效率完成压缩操作。该端点会返回一个条目列表,可替代原有输入继续对话,同时释放出更多的上下文窗口空间。该列表中包含一个特殊的 type=compaction 条目,其附带的 encrypted_content 加密字段为透明化设计,可保留模型对原始对话的潜在理解。

 

现在,当词元数量超过 auto_compact_limit 自动压缩阈值时,Codex 会自动调用该端点对对话内容进行压缩。

极限扩容:用 1 个数据库扛住了 8 亿用户

在另一篇技术博文中,OpenAI 工程师 Bohan Zhang 介绍, OpenAI 通过严苛的技术优化与扎实的工程实践,对单个数据库 PostgreSQL 进行深度扩容,实现以单套体系支撑 8 亿用户、每秒数百万次查询的访问需求。

 

据称,多年来,PostgreSQL 一直是支撑 ChatGPT、OpenAI API 等核心产品的核心底层数据系统之一。过去一年,公司 PostgreSQL 的负载增长超 10 倍,且这一增长趋势仍在持续加速。OpenAI 称,PostgreSQL 的横向扩展能力远超此前行业普遍认知,能够稳定支撑规模大得多的读密集型工作负载。“这套最初由加州大学伯克利分校的科学家团队研发的系统,助力我们通过单主节点 Azure PostgreSQL 弹性服务器实例,搭配分布在全球多个区域的近 50 个只读副本,承接了海量的全球访问流量。”

 

而且,OpenAI 表示,其扩容在实现规模提升的同时,始终将延迟控制与可靠性优化放在核心位置:生产环境中,客户端 99 分位延迟稳定保持在十几毫秒的低水平,服务可用性达到五个九标准;过去 12 个月内,PostgreSQL 仅出现过一次零级严重故障,该故障发生在 ChatGPT 图像生成功能爆红上线期间,一周内超 1 亿新用户注册导致写流量突发暴涨超 10 倍。

 

尽管 PostgreSQL 的扩容成果已达预期,OpenAI 仍在持续探索其性能极限。目前,他们已将可分片的写密集型业务负载迁移至 CosmosDB 等分片式数据库系统;对于分片难度更高的剩余写密集型负载,相关迁移工作也在积极推进,以此进一步减轻 PostgreSQL 主节点的写压力。同时,OpenAI 正与微软 Azure 团队展开合作,推动级联复制功能落地,实现只读副本的安全、大规模扩容。随着基础设施需求的持续增长,其将继续探索更多扩容方案,包括基于 PostgreSQL 的分片架构改造、引入其他分布式数据库系统等。

 

有网友评价道,“这招的高明之处,就在于极简。他们没用什么花里胡哨的冷门技术,不过是把最佳实践做到了极致。过去十年,行业里全是 ‘一切皆分片、拥抱 NoSQL、全面分布式,为 CAP 定理折腰’ 的论调,而 OpenAI 倒好, 服务十亿级用户的解法,居然只是一句‘试过加只读副本吗?’”

 

参考链接:

https://openai.com/index/unrolling-the-codex-agent-loop/

https://openai.com/index/scaling-postgresql/

最近把代理服务器 IP 换了下,从 192.168.0.13 换成了 192.168.0.170,在远端 Linux 上用 Codex CLI 走新服务器的 HTTP 代理,遇到报错:

stream disconnected before completion: error sending request for url (https://chatgpt.com/backend-api/codex/responses)

export RUST_LOG=trace 打开 trace 级别日志后,查看 ~/.codex/log/codex-tui.log,发现它竟然去连旧代理 192.168.0.13:7890,并报 Host is unreachable

最诡异的是:我检查运行中的 codex 进程环境变量,里面完全看不到旧代理。
这里我采用了原来帖子里处理 codex VSCode 插件的方法直接添加了代理所以看不到原来的旧代理:

#!/usr/bin/env bash set -euo pipefail

unset http_proxy https_proxy all_proxy no_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY

PROXY="http://192.168.0.170:7890" export http_proxy="$PROXY" export https_proxy="$PROXY" export all_proxy="$PROXY" export HTTP_PROXY="$PROXY" export HTTPS_PROXY="$PROXY" export ALL_PROXY="$PROXY" export NO_PROXY="localhost,127.0.0.1,::1" export no_proxy="$NO_PROXY" # 用于确认 VS Code/CLI 实际有没有跑到这个 wrapper env | grep -i _proxy > "/tmp/codex-proxy-env.$$.txt"

HERE="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" exec "$HERE/codex.real" "$@" 

1)我怎么确认 “进程 environ 里没有旧代理”

我用下面命令抓 codex 相关进程的环境变量:

查看 codex 进程对应的环境变量

for p in $(pgrep -af codex | awk '{print $1}'); do echo "=== PID $p exe=$(readlink -f /proc/$p/exe 2>/dev/null) ===" tr '\0' '\n' < /proc/$p/environ 2>/dev/null | grep -iE '(^|_)proxy=' || true done 

输出看起来代理都是统一的(只有新代理 192.168.0.170):

=== PID 1703340 exe=/home/user/.vscode-server/extensions/openai.chatgpt-0.4.62-linux-arm64/bin/linux-aarch64/codex.real ===
HTTPS_PROXY=http://192.168.0.170:7890
HTTP_PROXY=http://192.168.0.170:7890
=== PID 1713620 exe=/home/user/.local/node/bin/node ===
no_proxy=localhost,127.0.0.1,::1
https_proxy=http://192.168.0.170:7890
NO_PROXY=localhost,127.0.0.1,::1
HTTPS_PROXY=http://192.168.0.170:7890
HTTP_PROXY=http://192.168.0.170:7890
http_proxy=http://192.168.0.170:7890
ALL_PROXY=http://192.168.0.170:7890
all_proxy=http://192.168.0.170:7890
=== PID 1713631 exe=/home/user/.local/node/lib/node_modules/@openai/codex/vendor/aarch64-unknown-linux-musl/codex/codex ===
no_proxy=localhost,127.0.0.1,::1
https_proxy=http://192.168.0.170:7890
NO_PROXY=localhost,127.0.0.1,::1
HTTPS_PROXY=http://192.168.0.170:7890
HTTP_PROXY=http://192.168.0.170:7890
http_proxy=http://192.168.0.170:7890
ALL_PROXY=http://192.168.0.170:7890
all_proxy=http://192.168.0.170:7890

2) 但 trace 日志里仍然出现旧代理

我开启 trace:

追踪 codex 执行的日志

export RUST_LOG=trace
codex

然后在~/.codex/log/codex-tui.log 里看到它尝试连接旧代理 192.168.0.13:7890(典型是 reqwest /hyper 的 connect error)。

3) 最终根因:~/.codex/.env 里残留了旧代理

看了下常规的~/.bashrc , /etc/bash.bashrc 都没有老代理的影子,使用才最残暴的 sudo grep -nri 192.168.0.13 /* 暴力搜索所有文件夹下包含老代理的 IP。最后发现我以前在~/.codex/.env 里写过旧的 http_proxy/https_proxy,后来忘了删。。。。删除后,问题解决。

4) 经验总结

只看 /proc/$PID/environ 可能会被误导:即便进程环境里已经是新代理,codex-tui.log 仍可能暴露 “.env 残留的旧代理”。这时候一定要善用 export RUST_LOG=trace 来观察 codex 运行日志。


📌 转载信息
原作者:
LeBronGanDalf
转载时间:
2026/1/24 06:56:01

本人目前在 Windows 上使用 Codex 辅助开发,但体验不太好,希望能有一个更好的方式调用 codex。目前尝试过的调用方式有:VScode 插件、Codex Cli、WSL 中的 Codex Cli,对比下来,目前主要选择 Codex Cli 的方式进行调用。

codex 三种调用方式各自存在的问题:

  • VScode 插件: UI 美观,与 VScode 兼容性好,但最大的问题是无法回退对话重新发问,只能继续现有对话,本人很介意这一点,故放弃使用 Codex VScode 插件
  • Codex Cli: 可以回退,全键盘操作方便,其问题在于存在大量 Bug:
    1. 默认的沙盒模式不完善,会出现意料之外的问题;而第三档全同意的代理可能不安全。
    2. 粘贴换行文本时会出现将换行符理解为发送的情况,很不人性化,在更新后此情况似乎得到缓解。
    3. 输入中文时会出现实际显示的中文与输入的中文不一样的情况,可能与输入法有关系,在最近更新后此情况变得格外严重
  • WSL 中的 Codex Cli:体验过一段时间,问题在于打开麻烦,且路径与 windows 路径不一致,可能会出现问题,但 bug 比较少

综合考量,我的方案是直接使用 Codex Cli,启动操作简单,也可以正常使用,但上述相关 bug 仍然困扰着我,希望能找到一种全新的使用 Codex 的方案以解决这些问题

解决思路

目前似乎没有发现能够解决这些问题的项目,但我注意到 codex 官方已经发布了 Codex SDK ,期待有大佬能够基于 SDK 开发全新的好用的软件


📌 转载信息
转载时间:
2026/1/19 18:17:03

背景信息请参考:Chrome 144 下 MCP 自动化配置大幅简化,LLM 可更方便地控制你已登录的浏览器会话了

适用场景

  • WSL(Ubuntu)+ Windows 侧浏览器(Edge/Chrome)。
  • 通过 Codex CLI 使用 chrome-devtools-mcp 连接已打开的浏览器。

配置

替换 <你的用户名> 为真实路径即可。

codex 配置

[mcp_servers.chrome-devtools] args = [
    "-y",
    "chrome-devtools-mcp@latest",
    "--auto-connect",
    '--user-data-dir=/mnt/c/Users/<你的用户名>/AppData/Local/Microsoft/Edge/User Data',
]
command = "npx" type = "stdio" startup_timeout_sec = 120 

如果你用的是 Chrome,把 --user-data-dir 改成:

C:\\Users\\<你的用户名>\\AppData\\Local\\Google\\Chrome\\User Data

使用步骤

  1. 在 Windows 侧先打开 Edge/Chrome(确保与 --user-data-dir 一致)。
  2. 在 Codex CLI 中调用 chrome-devtools 相关工具查看页面列表,确认连接成功。

注意事项

记得去 edge://inspect/#remote-debugging 打开权限,每次连接都需要同意


📌 转载信息
原作者:
Robin
转载时间:
2026/1/19 17:38:22

推荐 codex cli,便宜好用,建议开 xhigh 档。

把你的作业要求粘到一个 markdown 文件中。

对于代码任务,codex 直接自己生成自己跑就行。

对于文字任务
如果是报告类,让 codex 直接用 latex 写,给大家一个润色用的 prompt。
“将所有的句子、过渡词和连接词替换为最基础、最常用的词语。尽量使用简单、直接的表达方式,避免使用复杂或生僻的词汇,确保句子之间的逻辑关系清晰,删掉文末总结的部分。 避免使用机械化的连接词 (如 “首先”“其次”“然后”),改用更具连贯性的自然过渡;通过使用多样化句式,混合简单句、复合句和插入语使表达更富有层次感,同时避免连续短句或过于整齐的句式。在叙述数据或结论时,补充背景信息或个人研究观察,使内容更加具体并贴近实际研究场景,并通过问题引导或总结的方式实现段落之间的自然过渡,避免生硬切换,从而提升整体阅读的流畅性和逻辑性。不要使用太多的无序号分点,保持报告的学术性。”

如果是 PPT 类,让 codex 用 latex 的 beamer 模板写一个就行。

选择 latex,不仅给予了 ai 一个很好的交互载体,而且写出来的东西逼格较高,老师喜欢。

如果是写一个小学术 paper 这种,给大家另一套 prompt。
“Act as a senior academic editor and domain expert in [nsert Field, e.g., Computer Vision] topolish the following text for a top-tier publication (Ce.g., CVPR, IEEE). You must strictlyeliminate “Al-style” writing patterns by adhering to these constraints: do not useparentheses for supplementary information but integrate them syntactically; avoid hollow"A-B-C" parallel structures and forced symmetry; do not coin new terms or place standardconcepts in quotation marks; strictly preserve all technical terminology, LaTeX formulas.variables, and data values without modification; adopt a critical, analytical tone rather than apassive summary; absolutely ban cliche openers (e.g., “In the realm of”,“In the landscape of”.“Delve into”) and minimize mechanical transition words; ensure seamless logical flowbetween sentences to prevent abrupt jumps; avoid using slashes or excessive bolding; andnever hallucinate data or references. The final output must be concise, logically coherent.and indistinguishable from expert human writing.”

你只需要把工作流整理好发给 codex,就可以美美睡觉,一觉起来作业就做完了。
(当然以上内容仅限 cs 类专业)


📌 转载信息
原作者:
Jasper1024
转载时间:
2026/1/16 12:29:54

安装简单,git 下来之后直接 install 就好,里面有安装命令。

因为本人通过反重力反代可以使用 claude 另外加入了 gpt team, 有了三个都可以用的编程工具,感觉荒废不太好,就各取所长。本人比较喜欢反重力的 ui 和计划模式,能够掌控全局,而他的 planning 模式像是产品经理,而 cc 和 cx 是很好的执行者,于是尝试了这个工作流,让他能够创建计划后让用户审批,然后他会让 cx 或者 cc 去执行,最后他自行审批,然后让用户判断是否达标。
欢迎大家使用尝试并且反馈问题。


📌 转载信息
原作者:
N1nEmAn
转载时间:
2026/1/14 17:41:39

我是从 codex cli 出来就开始使用的,现在工作上完全使用 codex。我觉得 codex 并没有说的这么差而且只要用好基本能解决所有问题。
下面是一些基本情况大家了解一下
1、机器是 macboompro m1 max
2、使用语言为 java 开发都是 web 相关的项目 (最近在学 rust)
3、从今年 a÷ 出过公开敌对中国事件后我就没使用 claude code 了,账号我也发邮件让他们删除了
4、codex 我只使用 cli,插件没用过,一般都是在 vs 中删除多余的会话
看过贴吧很多帖子与问题示例后觉得很多人使用不好的原因是对模型缺乏一个基本的了解,所有我先给大家介绍一些模型的基本知识
一、模型的数据是哪里来的

公开可获取的互联网文本、技术博客、论坛、文档网站、百科内容、说明文档、博客文章、开源代码 (github)、额外授权的书籍、文档、人工清晰构造的高质量样本 (比如在强化学习和标注数据阶段模型公司就会出一些问题然后邀请专家来为这个问题编写高质量的回答

二、token 是什么

模型内部用于计算的最小文本单元,token 的切分由 tokenizer 决定,与自然语言的词法规则不完全一致 (大家可以通过这个网站去体验一下 https://tiktokenizer.f2api.com)

三、一个模型产生的大致阶段

1、预训练阶段
这一阶段是训练成本最高的,大模型训练的费用大部分都是花费在这个上面
预训练使用的是大量弱结构数据,包括自然语言与代码混合语料。数据不以任务、指令、问答为单位而是以连续文本流的形式输入。模型看到的只是 token 序列,这一阶段模型主要训练结构建模能力 (语言语法、代码语法、嵌套结构、长程依赖关系)、 统计语义关联 (哪些概念常一起出现,哪些模式在特定上下文中更高概率成立) 、跨域泛化能力 (不同语言、不同编程语言、不同写作风格之间的共享模式)。预训练模型不知道自己在回答问题不具备帮助用户解决问题不区分真实与虚假,只区分哪些 token 常见与罕见
2、标注训练
使用人工编写的高质量样本对模型进行监督训练,这些样本通常以指令、问题、代码需求等形式出现,并配有明确的理想回答。具体可参考 openai 的这篇论文 https://arxiv.org/pdf/2203.02155 (3.4 章节)
这一阶段的核心作用是约束模型的输出行为,让模型从单出的对互联网数据回忆续写文本转变为尝试按人类指令完成任务。标注训练本身并不显著增加新知识,而是让模型用已有知识解决用户的具体问题。
3、强化学习
在标注训练基础上,通过让人类对多个模型回答进行排序,训练奖励模型,再用强化学习算法调整主模型的输出概率分布。强化学习降低胡编概率、提升回答一致性,并强化安全边界与拒答行为用于调整输出倾向

上面这些内容了解一下就行,我自己也是懂了个皮毛所以里面肯定有很多错误。具体信息可以去看 Andrej Karpathy 的视频

b 站的飞天闪客也可稍微看一下
了解了这些后我们可以简单将大模型的一个会话抽象理解成一个持续输出的一维的 token 数组,你在上下文的输入会影响这次会话中模型的输出而且这个影响会发生的很快,当你发现模型的输出开始出现问题或者风格不是需要的最好检查一下你输入了什么,当然你也可以在发现问题时直接纠正,将他改造成你喜欢的样子。推荐在工作的工程中尽量减少语气化的输入 (你认为我在跟你嘻嘻哈哈么?我看起来现在是想跟你搞七捻三么)
毁灭吧我累了,猜猜我按下这个按钮会发生什么

了解了这些你大概就明白为什么你的模型总是不办事或者办事办的乱七八糟的,当然和模型本身的能力也是有关系的
接线来给大家介绍一下 codex cli

这是一个 code agent 你可以在本地或者 ide 插件中去使用,它能够使用内置工具帮助你从 0 开始完成一些编码任务
工程结构
模型层
负责理解指令、分析上下文、生成计划与代码,本质是一个经过对齐的代码模型。
执行层
负责把模型输出转化为可执行动作,例如:读文件、改代码、运行命令、调用工具,并记录完整执行轨迹。
环境层
即你当前的本地仓库或云环境,包括文件系统、git 状态、依赖环境、网络权限等。
Codex 启动时会构建一个指令链,不是简单拼一段 prompt。这个指令链在一次会话(CLI session /exec run)开始时构建完成,之后整个执行过程都基于它运行。
AGENTS.md 是配置规则的核心入口,Codex 会在执行任何任务前,自动搜索并加载 AGENTS.md 文件。这些文件不需要你在 prompt 中显式提到,只要存在,就会被自动纳入上下文窗口。

  1. 全局规则(Global)
  • 目录:~/.codex/
  • 优先级:
    • AGENTS.override.md
    • AGENTS.md
  • 只读取第一个非空文件
  1. 项目规则(Project)
  • 从项目根目录开始
  • 一直向下走到当前工作目录
  • 每一层目录最多加载一个文件,顺序为:
    • AGENTS.override.md
    • AGENTS.md
    • 备用文件名(如 TEAM_GUIDE.md)
  1. 合并规则
  • 所有命中的文件会按目录顺序拼接
  • 越靠近当前目录的规则优先级越高
  • 后出现的规则可以覆盖前面的约定
  1. 窗口大小与 rule 截断
  • 所有规则文件会被拼接进模型上下文
  • 超过上限后,后续规则不会被继续加载

以上是它默认的执行链,可以自己去配置加载的路径。官方文档中有说我就不详细说了

接下来讲讲 MCP

MCP 是 模型 用来接入外部工具和上下文的统一协议。
它解决的问题是:模型如何在不内嵌能力的前提下,安全、可控地使用外部系统。
我一般将它理解为微服务架构中的一个微服务
我只装了这三个 mcp,
context7
用来查开源项目的最新文档,模型工作时优先使用的是训练数据有些数据和技术可能太老。
GitHub - upstash/context7: Context7 MCP Server -- Up-to-date code documentation for LLMs and AI code editors
drawio
用来画图,效果不错,只尝试过一次。
GitHub - lgazo/drawio-mcp-server: Draw.io Model Context Protocol (MCP) Server
database
模型在工作时最好能了解你的数据模型,使用这个就可以让他在实现需求时结合数据库中的数据与表结构思考减少因为信息不完整时的错误实现,这个 mcp 只包含查询功能
MCP - 数据库查询 MCP

接下来说说 skill

这个东西在我的印象中好像出了很久了,但是站里还是有相当一部分再问,我觉得有点困惑 。
skill 本质就是将原本需要在 agents.md 中编写的一些规则抽象成一个单独的文档让模型在执行任务时可以自己根据 description 判断是否需要读取这些内容。它解决的是 agents.md 中内容爆炸的问题,agents.md 中的内容是第一次启动时才会构建,这样随着上下文的延长他就会离当前的上下文距离越远。skill 可以随时重新让模型读取,离当前上下文越近模型执行执行力就越高 (当时使用 atlas 看官方文档时的那个会话一直嘴硬跟我说使用必须手动用命令告诉模型使用 $skill-name, 我后面的测试中是不用的。模型会自己判断加载,当然如果你发现它不遵守也可手动在输入中告诉他遵守这个 skill。所以 skill 的描述不要太接近,相同的内容放在同一个 skill 中就行了,输入命令如果前方有你的输入记得加空格,命令如果是在最前面就不用)


然后讲讲 cli 中一些命令

我使用过的只用 init、review、resume 。其他的好像用不到啊
init
就是用来初始化你的项目生成 agents.md 的
这个东西我一般把他放在项目根目录初始化时直接告诉告诉他根据 agent-md-example/agent-init.md 中的规则初始化项目


v2-2025-12-19.zip
这个 google-java-style-guide.md 我是在网上找的然后整理成 md 的,是不是 google 的我也不确定,随便啦。
Google Java Style Guide
resume
用来恢复会话的
review
可以让来对比提交、分支、未提交的代码对比检验模型的实现是否正确的


一般都是用第 4 个自定义指令,让他明确的只校验当前功能相关的代码也减少一些 token 消耗,现在 review 也有额度了,元旦过后就加了。说实话其余的我真没用到过,大家如果需要可以去它官方文档中自行查询
Codex

接下来讲讲一些 chatgpt 的使用经验吧,说实话现在不用 gemini 的部分原因就是他的其他产品特别好用,比如会话记忆、自定义风格、自定义 gpt。5.2 更新后我感觉 gpt 风格变得越来越油腻和谄媚了,动不动就罗里吧嗦的说一堆废话,还特别喜欢一句话总结。我总结你 xxxx
自定义 gpt


这个功能创建和修改目前只支持 web,app 端可以使用创建好的但是不能修改或创建,他的作用就相当于你自定义一个带系统提示词的会话,这样就不用每次开新会话想让他做一些固定事情是还要跟它解释半天了,你把他理解成一个自定义 skill 就行比如翻译


这是我自定义的一个用来专门翻译的,以后我用这个 gpt 创建一个会话时直接将英文文档给他就行了


自定义风格
这个我就把我自己的个性化定义提示词给大家参考一下

Language & Tone
Default language: Chinese
Use technical, engineering-oriented language
State facts and conclusions only
No rhetorical or evaluative language

Default Output Rules (Strict)
Answer directly
No preamble, no small talk, no evaluation, no opening remarks
Do not restate the question
Do not use phrases like “this is a good question”, “let’s first”, “in conclusion”, etc.
No explanations by default
Maximum 5 lines unless explicitly requested

Explanation Rules
Explanations are allowed only if the prompt explicitly includes keywords:
“why”, “explain”, “reason”, “principle”, “details”, “expand”
If none of these keywords appear, treat the request as answer-only

Content Constraints
No tutorial-style writing
No background, history, or conceptual introductions
Include only information strictly required to answer the question
Prefer precise, verifiable technical statements

Optional Trigger Keywords
“answer only”: output conclusion only
“engineering perspective”: allow implementation details and trade-offs
“expand”: allow detailed explanation

Failure Condition
Any preamble, evaluative language, or unnecessary explanation counts as a failed response

知识库
有些论文或者书籍你可以在这里新建一个知识库,然后让模型将内容总结给你,提升信息的接收速度。这里一个知识库后面是一个沙箱环境的 linux 主机,你所有上传的文件都会保存在这个沙箱环境中


兄弟们燃尽了,一滴都没有了。其中说的有些不对的地方麻烦大家给我指正一下。写了几个小时整理这个文档,很多地方怕写不对写了又删好累啊。
这个内容太长了 SKILL 的分享我就放评论区,都只有 SKILL.md 没有其他的比如

  • scripts
  • references
  • assets
    因为都不是工具类的 skill,然后给大家分享一个获取 skill 的网站
    https://skillsmp.com
    我觉得在 ai 中自己写是最符合自己需求的,需要什么就创建什么

    目前我感觉我的配置 codex 会存在几个问题,有时他不会遵守先计划再编码的规则直接就开始编码的。还有就是代码的结构有时会有点过度封装

然后就是我基于我目前的 skill 与配置给大家演示一下效果。从 0 开始简单的 copy 一个开源项目

看看 token 消耗
codex 简单复现项目地址,后端完成时间 18 分钟,前端完成时间为 10 分钟。前端我没有任何 skill 或者 agents.md 规则效果可能会差一点

token 消耗前后对比


吐槽一下,codex 感觉元旦后 token 消耗变高了,我一周只用 5 天都快感觉不够用了。以前还能剩下百分之 50,现在都只能剩下 25 了。还有上下压缩的问题,有时看剩余明明有 30,它就开始压缩了。不过压缩效果很好,目前看来没有丢失过信息,就是压缩会很慢。


📌 转载信息
原作者:
heidi
转载时间:
2026/1/11 08:32:36

Clipal:意思是 CLI 的伙伴

https://github.com/lansespirit/Clipal

项目是 go 语言的,直接编译成二进制文件,没有界面,不论 MacOS 、Linux 还是 Windows 都能运行,程序也就 6~8M ,不占用什么资源。直接 yaml 文件配置,支持热更新配置,方便后台静默运行。

不管什么系统都可以按照教程一步步操作: https://github.com/lansespirit/Clipal/tree/main/docs/zh

功能特性

  • 多 API 供应商配置,支持优先级排序,直接在配置文件定义供应商权重,我主要是为了排序高性价比的中转商

  • 自动故障转移:当前供应商失败时自动切换到下一个

  • Provider 临时禁用:鉴权/额度错误会自动 deactivate ,并按 reactivate_after 自动恢复

  • 配置热加载:更新 claude-code.yaml / codex.yaml / gemini.yaml 后自动重新加载并重新验证

  • 按日志级别输出运行日志( DEBUG/INFO/WARN/ERROR )

  • 三套独立配置文件,分别服务于:

      - Claude Code (claude-code.yaml)
    
      - Codex CLI (codex.yaml)
    
      - Gemini CLI (gemini.yaml)
    
  • 跨平台支持:macOS 、Linux 、Windows

市面上已经有好几个类似的产品了,比如 ccNexus ,不过他们都有复杂的 GUI 界面和丰富的功能,而我只是想要一个简单的服务来管理多个中转商,对于 Claude 和 gpt 不同中转商的性价比和稳定性是不一样的。想要使用高性价比的中转服务,又要无感兜底。

使用 Clipal 切换 CC 和 Codex 的 API 供应商就可以很丝滑了,基本无感,不用重启 CC 或者 Codex 了,Clipal 自动处理了。

好吧,实话说,有时候也会蹭一些免费的 API ,只需要把免费 API 添加进配置,然后设置一个权重让他优先消耗即可。


📌 转载信息
原作者:
apple
转载时间:
2025/12/26 11:48:44