DeepSeek Harness 接不墨 Router:自定义 Provider 两条协议别把 /v1 填错
dsh 0.2.1-rc.2 用自定义 Provider 接不墨 Router:Anthropic 协议填根地址、OpenAI 协议带 /v1,附实测配置、工具调用、流式结果和 404 复现。

DeepSeek Harness(dsh)支持自定义模型供应商,可以接不墨 Router。 关键只有一条:选 Anthropic 协议时 baseURL 填根地址 https://router.bumo.cc,选 OpenAI 协议时才带 /v1。填反了客户端会拼出 /v1/v1/messages,直接 404。
核验日期:2026-10-25。实测版本 dsh 0.2.1-rc.2(SDK 0.2.1-rc.2),模型 deepseek/deepseek-flash。Anthropic Messages 与 OpenAI Completions 两条协议都跑通了对话、文件工具调用和流式输出。
安装
SDK 自带 dsh 命令和原生 runtime,不需要系统 Node.js。用独立 venv 安装,避免污染系统 Python:
python3 -m venv /tmp/dsh-venv
/tmp/dsh-venv/bin/pip install deepseek-harness-sdk
/tmp/dsh-venv/bin/dsh --version
版本输出 0.2.1-rc.2 即对应本次实测版本。
配置自定义 Provider
配置文件在 $DSH_HOME/profiles/sdk/cordis.patch.yml。Web UI 的「自定义模型 API」写的也是同一份配置,两种方式二选一即可:
- id: llm-pi-ai
config:
providers:
bumo:
apiKeyEnv: BUOMO_ROUTER_KEY
api: anthropic-messages
baseURL: https://router.bumo.cc
models:
- id: deepseek/deepseek-flash
bumo-openai:
apiKeyEnv: BUOMO_ROUTER_KEY
api: openai-completions
baseURL: https://router.bumo.cc/v1
models:
- id: deepseek/deepseek-flash
这里故意配了两个 provider:bumo 走 Anthropic Messages,bumo-openai 走 OpenAI Completions。你可以用同一个 Router Key 分别验证两条链路,接入现有代码时再保留需要的那一个。
Key 放在环境变量 BUOMO_ROUTER_KEY 里,由 apiKeyEnv 读取,不要直接写进 YAML:
export BUOMO_ROUTER_KEY=sk-... # 换成你的 Router Key
为什么 Anthropic 协议不能带 /v1
这是本次实测里唯一一个会让人以为「接不通」的坑。当 baseURL 填成 https://router.bumo.cc/v1 时,dsh 会自己再拼 /v1/messages,实际请求变成:
POST /v1/v1/messages?beta=true -> 404(Next.js 404 HTML)
把 baseURL 改回根地址 https://router.bumo.cc 后,请求就是 POST /v1/messages?beta=true -> 200,全程正常。OpenAI Completions 协议相反,baseURL 要带 /v1,由客户端拼 /chat/completions。
| 协议 | api |
baseURL |
|---|---|---|
| Anthropic Messages | anthropic-messages |
https://router.bumo.cc |
| OpenAI Completions | openai-completions |
https://router.bumo.cc/v1 |
调用与实测结果
调用侧可以这样指定 provider 和模型:
DeepSeekHarness(
provider='bumo',
model='deepseek/deepseek-flash',
dsh_home='/path/to/dsh-home',
env={'BUOMO_ROUTER_KEY': key},
)
| 项 | 输入 | 结果 |
|---|---|---|
| 对话(Anthropic 协议) | Reply with exactly: READY |
READY,finish: completed |
| 对话(OpenAI 协议) | 同上 | READY,finish: completed |
| 工具调用 | 用文件工具读 probe.txt |
读到 router compat probe file;事件里有 tool/call(read)和 tool/result(isError:false) |
| 流式 | 主对话 | POST /v1/messages?beta=true,stream:true,SSE 依次 message_start / content_block_delta / message_stop,200 |
模型目录探测也正常:GET /api/v1/models 和 GET /v1/models 都返回 200。Router 当日公开列表是 28 个模型,完整 ID 可以直接在 https://router.bumo.cc/v1/models 查。
用 Web UI 添加
不想手改 YAML 的话,可以启动 Web UI,在「自定义模型 API」里按同样字段添加:
npx @deepseek-ai/dsh web
| 字段 | 填什么 |
|---|---|
| API Key 环境变量 | BUOMO_ROUTER_KEY |
| 协议 | anthropic-messages 或 openai-completions |
| Base URL | 按上面的协议对照表 |
| 模型 ID | deepseek/deepseek-flash |
常见问题
| 现象 | 先查 |
|---|---|
404,路径里出现 /v1/v1/messages |
Anthropic 协议的 baseURL 多写了 /v1 |
404,路径是 /chat/completions 少一段 |
OpenAI 协议的 baseURL 少了 /v1 |
| 401 / 鉴权失败 | BUOMO_ROUTER_KEY 是否在当前进程环境里,Key 是否完整 |
| 模型不存在 | 模型 ID 是否带前缀、大小写是否一致 |
| 工具调用失败 | 先确认该模型在 Router 列表里标了 tools,再用最小文件读取复现 |
边界
dsh 目前是 developer preview,官方明确会有 breaking changes;本文结论只代表 0.2.1-rc.2。本次只覆盖最小对话、一次文件读取工具和流式输出,没有测长上下文、图片输入、并行工具调用和断流重连。升级后如果配置字段变化,以新版本文档和实际报错为准。
前往不墨 Router 获取 Key。dsh 这边记两句:Anthropic 协议填根地址,OpenAI 协议带 /v1。



