ragvai8
Панель управления RAG-сервисом
ragvai8
01Дашборд 02Коллекции 03Загрузка 04Поиск 05RAG-чат 06Настройки 07API-доступ 08Документация
RAG · vai8
vai8 v1.0 · 2026-07-09
Обзор

Дашборд

Коллекции
—
Документы
—
Чанки
—
близко к порогу порог миграции ~500 тыс.
Размер БД
—
Аптайм
—
Сервер
CPU—
RAM—
Диск—
—
Компоненты
Эмбеддер—
—
Шлюз LLM основной—
—
Шлюз резервный—
—
Worker индексации—
—
Очередь—
—
Последние задания
ТипСтатусЧанковДлительностьОшибка
Последние поиски
ЗапросРежимTop scoreВремяДата
Журнал
База знаний

Коллекции

← Коллекции

Коллекция

НазваниеТипЧанковДобавлен
Индексация

Загрузка

Перетащите файл сюда или нажмите для выбора
.txt, .md, .html, .json — до 20 МБ
Задание —
Ретривер

Поиск

Ассистент

RAG-чат

Enter — отправить
Конфигурация

Настройки

Интеграции

API-доступ

Ключи дают внешним приложениям доступ к поиску, RAG-чату и данным базы. Передавайте ключ в заголовке Authorization: Bearer …

Доступ
Новый ключ
Сохраните ключ — он показывается только один раз.
Ключи
НазваниеПрефиксДоступСозданПоследнее использованиеСтатус
Быстрый старт
curl
curl -X POST https://rag.vai8.io/api/search \
  -H "Authorization: Bearer rag_live_ВАШ_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{"query":"передатчик видео 50 км","top_k":5,"mode":"hybrid"}'
Справочник

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

Как подключить внешнее приложение к RAG-сервису: авторизация, поиск, чат-стриминг, работа с данными.

Подключение
Базовый URLhttps://rag.vai8.io
Резервный адресhttps://rag.89.124.93.204.sslip.io
Внутри сервераhttp://127.0.0.1:8100
АвторизацияAuthorization: Bearer rag_live_… (раздел «API-доступ»)
Тип содержимогоContent-Type: application/json

Ключ может быть общим (доступ ко всем коллекциям) или ограниченным списком коллекций — это выбирается при создании в разделе «API-доступ». Запрос ограниченным ключом к чужой коллекции возвращает 403. Если в /api/search или /api/chat не передан collection_id, ключ с одной коллекцией подставляет её автоматически, а ключ с несколькими получит 400 «укажите collection_id». Изменение настроек (PUT /api/settings) доступно только из панели управления.

Поиск — POST /api/search
ПараметрТипОписание
querystringПоисковый запрос. обязательный
collection_idnumberОграничить поиск одной коллекцией (опционально)
top_knumberСколько результатов вернуть, 1–50; по умолчанию 10
modestringhybrid | vector | bm25; по умолчанию hybrid

Пример запроса:

POST /api/search
Authorization: Bearer rag_live_ВАШ_КЛЮЧ
Content-Type: application/json

{"query": "передатчик видео 50 км", "top_k": 5, "mode": "hybrid"}

Пример ответа:

{
  "took_ms": 42,
  "results": [
    {
      "chunk_id": 1287,
      "text": "COFDM-передатчик видео дальностью до 50 км…",
      "score": 0.7312,
      "scores": {"vector": 0.71, "bm25": 0.54},
      "sku": "TDN-VTX-50",
      "product_name": "Передатчик видео 50 км",
      "meta": {"price_min": 49900, "slug": "vtx-50km", "image": "https://…/vtx.jpg"},
      "document": {"id": 12, "title": "Каталог ТДН"}
    }
  ]
}
RAG-чат — POST /api/chat

Тело запроса: {query, collection_id?, model?, history?}, где history — массив {role, content}. Ответ приходит SSE-потоком: сначала событие sources (найденные фрагменты, до генерации), затем серия delta {text}, в конце done {model} или error {message}.

event: sources
data: {"sources":[{"n":1,"score":0.73,"text":"…","document":{"id":12,"title":"Каталог ТДН"}}]}

event: delta
data: {"text":"Для дальности 50 км подойдёт…"}

event: done
data: {"model":"qwen2.5-32b"}
Данные
ЭндпоинтОписание
GET /api/collectionsСписок коллекций
GET /api/collections/{id}/documents?offset&limit&qДокументы коллекции: постранично, фильтр по названию q
GET /api/documents/{id}/chunksЧанки документа
POST /api/collections/{id}/documentsЗагрузка: JSON {title, text, doc_type} или multipart-файл → {job_id}
GET /api/jobs/{id}Статус индексации: queued / running / done / error
Коды ошибок
КодЗначение
400Ошибка валидации запроса
401Нет ключа или ключ неверный / отозван
403Операция доступна только из панели управления
404Объект не найден
409Конфликт: имя коллекции занято или не совпадает модель эмбеддингов
429Слишком много попыток входа (rate-limit)
Ограничения
  • Файлы до 20 МБ, форматы: txt, md, html, json.
  • top_k — не больше 50.
  • История чата — учитываются последние 6 сообщений.
  • Эмбеддинги локальные: multilingual MiniLM, dim 384.
  • Гибридный поиск = RRF (вектор + BM25) + приоритет точного совпадения SKU.
Пример: Python (httpx)
import httpx, json

BASE = "https://rag.vai8.io"
HEADERS = {"Authorization": "Bearer rag_live_ВАШ_КЛЮЧ"}

# Поиск
r = httpx.post(f"{BASE}/api/search", headers=HEADERS,
               json={"query": "передатчик видео 50 км", "top_k": 5})
for hit in r.json()["results"]:
    print(hit["score"], hit["sku"], hit["text"][:80])

# RAG-чат (SSE-стрим)
with httpx.stream("POST", f"{BASE}/api/chat", headers=HEADERS,
                  json={"query": "что посоветуете для 50 км?"},
                  timeout=120) as resp:
    event = None
    for line in resp.iter_lines():
        if line.startswith("event:"):
            event = line[6:].strip()
        elif line.startswith("data:"):
            data = json.loads(line[5:])
            if event == "delta":
                print(data["text"], end="", flush=True)
            elif event == "error":
                print("Ошибка:", data["message"])
Пример: JavaScript (fetch)
const BASE = 'https://rag.vai8.io';
const HEADERS = {
  'Authorization': 'Bearer rag_live_ВАШ_КЛЮЧ',
  'Content-Type': 'application/json',
};

// Поиск
const search = await fetch(BASE + '/api/search', {
  method: 'POST', headers: HEADERS,
  body: JSON.stringify({ query: 'передатчик видео 50 км', top_k: 5 }),
});
const { results } = await search.json();

// RAG-чат (чтение SSE-потока)
const res = await fetch(BASE + '/api/chat', {
  method: 'POST', headers: HEADERS,
  body: JSON.stringify({ query: 'что посоветуете для 50 км?' }),
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
let buf = '', answer = '';
for (;;) {
  const { done, value } = await reader.read();
  if (done) break;
  buf += decoder.decode(value, { stream: true });
  let i;
  while ((i = buf.indexOf('\n\n')) !== -1) {
    const block = buf.slice(0, i);
    buf = buf.slice(i + 2);
    const event = (block.match(/^event: ?(.+)$/m) || [])[1] || 'message';
    const raw = (block.match(/^data: ?(.+)$/m) || [])[1];
    if (!raw) continue;
    const data = JSON.parse(raw);
    if (event === 'delta') answer += data.text;
    if (event === 'error') console.error(data.message);
  }
}
console.log(answer);
Новая коллекция
Удаление коллекции

Все документы и чанки коллекции будут удалены безвозвратно.