cd ../back to blog
$Trust//June 4, 2026//6 min read

あなたの Claude は本物の Claude か? 偽装・格下げプロキシを見抜く 4 つのテスト

model フィールドの文字列が同じでも、中身は別物かもしれない。コンテキスト・tool calling・vision・キャッシュの 4 テストで、本物のファーストパーティ モデルと再ラップ品を 1 分で切り分ける方法を、実行できる Python コード付きで解説します。

姉妹記事 では、ゲートウェイが正直なトークン数で課金しているかを検証しました。 この記事ではもう一つの約束を検証します。つまり、名前の裏にいるモデルが 本当にそのモデルなのか、という点です。リセラーは claude-sonnet-4-6 を名乗りながら、中身は小さなモデルだったり、ファインチューンだったり、 固定テンプレートで包んだプロンプトだったり、あるいは本物のモデルでも コンテキストウィンドウやネイティブ機能をこっそり削ったものを返せます。model フィールドの文字列は同じでも、通信路に流れているものは全く別物です。

誰かの言葉を鵜呑みにする必要はありません。4 つの短いテストで、本物の ファースト パーティ モデルと再ラップ品を切り分けられます。どれも モデルに「お前は何者だ」と尋ねることには依存しません — モデルは 自分の正体について信用ならない語り手だからです。代わりに 能力を直接プローブします。

モデルが偽装される 4 つの手口

  • すり替え。 フラッグシップの名前の裏で、より安く小さいモデルが提供される。 運用コストが最も安く、簡単なプロンプトでは最も気づきにくい。
  • テンプレート プロキシ。 あなたのプロンプトはモデルに届く前に固定の足場へ詰め込まれる — これは挙動を変え、さらに あなたが書いてもいないテキスト分だけトークン請求を水増しする。
  • 削られたウィンドウ。 200K コンテキストを謳いながら、 実際はその一部に切り詰め、長い入力の真ん中を黙って捨てる。
  • 剥ぎ取られた機能。 tool use、vision、prompt caching が 落とされるか偽装され、素のチャット以外はすべて劣化する。

テスト 1 — コンテキストウィンドウ

長いドキュメントの奥深くに事実を一つ隠し、それを取り出させます。本物の 200K コンテキストモデルなら取り出せますが、切り詰められた格下げ品は 入力でエラーになるか、真ん中を失います。

test_context_window.py
# test_context_window.py
# 名前の裏で差し替えられた格下げモデルは、宣言しているコンテキストを
# 実際には保持できない。長いドキュメントの奥深くに事実を一つ隠して、
# それを取り出させてみる。
from openai import OpenAI
client = OpenAI(api_key="sk-brievio-...", base_url="https://api.brievio.com/v1")

needle = "The launch code is HORIZON-7741."
filler = ("This sentence is filler. " * 9000)          # ノイズ約 5 万トークン
haystack = filler + "\n\n" + needle + "\n\n" + filler

resp = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[
        {"role": "system", "content": "Answer only from the document."},
        {"role": "user", "content": haystack + "\n\nWhat is the launch code?"},
    ],
    max_tokens=20,
)
print(resp.choices[0].message.content)   # 本物なら: "HORIZON-7741"
# 切り詰められた格下げプロキシは、長い入力でエラーになるか、真ん中を黙って
# 捨てて「分かりません」と答える。フィラーを宣言されたウィンドウより先まで
# 押し込んで(例: 200K モデルなら 150K トークン超)、どこで壊れるか観察する。

テスト 2 — ネイティブな tool calling

tool call を要求し、tool_calls を検査します。本物のモデルは 構造化された呼び出しを返しますが、tool 対応を装っているだけの再ラップ品は null を返し、テキストの中に JSON の塊を吐き出します。

test_tools.py
# test_tools.py — ネイティブな tool calling か、それとも偽物か?
resp = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "What's the weather in Tokyo? Use the tool."}],
    tools=[{
        "type": "function",
        "function": {
            "name": "get_weather",
            "parameters": {"type": "object", "properties": {"city": {"type": "string"}}},
        },
    }],
    tool_choice="auto",
)
msg = resp.choices[0].message
print("tool_calls:", msg.tool_calls)   # 本物なら: 構造化された get_weather(city="Tokyo")
# tool 対応を装っているだけのラップ済みプロキシは tool_calls=None を返し、
# 代わりに message.content にプレーンテキストとして JSON の塊を押し込む。それが見分け方。

テスト 3 — vision

中身が既に分かっている画像を送り、モデルにそれを読ませます。テキスト専用に 格下げされたモデルには読めません — 幻覚を出すか、エラーになります。

test_vision.py
# test_vision.py — 本当に「見える」のか?
resp = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "Reply with only the exact text shown in this image."},
            {"type": "image_url", "image_url": {"url": "https://your-host/known-text.png"}},
        ],
    }],
    max_tokens=30,
)
print(resp.choices[0].message.content)   # 本物なら: 画像内のテキスト
# テキスト専用に格下げされたモデルは読めない — 幻覚を出すか、image パートで
# エラーになるか、無視する。中身が既に分かっている画像を使うこと。

テスト 4 — キャッシュと請求

4 つ目のチェックは トークン水増しの記事 から拝借したものです。長いプレフィックスを 2 回送り、2 回目で cached_tokens がゼロでないこと、そして prompt_tokens が実際に送ったテキストと一致することを確認します。テンプレート プロキシは両方とも失敗します — 自分が書き換えてしまうプレフィックスは キャッシュできませんし、ラッパー分まで課金してくるからです。モデルの 真正性とメーターの正直さは一緒に旅をします。だから一緒に確かめましょう。

まとめ方

本物のモデルは 4 つすべてに合格します。フルのコンテキストを保持し、 本物の tool call を返し、画像を読み、プレフィックスをキャッシュし、 送ったとおりのトークン数で課金します。再ラップや格下げは少なくとも一つで 破綻します — たいていは偽装コストの高いもの(長いコンテキスト、vision) から先に。ゲートウェイを導入するときに一度このスイートを走らせ、その後も モデルの答えがこっそり悪くなったと感じたら再び走らせましょう。 ここでの劣化(リグレッション)こそ、サイレントな格下げが姿を現す瞬間です。

正直なベースライン

Brievio は本物のファーストパーティ モデルを tier-1 のクラウド チャネル経由でルーティングします — Claude は AWS Bedrock、Gemini は Google Vertex 経由で、フルのコンテキストウィンドウ、ネイティブな tool use、vision、prompt caching をそのまま素通しで通します。そして リクエストしたモデルが、そのまま手に入るモデルです。上記のすべての テストを Brievio に対して走らせれば、きれいに合格するはずです。 モデルカタログ には各モデルの実際の能力とコンテキストが載っており、 ドキュメント にはここで使ったリクエストの正確な形が示されています。

「本物のモデルなのか」と「メーターは真実を告げているのか」 — この 2 つは、どんな AI ゲートウェイに対しても尋ねる価値のある問いです。 この Brievio も含めて。どちらも答えるのに 1 分ほどしかかかりません。 ぜひ尋ねてみてください。