惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
Stack Overflow Blog
Stack Overflow Blog
L
LINUX DO - 最新话题
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
Spread Privacy
Spread Privacy
www.infosecurity-magazine.com
www.infosecurity-magazine.com
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
S
Schneier on Security
B
Blog
The Register - Security
The Register - Security
SecWiki News
SecWiki News
Hacker News: Ask HN
Hacker News: Ask HN
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security Affairs
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
T
Tenable Blog
P
Proofpoint News Feed
Apple Machine Learning Research
Apple Machine Learning Research
D
DataBreaches.Net
S
Secure Thoughts
Security Latest
Security Latest
H
Heimdal Security Blog
The Hacker News
The Hacker News
O
OpenAI News
AWS News Blog
AWS News Blog
量子位
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
腾讯CDC
U
Unit 42
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
T
The Exploit Database - CXSecurity.com
NISL@THU
NISL@THU
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hugging Face - Blog
Hugging Face - Blog
The Last Watchdog
The Last Watchdog
Recorded Future
Recorded Future
V2EX - 技术
V2EX - 技术
爱范儿
爱范儿
F
Full Disclosure

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Рабочее место не-вайбкодера по методу Spec-Driven Development: запускаем Claude Code
onokonem (YA · 2026-04-29 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение8 мин

Охват и читатели352

Туториал

Привет, Хабр! Меня зовут Даниил Подольский, я программист и архитектор, разрабатываю программное обеспечение и спецификации для создания ПО в 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.