Claude Code
Три переменные окружения — и Claude Code ходит через шлюз. Плюс вариант через settings.json, порядок приоритетов ключей и проверка одной командой.
Быстро
Claude Code — клиент протокола Anthropic, поэтому base URL у него голый origin, без `/v1`: клиент дописывает /v1/messages сам.
Выберите один из двух путей. Переменные окружения действуют на все проекты в этой оболочке; файл настроек — на пользователя (~/.claude/settings.json) или на один репозиторий (.claude/settings.local.json).
# ~/.zshrc — или тот профиль, который читает ваша оболочка
export KUMO_API_KEY="kumo_sk_..."
export ANTHROPIC_BASE_URL="https://api.kumorouter.com"
export ANTHROPIC_AUTH_TOKEN="$KUMO_API_KEY"
export ANTHROPIC_MODEL="<model>"
claudeВариант с settings.local.json несёт ключ в самом файле, а команды проверки ниже читают его из переменной KUMO_API_KEY: экспортируйте ключ один раз в том терминале, из которого проверяете.
Claude Code списывает с того же кошелька, что и прямой вызов — пустой кошелёк ответит 402 (пополните его).
Настройки читаются при старте. Открытая сессия продолжит ходить по старому адресу, пока вы её не перезапустите: откройте новый терминал.
Где живут настройки
Файл настроек существует в двух областях, и обе законны одновременно.
~/.claude/settings.json— пользовательские настройки, действуют во всех проектах; ключ здесь уместен. На Windows это%USERPROFILE%\.claude\settings.json..claude/settings.jsonвнутри репозитория — общие для всей команды настройки. Файл коммитится вместе с репозиторием, поэтому кладите в него только несекретные значения — не ключ..claude/settings.local.jsonвнутри репозитория — личные настройки для этого репозитория, и именно сюда идёт ключ. Claude Code исключает этот файл из Git сам; если вы создаёте его руками, добавьте.claude/settings.local.jsonв.gitignoreсами.
Файла может не быть — тогда создайте его. Если файл есть, добавьте в него блок env, а не замените файл целиком: рядом обычно лежат ваши остальные настройки.
Ключ в файле — это ключ на диске: держите его только в settings.local.json или в переменной окружения, никогда в закоммиченном .claude/settings.json.
Первую ступень того же раздела Authentication precedence занимают не эти две переменные, а выбор облачного источника: CLAUDE_CODE_USE_BEDROCK, CLAUDE_CODE_USE_VERTEX, CLAUDE_CODE_USE_FOUNDRY. Машина, где хотя бы одна из них экспортирована, ходит мимо Kumo — какой бы токен вы ни задали. Снимите их в той оболочке, из которой работаете: unset CLAUDE_CODE_USE_BEDROCK CLAUDE_CODE_USE_VERTEX CLAUDE_CODE_USE_FOUNDRY — и проверьте выбранный источник командой /status.
По тому же разделу документации Claude Code ANTHROPIC_AUTH_TOKEN стоит выше ANTHROPIC_API_KEY: токен уходит заголовком Authorization: Bearer, ключ — заголовком X-Api-Key, и пока токен задан, побеждает он, а запросы уходят на шлюз. На стороне Kumo правило то же и с той же стороны: если пришли оба заголовка, шлюз читает Authorization. Но направлять эти две переменные на разных поставщиков всё равно не стоит: стоит токену не дойти до процесса — и клиент молча возьмёт следующий источник, а шлюз чужого ключа не примет. Снимите ANTHROPIC_API_KEY в той оболочке, из которой работаете с Kumo: unset ANTHROPIC_API_KEY — или уберите экспорт из профиля.
Выбор модели
ANTHROPIC_MODEL задаёт основную модель. Идентификатор берите из каталога — страница моделей или ответ шлюза по адресу https://api.kumorouter.com/v1/models.
Для вспомогательной, «малой и быстрой» модели у Claude Code есть отдельная переменная, и называется она в разных выпусках по-разному: ANTHROPIC_SMALL_FAST_MODEL или ANTHROPIC_DEFAULT_HAIKU_MODEL. Смотрите документацию установленного у вас выпуска и задавайте ту, которую он называет; вторая просто не будет прочитана.
Если модель не задана вовсе, клиент попросит модель по умолчанию своего выпуска — а такого идентификатора в каталоге может не быть. Тогда назовите модель явно.
Проверка
Сначала проверьте сам шлюз, потом клиент. Так вы отличите неверный ключ от неверной настройки Claude Code.
# 1. Шлюз отвечает на протоколе Anthropic
curl https://api.kumorouter.com/v1/messages \
-H "x-api-key: $KUMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "<model>",
"max_tokens": 64,
"messages": [{ "role": "user", "content": "reply with OK" }]
}'
# 2. Клиент ходит туда же — в новом терминале, в пустом каталоге
claude -p "reply with OK"Заголовок x-api-key — носитель нативного протокола Anthropic; тот же ключ едет и как Authorization: Bearer. Правило целиком — на странице аутентификации.
Вызов виден в журнале консоли: если ответ пришёл, а строки в журнале нет, значит клиент ходил не через шлюз.
Если не работает
- 401 — ключ. Он отозван, истёк или искажён; либо
ANTHROPIC_AUTH_TOKENне дошёл до процесса, и клиент взял следующий по разделу Authentication precedence источник —ANTHROPIC_API_KEYили собственный вход в Claude Code, — а такого ключа шлюз не знает. Шлюз намеренно не говорит, что именно из этого, — почему. - Ответ приходит не от Kumo — экспортирована
CLAUDE_CODE_USE_BEDROCK,CLAUDE_CODE_USE_VERTEXилиCLAUDE_CODE_USE_FOUNDRY. Этот выбор стоит выше обеих переменных с ключом, поэтому клиент уходит в облако провайдера, а не на шлюз. Снимите переменную и проверьте выбранный источник командой/status. - 404 — адрес. В
ANTHROPIC_BASE_URLпопал/v1, и клиент дописал свой: получился путь с удвоеннымv1. Уберите версию из base URL. - Модель не найдена — идентификатор не из каталога. Спросите список у шлюза и подставьте каноническое имя или псевдоним.
- Настройки не применились — сессия открыта с прежними значениями. Закройте её и откройте новый терминал.
- Ответ пришёл, в журнале пусто — переменные не дошли до процесса: проверьте, что профиль, который вы правили, действительно читает ваша оболочка.