Bridge v3 utilisable: thinking-off ChatML, sys+usr, cap; static intact

This commit is contained in:
Richard Loyer 2026-05-25 09:41:04 +02:00
parent fe6826a3be
commit 7a5780ca1d
6 changed files with 15 additions and 8 deletions

3
dist/README.md vendored
View File

@ -34,3 +34,6 @@ test_native (=logique generate bridge) sur Pad3: load 4B HTP+decode CPU+detok =
## v2 STATIC (collision libllama TTS resolue) ## 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. 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 + <think></think> 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.

View File

@ -2,13 +2,13 @@ package com.kazeia.llm
// Remplace ExecuTorchLlmEngine. Mono-moteur Speaker+Thinker (budget thinking off). // Remplace ExecuTorchLlmEngine. Mono-moteur Speaker+Thinker (budget thinking off).
class EngineJni { class EngineJni {
external fun load(ggufPath: String, nCtx: Int): Long 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) external fun reset(h: Long); external fun free(h: Long)
companion object { init { System.loadLibrary("kazeia_engine") } } companion object { init { System.loadLibrary("kazeia_engine") } }
} }
class EngineLlmEngine(model: String, ctx: Int = 2048) { class EngineLlmEngine(model: String, ctx: Int = 2048) {
private val jni = EngineJni(); private val h = jni.load(model, ctx) private val jni = EngineJni(); private val h = jni.load(model, ctx)
// Thinker: bullets; Speaker: SYS_KAZEIA + bullets. reset() entre tours, ou cache persistant. // 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) fun reset() = jni.reset(h); fun release() = jni.free(h)
} }

View File

@ -23,11 +23,15 @@ Java_com_kazeia_llm_EngineJni_load(JNIEnv* e, jobject, jstring path, jint nctx)
} }
extern "C" JNIEXPORT jstring JNICALL extern "C" JNIEXPORT jstring JNICALL
Java_com_kazeia_llm_EngineJni_generate(JNIEnv* e, jobject, jlong h, jstring prompt, jint maxTok) { Java_com_kazeia_llm_EngineJni_generate(JNIEnv* e, jobject, jlong h, jstring sys, jstring usr, jint maxTok) {
auto* k = (KEngine*)h; const char* pr = e->GetStringUTFChars(prompt, 0); auto* k = (KEngine*)h;
int n = -llama_tokenize(k->v, pr, strlen(pr), nullptr, 0, true, true); const char* sp = e->GetStringUTFChars(sys, 0); const char* up = e->GetStringUTFChars(usr, 0);
std::vector<llama_token> t(n); llama_tokenize(k->v, pr, strlen(pr), t.data(), n, true, true); // ChatML Qwen3.5 + <think></think> vide = thinking OFF deterministe (sinon boucle infinie)
e->ReleaseStringUTFChars(prompt, pr); 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<think>\n\n</think>\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<llama_token> 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 llama_batch b = llama_batch_get_one(t.data(), n); // prefill batch -> HTP
std::string out; char buf[256]; std::string out; char buf[256];
for (int i = 0; i < maxTok && llama_decode(k->c, b) == 0; ++i) { for (int i = 0; i < maxTok && llama_decode(k->c, b) == 0; ++i) {

View File

@ -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 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 ctx=llama_init_from_model(m,cp); auto vo=llama_model_get_vocab(m);
auto s=llama_sampler_init_greedy(); 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<think>\n\n</think>\n\n";
int n=-llama_tokenize(vo,pr,strlen(pr),0,0,true,true); std::vector<llama_token>t(n); int n=-llama_tokenize(vo,pr,strlen(pr),0,0,true,true); std::vector<llama_token>t(n);
llama_tokenize(vo,pr,strlen(pr),t.data(),n,true,true); llama_tokenize(vo,pr,strlen(pr),t.data(),n,true,true);
auto b=llama_batch_get_one(t.data(),n); printf("OUT:"); auto b=llama_batch_get_one(t.data(),n); printf("OUT:");

Binary file not shown.

BIN
dist/ts2 vendored Executable file

Binary file not shown.