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