У нас была проблема: code review стал бутылочным горлышком. Один-два старших разработчика, очередь из PR, ревью идёт по 2-3 дня. Мелкие замечания — опечатки, нарушения стиля, забытые console.log — занимали то же время что и архитектурные вопросы.
Решили подключить AI для первого прохода. Не вместо ревьюеров, а чтобы они тратили время на смысл, а не на синтаксис.
Вот как это выглядит сейчас и как мы это настроили.
Что делает AI в нашем процессе
AI ревьюер запускается автоматически на каждый PR. Он проверяет:
- Стиль и соглашения по коду (ESLint/Pylint правила, но с объяснением)
- Очевидные баги: off-by-one, null reference, необработанные ошибки
- Безопасность: hardcoded secrets, SQL injection риски, небезопасный ввод
- Читаемость: сложные функции, магические числа, неинформативные имена
- Тесты: покрыт ли новый код тестами
Что он не делает: не оценивает архитектурные решения, не знает бизнес-контекст, не принимает финальное решение об апрув/реджект. Это остаётся за людьми.
Результат: 40% мелких замечаний теперь закрывается до того как живой ревьюер смотрит PR. Ревью в среднем сократилось с 3 дней до 1.
Как работает интеграция
Схема простая:
- Открыт PR → GitHub Actions запускает скрипт
- Скрипт берёт diff PR через GitHub API
- Передаёт diff в Claude API с инструкциями ревьюера
- Ответ Claude постится как комментарий к PR
Всё это работает через GitHub Actions — бесплатно для публичных репо и в лимитах бесплатного тарифа для приватных.
Настройка: шаг за шагом
Шаг 1: API ключи в секретах GitHub
Идём в Settings → Secrets and variables → Actions:
ANTHROPIC_API_KEY— ключ от Claude APIGITHUB_TOKEN— уже есть по умолчанию в Actions
Шаг 2: Скрипт ревью
Создаём scripts/ai_review.py:
import os
import sys
import json
import requests
import anthropic
GITHUB_TOKEN = os.environ["GITHUB_TOKEN"]
ANTHROPIC_API_KEY = os.environ["ANTHROPIC_API_KEY"]
REPO = os.environ["GITHUB_REPOSITORY"]
PR_NUMBER = os.environ["PR_NUMBER"]
def get_pr_diff() -> str:
"""Получаем diff PR через GitHub API."""
url = f"https://api.github.com/repos/{REPO}/pulls/{PR_NUMBER}"
headers = {
"Authorization": f"token {GITHUB_TOKEN}",
"Accept": "application/vnd.github.v3.diff"
}
response = requests.get(url, headers=headers)
response.raise_for_status()
return response.text
def review_with_claude(diff: str) -> str:
"""Отправляем diff в Claude и получаем ревью."""
client = anthropic.Anthropic(api_key=ANTHROPIC_API_KEY)
# Обрезаем diff если он слишком большой
if len(diff) > 50000:
diff = diff[:50000] + "\n...[diff truncated]"
message = client.messages.create(
model="claude-3-5-haiku-20241022", # Haiku — быстро и дёшево для ревью
max_tokens=2000,
messages=[{
"role": "user",
"content": f"""Ты — опытный разработчик, делаешь code review.
Проверь следующий diff и найди:
1. Потенциальные баги и ошибки
2. Проблемы безопасности (hardcoded secrets, SQL injection, небезопасный ввод)
3. Нарушения читаемости (неинформативные имена, магические числа, сложные функции)
4. Отсутствующие тесты для нового кода
5. Нарушения общих best practices
Формат ответа:
- Если нашёл проблемы: список конкретных замечаний с указанием файла и строки
- Если всё хорошо: короткое "LGTM" с одним предложением о том что хорошо
- В конце: краткое резюме
Будь конкретным. Не выдумывай проблемы, которых нет. Если не уверен — не пиши.
Diff:
{diff}"""
}]
)
return message.content[0].text
def post_review_comment(review: str) -> None:
"""Постим ревью как комментарий к PR."""
url = f"https://api.github.com/repos/{REPO}/issues/{PR_NUMBER}/comments"
headers = {
"Authorization": f"token {GITHUB_TOKEN}",
"Accept": "application/vnd.github.v3+json"
}
body = f"## 🤖 AI Code Review\n\n{review}\n\n---\n*Автоматическое ревью — не заменяет ревью человека*"
response = requests.post(url, headers=headers, json={"body": body})
response.raise_for_status()
print(f"Комментарий добавлен: {response.json()['html_url']}")
if __name__ == "__main__":
diff = get_pr_diff()
if not diff.strip():
print("Diff пустой, пропускаем")
sys.exit(0)
review = review_with_claude(diff)
post_review_comment(review)Шаг 3: GitHub Actions воркфлоу
Создаём .github/workflows/ai-review.yml:
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
# Не запускаем ревью на PR от ботов
if: github.actor != 'dependabot[bot]'
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: pip install anthropic requests
- name: Run AI review
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GITHUB_REPOSITORY: ${{ github.repository }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: python scripts/ai_review.pyГотово. Пушим, открываем тестовый PR — через 30-60 секунд появится комментарий от AI.
Сколько это стоит
Claude Haiku — самая дешёвая модель Anthropic. Цены актуальные на апрель 2026:
- Input: $0.80 за 1M токенов
- Output: $4.00 за 1M токенов
Средний diff для одного PR — 3-5k токенов. Ревью — ещё 1-2k токенов.
При 50 PR в месяц — выходит меньше $2. Для команды это несущественно.
Инфо
Можно использовать claude-3-5-sonnet для более глубокого анализа (~в 5-10 раз дороже) или claude-3-haiku для максимальной экономии. Для большинства задач ревью Haiku достаточно.
Тонкая настройка под проект
Промпт выше — базовый. Его нужно адаптировать под ваш стек:
Python/Django проект:
Обращай особое внимание на:
- ORM-запросы (N+1 проблема, select_related/prefetch_related)
- Django security: CSRF, XSS, SQL injection через ORM
- Правила PEP 8 и type hints
TypeScript/React:
Проверяй:
- TypeScript типы: any, as, ! (non-null assertion) без причины
- React: лишние рендеры, забытые useCallback/useMemo
- Асинхронность: необработанные промисы, race conditions
Размер diff: Если PR большой (10+ файлов), лучше ревьюить файлы по одному или разбить PR. AI теряет контекст на очень больших диффах.
Что мы заметили после месяца
Честно — были и минусы.
Плюсы:
- Мелкие замечания закрываются ещё до ревью человека
- Junior-разработчики получают фидбэк быстрее и учатся
- Ревьюеры фокусируются на архитектуре, не на синтаксисе
Минусы:
- Иногда AI галлюцинирует несуществующие проблемы — особенно если diff неоднозначный
- Разработчики иногда игнорируют комментарии AI как «просто бот» — помогает если явно сказать в команде «AI ревью обязателен перед запросом человека»
- На рефакторинговых PR с большим diff качество падает
Итого: не серебряная пуля, но реальная экономия времени. Стоит попробовать — настраивается за полдня.
Если хотите автоматизировать больше процессов с AI — смотрите гайд по n8n AI агентам для бизнес-процессов. Или Make.com для тех, кто без кода.



