提示词与实现原理深度解析)
Tabby 提交信息生成Commit Message Generation提示词与实现原理深度解析【免费下载链接】tabbySelf-hosted AI coding assistant项目地址: https://gitcode.com/GitHub_Trending/tab/tabby本篇技术指南以 Tabby Agent 仓库中的提示词模板 generate-commit-message.md 为主体结合 generateCommitMessage.ts、protocol.ts 与 default.ts 等源码完整讲解 Tabby 如何根据 Git diff 自动生成符合 Conventional Commits 规范的提交信息。读完本文你将掌握该提示词模板的每一行含义、底层完整调用链、相关可配置参数以及如何在 VSCode 客户端中触发这一能力。提示词模板提交信息生成的指令核心在 Tabby Agent 中所有基于 LLM 的功能都采用提示词即资产的设计提示词以独立 Markdown 文件的形式存放于 clients/tabby-agent/src/chat/prompts/ 目录并在 default.ts 中通过import直接引入为默认配置。generate-commit-message.md正是负责生成提交信息这一能力的提示词模板全文如下You are an AI coding assistant. You should generate a commit message based on the given diff. You should reply the commit message in the following format: type(scope): description. The type could be feat, fix, docs, refactor, style, test, build, ci, or chore. The scope is optional. For examples: - feat: add support for chat. - fix(ui): fix homepage links. The diff is: diff {{diff}}模板由四层构成每一层都服务于输出格式的强约束 1. **角色与任务定义**第一行将模型设定为 AI coding assistant任务是基于给定的 diff 生成提交信息避免模型在回答中夹带解释性文字 2. **输出格式约束**强制要求以 type(scope): description 这一固定形式输出杜绝自由发挥 3. **取值枚举与示例**列出 9 种合法的 type 取值说明 scope 可选并给出两个带/不带 scope 的示例属于典型的 few-shot 引导 4. **输入占位符**{{diff}} 是模板变量在运行时被真实 diff 内容替换后拼装成完整的 user 消息发送给模型。 ## 从模板变量到真实请求{{diff}} 的注入与长度控制 模板中的 {{diff}} 变量在 [generateCommitMessage.ts](https://link.gitcode.com/i/aaec3d1c22ff1d4f3baa098f559ad79b) 中被替换但替换前有一整套 diff 预处理逻辑其核心是**在 Prompt 长度限制下挑选最有价值的内容**。 配置项 maxDiffLength 的默认值为 3600见 [default.ts](https://link.gitcode.com/i/a410854fd8ae37df14f35f4e420b6960#L102-L107)它定义了送入提示词的 diff 最大字符数。处理流程如下 1. **按文件拆分 diff**若服务端返回的 diff 是单个字符串则用正则 diff.split(/\n(?diff)/) 按 diff 行切分为多个文件级片段 2. **贪心选取**遍历各片段只要 selectedDiff.length item.length maxDiffLength 就累加进最终选中的 diff 集合保证优先包含尽可能多的小文件 diff 3. **超限兜底**若单个片段本身就超过限制导致 selectedDiff 为空则直接截取前 maxDiffLength 个字符确保提示词中始终有可用内容。 从源码结构可以推断这一设计的目的是当仓库工作区改动文件很多、diff 总量远超模型上下文限制时优先保留更多文件的头部信息而不是只给模型一个被截断的大文件从而提升提交信息的覆盖面。 选定的 diff 随后通过 promptTemplate.replace({{diff}}, selectedDiff) 注入模板并作为单条 user 角色消息通过 tabbyApiClient.fetchChatStream 流式请求聊天接口。 ## 从 diff 到提交信息完整调用链 CommitMessageGenerator[generateCommitMessage.ts](https://link.gitcode.com/i/aaec3d1c22ff1d4f3baa098f559ad79b#L17-L24)是这一能力的服务端实现类其完整调用链为 text LSP 请求 tabby/chat/generateCommitMessage → CommitMessageGenerator.generateCommitMessage() → GitContextProvider.diff() // 先取 cached diff为空则回退 uncached → 拆分/筛选/截断 diffmaxDiffLength → promptTemplate.replace({{diff}}, selectedDiff) → tabbyApiClient.fetchChatStream() // 流式请求聊天接口 → parseChatResponse() // 解析流式响应 → responseMatcher 正则提取提交信息 → 返回 { commitMessage }几个关键实现细节值得注意功能可用性检查调用前先检查this.chat.isAvailable()若聊天功能不可用如未配置模型或服务未启动直接抛出ChatFeatureNotAvailableError互斥与取消生成期间若再次触发请求前一次请求会被MutexAbortError中止传入的CancellationToken取消也会联动中断底层流式请求空 diff 保护若缓存的 diff 为空则自动回退请求未缓存的工作区diff若两者都为空则返回null不发起任何模型请求。双通道 diff 获取GitProvider LSP 与本地命令回退CommitMessageGenerator并不直接运行git diff而是依赖GitContextProviderclients/tabby-agent/src/contextProviders/git/index.ts抽象出两条通道GitProvider LSP 通道当客户端如 VSCode在握手时声明支持tabby.gitProvider能力时Agent 通过tabby/git/diff这个 serverToClient 方向的自定义 LSP 请求委托编辑器客户端提供 diff。该协议定义在 protocol.ts参数GitDiffParams包含repository仓库根 URI与cached是否取暂存区 diff两个字段返回的GitDiffResult既可以是完整 diff 字符串也可以是按文件优先级排序的 diff 数组——后者正是为前文所述的分片筛选逻辑设计的本地命令回退通道若客户端不支持该能力GitContextProvider会构造GitCommandRunner在本地直接执行 git 命令获取 diff。在 generateCommitMessage.ts 中生成逻辑会优先请求暂存区stageddiff仅当暂存区为空时才回退到工作区 diff——这与提交信息通常针对已暂存改动的 Git 工作流语义保持一致。提交信息格式约束Conventional Commits 与响应解析模板强制要求输出type(scope): description格式这正是业界通用的 Conventional Commits 规范的核心形式。其中元素含义说明type提交类型模板限定为feat、fix、docs、refactor、style、test、build、ci、chore九种(scope)影响范围可选如fix(ui)表示 UI 模块的修复description变更描述简洁的一句话描述如fix homepage links模型的流式输出经parseChatResponse解析后还需要通过responseMatcher正则做最终提取。该正则定义于 default.ts逻辑上要求命中行以九种 type 之一开头可带 scope以此过滤掉模型可能输出的解释性前言或 Markdown 引用块未命中时则退化为直接使用解析后的完整响应并做trim()。配置项一览如何调整提交信息生成行为chat.generateCommitMessage相关配置集中在 default.ts全部存在默认值用户可按需覆盖配置项默认值作用maxDiffLength3600送入提示词的 diff 最大字符数超出部分按前文策略筛选或截断promptTemplategenerate-commit-message.md提示词模板可替换为自定义模板需保留{{diff}}占位符responseMatcher见 default.ts从模型响应中提取提交信息的正则表达式与之配套的还有chat.generateBranchNamemaxDiffLength同为3600说明 Agent 对基于 diff 生成命名类文本的功能采用了相同的长度控制策略。在 VSCode 客户端中触发CommitMessageGenerator通过connection.onRequest(GenerateCommitMessageRequest.type, ...)注册处理tabby/chat/generateCommitMessage这一 clientToServer 方向的 LSP 请求协议见 protocol.ts参数仅需仓库根 URI。在 VSCode 客户端中命令chat.generateCommitMessageclients/vscode/src/commands/index.ts实现了完整的交互体验若当前有选中仓库则直接使用否则列出工作区所有 Git 仓库供用户 QuickPick 选择无仓库时提示 No Git repositories found.调用this.client.chat.generateCommitMessage向 Agent 发起请求将返回的commitMessage填入inputBox的默认值用户确认后即可完成提交。小结Tabby 的提交信息生成能力是一个模板约束 长度预算 双通道 diff 正则提取的完整闭环提示词模板 generate-commit-message.md 负责约束输出格式generateCommitMessage.ts 负责 diff 预处理、流式请求与响应提取protocol.ts 定义了与客户端协作的 LSP 协议而maxDiffLength、responseMatcher等配置让用户可以在 default.ts 基础上定制行为。理解这条链路后你既可以原样使用默认提示词也可以替换promptTemplate定制团队内部的提交规范。【免费下载链接】tabbySelf-hosted AI coding assistant项目地址: https://gitcode.com/GitHub_Trending/tab/tabby创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考