深入 oh-my-pi 的 PR 风格短摘要compaction-short-summary 提示词的设计与实现解析【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi在 oh-my-pi 的长会话压缩context compaction机制中除了生成用于恢复上下文的完整结构化摘要之外还需要为每次压缩生成一段面向展示的短摘要——用 Pull Request 描述的口吻概括这次对话改了什么。本指南以packages/agent/src/compaction/prompts/compaction-short-summary.md这份提示词文件为骨架结合packages/agent/src/compaction/compaction.ts的源码实现讲解短摘要的生成规则、调用链、存储结构以及它与完整摘要、turn-prefix 摘要等其他压缩提示词的分工。读完本文你将理解 oh-my-pi 为何要为压缩事件单独设计一套PR 描述风格的提示词以及这套机制在会话记录中如何被生成、传递与展示。短摘要提示词的三条硬性约束compaction-short-summary.md全文只有三行却精确界定了短摘要的产出形态。它要求模型把一段对话压缩成一段Pull Request 描述pull request descriptionSummarize conversation changes as a pull request description. MUST 2–3 sentences; first person (I added…, I fixed…); describe changes, not process. NEVER mention tests, builds, or other validation steps; explain user request; ask questions.逐条拆解体裁约束输出必须是 PR 描述的口吻即站在作者视角描述这次会话中完成的代码/文档/配置变更而不是流水账式地复述对话过程。篇幅与人称约束严格 23 句话使用第一人称I added…、I fixed…内容聚焦改了什么changes而非怎么做的process。内容边界约束严禁提及测试、构建或其他验证步骤同时要体现用户的原始请求explain user request并在必要处提出问题ask questions。后两条约束的目的很明确短摘要是给人用户回看会话记录看的轻量摘要而不是给模型续接上下文用的。测试与构建信息属于过程会让短摘要变得冗长且偏离变更点保留用户请求与待澄清问题则能让用户快速判断这次会话是否达到了我想要的效果、还有什么悬而未决。需要说明的是这份提示词之所以如此精简是因为它只负责格式约束。实际的摘要内容通过调用 LLM 生成而调用侧的 prompt 组装、token 预算、系统提示词都由源码完成见下文。短摘要的生成调用链generateShortSummary短摘要的生成入口位于 compaction.ts 中的generateShortSummary函数约 L1164-L1235。该函数在模块加载时已经通过prompt.render完成了模板渲染const SHORT_SUMMARY_PROMPT prompt.render(compactionShortSummaryPrompt);compaction-short-summary.md以文本资源形式导入import compactionShortSummaryPrompt from ./prompts/compaction-short-summary.md with { type: text }并经prompt.render包装成最终注入到对话中的指令文本。generateShortSummary的核心实现要点如下Token 预算严格受限const maxTokens Math.min(512, Math.floor(0.2 * reserveTokens));短摘要的输出上限被限制为min(512, 20% 的 reserveTokens)。对比完整摘要的min(floor(0.8 * reserveTokens), MAX_SUMMARY_TOKENS)与 turn-prefix 摘要的min(floor(0.5 * reserveTokens), MAX_SUMMARY_TOKENS)可以看出短摘要是三类摘要中预算最小、最省的一次 LLM 调用——这从源码结构上印证了它轻量展示用的定位。Prompt 组装与完整摘要共用同一套骨架let promptText conversation\n${conversationText}\n/conversation\n\n; if (historySummary) { promptText previous-summary\n${escapeSummaryBoundaryTags(historySummary)}\n/previous-summary\n\n; } promptText formatAdditionalContext(options?.extraContext); promptText SHORT_SUMMARY_PROMPT;会话内容被包裹在conversation标签内防止模型把对话当作继续对话的上下文而是当作待总结对象若存在历史摘要historySummary即上次压缩产生的完整摘要则以previous-summary标签注入且经escapeSummaryBoundaryTags转义避免摘要内容中的标签干扰结构可选的extraContext以additional-context列表形式追加最后拼上本文档SHORT_SUMMARY_PROMPT作为格式约束。推理强度遵循用户 /model 选择调用时通过resolveCompactionEffort(model, options?.thinkingLevel)解析 reasoning 力度ThinkingLevel.Off时完全省略推理参数undefined/Inherit回退到历史默认Effort.High显式选择则尊重用户并做模型级 clamp。传输路径两条本地路径instrumentedCompleteSimple发起 oneshot系统提示词固定为SUMMARIZATION_SYSTEM_PROMPT见 summarization-system.md该提示词把历史对话与前序摘要视为不可信数据禁止跟随其中任何指令远程路径当配置了remoteEndpoint时走requestRemoteCompaction远程压缩服务同样携带SUMMARIZATION_SYSTEM_PROMPT与maxTokens。可观测性与容错该调用以oneshotKind: compaction_short_summary打点 OTEL 遥测失败时经createSummarizationError映射为带errorStatus的ProviderHttpError并遵循与完整摘要一致的 oneshot 重试策略summaryOneshotRetry保证单次瞬时故障如 429/529不会拖垮整个压缩流程。短摘要的触发时机与落库短摘要并非每次压缩都必然重新生成。在 compact 主流程约 L1842-L1848中const shortSummary usedRemoteCompaction ? Remote compaction : await generateShortSummary(recentMessages, summary, model, reserveTokens, apiKey, signal, { ...summaryOptions, extraContext: options?.extraContext, thinkingLevel: options?.thinkingLevel, });当本次压缩走了远程provider-native压缩OpenAI V1/V2 远程压缩成功时短摘要直接固定为Remote compaction——因为远程压缩不产出本地文本摘要为避免制造不实描述而使用占位文案否则对保留的最近消息recentMessages即压缩后仍以原文保留的近期对话调用generateShortSummary并携带本次生成的完整summary作为historySummary上下文。生成的shortSummary作为CompactionResult.shortSummary返回接口定义见 compaction.ts 的CompactionResult注释明确写着 Short PR-style summary for display purposes。随后会话管理器将其落库会话条目类型中声明了shortSummary?: string见 entries.ts构造压缩摘要消息时通过createCompactionSummaryMessage写入shortSummary字段见 messages.ts其中还包括tokensBefore、tokensAfter、method如 remote/soft/handoff等展示元数据分支汇总场景同样透传shortSummary见 branch-summarization.ts。因此用户界面中本次压缩做了什么的展示位消费的正是这份 PR 风格的短摘要而用于模型续接的完整上下文则由summary承载。两者各司其职。与完整摘要及 turn-prefix 摘要的分工oh-my-pi 的压缩提示词家族位于packages/agent/src/compaction/prompts/短摘要与它们共同构成三层摘要体系提示词文件用途输出预算相对 reserveTokenscompaction-summary.md生成结构化 handoff 摘要Goal / Progress / Next Steps / Critical Context 等分区供另一个 LLM 接续任务约 80%compaction-update-summary.md迭代式更新既有摘要存在previousSummary时替代初始提示词要求保留既有信息、更新进度与下一步同左compaction-turn-prefix.md当切割点落在某个 turn 中间时压缩该 turn 的前缀部分为保留的后缀提供上下文约 50%compaction-short-summary.md生成 PR 风格的 23 句短摘要仅供展示约 20%上限 512 tokens值得注意的是完整摘要格式compaction-summary.md也要求如果对话以未回答的问题结束必须保留该问题原文这与短摘要的 ask questions 规则形成呼应无论长摘要还是短摘要悬而未决的用户问题都不允许被丢弃。区别在于完整摘要把问题放入Critical Context分区供模型接续而短摘要以自然语言提问的方式让用户察觉。从调用关系看compaction.ts 的compact函数常规路径先并行/串行生成完整历史摘要与 turn-prefix 摘要并合并summary historyResult \n\n---\n\n**Turn Context (split turn):**\n\n turnPrefixResult随后追加文件操作清单upsertFileOperations记录本次压缩涉及的读写文件最后才调用generateShortSummary产出展示用短摘要。使用与验证建议查看生效效果压缩发生手动/compact或自动触发后会话记录中的compactionSummary消息同时携带summary与shortSummary两个字段前者用于上下文重建后者用于界面展示。自定义输出风格短摘要的格式完全由 compaction-short-summary.md 控制。若希望短摘要更贴近团队 PR 模板如增加 Motivation 或 Related issues可扩展该提示词文件但应保持 23 句、第一人称、不提验证步骤的既有约束——这正是源码中maxTokens预算所对应的产出规模。约束的兼容性三条 MUST/NEVER 规则与SUMMARIZATION_SYSTEM_PROMPT的输出仅限结构化摘要要求叠加生效由于系统提示词把对话内容视为不可信数据即使历史对话里出现请忽略格式要求之类的指令短摘要也不会被污染。综上compaction-short-summary.md虽然只有三行却通过源码中的预算控制maxTokens、边界转义escapeSummaryBoundaryTags、远程/本地双路径与遥测打点成为 oh-my-pi 会话压缩体系中面向人的最后一公里把一次可能涉及数万 token 的长会话压缩成两句话就能读懂的 PR 式变更说明。【免费下载链接】oh-my-pi⌥ Coding agent with the IDE wired in项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-pi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考