一切皆插件:官宣與源碼對照
發佈文裏説的四種模式、插件生態,在 deepseek-harness 倉庫裏面對應邊個檔案?本課一條條對上。
下面的演示把四份插件清單做成了可切換的面板。點上面四個模式按鈕,看插件卡片怎麼亮、怎麼滅:綠色是新增,紅色是移除,琥珀色是同名但配置變了。底部字幕會告訴你每一步發生了什麼。先玩明白,後面講的思路都在這塊面板裏演過一遍。
它解決什麼問題。想像你在用一個單體架構的 Agent 產品,想換掉它的會話日誌格式。你得 fork 倉庫,在幾十萬行源碼裏找到日誌實現,改完重新構建,之後官方每發一版你都要重新合併一次補丁。這還只是日誌這種邊角能力,要是想換 agent loop 主循環,基本等於重寫產品。能力和產品源碼焊死在一起,任何深度定製都會變成長期維護負擔。
思路是什麼。DSH 把內核縮到最小。vendor 進倉庫的 Cordis 框架只做三件事:把插件裝進共享上下文、把插件卸下來、把每次註冊記成可逆的副作用,插件卸載時自動回滾。業務邏輯一行都沒有。然後所有能力搬進 packages/,49 個分組、219 個包,全部以插件形式存在:模型適配器是插件,工具是插件,會話日誌是插件,連 agent loop 主循環本身也是插件。根 AGENTS.md 第 3 行用加粗英文寫着「everything is a plugin」。官方文檔的原話:
Cordis 是 dsh 底層的框架:插件向共享上下文貢獻服務、類型化事件和可逆的副作用。產品的每一部分都是插件,包括模型適配器、工具註冊表、會話日誌,以及 agent loop(智能體循環)本身,因此每一部分都可以從配置替換。
不存在需要打補丁的特權內核:擴展 dsh 的方式是把插件掛載到其他插件旁邊,而各項註冊都是副作用,會在其插件卸載時撤銷。
docs/architecture.zh.md · 第 11、13 行想給 DSH 加能力,也不用碰它的倉庫。樹外(out-of-tree,指官方倉庫之外的)插件用 dsh plugin --profile <name> add <package> 裝進 profile,運行時掛載,卸載時註冊的副作用自動回滾。README 還約定插件倉庫統一打 dsh-plugin 話題標籤,方便互相發現。發佈文邀請大家共建生態,機制是現成的。
為什麼長期成立。微內核思想比這份程式碼老得多。操作系統課上的 Mach 和 L4,瀏覽器的擴展體系,VS Code 的插件生態,走的都是同一條路:變化快的能力放外圈,幾乎不變的裝卸機制放核心。DSH 明年把 agent loop 重寫一遍,Cordis 的裝卸邏輯一行不用動;換個語言把整個 harness 再寫一遍,這個分層照樣管用。所以記這門課的結構比記它的程式碼划算,程式碼只是這個思路的某一版實現。
它解決什麼問題。多數產品的模式是硬編碼的:程式碼裏散着一堆類似 if (mode === 'lite') 的分支,模式數量在寫程式碼的那一刻就定死了。想新增一個模式,要改程式碼、過測試、等發版;想微調某個模式裏的一個能力,還是這套流程。用戶更沒得選,只能在官方給的幾個套餐裏挑。
思路是什麼。DSH 裏一個模式就是 apps/cli/config/agent-presets/ 下的一個目錄,目錄裏兩個文件。preset.yml 只有 3 行,管 UI 上的展示名和排序;agent.cordis.yml 是插件清單,啓動時 Cordis 照着清單逐行掛載,輸出一個組裝好的 Agent。切換模式就是換一份清單重新組裝,源碼裏沒有任何模式分支。四種模式的差異,看四張卡就夠了:
標準模式
agent-presets/standard/ · 251 行- 給誰用
- 日常寫程式碼的人,這是預設檔。
- 與其他模式的關係
- 它就是基準:23 個插件全開(macOS 視角),文件編輯、shell、檢索、計劃、子代理、工作流都在。其餘三個模式全部描述成對它的加減。
- 背後的思路
- 先定義一個能力齊全的參照系,別的組合才有資格用一句話説清自己。
PTC 模式
agent-presets/code/ · 262 行- 給誰用
- 跑多步長任務、嫌一次一個工具調用往返太慢的人。
- 比標準多了什麼少了什麼
- standard 一行不動,末尾多掛一個 tool-presentation,配置
mode: code。模型改寫一段 TypeScript 小程式,run_code 一次執行原本要五次往返的操作。 - 背後的思路
- 改的只是工具的呈現方式,能力本身沒變,所以差異只配擁有一行。
極簡模式
agent-presets/minimal/ · 62 行- 給誰用
- 跑模型基準測試的人。
- 比標準多了什麼少了什麼
- 只剩 6 個插件。persona 一句話寫死(
complete: true,別的插件想追加提示詞也加不進去),工具只有持久 bash 和 str_replace_editor,沒有 compaction(上下文壓縮)。 - 背後的思路
- 把 harness 的變數排乾淨,剩下的表現就是模型本身。
創造模式
agent-presets/cordis/ · 262 行- 給誰用
- 想讓 Agent 造 Agent 的人。
- 比標準多了什麼少了什麼
- standard 全套之上加 tool-cordis 工具集、一個教組合寫法的 skill,persona 也換了版本。Agent 能在運行時檢查並掛載自己的插件,寫出的組合能存成新 preset。
- 背後的思路
- 組裝器自己也是插件,所以能開放給 Agent 用。文件頭註釋提醒把這個模式的會話當 shell 權限對待。
順帶點破一個營銷詞。code/preset.yml 第 1 行寫 name: PTC 模式,但目錄叫 code,源碼註釋和文檔裏這套機制叫 Code Mode,全倉庫找不到名為 PTC 的實現。PTC 只活在 UI 文案層,跟人聊源碼時説 Code Mode 才對得上號。
為什麼長期成立。這條思路有個通行的名字,配置即架構:把系統之間的行為差異收斂進一份聲明式清單,架構問題就降維成文本問題。想知道兩個模式差在哪,diff 兩份 YAML;想造新模式,複製目錄改幾行;出了問題,回滾清單就行。Kubernetes 用 YAML 聲明集羣,Docker 用 Dockerfile 聲明鏡像,同一個思路在不同層面反覆出現。DSH 的插件實現哪天全部重寫,清單這層抽象照樣成立。
一切皆插件的價值放到同行裏才看得清。同一個問題,想給 Agent 加一個新能力,需不需要動它的倉庫源碼,三家給出三種答案:
DSH:插件樹
不需要改倉庫能力就是一個樹外 npm 包。dsh plugin --profile <name> add <package> 裝進 profile,運行時掛載,卸載時註冊副作用自動回滾。模式級差異也只是 YAML 裏增刪幾行。
出處:packages/bundle/README.zh.md 第 13 行;docs/architecture.zh.md 第 13 行
Claude Code:產品單體
看情況還原源碼是一棵 TypeScript 單體源碼樹(restored-src/src/,入口 main.tsx),改內建功能要動產品源碼。對外留了 hooks、MCP、Skills 這些擴展口,能加工具和攔截點,換不掉會話日誌這類深層實現。基於已公開證據(還原源碼目錄結構)。
Grok Build:Cargo Workspace
需要改倉庫根 Cargo.toml 的 members 陣列列了 79 個 workspace 成員(本地計數),能力按 crate 切分、編譯期組合。新增能力要新建 crate、改根清單、重新編譯。切分細節見 12-1 · 79 個 Workspace 成員如何組成產品。
三家沒有絕對優劣。Grok 用編譯期組合換 Rust 的類型和性能保證,Claude Code 用單體換產品迭代速度,DSH 用插件樹換運行時可拔插。只是如果你想要一個可替換、可審計的運行時,DSH 是三家裏唯一讓第三方無需 fork 倉庫就能替換深層能力的。
從清單推演行為差異
把 standard/agent.cordis.yml 裏 id: compaction 的整個 group(第 137 至 155 行)刪掉,得到的會話和極簡模式在上下文壓力下的表現是否等價?再對照 minimal/agent.cordis.yml 的 persona 三個字段(第 8 至 13 行),説出除了壓縮之外還差哪兩點。