调研各大厂商 Agent 的 system prompt

📅
⏱4 分钟阅读
·

CL4R1T4S 收集了泄漏和提取出来的 system prompt、工具说明

按 prompt 承担的职责分成四类

按厂商一家一段,会把职责完全不同的 prompt 文件放在一起。Claude 对话产品的 system prompt 和 Claude Code 的 system prompt 出自同一家,写的是两件不同的事。分类要看这段 prompt 在替谁干活:身份和能力边界、工具面、循环归谁、环境在不在模型侧。

四类 system prompt 各自承担的职责

编码 harness

这类 system prompt 默认git仓库已经存在,模型要搜索、阅读、修改、跑命令。循环可以写在 prompt 里,也可以写得很短,把停和继续交给「还有没有工具调用」以及外层的评分。

ANTHROPIC/Claude_Code_03-04-24.md 很短。身份是 Anthropic 的官方 CLI。安全只有两条:拒绝恶意用途,拒绝看起来像恶意软件的文件。记忆只有一句,CLAUDE.md 会自动进上下文,里面放常用命令、代码风格和仓库结构。任务过程是四步:搜索、用工具实现、能测就测、跑 lint 和 typecheck。工具政策里明确写了可以在同一个 function_calls 块里调用多个互不依赖的工具,并且「除非用户明确要求,否则不要提交」。

CURSOR/Cursor_Prompt.md 和 CURSOR/Cursor_2.0_Sys_Prompt.txt 把身份定位在 Cursor IDE 里,附带打开的文件、光标、诊断。旧版声明底层是 Claude 3.5 Sonnet,2.0 版改口说自己是 Composer,并要求不要承认是公开已知的模型。两份都要求对用户说话时不提工具名。2.0 把函数签名收进了同一文件的 # Tools 一节,同时写着可以一次调用一个或多个函数,但代码编辑工具每轮最多用一次,而且除了追加小改或新建文件,编辑前必须先读。

CLINE/Cline.md 把工具目录、XML 调用格式、示例、Act / Plan 两种模式和结束条件全写进一份文件。政策是每条消息只用一个工具,结果由下一轮用户消息带回。结束要调用 attempt_completion,而且必须先确认之前的工具已经成功。浏览器工具另有一条更硬的约束:浏览器开着时只能用 browser_action,一次一个动作,分辨率按 900×600 来点。

WINDSURF/Windsurf_Prompt.md 的身份是 Cascade,段落按工具调用、改代码、记忆、跑命令、浏览器预览、外部 API、语气切开。真正的参数不在这里,在 WINDSURF/Windsurf_Tools.md 的 JSON schema 里,例如 codebase_search、run_command、create_memory、browser_preview。记忆在这份 prompt 里是模型主动调用的工具。启动时不会像 Claude Code 那样塞进一份 CLAUDE.md。

OPENAI/Codex.md 的身份是「You are ChatGPT」。紧接着写的是评分器的规则:要改文件就提交,不要新建分支,不要改已有提交,工作区必须干净,只有提交了的代码才算数。AGENTS.md 的作用域、嵌套优先级,以及「系统、开发者和用户指令优先于 AGENTS.md」都写在这份文件里。OPENAI/Codex_Sep-15-2025.md 在此之上加了引用格式、make_pr 的调用条件、最终回答的 Summary / Testing 结构,以及一份内嵌的 container / browser_container 工具说明。9 月这版还写了一句和 Claude Code 相反的语气要求:回答要极详细,不要简短。

FACTORY/DROID.txt 把循环写成 Phase 0 到 Phase 2。实现类任务在改任何源文件之前必须先 git fetch / git pull --ff-only,再按锁文件做冻结安装;安装失败就停,让用户去 Factory 的 session 设置里补环境。诊断类任务禁止建分支和开 PR。实现类任务必须以 PR 结束。

ZAI/ZCode/Prompts.md 是多段编码提示拼在一个文件里。身份是终端里的 ZCode。工具参数不在正文,在 ZAI/ZCode/Tools.json。正文留下注入槽:权限模式、技能列表、MEMORY.md、agentsMd 指向的用户指令和仓库指令、git status、当前分支。并行写在 harness 小节里:互不依赖的工具调用可以出现在同一次回复中。

XAI/Grok-Code-Fast-1_Aug-26-2025.txt 说明编码模型提取出来的 system prompt 可以几乎没有编码循环。全文先是一段声明最高优先级的安全说明,然后才是「You are Grok Code Fast 1」,再加上 Markdown 和数学公式的格式。没有读文件、没有编辑、没有 git。循环如果存在,也不在这份文件里。

从零生成应用

这类产品的用户看着预览。prompt 的主体是输出契约和运行时限制:一次回复里代码怎么包、默认技术栈是什么、这个沙箱跑不了什么。

BOLT/Bolt.txt 把运行环境写成 WebContainer:浏览器里的 Node,不能跑原生二进制,Python 只有标准库,没有 git。默认 Vite,数据库默认 Supabase,而且要求用户自己点连接按钮,不要去写 .env。迁移用完整 SQL 文件,禁止 DROP / DELETE。每轮用户消息会带上正在跑的命令,prompt 要求用自然语言转述,不要向用户提起那些 XML 标签。

LOVABLE/Lovable_2.0.txt 的身份是改 React 应用的编辑器,右侧 iframe 是预览,还能看到控制台。真正的「工具」是回复正文里的 <lov-code>,里面用 <lov-write>、<lov-rename>、<lov-delete>、<lov-add-dependency>。规定一次回复只有一个 <lov-code> 块,一个文件一个 <lov-write>。块外面只留一两句给非技术用户看的话。技术栈默认 Tailwind、shadcn/ui、TanStack Query。prompt 同时说:如果另外提供了工具,不要对用户提工具名,也不要把工具调用语法和 <lov-*> 标签混用。

VERCEL V0/Vercel_v0.txt 用 MDX 的 Code Project 包住文件。一次回复只能有一个 Code Project,同一个项目要沿用同一个 id。运行时是浏览器里的轻量 Next.js,不支持 package.json,依赖从 import 推断;shadcn 组件只允许 import,不允许把组件源码再写一遍。小改用 <QuickEdit>,其余整文件重写。默认 App Router。

Replit 在这一类和编码类之间拆成了两份 prompt。REPLIT/Replit_Initial_Code_Generation_Prompt.md 要求一次生成完整应用,输出里要有目录结构和每个文件的全文。REPLIT/Replit_Agent.md 则是来回迭代:用反馈工具向用户确认预览,长任务走 workflow,由平台分配端口,不在 shell 里自己起服务器,数据库变更走 ORM,不要直接 DELETE / UPDATE。沟通政策写明用户是非技术的,部署按钮和回滚按钮只能让用户自己点。工具参数在 REPLIT/Replit_Functions.md,和策略正文分开,里面有 str_replace_editor、web_application_feedback_tool、ask_secrets、packager_tool 等。

SAMEDEV/Same_Dev.txt 更明显地混了两类规则。工具政策几乎是 Cursor 那套:不提工具名、编辑前先读、同一文件的错误修满三次就停下来问。同一份 prompt 又规定预览 iframe、Bun、dev server 绑 0.0.0.0、shadcn,以及用户丢过来一个 URL 时先抓页面再克隆界面。

带计算机或浏览器的长程任务

这里的环境是一台机器或一个浏览器,任务可以跨很多步。prompt 要规定怎么观察、怎么停、哪些模块的输出不算用户说的话。

MANUS/Manus_Prompt.txt 把身份、语言、沙箱能力、事件流、agent loop、以及 planner / knowledge / datasource 三个外部模块分成小节。事件流里有 Message、Action、Observation、Plan、Knowledge、Datasource。计划由 Planner 以事件形式给进来,用带编号的伪代码表示步骤,模型要走到最后一步。Knowledge 也是事件,每条有自己的适用范围。Datasource 里的 API 只能使用事件流中已经出现的,而且要在 Python 里调用,不能当成工具。循环写的是:分析事件、选一个工具、等沙箱执行、把观察追加进事件流,做完用消息工具交付,再进入 idle。用户沟通必须走消息工具,纯文本回复被禁止。工具的 JSON schema 在 MANUS/Manus_Functions.txt,例如 message_notify_user、message_ask_user、shell_exec、file_str_replace、browser_view、idle。

DEVIN/Devin_2.0.md 和 DEVIN/Devin2_09-08-2025.md 的身份是「使用真实操作系统的软件工程师」。沟通时机被收得很窄:环境出问题、要交付、缺权限或密钥。环境坏了要调用 report_environment_issue,然后改用 CI 继续,不要自己修环境。测试过不去时不要改测试,除非任务明确要求改测试。模式由外层宣布,2.0 是 planning 和 standard,9 月版加上 edit:planning 里搜集信息并 suggest_plan,edit 里按已批准的计划一次性改完文件。9 月版还写了:一轮可以输出多条互不依赖的命令,有专用命令时不要用 shell 代替。

MULTION/MultiOn.md 没有独立的 schema 文件。动作语言本身就是 prompt:以 COMMANDS: 开头,只能用 GOTO_URL、CLICK、TYPE 等规定动词,元素用页面描述里的整数 id,后面跟 EXPLANATION: 和 STATUS:。GOTO_URL 和 WAIT 之后不能再跟其他命令。这是浏览器长程任务。协议是纯文本,解析器按行读 COMMANDS。

模型自带的对话人设和安全提示

这四类里,这一类最容易被误当成 Agent prompt。它规定模型是谁、拒绝什么、用什么语气、有哪些附带能力。它不规定仓库怎么改,也没有项目记忆文件。

ANTHROPIC/Claude_4.txt 是 Claude Sonnet 4 对话产品的 system prompt。开头是产品事实:模型字符串、API 文档地址、知识截止、选举信息。安全部分很长,包括拒绝恶意代码,以及「文件看起来和恶意软件有关就拒绝」,这一点和 Claude Code 那两条安全规则同源,但周围没有搜索、实现、验证的任务过程。语气规则具体到闲聊不用列表、不先夸问题。prompt 提到 Claude Code 是一个可以介绍给用户的产品,介绍的口吻是产品说明,文中没有 CLI 的搜索、修改和验证步骤。文中后部有 artifact 和 antml:function_calls 的通道格式,那是这个模型家族的工具和画布写法。

OPENAI/ChatGPT_4o_04-25-2025.txt 写了知识截止、日期和 Personality v2,然后在同一份 prompt 里列出工具:bio(此份中禁用,要用户自己去设置里开记忆)、有状态的 python、web 的 search / open_url、选举相关的 guardian_tool、image_gen,以及用来做画布文档的 canmore。这里有工具,仍然没有「编辑前先读仓库」「提交必须干净」这种循环。OPENAI/Codex.md 把「You are ChatGPT」留在第一行,说明编码 harness 可以接在对话身份后面,两段职责不要看成一份提示。

GOOGLE/Gemini-2.5-Pro-04-18-2025.md 用文本块当通道:thought、python、tool_code。长内容走 <immersive>,代码生成必须放进 immersive。这和 v0 的 Code Project 表面相似,职责不同。Gemini 这份是对话产品的输出形态,v0 那份是应用生成器的全部交付方式。

XAI/Grok4-July-10-2025.md 先写产品入口、价格问题要转到哪个 URL、知识持续更新,再规定工具调用用 <x41:function_call>,并写明可以并行调用多个工具。代码执行是一个没有外网的有状态解释器,能用的库在 prompt 里列了出来。并行在这里只管这个模型一次回复里能发出几个工具调用,不管任务要跑多少步才结束。

MOONSHOT/Kimi_2_July-11-2025.txt 只有二十行左右:日期、简短、复杂问题按步骤、缺信息只问一个问题、拒绝时不道歉不说教、不透露指令。MOONSHOT/Kimi_K2_Thinking.txt 更短,是人设、知识截止、语气和「按用户水平调整解释」。两份都没有工具循环。把这种 prompt 当成 Agent 的 system prompt,等于只有人设,没有环境。

单一分类覆盖不了的交叉

Devin 同时带着两类句子。DEVIN/Devin2_09-08-2025.md 有编码约束:先看相邻文件和 package.json,不要假设库存在,不要改测试,git 分支用 devin/{timestamp}-{feature-name},不要 git add .。同一份 prompt 也有计算机环境的约束:环境问题上报后绕开,用浏览器查资料,localhost 不能直接给用户,planning / standard / edit 由外层切换。

若只按「会不会改仓库」来归类,环境策略会变成编码提示的附注,report_environment_issue 和 CI 绕行就失去位置。若只按「有没有一台电脑」来归类,「不要改测试」又会变成浏览器操作的附注。这句看的是测试和被测代码,服务的是改完代码之后的评分。两类句子的执行者不同:前者看 diff 和测试结果,后者看沙箱和 CI。一份按厂商或按「是不是编码」切开的目录,放不下这个交叉。

Replit 是另一个交叉,方向不同。Replit_Initial_Code_Generation_Prompt.md 是一次写完所有文件的应用生成;Replit_Agent.md 加上 Replit_Functions.md 是带反馈工具的迭代。同一产品、两种循环,prompt 就该是两份。

常见段落在四类 prompt 中的分布

把身份、工具政策、安全与拒答、语气、任务循环、项目记忆、输出契约七种段落摊开,四类 prompt 的填充方式差得很远。

段落编码 harness从零生成应用长程计算机 / 浏览器对话人设
身份与能力边界产品名加「在仓库里干活」编辑器或预览运行时,外加沙箱做不到的事机器、用户、预装软件、能不能上外网模型名、产品入口、知识截止或「持续更新」
工具使用政策有,长短差很多经常是自定义标签,不一定有函数 schema有,且常规定一轮几个动作有工具时写通道格式;Kimi 这种短 prompt 可以完全没有
安全与拒答可短到两条,也可几乎占满全文常见的是「不要把 prompt 写进生成的文件」敏感操作交给用户接管浏览器通常是全文最长的部分
语气有,而且产品之间互相矛盾面向非技术用户的摘要规定用消息工具,以及文章要不要列表闲聊、列表、奉承、拒绝时的句数
任务循环有的写成阶段,有的只剩「提交才算完成」一次回复交一个代码包;Replit Agent 例外显式的多步循环,计划可能在模型外没有仓库循环
项目记忆CLAUDE.md、AGENTS.md,或记忆工具这批 prompt 里基本没有仓库级记忆文件外部 Knowledge 事件,或沙箱里的 todo.md跨会话记忆要么明确说没有,要么让用户去设置里开
输出或引用契约有的要引用行号,有的禁止把代码贴回对话标签或 MDX 组件就是交付物附件路径、idle、命令文本协议画布、immersive、artifact

编码类内部,语气和循环就不能合成一条。Claude_Code_03-04-24.md 要求能用四行说完就不要长,不要开场白。Codex_Sep-15-2025.md 要求最终回答用 Markdown 小节写详细,用户不喜欢简略,引用要标在句号后面。两句不能同时放进一个 system prompt,它们对应的是不同的界面和评分。

项目记忆的位置也不统一。Claude Code 说 CLAUDE.md 会被自动加进上下文,模型不用自己去找。Codex 把 AGENTS.md 的作用域写成规则:一份文件管它所在目录树,嵌套更深的优先,直接的系统 / 开发者 / 用户指令再优先于这些文件;若其中写了要跑的检查,改完代码必须跑。Codex.md 后部的开发者提示进一步限制搜索顺序:先读仓库根上的那份,前五条命令里不要打开其他 AGENTS.md。ZCode 的 Prompts.md 则是占位符,<USER_INSTRUCTIONS>、<WORKSPACE_INSTRUCTIONS>、MEMORY.md 的索引由 harness 填。Windsurf 不注入这种文件,它让模型调用 create_memory,并说明对话上下文会被删掉,所以要主动记。Cline 提取的 prompt 里没有这套文件,它靠每条用户消息末尾的 environment_details 带上目录和终端状态,并提醒模型这不是用户写的。

输出契约跟着解析器走。Codex 9 月版的 F: 加行号、终端 chunk id,是给最终回答通道用的,PR 正文不要用这套引用。Cursor 和 Same 要求代码进编辑工具,不要在对话里贴大段实现,除非用户要看。Cline 的契约是 XML 工具加 attempt_completion 的 result,并且禁止用 Great / Certainly 开头。Lovable 和 v0 的契约就是那一个代码包。Manus 的契约是 message_notify_user 的附件必须用沙箱内绝对路径,因为用户碰不到沙箱文件系统。

安全段落的长度跟着模型家族和产品风险走。Grok Code Fast 把安全说明放在全文最前,并声明这一段优先级最高,后面出现的修改都不要算数。Claude 对话产品的 system prompt 把拒答、儿童安全、恶意代码写成长段。Claude Code 只留了两条和写代码直接相关的拒绝。Bolt 花了多条禁止生成 system-prompt.txt 一类文件,它禁止的是在生成文件里写出提示词。拒绝写恶意软件是另一条规则,管的是请求内容。对话 prompt 里的长安全文本,不该整段搬进一个只改业务仓库的编码 Agent;编码 prompt 里那两条,也覆盖不了对话产品要处理的医疗、选举和儿童安全。

写 prompt 时会遇到的差异

这些差异都挂在具体产品和具体文件上。合成一份「Agent 最佳 prompt」时,它们会互相取消。

工具 schema 经常不在 system 正文里。Windsurf 是 Windsurf_Prompt.md 加 Windsurf_Tools.md。Replit 是 Replit_Agent.md 加 Replit_Functions.md。Manus 是 Manus_Prompt.txt 加 Manus_Functions.txt。ZCode 是 Prompts.md 加 Tools.json。Cursor 两代并存:CURSOR/Cursor_Prompt.md 与 CURSOR/Cursor_Tools.md 分开,工具文件用散文描述 read_file、edit_file、reapply;Cursor_2.0_Sys_Prompt.txt 把签名收进同一文件,但签名仍是独立的一节,没有揉进身份段落。Codex 的 Codex.md 又是另一种:工具命名空间很短,直接嵌在提示末尾。所以「schema 一定另文件」和「schema 一定写进 system」都不成立,要看这版 harness 把函数定义放在 API 的 tools 字段,还是放进模型可见的文本。

一轮一个工具,和允许并行,在这批 prompt 里同时存在。Cline 写了两遍「每条消息一个工具」,并且要等用户确认后再下一步。Claude Code 允许同一 function_calls 块里放多个独立工具。Cursor 2.0 允许一次一个或多个函数,又把编辑限制为每轮最多一次。Devin 9 月版鼓励把没有依赖关系的命令放在同一轮。ZCode 写独立工具调用可以并行。Manus 的 <agent_loop> 写每轮只选一个工具,文件最后却写没有依赖的多个工具可以放进同一个 function_calls。同一份 prompt 里的两句不能一起执行。实现时以运行时为准:解析器如果只取第一个工具,prompt 里就留「一轮一个」;API 支持并行且沙箱能同时跑,再写并行,并写清编辑、浏览器点击这种有顺序的动作不并行。

一轮一个工具和允许并行两种循环

对用户隐藏工具名,取决于界面会不会把原始调用显示出来。Cursor_Prompt.md、Cursor_2.0_Sys_Prompt.txt、Same_Dev.txt、Lovable_2.0.txt 都写了不要对用户说工具名。Manus 的 <tool_use_rules> 同样禁止在消息里提具体工具名,同时要求每次回复都必须是工具调用,用户可见的句子走 message_notify_user。Cline 相反,工具名就是 XML 标签,用户看得到模型发出的调用。若产品 UI 已经把工具渲染成「正在读取文件」,prompt 里的禁令才有对象;若调试界面要展示原始调用,这条禁令会让模型把状态说得含糊。

计划可以完全放在模型外面。Manus 的 Planner、Knowledge、Datasource 都是事件。步骤内容由这些事件给出,system prompt 里只有怎么阅读它们。todo.md 由模型按 Planner 的步骤去改,但「任务规划优先于 todo.md」。Cline 的 Plan 模式则把计划放回模型:plan_mode_respond 只在 environment_details 标明 PLAN_MODE 时可用,而且要先读完文件再给计划,用户手动切到 Act 之后才改代码。Devin 的模式字符串由用户侧在每次行动前声明。三种都叫 plan,负责推进循环的一方不同。把 Manus 的「必须走完 Planner 给出的最后一步」抄进一个没有 Planner 事件的 harness,模型会去等一批永远不会来的事件。

循环、git 和校验命令经常由 harness 写进提示。它们随评分器和仓库变化,不随模型默认语气变化。Claude Code 自动注入 CLAUDE.md,并要求在可能时跑测试、lint、typecheck,提交则默认不做。OPENAI/Codex.md 把「必须提交、工作区干净、只有提交算数」写进指令,又把「改动落在某份 AGENTS.md 的目录树里就必须服从它,包括其中的程序化检查」写成规范。同一文件后部的开发者提示再补上网络受限时 Testing 一节要粘贴的免责声明原文。这几句离开 Codex 的容器和评分脚本就没有指称。Factory 的 Droid 更进一步,把冻结安装和「实现任务必须以 PR 结束」写成阻塞阶段。Devin 的默认提交身份、分支名格式和「推送失败不要强推」也是产品流程。

编辑前先读、不改测试、环境坏了不要自己修,这三条随产品变,不能收成一条纪律。Cursor 2.0 和 Same 把「先读再改」写进改代码的规则,例外是小段追加和新建文件。Cline 的 replace_in_file 要求 SEARCH 块和文件逐字符一致,对不上就改失败。prompt 还提醒编辑器可能自动格式化,下一刀要按工具返回的最终文本来配。Devin 写不要改测试,先怀疑被测代码;同一节写环境坏了不要修,去用 CI。Droid 的规定相反:实现任务在读应用源码之前就要把依赖装好,装不好就停,不要绕过环境继续改代码。Replit Agent 禁止用 bash 跑 pip install / npm install,改走 packager_tool,这是平台限制,搬到用户本机的编码 Agent 上会让依赖装不进去。

停的条件也各写各的。Cursor 规定同一个文件的 lint 错误不要连续修超过三次,第三次问用户。Devin 写 CI 三次还不绿就向用户求助。Replit 写调试失败超过三次就求助。Cline 的停是 attempt_completion,并且在此之前不能假设工具已成功。Manus 的停是 idle,条件包括交付已经通过消息工具发出。这些数字和工具名是各自 harness 的停止信号。换成另一个循环时,数字可以留,工具名必须改成新运行时真正认的那个。

三种场景下,每句话写在哪里

前面这些差异说明,换模型时,要改的是工具通道格式和安全段落的位置;换循环形态时,要改的是谁产生下一步、工具结果从哪条消息回来。下面分三种场景展开,每句话写在哪里,取决于它约束的是哪个运行时。

system prompt、工具 schema、harness 注入和留给模型的四个位置

编码 Agent

放进 system prompt 的,是 schema 表达不了的政策。身份写产品,不写「你是世界上最好的工程师」这种没有检查条件的句子。写清什么时候只回答、什么时候可以改文件。写编辑前先读,以及同一处自动修复的次数上限。若 UI 会把工具调用显示成自然语言,再写不要对用户说工具名。语气只保留这个界面能接受的那一种:Claude Code 那种四行以内,或 Codex 9 月版那种带引用的长回答,二选一。安全按模型家族放。Grok Code Fast 提取的 prompt 把安全段放在最前并声明优先;Claude 对话产品的 system prompt 把拒答写在身份之后。换到会把「前文优先级更高」当真的模型时,把拒答放在它训练时见过的位置,不要夹在工具教程中间。

放进工具 schema 的,是名字、参数、枚举和会让调用失败的格式。SEARCH/REPLACE 的标记、edit_file 里用注释表示省略的既有代码、一次最多读多少行、终端要不要 is_background,都跟具体工具走。Windsurf、Replit、Manus、ZCode 的独立文件,以及 Cursor 2.0 那一节函数签名,都是这个位置。system prompt 里只保留选择工具的政策,例如「有专用搜索就不要用 grep 式的 shell」「编辑每轮一次,读取可以并行」。

由 harness 注入的,是会变的项目事实。CLAUDE.md 或 AGENTS.md 的正文、作用域说明、git status、当前诊断、打开的文件、技能列表、用户允许的校验命令。Codex 那种「根上的 AGENTS.md 先读,前几次命令不要把嵌套文件全打开」是注入策略,适合写在开发者消息或运行时逻辑里,不要写死在模型身份段。权限被拒绝时怎么做,ZCode 的 prompt 写的是调整参数,不要原样重试。这句依赖 harness 把拒绝单独返回。若拒绝只显示成普通报错,模型无法区分该改参数还是再试一次。

留给模型、不要写死的,是它已经稳定的编码习惯,以及这份任务不存在的流程。仓库里已有风格,用「先看相邻文件」一句就够,Devin 和 Claude Code 都是这个写法。不要把 Cursor / Windsurf 里「从零做网页时要现代、好看」写进一个只改现有服务的 Agent,那句是给空项目的。也不要默认写上 Codex 的提交义务或 Claude Code 的禁止提交。模型不会从身份里推出你的评分器只看提交,还是只看工作区 diff。

换循环时要改的一个例子:从 ANTHROPIC/Claude_Code_03-04-24.md 的「多个独立工具放在同一个 function_calls 块」换成 CLINE/Cline.md 的「一条消息一个 XML 工具,结果装在下一轮用户消息里,结束必须调用 attempt_completion」。并行那句要删掉,否则解析器会丢掉第二次调用,模型还以为已经执行。Claude Code 这份短 prompt 没有写结束工具。若 harness 把「这轮没有工具调用」当成结束,这个约定要和 attempt_completion 对齐,两套停止信号不能同时生效。environment_details 这类由 harness 追加、又要模型不要当成用户原话的字段,要在 prompt 里点名。反过来,若评分改成 Codex 那种只认提交,Claude Code 的「不要提交」必须删掉,改成提交、干净工作区、以及 AGENTS.md 里的检查命令;引用格式只有在最终回答的渲染器认 F: 和行号时才写。换模型而不换循环时,通常只改工具通道的标签和安全段的位置,例如从 Claude 的函数调用块改成该模型文档里的格式,不要把 Grok Code Fast 那份几乎只有安全说明的 prompt,当成已经包含了读写文件的循环。

长程计算机使用 Agent

放进 system prompt 的,是这台机器上的事实和政策。操作系统、用户、家目录、有没有外网、服务要绑哪个地址、用户看不看得到 localhost。Manus 把这些放在 <sandbox_environment> 和 <deploy_rules>。敏感操作让用户暂时接管浏览器,这句也在 prompt 里,因为它约束的是模型何时停下来问人。若沙箱一步一截图,prompt 写一轮一个动作,并写浏览器开着时不要夹进改文件的工具,Cline 的 browser_action 就是这样。动作之间没有依赖、沙箱也能并行时,才允许并行,而且不要在同一文件里留下相反的两句。Manus 这份 prompt 就同时有「每轮一个」和文末的并行,实现时只能保留和调度器一致的那句。

放进工具 schema 的,是浏览器、shell、文件、消息和结束工具的参数。Manus 的 browser_view、shell_exec、message_ask_user、idle 在 Manus_Functions.txt,不在身份小节。哪些字段必填、附件是字符串还是数组,放 schema。prompt 只写选择:进度用 notify,需要用户才能继续才用 ask,交付完成才能 idle。

由 harness 注入的,是会随任务变的状态。Manus 的 Plan、Knowledge、Datasource 事件,当前视口里的元素索引,终端的剩余输出,已有的 todo.md。计划的内容不要写进 system prompt。prompt 要写明这些事件来自系统模块,并写明模型必须走完外部给出的步骤,还是可以改计划。Devin 的模式字符串也是注入的:外层不告诉模型现在是 planning、standard 还是 edit,prompt 里的模式规则就不会触发。

留给模型的,是工具返回已经结构化之后的低层判断。Manus 的浏览器结果带元素索引,就不要再在 prompt 里要求模型自己从像素猜坐标。Cline 的浏览器只给 900×600 的截图,坐标规则就必须写进那个工具的说明,不能假设模型会从 Manus 的索引协议迁移过来。MultiOn 连 schema 都没有,CLICK 后面的整数 id 和「GOTO_URL 之后不能再跟命令」都得留在 prompt 里,因为解析器读的是这几行文本。

换循环时要改的一个例子:去掉外部 Planner,改成 Cline 那种 Plan / Act,或 Devin 那种用户批准计划后再进入 edit。Manus 的事件类型 Plan、Knowledge 从流里消失,prompt 里「计划以事件到达、必须走到最后一步编号」整节删掉。改成模式标志由 harness 放进每条消息,Plan 模式下只允许读和提问,Act 或 edit 模式才允许改文件。停止条件从 idle 加上外部步骤完成,改成用户确认计划,或 edit 模式已经把计划里的修改都发出。若再把浏览器从索引点击换成截图坐标,browser_* 的 schema 和 prompt 里的浏览器小节一起换,身份段里「你有一台 Linux 沙箱」可以留。只换模型、仍用同一套函数调用时,改的是调用标签和这个模型对「必须只输出工具调用」的服从方式。有的模型会在工具调用前后加解释,Manus 那种禁止纯文本的规则就要配合解析器:要么接受这些解释,要么在失败时重试。只把这句在 prompt 里加粗,解析器仍然会收到解释文本。

以对话为主的产品助手

放进 system prompt 的,是人设、拒答、语气、语言,以及这个产品真实提供的能力边界。Claude 对话产品的 prompt 里的产品名单、价格和限额让用户去看支持页、知识截止之后要用搜索,都是这类句子。Kimi 那种短 prompt 适合作为语气和拒绝的底,前提是产品确实没有工具。有工具时,把工具写清楚,避免模型声称自己能上网或能记跨会话记忆。ChatGPT 4o 这份直接写 bio 已禁用,要用户去设置里打开,这比一句「你有记忆」诚实。

放进工具 schema 的,是真正走工具通道的能力:搜索、代码解释器、画布更新。参数和超时放 schema 或工具说明,例如 ChatGPT 的 prompt 里 python 60 秒、无外网、图表不要指定颜色。Gemini 的 tool_code、Grok 4 的 <x41:function_call> 是各自家族的通道。通道格式写在该模型的提示里,因为它不在你的 JSON schema 字段中,解析器认的是这段文本。

若交付物是从回复正文里解析出来的,契约就留在 prompt,不要假装它是工具 schema。v0 的一个 Code Project、禁止写 package.json、默认 Next.js App Router;Lovable 的一个 <lov-code> 和块外的非技术摘要;Bolt 的 WebContainer 能力表和「不要提及注入的命令标签」。这些句子描述的是渲染器。渲染器不读 tools 字段。

由 harness 注入的,是日期、选中的文件片段、正在运行的命令、预览的控制台日志、用户是否已连接某个后端。Bolt 要求模型自然地说「开发服务器已经在跑」,不要引用注入用的标签名。注入块要在 prompt 里说明来源,否则模型会把它当成用户的要求,Cline 对 environment_details 的提醒就是这个作用。对话产品没有仓库时,不要注入空的 AGENTS.md 规则。模型会为了服从一份不存在的文件去编造检查命令。

留给模型的,是解释的详略和一般知识。不要把 Codex 的引用语法、Devin 的「不要修环境」、Claude Code 的四步任务过程写进纯对话。那些句子的前提是容器、CI 和 diff 评分。前提不在,模型要么忽略,要么编一个假的工作区来交差。对话产品的 prompt 里已经写得很具体的偏好可以保留,例如 Claude 4 闲聊不用列表、Grok 4 数学题要写出推导、Kimi 2 缺信息只问一个问题。它们约束的是回复形状,不依赖 Agent 循环。

换循环时要改的一个例子:从 ChatGPT 4o 这种 python / web 工具通道,改成 v0 这种一次回复一个 Code Project。原来的工具列表不再是执行路径,prompt 要改成输出规则:一个项目块、依赖从 import 推断、不要写 package.json、shadcn 只 import、小改用 QuickEdit。若新模型经常把自定义 XML 写坏,就把 Lovable 的 <lov-write> 换成 Replit 那种真正的 str_replace_editor schema,prompt 里留下「先看是不是已经实现了、面向用户的句子保持非技术、不要用 bash 装包」。这是循环形态变了:从「解析助手正文」变成「解析工具调用,预览由运行时更新」。只换模型、仍是对话加少数工具时,改通道标签和安全段位置即可,例如 Grok 4 的并行 x41 调用不要原样贴进只接受单个 tool_code 块的解析器。Kimi 那种无工具的短 prompt 也不能拿来当带搜索的助手的全部 system prompt,搜索政策会无处可放。

这些 system prompt 之间的矛盾

这批提取出来的 prompt 互相矛盾,有的同一文件里就矛盾。Claude Code 不提交,Codex 不提交就不算完成。Devin 不修环境,Droid 不装好环境就不许改代码。Manus 一轮一个工具,文末又允许并行。Cursor 可以并行调用,编辑却每轮一次。语气上,四行以内和「不要简短」不可能是同一条产品要求。

因此实现时先写运行时:工具结果从哪回来、一轮执行几个调用、什么叫做做完、哪些文件由 harness 注入、用的是哪一个模型的工具通道。system prompt 只保留这个运行时执行不了、又必须让模型知道的信息。其余放进 schema 或注入内容。换模型或换循环,改的是这几句和通道格式。再找一份更长的提示盖上去,解决不了运行时已经定下来的解析和评分。


共 1797 字 · 79 段落
ximing

Follow onGitHub

相关文章