文档

文档

DeepSeek Harness

DeepSeek Harness 保留自己的 DeepSeek 卡片,并在旁边添加你创建的卡片。在“Add model provider” → “Custom model API”下填写五个字段,即可在同一个模型选择器中使用 Claude 和 GPT,并共用一个密钥。

Settings → Models → “Add model provider” → “Custom model API” 需要五个字段 — Provider ID、显示名称、基础 URL、API 协议和 API 密钥 — 让 Claude 与 GPT 和内置 DeepSeek 卡片一起出现在同一个选择器中。

Settings → Models → Add model provider → Custom model API
# Settings → Models → Add model provider → Custom model API
#
#   Provider ID     kunavo          (lowercase, and permanent)
#   display name    Kunavo
#   base URL        https://api.kunavo.com/v1
#   API protocol    OpenAI Chat Completions   (openai-completions)
#   API key         sk-kn-...
#
# Then Model catalog → Fetch available models → Add selected,
# or type the ids by hand. The page writes the active profile's
# $DSH_HOME/profiles/<profile>/cordis.patch.yml — profile "web" under
# `dsh web`. The same provider there, plus an optional second one
# that sends Claude ids over Anthropic Messages, whose base URL has
# NO /v1. This entry replaces the whole llm-pi-ai config: keep any
# provider already in it.

- id: llm-pi-ai
  config:
    providers:
      kunavo:
        apiKeyEnv: KUNAVO_API_KEY
        api: openai-completions
        baseURL: https://api.kunavo.com/v1   # → /v1/chat/completions
        models:
          - id: claude-sonnet-5
          - id: claude-opus-5
          - id: claude-haiku-4-5
          - id: gpt-5-6-sol
      kunavo-claude:
        apiKeyEnv: KUNAVO_API_KEY
        api: anthropic-messages
        baseURL: https://api.kunavo.com      # → /v1/messages
        models:
          - id: claude-sonnet-5
          - id: claude-haiku-4-5
基础 URL 取决于 API 协议。 openai-completions 应填写 https://api.kunavo.com/v1;anthropic-messages 应填写 https://api.kunavo.com,不带 /v1,因为 dsh 会自行附加 /v1/messages。使用 dsh 0.2.0-rc.2 对记录请求的模拟端点进行测试,确认了两种情况:第一种请求发送到 /v1/chat/completions;第二种从裸根地址发送到 /v1/messages?beta=true,而当基础 URL 保留 /v1 时则发送到 /v1/v1/messages。真实网关会对此返回 404,而不是身份验证错误。
reasoningEfforts 会改变系统提示的角色,而不会改变它是否会发送。 Harness 的文档说明,声明支持推理的模型会以 role: "developer" 作为系统提示的角色发送。Kunavo 在所有模型系列中(包括 Claude)都会将该角色识别为系统轮次,因此无需为此启用 compat。在 2026-09-30 之前,Claude 路径会丢弃该角色,本说明当时建议设置 compat.supportsDeveloperRole: false;如果你已经设置了,该配置无害,可以保留。
Kunavo 不提供任何 DeepSeek 模型。 此提供商与 DeepSeek 卡片并列,而不会取代它 — 对于 deepseek- ID,请继续使用原来的 DeepSeek 密钥;对于下表中的 Claude 和 GPT ID,则使用此提供商。这也意味着 Harness 文档中为“通过 OpenAI 兼容网关调用 DeepSeek V4”提供的 compat.thinkingFormat: deepseek 开关在这里没有作用。
你的会话日志不会随请求发送。 在内置 DeepSeek 路由中,dsh 会在每个请求中添加两个模型看不到的字段:dsh_session_log,即会话事件(包括你的工作目录路径);以及 dsh_plugin_packages。在测试中,这两个字段都没有通过自定义提供商发送,因此 Kunavo 提供商不会收到它们。字段大小及关闭上传的开关见 DeepSeek Harness 定价。
Kunavo 无人测试过 DeepSeek Harness 是否能连接其端点。 以下是在下述日期实际测试的内容:从 npm 获取的 dsh 0.2.0-rc.2,在无头模式下,为每条路由创建三个全新会话,连接到一个记录每个请求并以一次工具调用作为响应的本地模拟端点 — 不是 Kunavo,也不是模型。全部九个会话都完成了流式工具往返,并且每次发送的字节都相同,因此确认了本页面中的路径和上限。这并不能说明 Kunavo 的身份验证、路由或模型回答情况。下方的 curl 是 Kunavo 端的验证方法,你可以在十秒内自行检查;dsh 仍是持续更新中的开发者预览版。
Kunavo 不提供嵌入、文本转语音或语音转文本模型,因此此提供商只能处理聊天补全。用于转录音频或构建向量索引的 Harness 插件会继续使用其现有的提供商密钥 — 添加此提供商不会转移这些调用。
还没有密钥?创建 Kunavo 账户,创建一个密钥(以 sk-kn- 开头),并充值 $10 起——调用费用从该余额中扣除,失败的调用不会收费。随后,控制台会打开 DeepSeek Harness 设置页面。

分步操作

  1. 在 /app/keys 创建密钥并复制——它只会显示一次。
  2. 启动 Web UI(dsh web),然后前往 Settings → Models。选择 Add model provider。卡片默认打开时显示 Third-party model provider,其中仅列出 dsh 自带的提供商 — 请切换到 Custom model API。
  3. 填写 Provider ID(使用小写字母,且设定后不可更改 — 文档说明,请求、已保存的会话、模型默认设置和凭据引用都会使用此 ID;如需重命名,必须添加新的提供商并删除旧提供商)、显示名称、基础 URL https://api.kunavo.com/v1、API 协议 OpenAI Chat Completions 和 API 密钥。密钥只能写入,不能读取;dsh 会将其保存在 $DSH_HOME/.credentials.yaml 中,并且只在配置文件中存储其引用。
  4. 在 Model catalog 下选择 Fetch available models — Kunavo 会返回 GET /v1/models,因此模型选择器会自动填充。勾选所需模型,然后选择 Add selected。手动输入 ID 的效果相同;文档建议在自动发现未列出任何模型时使用此方法。
  5. 可选:若要通过 Anthropic 自有协议使用 Claude ID,可再添加一个自定义模型 API,并为其设置独立的 Provider ID、基础 URL https://api.kunavo.com(不带 /v1)、API 协议 Anthropic Messages 和同一个密钥。此处的 Fetch 也会列出整个目录;只添加 claude- ID(为什么只添加这些)。
  6. 在编辑器中选择一个模型,然后发送一个需要操作文件的回合,而不是只打招呼 — Harness 的大多数功能都依赖工具调用,因此首次运行时读写一些内容能提供更多信息。模型更改会在下一个请求中生效;文档明确说明无需重启。

已于 2026年10月1日 对照 DeepSeek Harness 的“Configure models”页面(与标签 dsh-v0.2.0-rc.2 下 docs/user/guide/providers.md 的文本相同) 检查。第三方设置会发生变化;如果这里的字段名称不再与你看到的内容一致,应以该页面为准,而不是本页。

调试客户端前先验证

一个请求即可确定故障来自端点、密钥还是配置文件。如果返回 JSON,则相同的基础 URL 和密钥可以在 DeepSeek Harness 中使用。

# Settles whether a failure is the endpoint, the key, or the client.
curl -sS https://api.kunavo.com/v1/models \
  -H "Authorization: Bearer sk-kn-..."

字段中应填写哪个模型 ID

每个文本模型都可通过模型 ID 访问——实时列表见 GET /v1/models,包含价格的目录见模型页面。费率单位为每 1M token 的美元,格式为输入 / 输出。

模型 IDKunavo 输入 / 输出它在 DeepSeek Harness 中的位置
claude-sonnet-5$1.40 / $7.00作为文件编辑会话默认工作模型
claude-opus-5$3.50 / $17.50规划一个出错代价高昂的变更
claude-haiku-4-5$0.70 / $3.50低成本调用——分诊、摘要,以及全天运行的循环
gpt-5-6-sol$2.00 / $12.00使用同一个密钥和同一个提供商,获取来自另一个模型系列的第二种意见
gpt-5-6-terra$0.70 / $4.20长输入;此时令牌单价决定账单金额
计费方式是从预付余额中按 token 扣费,无月费——参见 计费。对于重复上下文——这正是编辑器或聊天客户端发送内容的大部分——提示缓存对账单的影响大于模型选择。

通过 Anthropic Messages 调用 Claude

Kunavo 也支持 Anthropic Messages API,而 anthropic-messages 是表单提供的三种协议之一。Harness 文档明确说明:“一个提供商使用一种协议,因此支持两种协议的网关需要配置两个提供商” — 所以这应作为与第一个提供商并列的第二个提供商添加,而不是设为第一个提供商的选项。

  • 基础 URL https://api.kunavo.com,即裸根地址。 在测试中,该根地址将请求发送到 /v1/messages?beta=true — 这也是 Claude Code 使用的路径,Kunavo 也支持此路径。若 URL 末尾带有 /v1,请求则会发送到 /v1/v1/messages。DeepSeek Harness 与 Claude Code 对比 将两个客户端的请求并列展示。
  • 仅限 Claude ID。 Kunavo 的 /v1/messages 只提供 claude- ID,不提供其他模型;若在此处使用 gpt- ID,会返回错误 404,其中会指出 /v1/chat/completions。请在 openai-completions 提供商中使用 GPT。
  • Fetch 会列出所有模型;只添加 Claude 模型。 dsh 的 llm-pi-ai README 说明,此协议下的模型发现会使用 Anthropic 的 x-api-key 标头发送 GET /v1/models 请求;Kunavo 的模型列表会像在 Authorization: Bearer 中一样从该标头读取密钥 — 这一点来自 dsh 的源代码和 Kunavo 自己的测试,并非本次测试所得。本次 Fetch available models 获取到的是整个目录,包括 GPT 和图像模型,因此只勾选 claude- ID;手动输入 ID 也同样可行。完整列表并不能说明所有事情:同一份 README 说,列表 URL 带或不带 /v1 都可以使用,而模型请求则会原样使用基础 URL — 因此 Fetch 也会从 https://api.kunavo.com/v1 获取列表,而从该基础 URL 发出的第一个回合会发送到 /v1/v1/messages。
  • 它能带来的好处。 请求以 Anthropic 的格式到达 — 在测试中,系统提示以顶层字段 system 传递,因此不会涉及 developer 角色 — Kunavo 会按原样转发,而不会将其从 OpenAI 格式转换。openai-completions 提供商则通过转换请求格式访问相同的 Claude ID,这也是步骤中采用它的原因。

表单背后的文件

Models 页面会写入 $DSH_HOME/profiles/<profile>/cordis.patch.yml — 以 dsh web 启动时为 $DSH_HOME/profiles/web/cordis.patch.yml。较早版本的 dsh 文档指向 $DSH_HOME/settings.yaml;0.2.0-rc.2 版本的文档不再如此。当浏览器与服务器运行在同一台机器上时,点击 Settings 标题栏中的 Open configuration file 即可打开该文件;适配器会在下一个请求时重新读取配置。对于此端点,有五项设置需要关注:

  1. 上下文窗口和最大输出令牌数 — 在表单中,位于 Customized settings → Model options 下。手动输入的 ID 不包含这两项设置,因此会采用路由的回退值:上下文为 262,144 个令牌,输出为 32,768 个令牌,依据是 llm-pi-ai README — 在测试中,两个自定义提供商请求的值也恰好都是 max_tokens: 32768。上表中的每个 ID 所需值都更高;无论如何,请检查相应条目;如需更高上限,可从模型的 目录条目 中调高。Kunavo 按模型实际生成的令牌计费,而不是按上限计费。
  2. compat.supportsDeveloperRole — 无需设置。Harness 建议在网关拒绝 developer 角色时启用它;Kunavo 会在所有模型系列(包括 Claude)中将该角色识别为系统轮次。(在 2026-09-30 之前,Claude 路径会丢弃该角色,本条当时建议设置此开关 — 保持启用没有影响。)
  3. compat.maxTokensField — 保持默认值即可。Harness 通常将它与上面的开关一起作为首选修复方案,但 Kunavo 自身的处理程序会读取 max_completion_tokens 并回退到 max_tokens,因此默认值已经可用。
  4. reasoningEfforts — 表单中没有此字段。手动输入的模型不会声明推理等级,因此不会显示 Effort 菜单;是否启用推理由端点自身的默认设置决定。如需使用该菜单,请自行声明等级;在 openai-completions 中,每个键代表一个等级,其值是作为 reasoning_effort 发送的写法。这对 gpt- ID 有效;对于 claude- ID 则不起作用,因为 Kunavo 的聊天接口不会将 reasoning_effort 转发给 Anthropic(/docs/chat#reasoning)。
  5. 输入类型(文件中的 input: [text, image])— 文档明确说明,这“只是声明你的端点支持什么,并不会对其进行检查”。如果为不支持图像的 ID 勾选 Image,Harness 不会发现问题;请求会在后续环节被拒绝。勾选该选项之前,请在 /models 上检查相应 ID。

会话发送的其他内容 — 每回合 24 个工具定义、每个新会话发送一次简短标题请求,以及 DeepSeek 自有路由中的额外字段 — 其开销见 DeepSeek Harness 定价。

常见问题

如何向 DeepSeek Harness 添加自定义 API 提供商?

使用 dsh web 启动 Web UI,前往 Settings → Models,然后选择“Add model provider”。卡片默认打开时显示“Third-party model provider”,其中仅列出 dsh 自带的提供商;请切换到“Custom model API”。表单要求填写小写的 Provider ID、显示名称、基础 URL、API 协议和 API 密钥,然后在 Model catalog 下至少添加一个模型。Provider ID 设定后不可更改,因为请求、已保存的会话、模型默认设置和凭据引用都会使用它;如需重命名,必须添加新的提供商并删除旧提供商。在 0.2.0-rc.2 中,该页面会将配置保存到当前配置文件的 cordis.patch.yml — 使用 dsh web 时,路径为 $DSH_HOME/profiles/web/cordis.patch.yml。

DeepSeek Harness 的基础 URL 末尾需要加 /v1 吗?

这取决于 API 协议。对于 openai-completions,需要:使用 https://api.kunavo.com/v1;在 dsh 0.2.0-rc.2 的一次测试中,请求被发送到 /v1/chat/completions。对于 anthropic-messages,不需要:使用 https://api.kunavo.com,因为 dsh 会自行附加 /v1/messages — 使用裸根地址时,请求发送到 /v1/messages?beta=true;而基础 URL 以 /v1 结尾时,请求会发送到 /v1/v1/messages,真实网关会对此返回 404,而不是身份验证错误。该测试使用的是记录请求的本地模拟端点,并非 Kunavo。

DeepSeek Harness 能否使用 Claude 或 GPT 模型代替 DeepSeek?

可以。API 协议字段指的是传输格式,而不是供应商:openai-completions 是 OpenAI Chat Completions,openai-responses 是 Responses API,anthropic-messages 是 Anthropic Messages API。自定义提供商会将模型 ID 原样传递给你配置的基础 URL,因此 Claude 或 GPT ID 会在该端点解析,而不是在 Harness 内解析。在 Kunavo 上,配置指向 https://api.kunavo.com/v1 的 openai-completions 提供商可访问 Claude 和 GPT ID;配置指向 https://api.kunavo.com 的第二个 anthropic-messages 提供商则只能访问 Claude ID,并使用 Anthropic 自有的请求格式。两者都会与内置 DeepSeek 卡片并列,而不会取代它,因此 DeepSeek ID 仍会使用你的 DeepSeek 密钥。

DeepSeek Harness 会向自定义提供商发送什么内容?

在一次记录 dsh 0.2.0-rc.2 请求的测试中,两个自定义提供商 — openai-completions 和 anthropic-messages — 都在每个代理回合发送了 24 个工具定义,并请求 max_tokens 32,768;这是 Harness 为手动输入且未指定大小的模型设定的回退值。每个新会话还会发送一次简短的标题请求,其 max_tokens 为 64。两者都没有发送 dsh_session_log 或 dsh_plugin_packages:这两个字段分别是会话事件日志和已安装插件列表,只会随内置 DeepSeek 路由发送。测试使用的是记录请求的模拟端点,而非 Kunavo,因此它表明的是 dsh 发送什么,而不是任何提供商如何处理这些内容。

为什么 DeepSeek Harness 的行为像是忽略了我的系统提示?

请检查模型是否声明了推理等级。对于 openai-completions,Harness 会将推理模型的系统提示作为 role "developer" 而不是 "system" 发送,因为它会根据端点 URL 推断请求格式,并将其不认识的地址视为非 OpenAI 自身端点。Kunavo 会在所有模型系列(包括 Claude)中将该角色识别为系统轮次,因此在 Kunavo 上,无论采用哪种角色,请求都能收到提示。在 2026-09-30 之前,Claude 路径会静默丢弃该角色;如果此前系统提示丢失,原因就在这里,而在配置文件的 cordis.patch.yml 中为路由或模型设置 compat.supportsDeveloperRole: false 是当时的解决方法。现在无需再设置此项;即使保留也不会有影响。anthropic-messages 提供商不会发送该角色:其系统提示会作为 Anthropic 的顶层 system 字段发送。

为什么在 DeepSeek Harness 中“Fetch available models”返回为空或 401?

模型发现会使用表单中当前填写的基础 URL、协议和密钥,因此 401 通常说明问题出在密钥,而列表为空则说明问题出在基础 URL,或列表格式不是模型发现功能支持读取的格式。Harness 文档说明了这两种情况,并建议手动输入 ID,效果完全相同。两种协议发送密钥的方式不同:openai-completions 使用 Authorization: Bearer,anthropic-messages 使用 Anthropic 的 x-api-key 请求头;Kunavo 的模型列表两种方式都接受。要确认问题出在哪一端,可使用相同密钥、相同请求头,通过普通 curl 请求 https://api.kunavo.com/v1/models:返回 JSON 表示问题在表单,401 表示密钥有误,404 表示 URL 有误。对于 anthropic-messages,如果返回完整列表,仍有两点需要确认:基础 URL 是否正确,因为模型发现会从列表 URL 末尾去掉一个 /v1,而模型请求不会;以及服务商支持调用哪些 ID,因为列表包含整个目录,而其中只有 claude- 开头的 ID 可用。即使内置服务商的基础 URL 指向其他位置,返回的也始终是已安装目录中的内容,因此请通过自定义服务商获取端点实际提供的内容。