Skip to content

第 22 章 上线准备 ​

本章要解决的问题

评估通过(第 21 章)只是拿到了发布资格。把 Agent 交到真实用户手里,还要补齐交互、配置、协作边界和发布流程;任何一项缺失,都会变成具体事故。

本章内容多数在四个参考实现里能找到对应物;发布流程一节则把它们和第 21 章的评估串成一条线。

这五项不是一份互不相关的功能清单。它们分别回答从“谁在用”到“怎样安全发出去”的五个交付问题:

交付问题不明确会造成什么对应机制
用户在哪里操作 Agent审批、diff、取消没有合适的交互位置22.1 交互形态
不同环境怎样得到一致行为同一仓库换台机器就表现不同22.2 配置体系
Agent 能否改变协作历史检查点污染分支,或未授权写入远端22.3 git 纪律
哪些任务由哪个模型执行路由没有数据支撑,成本上升却不提质22.4 模型路由
行为变更怎样灰度与撤回出问题时不知道发了什么,也无法回滚22.5~22.6 发布流程与清单

22.1 交互形态:终端还是浏览器 ​

四个参考实现给出三类答案:codex 主打终端 TUI(+ headless 模式做 CI/脚本);grok 同为 TUI(+ ACP 协议嵌编辑器);dsh 反其道,主打 Web UI(浏览器是它的第一公民,CLI 主要负责启动);pi 则同时提供 TUI、print/JSON、RPC 和可嵌入 SDK。

三种形态对应三类用户,没有优劣。但要看到形态换来的东西:dsh 用 Web 形态换来了审批 UI、diff 卡片这类富交互的天然优势——第 9 章的审批请求、第 7 章的三种 diff(预览/提交/净变化)都长在 Web 上;终端形态则换来无处不在(SSH 里也能跑)和可脚本化。第 20 章讲的是形态之下的运行时与事件协议,这里先选形态。

22.2 配置体系:多级配置与 Schema ​

多级配置(用户级 / 项目级 / 命令行)是常见做法——没有它,同一个仓库在不同成员的机器上行为不一致,问题会以"在我机器上是好的"的形态反复出现。三家值得看的做法:codex 为配置生成 JSON Schema(可由程序校验的数据结构说明),配置写错可以尽早暴露;配置即清单的思路在 dsh 走得更远——它的配置是 YAML 插件清单(第 17 章),配置、能力和装配是同一份东西;pi 则把用户级与项目级设置分别放在 JSON 文件中,项目设置要经过信任检查才加载。

自建时的最小要求:至少两级(用户级 + 项目级),每项配置有默认值和类型检查,配置变更写进日志——它和系统提示词、工具 schema 一样,都是影响 Agent 行为的"代码"。

22.3 git 纪律:何时提交、怎么写信息、哪些禁止 ​

Agent 改了代码,就要回答 git 的三个问题。生产约定:

text
何时提交      默认:不主动提交——用户明确要求才 commit(codex 的默认指令同时禁止
              未经要求创建新分支,防止 Agent 替用户决定历史结构)。
              例外:隔离的会话分支可以承担内部检查点——grok 在 conv/* 会话分支上
              做"turn 结束若有脏文件就 add -A + commit"(--no-verify、禁 gpgsign、
              有进行中 git 操作则跳过),不直接改用户原来的工作分支。
提交信息      LLM 从 diff 生成的总结,但结构上应是"建议+待确认",而非直接执行;
              push 是否需要确认由权限策略决定;高风险远端和保护分支必须拦截。
禁止操作      强推、改历史、动保护分支、`git config` 全局篡改——第 9 章的
              危险命令特判里有专门针对 git 危险 flag 的拦截。

设计原则:git 的 commit/push 会改变协作历史或远端状态,应按第 9 章的授权与风险规则处理;内部检查点(第 7 章的文件快照、grok 的会话分支提交)则用于失败后恢复到旧状态。两者必须分开——混在一起,要么检查点污染用户历史,要么该恢复的时候没有恢复点。

22.4 模型路由:先统一,再有数据地分化 ​

Agent 可以由运行程序按任务难度选择模型:

text
简单确定性任务(格式转换、读文件总结、生成 commit message)→ 小/快/便宜模型
复杂推理(根因定位、架构改动、跨文件重构)                → 强模型/思考模型

两个生产实现给出了不同佐证:codex 的 spawn_agent 指引明确"子 Agent 默认继承当前模型,除非用户明确要求否则别设 model"——模型选择是显式决策,不是随手参数;dsh 允许插件依次处理 agent/request,按任务改写 provider/model,且每次变更记为 request/header 事件。模型切换会断开原有缓存(第 19 章排查表第 3 条),这是路由最直接的代价。

是否启用更长思考也属于模型选择,但不能靠"探索关、定案开"这类直觉写死;应按任务标签在第 21 章的评估集里实测质量、延迟与成本。

给自建 Agent 的起步策略:先不要自动选模型——先全用一档模型把功能跑通,等 token 计量与运行指标(第 19 章)告诉你"哪类调用最贵且最简单",再只把那一类换成更便宜的模型。自动选择本身也增加复杂度,要有数据再做。

22.5 发布:什么在发布,怎样灰度与回滚 ​

先想清楚"发布的内容是什么"。对一套 Agent 来说,提示词、工具 schema、Skill、记忆格式和评分规则都是发布内容——它们和二进制一样会改变行为,却不走传统的构建流水线,这是 Agent 产品和传统软件在发布上最大的不同。把"线上可随意改的字符串"当成发布单元,出了问题连"回滚到哪个版本"都答不出来。

发布流程接在第 21 章的评估之后:

text
回归集通过(CI 门禁)
  → 留出测试集复跑(没参与调优的那份)
  → 只改一个变量做对照(一次失败记录只产生一份待验证改动)
  → 线上小流量试运行(少量真实流量 + 安全限制 + 快速回滚)
  → 目标指标 + 安全指标达标 → 全量;否则回滚

两条容易漏的纪律:发布前先确认起始环境和检查程序没变——有时分数变化不是 Agent 变了,是题或环境变了;线上任务记录默认不全量收集敏感正文,保存脱敏字段、哈希和证据引用即可(第 19 章的三条记录流)。

22.6 上线检查清单 ​

把本章和前面各章的上线相关结论收进一张清单,发布前逐项过:

text
□ 交互形态确定,审批与取消在该形态下可用(第 9、20 章)
□ 配置至少两级、有类型检查,配置变更入日志
□ git 纪律成文:不主动提交、push 按权限策略处理、检查点与用户工作分支分离
□ 模型路由策略明确:先统一一档,有数据再分化;换模型记录为显式事件
□ 提示词/工具/Skill/评分规则全部版本化,回滚目标明确
□ 回归集接 CI,门禁生效(第 21 章)
□ 三条记录流(会话可信记录/运行指标/安全审计)分开保存(第 19 章)
□ 预算与停止条件:轮数、token、费用上限生效(第 4、19 章)

【对比小结】 ​

codexgrok-builddshpi
交互形态TUI + headlessTUI + ACP 嵌编辑器Web UI 第一公民TUI + print/JSON/RPC + SDK
配置多级 + JSON Schemaprofile + 规则YAML 插件清单即配置用户级/项目级 JSON 设置 + 环境变量
git 检查点无(ghost snapshot 已移除)conv/* 隔离的会话分支无无(会话树 ≠ 文件备份)
模型路由子 Agent 默认继承任务级选择插件改写 provider/model会话级指定
发布单元版本发布版本发布插件/bundle 版本化npm 包 + 扩展版本化

共同点比差异更重要:面向用户的 git 历史和远端操作都需要清楚的授权边界;提示词、工具和配置也要能随版本追踪。分歧只在发布单元的形态——这取决于你的产品以什么为单位演进。

到这里,本册的主线走完:从一次 LLM 请求和一条 while 循环,到骨架六章,再到高级部分的压缩、渐进加载、会话恢复、长任务、记忆、协作、扩展、可靠性与界面,最后以评估和上线收束。深入的源码精读入口见附录 B;四个参考实现仍在快速演进,机制会变,取舍的逻辑不会。

基于 MIT 协议发布,欢迎转载与贡献。