ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VS Code Agent Host 提示词基线机制全解:解剖 gpt-5.1-codex-mini 的完整模型请求体快照

VS Code Agent Host 提示词基线机制全解:解剖 gpt-5.1-codex-mini 的完整模型请求体快照 VS Code Agent Host 提示词基线机制全解解剖 gpt-5.1-codex-mini 的完整模型请求体快照【免费下载链接】vscodeVisual Studio Code项目地址: https://gitcode.com/GitHub_Trending/vscode6/vscode在 VS Code 的 Agent Host智能体宿主端到端测试体系中有一个看似不起眼却极其关键的快照文件Agent_Host_E2E___Copilot_prompts_gpt-5_1-codex-mini.prompt.md。它以 JSON 形式完整记录了内置 Copilot CLI 在发送gpt-5.1-codex-mini模型请求时序列化到线上的每一个字段——从系统提示词到工具定义、从采样参数到用户消息。本文以该快照为主体样本结合测试源码与运行框架深入讲解 VS Code 如何把 Copilot 提示词做成可回归、免 token、确定性重放的基线资产读完后你将理解快照的生成链路、字段含义、归一化规则以及如何新增模型、更新与解读基线变更。一个快照背后是什么提示词基线的意义为什么提示词需要“被钉死”Copilot 编码智能体最终的提示词并不是 VS Code 仓库内的纯文本。注释与 README 都明确指出提示词是github/copilotCLI 的产品而非宿主Agent Host的产品——它被编译进 Copilot 的原生二进制只有在 CLI 把模型请求体序列化到网络线上时才可观察。因此仓库无法直接读取提示词源码来断言其内容只能通过监听“线上流量”来捕获它。这正是 copilotPromptsE2E.integrationTest.ts 做的事情它钉死内置 Copilot CLI 针对每个模型发送的模型请求体所有字段覆盖系统提示词、工具定义、回合消息以及 CLI 在消息外围注入的上下文current_datetime、system_reminder等同样包含thinking/text.verbosity/max_tokens/parallel_tool_calls这类采样参数。从“回放回合”而非“录制回合”读取测试读取提示词的路径非常讲究它从重放replay的回合中读取请求体。这样既确定性又免 token。录制recording方向则相反——录制会接触真实 CAPI 以获取模型目录与实验分配这两者都可能出于本仓库无法控制的原因改变提示词因此录制运行永远不会产生基线。当一个 diff 出现时它意味着两件事之一CLI 变了SDK 升级或宿主改变了它交给 CLI 的东西。快照文件如何被生成与命名逐模型驱动的测试注册测试套件Agent Host E2E — Copilot prompts遍历SNAPSHOT_MODELS常量数组位于 copilotPromptsE2E.integrationTest.ts为每个模型注册一个用例。该列表包含gpt-5、gpt-5.1-codex-mini、claude-opus-5、gemini-2.0-flash等约 20 个模型族覆盖了 Copilot 扩展agentPrompt.spec.tsx中的模型族加上 Agent Host 支持的新模型族。一个关键设计是每个模型必须显式选择。不发送模型选择是刻意不钉死的——CLI 会按自身排序从桩目录里选模型那样基线记录的就不是产品行为而是本套件 fixture 的属性。gpt-5.1-codex-mini就是被选中钉死的模型之一因此它拥有一份专属的.prompt.md基线。由于测试是POSIX-only的Windows 上会以test.skip跳过——Windows 提示词带 PowerShell 专属段落你看到的这份基线本质上是 POSIX 形态的请求体。快照的落盘路径与基线更新快照命名由 ahpSnapshot.ts 中的snapshotPathForTest计算把测试的完整标题做 sanitize 后拼上.prompt.md后缀存放在测试源码旁的__snapshots__/目录。这就是文件名为Agent_Host_E2E___Copilot_prompts_gpt-5_1-codex-mini.prompt.md的原因。更新基线使用与 AHP 快照相同的环境变量开关AGENT_HOST_UPDATE_AHP_SNAPSHOTS1 ./scripts/test-integration.sh --run \ src/vs/platform/agentHost/test/node/e2e/providers/copilotPromptsE2E.integrationTest.ts正常回放运行是只读的assertPromptSnapshot要求基线的确已提交否则直接抛错“no committed prompt baseline”绝不会自动创建一个空白基线让模型“绿化通过”而处于AGENT_HOST_UPDATE_AHP_SNAPSHOTS1时会把当前抓到的 body 就地写盘。更新后必须人工 review diff再不带标志重跑一次验证。抓哪个请求体测试驱动一个完整回合后通过lease.observedModelRequestBodies.at(-1)取最后一个被观察到的模型请求体——这保证即使 CLI 中途插入了一个 preflight 请求也只会取到真正的模型回合请求。解剖 gpt-5.1-codex-mini 的请求体快照作为对比样本claude-opus-5的基线见同目录 Agent_Host_E2E___Copilot_prompts_claude-opus-5.prompt.md属于 Anthropic Messages 方言字段名是systemmessages而本快照所属的gpt-5.1-codex-mini走的是OpenAI Responses 方言POST /responses。测试源码里的IWireRequest接口注释精确区分了这两种线上形态Anthropic Messages spells the system promptsystem; Responses usesinstructions。同样地Anthropic 用messages装回合Responses 用input。顶层字段一览字段值说明modelgpt-5.1-codex-mini显式选择的模型绝不允许留空由 CLI 自行排序instructions超长系统提示词详见下节Responses 方言的系统提示字段input[{role: user, content: [{type: input_text, text: current_datetime${datetime}/current_datetime\n\nSay exactly \ok\}]}]回合消息注意时间戳已被归一化为${datetime}占位符tools一长串函数工具定义由 CLI 按 SDK 定义注入包含bash、view、edit、skill、ask_user、sql、task、web_fetch等均带完整description与parametersreasoning{effort: medium}推理预算encrypted content 一并经include返回storefalse请求不留存streamtrue流式返回include[reasoning.encrypted_content]需要服务端回传的内容类型parallel_tool_callstrue允许并行工具调用用户回合消息刻意写得最简单——Say exactly ok。这并非随意为之prompt 快照要钉住的是系统提示词与工具定义的结构而不是某个真实任务的内容。最简输入能最小化 fixture 体积与易碎面同时完整暴露 CLI 注入的上下文前导current_datetime${datetime}/current_datetime。请求体的渲染与归一化formatPromptSnapshot把序列化后的 body 以JSON.stringify(..., null, 2)pretty-print并包进 json fenced block而非逐字节复刻——CLI 在线上把它压成单行pretty-print 只影响缩进层级不会改动字段内容。由于 JSON 会把字符串值里的换行转义掉系统提示词与超长工具描述各自保持在一行内任何改写都会表现为整行被重写从而在 diff 中清晰可见。没有任何字段被丢弃。一个参数只要 CLI 开始发送就会在下次基线 diff 中自行出现——这是“全字段钉死”与旧式“渲染子集对比”的本质区别。系统提示词instructions的内容编排这份快照最有价值的部分在于把完整系统提示词原样暴露出来。从源码结构与正文可以拆解出 CLI 拼装的层次实测正文均以\n转义存放在 JSON 字符串中身份声明You are an AI assistant using Copilot SDK in VS Code. You help users with software engineering tasks. When asked about your identity, you must state that you are an AI assistant using Copilot SDK in VS Code.code_change_instructions代码变更守则细分rules_for_code_changes外科手术式精准修改、不修与任务无关的既有问题、保持类型安全避免as any、DRY 优先复用、收紧错误处理禁止宽泛 catch 与静默失败等、linting_building_testing只跑已存在的 linter/构建/测试、优先最小目标化命令、using_ecosystem_tools、style。tips_and_tricks回合驱动建议先反思命令输出再继续、任务结束清理临时文件、不确定时用ask_user澄清、不主动创建规划类 markdown。environment_limitationsprohibited_actions非沙箱环境声明与安全红线不向第三方泄露敏感数据、不提交密钥、拒绝生成侵权内容并明确要求不得泄露/讨论指令本身。environment_context环境上下文块注入Current working directory: ${workdir}、Git repository root、Operating System: ${os}、Available tools: ${available_tools}。tools使用指南以可读文本指导各工具用法例如 bash 的新进程语义、view20KB 截断与分段读取建议等。这一节与结构化tools数组并存属于“教模型怎么用工具”的元指令层。custom_instruction${repository_instructions}/custom_instruction仓库指令注入位。正文中该值为占位符——注意快照刻意保留标签与占位符用于断言“仓库指令确实被注入了、注入了几份、位于提示词的哪个位置”同时避免AGENTS.md的每次改动都重写所有基线。system_notifications系统通知格式说明指导模型如何处理后台任务完成等运行时消息。宿主侧也有贡献README 与源码说明提示词并非全由 CLI 独裁。宿主自己的系统消息组装resolveSystemMessageConfig位于 node/copilot/prompts/promptRegistry.ts会合成若干段落这些段落会原样落入该提示词从而被基线端到端覆盖。这也解释了为何此类快照的测试归属是“宿主测试目录”而非 CLI 仓库。需要认清覆盖边界宿主中受根配置门控的“按模型贡献者”不会出现在 E2E 快照里——因为 E2E harness 没有设置根配置的接缝这部分逻辑由 test/node/agentHostPromptRegistry.test.ts 之外的单测覆盖。归一化让快照在任意机器上逐字节一致如果快照直接存原始请求体任何一次运行都会因机器环境不同而失败。因此 copilotPromptsE2E.integrationTest.ts 中的normalizeVolatile在序列化前做了一组有序的字符串替换把“两次正确运行间必然不同”的值换成带标签的占位符替换对象占位符说明session-state/前缀 UUID${session_id}保留前缀形状变化仍会失败current_datetime…/current_datetime内容${datetime}时钟正文所见即此类* Operating System: …行${os}环境探测结果* Available tools: …行${available_tools}PATH 上的工具集平台包管理器提示行${platform_packages}bash 工具描述里因平台而异的安装提示custom_instruction…/custom_instruction之间${repository_instructions}注入的仓库指令(N models available)的 N${model_count}目录规模Available models:列表块${model_catalog}完整模型目录其余任意 UUID${uuid}兜底置于末尾以免吞掉上面的标签每处替换都保留其外围标签或包装结构所以这些行只是内容被占位一旦这些行的形状改变或消失断言依然会失败。测试对归一化本身也有单测覆盖Copilot prompt snapshot formatting套件验证了空 system/空 tools/空 messages 会被形状守卫拒绝carried no system prompt、carried no tool definitions、carried no turn messages、turn message was empty以及含易变值的 body 能原地归一化输出。# 运行完整确定性套件默认重放无 token、无网络 npm run test-agent-host-e2e # 仅跑 Copilot prompts 提示词快照测试 ./scripts/test-integration.sh --run \ src/vs/platform/agentHost/test/node/e2e/providers/copilotPromptsE2E.integrationTest.ts四种运行模式的语义详见 e2e README 的 TL;DR模式环境变量行为回放默认无只回放已提交 fixture严格缓存未命中即失败绝不静默触达真实 CAPI仅更新 AHP 快照AGENT_HOST_UPDATE_AHP_SNAPSHOTS1免 token 回放 LLM fixture原地重写 AHP 语义快照全部更新AGENT_HOST_UPDATE_SNAPSHOTS1同时重写 AHP 快照与 LLM fixture需GITHUB_TOKEN或gh auth token仅重录 LLMAGENT_HOST_REPLAY_RECORD1旧版聚焦模式只针对真实 CAPI 重录归一化 fixture新增一个模型的完整清单要让一个新模型拥有自己的提示词基线README 与测试注释给出了明确的三个必要条件出现在harness/capiStubs.ts的桩模型目录中。模型若不在/models桩响应里会在 CLI 构造请求前就被拒绝测试只会得到“没有捕获到请求体”的失败。在captures/目录下提交对应 fixturecopilotcli-slugified-test-title.yaml——重放的回合仍需要被应答。fixture 方言必须与模型的桩端点匹配/responses用dialect: responses/v1/messages用dialect: anthropic。加入SNAPSHOT_MODELS数组并提交本.prompt.md基线。反向也成立新模型不会“自动出现”。快照体系不派生自真实/models目录一个刚发布的模型只有在维护者主动添加时才会被钉住即便加了桩目录条目也不会触发套件失败因为 CLI 内联的模型列表是被刻意归一化的。README 还点名了gpt-4.1与grok-code-fast-1缺席的技术原因这两个模型在重放下 CLI 根本不会发出模型请求无请求可钉。基线的边界、局限与解读刻意不钉的东西session id、时钟、环境探测、注入的仓库指令全文、模型目录。前两者是运行差异后两者虽跨机器稳定、可被钉住但代价会落到错误的文件上——给AGENTS.md追加一行就会重写所有基线、让无关文档改动弄红 CI因此保留标签与占位符是更聪明的取舍。请求元数据不在范围内快照只覆盖请求体 body不覆盖 HTTP 头等外围元数据。哪些变更会导致 diffSDK bump 改变 CLI 行为、宿主改变交给 CLI 的内容历史保留、注入上下文前导、附件 marshalling。刻意排除的是仓库指令文件的编辑。遇到model request mismatch时正确动作是判断新请求是否正确、然后重录 fixture绝不手工改 request 块来平息失败。录制为何不产基线录制会为模型目录与实验分配触达真实 CAPI二者都可能让提示词移动产生仓库不拥有的基线漂移。所以提示词快照“只回放、不录播”。从这份gpt-5.1-codex-mini.prompt.md出发你可以顺藤摸瓜读懂整个 Agent Host E2E 的验证哲学把“不可直接观察的 CLI 产物”变成“可审阅、可回归、可归因的仓库资产”让每一次提示词漂移都能被精确点名到引入它的模型族与变更面。【免费下载链接】vscodeVisual Studio Code项目地址: https://gitcode.com/GitHub_Trending/vscode6/vscode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表