DeepSeek Harness 外掛 vs 技能:你到底需要哪個?
外掛改變 harness 能做什麼,技能改變 agent 知道什麼。對照表、真實截圖、兩個完整例項,再加三個幫你拍板的問題。
最近更新: 2026-09-09
DeepSeek Harness 自帶兩套聽起來很像的擴充套件機制:外掛和技能。官方首頁的口號是 "everything is a plugin",但 agent 同時也會老老實實讀取你倉庫裡的 Markdown 技能檔案。把這兩者搞混,結果是要強制執行的地方寫了個技能,或者一個 Markdown 檔案就能解決的事造了個外掛。
這一頁用證據而非感覺來區分兩者:下面每張截圖都來自真實會話,並且回鏈到源影片的精確秒數;每條結論都來自這兩支影片或 DeepSeek 官方首頁原文。
技能是一個 Markdown 指令檔案 —— 通常是 .agents/skills/<name>/SKILL.md —— 作用是補充上下文:agent 會讀它、通常照著做,但沒有任何機制強制。外掛是接進 harness profile 的 Cordis 包,裝在倉庫之外:它能新增工具、替換審批策略,甚至能在工具呼叫執行前直接攔截。要引導,寫技能;要保證,造外掛。
官方定位,逐項對照
DeepSeek 官網用一句話講清了架構:"Every capability is a plugin that can be swapped or recomposed: models, tools, skills, sessions, sandboxes, storage, loops, scheduling, and the UI." 注意細讀:技能出現在"可替換物"的清單裡,而外掛是這一切的封裝單元。

在一個跑起來的例項裡,外掛以設定面板裡一排開關的形式出現 —— harness 本身就是散件交付的,每個部件都能關掉:

| 維度 | 外掛 | 技能 |
|---|---|---|
| 本質 | Cordis 包,向 harness 本體注入一種能力 —— 工具、審批策略、定時任務,甚至 UI。 | Markdown 指令檔案(SKILL.md),給 agent 補充上下文和步驟。 |
| 存放位置 | 倉庫之外:軟鏈到 ~/.dsh/profiles/<profile>/node_modules,並在 profile 的 cordis.patch.yml 裡註冊。 | 專案內 .agents/skills/<name>/SKILL.md —— 或全域性技能目錄,會話會自動拾取。 |
| 分發方式 | 走外掛目錄和 GitHub 倉庫;安裝進 profile,下次 harness 重啟時載入。 | 把檔案拷進倉庫即可 —— 立刻出現在會話的技能目錄裡。 |
| 能力邊界 | 能強制:外掛 hook 可以在工具呼叫執行前直接拒絕(同步的 ctx.tools.guard() API)。 | 只能建議:agent 通常照步驟做,但沒有任何東西強制它照做。 |
| 適用場景 | 改變 harness 能做什麼:新工具、安全護欄、審批流程、定時任務。 | 教 agent 你希望一件重複的事怎麼做:提交規範、SOP、檢查清單。 |
還是拿不準?問自己三個問題
它必須被保證,還是大機率照做就行?
如果漏一步就是事故(碰生產資料庫、破壞性 git 操作),你需要強制:外掛 hook,或者讓技能裡的某一步跑確定性指令碼。如果只是風格和流程 —— 提交資訊、spec 工作流 —— 技能就夠了。
它屬於倉庫,還是屬於這臺機器?
應該隨倉庫走、給全團隊共享的團隊約定,放進跟程式碼一起提交的技能檔案。機器層面的能力 —— 攔直連 psql、加一個定時任務工具 —— 放進裝在這臺機器 profile 裡的外掛。
一個檔案的英文說明能不能說清?
如果 Markdown 裡幾步白話就夠了,就寫技能 —— 並且讓 agent 替你起草;crash course 的博主就讓 AI 寫他的技能,因為寫得比他自己還周全。一旦需要保證執行,就升級:把那一步變成指令碼,或者做成 hook 外掛 —— 影片裡走的正是這條升級路徑。
例項一:commit 技能(寫一個技能)
在 Agentic AI crash course 裡,博主需要一個可複用的提交流程:全部提交、資訊乾淨、絕不 push。一條提示詞就產出一個技能 —— 整個過程在影片裡只花了兩三分鐘。
- 1
一條訊息把技能說清楚
提示詞要求建立一個負責 commit 的技能:不署 AI 名、資訊用簡潔的要點列表、快速檢查不該提交的東西、預設提交所有工作區檔案、絕不 push 或部署。

整個需求就是一段白話訊息 —— 沒有 SDK,沒有樣板程式碼。看原影片 15:50 - 2
agent 寫檔案並當場註冊
技能從 .agents/skills/<name>/SKILL.md 這類專案根路徑被發現。新的 commit 技能立刻出現在會話的技能目錄裡 —— 輸入框的斜槓選單能看到 agent 可呼叫的所有技能。

儲存為 .agents/skills/commit/SKILL.md —— 當場進入會話目錄。看原影片 17:00 
敲一個斜槓,目錄裡就是 agent 能呼叫的所有技能。看原影片 10:55 - 3
當成 Markdown 來讀:frontmatter、步驟、規則
生成的檔案帶 frontmatter(name、description、whenToUse),從 git status 到 verify 共六步,外加"不署名""絕不 push 或部署"這類規則。它就是個檔案 —— 隨時可以手動改。

技能就是 Markdown:frontmatter、編號步驟、規則。看原影片 18:00 
第二支影片用動畫演示同一個結構:先描述,後步驟。看原影片 10:45 - 4
把模糊步驟升級成確定性指令碼
"快速安全檢查"原本靠模型判斷,於是讓 agent 把它轉換成 scripts/check-commit-safety.sh,用退出碼錶示結論:0 安全、1 有問題、2 環境錯誤。當場實測:故意埋的 .env 檔案被 deny 規則攔下 —— 相同的 git 狀態進,相同的結論出。

模糊步驟變成了指令碼:0 安全,1 有問題,2 環境錯誤。看原影片 19:30
例項二:git-protect 外掛(造一個外掛)
同一支影片的後半段,倉庫需要一個"破壞性 git 命令永遠跑不了"的保證 —— 光靠引導不行。agent 最終造了一個外掛,整個過程把對照表裡外掛的特徵全演了一遍。
- 5
要一個 hook;批准工作區外的寫入
agent 找到了正確的擴充套件點:工具登錄檔暴露了 ctx.tools.guard() API —— 一個能在工具呼叫執行前拒絕它的同步 hook。接線需要寫到工作區之外,所以螢幕上先彈出審批對話方塊。

外掛裝在倉庫之外 —— 寫入前 agent 會先請求批准。看原影片 24:30 - 6
造了什麼:contract、profile 接線、重啟
產物是真正的程式碼:.agents/git-protect/hook/index.mjs,帶 Cordis contract(name、inject: ['tools']、apply),軟鏈進 ~/.dsh/profiles/node_modules 並通過 cordis.patch.yml 註冊。螢幕上的注意事項寫明:web profile 關閉了 HMR,外掛要等下次 harness 重啟才生效。

外掛是帶 contract 的真程式碼 —— 而且要重啟才載入。看原影片 25:00 - 7
驗證強制力
重啟之後,git reset --hard 和 git branch -D 探測都被攔下 —— 拒絕來自 hook 而不是 shell —— 而 git status、git log、git diff 正常通過,待提交的 spec.md 改動完好無損。

破壞性命令在 harness 層被拒 —— 不靠客氣。看原影片 26:30
兩者如何協作
這兩種機制是分層,不是對手。影片裡的同一個倉庫最後兩者都有:commit 技能讓每次提交都乾淨,git-protect 外掛保證破壞性命令在 harness 層就被拒絕 —— 不管對話裡說了什麼。
還有一個反方向:存在專門教 agent 造外掛的技能。入門向那支影片裡,agent 在 creator mode 搭建新外掛時載入了 cordis-plugin-development 技能 —— 用技能生產出整套架構所依賴的外掛。
The full guardrail stack is now active: the harness hook (tool-level deny), the commit skill (safety check → ignore resolution → clean local commits), and AGENTS.md policy.
crash course 影片約 26:30 處的螢幕總結
常見問題
這一頁最常被問到的問題,答案全部來自影片與官方原文。
DeepSeek Harness 的技能檔案放在哪?
專案技能放在倉庫根目錄的 .agents/skills/<name>/SKILL.md —— 影片裡的 agent 說這是專案級、會被自動發現。也支援全域性技能:第二支影片裡,他原有 Claude Code 配置中的全域性技能就被自動拾取進來了。
技能能執行工具和命令嗎?
技能本身只是指令 —— 預設 agent 會讀它並自行解釋步驟。想要可預期的結果,學 crash course 的做法:附一個指令碼(check-commit-safety.sh)讓步驟去執行它,或者把檢查綁成 hook,從"建議"升級成"強制"。
外掛能做到哪些技能做不到的事?
改變 harness 本身。外掛可以注入工具、在工具呼叫執行前拒絕它、替換審批策略、增加定時任務之類的能力;它接在倉庫之外的 profile 上,重啟時載入。技能只能給對話補充上下文。
官方對外掛和技能的定位原話是什麼?
官網首頁寫的是:"Every capability is a plugin that can be swapped or recomposed: models, tools, skills, sessions, sandboxes, storage, loops, scheduling, and the UI." 換句話說,技能是清單裡的一項能力,而外掛是這一切(包括技能)的出廠封裝單元。
我從 Claude Code 遷移過來,技能還能用嗎?
基本能用:技能就是純 Markdown。crash course 提到,倉庫裡已有的本地技能 harness 應該能直接讀;第二支影片裡 Claude Code 的全域性技能也被自動拾取了。外掛是例外 —— 它繫結 Cordis,需要為 DeepSeek Harness 重新構建或安裝。
為什麼我的外掛沒有馬上生效?
因為 web profile 關閉了 HMR,新接線的外掛要等下次 harness 重啟才生效 —— 影片裡的注意事項原話就是這麼說的。驗證方法:讓 agent 跑一條該外掛應攔截的命令,你應該看到 hook 拒絕而不是 shell 結果。
相關攻略
分清要用哪個之後,接著讀這些。
dsh 外掛是什麼?
dsh 外掛到底是什麼、能改動什麼、外掛樹如何組裝。
閱讀教學外掛開發入門教學
Cordis 外掛怎麼寫、怎麼發布、怎麼進目錄 —— 附官方錨點。
閱讀教學安全地安裝外掛
dsh 裡「安裝外掛」到底發生什麼,附一套第三方程式碼審查清單。
閱讀教學Profile、Patch 與 Preset
一個 dsh 行程如何由層層設定組裝而成 —— 以及怎麼把它調成你的形狀。
閱讀教學寫了新的 dsh 外掛?把它提交到 dsh 外掛市集。
幫倉庫加上 dsh-plugin topic,並向我們的 awesome-dsh-plugins 清單提交 PR —— 本 dsh 外掛市集會自動從中同步。
閱讀教學來源與署名
本頁所有截圖來自這兩支影片攻略,每張圖都深鏈回它被擷取的精確秒數。上面的文字講解是我們自己寫的。
