dsh-claude-code-sdk:把 DSH 任务委派给本机 Claude Code

前言

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 的工具输出。所以任务里要写清四件事:

  1. 目标:一句话说清交付什么
  2. 文件:相关文件的绝对路径(派活前先自己 grep 摸清结构,把结论写进去)
  3. 约束:构建/验证命令、禁止事项、风格要求
  4. 验收:做到什么算完成

对比:

❌ 把上面那个文件改一下
   (不知道"上面"是哪个,也不知道要改成什么)

✅ 把 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 循环。对于需要长链路、多步骤的编码任务,这种模式比在主对话里来回确认更直接、更可控。

目录页 | GitHub

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜