前言¶
DeepSeek Harness(DSH)的设计目标是「边聊边做」,适合交互式的编码场景。但对于一次要改十几个文件、需要反复读代码再改的重构,或者需要自己跑测试、看失败再修的长循环,DSH 自身的工具循环显得不够直接。这类任务更适合交给一个独立 agent 整段跑完,而不是每一步都在主对话里来回确认。
dsh-claude-code-sdk 插件通过官方 Claude Agent SDK,把自包含的编码任务委派给本机的 Claude Code 执行,结果回传给 DSH。DSH 当 leader,Claude Code 当 worker。
这是什么¶
wanwulizhi 维护的 DSH tool plugin,通过 @anthropic-ai/claude-agent-sdk 的 query() 调用本机 Claude Code,并把当前 DSH 对话历史注入到任务上下文中。worker 实际调用过的工具(Write、Bash、Grep 等)不会进入外层 DSH 会话的上下文,主对话不会被中间过程撑爆。
插件目标宿主是 DSH 0.2.x(@deepseek-ai/dsh-tools >= 0.2.0-rc.2),需要 Node.js >= 22.19.0。
核心功能¶
- 委派编码任务:通过
claude_code工具把任务交给 Claude Code 执行 - 对话历史注入:把当前 DSH 会话的最近 20 条消息(最多 12000 字符)注入到 worker 上下文
- 结构化结果返回:最终文本、
sessionId、token 用量、实际调用过的工具列表 - 多轮续接:通过
resume参数传回sessionId,让 Claude Code 记得上一轮读过的文件 - 默认工具白名单:包含 Bash、PowerShell、Read、Write、Edit、Glob、Grep、WebFetch、WebSearch
安装与启用¶
前提¶
- DSH 0.2.x(
@deepseek-ai/dsh-tools >= 0.2.0-rc.2) - 本机已安装并登录 Claude Code(
claude能跑起来) - Node.js >= 22.19.0
安装方式¶
收录到 awesome-dsh-plugin 后,可在 DSH 的「设置 → 插件」里搜索安装,或:
dsh plugin --profile web add dsh-claude-code-sdk
本包目前只提供源码,安装时会克隆仓库并拉取对应平台的 Claude Agent SDK 二进制(约 280 MB)。
验证安装¶
在 DSH 里发一句:
用 claude_code 工具执行:task = "只回复两个字:正常"
返回「正常」即通。如果工具没出现,先确认 DSH 是否重启了——插件在启动时装载,改完配置不重启不生效。
典型用法¶
点名调用¶
用 claude_code 工具执行:task = "在 D:\proj 下把 utils.js 里的 callback 写法改成 async/await,改完跑 npm test 确认通过"
只说意图,让技能接管¶
让 Claude Code 去重构 src/parser.js,拆成三个函数,保持现有测试全绿
插件注册的 claude-code-delegation 技能会告诉模型什么时候该派活、任务该怎么写、结果怎么质检。
多轮迭代¶
第一次调用返回里有 sessionId。第二轮把它作为 resume 传回去,Claude Code 记得上一轮读过的文件,不用重新读一遍:
用 claude_code 继续上次 sessionId=76ab34e8-... 的工作,把刚才那两个测试失败修掉
任务描述怎么写¶
Claude Code 只能看到任务文本 + 注入的对话历史,看不到文件内容、也看不到 DSH 的工具输出。所以任务里要写清四件事:
- 目标:一句话说清交付什么
- 文件:相关文件的绝对路径(派活前先自己 grep 摸清结构,把结论写进去)
- 约束:构建/验证命令、禁止事项、风格要求
- 验收:做到什么算完成
对比:
❌ 把上面那个文件改一下
(不知道"上面"是哪个,也不知道要改成什么)
✅ 把 D:\proj\src\utils.js 里的 debounce 函数改写成支持 cancel 方法。
要求:保持现有导出名不变,不引入新依赖,改完执行 npx vitest run utils 确认通过。
工具 claude_code¶
参数¶
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
task |
string | ✅ | 完整、自包含的任务描述 |
cwd |
string | 工作目录。默认取配置值,再退到 DSH 进程目录 | |
model |
string | 本次覆盖模型(sonnet / opus / haiku 或完整 id) |
|
permissionMode |
string | default / acceptEdits / bypassPermissions / plan / dontAsk |
|
maxTurns |
integer | 本次最大 agentic 轮数 | |
allowedTools |
string[] | 预授权的内置工具(白名单放行,不是限制) | |
resume |
string | 上次返回的 sessionId,续接同一会话 |
|
effort |
string | 思考强度 low / medium / high / xhigh / max |
|
maxThinkingTokens |
integer | 思考 token 预算 | |
includeHistory |
boolean | 是否注入 DSH 对话历史,默认取配置值 |
返回¶
{
"ok": true,
"output": "最终文本",
"sessionId": "76ab34e8-0069-4c2c-9a5b-33ee5ac8c812",
"costUsd": 0.0700,
"inputTokens": 12020,
"outputTokens": 2,
"toolsUsed": ["Write", "PowerShell"]
}
toolsUsed 是 worker 实际调用过的工具名集合,可以用来判断它有没有真的动手(而不是只回了一段话)。
渲染到对话里时只显示 output,不显示金额和 token 数。
配置¶
默认值写在插件自带的 cordis.patch.yml。要覆盖就在 profile 的 cordis.patch.yml 里按 id 改:
- id: claude-code-sdk
config:
model: sonnet
permissionMode: acceptEdits
maxTurns: 100
timeoutMs: 600000
effort: high
cwd: '/path/to/project'
allowedTools: [Bash, PowerShell, Read, Write, Edit, Glob, Grep]
includeHistory: true
historyMaxMessages: 20
historyMaxChars: 12000
# 可选:指定某个 claude 可执行文件;留空则由 SDK 解析自带的 CLI
pathToClaudeCodeExecutable: '/path/to/claude'
字段一览¶
| 字段 | 默认值 | 说明 |
|---|---|---|
model |
sonnet |
模型别名或完整 id |
permissionMode |
acceptEdits |
权限模式 |
maxTurns |
100 |
单次委派的最大 agentic 轮数 |
timeoutMs |
600000 |
工具级超时(10 分钟) |
cwd |
未设置 | 工作目录 |
allowedTools |
见下 | 预授权工具白名单,默认 Bash, PowerShell, Read, Write, Edit, Glob, Grep, WebFetch, WebSearch |
pathToClaudeCodeExecutable |
未设置 | 留空时由 SDK 解析自己捆绑的 CLI |
effort |
high |
思考强度 |
maxThinkingTokens |
未设置 | 思考 token 上限,与 effort 二选一即可 |
includeHistory |
true |
是否注入 DSH 对话历史 |
historyMaxMessages |
20 |
最多注入最近多少条消息 |
historyMaxChars |
12000 |
注入历史的字符预算 |
工具参数与配置同名时,工具参数优先(args.x ?? config.x)。注意空数组不会被默认值覆盖——[] 是有效值,?? 只对 null / undefined 生效,所以显式传 allowedTools: [] 就是”什么都不预授权”。
权限模型¶
这是最容易踩坑的地方。SDK 在非交互模式下运行时,没有 canUseTool 回调去问人。当 permissionMode 是 acceptEdits 时:
- 文件编辑(
Write/Edit)→ 自动批准 - 其余工具(
Bash/PowerShell等)→ 直接拒绝,返回requires approval,命令根本不执行
模型看到拒绝后通常会重试几次,最后耗尽 maxTurns 报错。表现为”卡了很久然后失败”,而不是明确的权限错误。
同一台 Windows 机器,同一个任务「执行 node --version 并把原始输出回报」:
| 配置 | 结果 |
|---|---|
acceptEdits,allowedTools 为空 |
命令未运行;worker 回复「该命令需要你批准才能执行」;反复重试至 36 秒后报 Reached maximum number of turns (6) |
acceptEdits + allowedTools: [Bash, PowerShell] |
9.6 秒返回 v22.22.2 |
bypassPermissions |
9.4 秒返回 v22.22.2 |
结论:allowedTools 留空等于让 worker 只能改文件、不能跑命令。建不了项目、跑不了测试、执行不了 git,实际干不了活。
本插件的默认选择是把 shell 与读写检索工具放进默认白名单:
["Bash", "PowerShell", "Read", "Write", "Edit", "Glob", "Grep", "WebFetch", "WebSearch"]
这比开全局 bypassPermissions 保守:文件编辑照旧自动批准,shell 显式放行,其他工具仍然拒绝。
适用场景与注意¶
适合需要独立 agent 循环执行、中间过程不需要暴露给主对话的任务。例如:
- 一次要改十几个文件、需要反复读代码再改的重构
- 需要自己跑测试、看失败、再修的长循环
- 你希望”派出去干完再回来”,而不是每一步都在主对话里来回确认
注意:插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。
结语¶
dsh-claude-code-sdk 通过官方 Claude Agent SDK,把 DSH 的任务委派交给本机 Claude Code,让两者各司其职:DSH 负责 review 和验收,Claude Code 负责完整的 agent 循环。对于需要长链路、多步骤的编码任务,这种模式比在主对话里来回确认更直接、更可控。