每个工具都是一个插件包。核心集合是 run_code(@deepseek-ai/dsh-tools)、bash 及其常驻版本、str_replace_editor、fs 的 read/write/edit 系列、glob 与 grep、lsp、subagent 与 workflow 编排、goal 与 todo、会话查询、网页搜索与抓取、调度,以及 cordis_* 运行时工具。你的 agent 实际看得到哪些,由 mode 和 profile 叠的 bundle 决定。
多数介绍文章谈 DeepSeek Harness 时只会说「它有工具」。而仓库里其实带着一份完整目录,读它比读任何综述 都更能说明这个 harness 的设计——每个工具都是独立的包,这才是「一切皆插件」的具体含义。
下面是全集,按职能分组。
执行
| 工具 | 包 | 作用 |
|---|---|---|
run_code | @deepseek-ai/dsh-tools | 执行一段 TypeScript 程序。接收 code(一个 async 函数的函数体,只允许可擦除语法,顶层 await 与 return 可用)和 description。 |
bash | @deepseek-ai/dsh-tool-bash | 执行 bash 命令。每次调用都在全新 shell 里:cwd、变量、函数都不跨调用保留。支持 run_in_background: true。 |
bash(常驻) | @deepseek-ai/dsh-tool-bash-persistent | 接口相同,但状态跨调用保留,含当前目录和导出的环境变量。 |
pwsh | @deepseek-ai/dsh-tool-pwsh | Windows 上的 PowerShell 对应物,同样每次调用一个全新进程。 |
run_code 就是 Code 模式(官方中文显示名「PTC 模式」)背后的机制。模型写一段程序,而不是「发一个工具调用、
读结果、再发下一个」、每步都付一次模型往返的代价。
文件系统
| 工具 | 包 | 作用 |
|---|---|---|
read、write、edit、read_image | @deepseek-ai/dsh-tool-fs | 带行号的文本文件操作。read_image 为支持图像的模型读取 PNG/JPEG/WebP/GIF。 |
str_replace_editor | @deepseek-ai/dsh-tool-str-replace-editor | 用精确字面串替换来查看、创建、编辑文件。命令:view、create、str_replace、insert。 |
glob、grep | @deepseek-ai/dsh-tool-fs-search | 按 glob 模式查找文件,按 ripgrep 正则搜索。最多返回 100 条匹配,超出的写入磁盘。 |
极简模式恰好就是 dsh-tool-bash-persistent + dsh-tool-str-replace-editor——所以官方描述用的是
「两个工具」,而不是「精简的工具集」。
终端
terminal_open、terminal_send、terminal_read、terminal_close、terminal_list、
terminal_signal,全部来自 @deepseek-ai/dsh-tool-terminal。
这是常驻 PTY 会话,不是一次性命令,并且支持长任务的后台 job 模式。任何交互式场景都该用它:REPL、
开发服务器、ssh 会话、需要发信号的进程。
代码导航
lsp(@deepseek-ai/dsh-tool-lsp)发起语言服务器查询:goToDefinition、findReferences、
goToImplementation、hover。它需要一个已注册的 LSP provider——没有 provider,工具在但无处可问。
这和基于 grep 的导航是实质性的能力差异。经语言服务器的 findReferences 懂类型和作用域,grep
只懂字符串。
子 agent 与编排
| 工具 | 包 | 作用 |
|---|---|---|
subagent、subagent_fork | @deepseek-ai/dsh-tool-subagent | 把工作委派给独立 agent。fork 后端会额外注册为 subagent_fork。 |
send_message、interrupt_agent、list_agents | @deepseek-ai/dsh-tool-subagent-control | 控制后台子 agent——追加消息、打断当前轮、列出在跑的。 |
report | @deepseek-ai/dsh-tool-subagent-report | 子 agent 向父级汇报结论。仅在可继续的进程内子会话中可见。 |
job_list、job_output、job_kill | @deepseek-ai/dsh-tool-jobs | 管理所有类型的后台工作——bash、终端、子 agent。 |
workflow | @deepseek-ai/dsh-tool-workflow | 用 agent()、pipeline()、parallel() 三个原语编排多 agent 工作流。 |
ralph | @deepseek-ai/dsh-tool-ralph | 面向一个不可变目标跑前台 fresh-agent Ralph 循环,每轮开一个新的子会话。 |
这一组是 harness 里真正有野心的部分,也是外部覆盖最少的部分, 单开了一篇。
计划与目标
| 工具 | 包 | 作用 |
|---|---|---|
exit_plan_mode | @deepseek-ai/dsh-plan-mode | 把完整计划以 markdown 提交给人审批后再执行。 |
create_goal、get_goal、update_goal | @deepseek-ai/dsh-tool-goal | 带续跑轮次的持久化完成目标,支持暂停、恢复、完成、阻塞状态。 |
todo_write | @deepseek-ai/dsh-tool-todo | 会话内任务列表,状态为 pending/in_progress/completed,每次调用整体替换。 |
注意持久性上的差别。todo 是会话内的草稿状态;goal 是挂在会话上的持久目标,带阶段和轮次上限。 这不是同一个概念的两个名字。
会话历史
session_search、session_trace、session_event_read、session_event_search、
session_event_trace,全部来自 @deepseek-ai/dsh-tool-session-query。
这些是对工作区内已授权会话的只读查询。正是它们让那份只追加的 session log 不只对你有用、也对 agent 有用:agent 可以去搜索过去某次会话实际做了什么,而不是听人转述。
交互、网页、skill、调度
| 工具 | 包 | 作用 |
|---|---|---|
ask_user_question | @deepseek-ai/dsh-tool-ask-user | 暂停等待用户输入。每个问题带一个稳定 id,会在回答里回显。 |
web_search、web_fetch | @deepseek-ai/dsh-tool-web | 搜索与抓取。provider 藏在 ctx.web 服务后面,后端可替换。 |
skill | @deepseek-ai/dsh-tool-skill | 在处理匹配任务前,先加载某个 skill 的完整指令。 |
schedule_create、schedule_list、schedule_delete | @deepseek-ai/dsh-schedule | 会话内提醒,可按延迟、固定频率或绝对时间触发。 |
运行时扩展
cordis_define、cordis_run、cordis_inspect_list、cordis_inspect_query、cordis_inspect_self、
cordis_stop、cordis_undefine,来自 @deepseek-ai/dsh-tool-cordis。
它们让 agent 能在运行时定义和管理 Cordis 插件。这就是 Creator 模式背后的机制:
cordis_inspect_self 是 agent 检视自己当前所处组装的方式,cordis_define 是它在存盘之前先在内存里
试一个新组装的方式。
怎么看自己这套
上面是「存在什么」。你的 agent 实际有什么,由 mode 和 profile 叠的 bundle 决定:
dsh --profile web --dump-config每个挂载了的工具包都会作为一行出现,而每一行都能被上面的层 patch——删掉、替换、或者改配置。
常见问题
为什么我的 agent 没有这里列的某个工具?
工具是插件包,而 mode 就是这些包的一种特定组合。极简模式故意只暴露常驻 bash 和 str_replace_editor。跑 dsh --profile <名字> --dump-config 看你的 profile 实际挂载了哪些工具包。
bash 和常驻 bash 有什么区别?
普通 bash 每次调用都在全新 shell 里执行,cwd、变量、函数都不跨调用保留。常驻版本会保留这些状态。
run_code 就是 Code 模式吗?
run_code 是让 Code 模式成立的那个工具——它执行一段 TypeScript 程序体,让模型把多步操作压进一次调用,而不是多轮工具往返。