Русский | English
npm

Qdrant API на YDB

Qdrant‑совместимый REST API сервис для хранения и поиска векторов в YDB с точным или приближённым KNN‑поиском — векторы хранятся прямо в YDB.

Публичный demo‑endpoint: http://ydb-qdrant.tech:8080Проверяем…

Идеально как базовый URL Qdrant для IDE‑агентов (Roo Code, Cline) и RAG‑сервисов на YDB.

Почему YDB‑Qdrant

Персистентное хранение

Все данные записываются в распределённое хранилище YDB и сохраняются при перезапусках. Никакого in-memory режима — ваши векторы в безопасности.

Транзакционность и консистентность

Сервис опирается на распределённые ACID‑транзакции YDB с изоляцией Serializable, поэтому векторы живут рядом с основными бизнес‑данными.

Единая платформа данных

Строки, события и векторы хранятся в одной базе YDB — запросы пишутся на YQL, векторы хранятся прямо в YDB.

Надёжность и эксплуатация

Используйте multi‑AZ, backup/restore и disaster recovery YDB вместо самостоятельной эксплуатации кластера Qdrant.

Самовосстанавливающиеся коллекции

Коллекции автоматически пересоздаются при удалении. Сервис отслеживает время последнего доступа к коллекции для управления жизненным циклом тенантов.

Гибкая интеграция

Можно использовать как hosted HTTP‑endpoint, так и Node.js‑пакет ydb-qdrant прямо внутри вашего бэкенда.

Сравнение: YDB-Qdrant vs. Standalone Qdrant

ФункцияYDB-QdrantStandalone Qdrant
Движок храненияYDB (Distributed SQL)RocksDB / In-memory
КонсистентностьСтрогая (ACID Serializable)Eventual / Настраиваемая
МасштабируемостьГоризонтальная (YDB)Шардирование (ручное/managed)
Язык запросовQdrant REST API (YQL внутри)Qdrant API (gRPC/REST)
Сложность эксплуатацииНизкая (переиспользование YDB)Средняя (отдельный кластер)

Где лучше всего подходит

  • Для прототипов и экспериментов с векторным поиском на YDB.
  • Для коллекций примерно до 10K–50K векторов.
  • Для IDE‑агентов (Roo Code, Cline), ожидающих Qdrant API.
  • Для сервисов, которые уже используют YDB и хотят быстро добавить векторный поиск (через HTTP или как Node.js‑пакет ydb-qdrant).

Планы

  • Усиление аутентификации по тенантам (IAM/OAuth, ACL на коллекции) поверх уже реализованных X‑Tenant‑Id и forTenant() API.
  • Квоты и rate limiting по тенантам (коллекции, RPS, размеры payload и батчей) плюс расширенный аудит операций.
  • Поддержка больших коллекций (>100K векторов) через тюнинг индексов и оптимизацию auto-partitioning YDB.
  • Лучшая поддержка высоконагруженных сценариев с миллионами векторов и более жёсткими требованиями по задержкам.
  • Расширение покрытия Qdrant API на YDB (фильтры, facets, recommend/discover, batch‑поиск и др. расширенные режимы).
  • Гибридный поиск, сочетающий векторное сходство с фильтрацией по payload для более точной выборки.
Как это работает под капотом
Поток запросов: IDE/Agent → ydb-qdrant (Node.js) → YDB векторы + индекс

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

Быстрый старт

Настройка в Roo Code/Kilo Code

Публичный demo‑endpoint для IDE: http://ydb-qdrant.tech:8080Проверяем…

Публичный demo‑endpoint для IDE: http://ydb-qdrant.tech:8080 (вставьте в IDE/агент как базовый URL Qdrant).

Самостоятельный хостинг (Node.js)

  1. Клонируйте репозиторий и установите зависимости: npm install
  2. Укажите переменные окружения: YDB_ENDPOINT, YDB_DATABASE
  3. Настройте аутентификацию через переменные окружения: YDB_SERVICE_ACCOUNT_KEY_FILE_CREDENTIALS | YDB_METADATA_CREDENTIALS | YDB_ACCESS_TOKEN_CREDENTIALS | YDB_ANONYMOUS_CREDENTIALS
  4. Запустите: npm run dev (разработка) или npm start (прод)
  5. Укажите клиенту базовый URL: http://localhost:8080

Также можно запускать как контейнер (Docker или docker-compose) с публичным образом ghcr.io/astandrik/ydb-qdrant:latest.

Запуск через Docker / docker-compose

  1. Скачайте образ: docker pull ghcr.io/astandrik/ydb-qdrant:latest
  2. Запустите через Docker: docker run -d --name ydb-qdrant -p 8080:8080 ghcr.io/astandrik/ydb-qdrant:latest
  3. Или через docker-compose: docker-compose up -d с примером конфигурации из README.

Подробнее и все примеры: GitHub README

Использование как Node.js библиотеки

  1. Установка: npm install ydb-qdrant
  2. Использование:
    import { createYdbQdrantClient } from "ydb-qdrant";
    
    const client = await createYdbQdrantClient({
      endpoint: "grpcs://ydb.serverless.yandexcloud.net:2135",
      database: "/ru-central1/...",
      defaultTenant: "myapp",
      // Аутентификация через YDB_*_CREDENTIALS env vars
    });

См. npm package для подробностей.

Всё-в-одном: локальный YDB + ydb-qdrant (Docker)

  1. Запустите один контейнер со встроенным локальным YDB:
    docker run -d --name ydb-qdrant-local \
      -p 8080:8080 -p 8765:8765 \
      ghcr.io/astandrik/ydb-qdrant-local:latest
  2. Порты: 8080 — API ydb-qdrant, 8765 — YDB Embedded UI
  3. Укажите клиенту базовый URL: http://localhost:8080

Идеально для локальной разработки без внешнего кластера YDB. См. GitHub README для подробностей.

API кратко

Назначение

Используйте как базовый URL Qdrant для IDE‑агентов или приложений; векторы хранятся в YDB.

Особенности

  • Совместимые с Qdrant эндпоинты (коллекции, точки, поиск)
  • Два режима поиска: точный (по умолчанию) и приближённый (bit‑quantized)
  • Пакетные upsert и delete для массовых операций
  • Разделение данных по тенантам через заголовок X‑Tenant‑Id
  • Отслеживание последнего доступа к коллекциям для управления тенантами
  • Самохостинг или публичный demo‑endpoint
  • Также доступен как Node.js‑библиотека (createYdbQdrantClient)

Использование как HTTP‑сервис

curl -X PUT http://ydb-qdrant.tech:8080/collections/mycol \
-H 'Content-Type: application/json' \
-d '{"vectors":{"size":384,"distance":"Cosine","data_type":"float"}}'
curl -X POST http://ydb-qdrant.tech:8080/collections/mycol/points/upsert \
-H 'Content-Type: application/json' \
-d '{"points":[{"id":"1","vector":[0.1,0.2,...384 vals...]}]}'
curl -X POST http://ydb-qdrant.tech:8080/collections/mycol/points/search \
-H 'Content-Type: application/json' \
-d '{"vector":[0.1,0.2,...],"limit":5,"with_payload":true}'

Использование как Node.js‑пакет

// Установка: npm install ydb-qdrant
import { createYdbQdrantClient } from "ydb-qdrant";
async function main() {
// defaultTenant опционален; по умолчанию "default"
const client = await createYdbQdrantClient({
defaultTenant: "myapp",
endpoint: "grpcs://lb.etn01g9tcilcon2mrt3h.ydb.mdb.yandexcloud.net:2135",
database: "/ru-central1/b1ge4v9r1l3h1q4njclp/etn01g9tcilcon2mrt3h",
});
// Смена тенанта динамически (возвращает новый экземпляр клиента)
const otherClient = client.forTenant("other-tenant");
await client.createCollection("documents", {
vectors: {
size: 1536,
distance: "Cosine",
data_type: "float",
},
});
await client.upsertPoints("documents", {
points: [
{ id: "doc-1", vector: [/* embedding */], payload: { title: "Doc 1" } },
],
});
const result = await client.searchPoints("documents", {
vector: [/* query embedding */],
top: 10,
with_payload: true,
});
console.log(result.points);
}
Проверка состояния: GET /health → {"status":"ok"}