DeepSeek Harness 模型报错怎么排查?API 密钥、模型配置与自定义网关修复
DeepSeek Harness 模型报错,先读报错关键词再动手:MISSING_CREDENTIAL 和 401 查 API 密钥,UNKNOWN_MODEL 查模型配置,图片被拒或网关不兼容查 settings.yaml 的 input 与 compat。按下面速查表对号入座,翻到对应条目照做即可。
概览:先看报错关键词
遇到模型报错,先对报错关键词分类——不同关键词对应完全不同的根因。 下表把官方文档「排错」章节的报错全部列出(来源):
| 报错关键词 | 最可能原因 | 翻到 |
|---|---|---|
MISSING_CREDENTIAL | API 密钥没保存,或环境变量没注入 | MISSING_CREDENTIAL |
| 「获取可用模型」401 | 密钥错误,或服务不开 GET /models 端点 | 获取模型 401 |
UNKNOWN_MODEL | 模型不在已配置的 Provider 里 | UNKNOWN_MODEL |
| 图片在发送前被拒绝 | 模型未声明图片模态(input) | 图片被拒 |
| 提供方拒绝带图片请求 | 声明了端点实际不提供的图片能力 | 拒绝带图请求 |
| 自定义网关调用失败 / 推理内容不对 | 推理格式被按 URL 猜错(compat) | 推理格式不兼容 |
下面按三类展开,每类一个 H2、每条报错一个条目,按「报错信息 / 原因 / 解决方法」列。DSH 还在开发者预览阶段,配置字段以官方文档为准;模型配置变更在下一次请求时生效,不用重启服务(来源)。
第一类:API 密钥报错(MISSING_CREDENTIAL、401)
MISSING_CREDENTIAL
- 报错信息:连接时提示
MISSING_CREDENTIAL。 - 原因:密钥没到位——要么没在设置 → 模型页保存,要么环境变量没注入。密钥本体不写在 settings.yaml 里。
- 解决方法:
- 打开设置 → 模型,在对应 Provider 卡片填入 API Key 并保存。密钥存进
$DSH_HOME/.credentials.yaml,页面只收到脱敏描述符、永不回显明文(来源)。 - 或在 settings.yaml 里用
apiKeyEnv引用环境变量名(不是 Key 本体):
yamlllm-pi-ai: providers: my-gateway: apiKeyEnv: GATEWAY_API_KEY # 环境变量名,不是 Key 本体 api: openai-completions baseURL: https://gateway.example/v1 models: - id: my-model- 启动前先
export GATEWAY_API_KEY="sk-..."再运行 DSH。改完配置下一次请求就生效,不用重启服务(来源)。
- 打开设置 → 模型,在对应 Provider 卡片填入 API Key 并保存。密钥存进
获取可用模型返回 401
- 报错信息:设置 → 模型 → 获取可用模型 返回 401。
- 原因:模型发现会调用 OpenAI 兼容的
GET /models端点,很多网关不开放这个端点(来源)。 - 解决方法:
- 先确认密钥本身没错。
- 服务不开
GET /models,就直接在models里手动填模型 ID——ID 必须与提供方实际支持的 model 字段完全一致。
第二类:模型配置报错(UNKNOWN_MODEL)
UNKNOWN_MODEL
- 报错信息:发送请求时报
UNKNOWN_MODEL,或模型选择器显示「选择模型」并阻止输入。 - 原因:请求的模型不在已配置的 Provider 里(来源),两种典型情况:
- 会话保存的默认模型指向已删除的 Provider;
- 自定义 Provider 的
models列表缺这个模型 ID。
- 解决方法:
- 情况一:重新选择已配置的模型,或用同名把删掉的 Provider 加回来。
- 情况二:打开
$DSH_HOME/settings.yaml,在对应 Provider 的models块追加:
yamlmodels: - id: my-model - id: my-model-2 # 追加此行- 怀疑配置没写进去,先跑
dsh --dump-config看组合后的配置树里模型相关行,再决定改配置还是重建 Provider。
Provider ID 是永久的:请求、已保存会话、模型默认值和凭据引用都拿它做标识,改 ID 会让所有引用失效;官方给的重命名办法是添加新 Provider、再删除旧 Provider(来源)。
第三类:自定义网关兼容报错(图片模态、compat 推理格式)
这类最容易困惑:密钥和 Base URL 都对,但网关就是拒绝请求。根因基本是配置里没声明模型支持什么——不声明就按纯文本处理(来源)。
图片在发送前被拒绝
- 报错信息:附加图片时 dsh 直接拒绝,提示模型不支持图片,并点名具体模型。
- 原因:手动录入的模型默认纯文本——没有任何环节能询问端点接受哪些模态(来源)。
- 解决方法:在 settings.yaml 里给该模型声明图片模态:
一条路由下所有模型都支持图片,可改为路由级yaml
llm-pi-ai: providers: my-gateway: apiKeyEnv: GATEWAY_API_KEY api: openai-completions baseURL: https://gateway.example/v1 models: - id: vision-model input: [text, image] # 声明支持图片defaultInput: [text, image]回退(默认是[text]);未知模态写进任何位置都会被拒绝(来源)。 - 注意:DeepSeek 官方 chat-completions 路由是纯文本的,声明
input不会让它真支持图片——请求会被提供方拒绝(来源)。
提供方拒绝了带图片的请求
- 报错信息:请求被提供方拒绝,提示图片不被该端点支持。
- 原因:声明了端点实际不提供的图片能力——可能是模型的
input,也可能是路由的defaultInput。 - 解决方法:
- 从授予它图片能力的那个列表里移除
image。 - 开新会话:附加的图片会留在会话日志里,老会话在离开它之前会不断重复同一个请求(来源)。
- 从授予它图片能力的那个列表里移除
私有网关推理格式不兼容(compat)
- 报错信息:密钥、baseURL 都对,但自定义网关调用失败、推理内容缺失或思考方式不对。
- 原因:pi-ai 按端点 URL 猜推理方言(
reasoning_effort、DeepSeek 的thinking、z.ai 的thinking对象等),私有网关的 URL 说明不了任何方言,会被默认当成 OpenAI 方言通信(来源)。 - 解决方法:在路由或模型上声明
compat(只对openai-completions协议生效,模型级覆盖路由级):官方只开放yamlcompat: thinkingFormat: deepseek # 告诉适配器:这是 DeepSeek 推理方言compat.thinkingFormat与compat.supportsReasoningEffort两个开关;其余 compat 字段(如maxTokensField、supportsStore)自动探测、刻意不开放配置,别在配置文件里硬写。
完整排查流程
任何模型报错按这个顺序走,多数问题在前三步就能定位。
- 看报错关键词 → 对照概览的速查表,定位根因类型。
- 查配置声明 → 密钥是否保存/注入、模型 ID 是否在 models 列表、图片模态与推理格式是否声明。
- 确认版本与文档 → DSH 还在开发者预览阶段,字段以官方文档为准。
- 借助插件辅助 → 想直观看到每次调用走没走通,模型类 DSH plugin(token 用量、成本统计)可在 DSH Plugin Hub 的模型分类下挑。
注意事项
- 改 settings.yaml 的模型配置,下一次请求生效,不用重启 DSH。
apiKeyEnv填环境变量名,不是 Key 本体;密钥优先在设置 → 模型里保存。- 手动填的模型 ID 必须与提供方 model 字段完全一致,否则就是
UNKNOWN_MODEL。 - 图片模态要用
input声明,但别声明端点实际不支持的模态。 - DeepSeek 官方 chat-completions 路由纯文本,声明图片不会让它支持图片。
- 报错关键词定方向:
MISSING_CREDENTIAL/401 → 密钥,UNKNOWN_MODEL→ 模型配置,图片被拒/请求失败 →input与compat。
常见问题
密钥没到位:在设置 → 模型里给对应 Provider 填 API Key 保存(密钥存进 $DSH_HOME/.credentials.yaml),或在 settings.yaml 里用 apiKeyEnv 引用环境变量名,并在启动前 export 该变量。
请求的模型不在已配置的 Provider 里:重新选择已配置的模型,或在 settings.yaml 对应 Provider 的 models 块追加缺失的模型 ID。Provider ID 是永久的,改名要新建 Provider 再删旧的,否则旧会话引用全断。
手动录入的模型默认按纯文本对待。给该模型加 input: [text, image],或路由级写 defaultInput: [text, image] 回退;DeepSeek 官方 chat-completions 路由是纯文本的,无法通过配置改变。
不一定。模型发现会调用 OpenAI 兼容的 GET /models 端点,服务不提供该端点就会返回 401。先检查密钥,服务不开这个端点就直接在 models 里手动填模型 ID。
查配置声明:模型是否声明了图片模态(input),私有网关的推理格式是否被按 URL 猜错(compat.thinkingFormat)。改完下一次请求生效,不用重启 DSH。
来源
- DeepSeek Harness 官方文档 - 配置模型(含排错章节)· deepseek-harness
- @deepseek-ai/dsh-llm-pi-ai README· deepseek-ai