📐 Harness 工程 · 中文翻译

7 LLM 集成与模型-智能体协同设计

智能体脚手架如何与其底层 LLM 相关联,是该系统中最举足轻重的设计决策之一。 语料库覆盖了从单一供应商紧耦合到完全供应商无关的全范围,而在该光谱上所处的位置直接决定了脚手架能够获得哪些优化。

7.1 供应商抽象光谱

这十一个系统采用了五种截然不同的策略:

单一供应商紧耦合(Anthropic、OpenAI、Google)。

Claude Code 专门使用 Anthropic SDK(@anthropic-ai/sdk);Codex 使用带 WebSocket 流式的 OpenAI Responses API;Gemini CLI 使用 @google/genai SDK,并在企业部署中额外耦合 Vertex AI。 这些系统难以轻易更换供应商:Claude Code 依赖 Claude 特有的特性(扩展思考、带静态/动态边界的提示词缓存、tool_use 块格式);Codex 依赖 OpenAI Responses API 的线上格式,并为每代 GPT 维护按模型定制的提示词,自 2026 年年中起以运行时刷新的服务端模型目录数据而非编译进二进制的模板形式下发(第 7.2 节);Gemini CLI 运行一个 ModelRouterService,它通过一条可插拔策略链(回退、覆盖、审批模式、三个分类器策略——其中一个可经托管的 LiteRT-LM 运行时针对本地 Gemma 模型运行——以及默认策略)把每个请求分派给某个 Gemini 变体。 路由器的目标集合在我们两次快照之间移动了整整一个模型世代:gemini-3(.1)-pro-preview 与 GA 版 gemini-3.1-flash-lite 现在是默认的解析目标,Gemma 4 模型可被路由,而 2.5 家族仅作为无 preview 访问权限时的回退而幸存——这证明路由层的存在正是为了吸收模型更替的冲击,使智能体循环免于承受。

供应商优先加通用回退(Mistral)。

Mistral Vibe 介于紧耦合与完全抽象之间:一个工厂在 MistralBackend(使用官方 mistralai SDK)与 GenericBackend 之间进行选择,后者支持 Anthropic、Vertex、OpenAI 兼容端点,以及——自 v2.9 起——OpenAI Responses 端点。 Mistral 后端利用了 Mistral 特有的特性(reasoning_effort 枚举——由模型五级 thinking 字段映射而来——以及 ThinkChunk 流块——被解析进独立的 reasoning_content 字段),而通用后端则提供了一个可移植的逃生通道。 这是一种与基于 LiteLLM 的系统不同的哲学:Mistral Vibe 并不把所有供应商对称对待,而是以更深的集成优待其自家供应商,并把其余供应商视为回退。

经由抽象层的多供应商。

OpenHands、Aider 与 Mini-SWE-Agent 都把 LiteLLM 用作通用抽象,支持跨供应商的 100 多种模型。 这使模型切换十分快捷,但也引入了对 LiteLLM 供应商映射的依赖。 Aider 走得最远,其模型注册表收录了 350 多种模型的按模型元数据:编辑格式、弱模型名称、缓存控制、额外 API 参数以及推理标签处理。 OpenHands 与此同时又在这个抽象之上叠加了自己的路由:一个按用途键控的 LLMRegistry、一个存放命名配置档案的独立 LLMProfileStore、可插拔的 RouterLLM 实现以及一个回退策略——因此“基于 LiteLLM”不再意味着功能极简。

经由自研传输层的多供应商。

本修订版新增的三个系统占据了一个四月版四分光谱所不曾包含的位置:完整的多供应商支持,却没有任何抽象库,供应商矩阵全部手工构建,并锻炼到与供应商原生集成同等的深度。 Hermes 在 29 个声明式 ProviderProfile 插件之后交付了五种传输实现(chat-completions、Anthropic Messages、Bedrock Converse、Codex Responses,以及一个进程外的 Codex app-server)——配置档案“is read by the transport instead of receiving 20+ boolean flags”——并带有从 models.dev 拉取的、覆盖 3,800 多种模型的元数据。 Pi 在 35 个内置供应商之上手工实现了九种线上协议,配有 ∼\sim20 个按模型 compat 怪癖标志(包括面向 OpenAI 兼容主机的十种 thinkingFormat 方言),把每供应商条件代码的成本集中地一次性付清——而且它还施展了语料库中最大胆的耦合技巧,即 Harness 模仿:在 Claude Pro/Max OAuth 令牌上,它整体呈现 Claude Code 的身份(“You are Claude Code” 的系统提示词开场、beta 头部,甚至连规范工具名的大小写也在线上被改写),以搭乘消费者订阅,并以同样的方式与 ChatGPT 套餐的 Codex 后端对话。 OpenCode 把流式与工具分派委托给 Vercel 的 AI SDK 与 models.dev 注册表——它是语料库中唯一一个内部 LLM 管线采用第三方 SDK 的系统——然后把协同设计集中到一个 ∼\sim1,400 行的按供应商转换矩阵中(按发布日期门控的推理层级、按模型的 temperature 默认值、六种同时启用的提示词缓存方言),甚至可以在运行时从注册表字段安装新的供应商。

混合插件式。

OpenClaw 实现了一个可插拔的供应商系统,为 10 多家供应商提供第一方适配器,特色包括认证配置轮换、面向故障转移的 last-good 跟踪,以及降级密钥的冷却过期。

观察 2。供应商原生优化——缓存边界、扩展思考、推理努力、按模型定制的提示词——并不以紧耦合为门控条件;它们取决于由谁来支付每供应商条件代码的成本。Claude Code 在一个经 Blake2b 哈希的缓存边界处切分其提示词,其静态前缀以全局作用域跨会话缓存(fork 模式的子智能体还会逐字节精确地继承父提示词);Codex 保留按世代的提示词(现以服务端模型目录数据的形式下发)和一个由 thread_id 派生的提示词缓存键;Gemini CLI 的 ModelRouterService 把每个请求分派给满足需求的最便宜的 Gemini 变体。但如今有三个多供应商系统从光谱的另一端行使同一份菜单,刻意而集中地支付条件代码成本:Hermes 手工实现五种传输,配有供应商无关的缓存标记与比特级一致的前缀规范化,甚至能命中本地 llama.cpp 的 KV 缓存;Pi 设置带 TTL 层级的显式 cache_control 断点,并把每轮缓存未命中的美元浪费作为一等指标加以审计;OpenCode 同时发出六家供应商的缓存方言,并把系统提示词收窄到至多两条消息(默认一条)以匹配缓存槽位。基于 LiteLLM 的系统(OpenHands、Aider、Mini-SWE-Agent)部分地行使这份菜单(表 17),其中 OpenHands 正通过缓存分层提示词拼装与可插拔路由缩小差距。紧耦合仍能独家换来的是服务端协同演化:Codex 的脚手架行为——提示词、推理层级、工具模式,甚至多智能体工具生成——每次模型发布都会从供应商的目录端点重新调优,而无需发布客户端。供应商耦合已不再那么关乎能力,而更多关乎由谁来控制更新循环。

7.2 提示词工程架构

提示词构建策略在这十一个系统之间差异巨大。 表 6 总结了各种方法。

表 6:十一个系统的提示词工程架构。
系统 架构 区段 缓存 模板
OpenHands 带缓存层级的 PromptRegistry 18 个命名静态区段(Soul、Role、Security 等)+ 动态块 STATIC/DYNAMIC 两块式拼装; cache_control 标记 Python;.j2 逃生通道
Aider 多态 CoderPrompts 按编辑格式的提示词、repo-map、示例 Anthropic 标记 Python 类
Claude Code 带边界的模块化区段 12–15 个命名区段,静态/动态切分 Blake2b 哈希,边界标记 TypeScript
Codex 服务端下发的按模型提示词 能力、人格(用户模板化)、AGENTS.md、规划 thread_id 缓存键 模型目录数据(内置回退)
Gemini CLI PromptProvider + 能力门控 基础、工具、GEMINI.md(全局/项目/扩展)、IDE 上下文、记忆、技能 无(模型更换时重建) TS 片段(modern/legacy)
Mistral Vibe 每智能体提示词 + A/B 变体 基础、工具、git 状态、日期、子智能体名册、scratchpad、AGENTS.md 内容、智能体覆盖、技能 git 状态已缓存 Markdown 文件(GrowthBook 选择的变体)
Mini-SWE-Agent Jinja2 一次性 system_template、instance_template Anthropic 标记 嵌入 YAML
Hermes 三层拼装(稳定/上下文/易变),每会话构建一次 ∼\sim15 个指导块,按模型家族门控 system_and_3 标记 + 比特级一致的前缀规范化 Python 常量
Pi 单个 ∼\sim170 行构建器;工具片段随活动工具集协同变化 人格、工具、去重指导、项目上下文、技能 XML、日期、cwd cache_control 断点 + TTL 层级 + 浪费审计 TS 拼接
OpenCode 模型家族提示词矩阵(按 model-id 子串区分的 9 个基础提示词) 基础、环境块、AGENTS.md、MCP 指令、技能目录 六方言断点; promptCacheKey=sessionID;系统提示词封顶 2 条消息 .txt 文件
OpenClaw ACP 转译器 会话配置、工具列表、思考级别 按供应商 运行时配置
Gemini CLI:能力门控的代码片段与分层记忆。

Gemini CLI 的 PromptProvider 从以下部分拼装系统提示词:按模型能力选择的基础指令(isModernModel ? snippets : snippets.legacy)、来自注册表的工具/函数声明,以及一个按层级合并的 GEMINI.md 文件集合——这些文件在三个作用域(全局 ~/.gemini/、扩展提供、项目本地 .gemini/)被发现。 IDE 诊断与打开文件的 diff 经由 IDE 伴生包在对话中途注入;持久事实由模型用普通编辑工具直接编辑 GEMINI.md 或每项目私有的 MEMORY.md 索引来写入——系统提示词声明不存在 save_memory 工具(第 9.6 节)。 与 Claude Code 不同,提示词在每次模型更换时都会重建,但并未被静态/动态缓存边界切分——Gemini 目前不暴露请求级提示词缓存,因此缓存摊销交由 API 服务器负责。

Mistral Vibe:每智能体的 Markdown 提示词。

Mistral Vibe 的提示词以纯 Markdown 文件的形式存放;只有 explore 与 lean 配置随附专用系统提示词,而 plan、accept-edits 与 auto-approve 通过覆盖复用默认的 cli.md。 一个通用的系统提示词构建器把基础提示词与自动生成的工具描述、一个 Git 上下文块(git log --oneline -N --decorate 与 git status --porcelain 的输出,已缓存)以及一个智能体专属叠加层组合在一起,因此 plan 与 explore 子智能体得到与默认智能体完全不同的系统提示词,而无需任何代码分支。 技能描述则被动态追加。 这种每智能体的特化比 Claude Code 的共享提示词加子智能体提示词覆盖更细粒度,在结构上类似于 Codex 的按模型模板,只是键变成了智能体配置档案而非模型世代。

Claude Code:带缓存边界的模块化拼装。

Claude Code 的提示词由十余个命名区段拼装而成,以一个 SYSTEM_PROMPT_DYNAMIC_BOUNDARY 标记分界。 边界之前的区段(身份、系统规则、任务指导、工具模式、语气)是静态的,通过 Blake2b 哈希以 scope: ’global’ 缓存。 边界之后的区段(会话指导、记忆、环境、MCP 指令、语言、scratchpad)是动态的,经由带记忆化的 systemPromptSection() 逐轮计算。 这一设计把提示词缓存失效降到最低:静态前缀(占 token 的大头)在跨轮次、甚至跨子智能体(经由 fork 时刻的 renderedSystemPrompt 共享)时都能获得高缓存命中率。

Codex:作为服务端下发数据的按模型提示词。

Codex 为每个模型世代维护独立的提示词,而交付机制本身也在协同演化:早期版本编译进二进制的 Markdown 模板仍留在代码树中,但已不再被代码引用——实际生效的提示词以模型清单的 base_instructions 字段形式交付(该清单即 models.json,作为回退随包内置,并从远程 /models 端点以 ETag 缓存刷新)。 七月的清单覆盖从 GPT-5.2 到一个 GPT-5.6 家族,而这些提示词是人格模板化的:一个 {{ personality }} 变量由用户可选择的变体(friendly/pragmatic)填充。 提示词内容在各世代之间可测量地漂移:GPT-5.2 的提示词以版本身份开场(“You are GPT-5.2 running in the Codex CLI…”),并带有明确的禁止提交与禁止引用规则;GPT-5.5 的提示词以 “You are Codex, a coding agent based on GPT-5…” 开场(5.6 家族进一步缩短为 “You are Codex, an agent based on GPT-5”),扩展出一个内容丰富的人格区段,并丢弃了禁止提交规则与反过度打磨指令的全部内容。行为策略正从提示词散文迁移到特性标志:一个 codex_git_commit 标志如今掌管提交行为。 第 7.3 节将回到这种变薄。

OpenHands:带缓存层级的提示词注册表。

OpenHands 弃用了它的 Jinja2 PromptManager,代之以一个 PromptRegistry:带守卫、有序的 PromptSection 对象被分入 CacheTier.STATIC 与 DYNAMIC 两个桶,渲染为两块式系统消息,其静态前缀保持逐字节稳定以便供应商提示词缓存——这与 Claude Code 的静态/动态缓存边界设计相同,却是在一个基于 LiteLLM 的多供应商系统内部独立得出的。 随附 18 个命名的静态区段(Soul、Role、Memory、Security、SecurityRiskAssessment、VersionControl 等),Jinja 模板仅作为逃生通道存续。

Hermes:比特级一致前缀的三层拼装。

Hermes 每会话一次以三个层级——稳定、上下文、易变——构建其提示词,配有 ∼\sim15 个按模型家族门控的指导块(工具使用强制块只发给 GPT/Codex/Gemini/Grok/Qwen/DeepSeek 模型而绝不发给 Claude,代码注释引用了观察到的按模型失败案例)。 缓存经济学决定了细节:单一的 system_and_3 策略放置四个 cache_control 断点,且提示词前缀经过比特级一致规范化(工具调用 JSON 的排序紧凑重序列化、仅含日期的时间戳、冻结的记忆快照),因此即便是本地 llama.cpp 与 vLLM 的 KV 缓存也能跨轮次命中。

Pi:一个小型构建器,随工具集协同变化。

Pi 的整个系统提示词是一个 ∼\sim170 行的构建器,输出 30–40 行内容:人格、工具列表、去重的按工具指导片段(每个工具贡献 promptSnippet/promptGuidelines,因此提示词随活动工具集协同变化)、来自 AGENTS.md 的 <project_context>、一个 <available_skills> XML 索引、日期与 cwd。 几乎所有行为策略都被刻意留空,委托给用户提供的上下文文件与扩展。

OpenCode:模型家族提示词矩阵。

OpenCode 按 model-id 子串分派九个基础提示词之一——claude、gpt-、gemini 等各有专用 .txt 提示词,语域各不相同(Claude 提示词以 “You are OpenCode, the best coding agent on the planet.” 开场)——把 Codex 的按世代模板推广到了各供应商之间。 拼装过程刻意把系统提示词封顶为两条消息(默认一条;被插件扩展过的提示词会被折叠回来),以匹配它同时以六种供应商方言发出的两个最前部缓存断点槽位。

Aider:多态提示词。

Aider 的提示词系统独一无二:其 13 种注册编辑格式(architect、ask、context、diff、diff-fenced、editor-diff、editor-diff-fenced、editor-whole、help、patch、udiff、udiff-simple、whole)中的每一种都有一个专属的 CoderPrompts 子类,定义针对该格式定制的系统提示词、示例与提醒。555三个函数调用式 coder 仍留在代码树中但未注册——一个在 coders/__init__.py 中被注释掉,两个从未被导入——因此 Coder.create() 恰好解析 13 种格式;四月版不一致地报告为 14。 一个工厂模式(Coder.create())依据模型的元数据选择格式。 提示词动态纳入:文件内容、一个受 token 约束的仓库地图(经 tree-sitter 符号提取生成)、聊天历史,以及格式特定的编辑指令。

Mini-SWE-Agent:一次性模板。

Mini-SWE-Agent 使用嵌入 YAML 配置文件的 Jinja2 模板,在会话开始时渲染一次。 模板变量包括系统信息(platform.uname())、模型统计(n_model_calls、model_cost)与任务描述。 一个值得注意的细节:默认模板包含 OS 特有的指令(例如 macOS 的 sed -i ’’)。

7.3 提示词内容与修辞风格

上一小节考察了提示词如何被拼装(缓存边界、模板、层级合并)。 现在我们转向它们实际上说了什么:每个脚手架投射的人格、它向模型发出的明确指令,以及它用来让这些指令扎下根来的修辞手段。 我们阅读了每个系统的规范系统提示词,并提取了反复出现的轴。 若干模式在原本互不相关的代码库之间呈现出趋同。

身份与人格设定。

人格开场白从简短到繁复不等。 Mini-SWE-Agent 最为极简:“You are a helpful assistant that can interact with a computer”——不过 Pi 的内层智能体库比它更简(“You are a helpful assistant.”),编码层只追加了 “You are an expert coding assistant operating inside pi, a coding agent harness.”。 OpenHands 加了一个角色:“You are OpenHands agent, a helpful AI assistant that can interact with a computer to solve tasks”——如今被包裹在一个 <SOUL> 块中,该块从用户可覆盖的 SOUL.md 加载。 Codex 的 GPT-5.2 提示词对模型耦合最为直言:“You are GPT-5.2 running in the Codex CLI, a terminal-based coding assistant”——GPT-5.5 世代抛弃了这个开场,改用 “You are Codex, a coding agent based on GPT-5…”(5.6 家族进一步缩短为 “an agent based on GPT-5”),并配有一个精心设计的人格区段。 OpenCode 按模型变换人格:Claude、Codex 与 Meta 模型被告知 “You are OpenCode, the best coding agent on the planet,”,而默认世系得到的则是朴实的 “an interactive CLI tool that helps users with software engineering tasks.”。 Hermes 在一个通用身份(“You are Hermes Agent…created by Nous Research…prioritize being genuinely useful over being verbose”)之上分层,仅在自动检测到时才注入编码姿态:“Operate like a careful senior engineer.”。 Mistral Vibe 在其四月版本以对既往行为的抱怨开场(“CRITICAL: Users complain you are too verbose”),如今则以一份正式的指令层级契约开场:七个优先级(critical >> user >> repo AGENTS.md >> user AGENTS.md >> prompt defaults >> skills/MCP >> external-data-as-data)——把提示词注入防御表达为一种排序而非禁令。 Aider 完全回避人格,转而采用角色断言:“Act as an expert software developer. Always use best practices when coding.”。 Claude Code 居于两极之间:简短的开场之后是后续区段中大量的展开。

冗长控制。

十一个提示词中有九个包含明确的冗长控制指令,但实现方式差异极大。 OpenCode 的提示词如今是语料库中最激进的:“You MUST answer concisely with fewer than 4 lines…One word answers are best,”,还配有 <example> 块(“user: what is 2+2? assistant: 4”)——不过值得注意的是,其 Claude 专属提示词丢弃了回退世系所保留的量化规则。 Mistral Vibe 保留了其 150 词预算(“Most tasks need under 150 words of prose”)与结构优先规则(“Structure first. Prose after, if at all”)。 Claude Code 的响应长度规则是量化的(工具间更新 ≤25\leq 25 词、轮末总结 ≤100\leq 100 词)——不过我们的复审发现,该数字化区段作为一项 A/B 实验仅对 Anthropic 内部构建开放;外部用户收到的是定性指导。 Codex 在 5.2 世代是定性的(“concise, direct, and friendly”);5.6 提示词把冗长控制折入人格区段,而 5.5 保留自己的长度规则。 Hermes 是定性的(“Be concise: lead with the change or answer, not a preamble”),Pi 极简(仅一条要点:“Be concise in your responses”),Aider 则要求在任何补丁之前给出 “a few short sentences”。 Mini-SWE-Agent 以结构而非言语达成同一目标:每轮恰好一个 THOUGHT 块后跟一条 bash 命令。 OpenHands 是唯一把冗长控制基本交给模型的系统:其基础提示词对长度只字未提,不过其 GPT-5 家族专属模型块确实指示了简洁回应与短前言。

禁用短语与禁用的表层形式。

Mistral Vibe 开创了禁用短语列表;其重写后的提示词把四月版的两份列表合并为一份:“No filler words: ‘robust’, ‘elegant’, ‘seamless’, ‘powerful’, ‘Great!’, ‘Absolutely!’, ‘Of course!’, ‘Happy to help!’ ”——这是对 LLM 语域口癖的直接压制尝试。 OpenCode 现在维护着语料库中的第二份禁用短语列表,且依模型而定:其 GPT 提示词禁止 “Done —” 与 “Got it,” 之类的开场白,并连同 emoji与长破折号一并禁用。 Mistral Vibe 还保留了语料库中最严格的 emoji 禁令:“No emoji of any kind. No smiley faces, icons, flags, or Unicode symbols…This applies to prose, code comments, and commit messages.”。 Claude Code 是条件性的(“Only use emojis if the user explicitly requests it”),OpenCode 在其 Claude、default、Meta 与 Trinity 提示词中带有完全相同的条件规则,其 GPT 提示词则彻底禁止 emoji,而其 GPT-4 时代的 beast 提示词反而指示使用 emoji 状态标记;Gemini CLI、Mini-SWE-Agent、Aider、Hermes 与 Pi 对 emoji 只字未提。 Codex 的 5.2 提示词禁止一种 CLI 特有的表层形式——形如 [F:README.md L5-L14] 的行内引用(带方括号引用符号)——因为 Codex 终端无法渲染它们;该规则在 5.5/5.6 提示词中并不存在。

反过度打磨指令。

一个近乎普遍的模式:脚手架告诉模型不要扩大请求。 Claude Code:“Don’t add features, refactor code, or make ‘improvements’ beyond what was asked,”,另有一条反对投机性抽象的独立条目。 Mistral Vibe(四月后措辞已改但实质保留):“Change minimally…Don’t touch what wasn’t asked. Unused imports may have side effects. Redundant-looking code may be load-bearing. When fixing X, leave Y alone.”。 Codex(5.2 世代):“Do not attempt to fix unrelated bugs. … Fix the problem at the root cause rather than applying surface-level patches”——5.4 提示词中已不见,到 5.6 被完全丢弃。 OpenHands:“NEVER create multiple versions of the same file with different suffixes (e.g., file_test.py, file_fix.py, file_simple.py).”。 OpenCode:“NEVER create files unless they’re absolutely necessary.”。 Hermes:不做请求之外的顺手重构、重命名或重排版。 这种趋同引人注目——六个独立开发的脚手架预判了同一种失败模式(LLM 会在规定不足的请求上过度交付),并以虽非逐字照搬、却在修辞上同构的措辞加以回应。 Pi 是刻意的例外:其提示词不含此类指令,策略被整体委托给用户提供的 AGENTS.md 与扩展。

先读后改与先验证后声称。

三个提示词把阅读代码设为编辑的前提条件。 Claude Code:“In general, do not propose changes to code you haven’t read.”。 Mistral Vibe 在两次快照之间强化了其版本:“Never edit a file you have not read in this session. Do not edit a file in the same turn you first read it—read, then act on the next turn.”。 OpenCode 的编辑工具描述声称有强制执行(“This tool will error if you attempt an edit without reading the file”)——但该工具的源码中并不存在任何运行时读取跟踪;这一描述言过其实,提醒我们提示词文本是行为愿望,而非机制。 Claude Code 另外禁止虚假的成功声称——“Never claim ‘all tests pass’ when output shows failures, never suppress or simplify failing checks (tests, lints, type errors) to manufacture a green result”——该区段与其词数预算一样先向内部构建发布;而 Hermes 是唯一把同一要求机制化的系统,通过第 6 节的停止时验证守卫加上一条普遍的反伪造指令(“NEVER substitute plausible-looking fabricated output…”)。 其余系统把这当作隐含处理。

Git 提交策略:一个消散的趋同。

在 2026 年 4 月,这是语料库中最紧密的修辞趋同:每个提到 git 的提示词都禁止自主提交。 到七月,图景已一分为三。 该禁令在 Claude Code(“NEVER commit changes unless the user explicitly asks you to”)、OpenCode(“NEVER commit changes unless the user explicitly asks”)、Hermes(“don’t commit, push, or rewrite history unless asked, and never read, print, or commit secrets”)以及 Codex 的 5.2 世代提示词中幸存。 Mistral Vibe 反转了方向:它删除了标注为 “Never Commit” 的硬规则(更新日志写道 “Loosened the no-git-commit constraint”),如今主动指示模型如何提交,并强制要求 Co-Authored-By 签名尾注。OpenHands 从未携带可反转的提交禁令——其 <VERSION_CONTROL> 区段早在统计窗口之前就一直在讲授带共同作者尾注的提交机制——同时把push 与创建拉取请求门控在明确的用户请求之上——由一个单独的 <PULL_REQUESTS> 区段承载。 而 Codex 最新的提示词完全丢弃了该规则:GPT-5.6 的指令中不含任何 “commit” 字样。一个 codex_git_commit 标志曾短暂掌管提交署名行为,但到七月快照时已被弃用(未使用)——该指令干脆离开了提示词。 保持普遍的是外部边界:语料库中没有任何提示词允许自主的 push、force-push 或历史改写。 换言之,四月的提交趋同并不是一个稳定的工程结论,而是信任校准的一帧快照——而信任在一个季度内发生了可测量的移动。

强调标记。

语料库呈现出三种截然不同的提示词内强调惯例。 Claude Code、Codex、OpenHands 与 OpenCode 在行内使用大写标签:IMPORTANT:、CRITICAL:、NEVER(OpenCode 还在运行时注入 <system-reminder> XML)。 Mini-SWE-Agent 使用类 XML 标签(<important>…</important>),Pi 仅把 XML 用作数据定界符,Hermes 则把 MUST/NEVER 大写与对钩/叉号示例对相结合——其带 XML 标签的强制块只发给 GPT/Codex 与 Grok 模型。 Aider 几乎不用——其强制力来自补丁格式示例而非强调性散文(补丁格式指令中残留着一个零星的 IMPORTANT:)。 Mistral Vibe 走得最远:不再有 CRITICAL: 标签,也不再保留 Hard Rules 区段;强调如今完全是结构性的——一份明确的可覆盖性契约,带有名为 “Critical instructions—not overridable” 与 “Overridable defaults” 的区段。 这种对比提示了三个流派:修辞性强调(大写标签)、结构性强调(命名规则块与优先级契约)与示例驱动强调(示例对与格式样例),多数系统至少组合了其中两种。

工具使用哲学。

工具指导的具体程度各有不同。 Claude Code 坚持在 shell 之上使用专用工具:“Do NOT use the Bash tool to run commands when a relevant dedicated tool is provided. … Using dedicated tools allows the user to better understand and review your work.”。 Codex 为并行而优化:“Parallelize tool calls whenever possible—especially file reads.”。 Aider 的指令是格式机械性的:“Your entire response containing the patch MUST start with *** Begin Patch on a line by itself. … Each file MUST appear only once in the patch.”。 Mini-SWE-Agent 最具限制性:每轮恰好一个 bash 块,目录与环境变化以行内前缀给出(MY_VAR=val cd /path && …),因为每次调用都在新的子 shell 中运行。

刻意缺席的部分。

十一个提示词中没有任何一个包含明确的有害请求拒绝语言。 没有任何形如 “if the user asks you to do X, refuse and explain why” 的指令——唯一具有拒绝形态的文本关乎操作性风险(破坏性 git 操作、机密信息卫生、危险 shell 模式),而非政策层面的危害。 语料库中最接近的是拒绝礼仪:OpenCode 的默认提示词继承了早期 Claude Code 的措辞,指示模型,如果它拒绝,不要就原因说教(“keep your response to 1-2 sentences”)——这是针对拒绝的风格指导,而拒绝的理由从未被陈述。 对滥用的防范被完全委托给底层模型的预训练以及任何供应商侧的策略层。 这是一个值得注意的设计选择:生产级脚手架,即便是与自家供应商捆绑的那些,也不在系统提示词中重复对齐工作——而且这一发现如今在新增的三家供应商与社区世系上以 11/11 的范围继续成立。

观察 3。提示词修辞在工程经验趋同之处趋同,随后随着信任校准而变薄。反过度打磨语言以近乎同构的措辞出现在六个独立开发的脚手架中,而禁止自主提交规则在 2026 年 4 月是普遍的。到七月,语料库展示了这些规则的生命周期:Mistral Vibe 把其提交禁令反转为带有强制共同作者尾注的提交指导(OpenHands 则一直在讲授提交机制),而 Codex 最新的模型世代从其提示词中同时丢弃了提交规则与反过度打磨指令——行为策略随模型内化规范而变薄。如今三种修辞策略并存:由 Harness 强制执行的政策散文(Claude Code、OpenCode、Hermes)、结构性契约(Mistral Vibe 的七级指令层级与可覆盖性区段),以及对用户上下文的近乎完全委托(Pi 的 30 行提示词)。依模型而定的修辞已成为一个独立的轴:Hermes 按模型家族门控强制块并以注释引用观察到的按模型失败,OpenCode 则维护九个按家族提示词,其严格程度因接收者而异。十一个系统共同的稳定不变量:任何地方都没有政策层面的拒绝语言——对齐工作从不在 Harness 提示词中重复。

7.4 流式与响应处理

响应处理策略横跨很大范围:

  • •

    Claude Code:带细粒度事件的 SSE(content_block_start/delta/stop、message_delta)。通过 thinking 块支持扩展思考,其 budget_tokens 可配置。

  • •

    Codex:WebSocket + SSE 回退。从 JSON-RPC 解析 ResponseItem 事件。使用 generate=false 进行连接预热。轮次状态通过 x-codex-turn-state 头部维护。

  • •

    Gemini CLI:@google/genai SDK 的 chat.sendMessageStream(),带有四次尝试的流中重试循环(MidStreamRetryOptions),可从内容、网络与无效流错误中恢复。把 SDK 包在一个自定义 GeminiChat 类中以规避一个函数响应校验 bug。在响应记录时把扩展思考部分排除在持久化历史之外,以免它们污染未来的缓存查找。

  • •

    Mistral Vibe:Mistral SDK 的 stream_async() 聚合 LLMChunk 块;ThinkChunk 块被路由进独立的 reasoning_content 字段。跨流产出聚合的使用统计。

  • •

    Aider:用 mdstream 实现富终端渲染的 token 级流式。带指数退避的重试循环;通过以 assistant prefill 续写恢复来处理 FinishReasonLength。

  • •

    Mini-SWE-Agent:完整响应(无流式)。最简单的方式;依赖模型的原生补全。

  • •

    OpenHands:经 LiteLLM 包装器的 SSE,如今具备一流的流式支持(一个 LLM.stream 字段与经 on_token 回调转发的 token 增量)外加一条 OpenAI Responses 路径。支持面向 Anthropic 模型的提示词缓存标记。

  • •

    Hermes:五种自研传输实现;一个 ∼\sim23 个取值的 FailoverReason 枚举驱动分类恢复(压缩、轮换凭证、回退链或中止)。

  • •

    Pi:九种线上协议实现,为流式工具参数配备 partial-json 抢救解析器——与第 6 节的截断守卫配对,因为被抢救出的参数可能在不完整的情况下通过校验。

  • •

    OpenCode:Vercel AI SDK 的 streamText 掌管分派;token 粒度的 part 增量由内嵌服务器持久化并经 SSE 重新供给,因此每个客户端(TUI、web、IDE)重放的都是同一条流。

  • •

    OpenClaw:面向文本、思考与工具调用的 ACP 增量事件;各供应商专属的传输流处理底层的 SSE/WebSocket 层。

7.5 高级 API 特性

单一供应商系统利用了多供应商抽象所无法企及的特性:

Claude Code 的扩展思考集成暴露了一个 budget_tokens 参数,用于控制模型在响应之前执行多少内部推理;虽然 LiteLLM 确实透传 Anthropic 的 thinking 块,但要把 budget_tokens 呈现为一等公民的脚手架旋钮,任何多供应商设计仍需 Anthropic 特有的条件代码。 Codex 的推理努力枚举横跨 minimal/low/medium/high/xhigh,2026 年年中又以 max 与 ultra 扩展——而且 ultra 不只是更多推理:模型目录将其描述为带自动子智能体任务委派的最大推理,是一个会改变编排行为的努力级别,为语料库中所独有。 Mistral Vibe 的按模型 thinking 字段如今覆盖五级(off/low/medium/high/max),映射到 Mistral 的 reasoning_effort 枚举;Pi 则把整个图景归一化到统一的七级标尺之后,再经十种按 API 的 thinkingFormat 方言翻译出去。 Codex 通过一个 prompt_cache_key(由会话的 ThreadId 派生)实现提示词缓存(为 delegate 与 guardian 会话提供显式覆盖 Hook);这是比 Claude Code 的 Blake2b 哈希静态/动态边界更轻量的策略。 Aider 的视觉支持值得一提:当活动模型的 supports_vision 属性被设置时(经 LiteLLM 元数据),Aider 接受聊天中的图像文件、处理 MIME 类型,并把它们传给模型。 该支持是按模型门控而非无条件的,因此在表 17 中被标注为 “Opt.”;Mistral Vibe 在 v2.14–2.18 加入视觉列(TUI @-提及、剪贴板粘贴、ACP 行内图像块),而 Mini-SWE-Agent 保留了一条选择加入、默认关闭的多模态路径(一个把被标记内容展开为图像块的 multimodal_regex),因此语料库中没有哪个系统是无条件纯文本的。 Gemini CLI 暴露扩展思考(通过剥离思考部分保持缓存干净),然后把模型选择本身也经由 ModelRouterService 路由;这种把按请求模型选择当作分类器驱动运行时调度来对待的做法在语料库中仍是独有的(OpenHands 的 RouterLLM 配置档案按配置路由,而非按查询分类),如今还扩展到一个托管的设备上运行时(一个 gemini gemma 命令组会开通一个本地 LiteRT-LM 服务器,且路由链可以把本地 Gemma 模型用作其查询分类器)。 在可观测性方面,Gemini CLI 在按 token 成本核算之外还发出 OpenTelemetry 追踪。 Mistral Vibe 还用 OpenTelemetry 为其智能体循环、工具执行与 Hook 埋点(agent_span/tool_span/hook_span 异步上下文管理器,带 OTLP 导出器与 GenAI 语义约定属性),而 Pi 贡献了语料库中最不寻常的可观测性指标:一项逐轮的缓存未命中美元浪费审计,为每一次可避免的缓存失效定价。