如何使用 Codex CLI 作为网站智能体后端
把 Codex CLI 放在网站后端,本质上是把一个已经会读文件、跑命令、流式输出、维护任务状态的工程代理接到 Web 页面之后。前端不直接面对模型 API,而是把用户请求转成一个后端任务;后端启动 codex exec --json,把 JSON 事件写入任务状态,再用 HTTP 或 SSE 推给浏览器。
基本架构
一个可运行的最小架构通常包含四层:
- 浏览器界面:提交任务、上传文件、查看流式事件和最终结果。
- Flask / Node / Rails 后端:负责鉴权、任务排队、工作目录隔离、日志持久化。
- Codex CLI worker:用
codex exec --json执行一次智能体任务,并把事件逐行输出。 - 文件系统和工具层:仓库、临时文件、Shell、Git、测试命令、部署脚本都在这一层。
在本站的实现里,后端把每个任务写成状态记录,然后启动类似这样的进程:
codex exec --json --dangerously-bypass-approvals-and-sandbox -C /opt/whb-interaction
生产环境不一定要关闭沙箱。这里的关键点不是参数本身,而是 Web 后端只需要管理任务生命周期,推理、工具调用和工程动作交给 Codex CLI。
为什么不直接调用 API
直接调用 API 的优点是接口稳定、计费清晰、适合产品化规模调用。但如果你的目标是让网站具备“工程代理”能力,API 方案通常要自己补齐很多东西:
- 文件上传后如何放进工作目录。
- 如何让模型安全读取仓库、运行测试、查看日志。
- 如何把多步推理和命令输出流式展示给前端。
- 如何处理长任务、失败重试、任务恢复。
- 如何让模型在一次任务里同时读代码、改代码、跑验证、生成总结。
Codex CLI 已经天然适合这些流程。它更像一个命令行工程同事,后端只要把它包装成任务执行器。
交互优势
使用 Codex CLI 做后端,用户体验会更接近“远程控制一个智能开发台”:
- 长任务可见:前端可以实时看到模型事件、命令输出和阶段状态。
- 上下文更具体:任务直接在目标仓库目录执行,不必把所有文件内容塞进 API 请求。
- 验证更自然:模型可以主动运行
python3 -m py_compile、node --check、测试命令和部署脚本。 - 产物更完整:一次任务可以同时改后端、改前端、上传资产、重载服务。
- 失败更容易定位:命令输出和任务日志保存在服务器侧,后续可以继续追问或重跑。
这种模式特别适合内部管理台、自动化运维页面、私有数据处理页面、APK 构建后台、文章发布后台等场景。
费用优势
在已经合法登录并配置好 Codex CLI 的服务器上,网站后端可以复用这个 CLI 执行环境。对个人站点、小团队后台或低频自动化任务来说,成本模型更接近使用已有的 ChatGPT / Codex 套餐,而不是为每个页面功能单独设计 API key、限额、账单和重试策略。
这并不意味着所有场景都应该绕开 API。正式商用、多人高并发、严格 SLA、审计计费或需要官方稳定接口时,API 仍然更合适。Codex CLI 后端的优势在于:当你需要的是“少量高价值的工程智能体任务”,它可以用更少的胶水代码得到更强的交互体验。
后端实现要点
一个可靠的实现至少要考虑这些细节:
- 任务状态表:记录 queued、running、done、failed,以及输入、输出、事件窗口。
- 进程隔离:每个任务绑定工作目录和超时策略,必要时限制内存。
- 事件流:保存
codex exec --json输出,让前端按任务 ID 拉取或订阅。 - 文件上传:把用户文件放进受控目录,避免任意路径写入。
- 权限边界:公开页面只能读结果,写操作必须经过登录或服务器本地权限。
- 清理策略:大文件、临时构建产物和缓存要定期删除。
伪代码大致如下:
task = create_task(prompt, uploads)
subprocess.Popen([
"codex", "exec", "--json",
"-C", task.workdir,
], stdin=task_prompt, stdout=task_log)
前端只需要知道任务 ID:
const events = await fetch(`/api/tasks/${taskId}/events`).then(r => r.json())
render(events)
最适合的使用方式
Codex CLI 做网站智能体后端,不应该被当成普通聊天接口。它最适合这些任务:
- 带文件和仓库上下文的分析。
- 需要运行命令验证的代码修改。
- 需要跨多个系统的后台操作。
- 需要保留完整过程日志的自动化任务。
- 管理员或内部用户发起的低频、高复杂度任务。
把它用于这些位置,网站会获得一种很特别的能力:用户点下按钮后,后端不是调用一个单轮模型,而是在服务器上启动一个可以读、写、跑、验证、总结的智能体。