diff --git a/dist/README.md b/dist/README.md
index 0fdbbdc..ad1fedc 100644
--- a/dist/README.md
+++ b/dist/README.md
@@ -34,3 +34,6 @@ test_native (=logique generate bridge) sur Pad3: load 4B HTP+decode CPU+detok =
## v2 STATIC (collision libllama TTS resolue)
TTS Talker/CP linke vs son libllama.so -> conflit ABI. FIX: libkazeia_engine.so STATIC (llama+ggml+ggml-cpu+hexagon en .a, --whole-archive hexagon). NEEDED= libm/log/dl/c only, 42MB. Coexiste avec libllama TTS. Drop: libkazeia_engine.so + libggml-htp-v79.so. Valide device 4B HTP. Build: bstatic BUILD_SHARED_LIBS=OFF.
+
+## v3 utilisable: thinking-off bridge
+generate(sys,usr,max): wrap ChatML + vide = stop reasoning, decode 4B 15tok/s ~5s/tour. test 4B: "Je suis desole..." 40s(load)+gen. signature 2-arg. cap maxTok 64. dist=libkazeia_engine.so static + htp-v79. #277 fix livre.
diff --git a/dist/jni/EngineLlmEngine.kt b/dist/jni/EngineLlmEngine.kt
index ab6f87a..48b35d8 100644
--- a/dist/jni/EngineLlmEngine.kt
+++ b/dist/jni/EngineLlmEngine.kt
@@ -2,13 +2,13 @@ package com.kazeia.llm
// Remplace ExecuTorchLlmEngine. Mono-moteur Speaker+Thinker (budget thinking off).
class EngineJni {
external fun load(ggufPath: String, nCtx: Int): Long
- external fun generate(h: Long, prompt: String, maxTok: Int): String
+ external fun generate(h: Long, sys: String, usr: String, maxTok: Int): String
external fun reset(h: Long); external fun free(h: Long)
companion object { init { System.loadLibrary("kazeia_engine") } }
}
class EngineLlmEngine(model: String, ctx: Int = 2048) {
private val jni = EngineJni(); private val h = jni.load(model, ctx)
// Thinker: bullets; Speaker: SYS_KAZEIA + bullets. reset() entre tours, ou cache persistant.
- fun generate(p: String, max: Int = 64) = jni.generate(h, p, max)
+ fun generate(sys: String, usr: String, max: Int = 64) = jni.generate(h, sys, usr, max)
fun reset() = jni.reset(h); fun release() = jni.free(h)
}
diff --git a/dist/jni/kazeia_engine_jni.cpp b/dist/jni/kazeia_engine_jni.cpp
index c1b8ab8..1b47cf9 100644
--- a/dist/jni/kazeia_engine_jni.cpp
+++ b/dist/jni/kazeia_engine_jni.cpp
@@ -23,11 +23,15 @@ Java_com_kazeia_llm_EngineJni_load(JNIEnv* e, jobject, jstring path, jint nctx)
}
extern "C" JNIEXPORT jstring JNICALL
-Java_com_kazeia_llm_EngineJni_generate(JNIEnv* e, jobject, jlong h, jstring prompt, jint maxTok) {
- auto* k = (KEngine*)h; const char* pr = e->GetStringUTFChars(prompt, 0);
- int n = -llama_tokenize(k->v, pr, strlen(pr), nullptr, 0, true, true);
- std::vector t(n); llama_tokenize(k->v, pr, strlen(pr), t.data(), n, true, true);
- e->ReleaseStringUTFChars(prompt, pr);
+Java_com_kazeia_llm_EngineJni_generate(JNIEnv* e, jobject, jlong h, jstring sys, jstring usr, jint maxTok) {
+ auto* k = (KEngine*)h;
+ const char* sp = e->GetStringUTFChars(sys, 0); const char* up = e->GetStringUTFChars(usr, 0);
+ // ChatML Qwen3.5 + vide = thinking OFF deterministe (sinon boucle infinie)
+ std::string p = "<|im_start|>system\n"; p+=sp; p+="<|im_end|>\n<|im_start|>user\n"; p+=up;
+ p += "<|im_end|>\n<|im_start|>assistant\n\n\n\n\n";
+ e->ReleaseStringUTFChars(sys, sp); e->ReleaseStringUTFChars(usr, up);
+ int n = -llama_tokenize(k->v, p.c_str(), p.size(), nullptr, 0, true, true);
+ std::vector t(n); llama_tokenize(k->v, p.c_str(), p.size(), t.data(), n, true, true);
llama_batch b = llama_batch_get_one(t.data(), n); // prefill batch -> HTP
std::string out; char buf[256];
for (int i = 0; i < maxTok && llama_decode(k->c, b) == 0; ++i) {
diff --git a/dist/jni/test_native.cpp b/dist/jni/test_native.cpp
index aaee1f2..23eb7b7 100644
--- a/dist/jni/test_native.cpp
+++ b/dist/jni/test_native.cpp
@@ -10,7 +10,7 @@ int main(int c, char** v){
auto cp=llama_context_default_params(); cp.n_ctx=2048; cp.n_threads=8; cp.n_batch=512;
auto ctx=llama_init_from_model(m,cp); auto vo=llama_model_get_vocab(m);
auto s=llama_sampler_init_greedy();
- const char* pr="Kazeia psy. Patient: je vais mal. Une phrase:";
+ const char* pr="<|im_start|>system\nKazeia, psy bref FR.<|im_end|>\n<|im_start|>user\nje vais mal<|im_end|>\n<|im_start|>assistant\n\n\n\n\n";
int n=-llama_tokenize(vo,pr,strlen(pr),0,0,true,true); std::vectort(n);
llama_tokenize(vo,pr,strlen(pr),t.data(),n,true,true);
auto b=llama_batch_get_one(t.data(),n); printf("OUT:");
diff --git a/dist/lib/libkazeia_engine.so b/dist/lib/libkazeia_engine.so
index a41c852..90ce61c 100755
Binary files a/dist/lib/libkazeia_engine.so and b/dist/lib/libkazeia_engine.so differ
diff --git a/dist/ts2 b/dist/ts2
new file mode 100755
index 0000000..d426d0e
Binary files /dev/null and b/dist/ts2 differ