本页译自英文文档。命令、标识符和示例保持原样。运行时 7.24.4 · SDK 2.6.7。 英文原文
无头 CLI(ax-code run)
状态:生效 范围:当前状态 最近审阅:2026-09-22 负责人:AX Code 运行时维护者
ax-code run 是面向 AI 编码智能体和脚本的一次性、非交互入口。它提交一条提示,打印助手的最终回复,然后退出——没有终端界面,也没有交互提示。本指南覆盖选项表面、输出契约、退出码,以及用于脚本和 CI 的可复制配方。
调用一次运行
有四种方式提供提示。它们按顺序组合:--prompt-file,然后 -p/--prompt,然后位置消息,然后管道标准输入。
# Positional after -- (safest; flags after -- are never consumed as options)
ax-code run --model qwen -- "Review this change"
# Explicit prompt flag
ax-code run --model qwen --prompt "Review this change"
ax-code run --model qwen -p "Review this change"
# Prompt read from a file (not an attachment)
ax-code run --model qwen --prompt-file ./prompt.txt
# Piped stdin (used as the prompt when no positional/--prompt is given)
printf 'Review this change' | ax-code run --model qwen
当标准输入不是 TTY 时,其内容会追加到组合后的提示,因此在没有其他内容时它就是整个提示。标准输入读取器在放弃打开的管道之前等待 300 毫秒的安静窗口,因此请及时写入提示并关闭标准输入——或对大型或缓慢产生的提示使用 --prompt-file。--prompt-file - 显式从标准输入读取提示(标准输入是 TTY 时为用法错误);对该次调用,隐式的管道标准输入追加从不会再运行第二次。
-f/--file 把文件附加到消息,并且从不替换提示;它可以重复:
ax-code run --model qwen --file README.md --file src/main.ts -- "Summarize these"
附件必须位于项目目录内:无论权限规则如何,服务器都拒绝目录之外的附件,因此 CLI 会预先以用法错误拒绝它们。把文件复制进项目,或用 --prompt-file 传入其内容。--add-dir 授予工具对额外目录的访问,但不改变此规则。
附件 MIME 类型从扩展名推断:png、jpg、jpeg、gif 和 webp 映射到它们的 image/* 类型,pdf 映射到 application/pdf,因此二进制附件以其真实类型到达服务器,而不是 text/plain。其他任何东西——包括没有可识别扩展名的文件——都作为 text/plain 发送,目录附件被分类为 application/x-directory。
引导这次运行
三个标志在不改变提示文本的情况下引导运行。它们都只有长形式,并且是 kebab-case。
--append-system-prompt TEXT / --append-system-prompt-file PATH
在智能体和环境系统提示之后,把额外文本追加到系统提示——它追加,并且从不替换内置系统提示。两种形式互斥。文件变体便于较长的说明;恰好修剪一个尾部换行,空文本(或不可读的文件)在提交任何东西之前就是用法错误。
ax-code run --model qwen --append-system-prompt "Answer in English only" -- "Review this change"
--disallowed-tools a,b
按 id 为这次运行禁用工具(逗号分隔,可重复)。它通过两种服务器机制应用:创建的会话上的拒绝规则覆盖新运行,按请求的工具映射也覆盖恢复的 --session/--continue 运行。拒绝 bash 也会拒绝 monitor 工具的命令,它通过同一 shell 启动器运行;命中拒绝规则的调用作为工具错误失败,并计入被阻止运行状态的拒绝。未知 id 不是错误——MCP 工具 id 是动态的——但在默认格式下,内置工具集之外的每个 id 会打印一条标准错误警告(由 --quiet 抑制)。
ax-code run --model qwen --disallowed-tools bash,write -- "Audit this module without mutating anything"
--add-dir PATH
授予智能体对一个额外目录的访问(可重复):一条 external_directory 允许规则被加入新会话的权限规则,对象是 <resolved-path>/*,覆盖该目录及其下的一切。每条路径必须存在并且是目录(像 --file 那样相对调用方的当前工作目录解析)。规则在会话创建时应用,因此在 --session/--continue 下它不能生效——CLI 在标准错误上打印 --add-dir applies only to new sessions 并继续。它不改变 --file 的包含规则:附件仍必须位于项目目录内。它覆盖文件工具(read、glob、grep、list、edit、write);通过动态路径进入该目录的 shell 命令仍会触发仅交互的路径访问提示,无头运行会自动拒绝它,因此请优先使用文件工具或显式传入文件内容。
ax-code run --model qwen --add-dir ../design-docs -- "Read ../design-docs/spec.md and summarize it"
选择模型
用 ax-code models 列出可用 ID。把得到的 provider/model 值传给 --model(-m):
ax-code models # one "provider/model" ID per line
ax-code models --json # one JSON document
ax-code models --json 打印一份形如 {"models":[{"id":"provider/model","provider":"...","model":"...","connected":true}]} 的文档。
系列名 deepseek、glm 和 qwen 解析到它们的 Flash 默认值,因此 ax-code run --model qwen -- "..." 无需拼出完整的 provider/model ID 即可工作。省略 --model 则使用已配置的默认值;有效的智能体和模型以 > Agent · model 打印到标准错误。
输出格式
--format 接受 default(默认)、json、jsonl 或 ndjson(jsonl 和 ndjson 是 json 的别名)。
默认(文本)
默认格式只在标准输出上打印最终的助手文本。所有进度、工具活动和诊断都到标准错误,以包含会话 id 的 > Agent · model · ses_... 头开始,因此多回合调用方可以用 --session 恢复,而无需切换到 --format json(--quiet 抑制该头)。当标准错误不是 TTY 或设置了 NO_COLOR(任何值)时,ANSI 颜色被禁用,因此管道运行从不会发出转义码。
JSON 流(--format json)
--format json 打印换行分隔的 JSON(NDJSON)事件流——每行一个 JSON 对象,而不是单个 JSON 文档。事件包括 step_start、text、tool_use、reasoning(仅在有 --thinking 时)、permission_denied、error 和 step_finish。流始终以恰好一行 result 结束:
{
"type": "result",
"timestamp": 1727000000000,
"sessionID": "ses_...",
"status": "completed",
"text": "...",
"permissionDenials": 0,
"usage": { "input": 1200, "output": 80, "reasoning": 0, "cacheRead": 0, "cacheWrite": 0 }
}
status 为 completed、blocked 或 error。usage 只携带 token 计数——input、output、reasoning、cacheRead、cacheWrite——计数未知时整个省略;没有成本字段。当运行在提交之前失败(错误标志、未知模型等)时,流格式在退出前打印一行:
{ "type": "error", "error": { "code": "usage", "message": "..." } }
error.code 是以下之一:
| 代码 | 何时触发 |
|---|---|
usage |
错误或矛盾的标志、缺失的提示,或不可读的 --output-schema。 |
provider |
未知的提供方 id,或已知但未连接的提供方。 |
model |
已知提供方上的未知模型 id,或无法解析的 --model 值。 |
session |
缺失或被拒绝的 --session id(在运行提交之前预检)。 |
attach |
无法到达附加的服务器、凭据被拒绝(401/403),或没有为 --runtime 运行的受管运行时。 |
internal |
任何其他未处理的拒绝。 |
退出码
| 代码 | 含义 |
|---|---|
| 0 | 已完成。 |
| 1 | 用法错误、提供方/模型错误、流错误,或 --output-schema 校验失败。 |
| 3 | 被阻止——至少一次权限拒绝,且没有成功的变更类工具调用(result.status 为 blocked)。 |
| 124 | 超时(--timeout 已过去;result.status 为 timeout)。 |
| 130 | 被 SIGINT 或 SIGTERM 取消(服务器上的会话已中止;result.status 为 cancelled)。 |
沙箱
--sandbox read-only|workspace-write|full-access 选择隔离模式(默认 full-access)。在无头运行中,权限询问被自动拒绝并报告为 permission_denied 事件,因此需要它未被允许的写入的运行会报告 blocked 并以 3 退出。这也覆盖子智能体:由 task 工具创建的子会话中提出的询问以同样方式拒绝,它们的 permission_denied 事件携带子项 sessionID。被权限拒绝规则拒绝的工具调用(例如来自 --disallowed-tools)或被只读沙箱拒绝的调用也计为拒绝。交互式的 question 和 plan_exit 工具在无头运行中始终禁用,包括恢复的会话。仅当不期望变更时使用 read-only;workspace-write 把写入保持在项目内。
在 --attach 下,该标志也会作为每次请求的隔离策略放进每个提示正文;服务器应用其自身模式与所请求策略中更严格的一个,因此它只能收紧。对本地拥有的服务器发送相同的按请求策略,使行为保持一致。
结构化输出
-o/--output-file <path> 把最终助手文本写入文件。--output-schema <file> 对照 JSON Schema 文件把最终文本校验为 JSON;不匹配被报告为 error 事件,并带 result.status error,且以 1 退出。模式文件在模型运行之前预检——不可读、无法解析或非对象的模式在提交任何东西之前就是用法错误。成功时,解析后的模式也会作为这次运行的 json_schema 输出格式发送给模型,服务器在 CLI 自己的最终校验作为后盾运行之前,最多重试两次无效回复。最终输出是序列化的结构化对象(一行 JSON):它是标准输出、--output-file 和 result.text 所携带的内容:
ax-code run --model qwen --output-schema ./answer.schema.json -- "Return a JSON object with a summary field"
会话与恢复
-c/--continue— 继续最近的会话。-s/--session <id>— 按 ID 继续特定会话。--fork— 在继续之前分叉会话(需要--continue或--session)。--show-history— 恢复时打印可见的会话历史(需要--continue或--session)。--attach <url>— 附加到已经在运行的服务器,而不是启动一个;与--dir组合以指向该服务器上的项目目录。用AX_CODE_SERVER_PASSWORD保护的服务器接受--password(或调用方一侧的同一变量);受管运行时从AX_CODE_RUNTIME_TOKEN取得其令牌。--runtime— 附加到项目目录(--dir或调用方当前工作目录)的受管运行时,该运行时由ax-code runtime start启动,从其私有运行时记录解析 URL 和令牌。没有正在运行的运行时时,运行在任何请求之前失败,错误代码为attach,消息中指出启动命令。--runtime和--attach互斥。
配方
一次性
ax-code run --model qwen -- "Fix the failing test in src/parser.ts"
用超时限制一次运行
ax-code run --timeout 120 --model qwen -- "Fix the failing test in src/parser.ts"
--timeout <seconds> 在服务器上中止运行,并在运行超出界限时以 124 退出(result.status 为 timeout),因此卡住的智能体不能无限期占用 CI 作业。该界限覆盖整个调用——它在第一次服务器调用之前武装,因此即使是黑洞般的 --attach 主机或挂起的启动也会按时终止(在那种早期情况下,结果行携带空的 sessionID)。
等待后台子智能体
ax-code run --await-background 300 --timeout 360 --model qwen -- \
"Delegate the independent checks, then integrate their results"
--await-background <seconds> 为本次调用保持打开,以等待其会话创建的后台 task 子项,以及由其结果触发的父后续回合。它是可选加入的,上限为 3600 秒。最终回复和 JSON result.text 来自最后完成的父回合。如果子项或其后续没有在等待界限内安定,运行报告错误并以 1 退出。--timeout 仍然是总体界限。项目计划任务在单独的会话中运行,不属于这次等待。这个一次性命令不认领到期的项目计划;持久后端拥有它们的分发。
解析 JSON 流
result=$(ax-code run --format json --model qwen -- "..." | tail -n 1)
echo "$result" | jq -r '.status'
echo "$result" | jq -r '.text'
result 行始终是最后一行,因此即使流提前结束,tail -n 1 也能把它分离出来。
只读审阅
ax-code run --sandbox read-only --model qwen -- "Review this diff for bugs"
带模式的结构化 JSON 输出
cat > answer.schema.json <<'JSON'
{"type":"object","properties":{"summary":{"type":"string"}},"required":["summary"]}
JSON
ax-code run --model qwen --output-schema answer.schema.json --output-file answer.json \
-- "Return JSON with a one-sentence summary"
恢复会话
# Start a session and note the sessionID from the result line
ax-code run --format json --model qwen -- "Draft the outline" | tail -n 1
# Continue it
ax-code run --model qwen --session ses_... -- "Now write section 2"
附加文件
ax-code run --model qwen --file docs/spec.md -- "Summarize the attached spec"
机器可读命令
ax-code run --format json 发出换行分隔的事件流(见 JSON 流);它是唯一流式的 --json 表面。其他每个带 --json 标志的只读命令遵循更严格的契约:成功时它向标准输出写入恰好一个 JSON 文档,失败时标准输出保持为空,同时单个 {"error":{"code","message"}} 文档进入标准错误,退出码为 1。
带 --json 的命令:
ax-code session list --jsonax-code models --jsonax-code providers list --jsonax-code agent list --jsonax-code mcp list --jsonax-code mcp auth list --jsonax-code stats --jsonax-code context --jsonax-code memory status --jsonax-code memory list --jsonax-code task list --json/ax-code task show <taskID> --jsonax-code schedule list --json/ax-code schedule show <taskID> --jsonax-code runtime list --json/ax-code runtime status --jsonax-code doctor --jsonax-code risk <sessionID> --jsonax-code wiki status --jsonax-code workflow list --json/ax-code workflow status <runID> --json
ax-code runtime status 无条件打印其 JSON 文档——--json 标志为一致性而被接受,但状态动作始终在标准输出上发出 JSON。
从另一个智能体调用 ax-code
当从脚本、CI 步骤或另一个智能体包装 ax-code run 时:
- 使用
--format json并读取最后一行——即使流提前结束,result记录也始终是最后一行。 - 从该结果行捕获
sessionID以供任何后续回合使用;用--session把它传回去。 - 并发调用方绝不要使用
--continue——它恢复最近的会话,多个调用方活动时会竞态;请改为传入显式的--sessionid。 - 传入显式的
--model,以免运行依赖可变的已配置默认值。 - 始终传入
--timeout,以免卡住的智能体占用调用方。 - 关闭标准输入,或使用
--prompt-file/--prompt-file -:隐式管道读取器在 300 毫秒安静窗口后放弃,并会静默截断缓慢的管道。 - 设置
NO_COLOR=1,或依赖非 TTY 检测,以免管道运行发出 ANSI 转义码。 - 从项目目录运行:在非交互模式下,主目录或多仓库父目录会被拒绝。设置
AX_CODE_ALLOW_BROAD_DIR=1以覆盖该守卫。 - 用法失败在标准输出上不打印任何东西(帮助和一行错误进入标准错误),因此打错的命令使标准输出为空且退出码为 1。在
--format json下,用法失败也会作为标准输出上的一行error写出。 - 在进程仍在加载、
run命令尚未活动时到达的信号,以退出码 130 且无输出结束进程;一旦命令活动,SIGINT 和 SIGTERM 始终产生单条终局result行,状态为cancelled。