// Valide la logique de generate() (prefill HTP + greedy CPU) sur device, sans JNI.
#include <cstdio>
#include <cstring>
#include <vector>
#include "llama.h"
int main(int c, char** v){
  llama_backend_init();
  auto mp=llama_model_default_params(); mp.n_gpu_layers=0;
  auto m=llama_model_load_from_file(v[1],mp); if(!m){printf("nomodel\n");return 1;}
  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="<|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);
  llama_tokenize(vo,pr,strlen(pr),t.data(),n,true,true);
  auto b=llama_batch_get_one(t.data(),n); printf("OUT:");
  for(int i=0;i<20&&llama_decode(ctx,b)==0;i++){auto id=llama_sampler_sample(s,ctx,-1);
    if(llama_vocab_is_eog(vo,id))break; char z[128]; int l=llama_token_to_piece(vo,id,z,128,0,true);
    if(l>0)fwrite(z,1,l,stdout); b=llama_batch_get_one(&id,1);} printf("\n"); return 0;
}
