Документация по REST API CodeGraph

Документация по REST API CodeGraph

Полная документация по серверу REST API CodeGraph.

Содержание

Обзор

  • Фреймворк: 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 Сервис недоступен