0a7c40688c
- :memory-md-vector (KMP jvm+linuxX64+mingwX64): .md-файлы как source of truth, векторный индекс (sqlite-vec) как derived cache. reconcile() на старте: orphan-cleanup + content-hash-gated re-embed. Гибридный скор 0.7*vector + 0.3*keyword. Заменяет EmbeddingProvider на KMP-TextEmbeddingExecutor из :memory-api. - :reflection-api: новый 4-й API-модуль (Reflection, ReflectionStore, ReflectionEvent). Зависит только от :memory-api. - :journal-api получил ConversationRecord/ConversationStore/Ids (бывший :message-store-api, полностью удалён). :outbox-api получил Event, CommonEvent, AgentEvent (бывший :event-store). - :memory-api получил MemoryVectorIndex + NoteMatches + TextEmbeddingExecutor (suspend-обёртка над TextEmbeddingExtractor). - :memory-vector KMP-цели достигнуты через commonMain-only TextEmbedding- Executor, EmbeddingProvider выпилен; :memory-md-vector тянет text-embedding-api транзитивно через :memory-api. - :standalone flatten в commonMain/commonTest завершён (тесты из jvmTest переехали в commonTest). Включён optional деп :memory-md-vector через AGENTIK_MEMORY_BACKEND=md-vector. jvmTest: 96 задач, 407 тестов, 0 падений.
:memory-vector — ANN/JVector/SQLite память с эмбеддингами (JVM-only)
Что это
Реализация MemoryStore поверх SQLite + 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 (ONNX Runtime, без сети).
- HTTP — POST на любой OpenAI-совместимый
Решает: семантический поиск по памяти. "Где я рассказывал про CI/CD" находит нужный эпизод, даже если формулировка другая. При этом offline-capable через SigLIP.
Где используется
:standaloneподключает какAGENTIK_MEMORY_BACKEND=vector(сAGENTIK_EMBEDDING_BACKEND=http|siglip).
Как подключить
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-флоу
memory.save(cat, "text")— text → embedding (HTTP или SigLIP) → row в SQLite + вектор в JVector-индекс.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+ заметок) и семантических запросов.