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

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

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

小夜