不墨 Router

发布于 2026 年 10 月 25 日 星期日

DeepSeek Harness 接不墨 Router:自定义 Provider 两条协议别把 /v1 填错

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

DeepSeek Harness 接不墨 Router:自定义 Provider 两条协议别把 /v1 填错

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。

继续阅读