ドキュメント

ドキュメント

DeepSeek Harness

DeepSeek Harnessでは、既存のDeepSeekカードをそのまま残し、その横に独自のプロバイダーカードを追加します。「Add model provider」→「Custom model API」で5つの項目を入力すれば、ClaudeとGPTを1つのキーで同じモデル選択画面から利用できます。

Settings → Models → “Add model provider” → “Custom model API”では5つのフィールド — Provider ID、display name、base URL、API protocol、API key — を設定し、組み込みのDeepSeekカードと同じピッカーにClaudeとGPTを追加します。

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を指定します。dshが/v1/messagesを自動的に付加するため、/v1は付けません。記録用スタンドインを使ってdsh 0.2.0-rc.2を実行し、両方の挙動を確認しました。前者は/v1/chat/completionsに、後者はルートURLから/v1/messages?beta=trueにリクエストを送信しました。ベースURLに/v1を残すと/v1/v1/messagesに送信されますが、実際のゲートウェイは認証エラーではなく404を返します。
reasoningEffortsはシステムプロンプトのロールを変更しますが、プロンプトが届くかどうかは変わりません。Harnessのドキュメントによると、reasoningを宣言するモデルにはシステムプロンプトがrole: "developer"として送信されます。KunavoはClaudeを含むすべてのファミリーでこのロールをシステムターンとして扱うため、compatの切り替えは必要ありません。2026-09-30まではClaude経路でこのロールが欠落していたため、このカードではcompat.supportsDeveloperRole: falseを設定するよう案内していました。設定済みでも問題はなく、そのままにできます。
Kunavo は DeepSeek モデルを提供していません。このプロバイダーは DeepSeek のカードの横に追加するもので、置き換えるものではありません。deepseek- ID には引き続き既存の DeepSeek キーを使い、以下の表にある Claude と GPT の ID にはこちらを使ってください。また、ハーネスの説明にある「OpenAI 互換ゲートウェイ経由で DeepSeek V4 を使う」ための compat.thinkingFormat: deepseek 切り替え設定も、ここでは機能しません。
セッションログは送信されません。組み込みのDeepSeek経路では、dshは各リクエストにモデルからは見えない2つのフィールドを追加します。dsh_session_logは作業ディレクトリのパスを含むセッションイベントで、もう1つはdsh_plugin_packagesです。今回の実行では、2つのカスタムプロバイダーのどちらも、これらのフィールドを一切送信しなかったため、Kunavoプロバイダーがこれらを受け取ることはありません。これらのデータ量と、アップロードを無効にする切り替えについては、DeepSeek Harnessの料金をご覧ください。
KunavoではDeepSeek Harnessをエンドポイントに対して実行していません。以下の日付に実施したのは、npm版dsh 0.2.0-rc.2をヘッドレスで起動し、各経路で新規セッションを3回ずつ、各リクエストを記録してツール呼び出しを1回返すローカルスタンドインに対して実行したテストです。Kunavoやモデルは使用していません。9セッションすべてでストリーミングのツール往復が完了し、毎回同じバイト列が送信されました。これにより、このページに記載した経路と上限を確認できました。ただし、Kunavoの認証やルーティング、モデルの回答については何も示していません。以下のcurlはKunavo側を10秒で確認できる方法です。dshは開発者向けプレビューであり、現在も変更が続いています。
Kunavoは埋め込み、テキスト読み上げ、音声認識のモデルを提供していないため、このプロバイダーで対応するのはチャット補完のみです。音声を文字起こしするハーネスプラグインやベクトルインデックスを作成するプラグインでは、既存のプロバイダーキーを引き続き使用します。このプロバイダーを追加しても、それらの呼び出し先は変わりません。
まだキーをお持ちですか?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を使用します。名前を変更するには、新しいプロバイダーを追加して古いものを削除します)、display name、base URL https://api.kunavo.com/v1、API protocol OpenAI Chat Completions、API keyを入力します。キーは書き込み専用です。dshはキーを$DSH_HOME/.credentials.yamlに保持し、プロファイルにはキーそのものではなく参照のみを保存します。
  4. Model catalogでFetch available modelsを選択します。KunavoはGET /v1/modelsを返すため、モデル選択欄に一覧が表示されます。使うモデルにチェックを入れてAdd selectedを選択します。IDを手入力しても同じように使えます。検出結果に何も表示されない場合は手入力するよう、ドキュメントにも記載されています。
  5. 任意:Anthropic独自のプロトコルでClaudeのIDを使う場合は、独自のProvider ID、ベースURL https://api.kunavo.com(/v1は付けません)、APIプロトコルAnthropic Messages、同じキーを指定して、2つ目のカスタムモデルAPIを追加します。ここでもFetchで全カタログが表示されます。追加するのはclaude-のIDだけにしてください(対象をそれだけにする理由)。
  6. コンポーザーでモデルを選び、挨拶ではなくファイルに関わるターンを送信します。Harnessでは多くの処理でツール呼び出しを使うため、ファイルの読み取りや編集を伴う最初の実行のほうが、多くの情報を得られます。モデルの変更は次のリクエストから反映されます。ドキュメントでは、再起動は不要と明記されています。

DeepSeek Harnessの「Configure models」ページ(dsh-v0.2.0-rc.2タグのdocs/user/guide/providers.mdと同じ内容)で2026年10月1日に確認しました。サードパーティの設定は変更されます。ここに記載されたフィールド名が表示内容と一致しなくなった場合は、このページではなく、そのページを正しい情報源としてください。

クライアントをデバッグする前に確認すること

1回のリクエストで、失敗の原因がエンドポイント、キー、設定ファイルのどれかを特定できます。これが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、価格付きのカタログはモデルページにあります。料金は100万トークンあたりのUSDで、入力 / 出力の順です。

モデル 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入力が長い場合。トークン単価が請求額を左右する
請求は月額料金なしの前払い残高からトークン単位で行われます — 請求を参照してください。繰り返し送られるコンテキスト(エディターやチャットクライアントが送る内容の大半)では、プロンプトキャッシュのほうがモデル選択より請求額を大きく左右します。

Anthropic Messages経由のClaude

Kunavo は Anthropic Messages API にも応答し、anthropic-messages はフォームで選べる3つのプロトコルの1つです。ハーネスのドキュメントには「プロバイダーが話すプロトコルは1つです。そのため、2つのプロトコルに対応するゲートウェイには、2つのプロバイダーが必要です」と明記されています。つまり、これは既存のプロバイダーの設定ではなく、その横に追加する2つ目のプロバイダーです。

  • ベースURL https://api.kunavo.comはルートURLです。実行時、このルートURLから/v1/messages?beta=trueにリクエストが送信されました。これはClaude Codeも使うパスで、Kunavoも応答します。末尾に/v1を付けると、/v1/v1/messagesにリクエストが送信されました。2つのクライアントのリクエストを並べて比較するには、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によると、一覧取得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からファイルを開けます。アダプターは次のリクエスト時に設定を再読み込みします。このエンドポイントで重要なのは次の5点です。

  1. コンテキストウィンドウと最大出力トークン数 — フォームのCustomized settings → Model optionsにあります。手入力したIDにはどちらの値も含まれないため、経路のフォールバック値が適用されます。llm-pi-ai READMEによると、コンテキストは262,144トークン、出力は32,768トークンです。今回の実行では、両方のカスタムプロバイダーが正確に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メニューは表示されず、モデルがreasoningを行うかどうかはエンドポイント独自のデフォルトで決まります。メニューを使いたい場合は、レベルを自分で宣言してください。openai-completionsでは各キーがレベルを示し、その値がreasoning_effortとして送信される表記になります。これによりgpt-のIDに届きます。claude-のIDでは効果がありません。KunavoのチャットAPIはAnthropicにreasoning_effortを転送しないためです(/docs/chat#reasoning)。
  5. 入力タイプ(ファイル内の input: [text, image]) — ドキュメントには、これは「エンドポイントについての宣言であり、エンドポイントを検証するものではない」と明記されています。画像に対応していない ID で Image にチェックを入れても、ハーネスでは検出されず、後続の処理でリクエストが拒否されます。チェックを入れる前に、/models で ID を確認してください。

セッションが送信するその他の情報、つまり1ターンあたり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に少なくとも1つのモデルを追加します。リクエスト、保存済みセッション、モデルのデフォルト設定、認証情報への参照はすべてProvider IDを使うため、この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を自動的に付加するためです。ルートURLからは/v1/messages?beta=trueにリクエストが送信されましたが、末尾が/v1のベースURLからは/v1/v1/messagesに送信されました。実際のゲートウェイは認証エラーではなく404を返します。この実行はリクエストを記録するローカルスタンドインに対して行ったもので、Kunavoに対するものではありません。

DeepSeek Harnessでは、DeepSeekの代わりにClaudeやGPTのモデルを使えますか?

はい。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プロバイダーを追加すると、Anthropic独自のリクエスト形式でClaudeのIDのみを利用できます。どちらも組み込みのDeepSeekカードと並ぶ形で追加され、置き換えるものではありません。そのため、DeepSeekのIDには引き続きDeepSeekキーを使います。

DeepSeek Harnessはカスタムプロバイダーに何を送信しますか?

dsh 0.2.0-rc.2の記録付き実行では、2つのカスタムプロバイダー(openai-completionsとanthropic-messages)のどちらも、エージェントの各ターンに24個のツール定義を送信し、max_tokensに32,768を指定しました。これは、サイズを指定せずに手入力したモデルに対するHarnessのフォールバック値です。また、新しいセッションごとにmax_tokensを64とする短いタイトル生成リクエストを1回送信しました。dsh_session_logやdsh_plugin_packagesは送信されませんでした。この2つのフィールド(セッションのイベントログとインストール済みプラグイン一覧)は組み込みのDeepSeek経路でのみ送信されました。この実行では、リクエストを記録するスタンドインを使っており、Kunavoには接続していません。そのため、ここで示すのはdshが送信する内容であり、各プロバイダーがそれをどう扱うかではありません。

DeepSeek Harnessがシステムプロンプトを無視したように動作するのはなぜですか?

モデルがreasoningレベルを宣言しているか確認してください。openai-completionsでは、Harnessはreasoningモデルのシステムプロンプトをrole "system"ではなくrole "developer"として送信します。エンドポイント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を手入力するよう記載されており、手入力でも同じように使えます。2つのプロトコルではキーの送信方法が異なります。openai-completionsはAuthorization: Bearer、anthropic-messagesはAnthropicのx-api-keyヘッダーを使います。Kunavoのモデル一覧はどちらも受け付けます。どちらに問題があるかは、同じキーを同じヘッダーに入れ、https://api.kunavo.com/v1/modelsにcurlで直接リクエストすると確認できます。JSONが返ればフォーム側、401ならキー、404ならURLに問題があります。anthropic-messagesでは、一覧全体が表示されても2つの点が未確認のままです。検出時は一覧取得URLから末尾の/v1が1つ取り除かれますが、モデルリクエストでは取り除かれないため、ベースURLが正しいかどうか。また、一覧はカタログ全体を示す一方、そのプロバイダーで呼び出せるのはclaude-で始まるIDのみであるため、どのIDが使えるかです。組み込みプロバイダーは、ベースURLが別の場所を指していてもインストール済みカタログから一覧を返します。エンドポイントが実際に提供するモデルを確認するには、カスタムプロバイダーで取得してください。