ドキュメント

ドキュメント

OpenHands

OpenHandsはすべてのモデル呼び出しをLiteLLM経由でルーティングするため、組み合わせる2つの項目を揃える必要があります。openai/プレフィックス付きのモデルIDと、末尾に/v1が付いたベースURLです。この組み合わせを正しく設定すれば、Advancedタブから1つのキーでClaudeとGPTを利用できます。

Settings → LLM → Advancedには3つのフィールド — Custom Model、Base URL、API Key — があり、モデルIDにはopenai/プレフィックスを付け、ベースURLには/v1を残します。

Settings → LLM → Advanced
# Settings → LLM → Advanced  (toggle "Advanced" on first)
Custom Model   openai/claude-sonnet-5
Base URL       https://api.kunavo.com/v1
API Key        sk-kn-...

# The "openai/" prefix is the provider, not a vendor: it tells OpenHands to
# speak the OpenAI Chat Completions protocol to the Base URL above. The model
# id after the slash is Kunavo's, and resolves at Kunavo.
#
# Keep the /v1. It belongs to the openai/ prefix — a litellm_proxy/ model
# takes the bare origin instead, which is the opposite convention.
/v1は必ず維持し、openai/プレフィックスも付けてください。これは別々の判断ではなく、セットで決めるものです。OpenHandsの設定ページでは「プロバイダーに特定のベースURLがある場合は、ここに指定してください」とだけ説明されているため、このフィールドだけでは形式が決まりません。形式を決めるのはプレフィックスです。「Configure a Model」ページでは、OpenAI互換サーバーにはopenai/<served-model-id>を指定し、モデルIDは「通常、そのGET /v1/modelsエンドポイントから」取得すると案内しています。この方法について掲載されている唯一の入力例では、Base URLの末尾が/v1になっています。LM Studioの手順にあるhttp://host.docker.internal:1234/v1がその例です。この対比が根拠になります。litellm_proxy/モデルのベースURLはhttps://your-litellm-proxy.comと記載されており、/v1はまったく付いていません。両者を混同し、openai/をパスのないオリジンと組み合わせたり、litellm_proxy/の場合に/v1を付けたりすると、401ではなく404になることがよくあります。
OpenHandsにあるopenai/の例はどちらもLM Studio、Ollama、vLLM、SGLangといったローカルサーバーです。ドキュメントにはリモートのOpenAI互換ゲートウェイの具体例がないため、上記で引用したのはプレフィックスの規則と値の形式であり、このケースを説明するページではありません。OpenHandsが後日そのケースを文書化した場合は、そのページを正式な情報源として参照してください。
この設定は、以下の日付時点のOpenHands自身のドキュメントから読み取ったものです。Kunavoは自社のエンドポイントに対してOpenHandsを実行していません。会話、ストリーミングによるターン、ツールの往復処理、固定したクライアントバージョンのいずれも検証していません。セットアップ手順の公開はテストではなく、ここにある内容をテストとして受け取るべきではありません。以下のcurlは10秒で確認できる部分です。クライアントの動作は、利用者とOpenHandsの間で扱う事項です。
Kunavoは埋め込み、テキスト読み上げ、音声認識のモデルを提供していません。そのため、このエンドポイントが応答するのはチャット補完だけです。LLM_EMBEDDING_MODELとLLM_EMBEDDING_DEPLOYMENT_NAMEは未設定のままにし、構成内でベクトルインデックスや音声処理にすでに使っているプロバイダーはそのまま維持してください。
まだキーをお持ちですか?Kunavoアカウントを作成し、キーを作成します(sk-kn-で始まります)。$10からクレジットを追加すると、呼び出しはその残高から支払われ、失敗した呼び出しは課金されません。ダッシュボードを開くと、OpenHands設定が表示されます。

手順

  1. /app/keys でキーを作成してコピーします。キーは一度だけ表示されます。
  2. Settings → LLMを開き、Advancedの切り替えをオンにします。3つのフィールドがCustom Model、Base URL、API Keyの順に表示されます。
  3. モデルIDにはプレフィックスを付けて入力します。openai/claude-sonnet-5であり、claude-sonnet-5ではありません。Kunavoが提供するIDはGET /v1/modelsが返すものです。これは、カスタムIDの取得元としてOpenHandsの公式ドキュメントが案内している一覧と同じです。
  4. Base URLにhttps://api.kunavo.com/v1を貼り付け、API Keyにキーを入力してから、Save Changesをクリックします。OpenHandsのドキュメントによると、ローカルプロファイルを保存するときは、まずバックエンドに対して設定を検証し、失敗した場合は保存を阻止します。そのため、ここでエラーが表示された場合は見た目だけの問題ではなく、実際に拒否されています。
  5. ブラウザーから何にアクセスできるかではなく、バックエンドから何にアクセスできるかを確認してください。ベースURLはAgent Serverの実行マシンから名前解決できる必要があります。OpenHandsのドキュメントには、Agent CanvasがDockerで動作している場合、127.0.0.1はコンテナだと明記されています。Kunavoのような公開エンドポイントは簡単なケースですが、その前段に企業プロキシがある場合は異なります。
  6. 新しい会話を開始し、ファイルを読み取って編集するタスクを与えます。OpenHandsによると、保存したLLMは新しい会話に適用され、既存の会話で使うには先に再起動する必要があります。また、ツールを使う実行を試すことで、挨拶だけの場合よりもこの組み合わせを詳しく確認できます。

OpenHandsのLanguage Model(LLM)設定ページで2026年9月21日に確認しました。サードパーティの設定は変更されます。ここに記載されたフィールド名が表示内容と一致しなくなった場合は、このページではなく、そのページを正しい情報源としてください。

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

1回のリクエストで、失敗の原因がエンドポイント、キー、設定ファイルのどれかを特定できます。これがJSONを返すなら、同じベースURLとキーがOpenHandsで機能します。

# 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 入力 / 出力OpenHandsでの位置付け
claude-sonnet-5$1.40 / $7.00日常的な作業に使うモデル。openai/claude-sonnet-5として入力します
claude-opus-4-8$3.50 / $17.50OpenHandsの公式インデックス表でClaudeファミリーの先頭に掲載されているモデル
claude-haiku-4-5$0.70 / $3.50日常的な編集向けの低コストプロファイル。会話の途中で切り替えます
gpt-5-6-sol$2.00 / $12.00同じキーと同じBase URLを使う別のモデルファミリー
gpt-6-astra$4.00 / $20.00計画が何度もうまくいかないときに使う、第3の意見
請求は月額料金なしの前払い残高からトークン単位で行われます — 請求を参照してください。繰り返し送られるコンテキスト(エディターやチャットクライアントが送る内容の大半)では、プロンプトキャッシュのほうがモデル選択より請求額を大きく左右します。

デバッグ前に把握しておきたい3つの境界

OpenHandsには単一プロセスのCLIより多くの構成要素があり、そのうち2つはLLMエンドポイントに見えても別のものです。以下は、上記の日付時点で確認したOpenHands公式ドキュメントに基づいています。

  1. サンドボックスはモデルではありません。OpenHandsはエージェントサーバーのサンドボックス内で作業を実行し、ネットワーク経由でモデルを呼び出します。これらは別々の機能であり、認証情報も別です。ここで設定するキーはモデル呼び出しに使われます。サンドボックスから何にアクセスできるかには関係なく、サンドボックスのネットワーク問題が認証エラーとして表示されることもありません。
  2. ACPエージェントは完全に別枠です。Agent Canvasは、ACPエージェントとしてClaude Code、Codex、またはGemini CLIにタスクを委任できます。「Configure a Model」ページには、これらは「独自のモデルアクセスを管理する」と記載されています。そのため、LLMプロファイルを設定しても、それらのサブプロセスの接続先は変わりません。キーにリクエストが来る想定なのに何も記録されない場合は、実際にどのエージェントが動作しているか確認してください。OpenHandsとClaude Codeの比較では、この違いと、それを決める認証情報の優先順位について説明しています。
  3. プロファイルと上限の10件。保存した設定はLLMプロファイルになり、最後に保存したプロファイルが新しい会話で有効になります。コンテキストを失わず会話の途中でプロファイルを切り替えられるため、1つのキーで低コストのモデルIDと高コストのモデルIDを使い分けられます。ドキュメントでは、アカウントあたりのプロファイル数は最大10件とされています。Provider Connectionにはプロバイダー、APIキー、オプションのベースURLを保存でき、複数のプロファイルで使い回せます。同じページによると、このパネルはローカルのagent-serverバックエンドでは使用でき、OpenHands Cloudバックエンドでは非表示になります。

よくある質問

OpenHandsをカスタムAPIエンドポイントに接続するにはどうすればよいですか?

Settings → LLMを開き、Advancedの切り替えをオンにします。OpenHandsのドキュメントでは、これは「カスタムモデルと追加のLLM設定を指定する」方法として案内されています。Custom Model、Base URL、API Keyの3つのフィールドがこの順に表示されます。モデルIDにはプロバイダープレフィックスを付けて入力します。OpenAI互換エンドポイントの場合はopenai/<model-id>です。Base URLにエンドポイントを指定し、キーを貼り付けてSave Changesをクリックします。保存した設定はLLMプロファイルになり、新しい会話に適用されます。既存の会話に適用するには再起動が必要です。

OpenHandsのBase URLは末尾に/v1が必要ですか?

openai/プレフィックス付きモデルの場合は必要です。設定ページには、プロバイダーに特定のベースURLがある場合は指定するようにとしか書かれていないため、設定ページだけでは形式が決まりません。形式を決めるのはプレフィックスです。OpenHandsの「Configure a Model」ページでは、OpenAI互換サーバーにopenai/<served-model-id>を指定し、IDはそのサーバーのGET /v1/modelsエンドポイントから取得します。この方法の具体例としてLM Studioの手順に掲載されている唯一のBase URLはhttp://host.docker.internal:1234/v1です。一方、litellm_proxy/モデルでは、/v1のないプロキシのオリジンURLを使うよう文書化されています。したがって、Kunavoで指定する値はhttps://api.kunavo.com/v1です。

OpenHandsがLLMプロファイルの保存を拒否するのはなぜですか?

OpenHandsは、ローカルプロファイルを保存する前にバックエンドに対して検証します。ドキュメントによると、検証に失敗すると保存は阻止され、エラーが表示されます。例として挙げられているのは、APIキーが無効な場合やモデルが利用できない場合です。したがって、保存が阻止された場合は実際に設定が拒否されています。まず、クライアントの外部でどちらに問題があるか確認してください。同じキーを使ってエンドポイントの/v1/modelsにcurlを1回実行し、組み合わせが正しければJSON、キーが誤っていれば401、URLが誤っていれば404が返ります。検証に対応していない古いバックエンドでは、検証を省略して通常どおり保存します。

OpenHands は OpenAI 互換エンドポイント経由で Claude モデルを使えますか?

はい。openai/ プレフィックスが示すのはベンダーではなく通信プロトコルです。OpenHands は、設定したベース URL に OpenAI 形式のチャット補完リクエストを送り、スラッシュ以降の ID をそのまま渡すため、Claude の ID は OpenHands 内ではなく、そのエンドポイントで解決されます。OpenHands はツール呼び出しを多用し、適切に動作するには高性能なモデルが必要だと公式ドキュメントにも記載されている点に留意してください。そのため、見つかる中で最安の ID を使う用途には向きません。

Kunavo は OpenHands でこの構成をテストしましたか?

いいえ。2026年9月21日に確認したのは OpenHands 自身のドキュメントです。フィールド名とその順序、プレフィックスのルール、ベース URL の形式は同ドキュメントから引用しています。Kunavo は、自社のエンドポイントに対して OpenHands の会話を実行しておらず、認証、ストリーミング、ツールの往復処理、または特定のクライアントバージョン内でのモデルルーティングについて、ここで主張することはありません。個別に確認できるのは、エンドポイントとキーが機能するかどうかです。このページの curl で確認できます。