news 2026/9/12 15:08:47

Roo Code 3.10.1 兼容性补丁深度解析:建议回复(Suggested Responses)与自定义系统提示的共存方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Roo Code 3.10.1 兼容性补丁深度解析:建议回复(Suggested Responses)与自定义系统提示的共存方案

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-20Make 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 通常会在问题下方附带若干条建议答案,以可点击按钮的形式展示在聊天界面中。

完整链路如下:

  1. 提问出现:Roo 调用ask_followup_question工具,携带question(问题文本)与follow_up(建议答案列表)。
  2. 建议展示:如果 Roo 提供了建议,它们会以按钮形式渲染在问题下方。
  3. 用户交互:你可以通过点击、快捷键或先编辑再发送三种方式回复。

这张图展示了提问与建议按钮并排出现的典型界面:


工具参数契约:follow_up 的 schema 约束

建议回复的数据源头,是ask_followup_question工具的 JSON Schema 定义,位于 src/core/prompts/tools/native-tools/ask_followup_question.ts。该定义明确约束了模型输出格式:

字段类型约束与说明
questionstring必填。清晰、具体的问题,描述缺失的信息
follow_uparray必填。2–4 条建议答案,必须是完整、可执行的答案,不能包含占位符;可选携带mode字段用于切换模式(如codearchitect
follow_up[].textstring用户可直接选择的建议答案文本
follow_up[].modestring | null可选。选择该建议后要切换到的模式 slug

Schema 中还声明了follow_up条数上下限(minItems: 1maxItems: 4),并启用了strict: trueadditionalProperties: false,即模型不能输出约定之外的字段。

工具文档原文见 apps/docs/docs/advanced-usage/available-tools/ask-followup-question.md。

源码中的格式转换

当模型返回该工具调用后,由 src/core/tools/AskFollowupQuestionTool.ts 执行。其核心逻辑如下:

  • 校验questionfollow_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中定义的FollowUpDataSuggestionItem接口(并配套 zod schemasuggestionItemSchemafollowUpDataSchema),是前后端传递建议回复的统一数据契约。


三种交互方式:选择、快捷键与编辑后发送

根据 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 的这条变更,可以按以下路径核对:

  1. CHANGELOG 入口:CHANGELOG.md 的## [3.10.1] - 2025-03-20条目;
  2. 发布说明原文:apps/docs/docs/update-notes/v3.10.1.md(本文章所依据的主文档,front matter 中的 description 同样写明:"makes suggested responses optional to prevent conflicts with overridden system prompts");
  3. 功能背景:v3.10.0 更新日志 中 "Suggested Responses" 的功能引入说明;
  4. 功能使用文档:apps/docs/docs/features/suggested-responses.md;
  5. 工具定义与执行:src/core/prompts/tools/native-tools/ask_followup_question.ts 与 src/core/tools/AskFollowupQuestionTool.ts;
  6. 数据契约:packages/types/src/followup.ts;
  7. 前端组件:webview-ui/src/components/chat/FollowUpSuggest.tsx(含自动批准倒计时逻辑);
  8. 系统提示快照: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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 15:08:44

高性能计算资源调度:原理、挑战与优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 15:07:45

高效源码阅读方法论与调试技巧实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 15:06:06

ESP32 AI玩偶全双工音频链路重构:从对讲机到连续对话

做这行最怕听到一句话:“你家玩偶怎么跟对讲机一样?”我们的 ESP32 AI 玩偶第一版上线后,用户反馈里高频出现三个字:要按键。孩子想问下一句,得再按一次,问快了还会被“正在播放中”拦下来。这个体验说实话…

作者头像 李华
网站建设 2026/9/12 15:04:38

如何给AI立代码规矩?从AI辅助开发到项目代码规范落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 15:03:57

27B模型为何能赢284B?MCP协议与本地AI部署实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 15:03:27

工程机械GPS智能管理系统的架构设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华