Привет, Хабр! Меня зовут Даниил Подольский, я программист и архитектор, разрабатываю программное обеспечение и спецификации для создания ПО в YADRO. Вот уже девять месяцев я использую методологию Spec-Driven Development (SDD) в работе и управляю AI-агентами, которые пишут код. При этом я не считаю себя вайбкодером, потому что мой подход к работе более комплексный, чем просто «общение с AI».  

Это первая статья из цикла об оборудовании рабочего места SDD-кодера. Я расскажу о базовой настройке AI-агента Claude Code: что делать, если вы хотите оперативно и без перезагрузки переключать используемые модели и делать это для каждого проекта отдельно.

Что такое SDD 

Spec-Driven Development (SDD) — это подход к разработке ПО, при котором весь процесс начинается с формальной спецификации (контракта) интерфейсов, форматов данных или архитектурных правил. Спецификация становится единственным «источником истины» для всех участников проекта. Подход SDD появился в 60-х годах прошлого века в недрах NASA, а в середине нулевых был стандартизован. В цикле статье мы поговорим о формате Spec-Driven Development, который обрел популярность в 2025 году, когда LLM стали активно внедряться в процессы разработки.

Недавно мой коллега написал , как организовать работу над спецификациями, если раньше такого опыта не было вообще. Ему удалось масштабировать процесс на крупный департамент, так что прочитайте, если еще не пишете спеки. Как видите, они могут пригодиться в Spec-Driven Development-методе.

Как собрать рабочее место

Для успешного запуска нам потребуются:

  • Модель, или даже провайдер моделей.

  • Агент, а именно — Claude Code.

  • Claude Code Router для переключения моделей и конвертации протоколов. Ниже я объясню подробнее, в чем польза этого инструмента.

  • Средства управления Claude Code Router, которые мы напишем сами.

  • VSCode в качестве оболочки для агента и интегрированного рабочего места (да, так расшифровывается аббревиатура IDE) с плагином для Claude Code.

Для наших целей еще понадобится подключение к LLM. Инструкций, как это сделать, не будет, но будет совет: посмотрите на OpenCode Go.

Все описанные далее шаги предполагают, что вы оформили подписку на OpenCode Go и у вас в распоряжении доступ к нескольким разным моделям. Впрочем, мономодельных провайдеров почти не осталось.

Настраиваем Claude Code

На самом деле можно выбрать и другой агент. Помимо Claude Code, я пробовал RooCode, OpenCode, KiloCode. Разница между ними не очень велика, но мне проще всего оказалось работать с Claude, пока я не сделал своего агента.

В этом разделе будет первая инструкция: ставим Claude Code без соответствующей подписки. Важно: я работаю на MacOS, и моя инструкция для нее. Инструкция должна подойти и для Linux, а для Windows ее легко адаптировать.

Итак, ставим Claude Code.

Установка описана на странице Quick start. Я решил воспользоваться brew-вариантом: brew install claude-code@latest

После установки запускаем Claude и понимаем, что работает он не очень: свежеустановленный Claude Code требует подписку.

 Давайте полечим его от «жадности». Создадим два файла:

mkdir -vp ~/.claude

 cat <<EOF > ~/.claude/settings.json
 {
 	"env": {
         "ANTHROPIC_DEFAULT_HAIKU_MODEL": "minimax-m2.7",
         "ANTHROPIC_DEFAULT_SONNET_MODEL": "minimax-m2.7",
         "ANTHROPIC_DEFAULT_OPUS_MODEL": "minimax-m2.7",
         "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1",
     	"ANTHROPIC_API_KEY": "sk-nhD9IFHpqhJBd84xbjF0pNMnE7YvNj2pA0qu2lup6X3MqSP4u4rexC12mf7VA9hL",
     	"ANTHROPIC_BASE_URL": "https://opencode.ai/zen/go",
     	"DISABLE_TELEMETRY": "true",
     	"DISABLE_COST_WARNINGS": "true",
     	"CLAUDE_CODE_USE_BEDROCK": "",
     	"API_TIMEOUT_MS": "3000000"
 	},
 	"model": "minimax-m2.7"
 }
 EOF

 cat <<EOF > ~/.claude.json
 {
   "hasCompletedOnboarding": true
 }
 EOF

Обратите внимание на параметр ANTHROPIC_API_KEY в файле ~/.claude/settings.json — туда надо вписать ваш ключ. Тот, что указан в статье, работать не будет — я его уже удалил.

Немного о ключах доступа

Их в конфиге может быть два:

  • Если использовать ANTHROPIC_AUTH_TOKEN, Claude Code отправляет с каждым запросом к модели заголовок Authorization: Bearer. Все бы хорошо, но это OpenAI-совместимый способ аутентификации, и не все провайдеры его поддерживают. OpenCode Go, например, поддерживает его для OpenAI-совместимых точек доступа и не поддерживает для Anthropic-совместимых. Да, все модели доступны на OpenCode Go по двум путям и протоколам. А для Claude Code нам нужна именно Anthropic-совместимая.

  • Если использовать ANTHROPIC_API_KEY, Claude Code отправляет с каждым запросом к модели заголовок X-Api-Key. Это стандарт для Anthropic-совместимых точек доступа, и при указании именно его Claude Code прекрасно работает с OpenCode Go. Все бы хорошо, но некоторые провайдеры, например Z.AI, не поддерживают этот заголовок на Anthropic-совместимых точках доступа. 

Вы должны понять сами, какую переменную указывать. Указать обе не получится — Claude Code будет ругаться.

Теперь запускается! Настроенный Claude Code не требует подписку:

Добавляем Claude Code Router

Вы спросите: «Зачем нам нужен Claude Code Router?» И я отвечу: для двух вещей, одна важней другой:

  • мы хотим подключаться нашим Claude Code к OpenAI-совместимым точкам доступа, и нам нужен конвертер протокола;

  • мы хотим переключать модели на лету, per project.

Как работает Claude Code Router

Claude Code Router (CCR) — это прокси-сервер, который слушает на указанном адресе и порте, принимает запросы по Anthropic-протоколу и направляет их соответствующему провайдеру, при необходимости конвертируя протокол.

Когда мы выполняем команду ccr code, CCR выставляет нужные переменные окружения и запускает Claude как дочерний процесс. Что именно выставляет CCR, можно увидеть, если запустить команду ccr activate:

export ANTHROPIC_AUTH_TOKEN="test"
 export ANTHROPIC_BASE_URL="http://127.0.0.1:3456"
 export NO_PROXY="127.0.0.1"
 export DISABLE_TELEMETRY="true"
 export DISABLE_COST_WARNINGS="true"
 export API_TIMEOUT_MS="600000"
 unset CLAUDE_CODE_USE_BEDROCK

Чтобы проксирование работало, надо держать CCR-сервис запущенным. Запустить его можно командой ccr restart, а посмотреть на его состояние — командой ccr status.

Давайте поставим Claude Code Router (CCR): brew install claude-code-router.

Создаем для CCR конфигурацию:

mkdir -vp ~/.claude-code-router

 cat <<EOF > ~/.claude-code-router/config.json
 {
   "LOG": false,
   "LOG_LEVEL": "debug",
   "HOST": "127.0.0.1",
   "PORT": 3456,
   "API_TIMEOUT_MS": "600000",
   "Providers": [
 	{
   	"name": "opencode",
   	"api_base_url": "https://opencode.ai/zen/go/v1/chat/completions",
   	"api_key": "sk-nhD9IFHpqhJBd84xbjF0pNMnE7YvNj2pA0qu2lup6X3MqSP4u4rexC12mf7VA9hL",
   	"models": [
     	"glm-5.1",
     	"glm-5",
     	"kimi-k2.5",
     	"kimi-k2.6",
     	"mimo-v2-pro",
     	"mimo-v2-omni",
     	"mimo-v2.5-pro",
     	"mimo-v2.5",
     	"minimax-m2.7",
     	"minimax-m2.5",
     	"qwen3.6-plus",
     	"qwen3.5-plus"
   	]
 	}
   ],
   "Router": {
 	"default": "opencode,glm-5.1",
 	"background": "opencode,kimi-k2.5",
 	"think": "opencode,glm-5.1",
 	"longContext": "opencode,mimo-v2-pro",
 	"longContextThreshold": 80000,
 	"webSearch": "opencode,minimax-m2.5"
   },
   "CUSTOM_ROUTER_PATH": "${HOME}/.claude-code-router/routing/custom_router.js"
 }
 EOF

 ccr restart

Пробуем запустить Claude Code через Claude Code Router. Для начала почистим конфиг Claude Code:

cat <<EOF > ~/.claude/settings.json
 {
 	"env": {
         "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
 	}
 }
 EOF

Теперь сам по себе Claude Code работать не сможет, но, если мы запустим его через Claude Code Router, который выставит нужные переменные, все получится.

Claude Code Router обеспечивает аутентификацию.
Claude Code Router обеспечивает аутентификацию.

Пишем управляющие скрипты

Теперь немного уличной магии.

Создаем обертку для настройки заголовков запроса

Нам бы хотелось, чтобы Claude Code использовал ту модель, которую мы указали для конкретного проекта. Для этого мы можем задействовать CCR. Но я внимательно изучил запросы, которые Сlaude Code передает в CCR, и не нашел ни одного признака, по которому CCR мог бы определить, к какому проекту относится конкретный запрос. В запросе есть полные имена файлов, которые добавлены в контекст, но надежным признаком я бы это не назвал.

Поэтому мы создадим shell-обертку, которая будет выставлять нужные переменные и запускать Claude:

mkdir -vp ~/.claude-code-router/routing
 cat << EOF > ~/.claude-code-router/routing/wrapper.sh
 #!/bin/sh -e
 eval "\$(ccr activate)"
 export ANTHROPIC_CUSTOM_HEADERS="X-Project-Path: \$(pwd)
 \$ANTHROPIC_CUSTOM_HEADERS"
 "\$@"
 EOF
 chmod +x ~/.claude-code-router/routing/wrapper.sh

Запускаем: ~/.claude-code-router/routing/wrapper.sh claude

Теперь у запросов, которые доезжают до CCR, есть заголовок X-Project-Path, на него можно ориентироваться.

Скрипт custom_router

И наконец, выбираем модели. В конфиге CCR мы указали CUSTOM_ROUTER_PATH,  он должен указывать на скрипт custom_router.js. Скрипт великоват, чтобы приводить его прямо в тексте статьи, поэтому я положил его отдельным файлом. Обязательно загляните и проверьте, что я вам предложил!

Честно сказать, я не писал этот скрипт, потому что вообще не знаю JS — это не мой профиль работы, я пишу на Go. Я получил готовый скрипт от minimax+kilocode по следующему запросу:

Создай custom_router.js согласно спецификации:

Извлекает x-project-path из заголовка

Пытается открыть ${projectPath}/.claude/model.json

Если файл не загружен:

  • Если директория .claude не существует — возвращает null

  • Если существует — создает model.json со списком моделей из конфига, model = пустая строка

Проверяет актуальность списка моделей:

  • Если список устарел — заменяет на актуальный из конфига

  • Если модель из model.json отсутствует в списке — заменяет на пустую строку

  • Всегда перезаписывает model.json с актуальной информацией

Если model пуста — возвращает null
Возвращает модель

Как ни странно, этого оказалось достаточно, чтобы создать вполне рабочую заготовку. Я минимально отредактировал скрипт, а теперь предлагаю его вам. Короче, поступаю как настоящий вайбкодер…

Теперь у нас есть custom_router.js — маршрутизатор выбора модели на основе проекта. Что он делает:

  • Извлекает x-project-path из заголовков запроса.

  • Читает конфигурацию модели из .claude/model.json в проекте.

  • Если файл отсутствует, создает его со списком доступных моделей из конфига.

  • Если список моделей в конфиге изменился, пересоздает файл, сохраняя параметр model без изменений, включая пустую строку или некорректное значение.

  • Возвращает строку формата provider,model для выбора модели. Если проекта или модели нет, возвращает null для fallback.

Формат model.json:

{
   "model": "provider,model-name",
   "models": ["provider,model1", "provider,model2"]
 }

Логирование ведется только при config.LOG = true, файл ~/.claude-code-router/logs/routing-YYYYMMDD.log.

Добавляем VSCode

VSCode или другой IDE нужен в качестве оболочки для агента. Я пробовал IntelliJ IDEA, OpenIDE, Zed. Для себя остановился на VSCode, но убойных аргументов в его пользу у меня нет. Разберемся, как настроить VSCode. 

Откуда установить VSCode, расскажет поисковик или DuckDuckGo. А я хочу подсветить один момент: скорее всего, нужные плагины для VSCode без VPN или прокси ставиться не будут. Удобно иметь прописанный в настройках VSCode http proxy. Применимы ли мои советы к другой IDE, я не знаю. На первый взгляд, должно подойти, но могут потребоваться доработки. 

Далее надо установить плагин anthropic.claude-code:

Настроить запуск Claude Code через обертку:

Можно пользоваться!

Выбор модели в проекте осуществляется через редактирование файла .claude/model.json, если таковой есть. Желаемую модель надо вписывать в поле model. А чтобы всегда знать, какие модели можно туда вписать, router подготовил для нас поле models, в котором перечислены все модели, определенные в конфиге CCR.

На сегодня все

Мы настроили рабочее место и подключили дешевый провайдер OpenCode Go к агенту Claude Code, а еще научились на лету переключать модели, которые он использует. В следующей статье мы превратим наше рабочее место в станцию Spec-Driven Development-программиста, водрузив поверх сделанного SDD toolkit.

Комментарии (29)


  1. leonidsevelev794
    29.04.2026 12:17

    Честно, выглядит мощно, но местами ощущение, что ты собрал Франкенштейна из кучи инструментов Идея с переключением моделей на лету прям интересная, особенно для разных проектов. Но интересно, не становится ли вся эта обвязка со временем сложнее самого кода, который ты пишешь?


    1. onokonem Автор
      29.04.2026 12:17

      ну пока все довольно просто

      однако - пространство для роста есть :)

      например - научить router отдавать разные модели под разные задачи


    1. beatleboy
      29.04.2026 12:17

      Есть удобные реализации, где в два клика можно собрать мощные комбо модели из различных вариантов с fallback и т.д. Вот хорошая реализация https://github.com/diegosouzapw/OmniRoute, если ты в РФ то ставишь прямо на забугорный сервер и не нужен ни прокси ни впн (если конечно твой провайдер еще не заблочил подсеть забугорного хостинга)


      1. onokonem Автор
        29.04.2026 12:17

        кажется, это все же для другой задачи решение


  1. evgeniy_kudinov
    29.04.2026 12:17

    Я провожу эксперименты с SDD. Процесс идёт неспешно, и я тестирую различные фреймворки в поисках оптимальной методологии. Ваши знания и опыт, а также мнения других специалистов будут думаю полезны.(работаю в emacs doom + opencode)


    1. onokonem Автор
      29.04.2026 12:17

      именно про SDD будет дальше, но будет!

      для начала - про openspec


  1. octoMax
    29.04.2026 12:17

    интересно, жду следующей статьи. но! возможность переключения на разные модели разных производителей это ИМХО прямо вот очень полезно. Я пока "в полуручном" режиме в курсоре делаю - анализ доков - создание спеков - анализ кода против спецификаций - анализ покрытия тестами и так далее. И вот Клод сильно лучше умеет писать бумажки, которые потом можно подсунуть Гугломодели на проверку соответствия коду а потом другой модели на дописывание кода и так далее - такой оркестр дает стабильнее и качественнее результат против одного Клода например


    1. onokonem Автор
      29.04.2026 12:17

      ну проверка результатов деятельности модели на другой модели однозначно лучше, чем на той же самой.


  1. greypo
    29.04.2026 12:17

    Насколько я разбираюсь Claude code -это не агент, а модель


    1. castroy10
      29.04.2026 12:17

      Модели у антропик называются sonnet и opus


      1. masha_kupina
        29.04.2026 12:17

        и самый младший брат - хайку


  1. Silen07
    29.04.2026 12:17

    Рассматривали ли использование open Claude проекта?


    1. onokonem Автор
      29.04.2026 12:17

      если честно - нет. надо пробовать?


  1. werevolff
    29.04.2026 12:17

    Добрый день, коллега. Очень интересная статья. Она вызвала у меня некоторые вопросы. Не могли бы вы ответить на них?

    Вы говорите:

    Подход SDD появился в 60-х годах прошлого века в недрах NASA а в середине нулевых был стандартизован.

    1. Скажите, пожалуйста, чем SDD отличается от водопадной модели (помимо нюанса с участием ИИ для написания кода)?

    2. Есть такая штука: Software Design Document (кстати, получается, тоже SDD). Так вот, она была стандартизирована в 1987 году. Вышел документ Software Design Description IEEE 1016. Мне интересно: этот документ нельзя рассматривать как Spec-Driven стандарт? Почему в ваших источниках используется альтернативная ветка истории? Это разные спецификации и подходы?

    3. История водопадной модели разработки, как концепции, берёт начало в 1956 году, когда Герберт Беннингтон представил фазы разработки ПО для системы SAGE. Фазы включали в себя Operational specs и Program specs. То есть, спецификации (контракты) для функциональной части и для системного дизайна. 4 июня 1985 года армия США принимает стандарт DOD-STD-2167, основанный на фазах Беннингтона, предписывающий исполнение этих фаз для всех подрядчиков, выполняющих оборонзаказы. Соответственно, вопрос: а какие фазы были в NASA? Действительно ли это были параллельные процессы развития сходных концепций, или, всё-таки, речь об одном и том же процессе?

    4. В 1983 году Беннингтон переиздаёт свой доклад с пометкой, что фазы в его процессе не выполнялись сверху вниз. В случае проблем, тупиковых ситуаций, разработчик писал пробный код, проверял гипотезу, и только потом возвращался к предыдущим фазам. Не кажется ли вам, что этот процесс очень похож на ансамбль агентов, которые многократно проверяют гипотезы прежде, чем отдать код?

    Заранее спасибо


    1. onokonem Автор
      29.04.2026 12:17

      1. Отличается созданием машинно-читаемых спецификаций как обязательного атефакта.

      2. Ответить могу только на вопрос "Почему в ваших источниках используется альтернативная ветка истории?" :) Скорее всего потому, что я не читал ни IEEE документов, и не делал исторических изысканий. Мне, все же, ехать, а не шашечки

      3. Честно - не знаю, и не знаю, как узнать.

      4. Вообще - любая достаточно жесткая методология, предполагающая промежуточный финиш в виде ADR-подобных документов, подойдет для обуздания AI-безумия. просто для SDD уже есть тулкиты


      1. werevolff
        29.04.2026 12:17

        Так тулкиты и до ИИ были. Например, OpenAPI Generator умеет писать код клиента по OpenAPI документации. Зачем усложнять разработку, если уже есть готовые решения? Ну, да, они не закрывают все кейсы, но в связке с ИИ могут вполне сэкономить бюджет и дать постоянный результат.


  1. ryba1967
    29.04.2026 12:17

    Claude code работает без vpn? Yadro под блокирующими санкциями США? Оплата подписки личная или платит работа? Мне чудится некий конфликт во всём этом сочетании, но, на самом деле, интересны реалии современного российского IT - как это решается крупными игроками


    1. onokonem Автор
      29.04.2026 12:17

      Claude code работает без vpn?

      Да

      Yadro под блокирующими санкциями США?

      Не знаю :) Мне это ни с какой стороны не важно.

      Оплата подписки личная или платит работа?

      В этой статье я личную подписку использую.

      Но работаю я на рабочей модели, которая внутри контура развернута.


  1. AcckiyGerman
    29.04.2026 12:17

    Если вы хотите запускать конкретные модели для отдельных проектов, не проще ли вместо самописных скриптов использовать Ollama?
    ollama launch claude --model kimi-k2.5:cloud

    Можно запускать локальные и облачные модели.


    1. artemu78
      29.04.2026 12:17

      проще, но потребуется подписка на ollama облачные (их лимиты хорошие, но все же не бесконечные), а для локальных моделей нужна очень дорогая карта


    1. onokonem Автор
      29.04.2026 12:17

      и как переключаться с модели на модель?


  1. artemu78
    29.04.2026 12:17

    Круто! спасибо за claude code router, и спасибо за описание двух типов ключей СС.

    В ~/.claude/settings.json указано подключение к opencode.ai но при наличии локального ccr, кмк должно быть подключение к localhost?


    1. onokonem Автор
      29.04.2026 12:17

      так я там ниже чищу конфиг, и дальше claude ходит туда, куда переменные окружения указывают


  1. Ru6aKa
    29.04.2026 12:17

    На самом деле можно выбрать и другой агент. Помимо Claude Code, я пробовал RooCode, OpenCode, KiloCode. Разница между ними не очень велика, но мне проще всего оказалось работать с Claude, пока я не сделал своего агента.

    Почему выбор пал именно на Claude Code и CCR? Если разница не очень велика то не лучше ли выбрать более подходящий инструмент? OpenCode закрывает вопросы с подключением разных моделей от разных провайдеров, роутингом, персональными настройками для каждого проекта. И если этого всего не хватает, то с помощью oh-my-openagent можно очень сильно прокачать OpenCode.


    1. onokonem Автор
      29.04.2026 12:17

      у меня от opencode - и от других агентов на этом движке - постоянное ощущение некоей разболтанности, и оно бесит

      claude ведет себя по-жестче, и, например, почти никогда не встает посредине задачи, а вот opencode я на этом довольно часто ловлю


  1. Pdasilem
    29.04.2026 12:17

    Есть ещё pi agent опенсорсный и максимально настраиваемый. Имхо, лучший вариант на замену Клод код. И надо его будет не перестраивать, а настраивать )


    1. onokonem Автор
      29.04.2026 12:17

      https://github.com/gsd-build/gsd-2 на нем сделан, да.

      и я подумываю повторить этот опыт для openspec. вдруг станет лучше?..


  1. ShaggyCat2
    29.04.2026 12:17

    Ура, заработал claude с настройками, как в статье и с ключем opencode ессно. Плиз поднимите мне карму, плюсану статью.


    1. onokonem Автор
      29.04.2026 12:17

      мы работаем для вас :)