Roo Code 3.10.1 兼容性补丁深度解析:建议回复(Suggested Responses)与自定义系统提示的共存方案
【免费下载链接】Roo-CodeRoo Code gives you a whole dev team of AI agents in your code editor.项目地址: https://gitcode.com/GitHub_Trending/ro/Roo-Code
Roo Code 3.10.1(发布于 2025-03-20)是一个聚焦兼容性的补丁版本,核心改动只有一条:将"建议回复"(Suggested Responses)从强制行为调整为可选行为,以消除其与用户自定义系统提示之间的冲突。本文以该补丁为主体,结合 3.10.0 引入的 Suggested Responses 功能文档、ask_followup_question工具的底层源码与 Webview 前端实现,完整讲解该功能的交互方式、参数契约、冲突成因与修复原理,帮助你理解在自定义模式下如何正确配置与使用这一能力。
版本背景:一个功能,两个版本
- 3.10.0(同日发布):正式引入Suggested Responses——当 Roo 需要向你提问澄清时,会在问题下方直接给出若干条预置答案按钮,点击即可快速回复,免去手动输入(功能由社区贡献者 samhvw8 提出)。
- 3.10.1:随后的补丁版本,将建议回复改为可选,防止它与被覆盖(override)的系统提示相互冲突,确保自定义配置的兼容性。
对应变更记录见 CHANGELOG.md(## [3.10.1] - 2025-03-20:Make the suggested responses optional to not break overridden system prompts),以及 v3.10.0 更新日志 中对该功能的原始描述。
官方功能文档位于 apps/docs/docs/features/suggested-responses.md,本文后续将围绕它与源码交叉印证。
Suggested Responses 是什么:一句话问答交互链路
Roo 在执行任务过程中如果需要补充信息,会调用ask_followup_question工具向你提问。为了让回复更快速,Roo 通常会在问题下方附带若干条建议答案,以可点击按钮的形式展示在聊天界面中。
完整链路如下:
- 提问出现:Roo 调用
ask_followup_question工具,携带question(问题文本)与follow_up(建议答案列表)。 - 建议展示:如果 Roo 提供了建议,它们会以按钮形式渲染在问题下方。
- 用户交互:你可以通过点击、快捷键或先编辑再发送三种方式回复。
这张图展示了提问与建议按钮并排出现的典型界面:
工具参数契约:follow_up 的 schema 约束
建议回复的数据源头,是ask_followup_question工具的 JSON Schema 定义,位于 src/core/prompts/tools/native-tools/ask_followup_question.ts。该定义明确约束了模型输出格式:
| 字段 | 类型 | 约束与说明 |
|---|---|---|
question | string | 必填。清晰、具体的问题,描述缺失的信息 |
follow_up | array | 必填。2–4 条建议答案,必须是完整、可执行的答案,不能包含占位符;可选携带mode字段用于切换模式(如code、architect) |
follow_up[].text | string | 用户可直接选择的建议答案文本 |
follow_up[].mode | string | null | 可选。选择该建议后要切换到的模式 slug |
Schema 中还声明了follow_up条数上下限(minItems: 1、maxItems: 4),并启用了strict: true与additionalProperties: false,即模型不能输出约定之外的字段。
工具文档原文见 apps/docs/docs/advanced-usage/available-tools/ask-followup-question.md。
源码中的格式转换
当模型返回该工具调用后,由 src/core/tools/AskFollowupQuestionTool.ts 执行。其核心逻辑如下:
- 校验
question与follow_up是否缺失,缺失则记录missing param错误并计数(recordMissingParamError); - 将模型返回的
{ text, mode }结构转换为任务层约定的{ answer, mode }结构:
const follow_up_json = { question, suggest: follow_up.map((s) => ({ answer: s.text, mode: s.mode })), }- 随后通过
task.ask("followup", JSON.stringify(follow_up_json), false)把问题与建议一并交给 UI 层展示,等待用户输入。
这种text/mode → answer/mode的映射,最终对应packages/types/src/followup.ts中定义的FollowUpData与SuggestionItem接口(并配套 zod schemasuggestionItemSchema、followUpDataSchema),是前后端传递建议回复的统一数据契约。
三种交互方式:选择、快捷键与编辑后发送
根据 suggested-responses 功能文档,用户与建议按钮有四种交互路径(其中编辑前发送包含两种触发方式):
1. 直接点击选择
- 操作:直接点击包含目标答案的按钮。
- 效果:所选答案会立即作为回复发回给 Roo,这是建议完全符合意图时最快的回复方式。
2. 键盘快捷键
- 操作:使用
roo.acceptInput命令对应的快捷键。 - 效果:自动选中第一条(主建议)按钮。
- 配置:具体快捷键设置见 键盘快捷键文档。
3. 编辑后再发送(Shift + 点击)
- 操作:按住
Shift再点击建议按钮。 - 效果:建议文本被复制到聊天输入框,你可以修改后按 Enter 发送自定义回复。适合"答案接近但需要微调"的场景。
4. 编辑后再发送(悬停铅笔图标)
- 操作:将鼠标悬停在建议按钮上,点击出现的铅笔/复制图标(等价于 Shift + 点击)。
- 效果:同样把建议文本填入输入框供编辑。
下图展示了点击建议按钮后文本被复制到输入框、等待编辑的场景:
前端渲染与自动批准倒计时
建议按钮的 UI 实现在 webview-ui/src/components/chat/FollowUpSuggest.tsx,其中值得注意的细节:
- 点击按钮时,如果事件带
shiftKey,组件不会标记"已选择",而是交由父组件将文本复制到输入框(onSuggestionClick); - 当开启了自动批准且
alwaysAllowFollowupQuestions生效时,第一条建议按钮下方会显示倒计时计时器(默认超时 60 秒,可通过followupAutoApproveTimeoutMs配置),倒计时归零后自动批准该建议;选择任意建议或点击编辑图标会取消该倒计时(onCancelAutoApproval),避免视觉倒计时与实际超时之间的竞态; - 每条带
mode的建议按钮右下角会渲染一个模式切换角标(如→ code)。
兼容性修复的原理:覆盖系统提示为何会与建议回复冲突
3.10.1 的改动目标非常明确——"防止建议回复与覆盖后的系统提示冲突"。要理解这一点,需要先看默认系统提示是如何引导模型提供建议答案的。
在 src/core/prompts/tests/snapshots/system-prompt/consistent-system-prompt.snap 等快照中可以找到默认提示中的明确指引:
"When you ask a question, provide the user with 2-4 suggested answers based on your question so they don't need to do so much typing..."
也就是说,默认情况下,系统提示会强制要求 Roo 在提问时附带 2–4 条建议答案。这套引导与ask_followup_question工具 schema 的follow_up字段是配套设计的。
而自定义系统提示来自哪里?Roo Code 的自定义模式(Custom Modes)机制允许用户完全定义自己的模式,详见 自定义模式文档。其中两个关键字段会直接影响系统提示内容:
| 字段 | 作用 |
|---|---|
roleDefinition | 定义模式的核心身份与专长,会被放置在系统提示的开头 |
customInstructions | 附加的行为准则,会被添加到系统提示的末尾 |
当用户通过自定义模式覆盖(override)系统提示时,原本"提问必须附带 2–4 条建议"的引导可能被替换或移除。此时若功能仍强制要求建议回复,就可能出现两种情况:模型被互相矛盾的指令干扰而输出不符合 schema 的建议列表;或模型根本不生成follow_up,导致工具调用触发缺参错误。
3.10.1 的修复方式,按发布说明所述,是将建议回复调整为可选(Made suggested responses optional to prevent conflicts with overridden system prompts):功能保留并默认可用,但不再作为不可绕过的硬性要求,从而保证自定义配置下的兼容性。对于沿用默认系统提示的用户,交互体验完全不受影响;对于深度定制系统提示的用户,则获得了更大的自由度——可以让自己的模式决定是否以及如何提供建议答案。
从源码结构看,这一"可选化"发生在提示词引导层面,而非工具 schema 层面:当前 ask_followup_question.ts 的 schema 中follow_up仍是必填字段(required: ["question", "follow_up"]),说明工具本身的参数契约未变,变化的只是系统提示中对该字段的强制程度。
验证与追溯:如何在当前仓库确认这条变更
如果你想在仓库中追溯 3.10.1 的这条变更,可以按以下路径核对:
- CHANGELOG 入口:CHANGELOG.md 的
## [3.10.1] - 2025-03-20条目; - 发布说明原文:apps/docs/docs/update-notes/v3.10.1.md(本文章所依据的主文档,front matter 中的 description 同样写明:"makes suggested responses optional to prevent conflicts with overridden system prompts");
- 功能背景:v3.10.0 更新日志 中 "Suggested Responses" 的功能引入说明;
- 功能使用文档:apps/docs/docs/features/suggested-responses.md;
- 工具定义与执行:src/core/prompts/tools/native-tools/ask_followup_question.ts 与 src/core/tools/AskFollowupQuestionTool.ts;
- 数据契约:packages/types/src/followup.ts;
- 前端组件:webview-ui/src/components/chat/FollowUpSuggest.tsx(含自动批准倒计时逻辑);
- 系统提示快照:src/core/prompts/tests/snapshots/system-prompt/consistent-system-prompt.snap(可看到"提供 2–4 条建议答案"的默认引导)。
小结
Roo Code 3.10.1 的这次补丁,本质上是在功能完备性与用户可定制性之间做的一次平衡:
- 对普通用户:Suggested Responses 一如既往地可用,点击、快捷键(
roo.acceptInput)、Shift+点击编辑三种交互方式保持不变; - 对自定义模式用户:覆盖系统提示后不再被迫遵循"必须附带建议答案"的默认引导,避免指令冲突导致的异常输出;
- 对二次开发者:工具参数契约(
question+ 2–4 条follow_up)、前后端数据契约(text/mode → answer/mode)与 UI 渲染(含自动批准倒计时)在源码层面均有清晰实现可循。
如果你正在使用自定义模式且希望保留建议回复能力,可以在customInstructions中显式加入"提问时附带 2–4 条建议答案"的引导;如果希望完全自主控制问答流程,则无需任何额外配置——3.10.1 之后,建议回复已成为一项可选、可继承、可定制的优雅能力。
【免费下载链接】Roo-CodeRoo Code gives you a whole dev team of AI agents in your code editor.项目地址: https://gitcode.com/GitHub_Trending/ro/Roo-Code
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考