11 KiB
11 KiB
План создания AI агента-ревьювера
Обзор проекта
AI агент-ревьювер для автоматического анализа Pull Request с поддержкой Gitea, GitHub и Bitbucket. Работает на LangChain/LangGraph с Ollama.
Архитектура
platform/review/
├── backend/
│ ├── app/
│ │ ├── __init__.py
│ │ ├── main.py # FastAPI приложение
│ │ ├── config.py # Конфигурация
│ │ ├── database.py # Database setup
│ │ ├── models/ # SQLAlchemy модели
│ │ │ ├── __init__.py
│ │ │ ├── repository.py
│ │ │ ├── pull_request.py
│ │ │ ├── review.py
│ │ │ └── comment.py
│ │ ├── schemas/ # Pydantic схемы
│ │ │ ├── __init__.py
│ │ │ ├── repository.py
│ │ │ ├── review.py
│ │ │ └── webhook.py
│ │ ├── agents/ # LangGraph агенты
│ │ │ ├── __init__.py
│ │ │ ├── reviewer.py # Основной агент-ревьювер
│ │ │ ├── tools.py # Инструменты агента
│ │ │ └── prompts.py # Промпты для агента
│ │ ├── services/ # Сервисы интеграций
│ │ │ ├── __init__.py
│ │ │ ├── base.py # Базовый класс
│ │ │ ├── gitea.py # Gitea API
│ │ │ ├── github.py # GitHub API
│ │ │ └── bitbucket.py # Bitbucket API
│ │ ├── webhooks/ # Webhook обработчики
│ │ │ ├── __init__.py
│ │ │ ├── gitea.py
│ │ │ ├── github.py
│ │ │ └── bitbucket.py
│ │ └── api/ # API endpoints
│ │ ├── __init__.py
│ │ ├── repositories.py
│ │ ├── reviews.py
│ │ └── webhooks.py
│ ├── requirements.txt
│ └── .env.example
├── frontend/
│ ├── src/
│ │ ├── App.tsx
│ │ ├── main.tsx
│ │ ├── api/
│ │ │ ├── client.ts
│ │ │ └── websocket.ts
│ │ ├── components/
│ │ │ ├── RepositoryForm.tsx
│ │ │ ├── RepositoryList.tsx
│ │ │ ├── ReviewProgress.tsx
│ │ │ ├── ReviewList.tsx
│ │ │ ├── CommentsList.tsx
│ │ │ └── WebSocketStatus.tsx
│ │ ├── pages/
│ │ │ ├── Dashboard.tsx
│ │ │ ├── Repositories.tsx
│ │ │ ├── Reviews.tsx
│ │ │ └── ReviewDetail.tsx
│ │ └── types/
│ │ └── index.ts
│ ├── package.json
│ ├── vite.config.ts
│ ├── tsconfig.json
│ └── index.html
├── cloud.md # Этот файл
└── README.md
Технологический стек
Backend
- FastAPI - веб-фреймворк
- LangChain/LangGraph - фреймворк для AI агента
- Ollama - локальная LLM (модель codellama)
- SQLAlchemy - ORM
- SQLite - база данных
- WebSockets - real-time обновления
- httpx - HTTP клиент для API запросов
Frontend
- React 18 - UI библиотека
- TypeScript - типизация
- Vite - сборщик
- TanStack Query - управление состоянием сервера
- WebSocket API - real-time обновления
- Tailwind CSS - стилизация
Детальный план реализации
1. Backend: Модели данных (SQLAlchemy)
Repository
- id: int (PK)
- name: str
- platform: enum (gitea, github, bitbucket)
- url: str
- api_token: str (encrypted)
- webhook_secret: str
- config: JSON (настройки ревью)
- is_active: bool
- created_at: datetime
PullRequest
- id: int (PK)
- repository_id: int (FK)
- pr_number: int
- title: str
- author: str
- source_branch: str
- target_branch: str
- status: enum (open, reviewing, reviewed, closed)
- url: str
- created_at: datetime
- updated_at: datetime
Review
- id: int (PK)
- pull_request_id: int (FK)
- status: enum (pending, analyzing, commenting, completed, failed)
- started_at: datetime
- completed_at: datetime
- files_analyzed: int
- comments_generated: int
- error_message: str (nullable)
Comment
- id: int (PK)
- review_id: int (FK)
- file_path: str
- line_number: int
- content: str
- severity: enum (info, warning, error)
- posted: bool
- posted_at: datetime (nullable)
2. LangGraph агент-ревьювер
Граф состояний:
START → fetch_pr_info → fetch_changed_files → analyze_files → generate_comments → post_comments → END
↓
(параллельный анализ файлов)
Узлы графа:
- fetch_pr_info - получение информации о PR
- fetch_changed_files - получение списка измененных файлов
- analyze_files - анализ каждого файла через Ollama
- generate_comments - генерация комментариев
- post_comments - отправка комментариев в PR
Промпты для Ollama:
Системный промпт: "Ты опытный code reviewer. Анализируй код на:
- Потенциальные баги
- Проблемы безопасности
- Нарушения best practices
- Проблемы производительности
- Читаемость кода"
3. API интеграции (приоритет - Gitea)
Gitea API endpoints:
GET /repos/{owner}/{repo}/pulls/{index}- информация о PRGET /repos/{owner}/{repo}/pulls/{index}/files- измененные файлыGET /repos/{owner}/{repo}/pulls/{index}/commits- коммитыPOST /repos/{owner}/{repo}/pulls/{index}/reviews- создание ревьюPOST /repos/{owner}/{repo}/pulls/comments- добавление комментария
GitHub API - аналогичные endpoints через REST API v3 Bitbucket API - через REST API 2.0
4. Webhook обработчики
Gitea webhook payload:
{
"action": "opened" | "synchronized",
"pull_request": {
"id": 123,
"number": 42,
"title": "Fix bug",
...
}
}
Обработка:
- Валидация webhook secret
- Проверка, что репозиторий отслеживается
- Запуск LangGraph агента асинхронно
- Отправка WebSocket уведомлений
5. REST API endpoints
Repositories:
GET /api/repositories- список репозиториевPOST /api/repositories- добавить репозиторийPUT /api/repositories/{id}- обновить репозиторийDELETE /api/repositories/{id}- удалить репозиторийGET /api/repositories/{id}/webhook-url- получить webhook URL
Reviews:
GET /api/reviews- список ревью (с фильтрами)GET /api/reviews/{id}- детали ревьюGET /api/reviews/{id}/comments- комментарии ревьюPOST /api/reviews/{id}/retry- повторить ревью
Stats:
GET /api/stats/dashboard- статистика для дашборда
6. WebSocket
Endpoint: ws://localhost:8000/ws/reviews
События:
{
"type": "review_started",
"review_id": 123,
"pr_id": 42
}
{
"type": "review_progress",
"review_id": 123,
"status": "analyzing",
"files_processed": 3,
"total_files": 10
}
{
"type": "review_completed",
"review_id": 123,
"comments_count": 5
}
7. Frontend: Страницы
Dashboard (/)
- Статистика: всего ревью, активных PR, комментариев
- График активности
- Последние ревью
Repositories (/repositories)
- Таблица репозиториев
- Кнопка "Add Repository"
- Webhook URL для каждого
- Статус (active/inactive)
Reviews (/reviews)
- Таблица всех ревью
- Фильтры: по репозиторию, статусу, дате
- Ссылки на детали
Review Detail (/reviews/:id)
- Информация о PR
- Прогресс бар
- Список сгенерированных комментариев
- Real-time обновления
8. Конфигурация
Backend (.env):
# Ollama
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=codellama
# Database
DATABASE_URL=sqlite:///./review.db
# Security
SECRET_KEY=your-secret-key-here
WEBHOOK_SECRET=your-webhook-secret
# Server
HOST=0.0.0.0
PORT=8000
Frontend (.env):
VITE_API_URL=http://localhost:8000
VITE_WS_URL=ws://localhost:8000
9. Развертывание
Требования:
- Python 3.11+
- Node.js 18+
- Ollama установлен и запущен
Запуск Backend:
cd backend
pip install -r requirements.txt
uvicorn app.main:app --reload
Запуск Frontend:
cd frontend
npm install
npm run dev
Настройка Ollama:
ollama pull codellama
ollama serve
10. Безопасность
- API токены храним зашифрованными (Fernet)
- Webhook secret для валидации запросов
- CORS настроен только для frontend домена
- Rate limiting на webhook endpoints
- Валидация всех входных данных
Этапы разработки
- ✅ Создание структуры проекта
- ⏳ Backend: Модели и база данных
- ⏳ Backend: LangGraph агент
- ⏳ Backend: Интеграции с Git платформами
- ⏳ Backend: Webhook обработчики
- ⏳ Backend: REST API
- ⏳ Backend: WebSocket
- ⏳ Frontend: Базовая структура
- ⏳ Frontend: Компоненты и страницы
- ⏳ Frontend: Интеграция с Backend
- ⏳ Тестирование
- ⏳ Документация
Примечания
- Gitea имеет приоритет в разработке
- Агент работает в одном экземпляре (можно масштабировать через очереди позже)
- Real-time обновления через WebSocket для UX
- Модульная архитектура для легкого добавления новых платформ