dsh-anydoc:把本地二進制文檔解析成 Markdown 的 DSH 原生插件

前言

DSH 的模型可以直接讀純文本文件,但日常碰到的文檔大多是 .docx、.xlsx、.pptx、.pdf 這類二進制容器。要讓模型分析季度報告、投標資料或電子書,開發者通常要先在外部跑一套轉換工具,把結果再喂回上下文;另一種做法是讓模型直接讀字符串,二進制容器裏的文字、表格和公式根本進不來。

下面介紹的 dsh-anydoc 試圖把這步收斂到一個插件裏:它基於 Firecrawl AnyDoc 的本地 Rust 解析引擎,把本地辦公文檔、電子書、CSV 與文本型 PDF 轉換爲 GitHub-Flavored Markdown,並註冊成 DSH 模型可直接調用的原生 Tool。插件由社區維護者 kevinasworks 開發,上游解析能力全部來自 Firecrawl AnyDoc 0.2.4,本項目只做 DSH 集成層,是獨立社區項目,不是 Firecrawl、DeepSeek 或任何機構的官方插件。

定位:它解決什麼問題

插件把 AnyDoc 的解析能力掛進 DSH 的工具註冊表,調用鏈路是:

用戶提問 → 模型調用 anydoc_convert → 插件本地解析 → Markdown 寫入文件 + 預覽返回 → 模型基於內容繼續分析

關鍵是全過程不聯網、不上傳文檔。AnyDoc 唯一的聯網路徑是顯式傳 ocr: 'hosted',本插件從不傳這個參數。掃描版 PDF 會返回 NEEDS_OCR 與頁碼,由用戶自行決定後續動作,插件不會自動上傳或啓用 hosted OCR。

三個原生工具

插件註冊三個 Tool,覆蓋單文件、批量與自檢三條路徑。

工具 作用
anydoc_convert 單文件轉換。返回 success、detectedFormat、outputPath、markdownPreview、truncated、warnings、errorCode 等字段,完整 Markdown 寫入文件。
anydoc_batch_convert 批量轉換。支持文件列表或單目錄(默認不遞歸)、併發上限、失敗隔離,返回成功/失敗/跳過統計。
anydoc_capabilities 只讀健康檢查。返回插件與 AnyDoc 版本、原生綁定狀態、當前平臺及 platformSupport、當前引擎、支持格式、OCR 策略、資源限制;selfTest: true 時用內置微型 CSV 走完整鏈路,不讀取任何用戶文檔。

支持的格式

以 AnyDoc 0.2.4 官方支持表爲準,插件已逐項實測。

類別 擴展名
Word .doc .docx .docm
PowerPoint .ppt .pps .pot .pptx .pptm .ppsx .ppsm
Excel .xls .xlsx .xlsm .xlsb
OpenDocument .odt .ods .odp
其他 .rtf .epub .csv .pdf(文本層)

幾個容易踩的點:

  • 格式由文件內容判定,擴展名只是提示。把 report.docx 改名成 report.bin 仍能轉換,插件會給出「擴展名不在支持表內」的警告。
  • .csv 沒有內容簽名,靠擴展名識別,因此 formatSource 會是 extension 而不是 content。
  • .pdf 只覆蓋文本層,掃描版返回 NEEDS_OCR。

安裝

插件以 DSH 官方 Bundle 方式安裝,不修改 DSH 核心源碼,也不手改 profile 文件。

推薦通過 npm 包名安裝:在 DSH 的「插件」→「添加插件」中輸入:

dsh-anydoc

如需固定版本,輸入 dsh-anydoc@0.2.1。npm 包地址見 dsh-anydoc。首次發佈後中國大陸鏡像可能尚未同步,可先切 npm 官方源。

也可以輸入 GitHub 完整地址安裝:

https://github.com/kevinasworks/dsh-anydoc

此方式獲取 GitHub 源碼,但不顯示 npm 安裝所具有的版本更新區塊。倉庫與 npm 包均不包含 node_modules/,安裝時需要能訪問所選源以拉取插件、AnyDoc 依賴及當前平臺的原生綁定;文檔轉換本身仍爲本地離線執行。

從本地目錄安裝時,先裝運行依賴:

cd /path/to/dsh-anydoc
npm install --omit=dev

隨後讓 Agent 調用 plugin_manager,target 換成插件目錄的實際絕對路徑:

{ "action": "install_bundle", "target": "/path/to/dsh-anydoc" }

Windows 用戶請使用實際的 Windows 絕對路徑,JSON 中反斜槓寫爲 \\。

安裝後用一次自檢確認:

anydoc_capabilities → {"selfTest": true}

應看到 native binding: ok、engine: worker、self test: passed。

典型用法

單文件轉換,指定預覽長度:

{ "sourcePath": "~/Documents/季度報告.docx", "previewChars": 12000 }

返回形如:

Converted /Users/me/Documents/季度報告.docx -> /Users/me/.dsh/anydoc-output/季度報告.md
format: docx (content) · 13,902 chars · 37,767 input bytes · 41 ms · engine: worker
--- markdown preview ---
# 季度技術評審報告 …

大文件只返回截斷預覽,預覽末尾說明已顯示 N/M 字符、完整內容見 outputPath,避免超長正文撐爆模型上下文。

批量轉換,默認不遞歸,這裏顯式打開:

{ "directory": "~/Documents/投標資料", "recursive": true, "concurrency": 2, "exportAssets": true }

帶圖片導出:

{ "sourcePath": "report.docx", "exportAssets": true }

圖片等內嵌資源寫到 <輸出目錄>/<文件名>.assets/,並在 Markdown 末尾追加 ## Exported assets 索引。插件只導出原始字節,不做圖像語義分析、不會僞造圖片描述。

默認值與限制

項 默認 說明
單文件大小 100 MiB 超過直接拒絕,不進入解析引擎
單文件超時 60 s worker 模式下真正殺掉進程,不是隻讓 Promise 超時
批量併發 2 可在調用時指定,上限 8
單批文件數 50 超出部分標註未處理,不會靜默截斷
內聯預覽 8000 字符 可調用時覆蓋
輸出總長 5,000,000 字符 超過則拒絕寫入並報 OUTPUT_TOO_LARGE
資源導出上限 64 MiB 超出部分跳過並告警
輸出目錄 ~/.dsh/anydoc-output 可用 outputDir 參數或 outputRoot 配置覆蓋

完整配置項見倉庫內 CONFIGURATION.md。

兼容性與平臺

插件的 engines.dsh 聲明並實測了三條 DSH 線:

>=0.2.0-rc.2 <0.2.1-0 || >=0.2.1-rc.2 <0.2.2-0 || >=0.2.2-rc.1 <0.2.3-0

0.2.0-rc.2、0.2.1-rc.2 ~ rc.5、0.2.2-rc.1 ~ 0.2.2 均已實測;範圍外的 0.2.0-rc.1、0.2.1-alpha.*、0.2.3+、0.3.x 等會被 DSH 的准入檢查拒絕。@firecrawl/anydoc 仍精確鎖定 0.2.4,向下兼容針對的是 DSH 宿主,不放開解析引擎版本。

平臺支持範圍嚴格等於上游 AnyDoc 0.2.4 的 7 個預編譯目標:macOS arm64 / x64、Windows x64、Linux glibc x64/arm64、Linux musl x64/arm64。Windows on ARM 原生進程不支持,上游沒有 ARM64 綁定,自檢會報告 platformSupport: unsupported。README 給出的 CI 驗證邊界是 macOS Apple 芯片 107/107、Intel Mac 107/107、Windows Server runner 104 通過 0 失敗 3 項既有跳過、兩種架構的 Ubuntu 與 Alpine 各 107/107;CI 運行驗證不替代完整 DSH 桌面界面驗收,Intel Mac 的 x64 Electron 宿主、Windows 10/11 的交互與文件佔用、SMB 場景仍需單獨驗證。

隱私與數據流

本地文件 → 插件(進程內或子進程)→ @firecrawl/anydoc → Rust 解析 → Markdown → 本地文件

插件不自動上傳文件、不調用 Firecrawl Parse、不發送遙測;日誌只記錄源路徑、格式、字符數、耗時、輸出路徑,不寫文檔內容。npm install 拉取依賴屬於公網流量,與文檔內容傳輸無關。倉庫的 TEST_REPORT.md 給出的證據是靜態掃描加上在禁用 fetch 的進程內/子進程內完成轉換。

適用場景與注意

適合需要在 DSH 裏把本地辦公文檔、電子書、CSV 轉成 Markdown 後再讓模型分析的場景,尤其是對文檔內容有本地處理要求、不希望內容離開本機的開發者。macOS(Apple 芯片)是作者日常使用並做過真實 DSH Tool Call 驗證的主要平臺,其餘受支持目標主要靠 CI 覆蓋。

幾點需要留意的:插件以當前 DSH 進程權限運行,可以直接讀用戶有權訪問的文件路徑,安裝前建議先檢查源碼與許可證(自身 MIT,AnyDoc 爲 MIT,版權 Sideguide Technologies Inc.)。它是獨立社區項目,不代表 Firecrawl 或 DeepSeek 官方立場。停用可用:

{ "action": "set_bundle", "target": "dsh-anydoc", "enabled": false }

卸載用 remove_bundle,會從 profile 的 package.json 移除依賴與 bundle 選擇,不影響其他插件。插件不會刪除用戶輸出文檔,~/.dsh/anydoc-output 需自行清理。安裝前的 profile 快照保存在 .backup/pre-install-<時間戳>/,異常時可對照恢復。

結尾

dsh-anydoc 做的事情比較集中:把 AnyDoc 的離線解析能力封裝成 DSH 原生 Tool,讓模型用一次調用就能拿到 Markdown 正文,同時用進程隔離、超時、大小上限和格式探測把集成的邊界守住。如果你在做 DSH 文檔處理方向的插件選型,可以從這裏入手。

  • 社區目錄頁:https://www.skillhub.cn/plugins/kevinasworks/dsh-anydoc
  • GitHub:https://github.com/kevinasworks/dsh-anydoc
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜