不带参数执行 grok,Grok Build 打开的是全屏、能点鼠标的 TUI。脚本、CI、机器人里没人盯着屏幕点批准,这时改走无头模式:把提示词交给 -p,跑完就退出,stdout 留给你解析。
什么时候该用无头模式
无头适合三类活:脚本里调一次 agent、流水线里自动跑、接到别的应用当机器可读的一步。它和 TUI 是同一套能力,只是不占全屏、不等你交互。
最短的写法是 -p(全称 --single),发一条提示,处理完打印结果,进程结束:
grok -p "Explain this codebase"
grok -p "Your prompt here"
机器上没有浏览器时,先准备 API Key,再跑无头。远程机器也可以走设备码登录:
export XAI_API_KEY="xai-..."
grok -p "Explain this codebase"
grok login --device-auth
不想让它切到 alternate screen、把终端刷成全屏,加上 --no-alt-screen,进程就在当前终端里内联跑:
grok --no-alt-screen -p "Explain this codebase"
工作目录不对时,用 --cwd 指到仓库,不必先 cd。
三种输出格式
--output-format 只认三个值。人在终端里看,用 plain,就是一段可读文本。脚本要一次性拿走结果,用 json,整轮结束后吐一个 JSON 对象。要边跑边处理事件,用 streaming-json,每行一个 JSON,事件到了就写一行。
grok -p "List TODO comments" --output-format json
grok -p "Explain the architecture" --output-format streaming-json
json 适合接 jq、再决定下一步。对象里有 sessionId,可以抽出来续同一段对话,做成多步流水线:
SID=$(grok -p "Review the changes in this PR" --output-format json | jq -r '.sessionId')
grok -p "Now check for security issues" --resume "$SID"
只要最终文本时,把 .text 取出来即可:
grok -p "Review changes for bugs" --output-format json --always-approve | jq -r '.text'
streaming-json 是换行分隔的事件流,增量往外推。日志采集、进度展示、按事件类型分发,走这条,不要等整轮结束再拆那个大对象。
会话在无头里怎么续
默认每次 grok -p 都是新会话。要带着上文往下问,用这三个开关;记录落在 ~/.grok/sessions。
| 开关 | 作用 |
|---|---|
-s, --session-id <UUID> |
给新会话指定一个 UUID |
-r, --resume [<ID>] |
按 ID 恢复已有会话;省略 ID 则恢复最近一次 |
-c, --continue |
继续当前目录里最近的那一次会话 |
-s 只用来开新会话。值必须是 UUID,不要拿它当「按名字恢复」。续旧的用 -r 或 -c。脚本里优先把上一步 JSON 里的 sessionId 交给 --resume,比靠「最近一次」稳。
grok -p "hello" --session-id "$(uuidgen | tr '[:upper:]' '[:lower:]')" --output-format json
grok -p "Continue where we left off" --resume "<id>"
grok -p "What were we doing?" -c
同一段历史要分岔、又不想改原来那条,续跑时加上 --fork-session。它会从旧会话分出一个新 ID,后续写在分出来的这条上。
grok -p "Try a different approach" --resume "<id>" --fork-session
CI 里常用的安全与稳定性开关
流水线里没有人点「允许」。--always-approve(别名 --yolo)会自动放行工具调用,否则无头进程会卡在权限提示上。
grok -p "Review changes for bugs" --always-approve --output-format json
全放开之前,先收一收范围。--allow 和 --deny 写权限规则,--sandbox <PROFILE> 套一层沙箱。规则语法和档位名各自有专门说明,这里只要知道 CI 里这三项经常和 --always-approve 一起出现。
--max-turns <N> 限制这一次最多跑多少轮 agent。N 按任务自己定。
脚本和 CI 里应跳过后台更新检查。单次跑带 --no-auto-update;这台机器以后都不要检查,写进用户配置:
grok --no-auto-update -p "Review the diff"
[cli]
auto_update = false
auto_update 放在 ~/.grok/config.toml 的 [cli] 段。无头和 grok agent stdio 都可以用 --no-auto-update。
选模型和临时规则
换模型用 -m / --model。推理强度用 --effort <LEVEL>,档位以当前模型菜单里实际列出的为准。
grok -p "Hello" -m my-model
这一次只要追加几条约束,用 --rules,文本会接到系统提示后面。要整段换掉系统提示,用 --system-prompt-override,原来的默认提示不会再拼上去。
grok -p "Refactor this module" --rules "Always use TypeScript. Prefer functional components."
自定义模型先写进用户级配置,再在无头里用 -m 点名。路径是 ~/.grok/config.toml(Windows 为 %USERPROFILE%\.grok\config.toml):
[model.my-model]
model = "model-id"
base_url = "https://api.example.com/v1"
name = "Display Name"
env_key = "API_KEY"
[models]
default = "my-model"
改完先在仓库里跑 grok inspect,看当前目录到底吃进了哪些配置来源,再:
grok -p "Hello" -m my-model
模型名和配置节里的 my-model 对上即可。TUI 里换模型仍是 /model <name>,和无头的 -m 是同一套目录。