Skip to content

Releases: FuzzySoul/dsh-free-vision

dsh-free-vision v1.0.7

Choose a tag to compare

@FuzzySoul FuzzySoul released this 18 Aug 12:49

dsh-free-vision v1.0.7 — 一步到位:粘贴图片直接给出描述

修复你的真实痛点:之前粘贴图片后,纯文本模型还要自己“找图→认图→调 image_understand”,多出好几步大模型往返。本版改为社区最成熟的 one-step 方案(同 dsh-deepseek-vision):

  • 分发时内联图片描述:对纯文本模型把 image 块替换成“已自动识别的图片描述文本”,模型同一回合直接回答,全程 0 次工具调用、1 步完成(真实 E2E:1 turns · 1 steps)。
  • 描述按图片 sha256 缓存(进程内 LRU):同一张图重复出现/追问不再调视觉 API(E2E 中第二次 TTFT 19s → 3.9s)。
  • image_understand 保留给精确/细分追问(OCR 逐字转写、坐标、颜色等),仍可传 /dsh-free-vision/raw/<id>
  • 新配置:describeAtDispatch(默认开)、describePromptdescribeCacheSize(默认 64),在 设置 → Free Vision → 高级设置。
  • 实测:引擎 spawn ~333ms、base64 为毫秒级、视觉 API ~1.9s(大头在厂商 API,缓存消除重复)。

E2E 里模型 Think 原文:“They pasted a detailed image description (already auto-recognized) … I can answer directly.” → 全程未调 image_understand。

dsh-free-vision v1.0.6

Choose a tag to compare

@FuzzySoul FuzzySoul released this 18 Aug 12:19

dsh-free-vision v1.0.6

Added — 聊天里能显示粘贴的图片了

之前粘贴的图片会被客户端改写成纯文本 ![图片](/dsh-free-vision/raw/...) 引用,聊天里只剩原样 markdown。现在改为 host 侧保留真实 image 块(Web UI 显示 dsh 原生缩略图),只在 llm/stream 分发时对纯文本模型把 image 块改写成引用文本,模型照常调 image_understand(方案同 dsh-image-pathify / dsh-deepseek-vision)。

  • llm.resolveModelInfo 准入 shim:挂载附件存储时对纯文本模型放行图片发送,会话保留 image 块。
  • llm/stream 分发改写:纯文本模型收到的是 ![图片](/dsh-free-vision/raw/<id>) 引用;能看图的模型完全不受影响。
  • 新配置 preservePastedImages(默认 true)位于 设置 → Free Vision → 高级设置;设为 false 恢复旧纯文本行为。
  • client sendSession 优先原生(保缩略图)发送,宿主拒绝时才退回旧文本改写——老宿主/受限渲染场景不退化。

详见表 CHANGELOG.md。

v1.0.5

Choose a tag to compare

@FuzzySoul FuzzySoul released this 18 Aug 11:25

%23%20v1.0.5%0A%0A%23%23%20Fixed%3A%20pasted-image%20references%20now%20resolve%20automatically%0A%0AText-only%20models%20can%20now%20hand%20the%20vision%20tool%20a%20pasted%20image%20reference%20and%20have%20it%20%22just%20work%22.%20Previously%20the%20durable%20%60!%5B%E5%9B%BE%E7%89%87%5D(%2Fdsh-free-vision%2Fraw%2F%3Cid%3E%E2%80%A6)%60%20markdown%20the%20client%20pastes%20into%20the%20conversation%20could%20not%20be%20consumed%20by%20the%20plugin's%20own%20engine-proxied%20%60image_understand%60%20tool%3A%0A%0A-%20the%20engine's%20SSRF%20guard%20blocks%20the%20loopback%20%60127.0.0.1%60%20URL%3B%0A-%20its%20extension-based%20sniffing%20rejects%20the%20extension-less%20content-addressed%20store%20files%3B%0A-%20its%20narrower%20allowed-dirs%20policy%20rejects%20%60%2Ftmp%60-style%20downloads.%0A%0AThe%20tool%20now%20resolves%20references%2C%20content%20ids%2C%20and%20attachment%20object%20paths%20on%20the%20host%20side%20into%20a%20%60data%3A%60%20URI%20before%20the%20engine%20sees%20them%2C%20so%20all%20three%20failure%20modes%20are%20bypassed%20in%20one%20step.%0A%0A-%20Resolves%20%60!%5B%E5%9B%BE%E7%89%87%5D(%2Fdsh-free-vision%2Fraw%2F%E2%80%A6)%60%20%2F%20%60%5Bimage%20attachment%20%E2%80%A6%5D%60%20%2F%20%60sha256%3A%3Chex64%3E%60%20%2F%20%60%E2%80%A6%2Fobjects%2F%3Cxx%3E%2F%3Chex64%3E%60%20references%20(durable%20%60%3Fref%3D%60%20%E2%86%92%20in-process%20registry%20%E2%86%92%20content-addressed%20file%20on%20disk).%0A-%20Local%20paths%20are%20allowlisted%20on%20the%20host%20(reusing%20%60allowedDirs%60)%2C%20sniffed%2C%20sent%20as%20%60data%3A%60%20URI.%0A-%20Actionable%20error%20messages%20(allowed%20roots%20listed%2C%20how%20to%20fix).%0A%0A__npm__%3A%20%5Bdsh-free-vision%401.0.5%5D(https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fdsh-free-vision)%20(already%20published).

v1.0.4

Choose a tag to compare

@FuzzySoul FuzzySoul released this 18 Aug 10:56

Added

  • Pasted/dropped images now feed straight into the vision tool without the
    external describe-image plugin: a new backend POST /dsh-free-vision/attach
    saves the image into the host attachment store and returns a durable Markdown
    ![图片](/dsh-free-vision/raw/<id>?ref=…) reference, and a new
    GET /dsh-free-vision/raw/<id> route streams those bytes back so the
    reference renders in the conversation.
  • The client auto-rewrites outbound messages that carry an image into that text
    reference (wrapping conversation.sendSession), so pasting/sending an image
    bypasses the "current model does not support images" admissibility gate. The
    hook is dedup-guarded and wrapped in try/catch with a fallback so it can never
    break the settings page or an existing session.

v1.0.3

Choose a tag to compare

@FuzzySoul FuzzySoul released this 18 Aug 09:22

Added

  • Settings UI now exposes an Allowed Dirs / 允许读取的图片目录 field in
    Advanced settings, so users can see and edit the image read whitelist
    (previously the allowedDirs config existed but was invisible in the UI).
  • The page shows the Effective whitelist (workdir + home defaults plus any
    user-added roots, resolved by the backend), and it refreshes live after save.
  • A warning in Advanced settings points users back to this field when the
    engine reports Access denied: image path is outside the allowed directory.

Added

  • All-in-one GitHub Actions release workflow (.github/workflows/release.yml)
    triggered on push of a v* tag: runs tests, npm publish, packs a .tgz
    and creates/updates the GitHub Release with CHANGELOG-based notes.

v1.0.2

Choose a tag to compare

@FuzzySoul FuzzySoul released this 18 Aug 07:49

🎯 Resolves

  • PR #2 — fix: forward CUSTOM_MODEL_NAME for custom provider; add allowedDirs whitelist
    #2

✨ What changed

  • Custom provider now always forwards CUSTOM_MODEL_NAME (defaults to luma-mcp's custom-model), so modelProvider: custom starts the engine even when modelName is left empty.
  • postinstall patch script is now truly idempotent: the image-processor.js patch uses the same marker string that patchFile() checks for, so re-running during reinstall/upgrade no longer crashes on a missing pattern.

🐛 Fixed in 1.0.2

  • Custom provider startup failure: with modelProvider: custom, luma-mcp requires CUSTOM_MODEL_NAME; previously the plugin only set MODEL_NAME, so every OpenAI-compatible endpoint (GPT-4o, Qwen-VL, GLM-4V, vLLM, …) failed at engine startup.
  • Idempotent patching: re-running postinstall (reinstall / dshmarket upgrade) no longer crashes on a missing patch pattern.

🧪 Validation

  • Patch idempotency verified across reinstall/upgrade.
  • Custom provider (OpenAI-compatible endpoint) engine startup verified.

📦 Package

  • npm: dsh-free-vision@1.0.2 (latest)
  • Tag: v1.0.2

v1.0.1

Choose a tag to compare

@FuzzySoul FuzzySoul released this 17 Aug 11:12

🎯 Resolves

  • Issue #1 — FEAT: API override
    #1

✨ What changed

  • Added optional per-provider API Base URL override (baseURLs).
  • Users can now override the API endpoint/base URL for every existing provider:
    qwen / volcengine / siliconflow / zhipu / hunyuan / custom.
  • Supports proxy, API Gateway, OpenAI-compatible services, local services, and special network environments.
  • Settings UI now shows a Base URL input next to the API Key, prefilled with the provider's official default address.
  • Empty/missing Base URL keeps the original official default behavior.
  • The override is persisted in ~/.dsh/free-vision.json and survives restarts.
  • Actual API requests use the overridden address; URL duplication like /v1/v1 or /chat/completions/chat/completions is avoided.

🐛 Fixed in 1.0.1

  • postinstall would crash under pnpm (dshmarket updates). The luma-mcp path is now resolved via Node's module lookup with fallbacks, working under npm (flat), pnpm isolated, and pnpm hoisted layouts.

🧪 Validation

  • Unit tests: 26 passed.
  • Integration test with local mock HTTP server confirms every provider client sends requests to the custom Base URL.
  • Real Qwen API end-to-end call succeeded.
  • postinstall verified under npm, pnpm isolated, and pnpm hoisted layouts.

📦 Package

  • npm: dsh-free-vision@1.0.1 (latest)
  • Tag: v1.0.1