DeepSeek 在 2026 年 8 月 13 日開源 DeepSeek Harness。到 8 月 24 日,GitHub 已經累積約 19.2 萬個 Stars。
但 Star 成長得快,不等於我們已經看懂它為什麼重要。DeepSeek Harness 目前仍是 developer preview,官方也明確提醒未來可能出現 breaking changes。
真正值得研究的,不是它現在有多熱門,而是它把一個 AI Agent 背後經常被混在一起的責任,拆成了一套可以替換、追蹤與重組的 runtime。
為了真正理解這套架構,我做了 Learn DeepSeek Harness:使用 Python 標準函式庫,分成 4 個 Phase、14 個 Section,從零重建一個最小但可以運作的 Mini-dsh。
這篇文章想分享兩件事:DeepSeek Harness 的核心概念,以及我如何把一個龐大的 TypeScript codebase,轉成一條可以動手驗證的學習路徑。

最常見的簡化方式,是把 Agent 描述成「模型反覆呼叫工具的迴圈」。
這個說法沒有錯,但只描述了 happy path。
模型可以提出下一步,Harness 才負責讓這一步在真實環境中變成可執行的行動。它必須回答:
因此,DeepSeek 官方用一個很精準的等式描述它:
Agent = Model + Harness
模型決定推理能力的上限,Harness 則決定這個能力能否安全、持續、可觀察地作用在真實世界。
DeepSeek Harness 最醒目的設計理念是 Everything is a Plugin。
Model、tools、skills、sessions、sandboxes、storage、loops、scheduling,甚至 UI 都是 plugin。
不過,plugin 並不只是「把功能拆成很多模組」。
如果模組只能安裝,不能安全卸載;可以替換 provider,卻無法保留狀態與追蹤執行;可以新增工具,卻沒有統一的 guard pipeline,那仍然只是一組鬆散的擴充點。
我把這套架構整理成四個不能互相取代的面向:
| 面向 | DeepSeek Harness 的做法 | 解決的問題 |
|---|---|---|
| 生命週期 | Cordis plugin、fiber、effect、可反向撤銷的註冊 | Plugin 卸載或熱重載後,不留下失效的 listener 與 service |
| 執行 | Turn、step、agent loop、tool scheduler、inbox | 輸入何時被認領、工具如何平行或互斥、工作如何繼續 |
| 控制 | Event、guard、approval、permission、capability seam | 誰能觀察、改寫、允許或拒絕一次行動 |
| 真相 | Append-only session log、surface、projection | 如何恢復、重播、壓縮上下文,並讓不同介面共享狀態 |
這四個面向都重要,但不能互相代替。
多加一個 tool registry,不會自動得到可恢復的 session;有 agent loop,也不代表拒絕與錯誤已經被正確結算;把 class 命名為 plugin,更不代表它真的可以安全卸載。
DeepSeek Harness 是一個大型 TypeScript monorepo,底層還建立在 Cordis plugin framework 上。
直接閱讀原始碼,很容易遇到三個問題:
所以 Learn DeepSeek Harness 不照 package 名稱逐一翻譯,而是每次只回答一個設計問題,並加入一個可以獨立驗證的 Mechanism。
整份教學固定使用同一個閱讀 Lens:
專案固定研究 dsh 0.1.0-rc.7 的 commit 99f6f02。
即使上游持續快速變動,文章裡的每個原始碼連結仍然可以復核,不會因為 main branch 更新而失去對應關係。
每個 Section 還採用 Carry-forward:完整複製前一章的 src/,只加入一個新 Mechanism。
因此比較相鄰兩個 Section,diff 就是這一章真正新增的概念,不會混入重構或無關改動。
最後,每章都有一組 deterministic Offline check。它們不需要 API key、不需要網路,也不依賴模型輸出的運氣。目前 14 個 Section 的檢查都能獨立通過。
需要觀察真實模型行為的章節,才另外提供可選的 Live demo。
在 Mini-dsh 中,每次註冊 listener 或 service,都必須同時產生一個撤銷動作,交給擁有該 plugin 的 fiber。卸載時,framework 會依相反順序執行這些動作。
這讓「清理」不再依賴每個 plugin 作者記得手寫完整的 cleanup()。
同一套基礎也能支撐 profile 切換、HMR、測試收尾與 subagent 關閉。
對我來說,這才是 Everything is a Plugin 最重要的前提:每一次註冊都必須知道由誰擁有,也必須可以撤銷。
一般實作常直接維護一份 messages 清單,但 model、持久化與 compaction 其實需要三種不同視圖。
DeepSeek Harness 把 session 設計成 append-only event log。所有發生過的事情只追加,不回頭修改;模型真正看到的歷史,則從 log 的 surface 動態推導。
這樣一來,streaming chunk 可以保留供重播,卻不會污染 model history;compaction 可以替換 surface 的一段投影,卻不必刪除原始事件;Web、CLI 與恢復流程,也可以從同一份 log 建立自己的 projection。
一次 tool call 不是直接從 registry 跳到 function。
它會經過 pre、ask、guard、execute、post 等階段,再交給 scheduler 判斷哪些可以平行、哪些必須互斥。
其中一個很重要的設計是:就算呼叫被拒絕、被取消或執行失敗,仍然要產生正常的 tool/result。
否則 model history 會留下沒有結果的 tool call,下一步推理就建立在一段不完整的協定上。
錯誤不只是 exception,它也是 agent 必須看見並處理的狀態。
前面所有 plugin 最終會被整理成一份 entry 清單。Bundle、profile 與使用者 patch 依序疊加,決定一個 runtime 實際掛載哪些能力。
DeepSeek Harness 的 patch 不做 deep merge,而是用 id 指定 entry,整份替換 config。
這犧牲了一點簡短,卻換來更清楚的責任邊界:最後修改該 entry 的那一層,就包含完整真相,不必回放所有上游設定才知道某個欄位從哪裡漏進來。
到了這一步,Web 與 headless 不再是兩套程式。它們是同一批 plugin 的不同組合,產品差異變成一份可讀、可 diff、可替換的資料。
| Phase | Sections | 學到什麼 |
|---|---|---|
| Foundation | Setup、Kernel、Session log、Compaction | Provider-neutral message、可逆生命週期、事件真相與上下文投影 |
| The Loop | Agent loop、Tools、Scheduler、Inbox、System prompt、Skills | Turn/step 狀態機、工具管線、平行調度、介入時機與按需載入 |
| Capabilities | Capability seams、Jobs、Subagent | Definition/Provider/Consumer、背景工作所有權與具名委派 |
| Composition | Composition | 用 bundle、profile 與 patch 把整套 Harness 組成產品 |
如果你想真正吸收這套架構,而不只是把範例跑完,我建議:
src/,觀察這一章唯一增加的機制。你可以從單一章開始,也可以一次跑完所有檢查:
git clone https://github.com/hardness1020/learn-deepseek-harness.git
cd learn-deepseek-harness
python sections/01-kernel/src/test.py
DeepSeek Harness 最值得學的,不是「plugin 越多越好」,而是它如何把 agent runtime 拆成可逆的生命週期、可結算的執行、可介入的控制,以及可重播的真相。
這些能力不能互相取代。
Agent loop 讓模型繼續工作,session log 讓系統知道發生過什麼,tool pipeline 讓行動可以被治理,composition 才讓同一套機制組成不同產品。
如果你也在打造 AI Agent,希望這個專案能幫你少走一點只看 happy path 的路,並把 DeepSeek Harness 的設計轉成能帶回自己系統的架構能力。