Skip to main content

概述

Auto mode 是 Claude Code 的一种权限模式,让 AI 进入连续自主执行状态。与传统模式(每个敏感操作都弹出权限对话框等待用户审批)不同,auto mode 使用 AI 分类器(transcript classifier)自动判断每个工具调用是否安全,从而实现无中断的执行体验。
权限模式层级:

default  →  auto  →  bypassPermissions
(逐项确认) (AI 分类器审批) (全部放行)

核心架构

1. AI 分类器(yoloClassifier)

分类器是 auto mode 的核心,位于 src/utils/permissions/yoloClassifier.ts 每个工具调用经过分类器评估,返回三种裁决之一:
裁决含义处理方式
allow操作安全直接执行,用户无感知
deny操作危险拒绝执行,向 AI 返回拒绝消息
ask无法确定回退到传统权限对话框
分类器的判断基于完整的对话上下文(transcript),而不仅仅看单条命令——它能理解操作的意图和上下文。

2. 两阶段分类流水线

分类器支持两阶段 XML 分类(classifyYoloActionXml):
Stage 1 — "fast"(快速判断)
├── max_tokens=64,stop_sequences 触发即时 yes/no
├── 如果 allow → 直接放行(最快路径)
└── 如果 block → 进入 Stage 2

Stage 2 — "thinking"(深度思考)
├── chain-of-thought 推理
├── 减少误报(false positives)
└── 最终决定 allow / deny / ask
两个阶段共享相同的 system prompt 和 user content,利用 API 的 prompt caching(1 小时 TTL)优化性能。 可通过配置选择模式:
  • 'both'(默认)— 两阶段都跑
  • 'fast' — 只跑 Stage 1
  • 'thinking' — 只跑 Stage 2

3. 分类器结果类型

// src/types/permissions.ts
type YoloClassifierResult = {
  thinking?: string          // 分类器的推理过程
  shouldBlock: boolean       // 是否阻止
  reason: string             // 决策原因
  unavailable?: boolean      // 分类器是否不可用
  transcriptTooLong?: boolean // 对话是否超出上下文窗口
  model: string              // 使用的分类器模型
  stage?: 'fast' | 'thinking' // 哪个阶段做出的决定
  // ... token 使用量、耗时等监控字段
}

安全机制

危险权限剥离

进入 auto mode 时,系统调用 stripDangerousPermissionsForAutoMode()permissionSetup.ts:510),移除所有可能绕过分类器的 allow 规则。 被剥离的规则类型(dangerousPatterns.ts):
规则类型示例剥离原因
Bash 代码执行Bash(python:*), Bash(node:*)解释器可执行任意代码,绕过分类器审查
Shell 入口Bash(bash:*), Bash(sh:*)直接 shell 访问等同无限制
Agent 规则Agent(*)任何 Agent allow 规则会绕过分类器审批子代理
PowerShell 代码执行PowerShell(node:*)同 Bash 逻辑
权限提升Bash(sudo:*), Bash(eval:*)可执行任意命令
剥离的规则被暂存在 strippedDangerousRules 中,退出 auto mode 时通过 restoreDangerousPermissions() 恢复。

模型支持检测

不是所有模型都支持 auto mode。modelSupportsAutoMode()src/utils/betas.ts)检查当前模型是否具备安全分类能力。不支持的模型无法进入 auto mode。

Circuit Breaker 机制

autoModeState.ts 维护一个 circuit breaker 标志:
let autoModeCircuitBroken = false  // 由远程配置控制
当远程配置(GrowthBook tengu_auto_mode_config.enabled)设为 'disabled' 时,circuit breaker 触发,阻止 auto mode 的进入和继续使用。这为 Anthropic 提供了远程紧急关停能力。

模式切换状态管理

进入 Auto Mode

transitionPermissionMode()permissionSetup.ts:597)处理所有模式切换:
1. 检查 auto mode gate 是否开启(isAutoModeGateEnabled)
2. 设置 autoModeActive = true
3. 调用 stripDangerousPermissionsForAutoMode() 剥离危险规则
4. 向对话注入 Auto Mode 系统提示

退出 Auto Mode

1. 设置 autoModeActive = false
2. 设置 needsAutoModeExitAttachment = true(触发退出通知)
3. 调用 restoreDangerousPermissions() 恢复被剥离的规则
4. 向对话注入 "Exited Auto Mode" 提示

触发路径

Auto mode 可通过以下方式激活:
  • CLI 参数 --enable-auto-mode
  • settings.json 中的 autoMode 配置
  • Plan mode 默认使用 auto mode 语义(useAutoModeDuringPlan,默认 true)
  • SDK 控制消息
  • REPL 中 Shift+Tab 切换

系统提示词

进入时(Full Instructions)

注入到对话中的指令(messages.ts:3464):
Auto mode is active. The user chose continuous, autonomous execution. You should:
  1. Execute immediately — 直接实现,做合理假设
  2. Minimize interruptions — 常规决策自行判断,减少提问
  3. Prefer action over planning — 默认直接编码,不进 plan mode
  4. Expect course corrections — 用户可随时纠正
  5. Do not take overly destructive actions — 删除数据/修改生产系统仍需确认
  6. Avoid data exfiltration — 不主动分享密钥/内部文档

持续运行时(Sparse Instructions)

后续轮次注入简短提醒:
Auto mode still active. Execute autonomously, minimize interruptions, prefer action over planning.

退出时(Exit Instructions)

You have exited auto mode. Ask clarifying questions when the approach is ambiguous rather than making assumptions.

与 Plan Mode 的协作

Plan mode 默认使用 auto mode 语义(getUseAutoModeDuringPlan(),默认 true)。这意味着:
  • Plan mode 进入时,如果 auto mode 可用,也会激活分类器
  • isAutoModeActive() 是权威信号(prePlanMode/strippedDangerousRules 不可靠)
  • 退出 plan mode 时会同时退出 auto mode

分类器不可用的降级策略

当分类器 API 不可用时(unavailable: truetranscriptTooLong: true):
  • 不会直接 allow — 回退到传统的权限对话框(ask)
  • 向 AI 发送消息:” is temporarily unavailable, so auto mode cannot determine the safety of right now.”
  • 确定性错误(如对话过长)不重试,直接降级

分类器 Prompt 模板

分类器的行为由三个 prompt 文件控制,位于 src/utils/permissions/yolo-classifier-prompts/。这些文件在构建时通过 require() 内联为字符串常量,运行时不可修改。

auto_mode_system_prompt.txt

主系统提示词,定义分类器的角色、分类流程和决策类别。包含:
  • 分类流程:理解操作 → 检查用户意图 → 评估风险
  • BLOCK 始终阻止:外部代码执行、不可逆删除、未授权持久化、安全削弱、提权、网络服务
  • BLOCK 除非明确意图:CWD 外写入、系统包管理、git push、大规模变更
  • ALLOW 安全操作:读文件、搜索、git 只读命令、测试/lint/构建、CWD 内编辑
  • <permissions_template> 占位符 — 运行时替换为具体权限模板(external 或 anthropic)
  • 末尾 Use the classify_result tool to report your classification. — XML 模式下被替换为 <block> 标签格式说明

permissions_external.txt

外部用户版本的权限模板。三个 <user_*_to_replace> 标签内包裹默认规则(bullet 格式),用户自定义规则整体替换默认值:
<user_allow_rules_to_replace>
- 默认 allow 规则 1
- 默认 allow 规则 2
</user_allow_rules_to_replace>
  • allow:9 条默认规则(只读命令、版本检查、git 只读、测试/lint/构建、包安装、CWD 内文件操作等)
  • soft_deny:10 条默认规则(外部代码执行、递归删除、shell 配置修改、提权、网络服务等)
  • environment:4 条环境描述(终端环境、auto mode 上下文、开发工具可用、语言/框架不限)
getDefaultExternalAutoModeRules() 从此文件提取 bullet 项,供 claude auto-mode defaults 命令输出。

permissions_anthropic.txt

Anthropic 内部版本的权限模板。默认规则在标签外部,标签内为空,用户自定义规则以追加方式叠加:
- 默认规则(在标签外,始终生效)
<user_allow_rules_to_replace>
</user_allow_rules_to_replace>
相比 external 版本,额外包含:
  • 云 CLI 只读命令(aws describe, gcloud describe, kubectl get 等)
  • 基础设施即代码 plan 命令(terraform plan, pulumi preview 等)
  • 对应的 deny 规则(云资源创建/修改/删除、IaC apply、生产环境访问等)

模板替换流程

buildYoloSystemPrompt()
  ├── BASE_PROMPT.replace('<permissions_template>', EXTERNAL/ANTHROPIC_TEMPLATE)
  ├── .replace(<user_allow_rules_to_replace>, userAllow ?? defaults)
  ├── .replace(<user_deny_rules_to_replace>, userDeny ?? defaults)
  └── .replace(<user_environment_to_replace>, userEnvironment ?? defaults)
  • 外部模板:用户设置非空时替换对应标签内容,否则保留默认值
  • 内部模板:用户设置追加到默认值之后(标签在末尾为空)

当前状态说明

注意:auto mode 的完整代码逻辑已存在于代码库中,但依赖 feature('TRANSCRIPT_CLASSIFIER') feature flag。 在当前反编译版本中,feature() 始终返回 false,因此 auto mode 不可用。 要启用需将 feature('TRANSCRIPT_CLASSIFIER') 改为 true,并确保 GrowthBook 配置源有合理的 fallback 默认值。
Prompt 模板文件为重建产物——原始文件在反编译过程中丢失,已根据代码逻辑和 yoloClassifier.ts 中的替换模式重新编写。

相关源码索引

文件职责
src/utils/permissions/yoloClassifier.ts分类器核心实现
src/utils/permissions/autoModeState.tsAuto mode 状态管理
src/utils/permissions/permissionSetup.ts模式切换、危险权限剥离
src/utils/permissions/dangerousPatterns.ts危险命令模式列表
src/utils/permissions/classifierDecision.ts分类器决策处理
src/utils/permissions/classifierShared.ts分类器共享逻辑
src/utils/permissions/bashClassifier.tsBash 命令分类规则
src/utils/permissions/bypassPermissionsKillswitch.tsbypass 权限熔断器
src/utils/permissions/yolo-classifier-prompts/auto_mode_system_prompt.txt分类器主系统提示词
src/utils/permissions/yolo-classifier-prompts/permissions_external.txt外部权限模板
src/utils/permissions/yolo-classifier-prompts/permissions_anthropic.txt内部权限模板
src/cli/handlers/autoMode.tsCLI auto-mode 子命令处理
src/utils/messages.tsAuto mode 系统提示词注入
src/types/permissions.ts权限类型定义
src/utils/betas.ts模型 auto mode 支持检测