model: команда memo model и автоскачивание модели (докачка, сверка размера, отключатель); manual: раздел про модель

This commit is contained in:
2026-10-02 04:53:04 +03:00
parent 69a0ebe0fa
commit 607137fdf7
5 changed files with 314 additions and 24 deletions
+20 -3
View File
@@ -3,6 +3,7 @@ package memo.mcp
import memo.core.Db
import memo.core.Embedder
import memo.core.Indexer
import memo.core.ModelStore
import memo.core.RefreshHook
import memo.core.SearchMode
import memo.core.Searcher
@@ -115,6 +116,7 @@ fun toolSearch(path: String, query: String, k: Int, mode: SearchMode): String {
val root = resolveCollection(File(path))
val targets = selectTargets(root)
if (targets.isEmpty()) return "коллекции не найдены"
ensureModel()
val (modelPath, tokenizerPath) = modelPaths()
val allHits = ArrayList<memo.core.Hit>()
val errors = ArrayList<String>()
@@ -200,6 +202,7 @@ fun toolReindex(path: String): String {
val root = resolveCollection(File(path))
val collections = selectTargets(root)
if (collections.isEmpty()) return "коллекции не найдены"
ensureModel()
val (modelPath, tokenizerPath) = modelPaths()
var totalUpdated = 0
val embedder = Embedder(modelPath, tokenizerPath)
@@ -231,9 +234,23 @@ private fun selectTargets(root: File): List<File> {
return findCollections(root)
}
private fun modelPaths(): Pair<String, String> {
val modelDir = System.getenv("MEMO_MODEL_DIR") ?: "/root/WORK/memo/models/siglip2"
return "$modelDir/text_model_int8.onnx" to "$modelDir/tokenizer.model"
private fun modelDir(): File =
File(System.getenv("MEMO_MODEL_DIR") ?: "/root/WORK/memo/models/siglip2")
private fun modelPaths(): Pair<String, String> = ModelStore.paths(modelDir())
private fun ensureModel() {
val dir = modelDir()
if (ModelStore.isComplete(dir)) return
if (System.getenv("MEMO_MODEL_AUTO_DOWNLOAD") == "0") {
val msg = "модель не найдена в ${dir.absolutePath}; запустите: memo model"
System.err.println(msg)
throw IllegalStateException(msg)
}
System.err.println(
"модель не найдена в ${dir.absolutePath}, скачиваю с ${ModelStore.DEFAULT_BASE_URL} (≈287 МБ, один раз)",
)
ModelStore.ensure(dir, log = { System.err.println(it) })
}
private fun countInt(db: Db, sql: String): Int {