Перейти к содержанию
Публикация AiManual

Девять моделей на код-ревью: как устроить вторую «голову» для проверки изменений и не разориться

Голова это claude -p с подменённым ANTHROPIC_BASE_URL, и провайдеру нужен Anthropic Messages API с tool use, иначе ревьюер судит по диффу вслепую. Разбираем, ка

Коротко

Что будет в материале

  1. 01

    Что такое «голова» и «круг»: вторая модель на ревью перед мержем

  2. 02

    Техническая база: claude -p, ANTHROPIC_BASE_URL и требование к Anthropic Messages API

  3. 03

    Критерии отбора голов: находки против ложных срабатываний, время, стоимость, лимиты

  4. 04

    Девять моделей в роли головы: кто остался и почему

Девять моделей за два месяца побывали ревьюером кода проекта Charoite. Автор пишет его в Claude Code и перед мержем прогоняет каждое изменение через отдельную модель, которую называет «головой». Один прогон головы по изменению это «круг». С 22 сентября набралось 1517 запусков.

Технически голова это claude -p с подменённым ANTHROPIC_BASE_URL: запрос уходит на совместимый эндпоинт другого провайдера. Провайдер обязан поддерживать Anthropic Messages API с tool use. Без этого модель не открывает файлы и судит по диффу вслепую. Автор разобрал хронологию замен и причины отказов.

Дальше: как устроены шкала вердиктов и правило повторного круга, какие требования предъявлять к провайдеру, по каким критериям отбирать головы, почему локальные Qwen сняли за день и вечер, и какие настройки снижают расход.

Что такое «голова» и «круг»: вторая модель на ревью перед мержем

Голова это отдельная модель, которая читает изменение до мержа и выносит вердикт. Круг это один прогон головы по конкретному изменению. Голова стоит в том же потоке, где идёт работа: перед мержем скрипт подаёт ей бриф и доступ к чистому клону репозитория на нужном коммите.

Правило повторного круга экономит время. Круг запускается заново только после Critical. Остальные замечания чинятся тестами в том же PR, и правку по вердикту голова читает снова. Получается два разных цикла: дорогой повторный прогон для блокеров и обычная правка внутри PR для всего остального.

Это конкретная конфигурация одного проекта, не отраслевой стандарт. Порог, шкала и правило повтора выбраны под темп мержа Charoite; в другом проекте они могут отличаться.

Шкала вердиктов: Critical, Important, Minor

Шкала у всех голов одна. Critical означает сценарий отказа: вход или состояние, которые дают неверный результат или падение. Important описывает дефект без такого сценария. Minor это гигиена: именование, лишние ветки, мелочи, которые не блокируют мерж.

Граница между Critical и Important проходит по воспроизводимости. Если ревьюер называет конкретный вход, который ломает код, замечание получает Critical. Если сценарий не складывается, остаётся Important. Minor не запускает ничего: его правят по ходу.

PR #381 про гейты режима правки графа прошёл пять кругов. В исходном коде голова нашла 4 Critical, в правках по первому кругу ещё 2, в правках третьего и четвёртого по одному, на пятом круге ноль. Круги 3 и 4 поймали Critical в одной и той же правке: поиск находил карантин удалённой встречи по префиксу минуты, автор каждый раз чинил найденный случай и не видел соседний. После второго Critical подряд он добавил правило искать готовый механизм в проекте, а не латать точечно.

Почему одной модели недостаточно

Голова читает чистый клон репозитория на нужном коммите, а не только дифф. Контекст вокруг изменённых строк доступен целиком: соседние модули, тесты, конфиги. Человек при просмотре диффа часто этот контекст не поднимает, особенно к концу длинной серии PR.

Второй аргумент это цена пропуска. Автор приводит такую арифметику: четырнадцать PR, четыре из которых пришлось чинить после мержа. Методика подсчёта в опубликованном разборе не раскрыта, поэтому цифра годится как ориентир масштаба, а не как измерение. Смысл в порядке величин: несколько починок на полтора десятка PR.

Голова не ловит всё. Она пропускает ошибки в логике требований, не видит проблем за пределами разрешённых файлов и зависит от качества брифа. Ждать от неё нулевого дефекта не стоит.

Техническая база: claude -p, ANTHROPIC_BASE_URL и требование к Anthropic Messages API

Голова запускается как claude -p с подменённым ANTHROPIC_BASE_URL. Переменная указывает на эндпоинт другого провайдера, и весь обмен идёт через него.

ANTHROPIC_BASE_URL=<эндпоинт-провайдера> claude -p "бриф и путь к клону"

Почему OpenAI-совместимого эндпоинта недостаточно

Совместимость бывает разной. Провайдер может отдавать OpenAI-совместимый chat completions и при этом не поддерживать Anthropic Messages API. Для головы этого мало.

Нужен именно Anthropic Messages API с tool use: модель должна вызывать инструменты и получать их результат в диалоге. Без tool use она не откроет файл, не поищет по репозиторию и не построит список файлов. Останется судить по диффу, а это худший режим ревью. В разборе это требование названо главным фильтром при выборе провайдера.

Практический вывод: проверять tool use до оплаты и до подключения. Один тестовый вызов с Read и Grep покажет больше, чем таблица с ценами за миллион токенов.

Read-only инструменты и чистый клон: как голова видит код

Голове разрешены только Read, Glob, Grep. Записи нет, поэтому испортить репозиторий или тесты она не может. Читает она чистый клон на нужном коммите, бриф приходит на вход, вердикт уходит в файл.

Скрипт перед запуском сверяет три вещи: бриф, список разрешённых файлов и коммит клона. Если клон стоит не на том коммите, вердикт будет про другой код, и это хуже пропуска.

Один скрипт на все круги: параллельный запуск и перезапуск упавших голов

Все круги идут через один скрипт. Он запускает головы параллельно и ждёт всех. Пустой или оборванный вердикт чистым не считается. Голова, которая молча упала, уходит на перезапуск.

Параллельность нужна при двух и более головах: последовательный запуск удваивает время до мержа. Ожидание всех голов не даёт принять вердикт одной за общий результат.

Критерии отбора голов: находки против ложных срабатываний, время, стоимость, лимиты

Входной фильтр один: провайдер с Anthropic Messages API и tool use. Дальше голову оценивают по четырём осям.

КритерийЧто считатьКак проявляется в практике
Находки против шумадоля ложных Critical, среднее число замечаний на круглокальная Qwen 3.6 35B выдала четыре ложных Critical и Important за день
Время кругавремя от запуска до вердиктаQwen 3.8 27B провисела 40 минут без вердикта
Стоимость прогонацена одного круга, а не токенакруг читает много файлов, поэтому длина контекста важнее прайса
Лимиты и отказы402, 503, квоты, пятичасовые окнаGemini 3.7 Flash выпала из кругов из-за квоты и 503

Ложный Critical дороже пропуска: как считать шум головы

Ложный Critical останавливает мерж и запускает новый круг. Дальше арифметика простая: каждый ложный блокер оплачивается временем и деньгами, а доверие к голове падает. Её вердикты начинают проверять руками, и автоматизация теряет смысл.

Считать стоит две величины: долю ложных срабатываний среди Critical и число Critical на круг. Первая показывает надёжность, вторая показывает склонность к шуму. Модель, которая находит много и ошибается в половине случаев, проигрывает скучной и точной.

История с локальной Qwen 3.6 35B это иллюстрирует: четыре ложных Critical и Important за день, и 22 августа голову сняли. Пропуск тоже имеет цену: четырнадцать PR, четыре починки. Сравнение двух величин и даёт ответ, стоит ли держать конкретную голову.

Время круга и стоимость: что реально ограничивает процесс

Время круга складывается из чтения файлов и генерации вердикта. Голова с tool use делает несколько вызовов инструментов, поэтому минуты уходят на обход репозитория, а не только на ответ модели. Верхняя граница из практики: Qwen 3.8 27B заняла 15,6 ГБ и провисела 40 минут без вердикта.

Стоимость считайте на прогон. Круг читает десятки файлов, и счёт растёт от длины контекста, а не от цены за миллион токенов в прайсе. Формула простая: токены одного круга умножить на цену провайдера и на число кругов на PR. Конкретных цифр стоимости в опубликованном разборе нет, так что считать придётся по своему счёту.

Лимиты и отказы: 402, 503, квоты и пятичасовые окна

Отказы это штатный режим работы. DeepSeek V4 на старте получила 402, автор пополнил счёт, и модель осталась в составе. Gemini 3.7 Flash была быстрой на бесплатном тарифе, но упёрлась в квоту и 503, и с 22 августа в кругах её нет. GLM-5.3 (Z.ai) встала в лимит пятичасового окна и в сентябре вернулась через Fireworks.

Codex ушёл в лимит 16-22 августа, потом вернулся, а к 24 сентября в составе его нет. Один отказ не приговор: важно, сколько времени процесс стоит без головы. Если вы пробуете бесплатные тарифы, пригодится разбор шести сервисов с бесплатным доступом к LLM через API: там разобраны лимиты, ошибки 502/503/504 и способы проверить, какая модель отвечает на самом деле.

Девять моделей в роли головы: кто остался и почему

Хроника состава по датам из разбора.

ДатаГоловаРоль и мотивЧто вышло
до 16.08Codexподписка ChatGPT уже былалимит 16-22.08, потом вернулся; к 24.09 в составе нет
16.08GLM-5.3, Z.aiзамена Codex, Anthropic-эндпоинтлимит пятичасового окна; в сентябре вернулась через Fireworks
16.08DeepSeek V4Anthropic-эндпоинт402 на старте, счёт пополнили; осталась
16.08Gemini 3.7 Flashбыстрая, бесплатный тарифквота и 503, с 22.08 в кругах нет
19.08Qwen 3.6 35B локальнозакрытый код, без лимитовчетыре ложных Critical и Important за день, снята 22.08
22.08Sonnet 5закрытые зоны, третья на публичномс 24.09 пара с DeepSeek
26.08Qwen 3.8 27B локальнозамена 3.615,6 ГБ и 40 минут без вердикта, снята тем же вечером
22.09MiMo-Pro, OpenRouterещё одна голова в наборесудьба после 22.09 в разборе не раскрыта
без датыOpusв составедеталей в разборе меньше всего

Codex, GLM-5.3 и DeepSeek V4: первые головы и уроки лимитов

Codex был первой головой до 16 августа и работал на уже имевшейся подписке ChatGPT. Дешёвый старт без отдельного счёта, но лимит 16-22 августа показал уязвимость: подписка не гарантирует доступность в момент мержа.

GLM-5.3 от Z.ai пришла 16 августа как замена на Anthropic-эндпоинте и упёрлась в лимит пятичасового окна. В сентябре она вернулась через Fireworks. DeepSeek V4 тоже пришла 16 августа на Anthropic-эндпоинте: на старте 402, после пополнения счёта осталась в составе, а с 24 сентября работает в паре с Sonnet 5.

Вывод из трёх историй: лимиты планируются заранее. Нужен план Б на случай квоты и понятный порядок возврата модели через другого посредника.

Gemini 3.7 Flash: скорость против квоты

Быстрая и бесплатная на старте, она упёрлась в квоту и 503, и с 22 августа в кругах её нет. Бесплатный тариф не гарантирует доступность в момент мержа. Для ревью это критично: круг запускают перед закрытием PR, а не когда удобно провайдеру.

Sonnet 5, Opus и Haiku: закрытые зоны и перепроверка вердиктов

Sonnet 5 пришла 22 августа для закрытых зон, на публичном контуре была третьей, а с 24 сентября работает в паре с DeepSeek. Вердикты Sonnet дополнительно перечитывает Haiku: вторая модель проверяет формулировки и отсекает сомнительные Critical. Логика простая: дорогая голова нужна там, где ошибка дороже прогона, а не на каждом изменении.

Opus входит в состав голов, деталей по ней в разборе меньше всего. Про линейку Anthropic и режимы Claude Code полезен отдельный материал о Claude Opus 5.5.

MiMo-Pro и посредники: Fireworks, OpenRouter, Nebius

MiMo-Pro появилась в составе 22 сентября через OpenRouter. Посредников автор перебрал три: Fireworks, OpenRouter, Nebius. Критерий тот же, что и у прямых провайдеров: Anthropic Messages API с tool use. Цена вторична, потому что без tool use голова слепа.

Про саму модель есть разбор MiMo-V2.6-Pro и Flash: высокие баллы на бенчмарках и обход песочницы через git-команды. Для ревьюера такие повадки стоит проверять отдельно.

Хроника в разборе обрывается на 22 сентября, поэтому дальнейшая судьба MiMo, Opus и итоговый состав голов не раскрыты. Состав голов это живая конфигурация: за два месяца через роль прошли девять моделей и три посредника.

Почему локальные Qwen не прошли боевой аудит при чистом бенче на дельте

Локальная голова обещает главное: закрытый код не уходит наружу и лимитов нет. Qwen 3.6 35B поставили именно ради этого 19 августа. За день набралось четыре ложных Critical и Important, и 22 августа голову сняли.

Qwen 3.8 27B пришла 26 августа на замену. Она заняла 15,6 ГБ и провисела 40 минут без вердикта, её сняли тем же вечером.

Что показал бенч на дельте и чего он не показал

В опубликованном разборе нет деталей методики бенча на дельте, поэтому сравнивать можно только по признакам, которые видны в бою. Бенч на дельте проверяет одно: качество суждения по готовому фрагменту изменений. Боевой круг проверяет другое: умеет ли модель вызывать Read, Glob и Grep, держит ли шкалу Critical/Important/Minor, не теряет ли контекст на длинном обходе репозитория, укладывается ли в таймаут.

Высокий результат на дельте об этих вещах не говорит ничего. Модель может точно находить дефекты в коротком фрагменте и выдавать ложные Critical, когда видит весь репозиторий и пытается связать несвязанное.

Ресурсы и таймауты: 15,6 ГБ и 40 минут без вердикта

Локальный запуск упирается в железо и время. 15,6 ГБ под модель 27B и 40 минут без вердикта это практическая верхняя граница терпения: PR ждёт, человек ждёт, конвейер стоит.

Отсюда два требования. Первое: жёсткий таймаут на круг. Второе: план Б, если локальная голова не ответила, например облачная пара на этот запуск. Сравнить локальные варианты по скорости и качеству помогает материал о DeepSeek V4 Flash и Qwen 3.6 27B в coding-сценариях.

Вывод в том, что конкретные конфигурации не прошли критерии: одна по шуму, другая по времени. Локальные модели в принципе годятся, но проверять их нужно на боевых кругах, а не только на дельте. При другом железе, кванте и таймаутах результат может отличаться.

Как не разориться: две головы от разных провайдеров, кэш промпта, таймауты и сон машины

Две головы от разных провайдеров как страховка от лимитов

Пара Sonnet 5 и DeepSeek V4 с 24 сентября это пример страховки. Две головы от разных провайдеров закрывают лимиты: если одна упёрлась в квоту или отдала 503, вторая доработает круг.

Условие: провайдеры должны быть разными. Две модели у одного посредника падают вместе с ним, а 402 и 503 приходят на весь аккаунт.

Скрипт запускает головы параллельно и ждёт всех, а пустой или оборванный вердикт чистым не считает. Так пропуск из-за упавшей головы превращается в перезапуск, а не в тихий мерж без ревью.

Проверка кэша промпта замером, а не на глаз

Кэш промпта проверяется замером. Возьмите два прогона на одном и том же изменении: первый с холодным кэшем, второй сразу после него. Сравните счётчики использования в ответах провайдера и сумму в счёте. Если второй круг дешевле, кэш работает. Если разницы нет, промпт собирается заново каждый раз, и экономии не будет.

Замер важен потому, что кэш зависит от стабильности префикса. Бриф, шкала и системная инструкция должны идти в неизменном виде, а меняющийся дифф в конец промпта. Иначе каждый круг создаёт новую запись в кэше. Конкретных процентов экономии в разборе нет, поэтому ориентируйтесь на свои счётчики.

Таймауты и сон машины: почему круг обрывается

Таймаут обязателен. Пример: 40 минут без вердикта у Qwen 3.8 27B. Ждать бесконечно нельзя, круг нужно обрывать и отправлять на перезапуск или к другой голове.

Сон машины обрывает круг. Если хост засыпает, процесс умирает, вердикт приходит пустым или оборванным, а такой результат чистым не считается и уходит на перезапуск. Настройте питание так, чтобы машина не засыпала на время круга, или держите головы на постоянно включённом хосте.

Цена пропущенного ревью: четырнадцать PR, четыре пришлось чинить

Автор приводит такую арифметику: на четырнадцать PR четыре пришлось чинить после мержа. Методика подсчёта в опубликованном разборе не раскрыта, поэтому речь об ориентире, а не о замере.

Сопоставьте это с ценой ложного Critical: он блокирует мерж и тратит круг. Обе величины реальны, и обе оплачиваются либо временем, либо деньгами. Процесс окупается тем, что дорогие ошибки ловятся до мержа, а шум ограничен шкалой и правилом повтора только после Critical.

Порог терпимости каждый выбирает сам. Если мерж стоит дорого, лишний круг дешевле починки. Если PR мелкие и частые, шумная голова обойдётся дороже пропуска.

Чек-лист: как собрать свою вторую голову

  1. Выберите провайдера с Anthropic Messages API и tool use. Проверьте Read и Grep тестовым вызовом до оплаты.
  2. Настройте claude -p с подменённым ANTHROPIC_BASE_URL.
  3. Дайте голове только Read, Glob и Grep и чистый клон на нужном коммите.
  4. Зафиксируйте шкалу Critical/Important/Minor и правило повтора круга только после Critical.
  5. Поставьте две головы от разных провайдеров, чтобы квота или 503 не останавливали мерж.
  6. Задайте таймаут на круг и запретите сон машины на время работы.
  7. Проверяйте кэш промпта замером: два прогона на одном изменении и сравнение счётчиков.
  8. Считайте долю ложных Critical, среднее число замечаний на круг и время круга. Цена токена без этих величин не даёт ответа.

Состав голов зависит от бюджета, закрытости кода и допустимого времени мержа. Конфигурация автора Charoite собрана под его темп: девять моделей, три посредника и 1517 запусков с 22 сентября. Полная хроника с датами и оговорками поможет сверить детали, если будете повторять схему.

Подписаться на канал