前言¶
DeepSeek Harness(以下簡稱 DSH)的核心理念是「一切皆插件」:模型、工具、會話、沙箱都可以在配置層替換,而不必去改框架源碼。它目前仍是開發者預覽版,倉庫在 deepseek-ai/deepseek-harness。社區裏也出現了一批第三方插件目錄,例如 DeepSeek Harness 插件庫——需要說明的是,這類目錄是獨立站點,和 DeepSeek / 幻方沒有官方從屬關係,不要把它當成官方應用商店。
真正上手之後,一個很具體的缺口很快會冒出來:DSH 內置的 read 只處理 UTF-8 文本。工作區裏常見的 .xlsx、.pdf、.docx、.pptx、.ipynb,直接當文本打開是打不開的。Claude Code 原生能讀 PDF 和筆記本,Codex 這邊則幾乎沒有對應能力。dsh-cowork 做的就是把這一層補上:給智能體一對受控的 doc_read / doc_write,按單元格、頁、幻燈片或筆記本單元格去讀寫,而不是把整份二進制文件塞進上下文。
這是什麼¶
dsh-cowork 是一款工作流與自動化類插件,由 Jesse-njx 維護,倉庫地址是 Jesse-njx/dsh-cowork,許可證爲 MIT,主要語言是 TypeScript。根包版本號目前是 0.1.0,要求 Node.js 20+。截至 2026-08-18,GitHub 上的星標爲 4。插件庫目錄頁收錄於 2026-08-14,安裝命令裏的倉庫名爲 Jesse-njx/dsh-cowork。
它解決的問題可以收成一句話:讓 DSH(以及其他走 MCP / CLI 的智能體)在有界窗口裏讀寫辦公文檔和 Jupyter 筆記本,讀寫共用同一套穩定地址,而不是各寫各的解析器。
目錄頁上有一段 FAQ 寫成了「多智能體協作」,和倉庫 README、GitHub 簡介以及目錄頁「更多介紹」都不一致。後三者都明確說這是文檔讀寫插件。下文以倉庫 README 與源碼爲準。
核心功能¶
倉庫把能力拆成兩個工具,而不是五個格式各做一套 API。
1、doc_read:按窗口抽取內容。xlsx 返回帶單元格引用的表格(如 A1、C12);ipynb 返回單元格和內聯輸出;PDF 按 pages 取文本窗口;docx 取段落和字數;pptx 取幻燈片和形狀 id。
2、doc_write:v1 只覆蓋兩種格式。xlsx 按單元格引用新建或編輯;ipynb 按單元格下標新建或編輯。PDF、docx、pptx 目前只讀,README 把表單填寫和文檔生成放在 v2。
「Cowork = READ + WRITE」能合成一套工具,靠的是兩個設計:
- 穩定地址。 行號對二進制格式沒有意義。
doc_read給出的單元格引用、形狀 id、單元格下標,可以直接交給doc_write使用。 - 有界窗口,並且截斷必須說出來。 每次讀取都有上限(頁 / 行 / 幻燈片 / 單元格 / 字節)。窗口被截短時會出現
> Truncated:,而不是悄悄丟掉後半段。
倉庫是 pnpm monorepo,和文檔讀寫直接相關的包如下:
| 包 | 作用 |
|---|---|
packages/core |
純 TypeScript,不依賴 DSH:嗅探、抽取、構建、窗口化和安全上限 |
packages/dsh |
DSH 插件包,註冊 doc_read / doc_write,包名 @dsh-cowork/plugin |
packages/mcp |
基於 stdio 的 MCP 服務器,給 Codex、Claude Code 或其他 MCP 客戶端用 |
packages/cli |
doc-read / doc-write 命令行,附帶一份 SKILL.md |
英文 README 還列出了 packages/chatnode-wechat,用來通過微信會話節點查看和批准 DSH 智能體。這和文檔讀寫不是同一條能力線,中文 README 的包表裏沒有寫它,這裏不展開。
安全模型在 README 裏寫得很具體,不是口號:
- OOXML 歸檔在解壓前檢查條目數和解壓後大小,用來擋住 zip 炸彈。
- 含
vbaProject.bin的宏格式(.xlsm/.docm/.pptm)一律拒絕,插件不讀寫這類文件。 - 沙箱處於
read-only時,doc_write被硬性禁止,doc_read仍可用。 - 編輯前必須在本會話讀過該文件(
expected_version),還可以加內容哈希(expected_sha256)。 - 覆蓋已有文件:在 DSH 裏需要先讀過;CLI / MCP 則要顯式
force。 - 寫入走臨時文件再重命名,避免留下半成品。
- 被改過的 xlsx 會清掉緩存的公式結果,讓 Excel / LibreOffice 打開時重算(exceljs 本身不算公式)。
- 公式、隱藏工作表、演講者備註只當數據展示,不執行。
DSH 插件包讀文件走 ctx.fs(有界 readBytes、沙箱路徑解析、fs/observed 事件)。因爲 fs 服務只支持文本寫入,字節寫入由插件自己做原子重命名,寫完再觀察真實版本號,好讓內置策略繼續生效。
安裝與啓用¶
插件庫目錄頁給出的安裝命令是:
dsh plugin add github:Jesse-njx/dsh-cowork
需要可復現安裝時,目錄頁建議固定 commit 哈希:
dsh plugin add github:Jesse-njx/dsh-cowork#commit
把上面的 commit 換成實際哈希即可。
倉庫 README 和 docs/shipping.md 寫得更細:當前沒有發佈到 npm,分發渠道是 GitHub;真正給 DSH 用的插件包在 packages/dsh,不是倉庫根目錄。倉庫推薦的安裝步驟是先克隆、安裝依賴並構建,再按 profile 添加本地路徑:
git clone https://github.com/Jesse-njx/dsh-cowork.git
cd dsh-cowork
pnpm install
dsh plugin --profile <你的profile> add ./packages/dsh
pnpm install 會觸發根包的 prepare,把各包構建出來。開發依賴裏能看到 @deepseek-ai/dsh-* 的版本是 0.1.0-rc.6,說明它是對着當前 DSH 預覽版寫的,後續接口若有破壞性變更,需要再覈對兼容性。
裝好之後,模型側會出現 doc_read / doc_write。README 建議用一次真實會話驗證:讓模型對一份 .xlsx 調用 doc_read。
可選配置寫在 profile 的 cordis.patch.yml 裏,覆蓋 cowork-docs 這一行。下面這些是 README 給出的默認值,都可以改:
- id: cowork-docs
name: '@dsh-cowork/plugin'
config:
maxInputBytes: 67108864
maxOutputBytes: 262144
maxDecompressedBytes: 536870912
maxZipEntries: 4096
maxPages: 20
maxSheetRows: 200
maxSheets: 1
maxSlides: 20
maxCells: 200
含義大致是:單次輸入上限 64 MiB,面向模型的窗口 256 KiB,解壓上限 512 MiB(zip 炸彈防護),PDF 每窗口最多 20 頁,xlsx 每窗口 1 張表、200 行,pptx 最多 20 頁幻燈片,ipynb 最多 200 個單元格。
典型用法¶
裝進 DSH 之後,優先讓模型走工具,而不是自己在 shell 裏拆 OOXML。xlsx 讀出來是帶單元格引用的 Markdown 表,後續編輯直接用這些引用,不要靠「第幾行第幾列」去猜。
如果智能體不在 DSH 裏跑,同一套核心庫還提供 MCP 和 CLI。MCP 配置示例(把路徑換成你的克隆目錄):
{
"mcpServers": {
"cowork": {
"command": "node",
"args": ["<repo>/packages/mcp/lib/index.js"],
"cwd": "<工作目錄>"
}
}
}
命令行由 @dsh-cowork/cli 提供,二進制名是 doc-read 和 doc-write。倉庫給出的例子:
doc-read report.xlsx --sheets Data --rows 50
doc-write edit report.xlsx --spec edit-spec.json
packages/cli/SKILL.md 把參數寫得更完整。讀取側常用窗口參數包括 --page / --pages、--sheets、--row-offset / --rows、--slide / --slides、--cell / --cells、--max-bytes;加 --json 會輸出帶地址、公式和提示的結構化窗口,而不是 Markdown。
寫入側分創建和編輯:
doc-write create <file> <xlsx|ipynb> --spec spec.json [--force]
doc-write edit <file> --spec spec.json [--force]
規格文件的形狀以 CLI 文檔爲準,例如:
- 新建 xlsx:
{"sheets":[{"name":"S1","cells":[{"ref":"A1","value":42}]}]},值可以是字符串、數字、布爾、null,或{"formula":"SUM(A1:A2)"}。 - 編輯 xlsx:
{"format":"xlsx","edits":[{"sheet":"S1","ref":"A1","value":"x"}]}。 - 新建 ipynb:
{"cells":[{"type":"markdown","source":"# Hi"},{"type":"code","source":"print(1)"}]}。 - 編輯 ipynb:
{"format":"ipynb","edits":[{"op":"replace","cell":0,"source":"..."}]},op可以是replace、insert、delete。
覆蓋已有文件時,CLI / MCP 需要 --force。編輯完成後,文檔建議再 doc-read 一次,確認結果後再告訴用戶已經改好。出現 > Truncated: 時,應提高 offset 繼續讀,而不是把沒看到的部分補完。
適用場景與注意事項¶
比較適合這幾類工作:
- 讓 DSH 智能體讀報表、改單元格、抽 PDF 文本、看幻燈片結構,或改 Jupyter 筆記本里的某個 cell。
- 已經在用 Codex / Claude Code,希望用同一套文檔能力,通過 MCP 接進去。
- 只想在終端裏對二進制文檔做有界抽取或按規格編輯,用 CLI 即可。
使用前有幾件事需要先看清楚。
第一,插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。裝之前應檢查源代碼倉庫和許可證;目錄頁也寫了同樣的警告。本倉庫是 MIT,源碼公開,但仍建議先看 packages/dsh 和 packages/core,確認讀寫邊界可以接受。
第二,v1 的寫入範圍只有 xlsx 和 ipynb。不要默認它能生成 Word、PPT 或填寫 PDF 表單,那些在路線圖裏標成 v2。
第三,宏啓用格式會被直接拒絕。需要保留宏的工作簿、文檔、演示文稿,不要交給這個插件改。
第四,默認窗口很小:xlsx 默認一次只看 1 張表、200 行。大表要靠 offset 分段讀。截斷提示是機制的一部分,不是出錯。
第五,DSH 仍在快速迭代,倉庫也標明預覽期可能有破壞性變更。@dsh-cowork/plugin 目前按 0.1.0-rc.6 的 DSH 包來寫 peerDependencies,升級 DSH 之後應再跑一遍 doc_read / doc_write。
小結¶
dsh-cowork 沒有去改 DSH 源碼,而是按官方 CONTRIBUTING 推薦的路徑,做成倉庫外插件:用 doc_read / doc_write 給智能體補上辦公文檔和筆記本的受控讀寫。讀五種格式,寫兩種;地址穩定,窗口有界,宏文件和 zip 炸彈有明確拒絕規則。同一套核心還可以經 MCP 和 CLI 接到別的 harness 上。
目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-cowork/
GitHub:https://github.com/Jesse-njx/dsh-cowork