427ce8a572
Добавляет второй бэкенд эмбеддингов для vector-памяти: on-device SigLIP2
через ONNX Runtime. Не требует сети (HTTP), не светят тексты заметок наружу.
* gradle/libs.versions.toml: text-embedding-kmp = "3.0.0-SNAPSHOT", модули
api-jvm / siglip-jvm (group переехал с pw.binom.voice.embeddingtext на
pw.binom.ai.embeddingtext).
* settings.gradle.kts: mavenLocal() добавлен в dependencyResolutionManagement
(text-embedding-kmp публикуется локально как snapshot).
* memory-vector/SiglipEmbeddingProvider (jvmMain) — адаптер
pw.binom.voice.embeddingtext.TextEmbeddingExtractor → EmbeddingProvider:
оборачивает blocking embed() в withContext(Dispatchers.IO) + Mutex (ONNX
сессия не reentrant), размерность пробируется через probe embed("probe")
(768 для SigLIP2-base).
* memory-vector/build.gradle.kts: api(libs.text.embedding.api) +
implementation(libs.text.embedding.siglip); jvmTest получает
SiglipEmbeddingProviderTest — smoke test (skip если модель не найдена).
* standalone/AgentikConfig: новый enum EmbeddingBackend { HTTP, SIGLIP },
поля embeddingBackend / embeddingModelPath / embeddingTokenizerPath, env:
AGENTIK_EMBEDDING_BACKEND, AGENTIK_EMBEDDING_MODEL_PATH,
AGENTIK_EMBEDDING_TOKENIZER_PATH.
* standalone/Main.kt: switch на embeddingBackend при memory-backend=vector;
для SIGLIP требуются оба пути, иначе ошибка с понятным сообщением.
* standalone/README.md: обновлены env-vars, добавлены две bash-секции
(HTTP и SIGLIP) + инструкция скачивания модели с static.binom.pw.
* scripts/install-text-embedding-stub.sh: workaround для upstream бага
(siglip-jvm/*.module ссылается на api без -jvm variant). Создаёт
stub-артефакт api:3.0.0-SNAPSHOT в mavenLocal с тем же содержимым.
Удалить когда upstream починит module-metadata.
Smoke test: AGENTIK_MEMORY_BACKEND=vector AGENTIK_EMBEDDING_BACKEND=siglip
+ несуществующий путь → FileNotFoundException с понятным трейсом (значит
ONNX Runtime инициализирован, путь через factory пробрасывается корректно).
Tests: 288 total green. Fatjar 250MB (вырос из-за onnxruntime ~80MB).
Dropped: старый stub-jar pw.binom.voice.embeddingtext:api:2.0.0-SNAPSHOT.
50 lines
2.5 KiB
Kotlin
50 lines
2.5 KiB
Kotlin
plugins {
|
|
alias(libs.plugins.kotlin.multiplatform)
|
|
}
|
|
|
|
kotlin {
|
|
jvmToolchain(21)
|
|
|
|
// Vector-бэкенд JVM-only: JVector не публикует KMP-таргеты, но его Java 11
|
|
// base jar работает на Android ART через scalar fallback. Для desktop JVM
|
|
// HotSpot 21+ автоматически подхватывается Panama Vector API (multirelease).
|
|
jvm()
|
|
|
|
sourceSets {
|
|
commonMain.dependencies {
|
|
api(project(":memory-api"))
|
|
implementation(libs.kotlinx.coroutines.core)
|
|
implementation(libs.kotlinx.serialization.json)
|
|
}
|
|
commonTest.dependencies {
|
|
implementation(kotlin("test"))
|
|
implementation(libs.kotlinx.coroutines.core)
|
|
implementation(libs.kotlinx.coroutines.test)
|
|
}
|
|
jvmMain.dependencies {
|
|
implementation(libs.jvector)
|
|
implementation(libs.sqldelight.sqlite.driver)
|
|
// text-embedding-kmp — on-device SigLIP2 через ONNX Runtime.
|
|
// Сигнатура `embed(String): TextEmbedding` (blocking), оборачиваем
|
|
// наш `suspend fun embed(text)` через Mutex. api-вариант экспортируем
|
|
// (`api`), потому что SiglipEmbeddingProvider реализует `embed()`
|
|
// через тип TextEmbeddingExtractor, который виден потребителю
|
|
// только если он сам подтянет api-jvm — проще пробросить.
|
|
//
|
|
// WORKAROUND: upstream `siglip-jvm/*.module` ссылается на `api`
|
|
// БЕЗ -jvm суффикса. Поскольку в mavenLocal есть только `api-jvm`,
|
|
// требуется дополнительный stub-jar `pw.binom.ai.embeddingtext:api`
|
|
// с тем же содержимым. Создаётся так:
|
|
// mkdir -p ~/.m2/repository/pw.binom.ai.embeddingtext/api/3.0.0-SNAPSHOT
|
|
// cp ~/.m2/repository/.../api-jvm/3.0.0-SNAPSHOT/api-jvm-*.{jar,sources.jar} \
|
|
// ~/.m2/repository/.../api/3.0.0-SNAPSHOT/api-*.{jar,sources.jar}
|
|
// Когда upstream починит module-metadata — эту инструкцию можно убрать.
|
|
api(libs.text.embedding.api)
|
|
implementation(libs.text.embedding.siglip)
|
|
}
|
|
jvmTest.dependencies {
|
|
implementation(kotlin("test"))
|
|
}
|
|
}
|
|
}
|