В 50 раз дешевле Sonnet: подключаю Step 3.5 Flash к Claude Code за час войны с Windows
Sonnet 4.6 — $3 за миллион input-токенов и $15 за output. Step 3.5 Flash — $0.10 и $0.30. На входе разница 30 раз, на выходе — 50. Если эта китайская MoE-модель удержит хотя бы 70% качества Sonnet в Claude Code на реальной агентной задаче — экономика ежедневной работы меняется радикально.
Решил проверить на полном рабочем дне. Прежде чем гонять модель на боте — надо её подключить. И вот тут оказалось, что инструкции «поставил роутер, прописал ключ, работай», которыми завален интернет, на Windows не работают. Этот пост — про подключение: три реальные грабли, как их обойти, и как доказать, что модель действительно та, что нужно.
Спойлер по итогу: два пробных запроса в Claude Code обошлись в $0.0050. Полцента. Дальше про то, как туда дойти.
Почему это вообще возможно
Claude Code из коробки умеет ходить только в api.anthropic.com. Никакой нативной настройки чужого провайдера. Но клиент читает переменную ANTHROPIC_BASE_URL и идёт туда, куда сказали. Если на другой стороне сервис, который принимает запросы в формате Anthropic Messages API и переводит их в формат целевой модели — Claude Code не заметит подмены.
OpenRouter говорит на формате OpenAI Chat Completions. Между ним и Claude Code нужен переводчик. Самый популярный — claude-code-router от @musistudio. Это npm-пакет, который поднимает локальный HTTP-сервер на 127.0.0.1:3456, принимает запросы Claude Code в формате Anthropic, переводит их в OpenAI-формат и отправляет в OpenRouter. Ответ обратно тем же путём.
Что нужно для старта
- Windows 10/11
- Node.js v20+ (у меня v24.15.0)
- Claude Code v2.1.x (у меня 2.1.144)
- Аккаунт на OpenRouter с балансом хотя бы $1
- 30 минут на установку и тесты
Шаг 1. Ставим роутер
Если ccr не находится после установки — закрой PowerShell и открой заново, чтобы подхватился PATH.
Шаг 2. Создаём конфиг
Конфиг лежит в C:\Users\<юзер>\.claude-code-router\config.json. Создавать через Notepad нельзя — он сохраняет с BOM, JSON ломается. Через VSCode или PowerShell-командой.
Через VSCode проще всего:
Настройки:
Проблема номер один уже здесь. По дефолту роутер пытается выключить reasoning у моделей (для агентной работы это часто экономит токены). Но Step 3.5 Flash — reasoning-модель по архитектуре, и на попытку выключить даёт 400 Reasoning is mandatory for this endpoint and cannot be disabled. Нужно явно сказать "reasoning": { "enabled": true } — иначе ничего не поедет.
Поставь свой ключ из openrouter.ai/keys. Я рекомендую сразу создать отдельный ключ с лимитом в $1 — это упростит мониторинг расхода.
Шаг 3. Запускаем роутер
Окно повиснет с надписью «Loaded JSON config from: ...» — это нормально, сервер работает прямо в этом окне. Не закрываем.
Шаг 4. Переменные окружения
Указываем переменные:
Первая переменная говорит Claude Code куда ходить. Вторая — что использовать как токен авторизации (dummy — потому что роутер всё равно подменит на ключ OpenRouter). Третья пустая, чтобы Claude Code не нашёл случайно настоящий ключ Anthropic в системе.
Шаг 5. Проблема номер два — .claude.json
Если у тебя залогинен Claude Code через /login (то есть ты пользуешься подпиской Anthropic Pro или Max), есть большая проблема. Claude Code находит OAuth-токен подписки и игнорирует твой ANTHROPIC_BASE_URL. Запросы летят на api.anthropic.com мимо роутера. В /status ты видишь правильный URL, но реально клиент идёт на Anthropic.
Лечится так. OAuth-токен хранится в файле C:\Users\<юзер>\.claude.json (не в папке .claude\, а отдельным файлом рядом). Прячем его на время эксперимента:
Маленькая деталь: Claude Code пересоздаёт .claude.json при каждом запуске, если его нет. Так что после первой попытки запустить claude нужно проверить и при необходимости спрятать снова:
Шаг 6. Запуск
В шапке Claude Code должно быть API Usage Billing — без упоминания твоего email и подписки. Если Claude Pro account — значит .claude.json снова восстановился, прячь ещё раз.
Внутри сессии:
Ожидаемое:
Модель показывает claude-opus-4-7 — это нормально, это просто алиас. Реальная модель определяется внутри роутера по правилу default из конфига и подменяется на stepfun/step-3.5-flash.
Шаг 7. Недочет номер три — модель врёт, кто она
Стандартная проверка после подмены — спросить модель кто она:
кто ты? назови свою модель и провайдера, одно предложение
Step 3.5 Flash на этот вопрос отвечает:
Я — Claude, большая языковая модель от Anthropic, работающая через официальный CLI Anthropic под кодовым именем Claude Code.
И вот этот недочет, на которой я потерял час, думая что подмена не сработала. Не сработала же — ответ говорит «Я Claude», окно ccr start молчит, по всем признакам Claude Code обходит роутер.
На самом деле всё работает. Step 3.5 Flash, как и многие китайские модели, обучена на синтетических данных от Claude/GPT и галлюцинирует про свою идентичность. А роутер по дизайну молчит в stdout — он пишет только в файл и только при ошибках.
Проверять модель надо по dashboard OpenRouter, не по её собственным словам.
Скрипт чтобы не настраивать каждый раз
Запуск:
Что дальше
Цепочка собрана, расход видно в реальном времени, Step 3.5 Flash отвечает (хоть и притворяется Claude). Дальше — буду тестировать на реальной работе.
Тестовая задача — продолжаю историю с Telegram-ботом на C# с прошлого поста. Расширяю: добавляю SQLite для истории подписок, графики через QuickChart API, команду /stats с агрегацией. Типичный средний кусок работы, не «привет-мир», но и не архитектурное проектирование. Именно тот диапазон, в котором решается экономика.
Вывод
Подключить Step 3.5 Flash к Claude Code на Windows реально, но дорожка не та, что в README. Когда все грабли обойдены, цепочка работает стабильно: два пробных запроса обошлись в $0.0050 при той же UX в Claude Code, что и с Sonnet. Если эта же экономика удержится на реальной задаче в течение дня — это сильно меняет картину для всех, у кого Claude Code это ежедневный инструмент, а не игрушка.
Главное не доверять /status и не доверять самой модели. Единственный источник истины — dashboard провайдера. Когда видишь там расход с правильным slug модели и свежим Last Used — значит подмена работает. Всё остальное может врать.
Больше про LLM и AI — в нашем Telegram-канале (@devgeek_sh). Разбираем новые модели, делимся опытом и полезными находками.