9.2 KiB
9.2 KiB
📋 Добавлен контекст PR в анализ
✨ Что добавлено
Описание PR теперь передается агенту!
Агент теперь получает полный контекст PR:
- 📝 Название PR
- 📄 Описание PR (body)
- 👤 Автор
- 🔀 Ветки (source → target)
🎯 Зачем это нужно?
Проверка соответствия кода описанию
Теперь агент может найти логические ошибки:
Пример 1: Несоответствие описанию
PR: "Добавление функционала редактирования аватара"
Изменения в коде:
+ 'Content-Type': 'shmapplication/json'
Агент обнаружит:
❌ WARNING - Изменение не связано с редактированием аватара.
В описании PR указано добавление функционала аватара,
но код меняет Content-Type. Это не соответствует описанию.
Пример 2: Удаление функционала
PR: "Добавление валидации email"
Изменения в коде:
- if (validateEmail(email)) {
- return true;
- }
Агент обнаружит:
❌ ERROR - Удаляется валидация email, но в описании PR
указано "Добавление валидации". Это противоречие!
🔍 Как это работает
1. Получение информации о PR
# backend/app/agents/reviewer.py
async def fetch_pr_info(self, state: ReviewState):
pr_info = await git_service.get_pull_request(state["pr_number"])
# Логируем информацию
print("📋 ИНФОРМАЦИЯ О PR")
print(f"Название: {pr_info.title}")
print(f"Описание: {pr_info.description}")
# Сохраняем в state
state["pr_info"] = {
"title": pr_info.title,
"description": pr_info.description,
...
}
2. Передача контекста в промпт
# backend/app/agents/tools.py
async def analyze_diff(..., pr_title: str, pr_description: str):
pr_context = f"""
**КОНТЕКСТ PR:**
Название: {pr_title}
Описание: {pr_description}
ОБЯЗАТЕЛЬНО проверь: соответствует ли код описанию PR!
"""
prompt = DIFF_REVIEW_PROMPT.format(
file_path=file_path,
diff=diff,
pr_context=pr_context # <-- добавили контекст
)
3. AI анализирует с учетом контекста
Промпт теперь содержит:
Ты СТРОГИЙ code reviewer.
**КОНТЕКСТ PR:**
Название: Добавление функционала редактирования аватара
Описание: Реализована возможность загрузки и изменения
пользовательского аватара.
ОБЯЗАТЕЛЬНО проверь: соответствует ли код описанию PR!
Анализируй изменения в файле:
...
📊 Логирование
В терминале backend теперь видно:
📋📋📋📋📋 ИНФОРМАЦИЯ О PR 📋📋📋📋📋
📝 Название: Добавление функционала редактирования аватара
👤 Автор: primakov
🔀 Ветки: feature/avatar → main
📄 Описание:
--------------------------------------------------------------------------------
Реализована возможность:
- Загрузки нового аватара
- Предпросмотра перед сохранением
- Удаления текущего аватара
--------------------------------------------------------------------------------
📋📋📋📋📋📋📋📋📋📋📋📋📋📋📋📋📋📋
...
================================================================================
🔍 АНАЛИЗ ФАЙЛА: src/pages/SearchCharacterPage.tsx
================================================================================
📋 КОНТЕКСТ PR:
--------------------------------------------------------------------------------
Название: Добавление функционала редактирования аватара
Описание: Реализована возможность загрузки и изменения аватара...
--------------------------------------------------------------------------------
📝 DIFF:
+ 'Content-Type': 'shmapplication/json'
🤖 ОТВЕТ AI:
{
"comments": [
{
"line": 58,
"severity": "ERROR",
"message": "Опечатка в Content-Type: 'shmapplication/json'"
},
{
"line": 58,
"severity": "WARNING",
"message": "Изменение не связано с редактированием аватара"
}
]
}
📋 Обновленный промпт
Добавлен новый тип проверки:
❌ НЕСООТВЕТСТВИЕ ОПИСАНИЮ PR:
Описание PR: "Добавление функционала редактирования аватара"
Код: меняет Content-Type на 'shmapplication/json'
// ОШИБКА! не связано с аватарами
ОБЯЗАТЕЛЬНО ПРОВЕРЬ:
1. СООТВЕТСТВИЕ ОПИСАНИЮ PR ⭐ НОВОЕ!
- делает ли код то что написано в описании?
- не удаляется ли то что должно добавляться?
- не добавляется ли то что не упомянуто?
2. Все строки в кавычках - нет ли опечаток?
3. Все скобки - все ли закрыты?
4. Все JSX элементы - правильно ли?
5. React key - на правильном элементе?
🎯 Примеры использования
Сценарий 1: PR с описанием
PR:
Название: Исправление бага с поиском
Описание: Исправлена проблема когда поиск не работал с пустыми строками
Код:
+ if (search === '') {
+ return;
+ }
AI: ✅ Соответствует описанию - добавлена проверка на пустую строку
Сценарий 2: PR без описания
PR:
Название: Рефакторинг
Описание: (пусто)
Код:
+ 'Content-Type': 'shmapplication/json'
AI: ❌ ERROR - Опечатка в Content-Type (не проверяет соответствие описанию, т.к. описания нет)
Сценарий 3: Противоречие
PR:
Название: Добавление логирования
Описание: Добавлены логи для отладки
Код:
- console.log('debug:', data);
- console.error('error:', err);
AI: ❌ WARNING - Удаляются логи, но в описании PR указано "Добавление логирования". Это противоречие!
✅ Преимущества
- Логические ошибки - находит несоответствия между кодом и описанием
- Контекст - AI понимает что ДОЛЖНО быть сделано
- Качество PR - мотивирует писать хорошие описания
- Отладка - видно весь контекст в логах
🧪 Как проверить
-
Создайте PR с описанием:
Название: Добавление валидации формы Описание: Добавлена проверка email и телефона -
Сделайте изменение НЕ связанное с валидацией:
+ const newColor = 'blue'; -
Запустите ревью
-
Смотрите логи backend - видите контекст PR?
-
Проверьте комментарии - AI должна заметить несоответствие!
📝 Измененные файлы
backend/app/agents/reviewer.py- получение и логирование PR infobackend/app/agents/tools.py- передача PR context в промптbackend/app/agents/prompts.py- добавлен PR context в промптbackend/app/services/gitea.py- уже получал description (не изменено)backend/app/services/base.py- PRInfo уже содержал description
🚀 Готово!
Теперь агент понимает контекст PR и может:
- ✅ Проверять соответствие кода описанию
- ✅ Находить логические противоречия
- ✅ Давать более осмысленные комментарии
Все логи видны в терминале backend! 📊