AI 開發

DeepSeek Harness 到底改變了什麼?從 AI Agent Framework 到下一代 Coding Agent 基礎設施

閱讀約 15 分鐘

2026 年 8 月,DeepSeek 開源了 DeepSeek Harness(dsh)。它不是新模型,也不是又一個 LangChain 式鏈式 API。官方把 Agent 拆成兩半:模型是靈魂;Harness 是讓模型看見環境、呼叫工具、持續幹活的一切。本文講清這一刀切在哪裡——以及為什麼 JSON Schema、Session 事件與配置樹,突然比再寫一段更長的 prompt 更重要。

閱讀前速覽

層級 一句話 你維護什麼
Agent Framework 在應用程式碼裡編排 prompt、工具與步驟 Python / TS 呼叫圖
Agent Harness 把工具、檔案系統、沙箱、迴圈掛成可替換外掛的執行時 Profile / Bundle / SessionEvent
DeepSeek Harness 基於 Cordis 的 MIT 開源 dsh:Everything is a Plugin ctx.* 服務 + JSON 工具 Schema

先記住分層:Framework 賣的是鏈條;Harness 賣的是可替換宿主。模型會換,Seam 與 JSON 契約應該先穩定。

DeepSeek Harness 是什麼?

DeepSeek Harness(命令列入口常寫作 dsh)是 DeepSeek 官方開源的 Agent Harness:把大模型接到檔案系統、終端、網路等真實環境,並驅動它持續工作。核心口號是 Everything is a Plugin——模型介面卡、工具、會話、儲存、沙箱、排程、UI,全部由外掛組裝。

它明確不是:

  • 新模型:同日釋出的 DeepSeek V4 系列是模型層;dsh 是模型之外的那一層。
  • 單純 API 客戶端:它管的是迴圈、許可權、會話回放,而不只是發 HTTP。
  • 又一個「萬能 Agent 類」:沒有把一切塞進一個上帝物件;職責拆在 core/session、core/tools、core/agent-loop 等包裡。

若你還在把「聊天機器人」和「能跑完多步工作流的執行時」混為一談,先讀 AI Agent 完整指南。Harness 討論的是後者的宿主形態。

從 AI Agent Framework 到 Harness,到底換了什麼?

過去兩年,多數團隊說的「Agent Framework」是:用鏈式 / 圖式 API 把 prompt、工具、記憶串起來,再在應用程序裡跑一個 Agent Loop。產品邊界在你的業務倉庫;換模型、換沙箱、換審計,往往意味著改核心類。

Harness 把問題倒過來:預設假設沒有需要打補丁的特權核心。擴充套件方式是掛載外掛;解除安裝時,註冊的服務與副作用一起回滾。官方文件寫得很直白——換模型就換介面卡,加工具就註冊進統一工具系統,本地執行改遠端沙箱就替換 FS / 程序 / 終端 Provider,甚至可以替換整個 Agent Loop,而不重寫產品。

  • 特權核心 → 外掛樹:能力以副作用註冊進共享 Context,而不是繼承一個 BaseAgent。
  • 聊天記錄 → Session Log:模型看見的一切必須能從日誌重建,而不是隻剩最終氣泡。
  • 硬編碼沙箱 → Capability Seam:介面、實現、面向模型的工具分三角色,可整層替換。
  • Prompt 當產品 → 配置組合:Profile / Bundle / cordis.patch.yml 決定執行時形狀。

這一刀切的是「誰擁有執行時」。Framework 時代,執行時通常是業務程式碼的附屬品;Harness 時代,執行時本身是可分發、可審計、可替換的基礎設施。

Everything is a Plugin:Cordis 微核心

dsh 建在 Cordis 之上。執行中的 dsh 本質上是一個 Cordis Context:外掛向共享上下文貢獻服務、型別化事件與可逆副作用。掛載即生效,解除安裝即回滾——這直接帶來可觀察與可回放。

部署差異優先寫進配置組合,而不是堆一堆 if env == prod。例如用 patch 換模型並掛一個倉庫搜尋工具:

# cordis.patch.yml — swap model + add a tool
plugins:
  - name: llm/deepseek
    config:
      model: deepseek-v4-pro
  - name: tools/my-repo-search
    config:
      root: ./src

對工程團隊,這意味著:產品釋出物變成「一組有序 Bundle + 補丁」,而不是「某個不可 fork 的巨型 Agent 類」。外掛熱替換與 HMR 也因此成為一等公民,而不是演示彩蛋。

Capability Seam:換後端而不換產品

dsh 把可替換能力叫作 Capability Seam(能力接縫)。一條完整 Seam 通常三角色齊全:

  1. Service Definition:宣告「執行命令 / 讀寫檔案」是什麼。
  2. Service Provider:本地程序、遠端容器或企業執行平臺的具體實現。
  3. Consumer:通常是面向模型的工具,把能力投影成 Schema 與結果物件。

以 Bash 為例:介面定義「跑命令」,本地 Provider 真正 spawn 程序,工具包負責把能力變成模型能理解的引數與返回值。檔案系統與程序 Provider 共享同一執行世界——指向遠端沙箱時,Bash、PTY、LSP 一起搬家,而不必給每個工具寫遠端分支。

面向模型的那一層,仍然是 JSON Schema 形狀的工具定義。例如編輯器工具:

{
  "name": "str_replace_editor",
  "description": "Edit a file by exact string replacement",
  "inputSchema": {
    "type": "object",
    "properties": {
      "path": { "type": "string" },
      "old_str": { "type": "string" },
      "new_str": { "type": "string" }
    },
    "required": ["path", "old_str", "new_str"],
    "additionalProperties": false
  }
}

這一層和 MCP Tool Schema vs Function Calling、AI 為什麼需要 JSON Schema 是同一條紀律:倉庫裡一份口徑,再投影到 Function Calling 的 parameters 或 MCP 的 inputSchema。Harness 不消滅 Schema,它把 Schema 放進可替換的工具登錄檔。

Session Log:模型看見的,就是記錄下來的

Coding Agent 翻車時最痛的問題是:當時模型到底看見了什麼?工作區注入、工具結果截斷、中途改路由、使用者打斷——如果只存最終聊天文字,這些全丟了。

dsh 的硬約束是:模型可見輸入必須能從 Session Log 重建。使用者訊息、環境上下文、請求後設資料、流式輸出、工具呼叫與結果、壓縮事件、許可權切換、取消原因,都以 append-only 事件進入會話流。例如一條工具結果事件:

{
  "type": "tool/result",
  "tool_call_id": "call_7f2a",
  "name": "bash",
  "ok": true,
  "content": {
    "stdout": "passed 12",
    "exit_code": 0
  },
  "ts": "2026-09-11T06:12:04.221Z"
}

持久化本身仍是外掛(JSONL / SQLite)。Resume 從原會話繼續,Fork 從歷史邊界衍生。除錯時,把 SessionEvent 格式化,再和上週能跑通的軌跡做 JSON Diff——這比「再試一次 prompt」更接近生產工程。

Profile、Bundle 與 Turn / Step

一次啟動是一層層疊出來的外掛樹:

  • Profile:命名的執行時組合(如 web、headless),帶自己的 Bundle 列表與 cordis.patch.yml。
  • Bundle:可分發的外掛組合;按 Profile 順序疊加,再套使用者與命令列補丁。
  • Turn:一次完整任務輪次,可含多個 Step。
  • Step:單次模型請求及其觸發的工具呼叫;agent/* 事件可在請求前改寫、攔截、審批。

工具執行也不是「有函式名就調」:前置策略、不可逆安全門、執行、後處理、內容清理、結果通知都可掛鉤。只讀任務可並行;碰到會改狀態或安全性不明的呼叫,就當屏障序列。這是基礎設施級排程,不是 demo 裡的 for 迴圈。

四種執行模式:同一宿主,不同工具面

Web UI 提供四種 Agent 預設。它們共享同一個 Harness 宿主,但為當前會話組裝不同的工具、提示與能力:

模式 要點
Standard 最完整的通用 Coding Agent:編輯、Shell、檢索、Skills、規劃、子 Agent、工作流。
Code 保留 Standard 能力,但經 Code Mode SDK 把多步操作編成一次 run_code,減少來回。
Minimal 只留持久 Bash 與 str_replace_editor,縮小選擇與上下文負擔。
Creation 可自省 Cordis 外掛樹、臨時掛載外掛——高信任高階入口,不進預設三模式。

Creation Mode 是「Everything is a Plugin」的極端表達:Agent 可以觀察甚至修改自身執行時。生產預設應 fail closed,而不是一上來就開自指工具。

為什麼說這是「下一代 Coding Agent 基礎設施」?

Coding Agent 要改倉庫、裝依賴、起程序,許可權一開就是生產事故面。dsh 把安全當成基礎設施:預設拒絕、策略可掛鉤、執行世界可整體遷到沙箱。對團隊而言,「下一代」意味著四件事同時成立:

  • 可替換:模型、沙箱、UI、迴圈都能換,不必 fork 整倉。
  • 可回放:Session Log 讓評測、審計、事故覆盤有物件可 Diff。
  • 可組合:Profile / Bundle 把部署差異收成配置,而不是分支爆炸。
  • 可校驗:工具引數與工具結果仍是 JSON Schema 口徑,宿主側繼續門禁。

這和「多寫幾句 system prompt」不是同一條路。把工具與工作流狀態收成 Schema,再讓 Harness 掛載執行——細節見 JSON Schema 與 AI Agent 工作流。模型會換代;基礎設施應該先穩住介面。

和傳統 Agent Framework 怎麼對比?

不是誰好誰壞,而是你在買哪一層:

維度 典型 Agent Framework DeepSeek Harness
擴充套件方式 繼承 / 回撥 / 鏈式節點 掛載外掛;解除安裝回滾副作用
可觀測性 常依賴應用日誌與最終對話 SessionEvent 流;模型所見可重建
換執行後端 多為每個工具改實現 換 Provider,工具面跟隨 Seam
產品邊界 業務倉庫裡的編排程式碼 可分發的執行時 + 配置樹

你仍可以在 Harness 之上寫業務 Agent;只是不要再把「業務編排」和「宿主基礎設施」糊成一團。

常見誤區

  • 把 dsh 當成新模型。 模型是 V4;Harness 是宿主。混談會導致採購與評測完全錯位。
  • 為加一個工具 fork 整倉。 正確路徑是寫外掛並掛進 Profile / patch。
  • 跳過 Schema 校驗。 Harness 管執行管道,不替你免除 arguments 二次解析與校驗。
  • 忽略 Session Log。 沒有事件流,就沒有可復現的 Coding Agent。
  • 在不信任環境開 Creation Mode。 自指改執行時屬於高信任能力,預設應關閉。

FAQ

DeepSeek Harness 是在對標 Claude Code 嗎?

公開招聘與早期敘述裡確實對標過 Coding Agent 體驗。開源後的定位更寬:可組合的 Agent 執行時基礎設施,而不只是單一 IDE 產品。

必須用 DeepSeek 模型嗎?

預設深度適配 DeepSeek 模型,但架構上模型是介面卡外掛。換介面卡是一等操作;是否覆蓋你的廠商,看當前外掛生態與你自己的實現。

不會 Cordis 還能用嗎?

可以用 npx @deepseek-ai/dsh web 先跑 Web UI。要深度擴充套件(新 Seam、新工具、新 Profile),就需要理解 Cordis 的掛載與配置樹。

這和 JSON / JSON Schema 有什麼關係?

工具定義、工具結果、SessionEvent、配置補丁,全是結構化物件。Harness 把它們放進可替換管道;口徑仍然靠 Schema。沒有 Schema,外掛再優雅也只是把半對的物件傳得更快。

現在能上生產嗎?

官方標註為 developer preview,核心介面會快速迭代並可能破壞相容。適合基建預研與受控環境;上生產前鎖版本、寫適配層、把 Session 與 Schema 納入 CI。

結論

DeepSeek Harness 改變的不是「又一個能寫程式碼的聊天框」,而是把 Coding Agent 從應用內 Framework推到可替換執行時基礎設施:外掛、Seam、Session Log、fail-closed 安全與 JSON 契約同一套語言。

從今天起,少爭論哪家模型更聰明,先把工具 Schema 與執行 Seam 寫進倉庫。模型會換;宿主介面應該先穩定。

延伸閱讀

更新記錄: 首次釋出