1. 引言

对一线开发者而言,ChatGPT 早已不只是「聊天窗口里的代码补全」。随着 Codex 逐步并入 ChatGPT Plus 与 Pro 的能力版图,一个更实际的命题摆在面前:如何把云端编码智能体接入自己的开发工作流,让它真正完成“改代码、跑测试、提 PR”这类闭环任务,而不是只生成一段静态代码。

本文从工程视角出发,重点拆解三件事:

  1. Codex 在 ChatGPT Plus / Pro 中的技术定位与能力差异;
  2. 云端沙箱、任务循环、工具调用背后的运行时机制;
  3. 如何通过 OpenAI API / Agent SDK / CLI 把类似能力落到本地工程中。

文中包含可运行的 Python 示例与 shell 示例。模型名、接口字段以 OpenAI 官方最新文档为准,示例代码侧重演示工程模式而非某一固定版本。

2. 重新认识 Codex:不止是代码补全

早期的 Codex 主要指 code-davinci-002 这类擅长代码补全的模型;今天的 Codex 已经是三层能力叠加后的产物:

  • 模型层:负责代码理解、生成、推理与语义搜索。它决定“该写什么”。
  • 智能体层:负责任务拆解、规划与决策。它决定“先做什么、遇到错误怎么办”。
  • 执行层:提供可运行的云端沙箱环境。它负责“真正去执行命令、读写文件、安装依赖”。

理解这三层非常关键。因为它意味着 Codex 的输出不再是「建议」,而是「可验证的行为」。它可以在沙箱里真正运行 pytest、查看报错、修改代码、再次运行,直到测试通过。这与传统代码生成工具存在本质差异:反馈闭环由模型自己完成

也正是因为有执行层,Codex 才需要订阅计划中的云端计算资源与隔离环境,这也构成了 Plus 与 Pro 在技术参数上分层的来源。

3. ChatGPT Plus 与 Pro 的技术差异

本文不讨论价格与充值流程,只从技术能力维度对比两款订阅在 Codex 使用上的差异。

维度 Plus Pro
定位 个人开发者、轻量自动化 重度工程化、专业工程师
任务额度 常规配额,适合日常问答与短任务 更长的任务时长与更高的并发量
上下文窗口 标准长度 通常提供更长的上下文,便于整仓解读
沙箱并发 更少并行任务 支持更多并行任务与更长运行时长
高级能力 基础 Codex 能力 更强的推理模型、多步规划与队列优先级

对个人项目而言,Plus 足以覆盖「生成单元测试」「解释报错」「写迁移脚本」等场景;而对需要长时间运行、跨多文件重构、反复调试的大型任务,Pro 的并发与配额优势更明显。选择的关键不是价格,而是你的自动化任务有多“重”

4. Codex 的运行时架构

4.1 云端沙箱

Codex 的任务执行发生在一个隔离的容器环境中。这个沙箱通常包含:

  • 常见运行时:Python、Node.js、Bash 等;
  • 包管理器:pip、npm 等;
  • 版本控制:git;
  • 文件系统:随任务生命周期创建,可持久化到任务结束。

沙箱的意义在于:模型可以安全地执行“有副作用”的操作,而不会污染你的本地机器。

4.2 任务循环

一个典型的 Codex 任务遵循如下闭环:

接收任务描述
   ↓
理解上下文(阅读仓库、文件、issue)
   ↓
制定执行计划
   ↓
调用工具(shell / 文件读写 / git)
   ↓
观察执行结果
   ↓
判断:成功则交付;失败则修正后继续

这个循环用伪代码表示就是:

def codex_task_loop(task: str):
    context = load_repository()
    plan = make_plan(task, context)

    while not done():
        action = choose_next_action(plan, observations)
        result = execute_tool(action)   # 在沙箱中执行
        observations.append(result)

        if result.is_success:
            done = deliver()
        else:
            plan = revise_plan(observations)

    return final_diff

关键在于 execute_tool 这一步:模型不只是“想”,而是真正“做”。

4.3 权限模型

云端执行必然涉及权限。Codex 通常提供分层授权:

  • 只读模式:仅允许读取文件、查看日志;
  • 受限写模式:允许写代码但禁止修改敏感文件;
  • 审批门禁:执行 rm、修改依赖、推送远端等高风险操作前要求人工确认。

这种设计把「自主性」与「可控性」做了平衡,也是企业场景落地的关键。

5. 任务驱动的工作流

把 Codex 用好的前提是:把需求描述成可验证的任务。模糊的“帮我优化一下代码”远不如“修复 auth.py 中登录超时未处理的问题,并补充对应单测”。

推荐的协作流程是:

  1. 在 GitHub Issue 中写清背景、复现步骤、验收标准;
  2. 让 Codex 在独立分支上修改;
  3. 自动运行 CI 验证;
  4. 人工 Review diff 后合并。

这种「Issue → 分支 → 验证 → PR」的流程,能让智能体的产出始终处于可审查、可回滚的状态。

6. 动手实践:构建一个 Codex 风格的编码智能体

下面用 Python + OpenAI 官方 SDK 演示如何构建一个带工具调用的最小编码智能体。它会读取命令执行结果,并根据结果决定下一步,逻辑与 Codex 的任务循环一致。

6.1 环境准备

pip install openai

6.2 工具定义:执行命令

import json
import subprocess
from openai import OpenAI

client = OpenAI()
MODEL = "codex-mini-latest"  # 以官方最新模型名为准

TOOLS = [
    {
        "type": "function",
        "name": "run_shell_command",
        "description": "在受控沙箱中执行 shell 命令并返回 stdout/stderr",
        "parameters": {
            "type": "object",
            "properties": {
                "command": {
                    "type": "string",
                    "description": "需要执行的 shell 命令",
                }
            },
            "required": ["command"],
            "additionalProperties": False,
        },
    }
]


def run_shell_command(command: str, timeout: int = 30) -> dict:
    proc = subprocess.run(
        command,
        shell=True,
        capture_output=True,
        text=True,
        timeout=timeout,
    )
    return {
        "stdout": proc.stdout,
        "stderr": proc.stderr,
        "returncode": proc.returncode,
    }

6.3 实现工具分发

当模型返回 function_call 时,我们需要实际执行该工具并把结果回传,形成闭环。

def execute_tool(call) -> dict:
    args = json.loads(call.arguments)
    if call.name == "run_shell_command":
        return run_shell_command(args["command"])
    return {"error": f"unknown tool: {call.name}"}

6.4 编写任务循环

def agent_loop(task: str, max_steps: int = 20):
    input_items = [{"role": "user", "content": task}]

    for step in range(max_steps):
        resp = client.responses.create(
            model=MODEL,
            input=input_items,
            tools=TOOLS,
        )

        tool_handled = False
        for item in resp.output:
            if getattr(item, "type", None) == "function_call":
                result = execute_tool(item)
                input_items.append(
                    {
                        "type": "function_call_output",
                        "call_id": item.call_id,
                        "output": json.dumps(result, ensure_ascii=False),
                    }
                )
                tool_handled = True
                break

        if not tool_handled:
            return resp.output_text

        # 将助手本次的部分回复也加入上下文
        input_items.append(
            {"role": "assistant", "content": resp.output_text or ""}
        )

    return "达到最大步数,任务中断。"

6.5 运行示例

task = (
    "在 /workspace 目录下执行 pytest,"
    "如果存在失败的测试用例,请先查看失败原因,"
    "然后读取对应源码并尝试修复,最后再次运行测试。"
)
print(agent_loop(task))

这段代码演示了“执行 → 观察 → 决策”的核心模式:模型通过 run_shell_command 得到测试失败信息,随后读取文件、修改代码、再次执行,直至满足条件。

6.6 流式输出

对于长时间任务,流式输出能显著改善交互体验:

stream = client.responses.create(
    model=MODEL,
    input=[{"role": "user", "content": "解释这个报错并给出修复建议"}],
    stream=True,
)

for event in stream:
    if event.type == "response.output_text.delta":
        print(event.delta, end="", flush=True)

7. 使用 Agent SDK 扩展能力

面对更复杂的工程,直接操作 Responses API 会显得力不从心。此时可引入 openai-agents-python,它提供了更完整的智能体编排原语:

  • Tools:封装可调用的函数;
  • Guardrails:对输入输出做校验,防止越权指令;
  • Handoffs:在多个子智能体之间切换职责;
  • Sessions:管理多轮对话状态。

一个简单的带护栏示例:

from agents import Agent, Runner, function_tool
from agents.guardrail import input_guardrail

@function_tool
def read_file(path: str) -> str:
    with open(path, "r", encoding="utf-8") as f:
        return f.read()

@input_guardrail
def deny_destructive_commands(ctx, agent, input_text: str):
    forbidden = ["rm -rf", "sudo", "DROP TABLE"]
    for word in forbidden:
        if word in input_text.lower():
            return {"blocked": True, "reason": "检测到高风险操作"}
    return {"blocked": False}

agent = Agent(
    name="code-reviewer",
    instructions="你负责审查代码并只允许执行安全命令。",
    tools=[read_file],
    input_guardrails=[deny_destructive_commands],
)

result = Runner.run_sync(agent, "读取 app.py 并检查是否存在未关闭的文件句柄")
print(result.final_output)

通过 Model Context Protocol(MCP),还可以把本地数据库、内部 API、日志系统接入智能体,让 Codex 风格的任务不再局限于代码仓库。

8. Codex CLI 与本地工作流

除了网页与聊天界面,命令行是工程自动化的关键入口。一个典型的非交互式用法是把智能体接到 CI 或脚本中(以下命令为概念示例,具体参数以官方 CLI 文档为准):

# 以非交互方式执行一个修复任务
codex exec "修复 tests/test_auth.py 中的失败用例"

# 读取仓库并针对指定文件生成重构建议
codex inspect src/core/engine.py

# 在本地分支上生成改动,供人工 review
codex patch "将 user_service 中的同步调用改为异步"

将 CLI 与 git 结合后,可以形成一条半自动流水线:

git checkout -b ai/fix-flaky-tests
codex patch "修复 CI 中偶发的超时测试"
pytest
git diff

git diff 让所有改动保持透明可审,这也是把智能体引入团队协作的最低安全底线。

9. 安全边界与最佳实践

将编码智能体接入工程,需要遵守几条硬性原则:

  1. 最小权限:沙箱或本地工具只授予完成任务所需的最小能力,禁止执行任意危险命令。
  2. 审批门禁:删除文件、修改依赖、推送远端等操作必须人工确认。
  3. 敏感信息隔离:不要把密钥、数据库连接串放入任务描述;优先使用环境变量与密钥管理系统。
  4. 防 Prompt 注入:当处理来自外部 issue、PR 评论的文本时,应视为不可信输入,通过 guardrail 过滤“忽略指令”“暴露密钥”等提示。
  5. 可回滚:所有智能体改动必须走分支与 CI,保证可以一键回退。
  6. 人工 Review:自动化越强,人工 Review 越不可省。智能体应负责“把活干完”,人负责“判断方向对不对”。

10. 总结

ChatGPT Plus / Pro 与 Codex 的结合,本质上是把「代码生成」升级为「任务执行」。它的价值不在于一次性写得更长,而在于形成了 执行 → 观察 → 修正 → 交付 的完整闭环。

对开发者来说,当前阶段最务实的使用方式有三层:

  • 轻量:在对话中描述任务,由 Codex 直接完成短平快的修改;
  • 中量:通过 API + 工具调用,构建贴合自己仓库的专用智能体;
  • 重度:引入 Agent SDK、MCP 与 CLI,把它接入 CI/CD,形成半自动流水线。

把任务描述清楚、把权限收紧、把改动留在可审查的分支里,Codex 才能从一个新鲜功能,变成工程上真正可依赖的生产力组件。随着上下文窗口、沙箱时长与并发能力的持续提升,编码智能体的竞争焦点,正在从「写代码」转向「可靠地完成一件事」。

Logo

葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。

更多推荐