Kazeia-engine/dist/jni/kazeia_engine_jni.cpp

33 lines
1.9 KiB
C++

// kazeia_engine_jni.cpp — bridge LLM Kazeia-Engine (llama.cpp upstream + Hexagon)
// Split prefill NPU / decode CPU. Speaker + Thinker partagent ce moteur.
// Lib: libllama.so + libggml*.so + libggml-htp-v79.so (sel. auto). STT reste ORT-QAIRT.
#include <jni.h>
#include <string>
#include "llama.h"
// Couper le reasoning (sinon ramble anglais): equivaut --reasoning-budget 0.
// Speaker decode CPU (15/8.4 t/s); prefill HTP via -dev HTP0 -ngl 99 cote modele.
struct KEngine { llama_model* m; llama_context* c; const llama_vocab* v; };
extern "C" JNIEXPORT jlong JNICALL
Java_com_kazeia_llm_EngineJni_load(JNIEnv* e, jobject, jstring path, jint nctx) {
const char* p = e->GetStringUTFChars(path, 0);
llama_backend_init();
auto mp = llama_model_default_params(); mp.n_gpu_layers = 99; // prefill HTP
auto m = llama_model_load_from_file(p, mp); e->ReleaseStringUTFChars(path, p);
if (!m) return 0;
auto cp = llama_context_default_params(); cp.n_ctx = nctx; cp.n_threads = 8; // decode CPU
auto* k = new KEngine{m, llama_init_from_model(m, cp), llama_model_get_vocab(m)};
return (jlong)k;
}
extern "C" JNIEXPORT jstring JNICALL
Java_com_kazeia_llm_EngineJni_generate(JNIEnv* e, jobject, jlong h, jstring prompt, jint maxTok) {
auto* k = (KEngine*)h; std::string out; // prefill+greedy, enable_thinking=false dans le template
// tokenize -> llama_decode (prefill HTP batch) -> sample greedy -> decode (CPU) jusqu'a EOS/maxTok
return e->NewStringUTF(out.c_str()); // squelette: voir INTEGRATION.md pour boucle complete
}
extern "C" JNIEXPORT void JNICALL
Java_com_kazeia_llm_EngineJni_reset(JNIEnv*, jobject, jlong h){ llama_memory_clear(llama_get_memory(((KEngine*)h)->c), true); }
extern "C" JNIEXPORT void JNICALL
Java_com_kazeia_llm_EngineJni_free(JNIEnv*, jobject, jlong h){ auto*k=(KEngine*)h; llama_free(k->c); llama_model_free(k->m); delete k; }