В 50 раз дешевле Sonnet: подключаю Step 3.5 Flash к Claude Code за час войны с Windows

В 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. Ставим роутер

npm install -g @musistudio/claude-code-router ccr -v

Если ccr не находится после установки — закрой PowerShell и открой заново, чтобы подхватился PATH.

Шаг 2. Создаём конфиг

Конфиг лежит в C:\Users\<юзер>\.claude-code-router\config.json. Создавать через Notepad нельзя — он сохраняет с BOM, JSON ломается. Через VSCode или PowerShell-командой.

Через VSCode проще всего:

New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.claude-code-router" | Out-Null code "$env:USERPROFILE\.claude-code-router\config.json"

Настройки:

{ "LOG": true, "Providers": [ { "name": "openrouter", "api_base_url": "https://openrouter.ai/api/v1/chat/completions", "api_key": "sk-or-v1-ТВОЙ_КЛЮЧ_OPENROUTER", "models": [ "stepfun/step-3.5-flash" ], "transformer": { "use": [ ["openrouter", { "reasoning": { "enabled": true } }] ] } } ], "Router": { "default": "openrouter,stepfun/step-3.5-flash", "background": "openrouter,stepfun/step-3.5-flash", "think": "openrouter,stepfun/step-3.5-flash", "longContext": "openrouter,stepfun/step-3.5-flash" } }

Проблема номер один уже здесь. По дефолту роутер пытается выключить 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. Запускаем роутер

ccr start

Окно повиснет с надписью «Loaded JSON config from: ...» — это нормально, сервер работает прямо в этом окне. Не закрываем.

Шаг 4. Переменные окружения

Указываем переменные:

$env:ANTHROPIC_BASE_URL = "http://127.0.0.1:3456" $env:ANTHROPIC_AUTH_TOKEN = "dummy" $env:ANTHROPIC_API_KEY = ""

Первая переменная говорит 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\, а отдельным файлом рядом). Прячем его на время эксперимента:

Rename-Item "$env:USERPROFILE\.claude.json" "$env:USERPROFILE\.claude.json.hidden"

Маленькая деталь: Claude Code пересоздаёт .claude.json при каждом запуске, если его нет. Так что после первой попытки запустить claude нужно проверить и при необходимости спрятать снова:

Test-Path "$env:USERPROFILE\.claude.json" # Если True — снова прячем: Rename-Item "$env:USERPROFILE\.claude.json" "$env:USERPROFILE\.claude.json.hidden2"

Шаг 6. Запуск

claude

В шапке Claude Code должно быть API Usage Billing — без упоминания твоего email и подписки. Если Claude Pro account — значит .claude.json снова восстановился, прячь ещё раз.

Внутри сессии:

/status

Ожидаемое:

Auth token: ANTHROPIC_AUTH_TOKEN Anthropic base URL: http://127.0.0.1:3456 Model: Default (claude-opus-4-7[1m])

Модель показывает 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, не по её собственным словам.

Скрипт чтобы не настраивать каждый раз

# flash-mode.ps1 if (Test-Path "$env:USERPROFILE\.claude.json") { $stamp = Get-Date -Format "yyyyMMdd-HHmmss" Rename-Item "$env:USERPROFILE\.claude.json" "$env:USERPROFILE\.claude.json.hidden-$stamp" } $env:ANTHROPIC_BASE_URL = "http://127.0.0.1:3456" $env:ANTHROPIC_AUTH_TOKEN = "dummy" $env:ANTHROPIC_API_KEY = "" Write-Host "Flash mode armed. Run 'claude' to start." -ForegroundColor Green

Запуск:

. .\flash-mode.ps1 claude

Что дальше

Цепочка собрана, расход видно в реальном времени, 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). Разбираем новые модели, делимся опытом и полезными находками.

Начать дискуссию