前言¶
在 DeepSeek Harness(DSH)裏,智能體通過內置 read_image 把本地或附件裏的圖片讀進對話。模型對圖片的計費與像素規模相關,大圖還會佔用上下文窗口並增加傳輸與解碼成本。Harness 本身會對讀圖結果做一定處理,但若你希望在工具返回之後、寫入會話之前再精細控制分辨率與文件體積,就需要在 tools/post-execute 鏈路上做後處理。
下面介紹社區插件 dsh-read-image-compress(維護者 etherfun),它對成功的 read_image 結果做可選的兩段式壓縮,並替換工具返回內容中的圖片塊與說明文字,使對話卡片、後續模型請求與會話歷史都使用更小的附件。
這是什麼¶
dsh-read-image-compress 是一個 DSH bundle:Host 端監聽 tools/post-execute,瀏覽器端在側邊欄 Plugins 頁對應插件行上提供配置界面。分類上屬於「模型推理」相關能力——直接作用於進入模型的圖片像素與 token 估算,而不是單獨的推理引擎。
當前 package 版本爲 0.15.0(MIT 許可證),要求 Node.js >= 22.13,DSH >= 0.2.1-rc.3 且 < 0.3.0-0。
核心功能¶
後處理流程¶
對一次成功的 read_image,插件會:
- 讀取已存儲的附件,按配置打開的兩個階段之一或全部執行——分辨率階段(
maxEdge、maxPixels、resolutionScale)與碼率階段(從quality向maxBytes階梯壓縮),優先使用當前安裝環境中的 sharp / libvips; - 通過
ctx.attachments.saveImage()提交壓縮後的字節; - 替換工具結果的 content:保留 DSH 識別的圖片 envelope 與模型可見文本,將圖片塊指向新附件,並在展開卡片底部追加一行原圖/壓縮後對比說明。
若運行環境無法解析 Sharp,會回退到 ctx.attachments.readImageRequest();仍可壓縮,但該模式下 quality 與 format 設置不生效。
兩個獨立開關¶
設置頁上分辨率與碼率各有一個複選框,四種組合均合法:
| 分辨率 | 碼率 | 行爲 |
|---|---|---|
| 開 | 開 | 先縮到像素預算,再沿質量階梯壓到 maxBytes(默認,體積通常最小) |
| 開 | 關 | 僅縮放;format: auto 時儘量保持源編碼,JPEG/WebP 結果不超過源文件字節數 |
| 關 | 開 | 不改像素,僅重編碼壓到 maxBytes(細節保留、文件仍很大時可用) |
| 關 | 關 | 不處理,結果與 Harness 讀入時一致 |
README 說明:分辨率影響模型側 token 估算(按像素而非字節);碼率主要降低傳輸與解碼成本。
卡片底部摘要¶
展開 read_image 行時,插件在圖庫下方追加類似一行(summaryMode: detailed 時):
原圖: 4096×2600 · 3.90 MB · PNG | 壓縮後: 1568×996 · 255 KB · WebP | 壓縮比: 15.7×(體積 ↓93.7%,分辨率 ↓61.7%) | ≈938 tokens
其中 ≈N tokens 按 DeepSeek 官方圖片 token 算法估算(14 px patch、3× 下采樣、單圖約 1024 token 上限等),僅作參考;其他廠商計費規則可能不同。可通過 summaryMode(detailed / compact / off)與 summaryLanguage(zh / en)調整展示。
插件頁預覽¶
配置卡片會在參數變更(防抖)後,用同一張樣圖並排展示三列:原圖、Harness 原生壓縮、當前插件參數下的結果;Host 提供 POST /api/read-image-compress/preview,與 hook 使用同一套 sharp 邏輯。可上傳自定義圖片(POST /api/read-image-compress/source,單文件解碼上限 64 MP、請求體 16 MiB),或繼續使用倉庫樣圖(安裝後從 GitHub / jsDelivr 拉取,失敗時可能改用 Bing 每日壁紙作爲佔位預覽)。
安裝與啓用¶
DSH 生態採用「一切皆插件」;社區目錄 SkillHub 插件頁 與 DeepSeek / 幻方無官方從屬關係,安裝前請自行查看源碼與許可證。插件以當前 dsh 進程權限運行,會讀寫附件存儲並調用本機圖像庫。
README 中針對 web profile 的安裝方式爲從 registry 安裝,與其他插件相同:
dsh plugin --profile web add dsh-read-image-compress
若本地有開發副本並希望鏈接安裝(改代碼即生效),README 示例爲:
dsh plugin --profile web add "link:F:\dev\github\dsh-read-image-compress"
(請將 link: 後的路徑換成你本機倉庫目錄。)
包聲明 dsh.bundle.patch,DSH 會把 bundle 寫入 profile;cordis.patch.yml 插入配置行,插件頁修改會寫入同 id 的可寫配置層。
典型用法¶
在 Plugins 頁調參¶
打開側邊欄 Plugins,點擊 dsh-read-image-compress 行。設置卡片在包描述下方,無需二級 Configure 頁;保存爲一次原子更新,下一次 read_image 即使用新值。字段均爲 .volatile(),改完無需重載 Host。
通過 cordis.patch.yml 寫默認配置¶
與頁面相同的字段可寫在 bundle 配置中,例如:
- id: read-image-compress
config:
enabled: true
compressResolution: true
compressBitrate: true
quality: 85
resolutionScale: 1
format: auto
maxEdge: 1568
maxPixels: 1690000
maxBytes: 524288
minBytes: 131072
minResizeScale: 0.9
webpEffort: 4
jpegBackground: '#ffffff'
cacheEntries: 128
downscaleWebp: true
skipGif: true
summaryMode: detailed
summaryLanguage: zh
常用含義簡述:
maxPixels默認1690000(約 1300×1300),README 說明這與 DeepSeek 對大圖 token 化的目標量級一致;僅限制長邊時,方圖仍可能佔滿 token 預算。maxBytes默認524288(512 KiB);PNG _lossless 路徑無法靠quality/maxBytes強行縮小。minBytes默認131072:已足夠小且無需縮放時會跳過處理。skipGif默認true:GIF 不處理;設爲false時只編碼首幀。
安裝並 enabled: true 後,無需改智能體提示詞:Agent 照常調用 read_image,插件在 post-execute 階段自動介入。
適用場景與注意¶
適合:頻繁讀入截圖、設計稿、照片等大圖,希望在會話與後續請求裏統一使用更小附件,並在 UI 裏直觀看到壓縮比與 token 估算。
注意:
- 隻影響新的
read_image調用;已有附件與會話歷史不會被改寫。 - 每次壓縮增加一次解碼+編碼;同一 Host 進程內對相同源與設置有 LRU 緩存(
cacheEntries,默認 128)。 - 若其他
tools/post-execute監聽器已阻止或替換結果,本插件不會覆蓋其決策。 format: jpeg會把透明通道鋪到jpegBackground上;需要透明時用auto或webp。- GIF、已足夠小的圖可能無 footer(未重編碼時)。
結尾¶
dsh-read-image-compress 在 Harness 內置讀圖流程之後追加可配置的分辨率與碼率壓縮,並把更小附件寫回工具結果,同時用一行摘要對照原圖與壓縮結果,便於控制 token 與帶寬。進一步瞭解實現與基準數據可見倉庫內 docs/design.md、docs/benchmark.md。