Документация по REST API CodeGraph¶
Полная документация по серверу REST API CodeGraph.
Содержание¶
- Обзор
- Быстрый старт
- 1. Установка зависимостей
- 2. Настройка окружения
- 3. Инициализация базы данных
- 4. Создание администратора
- 5. Запуск сервера
- Переменные окружения
- Обязательные
- Настройки сервера
- Аутентификация
- Поставщики OAuth2
- LDAP/Active Directory
- Ограничение частоты запросов
- Демонстрационная конечная точка
- Аутентификация
- Аутентификация по JWT-токену
- Аутентификация по API-ключу
- Аутентификация через OAuth2
- Аутентификация через LDAP
- Конечные точки API
- Демо (публичный — без аутентификации)
- Чат
- Сценарии
- Доступные сценарии (всего 21)
- Рецензирование кода
- Сессии
- История
- Запрос (SQL)
- Импорт проекта
- Группы
- Проекты
- Статистика
- Состояние сервиса
- Редактирование файлов (S17)
- Оптимизация кода (S18)
- Проверка стандартов (S19)
- Зависимости (S20)
- Композиция
- Генерация документации
- Операции со структурными шаблонами
- Операции GoCPG
- Конечные точки WebSocket
- /ws/chat
- /ws/jobs/{job_id}
- /ws/notifications
- Ограничение частоты запросов
- Заголовки ограничения частоты
- Использование Redis для ограничения частоты
- Роли RBAC
- Настройка базы данных
- Подключение к PostgreSQL
- Миграции Alembic
- Схема базы данных
- Команды CLI
- Примеры использования (curl)
- Демонстрационная конечная точка (без аутентификации)
- Вход в систему
- Чат с JWT
- Просмотр списка сценариев
- Создание API-ключа
- Использование API-ключа
- Рецензирование изменений
- Ответы с ошибками
- Связанная документация
Обзор¶
- Фреймворк: FastAPI
- Базовый URL:
http://localhost:8000/api/v1 - Документация OpenAPI:
/docs(Swagger UI),/redoc(ReDoc) - Аутентификация: JWT-токены, API-ключи, OAuth2, LDAP
Быстрый старт¶
1. Установка зависимостей¶
pip install -r requirements.txt
2. Настройка окружения¶
Создайте файл .env (см. Переменные окружения):
cp .env.example .env
# Отредактируйте .env под свои настройки {#edit-env-with-your-settings}
3. Инициализация базы данных¶
# Создание таблиц {#create-tables}
python -m src.api.cli init-db
# Выполнение миграций {#run-migrations}
python -m src.api.cli migrate
4. Создание администратора¶
python -m src.api.cli create-admin --username admin --password ваш-надёжный-пароль
5. Запуск сервера¶
python -m src.api.cli run --host 0.0.0.0 --port 8000
Переменные окружения¶
Обязательные¶
| Переменная | Описание | По умолчанию |
|---|---|---|
| DATABASE_URL | Строка подключения к PostgreSQL | postgresql+asyncpg://postgres:postgres@localhost:5432/codegraph |
| API_JWT_SECRET | Секрет для подписи JWT (не менее 64 символов) | замените-для-рабочей-среды… |
Настройки сервера¶
| Переменная | Описание | По умолчанию |
|---|---|---|
| API_HOST | Адрес, на котором запускается сервер | 0.0.0.0 |
| API_PORT | Порт сервера | 8000 |
| API_WORKERS | Количество рабочих процессов | 4 |
| API_DEBUG | Режим отладки | false |
Аутентификация¶
| Переменная | Описание | По умолчанию |
|---|---|---|
| API_JWT_ALGORITHM | Алгоритм JWT | HS256 |
| API_ADMIN_USERNAME | Имя администратора по умолчанию | admin |
| API_ADMIN_PASSWORD | Пароль администратора по умолчанию | admin |
Поставщики OAuth2¶
GitHub¶
| Переменная | Описание |
|---|---|
| OAUTH_GITHUB_CLIENT_ID | Идентификатор клиента приложения GitHub OAuth |
| OAUTH_GITHUB_CLIENT_SECRET | Секрет клиента приложения GitHub OAuth |
Google¶
| Переменная | Описание |
|---|---|
| OAUTH_GOOGLE_CLIENT_ID | Идентификатор клиента Google OAuth |
| OAUTH_GOOGLE_CLIENT_SECRET | Секрет клиента Google OAuth |
Keycloak¶
| Переменная | Описание |
|---|---|
| OAUTH_KEYCLOAK_SERVER_URL | URL сервера Keycloak |
| OAUTH_KEYCLOAK_REALM | Realm в Keycloak |
| OAUTH_KEYCLOAK_CLIENT_ID | Идентификатор клиента Keycloak |
| OAUTH_KEYCLOAK_CLIENT_SECRET | Секрет клиента Keycloak |
LDAP/Active Directory¶
| Переменная | Описание |
|---|---|
| LDAP_SERVER | Имя хоста LDAP-сервера |
| LDAP_BASE_DN | Базовый DN для поиска |
| LDAP_BIND_USER | DN пользователя для привязки (bind) |
| LDAP_BIND_PASSWORD | Пароль пользователя для привязки |
| LDAP_USER_SEARCH_BASE | База поиска пользователей |
| LDAP_GROUP_SEARCH_BASE | База поиска групп |
Ограничение частоты запросов¶
| Переменная | Описание | По умолчанию |
|---|---|---|
| RATE_LIMIT_STORAGE | Серверная часть хранилища (memory или redis://...) |
memory |
Демонстрационная конечная точка¶
| Переменная | Описание | По умолчанию |
|---|---|---|
| DEMO_ENABLED | Включить демонстрационную конечную точку | true |
| DEMO_RATE_LIMIT | Ограничение частоты для демо | 30/minute |
Аутентификация¶
Аутентификация по JWT-токену¶
Вход (получение токена)¶
POST /api/v1/auth/token
Content-Type: application/json
{
"username": "admin",
"password": "ваш-пароль"
}
Ответ:
{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "bearer",
"expires_in": 1800
}
Обновление токена¶
POST /api/v1/auth/refresh
Content-Type: application/json
{
"refresh_token": "eyJhbGciOiJIUzI1NiIs..."
}
Использование JWT в запросах¶
Authorization: Bearer <access_token>
Аутентификация по API-ключу¶
Создание API-ключа¶
POST /api/v1/auth/api-keys
Authorization: Bearer <token>
Content-Type: application/json
{
"name": "my-integration",
"expires_days": 365,
"scopes": ["scenarios:read", "query:execute"]
}
Ответ:
{
"id": "key_abc123",
"name": "my-integration",
"key": "rak_xxxxxxxxxxxxxxxxxxxx",
"prefix": "rak_xxxx",
"scopes": ["scenarios:read", "query:execute"],
"expires_at": "2025-12-09T00:00:00Z",
"created_at": "2024-12-09T00:00:00Z"
}
Использование API-ключа в запросах¶
X-API-Key: rak_xxxxxxxxxxxxxxxxxxxx
Список API-ключей¶
GET /api/v1/auth/api-keys
Authorization: Bearer <token>
Удаление API-ключа¶
DELETE /api/v1/auth/api-keys/{key_id}
Authorization: Bearer <token>
Аутентификация через OAuth2¶
Запуск OAuth-процесса¶
GET /api/v1/auth/oauth/{provider}/authorize
Поддерживаемые поставщики: github, google, gitlab, keycloak
Обратный вызов OAuth¶
GET /api/v1/auth/oauth/{provider}/callback?code=xxx&state=xxx
Аутентификация через LDAP¶
POST /api/v1/auth/ldap
Content-Type: application/json
{
"username": "jdoe",
"password": "ldap-пароль"
}
Конечные точки API¶
Демо (Публичный - Без аутентификации)¶
POST /api/v1/demo/chat¶
Публичная демо-конечная точка для интеграции с целевой страницей. Ограничение по количеству запросов на IP-адрес.
Запрос:
{
"query": "Как работает MVCC?",
"language": "ru"
}
Ответ:
{
"answer": "MVCC (Multi-Version Concurrency Control)...",
"scenario_id": "onboarding",
"processing_time_ms": 1523.45
}
Ограничение по частоте: 30 запросов в минуту с одного IP
GET /api/v1/demo/status¶
Проверка статуса демо-конечной точки.
Ответ:
{
"enabled": true,
"rate_limit": "30/minute",
"max_query_length": 500,
"allowed_scenarios": ["onboarding"]
}
Чат¶
POST /api/v1/chat¶
Отправка запроса в систему CodeGraph.
Запрос:
{
"query": "Найти уязвимости к SQL-инъекциям",
"session_id": "необязательный-id-сессии",
"scenario_id": "security",
"language": "en"
}
Ответ:
{
"answer": "Найдено 3 потенциальные уязвимости к SQL-инъекциям...",
"scenario_id": "security",
"confidence": 0.85,
"evidence": [
{
"type": "code",
"source": "src/executor.c:123",
"content": "sprintf(query, \"SELECT * FROM %s\", user_input);",
"relevance": 0.95
}
],
"session_id": "sess_abc123",
"request_id": "req_xyz789",
"processing_time_ms": 2341.5
}
POST /api/v1/chat/stream¶
Отправка запроса и получение потокового ответа через Server-Sent Events (SSE).
Запрос: То же, что и /chat
Ответ: Поток SSE
data: {"type": "start", "session_id": "sess_abc123"}
data: {"type": "chunk", "content": "Найдено 3 потенциальные "}
data: {"type": "chunk", "content": "уязвимости к SQL-инъекциям..."}
data: {"type": "end", "scenario_id": "security"}
Сценарии¶
GET /api/v1/scenarios¶
Список всех 21 доступных сценариев анализа.
Ответ:
[
{
"id": "onboarding",
"name": "Onboarding",
"description": "Начало работы с кодовой базой — поиск функций, построение графов вызовов",
"category": "Learning",
"keywords": ["find", "where", "what", "how", "explain"],
"example_queries": ["Где находится функция main()?", "Что делает exec_simple_query?"]
},
{
"id": "security",
"name": "Security Audit",
"description": "Поиск уязвимостей — SQL-инъекции, переполнения буфера",
"category": "Security",
"keywords": ["vulnerability", "injection", "unsafe"],
"example_queries": ["Найти уязвимости к SQL-инъекциям"]
}
// ... ещё 14 сценариев
]
GET /api/v1/scenarios/{scenario_id}¶
Получение информации о конкретном сценарии.
POST /api/v1/scenarios/{scenario_id}/query¶
Отправка запроса к конкретному сценарию.
Запрос:
{
"query": "Найти уязвимости к переполнению буфера",
"session_id": "необязательный-id-сессии",
"language": "en"
}
Доступные сценарии (всего 21)¶
| ID | Название | Категория | Описание |
|---|---|---|---|
| onboarding | Onboarding | Learning | Начало работы с кодовой базой |
| security | Security Audit | Security | Поиск уязвимостей |
| documentation | Documentation | Documentation | Генерация документации |
| feature_dev | Feature Development | Development | Поиск точек интеграции |
| refactoring | Refactoring | Quality | Выявление код-смэллов |
| performance | Performance Analysis | Performance | Поиск узких мест |
| test_coverage | Test Coverage | Testing | Анализ покрытия тестами |
| compliance | Compliance Check | Quality | Проверка стандартов кодирования |
| code_review | Code Review | Review | Автоматическая проверка кода |
| cross_repo | Cross-Repository | Architecture | Анализ зависимостей |
| architecture | Architecture Violations | Architecture | Обнаружение нарушений |
| tech_debt | Technical Debt | Quality | Оценка технического долга |
| mass_refactoring | Mass Refactoring | Development | Масштабные изменения |
| security_incident | Security Incident | Security | Реагирование на инциденты |
| debugging | Debugging Support | Development | Поиск точек логирования |
| entry_points | Entry Points | Security | Поиск поверхности атаки |
| file_editing | File Editing | Development | Программное редактирование кода |
| code_optimization | Code Optimization | Development | Оптимизация на основе ИИ |
| standards_check | Standards Check | Quality | Проверка стандартов по документам |
| dependencies | Dependencies | Security | Анализ зависимостей |
Проверка кода¶
POST /api/v1/review/patch¶
Проверка git-изменений/диффа.
Запрос:
{
"patch_content": "diff --git a/src/file.c b/src/file.c\n...",
"task_description": "Исправить утечку памяти в обработчике транзакций",
"dod_items": ["Нет утечек памяти", "Проходят модульные тесты"],
"output_format": "json"
}
Ответ:
{
"recommendation": "REQUEST_CHANGES",
"confidence": 0.82,
"findings": [
{
"category": "error",
"severity": "high",
"location": {"file": "src/file.c", "line_start": 45},
"message": "Потенциальная утечка памяти: выделенная память не освобождается на пути ошибки",
"suggested_fix": "Добавить free(ptr) перед оператором return"
}
],
"dod_status": [
{"description": "Нет утечек памяти", "satisfied": false, "evidence": "Найдена 1 потенциальная утечка"}
],
"summary": "Найдена 1 проблема высокой серьёзности, которую необходимо устранить."
}
POST /api/v1/review/github-pr¶
Проверка запроса на слияние в GitHub.
Запрос:
{
"owner": "postgres",
"repo": "postgres",
"pr_number": 123,
"github_token": "ghp_xxx"
}
POST /api/v1/review/gitlab-mr¶
Проверка Merge Request в GitLab.
Запрос:
{
"project_id": "123",
"mr_iid": 456,
"gitlab_token": "glpat-xxx",
"gitlab_url": "https://gitlab.com"
}
Сессии¶
GET /api/v1/sessions¶
Список сессий пользователя.
POST /api/v1/sessions¶
Создание новой сессии.
GET /api/v1/sessions/{session_id}¶
Получение деталей сессии.
DELETE /api/v1/sessions/{session_id}¶
Удаление сессии.
История¶
GET /api/v1/history¶
Получение истории диалогов.
Параметры запроса:
- session_id — фильтрация по сессии
- limit — количество элементов (по умолчанию: 50)
- offset — смещение для пагинации
GET /api/v1/history/{message_id}¶
Получение конкретного сообщения.
GET /api/v1/history/export¶
Экспорт истории диалогов.
Параметры запроса:
- format — формат экспорта (json, csv, markdown)
- session_id — фильтрация по сессии
Запрос (SQL)¶
POST /api/v1/query/execute¶
Выполнение SQL-запроса напрямую к базе данных CPG.
Запрос:
{
"query": "SELECT name, file FROM nodes_method WHERE name LIKE '%transaction%' LIMIT 10",
"timeout_ms": 30000
}
Ответ:
{
"results": [
{"name": "StartTransaction", "file": "xact.c"},
{"name": "CommitTransaction", "file": "xact.c"}
],
"row_count": 2,
"execution_time_ms": 45.2
}
Импорт проекта¶
Импорт новых кодовых баз в систему CodeGraph.
Подробная документация: см. Руководство по импорту проектов для примеров использования.
GET /api/v1/import/languages¶
Получение списка поддерживаемых языков программирования.
Ответ:
{
"languages": [
{
"id": "c",
"name": "C",
"extensions": [".c", ".h", ".cpp", ".hpp"],
"gocpg_lang": "c",
"gocpg_flag": "C"
},
{
"id": "java",
"name": "JAVA",
"extensions": [".java"],
"gocpg_lang": "java",
"gocpg_flag": "JAVASRC"
}
]
}
Поддерживаемые языки (11):
| ID | Название | GoCPG Language | Расширения |
|---|---|---|---|
| c | C | c | .c, .h |
| cpp | C++ | cpp | .cpp, .hpp, .cc, .cxx |
| csharp | C# | csharp | .cs |
| go | Go | go | .go |
| java | Java | java | .java |
| javascript | JavaScript | javascript | .js, .jsx, .mjs |
| typescript | TypeScript | typescript | .ts, .tsx |
| kotlin | Kotlin | kotlin | .kt, .kts |
| php | PHP | php | .php |
| python | Python | python | .py, .pyw |
| onec | 1C:Предприятие | onec | .bsl, .os |
POST /api/v1/import/start¶
Запуск асинхронного импорта новой кодовой базы.
Запрос:
{
"repo_url": "https://github.com/postgres/postgres",
"branch": "master",
"shallow_clone": true,
"language": null,
"mode": "full",
"include_paths": ["src/backend", "src/include"],
"exclude_paths": ["test", "tests"],
"create_domain_plugin": true,
"import_docs": true,
"gocpg_memory_gb": 16,
"batch_size": 10000
}
Параметры запроса:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| repo_url | строка | - | URL Git-репозитория (обязателен, если нет local_path) |
| local_path | строка | - | Локальный путь (обязателен, если нет repo_url) |
| branch | строка | “main” | Ветка Git для клонирования |
| shallow_clone | boolean | true | Использовать неглубокое клонирование |
| shallow_depth | int | 1 | Глубина неглубокого клонирования |
| language | строка | null | ID языка (автоопределение, если null) |
| mode | строка | “full” | Режим импорта: full, selective, incremental |
| include_paths | список | [] | Включаемые пути |
| exclude_paths | список | [] | Исключаемые пути |
| create_domain_plugin | boolean | true | Генерировать Domain Plugin |
| domain_name | строка | null | Пользовательское имя домена |
| import_docs | boolean | true | Импортировать документацию |
| import_readme | boolean | true | Индексировать файлы README |
| import_comments | boolean | true | Импортировать комментарии в коде |
| gocpg_memory_gb | int | 16 | Память для GoCPG (ГБ) |
| batch_size | int | 10000 | Размер пакета для DuckDB |
Ответ:
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "pending",
"message": "Импорт запущен. Используйте job_id для отслеживания прогресса."
}
GET /api/v1/import/status/{job_id}¶
Получение текущего статуса задачи импорта.
Ответ:
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"project_name": "postgres",
"status": "in_progress",
"steps": [
{"name": "Clone Repository", "status": "completed", "progress": 100},
{"name": "Detect Language", "status": "completed", "progress": 100},
{"name": "Create CPG", "status": "in_progress", "progress": 45, "message": "Создание узлов CPG..."},
{"name": "Export to DuckDB", "status": "pending", "progress": 0},
{"name": "Validate CPG", "status": "pending", "progress": 0},
{"name": "Import Documentation", "status": "pending", "progress": 0},
{"name": "Setup Domain Plugin", "status": "pending", "progress": 0}
],
"current_step": "gocpg_parse",
"overall_progress": 35,
"created_at": "2024-12-09T10:00:00Z",
"updated_at": "2024-12-09T10:05:00Z"
}
Статусы импорта:
- pending — Ожидание запуска
- in_progress — Выполняется
- completed — Успешно завершено
- failed — Произошла ошибка
- cancelled — Отменено пользователем
GET /api/v1/import/jobs¶
Список всех задач импорта.
Параметры запроса:
- status_filter — фильтрация по статусу (например, in_progress, completed)
- limit — максимальное количество задач (по умолчанию: 20)
Ответ: Массив объектов ProjectImportStatus.
DELETE /api/v1/import/cancel/{job_id}¶
Отмена выполняющейся задачи импорта.
Ответ:
{
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "cancelled"
}
POST /api/v1/import/step¶
Выполнение отдельного шага конвейера импорта.
Запрос:
{
"step_id": "validate",
"context": {
"duckdb_path": "./workspace/project.duckdb"
}
}
Допустимые шаги:
- clone — Клонирование репозитория
- detect_language — Автоопределение языка программирования
- gocpg_parse — Создание CPG с помощью GoCPG (выход — DuckDB)
- validate — Валидация качества CPG
- chromadb_import — Импорт документации в ChromaDB
- domain_setup — Создание Domain Plugin
Ответ:
{
"step": "validate",
"status": "completed",
"result": {
"validation_report": {
"status": "passed",
"quality_score": 85,
"metrics": {...}
}
}
}
WebSocket: Отслеживание прогресса¶
const ws = new WebSocket('ws://localhost:8000/ws/v1/jobs/550e8400-e29b-41d4-a716-446655440000');
ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
switch (msg.type) {
case 'job.progress':
console.log(`Прогресс: ${msg.payload.progress}% - ${msg.payload.message}`);
break;
case 'job.completed':
console.log('Импорт завершён:', msg.payload.result);
break;
case 'job.failed':
console.error('Ошибка импорта:', msg.payload.error);
break;
}
};
Группы¶
Управление группами проектов и контролем доступа пользователей.
GET /api/v1/groups¶
Список групп проектов, доступных текущему пользователю.
Параметры запроса:
- limit — Максимальное количество групп (по умолчанию: 100)
- offset — Смещение для пагинации (по умолчанию: 0)
Ответ:
{
"groups": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "PostgreSQL Development",
"description": "PostgreSQL core development projects",
"created_at": "2024-12-01T10:00:00Z",
"updated_at": "2024-12-09T15:30:00Z",
"project_count": 3
}
],
"total": 1
}
POST /api/v1/groups¶
Создание новой группы проектов. Только для администраторов.
Запрос:
{
"name": "PostgreSQL Development",
"description": "PostgreSQL core development projects"
}
Ответ: 201 Created
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "PostgreSQL Development",
"description": "PostgreSQL core development projects",
"created_at": "2024-12-09T10:00:00Z",
"updated_at": "2024-12-09T10:00:00Z",
"project_count": 0
}
GET /api/v1/groups/{group_id}¶
Получение деталей конкретной группы.
PUT /api/v1/groups/{group_id}¶
Обновление группы. Только для администраторов или редакторов группы.
Запрос:
{
"name": "Обновлённое название",
"description": "Обновлённое описание"
}
DELETE /api/v1/groups/{group_id}¶
Удаление группы. Только для администраторов.
Ответ: 204 No Content
GET /api/v1/groups/{group_id}/users¶
Список пользователей с доступом к группе.
Ответ:
{
"users": [
{
"id": "user-123",
"user_id": "user-456",
"username": "jdoe",
"role": "editor",
"created_at": "2024-12-01T10:00:00Z"
}
],
"total": 1
}
POST /api/v1/groups/{group_id}/users¶
Добавление доступа пользователю к группе. Только для администраторов или администраторов группы.
Запрос:
{
"user_id": "user-456",
"role": "viewer"
}
Значения ролей: viewer, editor, admin
DELETE /api/v1/groups/{group_id}/users/{user_id}¶
Удаление доступа пользователя к группе. Только для администраторов или администраторов группы.
Проекты¶
Управление проектами внутри групп.
GET /api/v1/projects¶
Список проектов, доступных текущему пользователю.
Параметры запроса:
- group_id — Фильтрация по группе (необязательно)
- limit — Максимальное количество проектов (по умолчанию: 100)
- offset — Смещение для пагинации (по умолчанию: 0)
Ответ:
{
"projects": [
{
"id": "proj-123",
"group_id": "group-456",
"name": "PostgreSQL 17",
"db_path": "./workspace/postgresql.duckdb",
"cpg_path": "./workspace/postgresql.cpg",
"source_path": "./workspace/postgresql",
"language": "c",
"domain": "postgresql_v2",
"description": "PostgreSQL 17.0 source code",
"is_active": true,
"metadata": {"version": "17.0"},
"created_at": "2024-12-01T10:00:00Z",
"updated_at": "2024-12-09T15:30:00Z"
}
],
"total": 1
}
POST /api/v1/projects¶
Создание нового проекта. Требуется доступ редактора к группе.
Запрос:
{
"group_id": "group-456",
"name": "PostgreSQL 17",
"db_path": "./workspace/postgresql.duckdb",
"cpg_path": "./workspace/postgresql.cpg",
"source_path": "./workspace/postgresql",
"language": "c",
"domain": "postgresql_v2",
"description": "PostgreSQL 17.0 source code",
"metadata": {"version": "17.0"}
}
Ответ: 201 Created
GET /api/v1/projects/{project_id}¶
Получение деталей конкретного проекта.
PUT /api/v1/projects/{project_id}¶
Обновление проекта. Требуется доступ редактора.
Запрос:
{
"name": "Обновлённое название",
"domain": "postgresql_v2",
"description": "Обновлённое описание",
"metadata": {"version": "17.1"}
}
DELETE /api/v1/projects/{project_id}¶
Удаление проекта. Требуется доступ администратора.
Ответ: 204 No Content
POST /api/v1/projects/{project_id}/activate¶
Установка проекта как активного для выполнения запросов.
Ответ:
{
"id": "proj-123",
"name": "PostgreSQL 17",
"is_active": true,
"message": "Проект успешно активирован"
}
Статистика¶
GET /api/v1/stats¶
Получение статистики системы.
Ответ:
{
"total_queries": 12345,
"queries_today": 234,
"average_response_time_ms": 1523.4,
"scenarios_usage": {
"onboarding": 4521,
"security": 2341
}
}
Состояние сервиса¶
GET /api/v1/health¶
Полная проверка состояния с информацией о компонентах.
Ответ:
{
"status": "healthy",
"version": "1.0.0",
"uptime_seconds": 3600.5,
"timestamp": "2024-12-09T12:00:00Z",
"components": {
"database": {"status": "healthy", "latency_ms": 5.2},
"llm": {"status": "healthy", "provider": "gigachat"},
"cpg": {"status": "healthy", "db_path": "data/projects/postgres.duckdb"}
}
}
GET /api/v1/health/live¶
Проверка работоспособности (liveness probe) для Kubernetes.
Ответ: 200 OK, если сервис запущен.
{"status": "ok"}
GET /api/v1/health/ready¶
Проверка готовности (readiness probe) для Kubernetes.
Ответ: 200 OK, если готов; 503, если не готов.
{"status": "ready"}
GET /api/v1/health/version¶
Получение версии API.
{
"version": "1.0.0",
"name": "CodeGraph API"
}
Редактирование файлов (S17)¶
POST /api/v1/edit/find¶
Поиск функции, класса или метода для редактирования.
Запрос:
{
"target": "validate_input",
"file": "src/utils.py",
"type": "function"
}
Ответ:
{
"found": true,
"target": {
"name": "validate_input",
"type": "function",
"file": "src/utils.py",
"line_start": 45,
"line_end": 58,
"code": "def validate_input(data):\n ..."
}
}
POST /api/v1/edit/apply¶
Применение изменений кода к целевому объекту.
Запрос:
{
"file": "src/utils.py",
"target": "validate_input",
"new_code": "def validate_input(data):\n return data.strip()",
"preview": false
}
Ответ:
{
"success": true,
"edit_id": "edit_abc123",
"changes": {
"file": "src/utils.py",
"lines_changed": 13,
"diff": "..."
}
}
POST /api/v1/edit/undo¶
Отмена предыдущего изменения.
Запрос:
{
"edit_id": "edit_abc123"
}
Оптимизация кода (S18)¶
POST /api/v1/optimize/analyze¶
Анализ кода на возможности оптимизации.
Запрос:
{
"path": "src/api/",
"categories": ["performance", "security", "readability"]
}
Ответ:
{
"session_id": "opt_abc123",
"suggestions": [
{
"id": "sug_001",
"category": "performance",
"severity": "medium",
"file": "src/api/handlers.py",
"line": 45,
"title": "Заменить цикл на генератор списка",
"description": "Этот цикл можно оптимизировать с помощью генератора списка",
"current_code": "result = []\nfor x in data:\n result.append(x*2)",
"suggested_code": "result = [x*2 for x in data]",
"impact": "~15% улучшение производительности"
}
],
"total": 12
}
GET /api/v1/optimize/suggestions¶
Список ожидающих предложений по оптимизации.
Параметры запроса:
- session_id — Фильтрация по сессии оптимизации
- status — Фильтрация по статусу (pending, approved, rejected)
POST /api/v1/optimize/approve¶
Одобрение предложения по оптимизации.
Запрос:
{
"suggestion_id": "sug_001"
}
POST /api/v1/optimize/reject¶
Отклонение предложения по оптимизации.
Запрос:
{
"suggestion_id": "sug_001",
"reason": "Не применимо к нашему случаю"
}
POST /api/v1/optimize/apply¶
Применение всех одобренных оптимизаций.
Запрос:
{
"session_id": "opt_abc123"
}
Ответ:
{
"applied": 5,
"skipped": 2,
"changes": [
{"file": "src/api/handlers.py", "lines_changed": 3}
]
}
Проверка стандартов (S19)¶
POST /api/v1/standards/import¶
Импорт документа стандартов.
Запрос:
{
"document_path": "company_standards.yaml"
}
Ответ:
{
"success": true,
"document_name": "Company Coding Standards v2.0",
"rules_imported": 15,
"categories": ["naming", "security", "style", "documentation"]
}
GET /api/v1/standards/rules¶
Список импортированных правил.
Параметры запроса:
- category — Фильтрация по категории (например, security, naming)
Ответ:
{
"rules": [
{
"id": "SEC-001",
"title": "Использовать параметризованные запросы",
"category": "security",
"severity": "error",
"description": "Все запросы к базе данных должны использовать параметризованные запросы"
}
],
"total": 15
}
POST /api/v1/standards/check¶
Проверка кода на соответствие импортированным стандартам.
Запрос:
{
"path": "src/",
"severity": "error",
"category": "security"
}
Ответ:
{
"session_id": "std_abc123",
"violations": [
{
"rule_id": "SEC-001",
"title": "Риск SQL-инъекции",
"severity": "error",
"file": "src/api/user_handler.py",
"line": 67,
"code": "cursor.execute(\"SELECT * FROM users WHERE id = %s\" % user_id)",
"suggestion": "Используйте cursor.execute(query, params) с заполнителями",
"reference": {
"url": "https://owasp.org/Top10/A03_2021-Injection/",
"document": "OWASP Top 10 2021"
}
}
],
"summary": {
"total": 23,
"errors": 5,
"warnings": 12,
"info": 6
}
}
GET /api/v1/standards/violations/{session_id}¶
Получение нарушений из сессии проверки стандартов.
Зависимости (S20)¶
POST /api/v1/deps/scan¶
Сканирование зависимостей проекта.
Запрос:
{
"project_path": ".",
"include_dev": true
}
Ответ:
{
"session_id": "deps_abc123",
"overview": {
"total_dependencies": 127,
"direct_dependencies": 23,
"dev_dependencies": 45,
"files_analyzed": 3
},
"dependencies": [
{
"name": "fastapi",
"version": "0.104.1",
"type": "direct",
"license": "MIT"
}
]
}
POST /api/v1/deps/audit¶
Проверка зависимостей на наличие уязвимостей.
Запрос:
{
"session_id": "deps_abc123",
"severity": ["critical", "high"]
}
Ответ:
{
"vulnerabilities": [
{
"package": "requests",
"version": "2.28.0",
"cve": "CVE-2024-12345",
"severity": "critical",
"title": "Удалённое выполнение кода при обработке HTTP-перенаправлений",
"fixed_in": "2.32.0",
"cvss_score": 9.8
}
],
"summary": {
"critical": 1,
"high": 2,
"medium": 3,
"low": 5
}
}
GET /api/v1/deps/graph¶
Получение графа зависимостей.
Параметры запроса:
- session_id — Идентификатор сессии сканирования зависимостей
- format — Формат вывода (json, dot)
Ответ:
{
"nodes": [
{"id": "fastapi", "version": "0.104.1", "type": "direct"},
{"id": "pydantic", "version": "2.5.2", "type": "transitive"}
],
"edges": [
{"from": "fastapi", "to": "pydantic"}
]
}
POST /api/v1/deps/sbom¶
Генерация спецификации состава программного обеспечения (SBOM).
Запрос:
{
"session_id": "deps_abc123",
"format": "cyclonedx",
"include_vulnerabilities": true
}
Ответ:
{
"format": "CycloneDX 1.4",
"output_file": "sbom.json",
"components": 127,
"metadata": {
"generated": "2024-12-09T14:35:21Z",
"tool": "CodeGraph v1.0"
}
}
Композиция¶
POST /api/v1/composition/query¶
Выполнение составного запроса с оркестратором.
Запрос:
{
"query": "Оптимизировать модуль аутентификации",
"orchestrator": "s18",
"scenarios": ["s02", "s08"],
"context": {
"file_paths": ["src/auth/"]
}
}
Ответ:
{
"session_id": "comp_abc123",
"orchestrator": "s18",
"findings": [
{
"id": "find_001",
"source_scenario": "s02",
"type": "vulnerability",
"severity": "high",
"file": "src/auth/login.py",
"line": 45,
"message": "Обнаружена уязвимость SQL-инъекции"
},
{
"id": "find_002",
"source_scenario": "s08",
"type": "compliance",
"severity": "medium",
"file": "src/auth/validator.py",
"line": 23,
"message": "Отсутствует валидация входных данных"
}
],
"summary": {
"total_findings": 12,
"by_scenario": {"s02": 5, "s08": 7}
}
}
POST /api/v1/composition/apply¶
Применение результата из составного анализа.
Запрос:
{
"session_id": "comp_abc123",
"finding_id": "find_001",
"preview": true
}
Ответ:
{
"success": true,
"preview": true,
"changes": {
"file": "src/auth/login.py",
"diff": "..."
}
}
GET /api/v1/composition/conflicts/{session_id}¶
Проверка конфликтов между результатами.
Ответ:
{
"conflicts": [
{
"finding_a": "find_001",
"finding_b": "find_003",
"file": "src/auth/login.py",
"lines": [45, 47],
"resolution_options": ["keep_a", "keep_b", "merge"]
}
]
}
GET /api/v1/composition/session/{session_id}¶
Получение деталей сессии композиции.
GET /api/v1/composition/config¶
Получение конфигурации композиции.
Ответ:
{
"orchestrators": ["s18", "s19"],
"available_scenarios": ["s02", "s08", "s17"],
"merge_strategies": ["priority", "chronological", "interactive"]
}
Генерация документации¶
Пакетная генерация документации с индексацией в ChromaDB для семантического поиска.
POST /api/v1/documentation/generate¶
Генерация полной документации проекта (все 8 разделов). Запускает обработчики последовательно, сохраняет markdown на диск и индексирует фрагменты в ChromaDB.
Тело запроса:
{
"language": "en",
"output_dir": "./docs/generated",
"index_in_chromadb": true,
"sections": ["mvd_doc", "module_overview", "function_doc", "pipeline_doc", "business_logic_doc", "type_doc", "coverage_doc", "diagram_doc"]
}
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
language |
string |
"en" |
Код языка (en или ru) |
output_dir |
string? |
значение из конфига | Директория для файлов |
index_in_chromadb |
bool |
true |
Индексировать ли в ChromaDB |
sections |
string[]? |
все | Конкретные разделы для генерации |
POST /api/v1/documentation/generate/{section}¶
Генерация одного раздела документации.
Параметры пути: section — один из: mvd_doc, module_overview, function_doc, pipeline_doc, business_logic_doc, type_doc, coverage_doc, diagram_doc
GET /api/v1/documentation/stats¶
Статистика коллекции ChromaDB для сгенерированной документации.
POST /api/v1/documentation/search¶
Семантический поиск по сгенерированной документации, индексированной в ChromaDB.
Тело запроса:
{
"query": "функции управления буферами",
"n_results": 10,
"section_type_filter": "function_doc",
"language_filter": "en"
}
Операции GoCPG¶
Конечные точки для взаимодействия с движком графа кода GoCPG. Все конечные точки требуют аутентификации и имеют префикс /api/v1/gocpg/.
GET /api/v1/gocpg/stats¶
Получение статистики CPG (количество узлов/рёбер, размер базы данных).
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
db_path |
string (необязательно) | Путь к файлу DuckDB |
Ответ (200):
{
"total_nodes": 140000,
"total_edges": 1200000,
"methods": 52000,
"calls": 111000,
"files": 8500,
"type_decls": 3200,
"db_size_mb": 245.7,
"tables": {
"nodes_method": 52000,
"nodes_call": 111000,
"edges_call": 808000
}
}
GET /api/v1/gocpg/quality-stats¶
Получение кросс-языковых метрик качества кода: количество методов/вызовов по языкам, точки входа, покрытие тестами, распределение сложности, кандидаты на мёртвый код, разбивка по происхождению типов.
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
db_path |
string (необязательно) | Путь к файлу DuckDB |
top |
integer (необязательно, по умолчанию: 20) | Количество возвращаемых кандидатов на мёртвый код |
Ответ (200):
{
"methods_by_language": [
{"language": "Python", "count": 12500},
{"language": "Go", "count": 8200}
],
"calls_by_language": [
{"language": "Python", "count": 45000},
{"language": "Go", "count": 31000}
],
"entry_points": {
"total": 20700,
"entry_points": 1250,
"regular": 19450
},
"test_coverage": {
"total_methods": 20700,
"test_methods": 3100,
"ratio_percent": 14.97
},
"complexity_distribution": {
"low_1_5": 16800,
"medium_6_10": 2900,
"high_11_20": 750,
"very_high_21_50": 200,
"critical_50_plus": 50
},
"dead_code_candidates": [
{
"name": "unused_helper",
"filename": "src/utils/helpers.py",
"line": 42
}
],
"type_origin_by_language": [
{"language": "Python", "origin": "inferred", "count": 30000},
{"language": "Python", "origin": "unresolved", "count": 15000},
{"language": "Go", "origin": "declared", "count": 25000}
]
}
POST /api/v1/gocpg/query¶
Выполнение SQL-запроса к базе данных CPG.
Тело запроса:
{
"sql": "SELECT COUNT(*) FROM nodes_method",
"db_path": null
}
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
sql |
string | да | SQL-запрос для выполнения |
db_path |
string | нет | Путь к файлу DuckDB |
Ответ (200):
{
"columns": ["count_star()"],
"rows": [[52000]],
"row_count": 1
}
GET /api/v1/gocpg/frontends¶
Список доступных языковых модулей.
Ответ (200):
[
{
"name": "c2cpg",
"available": true,
"extensions": [".c", ".h"]
},
{
"name": "gosrc2cpg",
"available": true,
"extensions": [".go"]
}
]
POST /api/v1/gocpg/metrics¶
Валидация метрик исходных файлов.
Тело запроса:
{
"input_path": ".",
"verbose": false
}
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
input_path |
string | нет | Исходный файл или директория (по умолчанию: .) |
verbose |
boolean | нет | Детализация по файлам (по умолчанию: false) |
GET /api/v1/gocpg/branches¶
Список отслеживаемых веток CPG.
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
db_path |
string (необязательно) | Путь к файлу DuckDB |
Ответ (200):
[
{
"branch_name": "main",
"commit_sha": "abc12345",
"file_count": 8500,
"node_count": 140000,
"is_active": true
}
]
POST /api/v1/gocpg/branches/switch¶
Переключение активной ветки CPG.
Тело запроса:
{
"branch_name": "feature-branch",
"db_path": null
}
Ответ (200):
{
"status": "ok",
"branch": "feature-branch"
}
POST /api/v1/gocpg/branches/prune¶
Удаление устаревших веток, отсутствующих в git-репозитории.
Тело запроса:
{
"input_path": ".",
"db_path": null
}
Ответ (200):
{
"status": "ok",
"pruned_count": 2
}
GET /api/v1/gocpg/hooks/status¶
Статус установки git-хуков.
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
repo_path |
string (необязательно) | Путь к репозиторию (по умолчанию: .) |
Ответ (200):
[
{
"hook_name": "pre-commit",
"installed": true
},
{
"hook_name": "post-commit",
"installed": false
}
]
POST /api/v1/gocpg/hooks/install¶
Установка git-хуков для автоматического обновления CPG.
Тело запроса:
{
"repo_path": ".",
"db_path": null,
"hook_types": null,
"async_hooks": true,
"language": null
}
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
repo_path |
string | нет | Путь к репозиторию (по умолчанию: .) |
db_path |
string | нет | Путь к файлу DuckDB |
hook_types |
string | нет | Типы хуков через запятую |
async_hooks |
boolean | нет | Асинхронное выполнение хуков (по умолчанию: true) |
language |
string | нет | Языковой модуль |
POST /api/v1/gocpg/hooks/uninstall¶
Удаление установленных git-хуков.
Тело запроса:
{
"repo_path": "."
}
POST /api/v1/gocpg/index¶
Создание или пересоздание индексов DuckDB для оптимизации запросов.
Тело запроса:
{
"db_path": null
}
GET /api/v1/gocpg/submodules¶
Список отслеживаемых подмодулей.
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
db_path |
string (необязательно) | Путь к файлу DuckDB |
Ответ (200):
[
{
"path": "contrib/pgcrypto",
"commit_sha": "abc123456789",
"initialized": true,
"recursive": false
}
]
POST /api/v1/gocpg/submodules/prune¶
Удаление устаревших подмодулей.
Тело запроса:
{
"input_path": ".",
"db_path": null
}
Ответ (200):
{
"status": "ok",
"pruned_count": 1
}
POST /api/v1/gocpg/watch/start¶
Запуск мониторинга файлов (фоновый процесс) для обновления CPG в реальном времени.
Тело запроса:
{
"input_path": "/path/to/source",
"output_path": null,
"language": null,
"debounce_ms": null,
"extensions": null,
"webhook_url": null
}
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
input_path |
string | да | Директория для мониторинга |
output_path |
string | нет | Путь к файлу DuckDB |
language |
string | нет | Языковой модуль |
debounce_ms |
integer | нет | Интервал подавления дребезга в мс |
extensions |
string | нет | Расширения файлов для мониторинга |
webhook_url |
string | нет | URL вебхука для уведомлений |
Ответ (200):
{
"status": "started",
"pid": 12345,
"input_path": "/path/to/source"
}
Ошибка (409): Мониторинг уже запущен.
POST /api/v1/gocpg/watch/stop¶
Остановка запущенного мониторинга файлов.
Ответ (200):
{
"status": "stopped",
"pid": 12345
}
Ошибка (404): Нет активного мониторинга.
GET /api/v1/gocpg/watch/status¶
Получение текущего статуса мониторинга.
Ответ (200):
{
"running": true,
"pid": 12345,
"input_path": "/path/to/source",
"output_path": "data/projects/myproject.duckdb"
}
Ошибки GoCPG¶
| Код статуса | Тип ошибки | Описание |
|---|---|---|
| 500 | GoCPGProcessError |
Команда GoCPG завершилась с ошибкой (ненулевой код выхода) |
| 504 | GoCPGTimeoutError |
Превышено время выполнения команды GoCPG |
| 409 | Конфликт | Мониторинг уже запущен (только watch/start) |
| 404 | Не найдено | Нет активного мониторинга (только watch/stop) |
Операции со структурными шаблонами¶
Конечные точки для структурного поиска шаблонов в коде, результатов сканирования и генерации правил с помощью LLM. Все конечные точки требуют аутентификации и имеют префикс /api/v1/patterns/.
POST /api/v1/patterns/search¶
Произвольный структурный поиск шаблонов с использованием AST-сопоставления.
Тело запроса:
{
"pattern": "malloc($SIZE)",
"language": "c",
"max_results": 100
}
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
pattern |
string | да | Структурный шаблон с метапеременными (например, "malloc($SIZE)") |
language |
string | да | Язык исходного кода (c, go, python, javascript и т.д.) |
max_results |
integer | нет | Максимальное количество результатов (по умолчанию: 100) |
Ответ (200):
{
"pattern": "malloc($SIZE)",
"language": "c",
"files_searched": 8500,
"matches": [
{
"file": "src/backend/utils/mmgr/aset.c",
"line_start": 142,
"line_end": 142,
"col_start": 12,
"col_end": 28,
"matched_text": "malloc(size)",
"metavars": {"SIZE": "size"}
}
],
"count": 1
}
GET /api/v1/patterns/findings¶
Запрос сохранённых результатов сканирования шаблонов из базы данных CPG (заполняется командой gocpg scan).
Параметры запроса:
| Параметр | Тип | Описание |
|---|---|---|
rule_id |
string (необязательно) | Фильтр по ID правила |
severity |
string (необязательно) | Фильтр по серьёзности (error, warning, info, hint) |
filename |
string (необязательно) | Фильтр по пути к файлу (поиск подстроки) |
category |
string (необязательно) | Фильтр по категории правила |
limit |
integer (необязательно) | Максимальное количество результатов (по умолчанию: 100) |
Ответ (200):
{
"findings": [
{
"id": 1,
"rule_id": "no-unchecked-malloc",
"severity": "warning",
"category": "security",
"rule_message": "Unchecked return value from malloc",
"filename": "src/backend/utils/mmgr/aset.c",
"line_start": 142,
"line_end": 142,
"col_start": 12,
"col_end": 28,
"matched_text": "malloc(size)",
"message": "Return value of malloc is not checked for NULL",
"metavars": {"SIZE": "size"},
"fix_applied": false,
"has_cpg": true
}
],
"count": 1
}
GET /api/v1/patterns/stats¶
Агрегированная статистика сопоставления шаблонов.
Ответ (200):
{
"total_findings": 57,
"by_severity": {
"error": 12,
"warning": 30,
"info": 15
},
"by_category": {
"security": 20,
"performance": 15,
"correctness": 22
},
"by_rule": {
"no-unchecked-malloc": {"message": "Unchecked malloc return", "count": 8},
"sql-string-concat": {"message": "SQL concatenation detected", "count": 12}
}
}
GET /api/v1/patterns/rules¶
Список загруженных правил шаблонов из базы данных CPG.
Ответ (200):
{
"rules": [
{
"rule_id": "no-unchecked-malloc",
"severity": "warning",
"category": "security",
"message": "Unchecked return value from malloc",
"language": "c",
"has_fix": true
}
],
"count": 1
}
POST /api/v1/patterns/generate¶
Генерация YAML-правила по описанию на естественном языке с помощью LLM.
Тело запроса:
{
"description": "Найти непроверенные вызовы malloc, которые могут вернуть NULL",
"language": "c"
}
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
description |
string | да | Описание правила на естественном языке |
language |
string | да | Целевой язык |
Ответ (200):
{
"yaml_content": "id: unchecked-malloc\nlanguage: c\nseverity: warning\n..."
}
Ошибки шаблонов¶
| Код статуса | Тип ошибки | Описание |
|---|---|---|
| 400 | Ошибка валидации | Некорректный синтаксис шаблона или отсутствуют обязательные поля |
| 500 | Внутренняя ошибка | Ошибка сопоставления шаблонов или генерации LLM |
Конечные точки WebSocket¶
/ws/chat¶
Соединение для чата в реальном времени.
Подключение:
const ws = new WebSocket('ws://localhost:8000/ws/v1/chat?token=<jwt_token>');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Получено:', data);
};
ws.send(JSON.stringify({
type: 'query',
query: 'Найти уязвимости к SQL-инъекциям',
scenario_id: 'security'
}));
/ws/jobs/{job_id}¶
Мониторинг хода выполнения фоновой задачи.
/ws/notifications¶
Получение уведомлений в реальном времени.
Ограничение частоты запросов¶
Ограничения по умолчанию¶
- Глобальные: 100 запросов/минуту, 1000 запросов/час
Ограничения для конкретных конечных точек¶
| Конечная точка | Ограничение |
|---|---|
| /api/v1/review/* | 10/минуту |
| /api/v1/chat | 60/минуту |
| /api/v1/chat/stream | 30/минуту |
| /api/v1/query/execute | 30/минуту |
| /api/v1/demo/chat | 30/минуту на один IP |
Заголовки ограничения частоты¶
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1702123456
Использование Redis для ограничения частоты запросов¶
Для рабочей среды с несколькими экземплярами используйте Redis:
RATE_LIMIT_STORAGE=redis://localhost:6379
Роли RBAC¶
| Роль | Разрешения |
|---|---|
| viewer | Просмотр сценариев, просмотр истории |
| analyst | Все разрешения viewer + выполнение запросов, создание сессий |
| reviewer | Все разрешения analyst + проверка кода, проверка изменений |
| admin | Полный доступ, включая управление пользователями |
Настройка базы данных¶
Подключение PostgreSQL¶
Требуется PostgreSQL 12+ с поддержкой асинхронных операций.
# Создание базы данных {#create-database}
createdb codegraph
# Установка строки подключения {#set-connection-string}
export DATABASE_URL="postgresql+asyncpg://postgres:password@localhost:5432/codegraph"
Миграции Alembic¶
# Применить все миграции {#apply-all-migrations}
python -m src.api.cli migrate
# Перейти к определённой ревизии {#migrate-to-specific-revision}
python -m src.api.cli migrate --revision abc123
Схема базы данных¶
Основные таблицы:
- users — учетные записи пользователей
- api_keys — хранение API-ключей
- sessions — сессии чата
- messages — история сообщений
- jobs — статус фоновых задач
Команды CLI¶
# Запустить сервер API {#run-api-server}
python -m src.api.cli run [--host HOST] [--port PORT] [--workers N] [--reload]
# Инициализировать базу данных {#initialize-database}
python -m src.api.cli init-db
# Выполнить миграции {#run-migrations}
python -m src.api.cli migrate [--revision REV]
# Создать учётную запись администратора {#create-admin-user}
python -m src.api.cli create-admin --username USER --password PASS [--email EMAIL]
Пример использования (curl)¶
Демонстрационная конечная точка (без аутентификации)¶
curl -X POST http://localhost:8000/api/v1/demo/chat \
-H "Content-Type: application/json" \
-d '{"query": "Как работает MVCC?", "language": "ru"}'
Вход в систему¶
curl -X POST http://localhost:8000/api/v1/auth/token \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "secret"}'
Чат с использованием JWT¶
export TOKEN="eyJhbGciOiJIUzI1NiIs..."
curl -X POST http://localhost:8000/api/v1/chat \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"query": "Find SQL injection vulnerabilities", "scenario_id": "security"}'
Список сценариев¶
curl http://localhost:8000/api/v1/scenarios \
-H "Authorization: Bearer $TOKEN"
Создание API-ключа¶
curl -X POST http://localhost:8000/api/v1/auth/api-keys \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "my-integration", "expires_days": 365}'
Использование API-ключа¶
curl http://localhost:8000/api/v1/scenarios \
-H "X-API-Key: rak_xxxxxxxxxxxxxxxxxxxx"
Проверка изменений¶
curl -X POST http://localhost:8000/api/v1/review/patch \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"patch_content": "diff --git a/src/file.c ...",
"task_description": "Fix memory leak",
"output_format": "json"
}'
Ответы с ошибками¶
Все ошибки возвращают JSON следующей структуры:
{
"detail": "Текст ошибки здесь",
"error_code": "VALIDATION_ERROR",
"request_id": "req_abc123"
}
Общие коды состояния HTTP¶
| Код | Описание |
|---|---|
| 400 | Неверный запрос — некорректные входные данные |
| 401 | Неавторизованный доступ — отсутствует или неверна аутентификация |
| 403 | Доступ запрещён — недостаточно прав |
| 404 | Не найдено |
| 429 | Слишком много запросов — превышено ограничение на запросы |
| 500 | Ошибка внутреннего сервера |
| 503 | Сервис недоступен |