首页 / DeepSeek Harness 入门教程 / 无头模式与脚本化运行

DeepSeek Harness 入门教程

无头模式与脚本化运行

本教程共 32 篇 · 第 5 篇 · 更新于 2026-08-15 · 约 5 分钟阅读

DeepSeek HarnessHeadless无头模式自动化CI命令行

本节目标:学会用 headless 模式跑一次性任务,把 dsh 接进脚本和 CI。学完你能写出一条「跑任务 → 看退出码」的自动化命令。

什么是无头模式

Headless 直译是「无头」——没有界面。dsh 的 headless Profile 把整个交互压缩成三步:给一句任务、等它跑完、拿最终答案。

一条命令长这样:

npx @deepseek-ai/dsh --profile headless "run the tests"

任务文本是位置参数,直接跟在 Profile 后面,用引号包起来。中文任务同样支持:

npx @deepseek-ai/dsh --profile headless "总结当前目录的项目结构"

headless Profile 和 web Profile 一样,首次使用会从内置模板自动初始化。

Note

无头模式不是「简化版脚本」。它启动的是同一套完整 Agent 运行时:照样组合插件树、创建 Agent、写会话日志、落盘持久化。它只是省略了 Web 宿主、HTTP 服务和浏览器客户端,不监听任何端口(来源:官方 CLI 参考)。

一次任务发生了什么

官方 CLI 参考描述了完整的执行流程:

  1. 通过核心注册表创建一个全新的、持久化的 Agent 会话
  2. 提交任务文本
  3. 等待 Agent 完全停稳(所有步骤、工具调用结束)
  4. 对会话执行 flush,把事件落盘
  5. 从持久化事件区间推导最后一个非空 assistant 文本和最终结束原因
  6. 最终答案打印到 stdout;结束原因是 completed 就退出 0,否则退出 1

成功运行时,stderr 不输出任何内容,也不打开监听端口。这条纪律让 headless 特别适合管道和日志采集。

输出与退出码

输出契约简单清晰:

通道内容
stdout最终答案(干净文本,适合直接存文件或喂给下一个命令)
stderr错误信息(模型错误、配置错误等)
退出码 0任务正常完成(completed
退出码 1任务未正常完成(模型报错等)

在脚本里判断成功与否,看退出码就够了:

if npx @deepseek-ai/dsh --profile headless "run the tests" > result.txt; then
  echo "任务完成,答案已保存到 result.txt"
else
  echo "任务失败,退出码 $?"
fi
Tip

想在 CI 里把 Agent 当「自动化同事」用,这个模式最合适:提交代码后自动跑测试、生成变更说明、检查文档完整性,都能用一条命令挂进流水线。

非交互与权限

headless 没有界面,自然也没有弹窗审批。那 Agent 执行写操作时谁来把关?

权限由权限预设决定。新会话默认使用 workspace-write 预设:Bash 和文件系统修改被限制在会话工作区与平台临时目录内,读取、网络访问不受限。预设表里还有更严格的配置和全开放配置(如 danger-full-access,谨慎使用)。

环境变量 DSH_PERMISSION_MODE 可以改变进程级默认预设。更细的权限体系(沙箱模式、审批策略、权限预设)在第 16 章展开。

Warning

无头模式不会弹窗问你「同不同意」。任务一旦发出就会自己执行。跑自动化任务前,先想清楚工作区目录和权限预设,别在重要目录里裸跑。

适用场景

适合无头模式的地方:

  • CI 流水线:代码提交后自动跑测试或生成报告
  • 批量任务:循环处理多个目录、多个仓库
  • 定时任务:配合 cron 或任务计划程序定时执行
  • 嵌入程序:在 Python、Node 脚本里调用,拿到文本结果继续处理
  • 远程/后台执行:SSH 到服务器跑任务,不需要图形界面

不适合的场景:需要逐步确认的复杂任务、需要人工中途干预的长交互。这类任务用 Web 界面更合适。

与 Web 模式对比

对比项headlessweb
界面无,纯命令行完整 Web UI
交互方式一次性任务,跑完退出持续会话,随时追问
输出stdout 最终答案 + 退出码界面流式输出、轨迹回放
审批无弹窗,靠权限预设超权限操作弹窗确认
端口不监听任何端口默认 127.0.0.1:3080
适用自动化、CI、批量日常开发、复杂任务

两者共用同一套运行时和会话机制,不是两个产品,只是同一个 Agent 的两种「产品面」。

常见问题

没传任务文本。 headless 的任务参数不能省略,缺了属于用法错误,非零退出。

任务失败但不知道原因。 退出码 1 时看 stderr,模型错误、Key 没配、网络不通都会写在那里。

任务跑很久没结束。 任务复杂度高或模型配置不当。想中断按 Ctrl+C,会走优雅排空流程(退出码 130)。

想给任务加配置。 用第 4 章的 --patch 覆盖层,和 web 模式完全一样:

npx @deepseek-ai/dsh --profile headless --patch ./ci.cordis.yml "run the tests"

小结

无头模式把 Agent 变成了一个「可编程的命令」:任务文本进,最终答案出,退出码告诉你成没成。它和 Web 模式共享同一套运行时,只是省掉了界面。

到这里,「认识与上手」部分结束。你已经能安装、启动、对话、跑脚本。下一部分进入核心概念,先看看 dsh 的底座 Cordis 到底是什么。