文件
DeepSeek Harness
DeepSeek Harness 保留自己的 DeepSeek 卡片,並在旁邊新增您的供應商。透過「Add model provider」→「Custom model API」中的五個欄位,Claude 和 GPT 就能使用同一個模型選擇器和同一把金鑰。
Settings → Models → “Add model provider” → “Custom model API” 需要五個欄位 — Provider ID、display name、base URL、API protocol 與 API key — 讓 Claude 與 GPT 和內建 DeepSeek 卡片出現在同一個選擇器中。
# 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-5openai-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;若其基底網址保留 /v1,則會傳送至 /v1/v1/messages,而真正的閘道會回應 404,不是驗證錯誤。reasoningEfforts 會改變系統提示的角色,不會決定提示是否送達。 Harness 文件指出,宣告支援推理的模型會收到以 role: "developer" 傳送的系統提示。Kunavo 在所有模型系列(包括 Claude)都會將該角色讀作 system turn,因此不需要為此啟用 compat。直到 2026-09-30,Claude 路徑都會丟棄該角色;這張卡片當時建議您設定 compat.supportsDeveloperRole: false。如果您已設定,保留即可,沒有影響。deepseek- ID;表格中的 Claude 和 GPT ID 則使用此供應商。這也表示此處沒有可供 harness 文件所述「透過 OpenAI 相容閘道使用 DeepSeek V4」的 compat.thinkingFormat: deepseek 切換選項。dsh_session_log(工作階段事件,包含您的工作目錄路徑)以及 dsh_plugin_packages。在測試中,兩個自訂供應商都沒有傳送這兩個欄位,因此 Kunavo 供應商不會收到它們。欄位大小及關閉上傳的切換選項,請參閱DeepSeek Harness 定價。curl 是 Kunavo 端的設定,您可以在十秒內自行確認;dsh 仍是持續變動中的開發者預覽版。sk-kn- 開頭),並從 $10 起新增額度——呼叫會從該餘額扣款,失敗的呼叫不會計費。之後儀表板會開啟 DeepSeek Harness 設定。逐步操作
- 在
/app/keys建立金鑰並複製——金鑰只會顯示一次。 - 啟動 Web UI(
dsh web)並前往 Settings → Models。選擇 Add model provider。卡片會先顯示 Third-party model provider,其中只列出dsh隨附的供應商 — 請切換至 Custom model API。 - 填寫 Provider ID(使用小寫,且永久固定 — 文件說明請求、已儲存的工作階段、模型預設值和憑證參照都會使用此 ID;若要更名,必須新增供應商並刪除舊供應商)、display name、base URL
https://api.kunavo.com/v1、API protocol OpenAI Chat Completions,以及 API key。金鑰僅供寫入;dsh 會將它保存在$DSH_HOME/.credentials.yaml,並只在設定檔中儲存金鑰參照。 - 在 Model catalog 下選擇 Fetch available models — Kunavo 會回應
GET /v1/models,因此選擇器會自動填入模型。勾選所需項目,再選擇 Add selected。手動輸入 ID 的效果完全相同;文件建議只要探索結果為空,就改用手動輸入。 - 選用:若要透過 Anthropic 自有通訊協定使用 Claude ID,請新增第二個自訂模型 API,設定專屬的 Provider ID、基底網址
https://api.kunavo.com(不含/v1)、API protocol Anthropic Messages,並使用相同金鑰。此處的 Fetch 也會列出完整目錄;只新增claude-ID(為什麼只新增這些)。 - 在編輯器中選取模型,然後傳送一個會操作檔案的回合,而不是打招呼 — 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 權杖的美元價格,輸入/輸出。
| 模型 ID | Kunavo 輸入/輸出 | 它在 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 文件明確指出:「一個供應商使用一種通訊協定,因此同時支援兩種通訊協定的閘道需要設定兩個供應商」— 因此這是與第一個並列的第二個供應商,而非在第一個供應商上設定的選項。
- 基底網址
https://api.kunavo.com,即根網址。 在測試中,根網址會將請求傳送至/v1/messages?beta=true— Claude Code 也使用這個路徑,且 Kunavo 支援此路徑。網址結尾若加上/v1,請求就會傳送至/v1/v1/messages。DeepSeek Harness 與 Claude Code 的比較並列顯示兩個用戶端的請求。 - 僅限 Claude ID。 Kunavo 的
/v1/messages僅支援claude-ID;在此使用gpt-ID 會收到指出/v1/chat/completions的404。GPT 請繼續使用openai-completions供應商。 - Fetch 會列出所有模型;只新增 Claude 模型。 dsh 的
llm-pi-aiREADME 說明,此通訊協定的探索請求會使用 Anthropic 的x-api-key標頭傳送GET /v1/models;Kunavo 的模型清單也會如同Authorization: Bearer一樣,從該標頭取得金鑰 — 這些資訊來自 dsh 原始碼和 Kunavo 自行執行的測試,不是來自本次測試。Fetch available models取得的結果是完整目錄,包含 GPT 和圖像模型,因此只勾選claude-ID;手動輸入也同樣可行。完整清單的證明力沒有看起來那麼高:同一份 README 指出,清單網址無論是否包含/v1都會接受,但模型請求會原樣使用基底網址 — 因此,Fetch 也可能從https://api.kunavo.com/v1填入清單,而使用該基底網址傳送的第一個回合會前往/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 會開啟該檔案;適配器會在下一個請求時重新讀取設定。此端點有五項設定需要注意:
- Context window 和 max output tokens — 在表單中,位於 Customized settings → Model options 下。手動輸入的 ID 不會帶有這兩項設定,因此路由會使用預設值:根據
llm-pi-aiREADME,context 為 262,144 個 token,output 為 32,768 個 token — 本次測試中,兩個自訂供應商都恰好要求max_tokens: 32768。表格中的每個 ID 都支援更高的上限;請確認對應列的資訊,若要提高上限,請從模型的目錄項目調整。Kunavo 會依模型實際產生的 token 計費,不會依上限計費。 compat.supportsDeveloperRole— 不需要。Harness 建議在閘道拒絕developer角色時啟用此選項;Kunavo 在所有模型系列(包括 Claude)都會將該角色讀作 system turn。(直到 2026-09-30,Claude 路徑會丟棄該角色,這個選項當時建議您啟用;保留啟用狀態沒有影響。)compat.maxTokensField— 保持原設定。Harness 通常會將此項與上方的切換選項搭配,作為第一個修正方式;但 Kunavo 自行處理請求的程式會讀取max_completion_tokens,並回退至max_tokens,因此預設值已可正常運作。reasoningEfforts— 表單中沒有此欄位。手動輸入的模型不會宣告任何推理層級,因此不會顯示 Effort 選單;由端點自行決定預設推理行為。若要使用該選單,請自行宣告層級;在openai-completions中,每個金鑰都是一個層級,其值則是以reasoning_effort傳送的字串。這對gpt-ID 有效;對claude-ID 則無效,因為 Kunavo 的聊天介面不會將reasoning_effort轉送至 Anthropic(/docs/chat#reasoning)。- 輸入類型(檔案中的
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、顯示名稱、基底網址、API 通訊協定和 API 金鑰,然後至少在 Model catalog 下新增一個模型。Provider ID 是永久固定的,因為請求、已儲存的工作階段、模型預設值和憑證參照都會使用此 ID;若要更名,必須新增供應商並刪除舊供應商。在 0.2.0-rc.2 中,該頁面會將設定儲存至使用中設定檔的 cordis.patch.yml — 使用 dsh web 時,路徑為 $DSH_HOME/profiles/web/cordis.patch.yml。
DeepSeek Harness 的基底網址結尾需要加上 /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;若基底網址以 /v1 結尾,則會傳送至 /v1/v1/messages,而真正的閘道會回應 404,不會回傳驗證錯誤。該測試使用會記錄請求的本機模擬端點,並未使用 Kunavo。
DeepSeek Harness 可以使用 Claude 或 GPT 模型取代 DeepSeek 嗎?
可以。API protocol 欄位代表線上格式,不代表廠商:openai-completions 是 OpenAI Chat Completions,openai-responses 是 Responses API,而 anthropic-messages 是 Anthropic Messages API。自訂供應商會將模型 ID 原樣傳送至您設定的基底網址,因此 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 會將推理模型的系統提示以「developer」而非「system」角色傳送,因為它會根據端點網址推斷請求格式,並將無法辨識的網址視為不是 OpenAI 本身。Kunavo 在所有模型系列(包括 Claude)都會將該角色讀作 system turn,因此在 Kunavo 上無論使用哪個角色,提示都能送達。直到 2026-09-30,Claude 路徑都會靜默丟棄該角色;若在此之前提示遺失,原因就在於此,而在路由或設定檔的 cordis.patch.yml 中設定 compat.supportsDeveloperRole: false 是當時的替代作法。現在已不需要此設定,保留也沒有影響。anthropic-messages 供應商不會傳送該角色:其系統提示會以 Anthropic 的頂層 system 欄位傳送。
為什麼 DeepSeek Harness 的「Fetch available models」沒有回傳內容或回傳 401?
探索功能會使用表單目前填入的基底網址、通訊協定和金鑰,因此 401 通常表示金鑰有誤,清單空白則通常表示基底網址有誤,或探索功能無法讀取清單格式。Harness 文件說明了這兩種情況,並指出可改為手動輸入 ID,效果完全相同。兩種通訊協定傳送金鑰的方式不同 — openai-completions 使用 Authorization: Bearer,anthropic-messages 使用 Anthropic 的 x-api-key 標頭 — 而 Kunavo 的模型清單接受兩種方式。可使用相同金鑰,並以相同標頭對 https://api.kunavo.com/v1/models 執行一般 curl 請求,確認問題出在哪一端:若回傳 JSON,問題在表單;若回傳 401,問題在金鑰;若回傳 404,問題在網址。使用 anthropic-messages 時,即使取得完整清單,仍有兩點無法確認:其一是基底網址是否正確,因為探索功能會從清單網址移除一個結尾的 /v1,但模型請求不會;其二是供應商能呼叫哪些 ID,因為清單涵蓋完整目錄,而此處只有 claude- ID 可用。即使內建供應商的基底網址指向其他位置,系統仍會從已安裝的目錄回應,因此請透過自訂供應商執行 Fetch,才能查看端點實際提供的內容。