8f616f359f
ci / JVM build + tests (pull_request) Failing after 54s
Every subproject now has README.md:
- 3 runnable modules (:standalone, :agentik-cli, :agentik-tui):
quickstart, env table, parameters, known limits
- 11 library modules: what it is, which problem solves, how to
wire it in, where versions live
Root README.md is the navigation hub (Quickstart, Modules table,
publish + CI/CD notes).
Also: ci.yml prunes the :memory-vector -x excludes now that
text-embedding-kmp artifacts are published to caffeine.
518 tests green.
Verified publish pipeline: :proto:publish to caffeine produces
pom.module + per-target klibs + sources for all 9 KMP targets.
🤖 Generated with [opencode]
79 lines
3.0 KiB
Markdown
79 lines
3.0 KiB
Markdown
# `: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+
|
||
заметок) и семантических запросов.
|