本页译自英文文档。命令、标识符和示例保持原样。运行时 7.24.4 · SDK 2.6.7。 英文原文
自主模式
状态:生效 范围:当前状态 最近审阅:2026-08-25 负责人:ax-code 运行时
自主模式让 ax-code 在每个低风险步骤上无需等待人工确认即可完成任务。启用后,权限提示会自动批准,除非被明确阻止;问题对话框会按最佳实践启发式自动作答,优先选择推荐、默认、常见、简单和最小化的选项,同时避开有风险或过度设计的选项。
默认情况下,自主模式为开启。若你此前将其关闭,该偏好会被保存,并在下次启动时恢复。
快速开始
在 TUI 中切换:
- 在提示中输入
/autonomous,或 - 按下
Ctrl+P并搜索 “autonomous”,或 - 点击状态栏中的 autonomous on/off 指示器
状态栏显示当前状态:
- autonomous on(黄色背景,红色粗体文字)——智能体不暂停直接运行
- autonomous off(绿色文字)——智能体在权限或问题提示处暂停
该设置会跨会话保存在 ax-code.json 中。
行为变化
| 行为 | 自主模式关闭 | 自主模式开启 |
|---|---|---|
| 工具权限(read、edit、bash 等) | 提示用户批准 | 混合:安全操作(read/grep/list/…)自动批准;有风险操作(edit/bash/webfetch/…)落入规则集,因此拒绝规则仍然生效 |
| 问题对话框 | 等待用户选择一项 | 选择最佳实践或默认选项并记录 |
| 规划 | 遵循常规智能体提示 | 在实现之前使用轻量的 PRD/ADR 式决策框架 |
| 拒绝时的会话循环 | 停止并等待 | 继续运行 |
isolation_escalation 提示 |
始终提示 | 始终提示(永不自动批准) |
工作原理
自主模式在三个层面运作:
事实来源
本页概括面向用户的行为。行为发生变化时,请对照以下来源核验文档:
packages/ax-code/src/session/processor.ts:权限自动批准、循环行为、拒绝处理以及自主上限。packages/ax-code/src/session/system.ts以及packages/ax-code/src/session/prompt/下的提供方提示文件:自主工作流说明。packages/ax-code/src/question/与packages/ax-code/test/question/question.test.ts:问题自动作答启发式与升级行为。packages/ax-code/src/session/blast-radius.ts:自主步骤与文件变更上限。packages/ax-code/test/session/system.test.ts、packages/ax-code/test/session/prompt.test.ts及相关会话测试:提示与决策账本行为。
此处的安全保证须与沙箱文档保持一致;自主模式改变的是批准行为,而不是隔离的强制执行。
1. 权限自动批准(服务端)
自主模式采用混合式拒绝优先策略(ADR-004 / PRD v4.2.0)。当工具调用 ctx.ask() 请求权限时,Permission 模块会对权限进行分类:
- SAFE 权限(read、glob、grep、list、lsp、code_intelligence、skill、todoread)自动批准,不产生阻塞提示。
- RISK 权限(edit、bash、external_directory、task、webfetch、websearch、codesearch 等)落入规则集——智能体已配置的允许/拒绝规则仍然适用,用户定义的拒绝规则始终强制执行。在
full-access沙箱模式下,RISK 权限会在拒绝规则评估之后自动批准。 - Unknown 权限默认询问(
experimental.autonomous_strict_permission: false保留旧的允许行为)。
始终进入逐次调用决策、而不是立即按规则批准的权限: isolation_escalation(沙箱覆盖请求)、INTERACTIVE_ONLY 权限,以及 NEVER_AUTONOMOUS_AUTOAPPROVE 集合。一处收窄(ADR-098):在 full-access 沙箱模式下,标记为 interactive-only 的 external_directory 请求——因使用 glob、变量或花括号展开而无法静态验证路径的 bash 命令——也会自动批准,因为完全访问的沙箱已没有需要守卫的文件系统边界。显式拒绝规则仍然适用,而沙箱开启模式(workspace-write、read-only)保留逐次调用提示。
空闲时的“允许一次”(默认开启): 自动开启且沙箱关闭(full-access)意味着最少交互:每一项待处理权限都可以在 15 秒后自动回复一次,包括 requireInteractive、hook 与沙箱升级提示。自动关闭或沙箱开启时,待处理提示需要人工回答。WebMCP 还要求对应的桥接已连接;另一个已连接的桥接不算数。显式拒绝规则仍然适用。experimental.permission_idle_once.enabled: false 会禁用倒计时,permissions 可以限制其范围。旧的 timeout_ms 设置仍被接受以保持兼容,但不再改变固定的 15 秒时长。
倒计时由服务器持有。每个会话中最早的请求会得到截止时间;排队中的请求排到队首时会重新获得 15 秒。人工回复会取消计时器。关闭自动、开启沙箱,或断开相关 WebMCP 桥接,都会取消待处理的倒计时。重新满足条件后会开始新的倒计时。配置重新加载的短暂空窗会暂停倒计时。自动回复会重新检查当前模式、桥接和拒绝规则,且永不保存持久批准。AX_CODE_PERMISSION_IDLE_ONCE_MS 内部调试/测试覆盖仍然可用,上限为 Node 计时器的最大值。
模式的作用域是当前活动目录。嵌套的 ax-code.json 可以覆盖仓库根目录的设置;使用当前会话的 Sandbox 开关来改变其有效模式。
不可覆盖的受保护路径: 自主模式还会拒绝写入一组固定的策略/控制面路径——ax-code.json/ax-code.jsonc、.ax-code/**、.git/config 和 .git/refs/**——从而使智能体无法编辑自身配置、提高自身自主上限,或植入 git hooks。与可配置的阻止路径列表不同,这些路径不能通过项目或用户配置移除。
2. 问题自动作答(服务端)
当工具向用户提问时,Question 模块会立即选择一个答案。它优先选择标记为推荐、默认、安全、标准、常见、惯例、最佳实践、简单或最小化的选项。它会避开标记为实验性、有风险、危险、破坏性、高级、复杂、重写或过度设计的选项。如果没有任何选项带有信号,它会选择第一项,因为提问工具要求智能体把推荐选项放在最前。
3. 处理器循环(会话级)
如果某项权限因故被拒绝(例如被显式拒绝规则拒绝),处理器循环不会停止——它会继续下一步,而不是中止会话。
4. PRD/ADR 式决策框架
自主模式会向系统提示添加一条轻量的工作流提醒。实现之前,智能体应以问题、约束、决策、权衡、计划和验证来框定工作。对于较大的多文件、架构或对产品可见的变更,若符合仓库的文档惯例,它可以创建或更新一份仓库文档。对于琐碎变更,应在计划中保持这一框架轻量,以免过度设计。
自主模式 + 沙箱
自主模式与沙箱模式彼此独立。你可以同时使用两者:
| 组合 | 行为 |
|---|---|
| 自主开启 + 沙箱开启 | 智能体自由运行,但限制在工作区内。推荐用于不受信任或团队仓库。 |
| 自主开启 + 沙箱关闭 | 智能体以完整系统访问权限自由运行。用于受信任的项目。 |
| 自主关闭 + 沙箱开启 | 智能体对每个动作请求权限,并限制在工作区内。控制程度最高。 |
| 自主关闭 + 沙箱关闭 | 智能体对每个动作请求权限,并拥有完整系统访问权限。 |
默认运行态势是自主开启加沙箱关闭:full-access 且网络已启用。这提供摩擦最小的 CLI 行为,但没有隔离边界。对不受信任或无人值守的工作,使用 /sandbox、--sandbox workspace-write、AX_CODE_ISOLATION_MODE 或项目配置来启用限制。
配置
配置文件
在 ax-code.json 中:
{
"autonomous": true
}
设为 false 即可禁用:
{
"autonomous": false
}
环境变量
AX_CODE_AUTONOMOUS=true ax-code # force autonomous on
AX_CODE_AUTONOMOUS=false ax-code # force autonomous off
优先级
环境变量 > 配置文件 > 默认值(开启)
工作负载预算(模型回合与工具调用)
自主模式并不意味着无限执行。若干相互独立的上限同时生效。下方默认值是随发行版提供的常量;当工作负载需要更多空间时,在 ax-code.json 中提高或降低它们。
一次模型回合是外层循环中的一次模型请求。一次工具调用是模型回合内部的一次工具执行。这是两套独立预算:单次模型回合可以发出多次工具调用。包含 steps 的旧配置名仍然受支持,但它们不会使这两种单位可以互换。
优先使用一等的 autonomy 对象。旧的 session.* 与 experimental.autonomous_caps.* 键仍可作为别名使用(优先级更低)。
| 上限 | 默认值 | 单位 | 首选配置 | 旧别名 |
|---|---|---|---|---|
| 每分段模型回合 | 500 | 每个延续分段的模型请求数 | autonomy.budget.model_turns.per_segment |
session.max_steps |
| 自动延续 | 3 | 达到模型回合上限之后的分段数(普通自主) | autonomy.budget.continuations |
session.max_continuations(0 禁用) |
| 累计模型回合 | 2,000 普通 · 20,000 目标 / Super-Long | 跨延续累计的模型请求数 | autonomy.budget.model_turns.total |
session.max_total_steps |
| 每个智能体的模型回合 | 原生智能体无上限 | 该智能体处于活动状态时的模型请求数 | agent.<name>.steps(可选) |
— |
| 待办自动重试 | 10 | 仍有待办未完成时的延续次数 | autonomy.budget.todo_retries |
session.max_todo_retries |
| 影响半径工具调用 | 500 / 分段 | 自主模式下的工具执行次数 | autonomy.budget.tool_calls.per_segment |
experimental.autonomous_caps.steps |
| 影响半径文件 / 行数 | 50 个文件 · 5,000 行 | 变更足迹(跨延续保留) | autonomy.budget.changes.files_total / .lines_total |
experimental.autonomous_caps.files / .lines |
| 行数豁免路径 | 锁文件 + 生成的快照(*.snap、*-snapshot.json) |
计入文件上限但不计入行数上限的 glob | autonomy.budget.changes.lines_exempt_paths |
experimental.autonomous_caps.linesExemptPaths |
| 每工具洪泛上限 | 例如 bash 50、edit 100 | 每个模型回合的调用次数 | autonomy.budget.tool_calls.per_tool |
experimental.autonomous_caps.perTool |
| 纯工具连续打断 | 轻推 15 · 收尾约 30 · 停止 35 | 连续仅工具的模型结束次数 | autonomy.stall.tool_only_* |
— |
| 失败变更预算 | 30 / 分段 | 出错且没有成功的变更类工具尝试 | autonomy.stall.failed_mutation_attempts |
— |
| 工具调用突发限制 | 30 次调用 / 10 秒 | 每个处理器回合的滚动窗口 | autonomy.budget.tool_calls.rate |
— |
| 连续错误预算 | 3 | 运行放弃之前连续的提供方/工具错误次数 | autonomy.stall.max_consecutive_errors |
— |
二进制文件(可执行文件的 cp、zip 的 curl -o,以及其他非文本写入)仍计入文件上限,但计为零行。行数上限衡量的是文本变更。Shell 文本写入保留 ceil(size / 80) 估算,以免密集载荷凭借很少的换行来逃避预算。
git check-ignore 报告为已忽略的未跟踪路径也计为零行,但仍计为一个文件。这涵盖了诸如 target/ 的生成目录树,当验证器把输出重定向到那里时(cargo clippy > target/review/clippy.log)。该豁免仅在 git 以 0 退出时适用。仓库缺失、git 失败,以及已跟踪文件都保持正常的行数计费,包括文件名匹配忽略模式的已跟踪文件。
配置档
设置 autonomy.profile 可一次填充多个字段(显式字段仍然优先):
| 配置档 | 意图 |
|---|---|
standard |
随发行版提供的默认值(500 / 3 次延续 / 30·10 秒突发 / 纯工具 35) |
quick |
短修复:每分段 80 步、1 次延续、更紧的纯工具与突发限制 |
long |
多文件批量:10 次延续、累计 10k、更宽的纯工具/突发限制 |
goal |
目标规模的余量,且不要求 /goal |
custom |
不填充配置档——仅使用显式键与常量 |
使用 /limits 检查
在会话中运行 /limits,以打印解析后的预算栈、活动智能体的有效 TUI 分母、配置来源,以及 doctor 警告(例如当 agent.steps 比会话分段更紧时)。键名请使用 /limits help。
TUI 显示的内容: 自主运行期间,标题栏报告 turn current/max · total current/max · cont current/max。turn 是当前延续分段,并使用活动智能体的有效节奏上限——智能体被设限时为 min(agent.steps, session.max_steps),否则为每分段上限。total 在自动延续后仍然保留。当活动目标或 Super-Long 模式抬高普通延续上限时,cont 会显示 ∞。
自动路由: 关键词路由可能把会话切换到专家智能体(Debug、Security、DevOps 等)。除非你设置 agent.<name>.steps,否则专家与 Dev 共享同一套默认无上限的智能体模型回合策略。若只想使用 Dev 智能体,用 "routing": { "disable": true } 禁用路由。
长时间运行: 对持续数小时的工作使用 /goal 或 Super-Long——它们会抬高普通延续上限,并使用更大的累计天花板(默认 20,000),验证与暂停语义见 循环模式。/goal 会先写出一份可审阅的契约(验收标准 + 验证计划),若无法生成该计划,则失败关闭并进入暂停。
当上限停止一次运行
在普通运行达到累计模型回合天花板之前,AX Code 会注入一条有界的收敛指令(最多最后 50 个回合,对较小的自定义预算会按比例缩小)。它要求模型停止广泛探索,完成或安全搁置进行中的工作,运行有针对性的验证,并如实报告未完成的工作。它不会增加预算,也不会绕过任何上限。
达到终局预算时,session.error 会包含可选的机器可读 code,回放 session.end 事件会以 stopCode 记录相同的值。现有的粗粒度结束原因保持不变以兼容。当前的限制代码为:
MODEL_TURN_SEGMENT_LIMITMODEL_TURN_TOTAL_LIMITAGENT_MODEL_TURN_LIMITAGGREGATE_TOOL_CALL_LIMITFILE_CHANGE_LIMITLINE_CHANGE_LIMIT
在分段天花板处,只要配置的延续预算仍有剩余,AX Code 就会自动延续。该预算耗尽后,运行停止,消息会说明发生了什么。发送诸如 continue 的新提示会开始一次新的用户主导运行,并使用新的运行记账;它不会追溯延长已停止的运行。当目标应保持明确且可恢复,直到完成、阻塞或触及目标/运行时预算边界时,使用 /goal。/goal 不会禁用权限、隔离、影响半径、停滞、token、时间或累计模型回合方面的保障。
示例:提高大型自主批量的预算
{
"autonomous": true,
"autonomy": {
"profile": "long",
"budget": {
"model_turns": { "per_segment": 500, "total": 20000 },
"tool_calls": {
"per_segment": 1000,
"rate": { "count": 40, "window_seconds": 10 },
"per_tool": { "bash": 80, "edit": 150 }
},
"changes": { "files_total": 100, "lines_total": 10000 }
},
"stall": {
"tool_only_turns": 50,
"tool_only_nudge": 20,
"failed_mutation_attempts": 30,
"max_consecutive_errors": 3
}
},
"agent": {
"debug": { "steps": 200 }
}
}
何时关闭自主模式
- 学习 ax-code——查看智能体在每一步做什么
- 敏感操作——在应用之前审阅每一处文件变更
- 调试智能体行为——理解智能体为何做出某些决策
- 不受信任的代码——在不熟悉的仓库中审阅工具调用
何时保持自主模式开启
- 日常任务——你信任智能体时的重构、缺陷修复与迁移
- CI/CD 流水线——任务已由策略约束的无头执行
- SDK 用法——通过
createAgent()以编程方式执行智能体 - 大型任务——若在每次权限处停下将耗费数小时的多文件变更
无头 / CI 用法
在无头模式(ax-code run、ax-code serve、SDK)下,自主模式必不可少——没有 TUI 来显示提示。服务端自动批准确保智能体运行至完成,而不会因未回答的提示而挂起。
# Headless one-shot with autonomous on (default)
ax-code run "Fix all TypeScript errors in src/"
# Explicit override
AX_CODE_AUTONOMOUS=true ax-code run "Migrate API routes"
ax-code run 默认打印简洁的工具输出:命令输出被缩减到尾部,编辑显示差异摘要,待办写入显示一行进度计数。错误从不隐藏——它们与其他输出使用相同的尾部上限来呈现。传入 --full 可恢复完整工具输出(完整差异、未截断的命令输出、完整待办列表)以供审计。
安全保证
即使自主模式开启:
- 沙箱仍然强制边界——无论自主模式如何,工作区之外的写入都会被阻止
- 隔离升级始终提示——智能体不能悄悄覆盖沙箱限制
- 拒绝规则会被强制执行——显式的
"deny"权限规则仍然会阻止工具调用 - 自主选择会被记录——提问工具的元数据包含结构化的
autonomousDecisions账本,工具输出包含所选答案,以便智能体稍后报告 - 避免过度设计——自主延续会提醒智能体优先采用最简单的常见做法变更,并避免没有 3 个以上具体用例的抽象
- 会话快照会被记录——每次工具调用都会记入日志以供审计或回放
- 中止始终有效——按下 Esc(中断)会立即停止智能体