跳到主要内容
注册

在 DeepSeek Harness 中把 Router One 添加为自定义模型 API

DeepSeek Harness(dsh)是 DeepSeek 开源的 Agent 框架(agent harness):工具在你的机器上执行,每一轮模型调用发给你配置的提供商。它的「设置 → 模型」页支持「自定义模型 API」提供商,由 API 地址、一种 API 协议、Key 和模型 ID 组成。把 Router One 加进去,一把 Key 就能用上目录中的 Claude、GPT、Gemini、Grok 和 DeepSeek 对话模型,每个请求都记录在控制台 → 日志中。本指南以 dsh web 启动的 Web UI 为准,依据 dsh 0.2.0-rc.2(2026-10-03 时 npm 的 latest 标签)的提供商配置文档与源码核对(2026-10-03)。dsh 仍是预览版:README 提示会有破坏兼容性的变更;按 deepseek.com(2026-10-03 核对),DeepSeek Harness 处于公开预览阶段,并提供 macOS 与 Windows 桌面版下载,请按你实际运行的版本对照下面的步骤。

启动 dsh Web UI,并创建专用 Key

dsh 的 README 给出的运行方式是 npm:安装 Node.js 后运行 npx @deepseek-ai/dsh web,它会在 http://127.0.0.1:3080 启动 Web UI,并用默认浏览器打开(加 --no-open 则不打开浏览器)。2026-10-03 时 npm 的 latest 标签是 0.2.0-rc.2(2026 年 9 月 29 日发布);想运行同一版本,可在包名后加 @0.2.0-rc.2。按 dsh 0.2.0-rc.2 源码,首次运行且还没有可用的提供商时,会弹出为官方 DeepSeek 提供商添加 API Key 的提示;在那里选「稍后配置」即可,因为 Router One 提供商使用自己的 Key。然后在控制台 → API 密钥点「创建密钥」,为 dsh 单独建一把 Key,并设置 maxSpend 上限。一次 Agent 任务的每一轮模型调用都是一个请求,只把工具结果交回模型的那几轮也算,所以长任务可能在你不再输入的情况下产生大量计费请求。maxSpend 是硬上限,专用 Key 也方便在控制台 → 日志里只筛出 dsh 的请求。

terminal
npx @deepseek-ai/dsh web              # Web UI 地址 http://127.0.0.1:3080
npx @deepseek-ai/dsh@0.2.0-rc.2 web   # 本指南核对时的版本

在 DeepSeek Harness 中添加 Router One 自定义模型 API

打开「设置 → 模型」,点「添加模型提供商」。卡片默认打开在「第三方模型提供商」,那是 dsh 内置的各家官方 API 列表;把它切换到「自定义模型 API」。Provider ID 填 router-one 之类的名称:必须以小写字母开头,只能使用小写字母、数字和短横线;dsh 文档说明 Provider ID 是永久的,因为请求、已保存的会话、模型默认值和凭据引用都会用到它。「显示名称」填 Router One,「API 地址」填 https://api.router.one/v1,「API 协议」选 OpenAI Chat Completions,「API 密钥」粘贴专用 Key;按 dsh 文档,密钥只写不读,保存在 $DSH_HOME/.credentials.yaml 中。至少按精确的目录 ID 添加一个模型,例如 anthropic/claude-sonnet-5(「获取可用模型」见后文添加模型一节),然后点「创建提供商」。添加的模型会出现在模型选择器中。选中模型也会把它设为新会话的默认模型,而已经发过请求的会话会保留原来的模型,所以要换模型请新开会话。填好的表单如下:

Base URL (OpenAI Chat Completions, OpenAI Responses)
https://api.router.one/v1
Base URL (Anthropic Messages)
https://api.router.one
deepseek-harness-custom-model-api
# DeepSeek Harness:设置 → 模型 → 添加模型提供商 → 自定义模型 API
# DeepSeek Harness: Settings → Models → Add model provider → Custom model API
Provider ID:               router-one
显示名称 / Display name:   Router One
API 地址 / Base URL:       https://api.router.one/v1
API 协议 / API protocol:   OpenAI Chat Completions
API 密钥 / API key:        sk-your-router-one-key
模型 ID / Model ID:        anthropic/claude-sonnet-5

# GPT 的 ID:第二个提供商 / GPT IDs: a second provider
router-one-responses       OpenAI Responses     https://api.router.one/v1
# 可选:Claude 原生格式 / Optional: Claude in its native format
router-one-anthropic       Anthropic Messages   https://api.router.one

每种协议一个提供商:API 地址与模型 ID

dsh 文档写得很明确:一个提供商只使用一种协议,网关同时提供两种协议时需要建两个提供商。Router One 在 Chat Completions 上提供全部对话模型,在 Responses 上原生提供 GPT 系列、DeepSeek V4 与 Grok 对话模型,在 Anthropic Messages 上提供 Claude 系列与 DeepSeek V4 的 ID,所以选哪种协议,决定了这个提供商能列哪些 ID。API 地址不要带最后的 /chat/completions、/responses 或 /messages;dsh 表单里两种 OpenAI 协议的占位地址是 https://gateway.example/v1,Anthropic Messages 的占位地址是 https://gateway.example。Anthropic Messages 请保持主机根地址:按 dsh 的架构笔记,「获取可用模型」对这种协议两种写法都接受,但对话请求原样使用你填的地址,Anthropic 客户端还会自己补上 /v1。Claude ID 发到 Responses 提供商,会在调用任何模型之前被 HTTP 400 拒绝(model '<id>' must be called via /v1/messages or /v1/chat/completions);Claude 与 DeepSeek 系列以外的对话 ID 发到 Anthropic Messages 提供商,会收到提示 must be called via /v1/chat/completions 的 400。

每种协议一个提供商:API 地址与模型 ID
dsh 的 API 协议(存储值)本指南使用的 Provider IDAPI 地址Router One 请求路径与模型 ID
OpenAI Chat Completions(openai-completions)router-onehttps://api.router.one/v1POST /v1/chat/completions;全部对话模型:Claude、GPT、Gemini、Grok 与 DeepSeek 的 ID
OpenAI Responses(openai-responses)router-one-responseshttps://api.router.one/v1POST /v1/responses;GPT 系列、DeepSeek V4 与 Grok 对话模型 ID
Anthropic Messages(anthropic-messages)router-one-anthropichttps://api.router.onePOST /v1/messages;Claude 系列与 DeepSeek V4 的 ID

添加模型:获取可用模型,或手动填精确 ID

在表单的「模型目录」里,「获取可用模型」会用表单当前的 API 地址、协议和 Key 询问端点。按 dsh 0.2.0-rc.2 源码,两种 OpenAI 协议发送 GET {API 地址}/models 并带 Bearer Key,Anthropic Messages 发送 GET /v1/models 并带 x-api-key 请求头;这两种请求头 Router One 都接受。Router One 只在 Key 有效时回应这个请求,返回的是整个目录,包括生图模型,无论哪种协议来问都一样,所以只勾选该提供商协议支持的对话 ID,再点「添加所选」。dsh 文档把探测称为便利手段而非保证:探测失败或列表为空时,用「添加模型」逐个手动添加从 /models 精确复制的 ID,效果完全一样。保存前请逐行检查:按同一份源码,「获取可用模型」添加的行可能带着列表里的容量值。「上下文窗口」按 /models 上该模型详情页的窗口填写;详情页显示的是取整后的缩写(1.05M、500K),请换算成整数并往小取:anthropic/claude-sonnet-5 与 deepseek-v4.1-flash 填 1000000,grok-4.7 填 500000。「最大输出 token 数」填你想要的上限,或清空以沿用 dsh 为该提供商设定的默认值;推理模型的思考 token 也计入这个上限,请留出余量。图片输入按 dsh 文档的做法设置:编辑提供商,打开「自定义设置」并展开该模型的「模型选项」;只有 /models 上该模型的详情页标明支持图片输入时,才在「输入类型」中勾选「图片」(例如 deepseek-v4-flash 只支持文本)。

跑 Agent:工具调用、GPT 的 ID 与 Responses 提供商

dsh 在它所在的机器上执行工具,每一轮模型调用发给所选模型所属的提供商;Router One 只承载这些模型请求。请选择 /models 详情页标明支持工具调用的 ID。GPT 的 ID 放在 OpenAI Responses 提供商下:按 OpenAI 的 GPT-6 指南(2026-10-03 核对),GPT-6 Astra 与 GPT-6.1 Sol 的工具调用只走 Responses API,且不接受推理强度 none;GPT-6 Sol 在 Chat Completions 上只有推理强度为 none 时才能调用函数。Router One 在 /v1/responses 上原生提供 GPT 系列模型,所以请把 openai/gpt-6.1-sol 或 openai/gpt-5.6-sol 加到 router-one-responses,而不是 Chat Completions 提供商。Claude 的 ID 走 Chat Completions 或 Anthropic Messages 提供商都可以,Gemini 的 ID 走 Chat Completions,Grok 的 ID 走 Chat Completions 或 Responses,DeepSeek V4 的 ID 三种都行。每一轮调用(包括只交回工具结果的那一轮)都是一个单独计费的请求,记录在控制台 → 日志中。

在 cordis.patch.yml 中设置推理等级与请求选项

模型页没有推理等级和请求兼容开关这类字段。dsh 把它们放在 $DSH_HOME/profiles/<profile>/cordis.patch.yml,也就是模型页写入的同一份文件;按 dsh 文档,用 dsh web 常规启动 Web UI 时 <profile> 就是 web,浏览器与 dsh 在同一台机器上时,可以点设置页顶部的「打开配置文件」打开它。只修改模型页已经写好的提供商条目,并保留其中的其他字段和模型,因为 Cordis 的覆盖会替换整个条目;dsh 会在下一次请求时重新读取这个文件。手动添加的模型没有声明推理等级,所以不会出现推理等级菜单,是否思考由模型自身的默认值决定。给模型加上 reasoningEfforts 就会出现菜单,写法见下方 openai/gpt-5.6-sol 的例子。按 dsh 文档,声明了推理等级的模型会用 developer 角色发送系统提示词;Router One 的 Chat Completions 参考文档列出的消息角色是 system、user、assistant 和 tool,所以在 Chat Completions 提供商上同时设置 compat.supportsDeveloperRole: false。对 GPT-6 Astra 与 GPT-6.1 Sol,不要在 reasoningEfforts 里把 off 设为 none:按 OpenAI 的 GPT-6 指南(2026-10-03 核对),这两个模型都不接受 none。输出上限不需要额外开关:dsh 文档说,遇到无法识别的地址时,pi-ai 会把输出上限写成 max_completion_tokens,而 Router One 的 Chat Completions 同时接受 max_tokens 和 max_completion_tokens 作为输出上限(两者都传时以 max_completion_tokens 为准);Responses API 的输出上限字段是 max_output_tokens。

cordis.patch.yml
# $DSH_HOME/profiles/<profile>/cordis.patch.yml(dsh web 的 <profile> 是 web)
# 只修改模型页已写好的条目,保留其中的其他字段和模型。
- id: llm-pi-ai
  config:
    providers:
      router-one:
        compat:
          supportsDeveloperRole: false
      router-one-responses:
        models:
          - id: openai/gpt-5.6-sol
            reasoningEfforts:
              low: low
              medium: medium
              high: high

DeepSeek Harness 该填哪个模型 ID?

从 /models 页复制精确的模型 ID,保留大小写、连字符和版本后缀,不要用展示名称代替。打开该模型的详情页,核对支持的 API 端点、上下文窗口和工具调用等能力,再与 DeepSeek Harness 当前选择的 provider 和功能对应。模型出现在目录里,不等于当前客户端能调用它的所有功能。建议为每个客户端或应用单独建 API Key,并设置 maxSpend 消费上限。

DeepSeek Harness 用的是哪种 API 协议?

OpenAI 兼容描述的是接口格式,不能据此推断 Chat Completions(/v1/chat/completions)、Responses(/v1/responses)和 Anthropic Messages(/v1/messages)可以互换。先核对工具当前版本、provider 配置和实际请求路径,再查模型详情与 API 兼容性事实页。一次普通对话成功,也不能证明服务端工具、历史状态或文件编辑功能都受支持。

在请求日志里核对 DeepSeek Harness 的调用

先在 DeepSeek Harness 发出一次简单文本请求,再到控制台 → 日志按时间、模型和 request_id 找到这条记录,核对 Token、花费、总耗时和状态码。成功后再分别验证流式输出、工具调用和多轮历史。失败时保留实际请求路径、完整错误消息及 request_id;没有对应日志时,先查客户端配置和网络,不能仅凭客户端报错认定是网关或上游故障。

常见问题

在 DeepSeek Harness 的哪里添加 Router One?

在「设置 → 模型」点「添加模型提供商」,把卡片从「第三方模型提供商」切换到「自定义模型 API」;第三方列表对应各家官方 API,要用它们自己的 Key。Provider ID 填 router-one,「API 地址」填 https://api.router.one/v1,「API 协议」选 OpenAI Chat Completions,填入 Router One Key,并从 /models 至少添加一个精确的模型 ID,然后点「创建提供商」。GPT 的 ID 再建一个 OpenAI Responses 提供商;如需 Claude 原生消息格式,可以再建一个 Anthropic Messages 提供商,API 地址填主机根地址 https://api.router.one。

DeepSeek Harness 提示 API Key 无效,该查什么?

先看 Key 填在了哪个提供商:Router One Key 应填在你的「自定义模型 API」提供商的「API 密钥」里,「设置 → 模型」上的 DeepSeek 卡片放的是 DeepSeek 官方 API 的 Key。只粘贴 Key 本身:按 dsh 0.2.0-rc.2 源码,Key 里含有 HTTP 请求头无法携带的字符时,「获取可用模型」会拒绝发送(提示 paste the raw key only);端点返回 401 时,它会报告「answered 401; check the API key」。再到控制台 → API 密钥确认这把 Key 仍然可用。dsh 的密钥只写不读,要替换已保存的 Key,在表单里输入新值即可。

「获取可用模型」失败或列表为空,还能用这个提供商吗?

能。dsh 文档说明,探测失败或列表为空时手动添加模型 ID 即可,效果完全一样。这里报 401,说明表单里的 Key 缺失或错误,因为 Router One 只在 Key 有效时回应 GET /v1/models。列表能加载时,返回的是整个目录(含生图模型),只勾选该提供商协议支持的对话 ID。

能在 DeepSeek Harness 里用 Claude 吗?

能。把 anthropic/claude-sonnet-5 这类 Claude 系列 ID 加到 Chat Completions 提供商;想用 Claude 原生消息格式,就再建一个 Anthropic Messages 提供商,API 地址填主机根地址 https://api.router.one,DeepSeek V4 的 ID 也能放在这个提供商下。不要把 Claude ID 放到 Responses 提供商,那里会返回 HTTP 400。这些请求从你的 Router One 账户扣费:按 token 从钱包扣,或者对 /pricing 上各档套餐列出的模型扣套餐额度。

还需要 DeepSeek 的 API Key 吗?

Router One 提供商不需要,它只用你的 Router One Key;目录里的 deepseek-v4.1-flash 和 deepseek-v4-flash 与其他 ID 一样跑在这把 Key 上。DeepSeek 卡片放的是 DeepSeek 官方 API 的 Key,只有通过那张卡片使用的模型才需要。本指南按 dsh web 启动的 Web UI 编写,不涉及桌面版首次启动的界面;按 dsh 的架构笔记,桌面版使用自己的 profile,所以它的 cordis.patch.yml 不是 web 那一份。

能不能直接把内置的 DeepSeek 卡片指向 Router One?

不建议这样做。按 dsh 文档,内置提供商的模型列表一律来自 dsh 已安装的目录,即使它的 API 地址指向网关也是如此,所以它的模型 ID 不一定与 Router One 的一致。请添加「自定义模型 API」提供商,并使用 /models 上的 ID。

为什么我添加的模型没有推理等级菜单?

按 dsh 文档,手动添加的模型没有声明推理等级,所以选择器里不出现推理等级菜单,是否思考由模型自身的默认值决定。在 cordis.patch.yml 中给这个模型加上 reasoningEfforts(写法见上一节);在 Chat Completions 提供商上还要设置 compat.supportsDeveloperRole: false。

DeepSeek Harness 能通过网关用哪些模型?

选用当前目录中同时支持 DeepSeek Harness 所用端点和所需功能的模型。精确 ID、当前单价与能力以 /models 及模型详情为准;不要仅按 GPT、Claude 等系列名判断兼容性。客户端能列出模型,只说明它从自身配置或 GET /v1/models 读到了这个 ID,仍需验证实际调用。

能列出模型,但调用报 400 或 404,怎么办?

先记录实际请求路径和错误消息,再核对精确模型 ID。400 可能是参数、工具类型或模型与端点不匹配;404 可能是请求路径或资源不存在,不能直接判定模型下线。若错误提示 must be called via,按它指明的端点调整客户端 provider,或换用支持当前端点的模型。不要在所有工具里统一增删 /v1 或 /chat/completions。

中国大陆能直连吗?

能。Router One 在大陆可直连、无需 VPN,dsh 从它所在的机器直接把模型请求发到 api.router.one,所以提供商配置与其他地区完全一致。dsh 本身的安装(用 npx 从 npm 仓库运行,或从 deepseek.com 下载桌面版)另行处理,与 Router One 无关。

报 401/402/403/429 怎么排查?

先到控制台 → 日志核对这条请求及错误消息。401 查 Key 是否传入和有效;402 查钱包余额与 maxSpend;403 查 Key 权限和访问限制;429 查请求频率、token 限额及上游限流,按错误来源处理。保留 request_id,再按错误码速查页逐项排查。