昨天我遇到了一个奇怪的问题:在 dsh(DeepSeek Harness)里给 sensenova-6.8-flash-lite 上传图片,结果报错”Model does not support image input”。后来发现原因很简单——模型的 input 能力没有在配置里声明,pi-ai 默认只认文本。
修好之后我整理了所有模型的多模态能力,顺便把完整的配置方法写下来,方便以后用到。
一、dsh 是怎么判断模型是否支持图片的?
dsh 的 LLM 层用的是 pi-ai 库。它在收到图片请求时,会检查模型的 inputModalities:
1 | // pi-ai 源码 |
而模型的能力来自你的 settings.yaml:
1 | models: |
如果不写 input,pi-ai 使用默认值 ["text"],图片就被拒了。
记住一条规则:不声明 = 不支持。
二、各模型多模态能力对照表
根据供应商文档和源码逻辑,整理如下:
sense-nova 提供商(讯飞 Sensenova)
| 模型 ID | 支持图片 | 上下文窗口 | 备注 |
|---|---|---|---|
| sensenova-6.8-flash-lite | ✅ | 未声明 | 讯飞主力多模态模型 |
| sensenova-6.7-flash-lite | ❌ | 262144 | 纯文本 |
| sensenova-u1-fast | ❌ | 262144 | 快速版,纯文本 |
| sensenova-u1.5-lite | ✅ | 262144 | 多模态 |
| deepseek-v4-flash | ✅ | 1048576 | DeepSeek V4 系列支持图片 |
| deepseek-v4-pro | ✅ | 1048576 | DeepSeek V4 系列支持图片 |
| glm-5.2 | ✅ | 1048576 | 智谱 GLM 多模态 |
| kimi-k3 | ❌ | 1048576 | 月之暗面,代码/文本为主 |
hcnsec 提供商(HCNSEC 聚合代理)
| 模型 ID | 支持图片 | 备注 |
|---|---|---|
| auto | ⚠️ 不确定 | 自动路由,不固定模型,声明意义不大 |
| DeepSeek-V4-Flash | ✅ | 同 sense-nova 的 deepseek-v4-flash |
| DeepSeek-V4-Pro | ✅ | 同 sense-nova 的 deepseek-v4-pro |
| glm-5.3-flash | ✅ | 智谱新一代多模态 |
| longcat-2.0 | ✅ | LongCat 多模态 |
| spark-x2.5 | ✅ | 讯飞星火多模态 |
| step-3.7-flash | ✅ | Step 系列多模态 |
| sensenova-6.8-flash-lite | ✅ | 同 sense-nova |
| sensenova-u1.5-lite | ✅ | 同 sense-nova |
| kimi-k3 | ❌ | 纯文本 |
| MiniMax-M3 | ❌ | 文本/函数调用 |
| step-explore | ❌ | 文本探索类 |
| step-router-v1 | ❌ | 路由/函数调用类 |
| Qwen3-Embedding-8B | ❌ | 嵌入/基座模型 |
| Qwen3.6-35B-A3B | ❌ | 嵌入/基座模型 |
判定原则
- 有 “flash”、”lite”、”v4” 且来自 DeepSeek/GLM/讯飞星火/LongCat 的,通常支持图片
- 有 “embedding”、”router”、”explore”、”fast” 的,通常是纯文本
- “auto” 这种路由模型,声明了也没用,因为实际路由到的模型不确定
- 拿不准的时候,加上
input: [text, image]也没坏处——pi-ai 会在发送时做二次校验,不会造成额外问题
三、怎么修改配置
配置文件位置:/root/.dsh/settings.yaml
步骤一:编辑文件
用 vim 打开:
1 | vim /root/.dsh/settings.yaml |
步骤二:找到目标模型,加上 input 字段
修改前:
1 | - id: sensenova-6.8-flash-lite |
修改后:
1 | - id: sensenova-6.8-flash-lite |
注意 YAML 缩进要用空格,不要用 tab。
步骤三:重启 dsh
1 | kill $(pgrep -f 'dsh web') |
步骤四:验证
在 dsh web 里上传一张图片,如果不再报 MODEL_DOES_NOT_SUPPORT_IMAGES,就说明配置生效了。
四、完整的 settings.yaml 参考
以下是我修改后的完整配置,供参考:
1 | agent-default-model: |
五、一个容易踩的坑:API 格式
dsh 的 session.prompt 接口接受的图片格式,和 OpenAI API 不一样。
OpenAI 格式(不能用):
1 | {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}} |
dsh 格式(正确):
1 | {"type": "image", "mediaType": "image/jpeg", "data": "<base64>"} |
支持的 mediaType 只有四种:image/png、image/jpeg、image/webp、image/gif。
用错了格式会报 invalid_union 错误,和 MODEL_DOES_NOT_SUPPORT_IMAGES 长得很像,容易混淆。
六、总结
- dsh 不自动探测模型能力,你的
settings.yaml就是真相源 - 想支持图片,必须显式声明
input: [text, image] - 不确定某个模型是否支持图片? 加上声明通常没坏处,pi-ai 会在发送时做二次校验
- API 格式要匹配,dsh 用
mediaType+data,不是image_url
如果你在用其他我没列出来的模型,可以把模型 ID 告诉我,我帮你确认要不要加声明。