资讯动态

Positron 源码解析:Agent Host 如何用确定性回放快照钉住 Copilot CLI 的模型请求体(gpt-5 基线)

发布时间:2026/10/16 2:11:58 来源:尧图企业网站定制
开发工具代码编辑器数据科学【免费下载链接】positronPositron, a next-generation data science IDE项目地址https://gitcode.com/gh_mirrors/po/positron点击查看免费下载本篇技术指南以 Agent_Host_E2E___Copilot_prompts_gpt-5.prompt.md 这份快照基线为主体讲解 PositronVS Code fork中 Agent Host 测试体系如何在不消耗 token、不发真实网络请求的前提下把捆绑的github/copilotCLI 实际发送给 CAPI 的完整模型请求体钉住成可提交、可审查、可 diff 的基线文件。读完本文你将理解该快照的每个字段含义、它背后的 record/replay 管线、易变值归一化规则以及如何运行、更新和新增一条模型基线。一、这份文件是什么一份组装后模型请求体的断言基线Agent_Host_E2E___Copilot_prompts_gpt-5.prompt.md位于providers/__snapshots__/目录文件名由测试全名fullTitleAgent Host E2E — Copilot prompts gpt-5经sanitizeName规则非[a-z0-9_-]字符统一替换为_生成命名逻辑见 ahpSnapshot.ts 的snapshotPathForTest快照永远落在测试源码旁边的__snapshots__目录即使测试是从out/编译产物运行的。它不是一篇给人阅读的文档而是一份可执行基线baseline普通测试运行时测试会把本次真实观测到的请求体与这份文件逐字节比对CRLF 归一化后不一致就写一个.actual兄弟文件并让测试失败。其内容是一段被 json 围栏包裹的完整 JSON——正是 Copilot CLI 为 gpt-5 模型组装并序列化到线上的请求体。它钉住的范围覆盖了 README 中 Prompt snapshots 一节所说的全部要素组装完成的系统提示词instructionsResponses 方言Anthropic Messages 方言则叫system完整工具定义数组tools轮次消息messages/input以及 CLI 注入的上下文current_datetime等采样参数reasoning/text.verbosity/store/stream/include/parallel_tool_calls——这些参数过去被渲染后的子集漏掉现在全部被钉住。二、为什么要钉住请求体prompt 是 CLI 的产物不是主机的产物测试文件头注释点明了根本动机见 copilotPromptsE2E.integrationTest.tsThe prompt is compiled into thegithub/copilotbinary and only becomes observable when the CLI serializes it onto the wire.也就是说系统提示词、工具定义、采样参数的最终形态是被编译进github/copilot原生二进制的源码里读不到只有当 CLI 把它序列化到 HTTP 线上时才可见。因此测试只能从一次真实或回放轮次中把它读出来。这里有一个关键的设计取舍——只有回放方向是确定性的回放replay用已提交的 LLM fixture 驱动整个轮次模型响应是假的其余真实服务器、真实 SDK/CLI 子进程、真实工具执行、真实 AHP 协议都是真的零 token、零网络录制record会访问真实 CAPI 拿模型目录和实验分配两者都可能因为本仓库不拥有的原因移动 prompt——所以录制运行永远不产生基线assertPromptSnapshot在RECORDING模式下直接返回。三、快照管线从回放到落盘的完整链路1. 模型 fixture 回放每个模型对应一份 LLM fixture例如 copilotcli-gpt-5.yamlversion: 1 dialect: responses exchanges: - request: model: gpt-5 system: ${system} messages: - role: user content: Say exactly ok response: content: ok stopReason: end_turndialect: responses决定端点POST /responses与 SSE 再生器匹配是按(method, path)的序列序数进行的——第 N 次请求回放第 N 条记录响应不做请求体匹配因此回放严格且确定性详见 capiReplayProxy.ts。2. 驱动一次显式选择模型的轮次driveTurnWithModel测试文件 L168 起通过TestProtocolClient派发ChatTurnStarted消息为Say exactly ok并显式指定model: { id: model }——每个模型都被显式选择因为不选择模型会被刻意排除CLI 会按自己的排序从桩目录里挑模型基线就会变成 fixture 的属性而非产品属性。随后循环等待ChatTurnComplete遇到ChatToolCallReady就用ChatToolCallConfirmed自动批准。3. 从代理读取线上请求体代理CapiReplayProxy在每次模型端点请求时把归一化后的请求体压入_observedModelRequestBodiescapiReplayProxy.ts测试经lease.observedModelRequestBodies取到agentHostE2ETestHarness.ts。测试取.at(-1)——取最后一条是为了在 CLI 插入 preflight 请求时仍然拿到真正的模型请求若拿不到则直接失败the turn never reached the model。4. 形状守卫与易变值归一化formatPromptSnapshotL252 起在序列化前做四重守卫防止空洞捕获变成一份看似合理的基线assert.ok(system.length 0, the model request carried no system prompt — the wire shape likely changed); assert.ok(Array.isArray(tools) tools.length 0, ...no tool definitions...); assert.ok(messages.length 0, ...no turn messages...); assert.ok(!emptyMessage, ...turn message was empty...);随后用normalizeVolatileValues递归地把所有易变值替换为占位符详见第五节再用JSON.stringify(…, null, 2)美化输出。注意是美化而非逐字节还原CLI 在线上把请求压缩成一行快照只把结构展开字符串内部的换行仍保持 JSON 转义——所以系统提示词或工具描述中的一句话改动会以整行重写的形式出现在 diff 里。5. 断言或更新assertPromptSnapshotL224 起三分支录制模式 → 直接返回不产生基线AGENT_HOST_UPDATE_AHP_SNAPSHOTS1→ 直接写文件接受新基线普通模式 → 若基线不存在则主动抛错因为底层assertSnapshot会自动创建缺失文件并放行那会让一个没人写过、没人审过的模型绿化通过详见 KNOWN_ISSUES.md存在则用assertSnapshot比对。四、gpt-5 快照逐字段拆解以下按该基线的实际结构共 918 行逐段说明。model与方言{ model: gpt-5, instructions: You are an AI assistant using Copilot SDK in VS Code. ... }Responses 方言把系统提示词放在instructions轮次放在inputAnthropic Messages 方言则是systemmessagesformatPromptSnapshot的IWireRequest接口对两种方言都做了兼容见 L241-L250。gpt-5 在capiStubs.ts的桩模型目录中对应supportedEndpoints: [/responses, ws:/responses]capiStubs.ts。instructions系统提示词的分层结构这是基线的绝对主体能清晰看到 CLI 组装提示词的层次身份声明You are an AI assistant using Copilot SDK in VS Code. You help users with software engineering tasks.code_change_instructions含rules_for_code_changes精确、完整、外科手术式的改动原则、linting_building_testing用最小命令覆盖改动、using_ecosystem_tools优先包管理器/脚手架/重构工具、style只在需要澄清处注释。tips_and_tricks执行前先反思命令输出、任务结束清理临时文件、已有文件用 view/edit 而非 create、拿不准时用 ask_user 澄清、不主动创建 markdown 规划文件。environment_limitations与prohibited_actions非沙箱环境声明禁止向第三方泄露敏感数据、禁止把密钥提交进源码、拒绝生成侵权内容且不得讨论这些规则本身。environment_context运行环境探测其中* Current working directory: ${workdir}、* Operating System: ${os}、* Available tools: ${available_tools}均已占位符化。tools使用指南逐工具给出使用要点bash 的初始等待与后台模式、view 的并行读取、edit 的顺序应用、skill 的调用约束、ask_user 的多选题格式、sql 的会话表约定、task 的委派边界等。custom_instruction${repository_instructions}/custom_instruction仓库指令注入位本基线中出现两处。它承载.github/copilot-instructions.md与AGENTS.md等内容但内容被整体归一化只保留注入了、注入了几块、插在哪这个形状——这是刻意为之详见第六节。system_notifications/file_folder_and_symbol_links/session_context/git_commit_trailer/tool_calling/task_completion运行时行为约束段。input用户消息与时间戳归一化input: [ { role: user, content: [ { type: input_text, text: current_datetime${datetime}/current_datetime\n\nSay exactly \ok\ } ], type: message } ]CLI 会在用户消息前注入当前时间current_datetime测试把它归一化为${datetime}以保证跨运行稳定消息内容则是测试驱动用的最小提示Say exactly ok对应 fixture 中的响应ok。tools完整工具定义数组tools数组从第 17 行一直延伸到第 906 行包含了 CLI 向模型暴露的完整工具面bash含参数模式、初始等待、后台模式等 JSON Schema、view/view_range、edit、skill、ask_user、sql、grepripgrep 语义、glob、task委派专用 agent、addComment/listComments/replyToComment/deleteComments/resolveComments/viewUnreviewedComments代码评审工具族、list_sessions/get_current_session/create_session/send_message/get_session_context/delete_session会话管理工具族。其中 Task 工具的 schema 会内联整个/models目录已被归一化为(${model_count} models available)与${model_catalog}见下节。采样参数区基线的收尾第 907-917 行钉住了响应式 API 的采样参数reasoning: { effort: medium, summary: auto }, store: false, stream: true, include: [ reasoning.encrypted_content ], parallel_tool_calls: true对比同目录的 gpt-5.6-sol 基线可以看到该家族还带text: { verbosity: medium }——采样参数因模型家族而异这正是每个家族一份基线、未来按家族归因分歧的原因SNAPSHOT_MODELS里 19 个模型条目注释见测试文件 L60-L80。五、易变值归一化规则让基线跨机器、跨运行稳定normalizeVolatile测试文件 L367-L380按顺序执行以下替换这是理解快照里所有${...}占位符的钥匙匹配模式替换为目的\r\n\n跨平台换行归一化session-state/uuidsession-state/${session_id}会话目录名current_datetime.../current_datetimecurrent_datetime${datetime}/current_datetime注入的时钟* Operating System: ...* Operating System: ${os}环境探测* Available tools: ...* Available tools: ${available_tools}PATH 探测You can install ... with the ... commands.* You can install ${platform_packages}.平台包管理器提示custom_instruction.../custom_instructioncustom_instruction${repository_instructions}/custom_instruction仓库指令(N models available)(${model_count} models available)模型目录计数Available models:及其列表$1${model_catalog}模型目录列表其余所有 UUID${uuid}运行时标识每个替换都保留标签或包裹结构——例如(custom_instruction...的围栏还在——所以这些行的形状发生变化或消失时测试依然会失败只有内容被归一化。此外快照正文里的$HOME、临时目录等由snapshotPathForTest所在 harness 的 AHP 快照归一化另行处理见 ahpSnapshot.ts 的normalizeSnapshotText。六、如何运行、更新与新增模型运行与更新普通运行是只读的确定性回放、零 token完整跑一遍整个 Agent Host E2E 或单独跑本套件npm run test-agent-host-e2e ./scripts/test-integration.sh --run src/vs/platform/agentHost/test/node/e2e/providers/copilotPromptsE2E.integrationTest.ts接受新的 prompt 基线并审查 diff与 AHP 快照共用同一个环境变量AGENT_HOST_UPDATE_AHP_SNAPSHOTS1 ./scripts/test-integration.sh --run \ src/vs/platform/agentHost/test/node/e2e/providers/copilotPromptsE2E.integrationTest.ts若行为同时改变了 LLM 请求/响应序列则改用AGENT_HOST_UPDATE_SNAPSHOTS1会连 fixture 一起重录需要真实 token只重录 LLM fixture 用AGENT_HOST_REPLAY_RECORD1。新增一个模型的两个硬性约束README 与测试注释共同给出了两条约束模型必须出现在harness/capiStubs.ts的桩目录中——不在/models里的模型会在 CLI 构造请求前被拒绝测试拿不到请求体直接失败需要一份已提交的 fixturecaptures/copilotcli-slugified-test-title.yaml——回放的轮次也得有响应可答fixture 的 dialect 必须匹配模型在桩目录里的端点/responses用dialect: responses/v1/messages用dialect: anthropic。另外注意gpt-4.1与grok-code-fast-1被刻意排除CLI 在回放下对它们不发模型请求无法钉住。平台与仓库限制POSIX-onlyWindows 的提示词不是 POSIX 版的改名——CLI 运行时携带 PowerShell 专属段落heredoc 禁令、if ($?) { ... }依赖检查等且其中一段还受主机 PowerShell 探测门控无法跨平台稳定复现所以 Windows 上整套test.skipKNOWN_ISSUES.mdPositron 中套件被suite.skipPositron 的检出会发现的 agent-instruction 文件集与上游基线不同导致每个模型的 prompt 都差一个custom_instruction块由于 Positron 不拥有该捆绑 CLI 的 prompt选择跳过而非维护一套一改就碎的本地基线同一文件内的纯格式化测试Copilot prompt snapshot formatting仍照常运行。七、快照失效意味着什么diff 的语义一份基线出现 diff只有两个合法来源CLI 变了SDK bump或主机传给 CLI 的内容变了。反例也很明确编辑仓库指令AGENTS.md 等不会触发 diff——因为该内容被归一化为${repository_instructions}如果把它原样钉住给 AGENTS.md 追加一行就会重写全部 19 份基线让无关的文档改动炸掉 CI。同理模型目录也被归一化否则capiStubs.ts新增一个模型就会重写所有基线包括没人快照的模型。最后README 还指出主机自己的贡献也被覆盖到resolveSystemMessageConfigpromptRegistry.ts 附近组装的段落会原样落入本 prompt所以基线端到端覆盖了主机与 CLI 的拼接结果唯一覆盖不到的是被主机配置门控的逐模型贡献者E2E harness 没有设置 root config 的接缝这部分由单测agentHostPromptRegistry.test.ts兜底。一句话总结这份 gpt-5 快照是CLI 组装 prompt这一不可见产物的可见代理——通过回放一次确定性的真实轮次、从代理线上读出请求体、按规则归一化易变值后提交为基线让每一次 SDK 升级或主机 prompt 拼接改动都能以清晰的 diff 形式浮出水面同时做到零 token、零网络、跨机器可复现。赞分享开发工具代码编辑器数据科学【免费下载链接】positronPositron, a next-generation data science IDE项目地址https://gitcode.com/gh_mirrors/po/positron点击查看免费下载相关推荐Positron Agent Host E2E 提示词快照解析Copilot CLI 如何为 gpt-5-codex 组装完整模型请求体Positron Agent Host E2E 提示词快照解析Copilot CLI 如何为 gpt 5 codex 组装完整模型请求体 本文以 Positr开发工具代码编辑器数据科学Positron Agent Host 中 Copilot CLI 模型请求体快照claude-opus-4.5深度解析Positron Agent Host 中 Copilot CLI 模型请求体快照claude opus 4.5深度解析 本篇指南围绕 Positron 仓开发工具代码编辑器数据科学解构 gpt-5 的 Copilot 提示快照VS Code Agent Host E2E 如何用基线固定完整模型请求体解构 gpt 5 的 Copilot 提示快照VS Code Agent Host E2E 如何用基线固定完整模型请求体 在 VS Code 的 Agent开发工具代码编辑器前端桌面应用插件系统跨平台上一篇Ahk2Exe实战指南AutoHotkey脚本编译与EXE转换深度解析下一篇ESP-IDF 完整安装与环境搭建从零跑通 ESP32 开发环境创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑