安価な Claude Code 向けリレー(API 中継)を使う前に、「本当に Claude が答えているのか」を自分で確かめる手順をまとめます。前半は Claude Code が読む環境変数の話、後半はどのリレーにも使える検証方法です。筆者は CoreCode というリレーを運営しています(末尾に開示)。
1. Claude Code が読む環境変数
公式ドキュメント(環境変数、LLM ゲートウェイへの接続)によると次のとおりです。
-
ANTHROPIC_BASE_URL:API のエンドポイントをプロキシやゲートウェイに向けます。 -
ANTHROPIC_AUTH_TOKEN:Authorization: Bearerヘッダーで送られます。 -
ANTHROPIC_API_KEY:x-api-keyヘッダーで送られます。設定するとログイン済みのサブスクリプションより優先されます(対話モードでは初回に承認を求められます)。 -
ANTHROPIC_DEFAULT_OPUS_MODEL/SONNET/HAIKU:opussonnethaikuの各エイリアスが指すモデル ID を変えます。
リレーがどちらのヘッダーを読むかで変数を選びます。迷ったら ANTHROPIC_AUTH_TOKEN から試し、401 なら切り替える、というのが公式の案内です。~/.claude/settings.json の env に書くと、シェルの起動方法に関係なく反映されます。
{
"env": {
"ANTHROPIC_BASE_URL": "https://relay.example",
"ANTHROPIC_AUTH_TOKEN": "sk-your-key"
}
}
2. /status で確認する
claude を起動して /status を実行し、Anthropic base URL の行がリレーのアドレスになっているか、Auth token または API key の行があるかを見ます。Login method に claude.ai アカウントが出ている場合、認証情報が効いていません。
3. 安いプランでモデルが差し替わる例
「Claude Code で使える」ことと「Claude が答える」ことは別です。たとえば Z.ai の GLM Coding Plan は、同じ ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN の仕組みで Claude Code を接続し、Opus / Sonnet / Haiku の変数を GLM のモデルに対応づけます(Z.ai ドキュメント)。これは公式に明記された使い方なので不正ではありませんが、答えているのは Claude ではありません。なお Anthropic 側は、ゲートウェイ経由で Claude 以外のモデルに Claude Code をつなぐ使い方をサポートしないと書いています(LLM gateway)。問題は、非 Claude モデルを黙って返すリレーがありうる点です。
モデルに「あなたは誰ですか」と聞いても無意味です。システムプロンプトに 1 行書けば、どのモデルも Claude を名乗ります。見るべきは挙動です。
4. 検証 A:オープンソースの check-relay.py
claude-relay-check は標準ライブラリだけの Python 1 ファイルで、1 回数セントです。README によれば次の 3 つを調べます。
-
shape:レスポンスが Anthropic Messages 形式か(type、msg_で始まるid、usage)。 -
cache:約 18,000 トークンのcache_control付きプロンプトを 2 回送り、書き込みと読み出しが同量か。 -
signature:thinking ブロックの署名を 1 文字変えて送り返し、400 で拒否されるか。Anthropic は改ざんされた署名を必ず 400 にすると説明しています(Preserved thinking)。
curl -fsSLO https://raw.githubusercontent.com/CoreCodeAI/claude-relay-check/main/check-relay.py
python3 check-relay.py --base-url https://relay.example --key sk-your-key --model claude-sonnet-5-5
--base-url と --key を省略すると、Claude Code が使っている環境変数を読みます。README が明記している限界は 2 つです。上流が Anthropic だと示すだけで、選んだ等級(Opus か Sonnet か)までは示せません。また 1 回の抽出なので、時間を置いて再実行してください。Claude Code 以外のクライアントを 403 で拒否するリレーでは ERROR になり、真偽の判定にはなりません。
5. 検証 B:ModelTrace で等級を見る
ModelTrace は、モデルに長い整数列を 3 回生成させ、その数字の分布を既知モデルの指紋と比べて家族とバージョンを推定するツールです。README によると、結果は指紋庫に収録されたモデルの範囲での確率で、未収録のモデルは最も近い候補に振り分けられます。参考値として使ってください。
6. 検証 C:キャッシュを自分の目で見る
Claude Code は毎ターン同じ前置き(システムプロンプトやツール定義)を送るため、キャッシュの当たり方が料金を左右します。Anthropic は、キャッシュ読み出しを基本入力単価の 0.1 倍(モデルにより 0.05 倍など例外あり)、5 分キャッシュの書き込みを 1.25 倍と定めています(Prompt caching)。同じリクエストを 2 回送り、usage を比べます。
python3 - > /tmp/body.json <<'PY'
import json
t = "Reference note: " + "the quick brown fox jumps over the lazy dog. " * 1500
print(json.dumps({"model": "claude-sonnet-5-5", "max_tokens": 16,
"system": [{"type": "text", "text": t, "cache_control": {"type": "ephemeral"}}],
"messages": [{"role": "user", "content": "ok?"}]}))
PY
for i in 1 2; do
curl -sS "$ANTHROPIC_BASE_URL/v1/messages" \
-H "Authorization: Bearer $ANTHROPIC_AUTH_TOKEN" \
-H "anthropic-version: 2023-06-01" -H "content-type: application/json" \
-d @/tmp/body.json |
python3 -c 'import json,sys; d=json.load(sys.stdin); print(d.get("model"), d.get("usage"))'
done
1 回目に cache_creation_input_tokens、2 回目に同程度の cache_read_input_tokens が出れば期待どおりです。両方 0 なら、キャッシュが効いていないか、使用量をリレーが自前で計算しています。書き込むだけで読まれない場合は、リクエストが毎回別のアカウントに届いている可能性があります。
7. 料金表で見るところ
- 入力・出力・キャッシュ書き込み・キャッシュ読み出しが別々に、Anthropic と同じ比率で課金されるか。
- リクエスト単位の使用量と金額がログで確認できるか。
- 1 つのセッションが同じアカウントに固定されるか(キャッシュが保たれる条件です)。
- 「割引率」が何を基準にしているか。
免責・開示
筆者は CoreCode(corecode.live)を運営しており、これは検証手順の一例として挙げています。CoreCode は、すべてのリクエストを Anthropic 公式の Claude アカウントが処理するリレーです。決済は Alipay と WeChat Pay の人民元(CNY)のみで、日本円やクレジットカードには対応していません。自社の検証ページは こちら にあり、上記のスクリプトは CoreCode を含めどのリレーにも使えます。Anthropic の公式サービスではありません。