前言¶
在 DeepSeek Harness(DSH)里做多轮对话、附带多张截图或附件时,请求体里会反复带上历史里的图片。Anthropic Messages API 对「普通请求」允许单边最长约 8000 px,但一旦同一次请求里携带多张图片,单边上限会变成 2000 px。DSH 自带的图片门禁主要是面积预算:入库阶段(dsh-attachment-local)和请求投影(requestImageDimensions)默认都按约 419 万 px² 控制,长边可以到 8192 px。整页截图因此可能以例如 828×5059 的形式存进附件库——面积合规、长边却远超多图请求的 per-side 规则。短对话里可能一直正常,会话变长、同一次请求里图片变多时才触发 400,且历史里字节已固定,重试也会反复失败。
下面介绍社区插件 dsh-request-image-cap(维护者 lucagiftzek,分类:模型推理)。它在发往模型前对每张图做 per-side 像素上限,把「多图 Anthropic 拒收」这类 latent 错误挡在请求侧。
这是什么¶
dsh-request-image-cap 是 DSH 的 Cordis 插件(npm 包名 @lucagiftzek/dsh-request-image-cap,当前 README 对应版本 0.1.0,许可证 MIT)。一句话:在 LLM 适配器 materialise 请求图片的唯一接缝 ctx.attachments.readImageRequest(ref, policy, signal) 外包一层,把配置的 per-side 上限换算成面积预算,再交给现有的 requestImageDimensions 缩放逻辑,使长边落在 cap 以内且保持宽高比。
上游 README 说明:根治应在 requestImageDimensions 增加路由级的 maxDimension;本插件是本地权宜方案。
核心功能¶
与 DSH 内置门禁的差异¶
| 阶段 | 控制方式 | 默认(README 表格) |
|---|---|---|
入库 dsh-attachment-local |
面积 / 维度 | normalizedImageMaxPixels 4 194 304 px²,normalizedImageMaxDimension 8192 px |
请求投影 requestImageDimensions |
面积 | llm-pi-ai.requestImagePixelBudget 4 194 304 px² |
本插件不改变磁盘上已存储的附件字节,只在请求时刻缩小发给模型的副本。
行为要点(资料原文)¶
- retroactive:历史里已有 oversized 图片,安装启用后再次发送时可被 clamp,会话可继续。
- non-destructive:存储不变,仅模型侧副本变小。
- never widens:若路由策略本来更严,插件不会把它放宽。
- fails safe:若 DSH 核心升级改名了接缝,插件打 warning 并保持 inactive,不在启动时抛错。
- 换算公式:
maxPixels' = floor(w * h * (cap / max(w, h))^2),与requestImageDimensions的sqrt(maxPixels/(w*h))缩放一致。
README 给出的实测示例(真实 attachment store 中的对象):828×5059(388 KB)→ 327×1998(79 KB)。
Anthropic 侧对超过约 1.15 MP 的图片本就会在服务端缩放;插件在客户端先 clamp,主要是为了满足多图请求的 per-side 规则,避免 400。
典型错误症状¶
多图请求失败时,Messages API 可能返回类似:
400 invalid_request_error
messages.10.content.5.image.source.base64.data: At least one of the image
dimensions exceed max allowed size for many-image requests: 2000 pixels
安装与启用¶
插件以 web profile 安装,安装后需重启 dsh web。包声明了 dsh.bundle,会进入 dsh.profile.bundles 并由自带 patch 插入配置;也可在 profile 的 cordis.patch.yml 里用 - id: request-image-cap 只覆盖 config(不要重复 insert)。
环境要求(README / package.json):Node ≥ 22.18.0;作者在 README 中写明在 DSH 0.1.5 与 0.2.1 上使用(接缝为 ctx.attachments.readImageRequest)。peer 依赖 @deepseek-ai/cordis ^4.0.2。
安装命令须与 README 一致:
dsh plugin --profile web add @lucagiftzek/dsh-request-image-cap
# or from GitHub: dsh plugin --profile web add github:lucagiftzek/dsh-request-image-cap
# then restart dsh web
本地开发目录也可用 link 方式(README):
dsh plugin --profile web add link:/absolute/path/to/dsh-request-image-cap
重启后日志中应出现类似:request-image-cap: active, 2000px per side。
配置¶
默认 per-side 上限为 2000 px,与 Anthropic 多图规则对齐。可在 patch 中调整:
- id: request-image-cap
config:
enabled: true
maxDimension: 2000 # 64..8192
verbose: false # log every clamp
verbose: true 时会对每次 clamp 打日志,便于核对是否命中历史大图。
典型用法¶
- 按上文命令安装并重启
dsh web。 - 保持默认
maxDimension: 2000即可覆盖 README 描述的多图 Anthropic 场景;若仍失败,先确认插件日志为 active,再查 troubleshooting 文档。 - 开发插件本身时,在仓库根目录执行
npm test(node --test test/*.test.js)。测试会调用本机已安装 DSH 的真实requestImageDimensions;若 DSH 不在默认全局前缀,需设置DSH_GLOBAL_PREFIX。
排障时 README 建议:将 skills/image-cap-doctor 复制到 ~/.dsh/skills/ 后让 agent 加载 image-cap-doctor skill;另有 docs/TROUBLESHOOTING.md、docs/ERRORS.md。
适用场景与注意¶
适合谁:在 DSH web 里长期挂多张截图、设计稿或整页 capture,并走 Anthropic(或同样受 per-side 多图限制的路由)的开发者。
权限与安全:插件与当前 dsh 进程同权限运行,会参与请求路径上的图片读取与变换。安装前应在 GitHub 阅读源码与 MIT 许可证,自行判断是否纳入环境。社区插件目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态遵循「一切皆插件」,本仓库星标为 0(目录页线索),不代表功能不可用,仅作公开指标。
局限:只解决「请求投影时 per-side 超限」;若问题出在入库或其它网关,需结合 dsh-attachment-local 与路由配置排查。核心若将来内置 maxDimension,本插件的角色可能被上游替代。
链接¶
- 社区目录:https://www.skillhub.cn/plugins/lucagiftzek/dsh-request-image-cap
- 源码与完整说明:https://github.com/lucagiftzek/dsh-request-image-cap
经过上面的步骤,你可以在不大改附件库的前提下,让含多张历史大图的长会话重新满足 Anthropic 多图 per-side 限制,避免 latent 的 400 与 endless retry。