用 auto mode 跑任务的时候,最影响状态的往往不是任务本身,而是屏幕上每隔几分钟蹦出来的那行小字提示。如果你最近正被 “classifier request” 这种反复出现的通知折腾得心烦,又不想为了关掉它去付费找什么“高级版”方案,那这篇笔记应该能帮你省点事:先说清这类通知到底从哪来,再给一条纯本地的免费关闭路径,最后补上我在实际配置里踩过的坑和几个比较顺手的调优细节。
1.1 一条通知背后的执行链路
先说人话。classifier request 可以理解成:AI 每次准备执行一个略微敏感的操作之前,向本地安全评估模块发起的一次临时判定请求。工具会根据当前对话上下文和已有规则,快速评估“这个命令能不能跑、要不要打断用户”,然后把评估结果用一行通知的形式展示出来。所以你在界面上看到的“classifier request 进行中 / 已完成”这类提示,本质不是任务日志,而是安全检查的“回执”。
用生活里的场景来类比的话:你给朋友一把钥匙让他进你家帮忙取东西,结果他每开一扇门都要给你打个电话,“这扇门能开吗?那扇窗户能碰吗?”本意是替你着想、确保不出岔子,但次数一多,你的耐心很快就被消耗光了。auto mode 下的 classifier 通知就是这么回事——它每次执行实质操作前都要默默评估一下安全性,然后给你留一条“我评估过了”的痕迹。
这个设计的出发点是好的:auto mode 意味着用户把部分操作权交给了 AI,模型要为自己的动作负责,自然会倾向于“多确认一遍”。可问题在于,它在通知层面太“碎”了,任务一长,通知刷屏的速度比任务本身还要快,反而掩盖了真正值得关注的信息。
1.2 为什么 auto mode 下这条通知特别“顶不顺”
很多人第一次见到这种通知,都会误以为是报错或者卡住了,其实不是。它在 auto mode 下变得频繁,根本原因是:auto mode 的上下文一直在动态变化。哪怕你只是让它改完文件再跑一次测试,每轮新输入都会让评估模块重新判断一次动作边界。上下文一变,它就倾向于重新判定,而不像普通对话那样只问一次就记住。
这就造成了一个很尴尬的局面:你开启 auto mode 的初衷是“放手让 AI 干活”,结果反而要花更多精力去忽略那些不停刷新的小字提示。注意力每被中断一次,效率就掉一截,尤其是连续跑脚本、批量改文件的时候,那种“明明没出问题但老是有弹窗”的烦躁感,相信用过的人都有共鸣。而且这种通知往往不带关闭按钮,只能在设置里找出路,部分人会误以为只能忍着或者升级服务。
好消息是,这类通知完全可以在本地配置层面关掉,不需要额外付费,也不需要装什么第三方插件。关键在于先理解两个东西:权限模型和通知开关。
2.1 权限模型:allow / deny / ask 分别是什么
在关通知之前,建议先花两分钟搞懂工具的三类权限判定,否则后续配置容易把“关闭通知”和“放开权限”搞混。通常来说,每个敏感操作都会被归到三个状态之一:
- allow:直接放行,不再询问用户,通常也不会反复做安全校验提示。
- deny:直接拒绝,命令不会执行,也不会进入后续的通知环节。
- ask:弹出确认,需要用户手动同意或拒绝,这就是“烦人通知”最常出现的地方。
可以简单理解为:ask 是最保守的模式,每一步都要“过问”;allow 是给可信操作“开绿灯”,减少打扰;deny 则是“干脆不要在门口徘徊”,从源头避免评估流程的启动。明白了这个模型,你就会知道:反复弹出的 classifier 通知,往往是 ask 类请求太多导致的,而并非“通知系统坏了”。
2.2 免费方案的两个方向:降低通知级别 & 减少触发次数
关闭通知的免费方案,主要有两个方向,它俩可以组合使用,但思路完全不同。
第一个方向是“只降低打扰,不改变行为”——把 classifier request 的通知级别调低,甚至让它在后台静默完成评估,不打断你的视线。这种做法适合:你其实不介意 AI 执行这些操作,只是被提示刷屏搞得烦躁。
第二个方向是“从源头减少触发”——把那些你高频使用、且确认安全的操作提前加入 allow 列表,让它们不再反复走 ask 流程。相当于把你日常一定会点的“确认”按钮提前点掉,通知自然就少了。
两种方向我建议都用上。先降通知级别,再把高频且安全的操作放行,体验最舒服;只改其一的话,效果会打折。
2.3 为什么首选改配置而不是装第三方扩展
网上会有人推荐各种“关闭 Claude Code 通知”的小工具或插件,有些还标注付费解锁。我的建议是先看本地配置,本地 JSON 文件能解决的问题,没必要多引入一个依赖。原因有三:
- 免费且透明:改的是你本地的 settings.json,每一次改动都看得见,出了问题也能随时回滚。
- 减少额外风险:第三方脚本往往需要你授权额外的权限,或者在你不知情的情况下修改全局设置,风险比“只动一个 JSON 文件”高得多。
- 跟随版本升级更稳定:配置文件是工具产出的正路,插件则有可能在海量版本更新后迅速失效。
所以下面所有操作,都只会涉及本地配置文件,以及少量需要你手动确认的安全策略。这不是“破解级”操作,更不需要购买任何东西,纯粹是把它应该有的开关找出来打开而已。
3.1 先定位配置目录
Claude Code 的配置一般分为全局配置和项目配置。全局配置负责你所有项目的默认行为,项目配置则只对当前目录生效,可以覆盖全局。通常来说,全局配置路径是~/.claude/settings.json,项目配置则是项目根目录下的.claude/settings.json。
如果没有现成文件,可以手动创建对应目录和文件。需要注意:部分版本也支持读取根目录下的claude.json或类似命名文件,但最通用、最常见的还是settings.json这一套。我的习惯是:先改全局,把默认行为调整好;再用项目配置解决某个仓库里的特殊需求。
3.2 以 JSON 配置关闭 classifier requests(附完整可抄样例)
下面这份配置是我自己用过、实测下来比较稳的版本,你可以直接复制到全局配置文件中,按需删减字段。注意,字段名在不同版本里可能略有差异,如果遇到报错,请以你当前版本的帮助文档和 schema 提示为准。
{ "permissions": { "defaultMode": "auto", "allow": [ "Bash(npm run *)", "Bash(git status)", "Read(./src/**)", "Edit(./src/**)" ], "deny": [] }, "notifications": { "classifierRequests": false, "autoModeOutput": "silent" }, "output": { "verbose": false } }逐段拆开解释:
permissions.defaultMode设为"auto",表示默认进入 auto mode。如果你不想全局默认开启,也可以留空,在需要时手动切换。permissions.allow数组里写的是“可信操作”,这些操作会被直接放行,不再反复触发提示。Bash(npm run *)允许所有 npm scripts,Read(./src/**)和Edit(./src/**)分别是读取与编辑 src 目录下的文件,Bash(git status)是最常见的只读 git 指令,放进 allow 几乎无风险。notifications.classifierRequests设为false,这是关闭 classifier requests 通知的核心字段。如果这个字段在当前版本中不被识别,多半是字段名变了,继续看下文替代方案。notifications.autoModeOutput设为"silent",把 auto mode 执行过程中的日志输出调低,避免“小字刷屏”。这个字段的关键在于:它不是关闭执行能力,只是关闭啰嗦的展示层。output.verbose设为false,属于整体输出降噪。如果你需要查看完整过程来调试,可以临时改成true,但日常使用建议保持关闭。
3.3 版本不带 notifications 字段时的替代方案
如果你的版本在解析上述 JSON 时报 schema 错误,不用慌,通常是字段命名随版本更新变化了。此时可以先尝试环境变量的方式关闭对应通知。不同版本可用的环境变量命名不完全一致,常见的模式形如CLAUDE_CODE_CLASSIFIER_NOTIFICATION=off或CLAUDE_CODE_NOTIFICATIONS=silent,具体名称可以在 shell 里运行env | grep -i claude或查阅版本自带的/help输出。
我个人更推荐先用--debug模式启动工具查看日志,它会明确提示你在解析哪一行字段、支持哪些 schema。顺着日志把字段名修正为标准写法即可,不需要启动到什么“开发者模式”。这也是排查难点最直接的方式:让它把“不满意的原因”直接说出来。
补充一句:环境变量方案适合临时不重启的场景,但要把状态固化下来,还是建议最终落在 JSON 文件里。只设环境变量的方式,换个终端就会失效,不利于长期稳定。
3.4 重启会话与验证是否生效
改完配置之后,必须让配置重新加载才能生效。最稳妥的做法是彻底退出当前会话,重新打开 Claude Code,再继续刚才的任务。不用去翻“重载配置”之类的按钮,多数情况下退出重进就是最可靠的手段。
验证是否生效,有两个常见方法。第一,观察法:跑一个会触发敏感操作的任务,比如让它在 src 目录内改文件的子集,如果之前都是每次弹提示,现在直接执行且没有重复的 classifier 通知,说明配置生效了。第二,日志法:开启--debug模式,检查是否还出现classifier request字样,如果日志里仍然打印其执行过程说明功能还在,只是展示层被你静音了,这属于正常现象;你真正要关的是“通知打扰”,不是“安全评估这件事本身”。
4.1 用 allow 列表为高频操作“开绿灯”
配置生效后,建议花一点时间把你自己项目里高频出现的操作梳理出来,分批加进allow列表。这一步的收益很明显:允许列表越贴合你的工作流,后续打扰就越少。
举几个粗粒度低风险的例子:
Bash(git status):几乎不影响什么东西,放心放行。Bash(git diff):只读比对,也可以放行。Bash(npm run dev):算比较安全的前端启动命令,可以放行。Read(./**/*.md):读任意 markdown 文档,放在多数项目里都没有风险。Edit(./src/**):只编辑 src 目录,适合 UI 类项目。
我不建议一上来就写Bash(*)或File(**)这类“全放行”规则,因为这意味着后续所有命令都能绕过确认直接执行,相当于把安全带解了。如果某个项目真的全都可信,你也应该先跑几天观察,确认无误后再逐步扩大范围,而不是一开局就把城门打开。
4.2 用 deny 列表拦住危险命令,避免触发评估
很多人觉得 deny 列表的存在意义就是“拒绝跑危险命令”,这个理解没错,但还可以更进一步:deny 能直接从源头避免“评估流程被触发”。如果一个命令连评估申请都不被允许发起,那就根本不会走到“等待用户确认”那一步,自然也就不会产生对应的通知刷屏了。换句话说,它省的不只是安全感,还有心烦。
典型的 deny 规则可以写这些:
"deny": [ "Bash(rm -rf /)", "Bash(wget *)", "Bash(curl *)" ]wget和curl并非全都不安全,很多项目确实需要它们做网络请求,我只是建议在 auto mode 下谨慎放行,毕竟你无法预料它会在哪个上下文里被调用,把这类高风险工具暂时屏蔽,能换来更少的重复确认和更强的“兜底感”。如果要保留部分下载场景,可以拆成更细的规则,比如只允许curl https://内部服务域名/**,把范围收窄。
4.3 项目级 vs 全局级:不同空间不同策略
全局配置解决的是“默认习惯”,项目配置解决的是“仓库特殊性”。一个比较推荐的做法是:全局只做基础降噪,把平常高频且安全的东西放行;项目级配置则根据实际内容精确指定,比如某仓库的测试目录需要反复改,就给它单独写Edit(./tests/**)的规则。
还有一点很关键:项目配置会随仓库提交而同步。这意味着整个团队会共用同一套安全策略,新同学拉下来就能继承,不会出现“我这边不提醒、你那狂弹窗”的分裂体验。不过这也提醒你:不要往项目配置里写过于个人化或过宽的规则,否则队友的 auto mode 会被你“训练”得很莽。
我亲手带过一个模拟项目 X,当时的项目级配置写了Bash(npm run publish)这种发布命令,本来是想省确认次数,结果某次重构时 AI 自动执行了发布脚本,差点把测试环境的包推到线上。那次之后,凡是涉及“发布”语义的命令,我都只保留在全局deny里,项目级也放行单次、事后回滚,这种教训多一次都嫌多。
4.4 关通知后的安全边界怎么补
关闭通知不等于关闭安全评估,这个边界必须想清楚。你关掉的只是“提醒你评估过程发生了”的 UI 层,判断逻辑本身还是在跑的。但反过来说,如果某条规则被误配置为直接 allow,而你又把通知全静音了,那这个误放行的动作就不会再有任何提示——危险不仅没消失,反而更隐蔽了。
所以我的建议是:关噪音的时候,顺手把安全边界加厚。具体来说,我一般会保证三点:
- auto mode 只在本地的、拆分了版本控制的仓库里放开,尽量不在生产环境或没有 git 保护的目录下全自动运行。
deny列表里始终保留几类高危操作作为底线,比如强制删除、大范围下载、公钥私钥写入等。- 保留审计日志。开启日志输出到固定文件,这样即使界面不提示,事后也能知道 AI 到底做了什么。这比“盯实时通知”更靠谱。
5.1 高频问题对照表
我把实际使用过程中最容易遇到的几个问题整理成了一张表,方便直接定位:
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 改完配置后通知仍然反复出现 | 配置路径不对、文件没保存或会话未重启 | 核对配置文件路径,彻底退出后重进 |
| 改了 notifications 字段后报 schema 错误 | 字段名在当前版本中已变化 | 用--debug查看 schema,把字段改成版本支持的写法 |
| 通知是少了,但某些本该执行的操作直接不跑了 | allow 规则被 deny 覆盖,或规则写太死 | 检查对应命令是否被 deny 拦下,适当调整规则优先级 |
| 关闭通知后发现有些命令静默失败 | 规则放行但命令本身有问题,通知掩盖了错误 | 临时打开verbose: true或查看日志文件定位真实报错 |
| 整个项目里所有新文件的读取都被确认打断 | 只配了全局,项目级配置覆盖了 allow | 在项目级配置里补充Read(./**)等必要规则 |
5.2 三个容易踩的坑
第一个坑:把 allow 规则写得太宽。我刚开始图省事,直接给Edit(./**)放行,结果它在一次重构里顺带着动了不该动的配置文件,改动还是我事后回看 git log 才发现的。从那以后我再也不写这种“全目录可写”的规则,宁可多维护几行精确路径。
第二个坑:在项目配置里静音后,忘记全局配置的存在。项目配置的优先级更高,它会把全局配置里的某些字段覆盖掉。如果你在项目里关了通知,但全局没关,换个项目又会看到通知“卷土重来”。这不是 Bug,而是作用域的正常行为,记得两边都维护一次。
第三个坑:被“第三方一键关闭”吸引。有些脚本为了卖高价,会把配置包装成黑盒工具,看起来是“一键解决”,实际上背后改了一堆你不知道的全局规则。遇到这类情况,我的经验是:先检查本地settings.json的语法和 schema,几乎九成问题都是字段或路径不对,不需要花钱解决。
5.3 关于“免费提示”的几点补充
这个问题的核心解法本身就免费:改 JSON 字段、加环境变量、调整 allow/deny,这些全是工具自带能力。唯一需要投入的,是你在配置上花的那点时间和排查耐心。如果你看到任何声称“必须购买会员才能关闭提示”的说法,基本可以判定为误导。
另一个常被忽略的免费技巧是:善用--help和--debug。工具自带的帮助页里通常会列出当前版本支持的配置项,比起在网上搜一份旧版本的配置样例,直接查本地帮助的准确率要高得多。同样,如果改了配置不生效,--debug的日志会直接把问题原因打到标准输出里,省掉大量猜测。
我自己目前的工作流是:全局配置关闭 classifier requests 通知,并把自动模式输出调整为 silent;项目配置里按仓库维护一套保守的 allow / deny 列表;所有发布类操作一律 deny。这样既保留了 auto mode 带来的“不用每步确认”的顺畅感,又不会因为静音而丢掉底线。你完全可以先复制这套思路,跑几天看看,再根据自己的项目逐步调整颗粒度。毕竟,工具的节奏,最终还是要适配你自己的习惯。