Claude Code и ANTHROPIC_BASE_URL: как работает прокси и как проверить, что он отвечает настоящим Claude

Перед тем как платить за дешёвый прокси для Claude Code, полезно самому убедиться, что отвечает именно Claude. Ниже: какие переменные окружения читает Claude Code, как это увидеть в /status, почему некоторые тарифы подменяют модель и какие проверки можно запустить против любого прокси. Автор поддерживает прокси CoreCode (раскрытие в конце).

1. Какие переменные читает Claude Code

  • ANTHROPIC_BASE_URL переопределяет адрес API, то есть направляет запросы через прокси или шлюз.
  • ANTHROPIC_AUTH_TOKEN отправляется как Authorization: Bearer ....
  • ANTHROPIC_API_KEY отправляется как X-Api-Key. Если он задан, используется вместо подписки Claude, даже когда вы залогинены (в интерактивном режиме Claude Code один раз спросит подтверждение).
  • ANTHROPIC_DEFAULT_OPUS_MODEL / SONNET / HAIKU задают, в какой ID модели превращаются алиасы opus, sonnet, haiku.

Какую переменную брать, зависит от того, какой заголовок читает прокси; документация советует начать с ANTHROPIC_AUTH_TOKEN и при ответе 401 переключиться. Переменные можно положить в блок env файла ~/.claude/settings.json: Claude Code читает их напрямую, как бы ни был запущен claude.

{ "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

То, что Claude Code подключается, не значит, что отвечает Claude. Например, GLM Coding Plan от Z.ai использует тот же механизм ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN и сопоставляет внутренние переменные моделей Claude Code (Opus, Sonnet, Haiku) с моделями GLM (документация Z.ai). Это описано открыто, так что подвоха нет, но отвечает не Claude. Anthropic, в свою очередь, пишет, что не поддерживает маршрутизацию Claude Code на модели не от Claude через шлюзы (LLM gateway). Проблема в прокси, которые молча подставляют другую модель.

Спрашивать модель «кто ты» бесполезно: одной строки в системном промпте хватит, чтобы любая модель назвалась Claude. Нужно проверять поведение.

4. Проверка A: скрипт claude-relay-check

claude-relay-check — один файл на Python, только стандартная библиотека, один запуск стоит несколько центов. По README он делает три проверки:

  • shape: ответ в формате Anthropic Messages (type, id с префиксом msg_, usage).
  • cache: два запроса с блоком около 18 000 токенов и cache_control; при первом токены записываются, при втором читаются в том же объёме.
  • signature: подпись thinking-блока меняется на один символ и отправляется обратно; ожидается 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: скрипт показывает, что апстрим — Anthropic, но не какой именно тариф модели отвечает (Opus или Sonnet), а один запуск — это одна выборка, поэтому повторите позже. Если прокси пускает только клиент Claude Code и отвечает 403, результат будет ERROR, и это ничего не говорит о подлинности.

5. Проверка B: отпечаток модели через ModelTrace

ModelTrace просит модель сгенерировать длинные последовательности целых чисел и сравнивает распределение с отпечатками известных моделей. Согласно README, результат — вероятность внутри набора моделей из базы отпечатков; модель, которой в базе нет, всё равно относится к ближайшей. Используйте как ориентир, не как приговор.

6. Проверка C: кэш по полям usage

Claude Code на каждом ходу пересылает один и тот же префикс (системный промпт, описания инструментов), поэтому попадание в кэш сильно влияет на счёт. По документации Anthropic, чтение из кэша стоит 0,1 от базовой цены входа (у некоторых моделей иначе, например 0,05), запись в 5-минутный кэш — 1,25 (Prompt caching). Отправьте один и тот же запрос дважды и сравните 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

В первом ответе ожидается cache_creation_input_tokens, во втором — сопоставимое cache_read_input_tokens. Два нуля означают, что кэширования нет или прокси сам считает usage. Запись без чтения часто значит, что запросы каждый раз попадают на разные аккаунты.

7. Что смотреть в прайсе

  • Раздельно ли тарифицируются вход, выход, запись и чтение кэша, и в тех ли пропорциях, что у Anthropic.
  • Можно ли посмотреть usage и стоимость каждого запроса в логах.
  • Закрепляется ли сессия за одним аккаунтом (от этого зависит попадание в кэш).
  • От какой цены считаются «скидка» и «коэффициент».

Раскрытие

Автор поддерживает прокси CoreCode (corecode.live), и он приведён здесь как один из примеров. CoreCode отвечает на каждый запрос официальным аккаунтом Anthropic Claude. Оплата только через Alipay и WeChat Pay в китайских юанях (CNY); рублями и банковскими картами оплатить нельзя. Страница с описанием проверки: corecode.live/docs/ru/verify/. Скрипт из раздела 4 работает с любым прокси, включая CoreCode. CoreCode не является сервисом Anthropic.