feat(llm): défaut kazeia-engine GGUF (lib), plus de .pte au runtime — v0.1.6

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) <noreply@anthropic.com>
This commit is contained in:
Kazeia Team 2026-06-15 08:15:27 +02:00
parent 359252bf5e
commit 2acf3922c9
3 changed files with 12 additions and 7 deletions

View File

@ -44,8 +44,8 @@ android {
applicationId = "com.kazeia" applicationId = "com.kazeia"
minSdk = 28 minSdk = 28
targetSdk = 36 targetSdk = 36
versionCode = 6 versionCode = 7
versionName = "0.1.5" versionName = "0.1.6"
// WebDAV de distribution — injecté depuis local.properties. // WebDAV de distribution — injecté depuis local.properties.
buildConfigField("String", "WEBDAV_BASE", "\"${localProp("webdav.base")}\"") buildConfigField("String", "WEBDAV_BASE", "\"${localProp("webdav.base")}\"")

View File

@ -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). * (Kazeia-Engine unifié, A/B identique sur set 6 audios mais à valider plus large).
* Pilotable depuis l'app admin / provider. Defaults safe = "prod". */ * Pilotable depuis l'app admin / provider. Defaults safe = "prod". */
val sttEngine: String = "prod", val sttEngine: String = "prod",
/** Backend LLM : "prod" = ExecuTorchLlmEngine (.pte Qwen3 dense), "lib" = /** Backend LLM : "lib" = EngineLlmAdapter (libkazeia_engine + GGUF Qwen3.5,
* EngineLlmAdapter (libkazeia_engine + GGUF Qwen3.5). Defaults safe = "prod". * q35-lmq4 par défaut) défaut depuis 2026-06-15 : on n'utilise PLUS le
* Bascule "lib" nécessite libllama.so fork ql dans jniLibs. */ * .pte avec kazeia-engine (directive). "prod" = ExecuTorchLlmEngine (.pte)
val llmEngine: String = "prod", * 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 /** Backend TTS : "lib" = libkazeia_tts unifié (SEUL compatible avec le
* libllama.so fork ql embarqué depuis 2026-06-02), "prod" = Qwen3TtsEngine * libllama.so fork ql embarqué depuis 2026-06-02), "prod" = Qwen3TtsEngine
* legacy CRASHE (SIGSEGV nativeInit, dérive ABI llama_context_params) tant * legacy CRASHE (SIGSEGV nativeInit, dérive ABI llama_context_params) tant

View File

@ -127,7 +127,9 @@ object ModelRegistry {
fun byId(id: String): ModelInfo? = ALL.firstOrNull { it.id == id } 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() } ?: ALL.first { it.role == Role.SPEAKER && it.fileExists() }
fun defaultThinker(): ModelInfo = byId("guard06b") fun defaultThinker(): ModelInfo = byId("guard06b")