news 2026/10/7 8:20:41

Warp 中禁用 AI 规则建议(Suggested Rules):设置设计与源码实现解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Warp 中禁用 AI 规则建议(Suggested Rules):设置设计与源码实现解析
  • 桌面应用
  • 开发者工具
  • 人工智能
  • AI 应用
  • AI Agent
  • 代码智能体

【免费下载链接】warp

Warp is an agentic development environment, born out of the terminal.

项目地址:https://gitcode.com/GitHub_Trending/wa/warp
点击查看免费下载

导读

本文围绕 Warp(agentic 开发环境)中一项面向用户的新设置——**Suggested Rules(建议规则)**展开,讲解如何通过设置开关与 TOML 配置键,关闭 AI 在 agent 回复完成后展示的"建议保存规则"内联 chips。读者将了解该功能的产品行为定义、Settings → Oz → Knowledge 页面的呈现规则、agents.warp_agent.active_ai.rule_suggestions_enabled配置项的读写机制,以及底层渲染强制执行点与"Don't show again"按钮的实现细节。

该功能的产品规格见 specs/andy/ad-hoc/disable-suggested-rules/PRODUCT.md,技术设计见同目录下的 TECH.md,本文结合当前仓库源码对两者进行系统化展开。

一、功能背景:什么是规则建议 chips

在 Warp 的 Agent 模式下,一次 agent 回复结束后,AI 会在回复块的底部渲染一组内联规则建议 chips(rule-suggestion chips),用于提示用户可以将本次交互中总结出的行为保存为规则(Rules)。这些 chips 由FeatureFlag::SuggestedRules功能开关统一控制,相关枚举定义在 crates/warp_features/src/lib.rs(SuggestedRules与SuggestedAgentModeWorkflows相邻声明)。

"Suggested Rules" 设置的目标是:让用户可以通过一个用户可见的开关,彻底关闭这类规则建议 chips 的展示,从而在不需要"让 AI 帮忙沉淀规则"的工作流中获得更干净、更专注的回复界面。

二、产品行为总览

PRODUCT.md 将功能拆解为 11 条明确行为,核心结论可归纳如下:

行为维度具体规则
设置位置Settings → Oz → Knowledge 的Knowledge分区,紧邻现有Rules开关下方
显示条件仅当SuggestedRulesfeature flag 开启时,该开关才出现在设置界面
默认值默认开启(true)
开关描述"Let AI suggest rules to save based on your interactions."
开启时行为不变:agent 回复完成后仍会在回复块底部展示规则建议 chips
关闭时所有 agent 回复块不再展示规则建议 chips;已渲染的历史建议不会被回溯隐藏,只影响未来回复
与 Rules 开关的关系相互独立:关闭 Rules 不会自动关闭 Suggested Rules,反之亦然
云同步通过标准全局同步机制跨设备同步,与 Prompt Suggestions 等 Active AI 设置一致
全局 AI 关闭时开关置灰不可交互,与所有其他 AI 子设置保持一致
feature flag 关闭时设置界面不显示该开关;但已持久化的值仍被保留,重新开启 flag 后恢复用户偏好
额外按钮建议 footer 中出现"Don't show again"按钮(位于现有Dismiss左侧),点击后永久关闭该设置并立即移除当前块的建议 chips

同时需注意边界:Agent mode workflow suggestion chips(无规则建议时的兜底提示)不受此设置影响,它们由SuggestedAgentModeWorkflows这个独立的 feature flag 控制。

三、设置入口与 UI 呈现

3.1 Knowledge 页面的挂载逻辑

Knowledge 页面的 widget 组装逻辑位于 app/src/settings_view/knowledge_page.rs 的build_page():

fn build_page() -> PageType<Self> { let mut widgets: Vec<Box<dyn SettingsWidget<View = Self>>> = Vec::new(); if FeatureFlag::AIRules.is_enabled() { widgets.push(Box::new(RulesWidget::default())); if FeatureFlag::SuggestedRules.is_enabled() { widgets.push(Box::new(SuggestedRulesWidget::default())); } widgets.extend([ Box::new(ManageRulesWidget::default()), Box::new(WarpDriveContextWidget::default()), ]); } PageType::new_uncategorized(widgets, Some(PageTitle::new(PAGE_TITLE))) }

从源码可以确认两条页面组织规则:

  1. Suggested Rules 开关只有在AIRules与SuggestedRules两个 flag 都开启时才渲染,且位置紧跟在RulesWidget之后、ManageRulesWidget与WarpDriveContextWidget之前,与 PRODUCT.md 中"直接位于 Rules 开关下方"的描述吻合;
  2. 当SuggestedRulesflag 关闭时,SuggestedRulesWidget不会进入 widget 列表,即设置界面完全不显示该开关(对应行为 9)。由于SuggestedRulesWidget仅在页面构建时按 flag 条件插入,此前已持久化的配置值不会丢失,后续 flag 重新开启即可恢复显示与用户偏好。

3.2 开关的渲染与交互

SuggestedRulesWidget通过render_ai_setting_toggle::<RuleSuggestionsEnabled>渲染开关行,读取ai_settings.rule_suggestions_enabled_internal作为当前状态,并使用is_any_ai_enabled作为is_toggleable参数——这与 Rules 开关(ToggleRules)使用同一参数口径,而不是更严格的is_active_ai_enabled。这意味着:只要全局 AI 开关(Oz)开启,Knowledge 分区内的子开关(包括 Suggested Rules)即可交互;全局 AI 关闭时,这些开关会统一置灰。

页面将开关动作建模为KnowledgePageAction::ToggleRuleSuggestions,其处理函数如下:

KnowledgePageAction::ToggleRuleSuggestions => { AISettings::handle(ctx).update(ctx, |settings, ctx| { let _ = settings .rule_suggestions_enabled_internal .toggle_and_save_value(ctx); }); ctx.notify(); }

toggle_and_save_value是 settings 框架提供的原子操作:翻转内部值并立即落盘保存,这也是"点击开关即持久化、下次启动依然生效"(行为 7)的实现来源。

四、配置项:TOML 键与设置组定义

4.1rule_suggestions_enabled_internal字段

设置项本体定义在 app/src/settings/ai.rs 的define_settings_group!(AISettings, …)宏中(紧邻prompt_suggestions_enabled_internal之后):

// This field should not be referenced directly to lookup Rule Suggestions // enablement -- use the `is_rule_suggestions_enabled()` getter. rule_suggestions_enabled_internal: RuleSuggestionsEnabled { type: bool, default: true, supported_platforms: SupportedPlatforms::ALL, sync_to_cloud: SyncToCloud::Globally(RespectUserSyncSetting::Yes), surface: settings::SettingSurfaces::GUI, private: false, toml_path: "agents.warp_agent.active_ai.rule_suggestions_enabled", description: "Controls whether the agent suggests rules to save after responses.", feature_flag: FeatureFlag::SuggestedRules, }

各字段含义与影响:

字段值说明
typebool开关类型,默认值true对应行为 2(默认开启)
supported_platformsSupportedPlatforms::ALL全平台(macOS / Windows / Linux)可用
sync_to_cloudGlobally(RespectUserSyncSetting::Yes)走标准全局云同步,尊重用户自身的同步偏好设置,行为 6 的实现来源
surfaceGUI仅暴露给图形界面设置页
privatefalse非私有设置
toml_pathagents.warp_agent.active_ai.rule_suggestions_enabled用户配置文件中对应的 TOML 键路径
feature_flagFeatureFlag::SuggestedRules使该设置从用户可见 JSON schema 中排除,除非当前构建渠道启用了该 flag(行为 9 的机制来源)

4.2 用户在配置文件中设置

由于toml_path为agents.warp_agent.active_ai.rule_suggestions_enabled,用户可以直接在 Warp 的 settings TOML 文件中写入:

[agents.warp_agent.active_ai] rule_suggestions_enabled = false

保存后下次启动即生效(行为 7)。需要注意:该键位于active_ai分组下,与prompt_suggestions_enabled_internal(Prompt Suggestions)等"Active AI 功能开关"同组,共享同一套读取与同步逻辑。

4.3 读取入口:is_rule_suggestions_enabled()getter

设置组的注释明确要求:不得直接引用内部字段判断开关状态,必须使用 getter。getter 定义如下:

pub fn is_rule_suggestions_enabled(&self, app: &warpui::AppContext) -> bool { self.is_active_ai_enabled(app) && *self.rule_suggestions_enabled_internal }

这个 getter 沿用了 Prompt Suggestions(is_prompt_suggestions_enabled)与 Code Suggestions(is_code_suggestions_enabled)完全相同的"opt-out Active AI 设置"模式:返回值是is_active_ai_enabled(app)与内部字段值的逻辑与。这意味着即使内部值仍为true,只要 Active AI 整体不可用(全局 AI 关闭或当前执行模式不允许 Active AI),该 getter 也会返回false——这正是"开关置灰 + 功能不生效"双重保证的源码级体现。

五、渲染强制执行点:handle_complete_output

规则建议 chips 的创建集中在 app/src/ai/blocklist/block.rs 的handle_complete_output中,这是唯一的渲染入口(TECH.md 明确"没有其他代码路径渲染规则建议 chips")。守卫条件从原先的单一 flag 检查扩展为双重检查:

if FeatureFlag::SuggestedRules.is_enabled() && AISettings::as_ref(ctx).is_rule_suggestions_enabled(ctx) { // Ensure we don't suggest rules that were already suggested and saved by checking the logging id. let existing_suggestions = self .suggested_rules .iter() .map(|rule| rule.read(ctx, |rule, _| rule.logging_id())) .collect_vec(); ... }

从源码结构可以推断其工作流:

  1. 方法先读取历史模型中existing_suggestions_for_conversation已存在的建议,并与本次output.suggestions合并;
  2. 仅当 feature flag 开启且用户设置 getter 返回true时,才进入"基于logging_id去重、生成SuggestionChipView实例"的逻辑分支;
  3. 开关关闭时整个分支被短路,suggested_rules保持为空,回复块底部不会渲染任何规则建议 chips(行为 4)。

由于handle_complete_output是唯一 chokepoint,因此无需在其他渲染路径重复检查——这是该实现"单点守卫"设计的核心优点,也保证了开关行为在 GUI 全场景(新对话、恢复会话、后续回复)的一致性。需要强调的是,该守卫只影响新完成回复的 chips 渲染;已在屏幕上渲染的历史建议不会因为开关翻转而被回溯隐藏,与行为 4 的描述完全一致。

六、"Don't show again"按钮的实现

当回复块底部展示规则建议 chips 时,footer 会额外出现"Don't show again"按钮(位于现有Dismiss按钮左侧)。其实现分散在三个文件中。

6.1 按钮创建(block.rs)

在AIBlock::new中,与既有的dismiss_suggestion_button并列创建:

let dismiss_suggestion_button = ctx.add_typed_action_view(|_| { ActionButton::new("Dismiss", SuggestionDismissButtonTheme) .with_icon(Icon::X) .with_size(ButtonSize::Small) .on_click(|ctx| { ctx.dispatch_typed_action(AIBlockAction::DismissSuggestionsSection); }) }); let disable_rule_suggestions_button = ctx.add_typed_action_view(|_| { ActionButton::new("Don't show again", SuggestionDismissButtonTheme) .with_size(ButtonSize::Small) .on_click(|ctx| { ctx.dispatch_typed_action(AIBlockAction::DisableRuleSuggestions); }) });

两个按钮共用SuggestionDismissButtonTheme(视觉风格一致),差异在于点击后分发的 action 不同。

6.2 footer 组装(view_impl/output.rs)

TECH.md 描述render_suggested_rules_and_prompts_footer的改动:构造right_buttons行时,在has_suggested_rules为true的情况下,将disable_rule_suggestions_button(带margin_right: 4.0)前置插入到dismiss_suggestion_button之前。footer 的渲染同时负责规则建议 chips 与 workflow 建议 chips,仅当存在规则建议时才附加该按钮。Props通过新增字段disable_rule_suggestions_button: &'a ViewHandle<ActionButton>将句柄传入输出视图,并由 app/src/ai/blocklist/block/view_impl.rs 在构造Props时传递&self.disable_rule_suggestions_button。

6.3 点击处理(AIBlockAction::DisableRuleSuggestions)

action 处理器依次执行三步(见 block.rs 的 action 分发):

AIBlockAction::DisableRuleSuggestions => { // Dismiss the current suggestions and permanently disable future ones. BlocklistAIHistoryModel::handle(ctx).update(ctx, |model, _| { if let Some(conversation) = model.conversation_mut(&self.client_ids.conversation_id) { conversation.dismiss_current_suggestions(); } }); AISettings::handle(ctx).update(ctx, |settings, ctx| { report_if_error!( settings .rule_suggestions_enabled_internal .set_value(false, ctx) ); }); ctx.notify(); }
  1. 持久化当前会话的 dismiss 状态:调用conversation.dismiss_current_suggestions(),将本次会话中"已拒绝建议"的状态写入历史模型,保证该会话内不再重现;
  2. 永久关闭设置:通过rule_suggestions_enabled_internal.set_value(false, ctx)将设置写为false,与在设置页手动关闭开关效果完全一致(行为 11);
  3. 立即清空当前块:ctx.notify()触发重绘后,结合self.suggested_rules.clear()对 chip 视图的清除,即使conversation.existing_suggestions尚未由mark_request_completed填充,footer 也能立即消失。

set_value与toggle_and_save_value同样会持久化到用户配置,因此该按钮等效于"设置页开关关闭 + 当前块建议即时移除"的组合操作。

七、与其他开关、flag 的关系辨析

这一功能涉及多个易混淆的开关与 flag,理清边界对配置排查很有帮助:

名称类型作用范围相互影响
Rules(memory_enabled)设置开关决定"已保存的规则是否包含进 agent 请求"与 Suggested Rules 相互独立,关闭一方不影响另一方(行为 5)
Suggested Rules(rule_suggestions_enabled_internal)设置开关决定"回复完成后是否展示规则建议 chips"本文主角
Oz 全局 AI(is_any_ai_enabled)顶层开关控制所有 AI 子设置的可用性关闭后 Suggested Rules 开关置灰不可交互(行为 8)
FeatureFlag::SuggestedRules构建期 feature flag控制功能在渠道中的可见性与代码分支关闭时设置界面不显示该开关,但持久化值保留(行为 9)
FeatureFlag::SuggestedAgentModeWorkflows独立 feature flag控制 Agent mode workflow 建议 chips(无规则建议时的兜底)不受 Suggested Rules 设置影响(行为 10)

从 Knowledge 页面的 action 绑定(add_toggle_setting_action_pairs_as_bindings)还可以看到,Suggested Rules绑定的启用条件是FeatureFlag::AIRules.is_enabled() && FeatureFlag::SuggestedRules.is_enabled(),而上下文约束为IS_ANY_AI_ENABLED,这从键盘/命令入口维度再次印证了"需要 Rules 功能存在 + 全局 AI 开启"的双重前提。

八、云同步与跨设备行为

rule_suggestions_enabled_internal配置了SyncToCloud::Globally(RespectUserSyncSetting::Yes),与 Prompt Suggestions(prompt_suggestions_enabled_internal,同一分组内的同构字段)保持一致:该设置值随全局同步机制跨设备传播,且尊重用户在"设置同步"中自行设定的偏好(即用户可以单独关闭该项的云同步)。由于是全局(非 per-device)同步,某一台设备上的开关翻转会反映到其他已登录设备,但最终生效值以各设备本地缓存与同步结果的合并为准。TECH.md 明确指出这是"其他 Active AI 设置(如 Prompt Suggestions)已存在的 opt-out 模式的原样复用",因此其读写、校验、冲突合并行为与既有同步设置完全一致,无需特殊处理。

九、测试与验证要点

TECH.md 给出了与该功能对应的行为级验证清单,覆盖全部 11 条产品行为中的关键项,可作为开发者自测或 QA 的对照表:

  1. 开关位置与默认值:打开 Settings → Knowledge,确认 Suggested Rules 开关出现在 Rules 开关下方且默认为开启(行为 1、2);
  2. 开启 = chips 正常展示:开关开启时发起一次会返回规则建议的 agent 交互,确认 chips 与历史行为一致(行为 3);
  3. 关闭 = chips 被抑制:关闭开关后发起新的 agent 交互,确认不再出现规则建议 chips;同会话内此前已渲染的 chips 仍然可见(行为 4);
  4. 独立性:关闭 Rules 开关,确认 Suggested Rules 状态不变,反之亦然(行为 5);
  5. 全局 AI 关闭:关闭全局 AI,确认 Suggested Rules 开关置灰且不可交互(行为 8);
  6. 无 flag 的构建:在未启用SuggestedRules的构建中,确认设置界面不出现该开关(行为 9)。

十、小结

"Suggested Rules" 是 Warp 中一个典型的"opt-out Active AI 设置":产品层面通过 PRODUCT.md 定义了 11 条精确行为,技术层面通过 TECH.md 拆解为四处改动——设置组字段与 getter(app/src/settings/ai.rs)、渲染 chokepoint 守卫(app/src/ai/blocklist/block.rs)、Knowledge 页 UI 开关(app/src/settings_view/knowledge_page.rs)以及 footer 的 "Don't show again" 按钮。它复用了 Prompt Suggestions / Code Suggestions 的成熟模式,以单个 getter 加单一渲染守卫实现全场景一致性,并通过SyncToCloud::Globally获得跨设备同步能力。对用户而言,最直接的用法即是在 Settings → Oz → Knowledge 中关闭 Suggested Rules,或在任一回复块的建议 footer 中点击 "Don't show again";对开发者而言,只需记住agents.warp_agent.active_ai.rule_suggestions_enabled这个 TOML 键与is_rule_suggestions_enabled()这个唯一读取入口即可。

  • 桌面应用
  • 开发者工具
  • 人工智能
  • AI 应用
  • AI Agent
  • 代码智能体

【免费下载链接】warp

Warp is an agentic development environment, born out of the terminal.

项目地址:https://gitcode.com/GitHub_Trending/wa/warp
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

具身智能中的世界模型训练

具身智能中的世界模型训练&#xff1a;从虚拟数据生成到物理迁移一、世界模型生成训练数据原理&#xff1a;在虚拟世界生成交互样本 二、训练数据技术演进&#xff1a;真机采集为主&#xff0c;转向虚实混合数据集 三、虚实混合训练工程难点&#xff1a;虚拟样本分布偏移与校验…

作者头像 李华
网站建设 2026/10/7 8:17:25

2026人才测评胜任力建模,4步搭建企业专属测评基准

摘要&#xff1a; 胜任力建模是人才测评落地的起点&#xff0c;也是最多企业卡住的环节。传统路径动辄两三个月&#xff0c;模型上线时业务需求已经变了。有没有更轻、更快的做法&#xff1f;一、为什么你的胜任力模型总是“建了用不上”HR圈子里有个普遍现象&#xff1a;花大力…

作者头像 李华
网站建设 2026/10/7 8:17:25

2026 招聘测评高潜候选人识别,6 套组合测评方案参考

一、高潜识别难在哪&#xff0c;评测标准怎么看做招聘的HR今年聊得越来越多的话题&#xff0c;是高潜候选人到底怎么筛。行业调研数据摆在那里——66%的中国HR认为高潜人才发展乏力&#xff0c;55%表示企业面临关键岗位人才断层。更现实的问题是&#xff0c;传统九宫格做了好几…

作者头像 李华
网站建设 2026/10/7 8:17:03

C / C++ 标准版本演进全解

文章目录 引言 C++ 标准版本演进时间线与核心定位 主流 C++ 版本核心特性深度剖析 C++11:现代 C++ 的奠基与重构 C++14:精雕细琢的增量补丁 C++17:高效落地的工业级标准 C++20:颠覆性的架构升级 C++23 / C++26:体验补齐与范式革命 C++ 兼容性综述 源码级兼容:语言标准的“…

作者头像 李华