前言¶
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 循環。對於需要長鏈路、多步驟的編碼任務,這種模式比在主對話裏來回確認更直接、更可控。