Демо API

Демо API

Публичная неаутентифицированная конечная точка для функции «Попробуйте сами» на лендинге. Ограничение запросов по IP, доступен только сценарий onboarding.

Конечные точки

POST /api/v1/demo/chat

Отправка запроса на естественном языке о демонстрационной кодовой базе (PostgreSQL 17.6).

Аутентификация: не требуется (публичная конечная точка) Ограничение: 30 запросов/минуту на IP

Запрос

{
  "query": "Где определена главная функция?",
  "language": "ru"
}
Поле Тип Обязательно По умолчанию Описание
query string Да Вопрос на естественном языке (1-500 символов)
language string Нет "ru" Язык ответа ("en" или "ru")

Ответ (200)

{
  "answer": "Главная функция определена в src/backend/main/main.c на строке 53...",
  "scenario_id": "onboarding",
  "processing_time_ms": 234.5
}
Поле Тип Описание
answer string Ответ, сгенерированный LLM
scenario_id string Всегда "onboarding" в демо-режиме
processing_time_ms float Время обработки на сервере

Ошибки

Статус Причина Тело ответа
400 Запрос слишком длинный (>500 символов) {"detail": "Запрос превышает максимальную длину"}
403 Запрос не по теме или заблокирован {"detail": "...", "examples": [...]}
429 Превышено ограничение на число запросов {"detail": "Слишком много запросов"}
503 Демо-режим отключён {"detail": "Демонстрационная конечная точка отключена"}

Ответ при нерелевантном запросе (403)

При отклонении нерелевантного запроса ответ содержит примеры:

{
  "detail": "Этот запрос выходит за рамки демонстрации. Попробуйте вопросы о кодовой базе.",
  "examples": [
    "Где определена heap_insert?",
    "Покажи граф вызовов ExecProcNode",
    "Как работает MVCC в PostgreSQL?"
  ]
}

GET /api/v1/demo/status

Проверка доступности и конфигурации демонстрационной конечной точки.

Аутентификация: не требуется

Ответ (200)

{
  "enabled": true,
  "rate_limit": "30/minute",
  "max_query_length": 500,
  "allowed_scenarios": ["onboarding"]
}

Конвейер валидации запросов

Входящие запросы проходят 4-этапную валидацию:

1. ЖЁСТКИЙ ОТКАЗ  явно вредоносное содержимое (регулярные выражения)
   └─ Возврат 403 с причиной blocked_content

2. НЕВЕРНЫЙ СЦЕНАРИЙ  легитимный запрос за пределами onboarding
   └─ Возврат 403 с именем сценария + примерами

3. БЫСТРОЕ ПРИНЯТИЕ  обнаружены ключевые слова домена
   └─ Если оценка  порога  запрос принят

4. LLM-СУДЬЯ  неоднозначные запросы отправляются в YandexGPT Lite
   └─ Возвращает is_relevant + оценку достоверности
   └─ Кешируется по MD5(запрос) на 1 час

Кеширование

Демонстрационная конечная точка кеширует ответы для снижения нагрузки на LLM:

Кеш Размер TTL Ключ
Кеш ответов 100 записей (LRU) 30 минут normalize(query).lower()
Кеш LLM-судьи 1000 записей (LRU) 1 час MD5(query.lower())

Конфигурация

config.yaml

api:
  demo:
    enabled: true                  # Включить/отключить демонстрационную конечную точку

Переменные окружения

Переменная По умолчанию Описание
DEMO_ENABLED true Включить/отключить демонстрационную конечную точку
DEMO_RATE_LIMIT 30/minute Ограничение запросов на IP

Настройки LLM-судьи

# Внутренняя конфигурация (demo.py)
llm_judge:
  temperature: 0.1         # Низкая температура для стабильных решений
  max_tokens: 50           # Короткий ответ да/нет
  model: yandexgpt-lite    # Облегчённая модель для быстрых решений

Примеры использования

curl

# Корректный запрос
curl -X POST http://localhost:8000/api/v1/demo/chat \
  -H "Content-Type: application/json" \
  -d '{"query": "Как работает MVCC?", "language": "ru"}'

# Проверка статуса
curl http://localhost:8000/api/v1/demo/status

JavaScript (лендинг)

const response = await fetch('/api/v1/demo/chat', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    query: document.getElementById('demo-input').value,
    language: 'ru'
  })
});

if (response.ok) {
  const data = await response.json();
  showAnswer(data.answer);
} else if (response.status === 403) {
  const error = await response.json();
  showExamples(error.examples);
} else if (response.status === 429) {
  showRateLimit();
}

Безопасность

  • Без аутентификации — конечная точка публично доступна
  • Ограничение запросов — 30 запросов/минуту на IP предотвращает злоупотребление
  • Ограничение сценария — доступен только onboarding (без анализа безопасности, редактирования файлов и т.д.)
  • Валидация запросов — 4-этапный конвейер блокирует вредоносные и нерелевантные запросы
  • Только чтение — операции записи невозможны через демонстрационную конечную точку
  • Ключевые слова домена — загружаются из доменного плагина, не зашиты в код

Связанная документация


Модуль: src/api/routers/demo.py Последнее обновление: февраль 2026