Claude CodeをDeepSeek V4、OpenRouter、またはその他のサードパーティモデルプロバイダーに接続すると、Invalid custom3p enterprise configというエラーが出ることがあります。このエラーはドキュメント上で分かりにくく、Claude Codeが公式にサポートしているサードパーティプロバイダー設定でも発生します。
この記事では、custom3pの意味、設定が失敗する主な原因、そしてOpenRouter、LiteLLM、ローカルvLLMなどで動かすための修正手順を実装ベースで整理します。
まとめ
Invalid custom3p enterprise configは、Claude Codeがサードパーティプロバイダー設定を検証できないときに出るエラーです。
custom3pは、ANTHROPIC_BASE_URLで指定されたAnthropic以外のAPIエンドポイントに対するClaude Code内部のラベルです。
よくある原因は次のとおりです。
-
ANTHROPIC_BASE_URLの末尾に余計な/v1がある -
ANTHROPIC_API_KEYとANTHROPIC_AUTH_TOKENを取り違えている -
~/.claude/settings.jsonが不正なJSONになっている - 新規インストールでオンボーディングが完了していない
- ゲートウェイが必要なヘッダーを転送していない
- Team / Enterpriseの管理ポリシーと競合している
まずはベースURLから確認してください。多くのケースでは、/v1を削除するだけで解決します。
「custom3p」とは何か
Claude Codeはリクエストを以下のいずれかのモードでルーティングします。
| モード | トリガー方法 |
|---|---|
| Anthropic API(デフォルト) | オーバーライド設定なし |
| Amazon Bedrock | CLAUDE_CODE_USE_BEDROCK=1 |
| Google Vertex AI | CLAUDE_CODE_USE_VERTEX=1 |
| Microsoft Foundry | CLAUDE_CODE_USE_FOUNDRY=1 |
| カスタムサードパーティ |
ANTHROPIC_BASE_URLがAnthropic以外を指す場合 |
最後の「カスタムサードパーティ」がcustom3pです。
ANTHROPIC_BASE_URLがLiteLLM、OpenRouter、ローカルvLLM、企業内ゲートウェイなどを指している場合、Claude Codeはその設定をcustom3pとして扱い、最初のAPI呼び出し前に検証します。
この検証に失敗すると、次のエラーが出ます。
Invalid custom3p enterprise config
これは設定検証エラーであり、ポリシーブロックではありません。設定を直せば解決できます。
なぜ今このエラーが増えているのか
2026年4月、AnthropicはClaude CodeクライアントIDを偽装してClaude Pro / Maxのサブスクリプションアクセスを取得していたサードパーティagenticツールをブロックしました。OpenClawのようにClaude Codeセッションを独自バックエンド経由でルーティングしていたツールは影響を受けました。
ただし、この記事で扱う問題はそれとは別です。
その後、開発者はClaude Codeの公式サードパーティプロバイダーサポートを使い、OpenRouterやLiteLLMなどのバックエンドにルーティングし始めました。Redditでは、Claude CodeのエージェントループをOpenRouter経由でDeepSeek V4 Proに切り替える例も共有されています。出力100万トークンあたり$0.87とAnthropicの$15を比較すると、約17倍のコスト差があります。
問題は、Claude Codeの公式サードパーティプロバイダーサポートには正しいエンタープライズ設定が必要なことです。1つでも項目を間違えると、Invalid custom3p enterprise configが発生します。
根本原因1:ANTHROPIC_BASE_URLの末尾に/v1がある
最も多い原因です。
Claude Codeは、設定したベースURLに自動で/v1/messagesを追加します。そのため、ベースURLにすでに/v1が含まれていると、最終的なパスが次のようになります。
/v1/v1/messages
この場合、ゲートウェイは多くの場合404を返します。
誤った例
export ANTHROPIC_BASE_URL="https://api.openrouter.ai/api/v1"
export ANTHROPIC_BASE_URL="https://litellm.yourcompany.com/v1"
正しい例
export ANTHROPIC_BASE_URL="https://api.openrouter.ai/api"
export ANTHROPIC_BASE_URL="https://litellm.yourcompany.com"
実際の到達URLを確認する
Claude Codeが呼び出すURLと同じ形式でテストします。
curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
"${ANTHROPIC_BASE_URL}/v1/messages" \
-d '{"model":"claude-sonnet-4-6","max_tokens":1,"messages":[{"role":"user","content":"hi"}]}'
判定の目安は次のとおりです。
-
200:エンドポイントに到達できている -
400:リクエスト内容は不正だが、エンドポイント自体は存在する -
404:URL構造が間違っている可能性が高い
404なら、まずANTHROPIC_BASE_URLから/v1を削除してください。
根本原因2:認証情報の環境変数が違う
Claude Codeは認証方式に応じて2種類の環境変数を使います。
| 変数 | 送信形式 | 主な用途 |
|---|---|---|
ANTHROPIC_API_KEY |
x-api-keyヘッダー |
APIキー認証を想定するAnthropic互換ゲートウェイ |
ANTHROPIC_AUTH_TOKEN |
Authorization: Bearerヘッダー |
OAuth形式のゲートウェイ、LiteLLM、多くのOpenRouter設定 |
OpenRouterはBearerトークンを想定します。
export ANTHROPIC_AUTH_TOKEN="sk-or-your-openrouter-key"
export ANTHROPIC_BASE_URL="https://openrouter.ai/api"
OpenRouterでANTHROPIC_API_KEYを使うと、x-api-keyヘッダーが送信されます。OpenRouter側がそのヘッダーを認証に使わない場合、認証に失敗し、Claude Codeは無効なエンタープライズ設定として扱います。
LiteLLMの場合は次のようにします。
export ANTHROPIC_AUTH_TOKEN="sk-litellm-your-virtual-key"
export ANTHROPIC_BASE_URL="https://your-litellm-server:4000"
DeepSeekゲートウェイやAPIキーで動かすローカルvLLMサーバーでは、次のようにANTHROPIC_API_KEYを使う構成もあります。
export ANTHROPIC_API_KEY="your-key-here"
export ANTHROPIC_BASE_URL="https://your-vllm-server"
使用しているゲートウェイがどのヘッダーを期待しているかを必ず確認してください。
根本原因3:settings.jsonが不正なJSONになっている
環境変数ではなく~/.claude/settings.jsonで設定している場合、JSONの構文エラーでも検証に失敗します。
よくあるミス:末尾カンマ
{
"env": {
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
"ANTHROPIC_AUTH_TOKEN": "sk-or-your-key",
}
}
JSONでは最後の要素にカンマを付けられません。
よくあるミス:スマートクォート
ドキュメントやWordからコピーした文字列に、通常の"ではない引用符が混ざることがあります。
{
"env": {
“ANTHROPIC_BASE_URL”: “https://openrouter.ai/api”
}
}
正しい形式
{
"env": {
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
"ANTHROPIC_AUTH_TOKEN": "sk-or-your-openrouter-key"
}
}
起動前にJSONを検証する
Pythonで確認します。
python3 -c "import json, os; json.load(open(os.path.expanduser('~/.claude/settings.json')))" && echo "Valid JSON"
jqでも確認できます。
jq . ~/.claude/settings.json
ここでパースエラーが出る場合、Claude Codeは設定を読み込めません。
根本原因4:新規インストールでオンボーディングが完了していない
Claude Codeは、settings.jsonからエンタープライズ設定を読み込む前に、~/.claude.jsonのhasCompletedOnboarding: trueを確認します。
新規インストールでこのフラグがない場合、Claude Codeはオンボーディングモードとして扱い、settings.jsonの設定を読み込まないことがあります。
現在の状態を確認します。
cat ~/.claude.json | python3 -m json.tool 2>/dev/null | grep hasCompletedOnboarding
キーが存在しない、またはfalseの場合は、次のように設定します。
{
"hasCompletedOnboarding": true,
"primaryApiKey": "sk-placeholder"
}
primaryApiKeyはプレースホルダーです。実際の認証はsettings.jsonまたは環境変数で上書きされます。フォーマットチェックを通すため、sk-で始まる任意の値を設定します。
保存後、Claude Codeを再起動してください。
根本原因5:ゲートウェイが必要なヘッダーを転送していない
Claude Codeの検証では、機能ハンドシェイクのために複数のヘッダーを送信します。ゲートウェイやプロキシがそれらを削除すると、Claude Codeが期待するレスポンスと一致せず、Invalid custom3p enterprise configになります。
転送すべき主なヘッダーは次のとおりです。
anthropic-beta
anthropic-version
X-Claude-Code-Session-Id
LiteLLMではv1.82.9以降、通常はデフォルトで動作します。
nginxなどのカスタムプロキシを使っている場合は、明示的に転送してください。
location /v1/ {
proxy_pass http://backend;
proxy_set_header anthropic-beta $http_anthropic_beta;
proxy_set_header anthropic-version $http_anthropic_version;
proxy_set_header X-Claude-Code-Session-Id $http_x_claude_code_session_id;
}
ゲートウェイ側でベータヘッダーを転送できない場合は、Claude Code起動前に次を設定します。
export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
これにより、Claude Codeはベータヘッダーを必要とする機能をスキップします。一部の実験的機能は使えなくなりますが、コアのエージェントループは動作します。
根本原因6:エンタープライズポリシーと競合している
TeamまたはEnterpriseプランで管理者が管理設定を配布している場合、その設定はローカルの~/.claude/settings.jsonや環境変数より優先されます。
たとえば、次のような管理ポリシーがあると、ローカル設定が正しくてもエラーになります。
- 使用可能モデルが制限されている
- カスタムベースURLがブロックされている
- 特定のゲートウェイドメインが許可されていない
管理設定の有無を確認します。
ls ~/.claude/managed-settings.json 2>/dev/null && echo "管理設定が見つかりました"
Claude Code内でも確認できます。
/status
「管理設定」が有効な場合、管理者に次のいずれかを依頼します。
- ゲートウェイドメインを許可されたベースURLに追加する
- ゲートウェイのモデルIDを含む
availableModelsを設定する - カスタムベースURL制限から対象ユーザーを除外する
自分で管理するエンタープライズデプロイメントでは、管理設定はmacOSなら次のようなパスに配置されます。
/Library/Application Support/ClaudeCode/managed-settings.json
Windows / Linuxでは同等の管理設定パスを確認してください。
完全な動作構成例
Claude Code + OpenRouter(DeepSeek V4 Pro)
OpenRouterはAnthropic互換APIを公開しています。DeepSeek V4 ProでClaude Codeのエージェントループを動かす場合は、~/.claude/settings.jsonを次のように設定します。
{
"env": {
"ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
"ANTHROPIC_AUTH_TOKEN": "sk-or-your-openrouter-key",
"ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek/deepseek-v4-pro",
"ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek/deepseek-v4-pro",
"ANTHROPIC_DEFAULT_HAIKU_MODEL": "deepseek/deepseek-v4-pro"
}
}
ベースURLを変更しても、Claude Codeはデフォルトではclaude-sonnet-4-6を要求します。そのため、OpenRouterでDeepSeekに固定したい場合はモデル名のオーバーライドが必要です。
OpenRouterはツール呼び出しに関するAnthropicのストリーミング仕様を完全には実装していません。一部のケースでは、関数呼び出しの引数が空で届く可能性があります。主要なエージェントループは動作しますが、複雑なマルチツールチェーンでは注意してください。
互換性の更新は、OpenRouterのClaude Code統合ドキュメントを確認してください。
Claude Code + LiteLLM(任意のプロバイダー)
LiteLLMはClaude Code向けの互換性が高いゲートウェイです。ヘッダー転送を処理し、OpenAI、Anthropic、Vertex、Bedrock、Hugging Faceモデルへのルーティングをサポートします。
LiteLLMのconfig.yaml例です。
model_list:
- model_name: claude-sonnet-4-6
litellm_params:
model: deepseek/deepseek-v4
api_key: "sk-your-deepseek-key"
- model_name: claude-opus-4-7
litellm_params:
model: deepseek/deepseek-v4-pro
api_key: "sk-your-deepseek-key"
Claude Code側の~/.claude/settings.jsonは次のようにします。
{
"env": {
"ANTHROPIC_BASE_URL": "http://localhost:4000",
"ANTHROPIC_AUTH_TOKEN": "sk-litellm-your-key"
}
}
この構成では、Claude Codeはclaude-sonnet-4-6を送信します。LiteLLMがそのモデル名を受け取り、DeepSeek V4へルーティングします。そのため、Claude Code側でモデル名をオーバーライドする必要はありません。
Claude Code + ローカルvLLM
ローカル推論では、vLLMをAnthropic互換モードで起動します。
python -m vllm.entrypoints.openai.api_server \
--model deepseek-ai/DeepSeek-V3 \
--dtype auto \
--api-key local-key \
--port 8000
Claude Code側を設定します。
export ANTHROPIC_BASE_URL="http://localhost:8000"
export ANTHROPIC_API_KEY="local-key"
export ANTHROPIC_DEFAULT_SONNET_MODEL="deepseek-ai/DeepSeek-V3"
エラーをデバッグする
上記を修正しても解決しない場合は、デバッグログを有効にします。
claude --debug 2>&1 | head -100
確認するポイントは次のとおりです。
-
Sending request to::実際に呼び出しているURL -
Response status::ゲートウェイからのHTTPステータス -
enterprise config error::内部検証メッセージ
ゲートウェイ側を確認する場合は、Claude Codeに近いリクエストをcurlで送ります。
curl -v -X POST "${ANTHROPIC_BASE_URL}/v1/messages" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${ANTHROPIC_AUTH_TOKEN}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: max-tokens-3-5-sonnet-2024-07-15" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 10,
"messages": [{"role": "user", "content": "hi"}]
}'
有効なゲートウェイなら、メッセージ構造を含む200が返ります。
401、403、422が返る場合は、Claude Codeではなくゲートウェイ側の認証またはリクエスト形式の問題です。
ApidogでAPIをテストする
サードパーティプロバイダー統合をデバッグする場合、Apidogを使うと、LLMゲートウェイを通過するリクエストとレスポンスを確認しやすくなります。
/v1/messagesエンドポイント用のコレクションを作成し、動作するリクエストテンプレートを保存しておくと、Claude Codeを毎回起動し直さずにプロバイダー間の挙動を比較できます。
Apidogで次のように設定します。
- ゲートウェイURLを指す新しいコレクションを作成する
-
anthropic-versionをコレクションレベル変数にする -
anthropic-betaをコレクションレベル変数にする -
Authorizationをコレクションレベル変数にする -
/v1/messagesへのPOSTリクエストを保存する - ゲートウェイを切り替えるときは変数だけ変更する
これは、Invalid custom3p enterprise configを引き起こすヘッダー転送問題の切り分けに役立ちます。Claude Code側の設定を疑う前に、ゲートウェイがどのヘッダーを受け取り、どのヘッダーをバックエンドへ転送しているかを確認できます。
知っておくべきClaude Code関連設定
ベータヘッダー依存を無効にする
一部のエンタープライズゲートウェイはカスタムヘッダーを転送できません。その場合は次を設定します。
export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
これにより、エンタープライズ設定の検証からベータ機能ハンドシェイクが外れます。エージェントループは引き続き動作しますが、ベータヘッダーに依存する機能は使えなくなります。
ゲートウェイ検出機能付きモデルピッカー
Claude Code v2.1.129以降では、ゲートウェイのモデルリストから/modelピッカーを自動設定できます。
export CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1
Claude Codeは起動時にゲートウェイの/v1/modelsエンドポイントをクエリし、検出したモデルをピッカーに追加します。
ただし、追加されるのはclaudeまたはanthropicで始まるIDを持つモデルのみです。DeepSeekのようなモデルを使う場合は、ANTHROPIC_DEFAULT_SONNET_MODELで手動固定してください。
カスタムモデルピッカーエントリ
単一のカスタムモデルを/modelピッカーに追加するには、次を設定します。
export ANTHROPIC_CUSTOM_MODEL_OPTION="deepseek/deepseek-v4-pro"
export ANTHROPIC_CUSTOM_MODEL_OPTION_NAME="DeepSeek V4 Pro"
export ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION="Claude Opusより17倍安価"
これは/modelピッカーの下部に表示されます。セッション中にゲートウェイモデルとデフォルトのClaudeモデルを切り替えやすくなります。
関連ガイド
カスタムモデルバックエンドでClaude Codeを使う場合は、次のガイドも参考になります。
- API開発チーム向けのAGENTS.mdファイルの書き方 — 特定のスタックに合わせてClaude Codeの動作を設定する
- Ruflo: Claude Codeのためのマルチエージェントオーケストレーション — スウォーム、永続メモリ、100以上のMCPツールをClaude Codeに追加する
- Puter.js経由で無料かつ無制限のClaude APIを入手 — クライアントアプリを構築している場合のブラウザベースの代替手段
- 2026年版最高のローカルLLM — vLLMを通じてローカルで推論を実行したい場合
よくある質問
Claude Codeでサードパーティプロバイダーを使うことはAnthropicの規約違反ですか?
いいえ。
Anthropicは、Bedrock、Vertex AI、Foundry、およびカスタムゲートウェイ経由のルーティングに関するANTHROPIC_BASE_URLパターンを文書化し、公式にサポートしています。
2026年4月にブロックされたのは、Claude CodeクライアントIDを偽装してAnthropic自身のAPIにサブスクリプション料金でアクセスしようとしたサードパーティツールです。
自分のAPIキーでOpenRouterや独自ゲートウェイを使う構成とは別の問題です。
Claude CodeのエージェントループはDeepSeek V4 Proで動作しますか?
コアのループは動作します。
たとえば次の操作です。
- ファイル編集
- シェルコマンド実行
- 複数ステップのタスク実行
一方、サードパーティプロバイダー経由では次の機能が動作しない場合があります。
- MCPサーバーツール
- 画像 / ビジョン入力
これらが必要な場合は、Anthropic APIまたはBedrock / Vertexを使う必要があります。
エンタープライズプランではないのに、なぜ「エンタープライズ設定」と表示されるのですか?
Claude Codeは、サブスクリプションの種類に関係なく、サードパーティプロバイダー設定を「エンタープライズ設定」と呼びます。
これはコード上のラベルであり、プラン制限ではありません。無料またはProの個人開発者でも、カスタムサードパーティプロバイダーを設定できます。
セッション中にAnthropicとサードパーティプロバイダーを切り替えられますか?
同じセッション内ではできません。
ベースURLは起動時に読み込まれます。切り替えるには、Claude Codeを終了し、環境変数または設定ファイルを変更してから新しいセッションを開始してください。
DeepClaudeは、--backend dsや--backend anthropicのようなCLIフラグでこの切り替えをラップしています。
ゲートウェイが企業ファイアウォールの背後にあります。プロキシ設定は使えますか?
はい。起動前にHTTPS_PROXYを設定します。
export HTTPS_PROXY="http://your-proxy:8080"
export ANTHROPIC_BASE_URL="https://your-internal-gateway"
企業プロキシによるTLSインターセプトがある場合は、CA証明書も指定します。
export NODE_EXTRA_CA_CERTS="/path/to/corporate-ca-bundle.pem"
curlテストは通るのにClaude Codeではエラーになります。何が違いますか?
Claude Codeは、単純なcurlでは再現されないプリフライト検証リクエストを行います。
--debug付きでClaude Codeを起動し、実際のプリフライトリクエストを確認してください。
よくある差分は次のとおりです。
-
anthropic-betaヘッダー -
X-Claude-Code-Session-Idヘッダー - 検証リクエストのJSONボディ形式
- モデル名の違い
- 認証ヘッダー形式の違い
結論
Invalid custom3p enterprise configは、設定検証エラーです。ポリシーブロックではありません。
確認順は次のとおりです。
-
ANTHROPIC_BASE_URLから余計な/v1を削除する -
ANTHROPIC_AUTH_TOKENとANTHROPIC_API_KEYの使い分けを確認する -
~/.claude/settings.jsonをJSONとして検証する - 新規インストールでは
hasCompletedOnboardingを確認する - ゲートウェイが必要なヘッダーを転送しているか確認する
- 管理ポリシーと競合していないか確認する
設定が正しく検証されると、Claude Codeのエージェントループは選択したバックエンド経由で実行できます。OpenRouterまたはLiteLLM経由のDeepSeek V4 Proは、多くのClaude Codeユースケースを低コストでカバーできます。
主な制限はMCPツールとビジョン入力です。これらが必要な場合は、Anthropic API、Bedrock、またはVertexを使用してください。

Top comments (0)