# `:memory-vector` — ANN/JVector/SQLite память с эмбеддингами (JVM-only) ## Что это Реализация `MemoryStore` поверх SQLite + [JVector](https://github.com/jbellis/jvector) + LLM-эмбеддинги: - **Хранение метаданных** — SQLite (notes, timestamps, источник). - **ANN-индекс** — JVector (тот же класс HNSW, что используется в Cassandra DataStax). - **Эмбеддинги** — два backendа: - **HTTP** — POST на любой OpenAI-совместимый `/v1/embeddings` (vLLM, LiteLLM, text-embedding-ada-002, и т.д.). - **SigLIP2** — локальная модель через [text-embedding-kmp](https://git.binom.pw/subochev/text-embedding-kmp) (ONNX Runtime, без сети). Решает: семантический поиск по памяти. "Где я рассказывал про CI/CD" находит нужный эпизод, даже если формулировка другая. При этом offline-capable через SigLIP. ## Где используется - `:standalone` подключает как `AGENTIK_MEMORY_BACKEND=vector` (с `AGENTIK_EMBEDDING_BACKEND=http|siglip`). ## Как подключить ```kotlin dependencies { implementation("pw.binom.agentik:memory-vector:0.1.0") implementation("pw.binom.agentik:memory-api:0.1.0") } val memory = VectorMemorySystem.open( dbPath = Path("~/.agentik/mem.db"), embedding = HttpEmbeddingClient( apiUrl = "http://192.168.88.135:8001/v1", apiKey = "no-key-needed", model = "text-embedding-3-small", dimension = 1536, ), ) ``` ## Версии `gradle/libs.versions.toml` → `[versions] agentik-memory-vector`. **Зависит от** `pw.binom.ai.embeddingtext:api-jvm:3.0.0-SNAPSHOT` и `pw.binom.ai.embeddingtext:siglip-jvm:3.0.0-SNAPSHOT` из репо `caffeine` (см. `../gradle/libs.versions.toml`). Оба опубликованы вручную (`Binom-PIN-Caffeine`). ## Как работает embedding-флоу 1. `memory.save(cat, "text")` — text → embedding (HTTP или SigLIP) → row в SQLite + вектор в JVector-индекс. 2. `memory.query(cat, "q")` — q → embedding → ANN top-K (default K=10) → скоры, deduplication, реплес с timestamp. ## Тесты ``` ./gradlew :memory-vector:jvmTest ``` Покрывают: round-trip, ANN top-K, SigLIP (если модель скачана), SQLite-migration. SigLIP-тест skipped без модели на диске. ## Чего здесь НЕТ - Никакого HTTP-клиента к LLM для генерации ответов. Это только embedding-клиент. Сам LLM-вызов — в `:standalone`. ## Текущий статус Используется продакшеном. Подходит для крупных памятей (10000+ заметок) и семантических запросов.