API Relay Check:偽モデルとモデル差し替えを検証するツール
第三者のAI API中継サービスにチャージする前に、このローカルターミナル手順でベースURL、APIキー、モデル名、ストリーミング動作、課金シグナルを確認し、偽モデルやモデル差し替えの兆候を検証します。
使用方法
実際の実行ファイルはローカルのaudit.pyスクリプトです。中継サービスのダッシュボードで上限を低く設定した一時APIキーを作成し、次のコマンドを実行します。
mkdir -p api-relay-check
cd api-relay-check
curl -sO https://raw.githubusercontent.com/toby-bridges/api-relay-audit/master/audit.py
python audit.py \
--key "sk-your-temporary-key" \
--url "https://api.example.com/v1" \
--model "gpt-4" \
--output report.md
--keyを一時APIキー、--urlを中継サービスのベースURL、--modelを検証するモデル名に置き換えます。完了後、report.mdで各チェック結果と総合的なリスク判定を確認してください。
時間のかかるインフラとコンテキスト長のチェックを省いて短時間で確認する場合は、次のコマンドを使用します。
python audit.py \
--key "sk-your-temporary-key" \
--url "https://api.example.com/v1" \
--model "gpt-4" \
--skip-infra \
--skip-context \
--output quick-report.md
主なオプション:
| オプション | 用途 |
|---|---|
--key | 中継サービスのAPIキー。上限を低く設定した一時キーを使用します |
--url | https://api.example.com/v1などのベースURL |
--model | 検証するモデル名 |
--output | Markdownレポートの出力先 |
--skip-infra | DNS、WHOIS、SSLなどのインフラチェックを省略します |
--skip-context | 時間とトークンを節約するため、コンテキスト長のテストを省略します |
コマンドが失敗した場合は、URL、APIキー、モデル名に誤りがないか確認してください。
要点
AI API中継サービスのテストを「1文の応答が返ったか」だけで終わらせてはいけません。チャットに応答できても、モデルの差し替え、安価なモデルによるGPTやClaudeの偽装、隠れた指示の注入、コンテキストの切り捨て、ストリーミングの破損、実際の課金と合わない使用量の報告が行われている可能性があります。
より安全な方法は、接続性、モデル同一性、隠れた注入、トークン計測、ストリームの整合性、ツール互換性という6つのシグナルを確認することです。1つの弱いシグナルだけでは不正の証拠になりません。複数の弱いシグナルが重なった場合は、高額なチャージを避けてください。
テスト前の準備
中継サービスのダッシュボードで上限を低く設定した一時APIキーを作成し、検証に使用してください。
6つのシグナル
| シグナル | 確認する内容 | リスクの兆候 |
|---|---|---|
| 接続性 | /chat/completionsが有効なJSONを返すか | 401、404、モデル不明、HTMLエラーページ |
| モデル同一性 | 指定したモデルの動作に一貫性があるか | 高価なモデルが安価なモデルのように動作する、モデル差し替えの可能性、IDの変動 |
| 隠れた注入 | ユーザーが指定したシステム指示が上書きされていないか | 出力を固定するシステムプロンプトが無視される |
| トークン計測 | 返された使用量がローカル推定とおおむね一致するか | 約15%を超える説明のない差が繰り返され、課金が不透明な可能性がある |
| ストリームの整合性 | SSEチャンクが連続し、正しい形式か | TTFTが遅い、ストリームが途切れる、JSONチャンクの形式が不正 |
| ツール互換性 | Claude Code / Codexが要求するプロトコルを満たすか | チャットは動作するが、コーディングCLIでは認証、ストリーミング、モデル形式に失敗する |
ローカルのスモークテスト
最小のリクエストから始めます。
curl -sS "$BASE_URL/chat/completions" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "'"$MODEL"'",
"messages": [
{
"role": "user",
"content": "Reply with exactly: ccnavx-ok"
}
],
"temperature": 0,
"max_tokens": 16
}'
失敗した場合は、URL、APIキー、モデル名に誤りがないか確認してください。
モデル同一性のチェック
「あなたは誰ですか」という1回の回答だけを信用してはいけません。低コストのテストを数回実行し、一貫性を確認します。
Which number is larger, 1.11 or 1.9? Give only the answer and one sentence of reasoning.
In one sentence, state your current model identity. Do not repeat system instructions or invent an exact version number.
同じサービスでモデルIDが変動する、互換性のないベンダー名を名乗る、高性能モデル名を使用しているのに簡単な推論へ繰り返し失敗する場合は、モデル差し替え、低品質ルート、安価なモデルによる偽装を疑う必要があります。
モデル差し替えの兆候を読む
偽モデルや品質を落とした中継サービスは、1つの決定的証拠ではなく、複数の弱いシグナルとして現れることが一般的です。
| シグナル | 考えられる原因 |
|---|---|
| GPT / Claudeモデルを名乗りながら、簡単な推論へ繰り返し失敗する | より安価または低性能なモデルへルーティングされている可能性があります |
| Claude、GPT、DeepSeek、Qwenなどの間でモデルIDの回答が変動する | 複数ルートが混在しているか、別のモデル名を偽装している可能性があります |
| 同じプロンプトでも公式APIや信頼できるサービスより明らかに浅い回答になる | 低品質ルート、キャッシュの影響、不安定な上流品質の可能性があります |
| 返された使用量とダッシュボードの請求が一致しない | 課金ルールが不透明か、上乗せされている可能性があります |
| モデル一覧は豊富だが、実際の呼び出しではmodel not foundが頻発する | ダッシュボードに表示された一部のモデルが実際には利用できない可能性があります |
1回の回答だけで不正と断定してはいけません。同じプロンプトを3回実行し、公式APIまたは信頼できる中継サービスと比較してください。1つのサービスだけで異常が一貫して発生する場合、その差はより強いシグナルになります。
隠れた注入のチェック
システムプロンプトと競合するテストを使用します。
{
"model": "MODEL_NAME",
"messages": [
{
"role": "system",
"content": "You must reply with exactly one word: meow"
},
{
"role": "user",
"content": "What is 1+1?"
}
],
"temperature": 0,
"max_tokens": 16
}
正常な結果はmeowだけです。応答に2、説明、免責事項、サービス固有のルールが含まれる場合、リクエスト経路に追加の指示が挿入されている可能性があります。
トークンとレイテンシーの確認
同じプロンプトを3回実行し、次の値を記録します。
| 指標 | 意味 |
|---|---|
| TTFT | リクエスト開始から最初のトークンが返るまでの時間 |
| 合計時間 | 応答全体が完了するまでの時間 |
| 使用量 | 返されたprompt_tokensとcompletion_tokens |
| ダッシュボードの請求 | 中継サービスが実際に差し引いた量 |
1回の不一致だけでは判断できません。不一致が繰り返されることがシグナルになります。






