ドキュメント
Claude Agent SDK
Agent SDKにはベースURLのオプションがありません。Claude Code CLIを起動し、環境全体を引き渡します。ここがルーティングの接点で、必要なのは2つの変数だけです。
SDKでbase_urlオプションを探しても見つかりません。これはドキュメントの記載漏れではなく、そのオプション自体が存在しないためです。SDKはClaude Code CLIをサブプロセスとして実行し、ANTHROPIC_BASE_URLとANTHROPIC_AUTH_TOKENを読み取るのはCLIです。この2つを設定すれば、エージェントのコードを変更せずに、エージェントが行うすべての呼び出しがルーティングされます。
# The SDK has no base_url option. The CLI it spawns reads these, and the
# SDK passes the parent environment straight through — so exporting them
# before your program starts is enough.
export ANTHROPIC_BASE_URL=https://api.kunavo.com
export ANTHROPIC_AUTH_TOKEN=sk-kn-...
# Pin models Kunavo serves: the CLI's default and its opus/sonnet aliases
# follow Anthropic's newest models, and the sonnet alias asks for Sonnet 5.5,
# which Kunavo does not serve — unpinned, those requests 404.
export ANTHROPIC_MODEL=claude-sonnet-5
export ANTHROPIC_DEFAULT_OPUS_MODEL=claude-opus-5-5
export ANTHROPIC_DEFAULT_SONNET_MODEL=claude-sonnet-5
export ANTHROPIC_DEFAULT_HAIKU_MODEL=claude-haiku-4-5
python my_agent.pyhttps://api.kunavo.com)を指定し、/v1は付けません。Anthropicのクライアントが/v1/messagesを自分で追加します。これは他のAnthropic形式のクライアントでもよくあるつまずきどころで、ANTHROPIC_BASE_URLのページで説明しています。環境変数がCLIに引き継がれる仕組み
これは、今後使えなくなるかもしれない裏技と、文書化されていて実装の前提にできる仕様との違いなので、1段落を割いて説明します。Python SDKのサブプロセス通信では、親のos.environからキーを1つだけ削除して子プロセスの環境を構成します。削除するキーはCLAUDECODEで、子プロセスがClaude Codeセッション内で実行されていると思い込まないようにするためです。その後、CLAUDE_CODE_ENTRYPOINT、ClaudeAgentOptions.env、SDKのバージョンを順にマージします。
ここから2つのことがわかります。2つ目はよく誤解されている点です。シェル内のすべての環境変数がCLIに引き継がれるため、2つの変数をエクスポートすれば動作します。また、options.envは継承した環境変数の上書きとしてマージされるため、明示的に指定した値は古いエクスポート値に負けず、優先されます。コードはsubprocess_cli.pyにあります。
明示的な指定を使う場合と、その必要性
自分のマシンで使うなら環境変数のエクスポートで問題ありませんが、それ以外の環境では不安定です。エージェントのエンドポイントがプロセスの起動方法に左右され、スケジューラ、コンテナ、またはプロファイルを読み込まないCIジョブで実行した途端に動かなくなります。オプションオブジェクトにenvを渡せば、ルーティングをプログラムの一部として指定できます。
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
# The explicit form. options.env is merged ON TOP of the inherited
# environment, so this wins over whatever the shell happens to hold —
# which is what you want in anything that is not your own laptop.
options = ClaudeAgentOptions(
env={
"ANTHROPIC_BASE_URL": "https://api.kunavo.com",
"ANTHROPIC_AUTH_TOKEN": "sk-kn-...",
"ANTHROPIC_MODEL": "claude-sonnet-5",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-5-5",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-5",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "claude-haiku-4-5",
},
)
async with ClaudeSDKClient(options=options) as client:
await client.query("Summarise the open TODOs in this repo")
async for message in client.receive_response():
print(message)手順
/app/keysでキーを作成してコピーします。キーは一度だけ表示されます。- ルーティングの設定場所を決めましょう。ローカル作業では環境変数をエクスポートし、無人で実行する場合は
ClaudeAgentOptions(env=…)を使います。 ANTHROPIC_BASE_URLをhttps://api.kunavo.comに、ANTHROPIC_AUTH_TOKENをお使いのsk-kn-…キーに設定します。ANTHROPIC_MODEL、ANTHROPIC_DEFAULT_OPUS_MODEL、ANTHROPIC_DEFAULT_SONNET_MODELを提供されているIDに設定してください。CLIの組み込みデフォルトとopusおよびsonnetのエイリアスはAnthropicの最新モデルに従い、Kunavoが提供していないモデル(sonnetエイリアスが要求するSonnet 5.5)は404を返します。- 必要に応じて
ANTHROPIC_DEFAULT_HAIKU_MODELを設定し、CLIが起動するバックグラウンドのサブタスクを最も安価なティアで実行します。 - プログラムを実行します。エージェントのコードに変更はありません。
サブタスクごとのティアの選び方
エージェントは処理を複数に分けて実行するため、1つの依頼が請求対象の往復呼び出しに何度も分かれます。そのため、ティアの割り当てはチャットアプリよりも重要です。料金は100万トークンあたりのUSDで、入力/出力の順にカタログからリアルタイムで取得しています。
| モデル ID | Kunavo 入力 / 出力 | 用途 |
|---|---|---|
claude-haiku-4-5 | $0.70 / $3.50 | CLIが自動で生成するバックグラウンドのサブタスク。頻繁に実行され、気づかないうちに過払いになりやすい処理です。 |
claude-sonnet-5 | $1.40 / $7.00 | エージェントの実際の推論に適した標準設定 |
claude-opus-5 | $3.50 / $17.50 | より安価なティアでは、目的の結果に到達するまで何度も試行する必要がある場合に限ります。 |
SDKを調べる前に確認する
1つのリクエストで、失敗の原因がキー、エンドポイント、SDKのどれかを切り分けられます。これが200を返すなら、同じ認証情報がSDKの起動するCLIでも使えます。まだ問題が残る場合は、値の内容ではなく、変数の設定場所に原因があります。
# Settles whether a failure is the key, the endpoint, or the SDK.
# 200 here means the same credential works for the CLI the SDK spawns.
curl -sS https://api.kunavo.com/v1/messages \
-H "Authorization: Bearer sk-kn-..." \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-haiku-4-5","max_tokens":16,
"messages":[{"role":"user","content":"ping"}]}'参考情報
SDKはanthropics/claude-agent-sdk-pythonでオープンソースとして公開されています。ここで説明した環境変数の動作は、2026-09-04に同SDK独自のサブプロセス通信の実装を確認したものです。TypeScript SDKも同じアーキテクチャで、APIを直接呼び出すのではなくCLIを動かすため、ルーティング変数を読むのもCLIです。READMEにはオプションもその動作も記載されていないため、明示的な指定を使う場合は、依存する前に型定義でオプション名を確認してください。Kunavo側のAPIはMessages APIです。同じ方法でルーティングする他のクライアントについては、連携ハブをご覧ください。
よくある質問
Claude Agent SDKでカスタムBase URLを利用できますか?
はい。ただし、SDKのオプションを通じては設定できません。base_urlパラメーターが存在しないため、READMEを検索しても見つかりません。SDKはClaude Code CLIをサブプロセスとして実行し、ANTHROPIC_BASE_URLとANTHROPIC_AUTH_TOKENを読み取るのはCLIです。プログラムの実行環境でこの2つの変数を設定すれば、エージェントのコードを変更せずに、エージェントによるすべての呼び出しをルーティングできます。
SDKは環境変数をどのようにCLIに渡しますか?
親プロセスの環境全体を引き継ぎ、キーを1つだけ除外します。Python SDKのサブプロセス転送では、親プロセスのos.environからCLAUDECODEを除いた環境を作り、次にCLAUDE_CODE_ENTRYPOINT、ClaudeAgentOptions.env、SDKのバージョン情報を順にマージします。その結果、シェルの環境変数はすべてCLIに渡され、options.envはその上にマージされるため、シェルで設定した値より優先されます。
環境変数を使うべきですか?それともClaudeAgentOptions(env=...)を使うべきですか?
自分のノートPC以外で実行する場合は、options.envを使ってください。シェル環境に依存すると、エージェントのエンドポイントがプロセスの起動方法によって変わります。ユーザー設定を引き継がないスケジューラー、コンテナ、CIジョブで初めて実行したときに動作しなくなります。オプションオブジェクトでenvを明示的に渡せば、ルーティングは実行環境ではなくプログラムの設定になります。継承した環境変数の上にマージされるため、古い環境変数よりも優先されます。
Agent SDKには別途Anthropicアカウントが必要ですか?
必要なのはClaude Code CLIが受け付ける認証情報であり、Anthropic公式のものである必要はありません。ルーティングはANTHROPIC_BASE_URLとANTHROPIC_AUTH_TOKENを通じて行うため、Anthropic Messages APIを提供するエンドポイントを利用できます。Kunavoでは、https://api.kunavo.comに対してsk-kn-キーを1つ使い、プラン料金ではなくプリペイド残高からトークンごとに課金されます。
Agent SDKのプログラムでは、どのモデルを使えばよいですか?
サブタスクに応じてティアを選んでください。エージェントは処理を分岐させるためです。Claude Haiku 4.5 は1Mトークンあたり $0.70/$3.50 で、CLI が自動的に生成するバックグラウンド処理に適しています。Claude Sonnet 5 は $1.40/$7.00 で、通常の既定値です。Claude Opus 5 は $3.50/$17.50 で、より安価なティアで何度も試行が必要な場合にのみ価値があります。2つのルーティング変数と併せて ANTHROPIC_DEFAULT_HAIKU_MODEL を設定する1行で、毎回の実行コストを削減できます。
TypeScript版のAgent SDKも同じ仕組みで動きますか?
アーキテクチャは同じです。SDKはAPIを直接呼び出すのではなくClaude Code CLIを操作するため、ルーティング変数を読み取るのもCLIです。このページでは、参照した資料がPython SDKのものだったため、その仕組みをPython SDKについて説明しています。TypeScript SDKを使う場合は、明示的に設定する形式に頼る前に、該当するオプション名をSDKの型定義で確認してください。それまでは、エクスポートした環境変数を使ってください。
SDKが環境変数からCLAUDECODEを除外するのはなぜですか?
SDKが起動したCLIが、Claude Codeの親セッション内で実行されていると思い込まないようにするためです。継承した環境から削除されるキーはこれだけです。ここで重要なのは、それ以外のすべて(このページで使う2つのルーティング変数も含む)がどれほど完全に引き渡されるかを示す点に限られます。