dsh-image-shim:把本地图像去水印代理挂进 DSH 生命周期

前言

在 DeepSeek Harness(DSH)里跑出图链路时,常见做法是让 dsh-draw 的 cogview-clean 引擎或自定义的 image_generate 调用指向本机 127.0.0.1:3089。该端口上跑的是 image-shim.py:向智谱 CogView 取图,去掉右下角「AI生成」角标,再以无损 PNG 返回。

若仍用 Windows 注册表 HKCU\...\Run 做开机自启,往往会遇到两条自启项(例如 image-shim-cogview-clean 与 image-shim-watchdog)争抢同一端口,或 DSH 崩溃、服务中途退出后无人再拉起代理。下面介绍社区插件 dsh-image-shim(维护者 tang-coder-hub,分类:工作流):在 DSH 宿主 apply 时探活并启动代理,之后按间隔复查,不健康则自动拉回。

这是什么

dsh-image-shim 是 DSH 的 desktop 侧插件(bundle 通过 cordis.patch.yml 注入)。它不负责改上游 API,而是把插件目录自带的 image-shim.py / dewatermark.py 以子进程形式托管:DSH 起来代理应在,进程挂掉或探活失败则按策略重启。插件以 MIT 许可发布,当前 package 版本为 1.0.0;DSH 兼容范围为 >=0.2.1-rc.2 <0.3.0,Node >=20.18。

它解决什么问题

出图链路统一走 127.0.0.1:3089 的前提下,插件替代「登录时触发一次」的自启方案:

  1. 避免多条自启互相占端口,出现「自启项都在、3089 上却没有健康服务」。
  2. DSH 重启或 shim 中途退出后,由插件在宿主生命周期内继续守护,而不是等下次登录。

探活不是只看 TCP:GET /draw/status 必须返回 HTTP 200 且 JSON 里 ok === true,以免进程还在但事件循环卡死时被误判为健康。

核心行为

行为 说明
启动即检查 apply 里立刻探一次,不等第一个 interval
连续失败才动手 默认连续 failureThreshold(2)次失败才拉起,减轻抖动误杀
僵尸清理 端口在听但探活失败时,杀掉本插件 spawn 的 child 再重拉
不误杀别人 端口被其他进程占用时只记日志
脱离宿主 spawn(..., detached: true) + unref(),DSH 重启不带走子进程
优雅退出 ctx.effect 清定时器;stopOnDispose: true 时可一并停进程

默认每 30 秒复查一次(probeIntervalSec);单次探活超时默认 6000 ms(probeTimeoutMs)。README 提醒:出图本身约需 10 秒,超时设太小可能在机器满载时误判不健康并触发多余重启。

配置

在 cordis.patch.yml 中可覆盖以下项(均有默认值,不配也能跑):

- insert:
    - id: image-shim
      name: dsh-image-shim
      config:
        enabled: true
        pythonPath: auto
        port: 3089
        probeIntervalSec: 30
        probeTimeoutMs: 6000
        failureThreshold: 2
        startupGraceSec: 8
        stopOnDispose: false
  • pythonPath:默认 auto,按文档顺序探测本机 Python,第一个能 import PIL, numpy 的即用;找到 python.exe 会改用同目录 pythonw.exe 以免弹黑框。
  • port:若修改,需与 dsh-draw 引擎的 baseURL 一致。
  • stopOnDispose:默认 false,DSH 退出后代理可继续运行,下次启动直接复用。

智谱 API key 从 ~/.dsh/.credentials.yaml 或环境变量 GLM_API_KEY 读取。Python 侧依赖 Pillow、numpy;插件探测时会真实 import 验证。

安装与卸载

插件在 DSH 启动时加载;宿主已运行时,dsh plugin add 后 bundle 可热挂载,README 记载本机 2026-10-25 验证装完无需重启 DSH 即可生效。安装前请自行阅读仓库源码与 MIT 许可证;插件以当前 DSH 进程权限运行子进程。

从 GitHub 安装(推荐):

dsh plugin --profile desktop add github:tang-coder-hub/dsh-image-shim

本地目录开发调试:

dsh plugin --profile desktop add 'file:<插件目录绝对路径>'

卸载:

dsh plugin --profile desktop remove dsh-image-shim

装好后建议删除 HKCU\...\Run 里 image-shim-watchdog 一类条目,避免与插件两套守护重复拉起(一般不会坏,但没必要并存)。

手动验证

确认代理健康:

curl http://127.0.0.1:3089/draw/status
# {"ok":true,"shim":{"pid":...},"requests":0,...}

运行日志位于 <插件目录>/draws/shim.log。

适用场景与使用边界

适合:已在本地工作流里依赖 127.0.0.1:3089 的 CogView 出图 + 去服务端叠加角标,并希望守护逻辑跟 DSH desktop 宿主走,而不是注册表自启。

插件用途是处理上游返回图里由服务端烧进像素的水印角标,并转无损 PNG;不破解付费墙、不绕过用量、不动 DRM,请求仍发上游、仍计费。

README 明确:抹掉生成内容上的 AI 标识,在部分服务商条款中可能不允许(智谱 CogView 当前角标烧在图内,且 watermark_enabled: false 无效)。仅建议用于本地个人工作流;使用前请自行核对所调用图像服务商的服务条款,后果由使用者承担。若需合规去标识,更稳妥的是选用条款允许无水印或可调标识的上游,而非客户端抹除。

结尾

dsh-image-shim 把 image-shim.py 的启停与 HTTP 级探活绑到 DSH desktop 宿主上,减少端口争抢和「只自启一次」带来的空窗。社区目录页:skillhub.cn/plugins/tang-coder-hub/dsh-image-shim;源码与完整说明:github.com/tang-coder-hub/dsh-image-shim。DSH 生态强调「一切皆插件」;skillhub 为社区目录站点,与 DeepSeek / 幻方无官方从属关系。

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

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

Xiaoye