dsh-read-image-compress:在 read_image 進入會話前壓縮圖片

前言

在 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,插件會:

  1. 讀取已存儲的附件,按配置打開的兩個階段之一或全部執行——分辨率階段(maxEdge、maxPixels、resolutionScale)與碼率階段(從 quality 向 maxBytes 階梯壓縮),優先使用當前安裝環境中的 sharp / libvips;
  2. 通過 ctx.attachments.saveImage() 提交壓縮後的字節;
  3. 替換工具結果的 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。

羽毛球分组比赛记分
小程序二维码

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

小夜