From 2acf3922c93f6f80ff07f1ab9e9cf75477a57914 Mon Sep 17 00:00:00 2001 From: Kazeia Team Date: Mon, 15 Jun 2026 08:15:27 +0200 Subject: [PATCH] =?UTF-8?q?feat(llm):=20d=C3=A9faut=20kazeia-engine=20GGUF?= =?UTF-8?q?=20(lib),=20plus=20de=20.pte=20au=20runtime=20=E2=80=94=20v0.1.?= =?UTF-8?q?6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Directive 2026-06-15 : si on passe par kazeia-engine, on n'utilise plus de .pte. - ConfigStore.llmEngine défaut "prod"(.pte) → "lib" (EngineLlmAdapter + libkazeia_engine + GGUF). Le .pte n'est plus chargé au runtime ; il reste câblé en repli d'urgence seulement (et sur cette plateforme son runner QNN échoue de toute façon : « Failed to load llm runner [1] »). - ModelRegistry.defaultSpeaker() "qwen3-4b-seq1024"(.pte) → "qwen3.5-4b" (GGUF, q35-lmq4) : config cohérente, le mode lib charge sp.ggufPath() directement sans repli, zéro référence .pte. Validé device (release v0.1.6, SM8750) : libkazeia_engine charge q35-lmq4.gguf en 1.8 s (backend='lib'), 2 générations FR thérapeutiques cohérentes (« C'est compréhensible, je suis là avec toi… » / « C'est vraiment épuisant, je te comprends. »). Règle aussi le mode perroquet observé avec le .pte. Co-Authored-By: Claude Opus 4.8 (1M context) --- kazeia-android/app/build.gradle.kts | 4 ++-- .../src/main/java/com/kazeia/config/ConfigStore.kt | 11 +++++++---- .../src/main/java/com/kazeia/config/ModelRegistry.kt | 4 +++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/kazeia-android/app/build.gradle.kts b/kazeia-android/app/build.gradle.kts index 1431844..907084d 100644 --- a/kazeia-android/app/build.gradle.kts +++ b/kazeia-android/app/build.gradle.kts @@ -44,8 +44,8 @@ android { applicationId = "com.kazeia" minSdk = 28 targetSdk = 36 - versionCode = 6 - versionName = "0.1.5" + versionCode = 7 + versionName = "0.1.6" // WebDAV de distribution — injecté depuis local.properties. buildConfigField("String", "WEBDAV_BASE", "\"${localProp("webdav.base")}\"") diff --git a/kazeia-android/app/src/main/java/com/kazeia/config/ConfigStore.kt b/kazeia-android/app/src/main/java/com/kazeia/config/ConfigStore.kt index 38fe411..5a1e665 100644 --- a/kazeia-android/app/src/main/java/com/kazeia/config/ConfigStore.kt +++ b/kazeia-android/app/src/main/java/com/kazeia/config/ConfigStore.kt @@ -40,10 +40,13 @@ class ConfigStore private constructor(private val file: File) { * (Kazeia-Engine unifié, A/B identique sur set 6 audios mais à valider plus large). * Pilotable depuis l'app admin / provider. Defaults safe = "prod". */ val sttEngine: String = "prod", - /** Backend LLM : "prod" = ExecuTorchLlmEngine (.pte Qwen3 dense), "lib" = - * EngineLlmAdapter (libkazeia_engine + GGUF Qwen3.5). Defaults safe = "prod". - * Bascule "lib" nécessite libllama.so fork ql dans jniLibs. */ - val llmEngine: String = "prod", + /** Backend LLM : "lib" = EngineLlmAdapter (libkazeia_engine + GGUF Qwen3.5, + * q35-lmq4 par défaut) — défaut depuis 2026-06-15 : on n'utilise PLUS le + * .pte avec kazeia-engine (directive). "prod" = ExecuTorchLlmEngine (.pte) — + * conservé en repli d'urgence uniquement ; sur cette plateforme le runner QNN + * du .pte échoue au load (« Failed to load llm runner [1] »), donc à éviter. + * "lib" valide device : load q35-lmq4.gguf 2.6s + génération FR cohérente. */ + val llmEngine: String = "lib", /** Backend TTS : "lib" = libkazeia_tts unifié (SEUL compatible avec le * libllama.so fork ql embarqué depuis 2026-06-02), "prod" = Qwen3TtsEngine * legacy — CRASHE (SIGSEGV nativeInit, dérive ABI llama_context_params) tant diff --git a/kazeia-android/app/src/main/java/com/kazeia/config/ModelRegistry.kt b/kazeia-android/app/src/main/java/com/kazeia/config/ModelRegistry.kt index 92c11d9..5850851 100644 --- a/kazeia-android/app/src/main/java/com/kazeia/config/ModelRegistry.kt +++ b/kazeia-android/app/src/main/java/com/kazeia/config/ModelRegistry.kt @@ -127,7 +127,9 @@ object ModelRegistry { fun byId(id: String): ModelInfo? = ALL.firstOrNull { it.id == id } - fun defaultSpeaker(): ModelInfo = byId("qwen3-4b-seq1024") + // Défaut = Speaker GGUF (moteur kazeia-engine lib) — on n'utilise plus de .pte + // (directive 2026-06-15). Repli : tout autre Speaker présent sur disque. + fun defaultSpeaker(): ModelInfo = byId("qwen3.5-4b") ?: ALL.first { it.role == Role.SPEAKER && it.fileExists() } fun defaultThinker(): ModelInfo = byId("guard06b")