cactus-react-native 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +1 -1
  2. package/android/src/main/java/com/cactus/Cactus.java +35 -0
  3. package/android/src/main/java/com/cactus/LlamaContext.java +5 -0
  4. package/android/src/main/jni.cpp +45 -14
  5. package/android/src/main/jniLibs/arm64-v8a/libcactus.so +0 -0
  6. package/android/src/main/jniLibs/arm64-v8a/libcactus_v8.so +0 -0
  7. package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2.so +0 -0
  8. package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2_dotprod.so +0 -0
  9. package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2_dotprod_i8mm.so +0 -0
  10. package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2_i8mm.so +0 -0
  11. package/android/src/newarch/java/com/cactus/CactusModule.java +5 -0
  12. package/android/src/oldarch/java/com/cactus/CactusModule.java +5 -0
  13. package/ios/Cactus.mm +21 -0
  14. package/ios/CactusContext.h +1 -0
  15. package/ios/CactusContext.mm +4 -0
  16. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus_ffi.h +0 -12
  17. package/ios/cactus.xcframework/ios-arm64/cactus.framework/cactus +0 -0
  18. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/cactus_ffi.h +0 -12
  19. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/cactus +0 -0
  20. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/cactus_ffi.h +0 -12
  21. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/cactus +0 -0
  22. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/cactus_ffi.h +0 -12
  23. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/cactus +0 -0
  24. package/lib/commonjs/NativeCactus.js +0 -1
  25. package/lib/commonjs/NativeCactus.js.map +1 -1
  26. package/lib/commonjs/chat.js +33 -0
  27. package/lib/commonjs/chat.js.map +1 -1
  28. package/lib/commonjs/index.js +0 -23
  29. package/lib/commonjs/index.js.map +1 -1
  30. package/lib/commonjs/lm.js +26 -7
  31. package/lib/commonjs/lm.js.map +1 -1
  32. package/lib/commonjs/tools.js +0 -7
  33. package/lib/commonjs/tools.js.map +1 -1
  34. package/lib/commonjs/tts.js +1 -4
  35. package/lib/commonjs/tts.js.map +1 -1
  36. package/lib/commonjs/vlm.js +25 -7
  37. package/lib/commonjs/vlm.js.map +1 -1
  38. package/lib/module/NativeCactus.js +0 -3
  39. package/lib/module/NativeCactus.js.map +1 -1
  40. package/lib/module/chat.js +31 -0
  41. package/lib/module/chat.js.map +1 -1
  42. package/lib/module/index.js +1 -10
  43. package/lib/module/index.js.map +1 -1
  44. package/lib/module/lm.js +26 -7
  45. package/lib/module/lm.js.map +1 -1
  46. package/lib/module/tools.js +0 -7
  47. package/lib/module/tools.js.map +1 -1
  48. package/lib/module/tts.js +1 -4
  49. package/lib/module/tts.js.map +1 -1
  50. package/lib/module/vlm.js +25 -7
  51. package/lib/module/vlm.js.map +1 -1
  52. package/lib/typescript/NativeCactus.d.ts +1 -142
  53. package/lib/typescript/NativeCactus.d.ts.map +1 -1
  54. package/lib/typescript/chat.d.ts +10 -0
  55. package/lib/typescript/chat.d.ts.map +1 -1
  56. package/lib/typescript/index.d.ts +2 -4
  57. package/lib/typescript/index.d.ts.map +1 -1
  58. package/lib/typescript/lm.d.ts +9 -6
  59. package/lib/typescript/lm.d.ts.map +1 -1
  60. package/lib/typescript/tools.d.ts.map +1 -1
  61. package/lib/typescript/tts.d.ts.map +1 -1
  62. package/lib/typescript/vlm.d.ts +3 -1
  63. package/lib/typescript/vlm.d.ts.map +1 -1
  64. package/package.json +1 -1
  65. package/src/NativeCactus.ts +6 -175
  66. package/src/chat.ts +42 -1
  67. package/src/index.ts +6 -17
  68. package/src/lm.ts +33 -9
  69. package/src/tools.ts +0 -5
  70. package/src/tts.ts +1 -4
  71. package/src/vlm.ts +35 -13
  72. package/android/src/main/jniLibs/x86_64/libcactus.so +0 -0
  73. package/android/src/main/jniLibs/x86_64/libcactus_x86_64.so +0 -0
  74. package/lib/commonjs/grammar.js +0 -560
  75. package/lib/commonjs/grammar.js.map +0 -1
  76. package/lib/module/grammar.js +0 -553
  77. package/lib/module/grammar.js.map +0 -1
  78. package/lib/typescript/grammar.d.ts +0 -37
  79. package/lib/typescript/grammar.d.ts.map +0 -1
  80. package/src/grammar.ts +0 -854
package/README.md CHANGED
@@ -7,7 +7,7 @@ Run LLMs, VLMs, and TTS models directly on mobile devices.
7
7
  ```json
8
8
  {
9
9
  "dependencies": {
10
- "cactus-react-native": "^0.2.1",
10
+ "cactus-react-native": "^0.2.4",
11
11
  "react-native-fs": "^2.20.0"
12
12
  }
13
13
  }
@@ -598,6 +598,41 @@ public class Cactus implements LifecycleEventListener {
598
598
  tasks.put(task, "getLoadedLoraAdapters-" + contextId);
599
599
  }
600
600
 
601
+ public void rewind(double id, Promise promise) {
602
+ final int contextId = (int) id;
603
+ AsyncTask task = new AsyncTask<Void, Void, Void>() {
604
+ private Exception exception;
605
+
606
+ @Override
607
+ protected Void doInBackground(Void... voids) {
608
+ try {
609
+ LlamaContext context = contexts.get(contextId);
610
+ if (context == null) {
611
+ throw new Exception("Context not found");
612
+ }
613
+ if (context.isPredicting()) {
614
+ throw new Exception("Context is busy");
615
+ }
616
+ context.rewind();
617
+ } catch (Exception e) {
618
+ exception = e;
619
+ }
620
+ return null;
621
+ }
622
+
623
+ @Override
624
+ protected void onPostExecute(Void result) {
625
+ if (exception != null) {
626
+ promise.reject(exception);
627
+ return;
628
+ }
629
+ promise.resolve(null);
630
+ tasks.remove(this);
631
+ }
632
+ }.executeOnExecutor(singleThreadExecutor);
633
+ tasks.put(task, "rewind-" + contextId);
634
+ }
635
+
601
636
  public void releaseContext(double id, Promise promise) {
602
637
  final int contextId = (int) id;
603
638
  AsyncTask task = new AsyncTask<Void, Void, Void>() {
@@ -398,6 +398,10 @@ public class LlamaContext {
398
398
  return getLoadedLoraAdapters(this.context);
399
399
  }
400
400
 
401
+ public void rewind() {
402
+ rewind(this.context);
403
+ }
404
+
401
405
  public void release() {
402
406
  freeContext(context);
403
407
  }
@@ -747,6 +751,7 @@ public class LlamaContext {
747
751
  protected static native int applyLoraAdapters(long contextPtr, ReadableArray loraAdapters);
748
752
  protected static native void removeLoraAdapters(long contextPtr);
749
753
  protected static native WritableArray getLoadedLoraAdapters(long contextPtr);
754
+ protected static native void rewind(long contextPtr);
750
755
  protected static native void freeContext(long contextPtr);
751
756
  protected static native void setupLog(NativeLogCallback logCallback);
752
757
  protected static native void unsetLog();
@@ -307,6 +307,7 @@ Java_com_cactus_LlamaContext_initContext(
307
307
  llama->is_load_interrupted = false;
308
308
  llama->loading_progress = 0;
309
309
 
310
+ callback_context *cb_ctx = nullptr;
310
311
  if (load_progress_callback != nullptr) {
311
312
  defaultParams.progress_callback = [](float progress, void * user_data) {
312
313
  callback_context *cb_ctx = (callback_context *)user_data;
@@ -323,7 +324,7 @@ Java_com_cactus_LlamaContext_initContext(
323
324
  return !llama->is_load_interrupted;
324
325
  };
325
326
 
326
- callback_context *cb_ctx = new callback_context;
327
+ cb_ctx = new callback_context;
327
328
  cb_ctx->env = env;
328
329
  cb_ctx->llama = llama;
329
330
  cb_ctx->callback = env->NewGlobalRef(load_progress_callback);
@@ -339,20 +340,30 @@ Java_com_cactus_LlamaContext_initContext(
339
340
  env->ReleaseStringUTFChars(cache_type_v, cache_type_v_chars);
340
341
 
341
342
  LOGI("[CACTUS] is_model_loaded %s", (is_model_loaded ? "true" : "false"));
342
- if (is_model_loaded) {
343
- if (embedding && llama_model_has_encoder(llama->model) && llama_model_has_decoder(llama->model)) {
344
- LOGI("[CACTUS] computing embeddings in encoder-decoder models is not supported");
345
- llama_free(llama->ctx);
346
- return -1;
343
+
344
+ if (!is_model_loaded) {
345
+ llama_free(llama->ctx);
346
+ if (cb_ctx) {
347
+ env->DeleteGlobalRef(cb_ctx->callback);
348
+ delete cb_ctx;
347
349
  }
348
- context_map[(long) llama->ctx] = llama;
349
- } else {
350
- LOGE("[CACTUS] Failed to load model from path: %s", model_path_chars);
350
+ delete llama;
351
+ return -1;
352
+ }
353
+
354
+ if (embedding && llama_model_has_encoder(llama->model) && llama_model_has_decoder(llama->model)) {
355
+ LOGI("[CACTUS] computing embeddings in encoder-decoder models is not supported");
351
356
  llama_free(llama->ctx);
357
+ if (cb_ctx) {
358
+ env->DeleteGlobalRef(cb_ctx->callback);
359
+ delete cb_ctx;
360
+ }
352
361
  delete llama;
353
362
  return -1;
354
363
  }
355
364
 
365
+ context_map[(long) llama->ctx] = llama;
366
+
356
367
  std::vector<common_adapter_lora_info> lora;
357
368
  const char *lora_chars = env->GetStringUTFChars(lora_str, nullptr);
358
369
  if (lora_chars != nullptr && lora_chars[0] != '\0') {
@@ -381,11 +392,20 @@ Java_com_cactus_LlamaContext_initContext(
381
392
  env->ReleaseStringUTFChars(lora_str, lora_chars);
382
393
  int result = llama->applyLoraAdapters(lora);
383
394
  if (result != 0) {
384
- LOGE("[CACTUS] Failed to apply lora adapters");
385
- llama_free(llama->ctx);
386
- context_map.erase((long) llama->ctx);
387
- delete llama;
388
- return -1;
395
+ LOGI("[Cactus] Failed to apply lora adapters");
396
+ context_map.erase((long) llama->ctx);
397
+ llama_free(llama->ctx);
398
+ if (cb_ctx) {
399
+ env->DeleteGlobalRef(cb_ctx->callback);
400
+ delete cb_ctx;
401
+ }
402
+ delete llama;
403
+ return -1;
404
+ }
405
+
406
+ if (cb_ctx) {
407
+ env->DeleteGlobalRef(cb_ctx->callback);
408
+ delete cb_ctx;
389
409
  }
390
410
 
391
411
  return reinterpret_cast<jlong>(llama->ctx);
@@ -1339,6 +1359,17 @@ Java_com_cactus_LlamaContext_getLoadedLoraAdapters(
1339
1359
  return result;
1340
1360
  }
1341
1361
 
1362
+ JNIEXPORT void JNICALL
1363
+ Java_com_cactus_LlamaContext_rewind(
1364
+ JNIEnv *env, jobject thiz, jlong context_ptr) {
1365
+ UNUSED(env);
1366
+ UNUSED(thiz);
1367
+ auto llama = context_map[(long) context_ptr];
1368
+ if (llama != nullptr) {
1369
+ llama->rewind();
1370
+ }
1371
+ }
1372
+
1342
1373
  JNIEXPORT void JNICALL
1343
1374
  Java_com_cactus_LlamaContext_freeContext(
1344
1375
  JNIEnv *env, jobject thiz, jlong context_ptr) {
@@ -189,6 +189,11 @@ public class CactusModule extends NativeCactusSpec {
189
189
  cactus.releaseVocoder(id, promise);
190
190
  }
191
191
 
192
+ @ReactMethod
193
+ public void rewind(double id, Promise promise) {
194
+ cactus.rewind(id, promise);
195
+ }
196
+
192
197
  @ReactMethod
193
198
  public void releaseContext(double id, Promise promise) {
194
199
  cactus.releaseContext(id, promise);
@@ -188,6 +188,11 @@ public class CactusModule extends ReactContextBaseJavaModule {
188
188
  cactus.releaseVocoder(id, promise);
189
189
  }
190
190
 
191
+ @ReactMethod
192
+ public void rewind(double id, Promise promise) {
193
+ cactus.rewind(id, promise);
194
+ }
195
+
191
196
  @ReactMethod
192
197
  public void releaseContext(double id, Promise promise) {
193
198
  cactus.releaseContext(id, promise);
package/ios/Cactus.mm CHANGED
@@ -473,6 +473,27 @@ RCT_EXPORT_METHOD(multimodalCompletion:(double)contextId
473
473
  });
474
474
  }
475
475
 
476
+ RCT_EXPORT_METHOD(rewind:(double)contextId
477
+ withResolver:(RCTPromiseResolveBlock)resolve
478
+ withRejecter:(RCTPromiseRejectBlock)reject)
479
+ {
480
+ CactusContext *context = llamaContexts[[NSNumber numberWithDouble:contextId]];
481
+ if (context == nil) {
482
+ reject(@"llama_error", @"Context not found", nil);
483
+ return;
484
+ }
485
+ if ([context isPredicting]) {
486
+ reject(@"llama_error", @"Context is busy", nil);
487
+ return;
488
+ }
489
+ @try {
490
+ [context rewind];
491
+ resolve(nil);
492
+ } @catch (NSException *exception) {
493
+ reject(@"llama_cpp_error", exception.reason, nil);
494
+ }
495
+ }
496
+
476
497
  RCT_EXPORT_METHOD(releaseContext:(double)contextId
477
498
  withResolver:(RCTPromiseResolveBlock)resolve
478
499
  withRejecter:(RCTPromiseRejectBlock)reject)
@@ -74,6 +74,7 @@
74
74
  - (NSArray *)decodeAudioTokens:(NSArray *)tokens;
75
75
  - (NSDictionary *)getDeviceInfo;
76
76
  - (void)releaseVocoder;
77
+ - (void)rewind;
77
78
 
78
79
  - (void)invalidate;
79
80
 
@@ -962,6 +962,10 @@
962
962
  llama->releaseVocoder();
963
963
  }
964
964
 
965
+ - (void)rewind {
966
+ llama->rewind();
967
+ }
968
+
965
969
  - (void)invalidate {
966
970
  delete llama;
967
971
  // llama_backend_free();
@@ -182,7 +182,6 @@ CACTUS_FFI_EXPORT cactus_float_array_c_t cactus_decode_audio_tokens_c(cactus_con
182
182
 
183
183
  CACTUS_FFI_EXPORT void cactus_release_vocoder_c(cactus_context_handle_t handle);
184
184
 
185
- // **HIGH PRIORITY ADDITIONS**
186
185
 
187
186
  typedef struct {
188
187
  const char* path;
@@ -204,19 +203,13 @@ typedef struct {
204
203
  double tg_std;
205
204
  } cactus_bench_result_c_t;
206
205
 
207
- // **HIGH PRIORITY: Benchmarking**
208
206
  CACTUS_FFI_EXPORT cactus_bench_result_c_t cactus_bench_c(cactus_context_handle_t handle, int pp, int tg, int pl, int nr);
209
-
210
- // **HIGH PRIORITY: LoRA Adapter Support**
211
207
  CACTUS_FFI_EXPORT int cactus_apply_lora_adapters_c(cactus_context_handle_t handle, const cactus_lora_adapters_c_t* adapters);
212
208
  CACTUS_FFI_EXPORT void cactus_remove_lora_adapters_c(cactus_context_handle_t handle);
213
209
  CACTUS_FFI_EXPORT cactus_lora_adapters_c_t cactus_get_loaded_lora_adapters_c(cactus_context_handle_t handle);
214
-
215
- // **HIGH PRIORITY: Chat Template Support**
216
210
  CACTUS_FFI_EXPORT bool cactus_validate_chat_template_c(cactus_context_handle_t handle, bool use_jinja, const char* name);
217
211
  CACTUS_FFI_EXPORT char* cactus_get_formatted_chat_c(cactus_context_handle_t handle, const char* messages, const char* chat_template);
218
212
 
219
- // **ADVANCED: Chat with Jinja and Tools Support**
220
213
  typedef struct {
221
214
  char* prompt;
222
215
  char* json_schema;
@@ -235,28 +228,23 @@ CACTUS_FFI_EXPORT cactus_chat_result_c_t cactus_get_formatted_chat_with_jinja_c(
235
228
  const char* tool_choice
236
229
  );
237
230
 
238
- // **HIGH PRIORITY: Context Management**
239
231
  CACTUS_FFI_EXPORT void cactus_rewind_c(cactus_context_handle_t handle);
240
232
  CACTUS_FFI_EXPORT bool cactus_init_sampling_c(cactus_context_handle_t handle);
241
233
 
242
- // **COMPLETION CONTROL**
243
234
  CACTUS_FFI_EXPORT void cactus_begin_completion_c(cactus_context_handle_t handle);
244
235
  CACTUS_FFI_EXPORT void cactus_end_completion_c(cactus_context_handle_t handle);
245
236
  CACTUS_FFI_EXPORT void cactus_load_prompt_c(cactus_context_handle_t handle);
246
237
  CACTUS_FFI_EXPORT void cactus_load_prompt_with_media_c(cactus_context_handle_t handle, const char** media_paths, int media_count);
247
238
 
248
- // **TOKEN PROCESSING**
249
239
  CACTUS_FFI_EXPORT int cactus_do_completion_step_c(cactus_context_handle_t handle, char** token_text);
250
240
  CACTUS_FFI_EXPORT size_t cactus_find_stopping_strings_c(cactus_context_handle_t handle, const char* text, size_t last_token_size, int stop_type);
251
241
 
252
- // **HIGH PRIORITY: Model Information**
253
242
  CACTUS_FFI_EXPORT int32_t cactus_get_n_ctx_c(cactus_context_handle_t handle);
254
243
  CACTUS_FFI_EXPORT int32_t cactus_get_n_embd_c(cactus_context_handle_t handle);
255
244
  CACTUS_FFI_EXPORT char* cactus_get_model_desc_c(cactus_context_handle_t handle);
256
245
  CACTUS_FFI_EXPORT int64_t cactus_get_model_size_c(cactus_context_handle_t handle);
257
246
  CACTUS_FFI_EXPORT int64_t cactus_get_model_params_c(cactus_context_handle_t handle);
258
247
 
259
- // Memory management functions
260
248
  CACTUS_FFI_EXPORT void cactus_free_bench_result_members_c(cactus_bench_result_c_t* result);
261
249
  CACTUS_FFI_EXPORT void cactus_free_lora_adapters_c(cactus_lora_adapters_c_t* adapters);
262
250
  CACTUS_FFI_EXPORT void cactus_free_chat_result_members_c(cactus_chat_result_c_t* result);
@@ -182,7 +182,6 @@ CACTUS_FFI_EXPORT cactus_float_array_c_t cactus_decode_audio_tokens_c(cactus_con
182
182
 
183
183
  CACTUS_FFI_EXPORT void cactus_release_vocoder_c(cactus_context_handle_t handle);
184
184
 
185
- // **HIGH PRIORITY ADDITIONS**
186
185
 
187
186
  typedef struct {
188
187
  const char* path;
@@ -204,19 +203,13 @@ typedef struct {
204
203
  double tg_std;
205
204
  } cactus_bench_result_c_t;
206
205
 
207
- // **HIGH PRIORITY: Benchmarking**
208
206
  CACTUS_FFI_EXPORT cactus_bench_result_c_t cactus_bench_c(cactus_context_handle_t handle, int pp, int tg, int pl, int nr);
209
-
210
- // **HIGH PRIORITY: LoRA Adapter Support**
211
207
  CACTUS_FFI_EXPORT int cactus_apply_lora_adapters_c(cactus_context_handle_t handle, const cactus_lora_adapters_c_t* adapters);
212
208
  CACTUS_FFI_EXPORT void cactus_remove_lora_adapters_c(cactus_context_handle_t handle);
213
209
  CACTUS_FFI_EXPORT cactus_lora_adapters_c_t cactus_get_loaded_lora_adapters_c(cactus_context_handle_t handle);
214
-
215
- // **HIGH PRIORITY: Chat Template Support**
216
210
  CACTUS_FFI_EXPORT bool cactus_validate_chat_template_c(cactus_context_handle_t handle, bool use_jinja, const char* name);
217
211
  CACTUS_FFI_EXPORT char* cactus_get_formatted_chat_c(cactus_context_handle_t handle, const char* messages, const char* chat_template);
218
212
 
219
- // **ADVANCED: Chat with Jinja and Tools Support**
220
213
  typedef struct {
221
214
  char* prompt;
222
215
  char* json_schema;
@@ -235,28 +228,23 @@ CACTUS_FFI_EXPORT cactus_chat_result_c_t cactus_get_formatted_chat_with_jinja_c(
235
228
  const char* tool_choice
236
229
  );
237
230
 
238
- // **HIGH PRIORITY: Context Management**
239
231
  CACTUS_FFI_EXPORT void cactus_rewind_c(cactus_context_handle_t handle);
240
232
  CACTUS_FFI_EXPORT bool cactus_init_sampling_c(cactus_context_handle_t handle);
241
233
 
242
- // **COMPLETION CONTROL**
243
234
  CACTUS_FFI_EXPORT void cactus_begin_completion_c(cactus_context_handle_t handle);
244
235
  CACTUS_FFI_EXPORT void cactus_end_completion_c(cactus_context_handle_t handle);
245
236
  CACTUS_FFI_EXPORT void cactus_load_prompt_c(cactus_context_handle_t handle);
246
237
  CACTUS_FFI_EXPORT void cactus_load_prompt_with_media_c(cactus_context_handle_t handle, const char** media_paths, int media_count);
247
238
 
248
- // **TOKEN PROCESSING**
249
239
  CACTUS_FFI_EXPORT int cactus_do_completion_step_c(cactus_context_handle_t handle, char** token_text);
250
240
  CACTUS_FFI_EXPORT size_t cactus_find_stopping_strings_c(cactus_context_handle_t handle, const char* text, size_t last_token_size, int stop_type);
251
241
 
252
- // **HIGH PRIORITY: Model Information**
253
242
  CACTUS_FFI_EXPORT int32_t cactus_get_n_ctx_c(cactus_context_handle_t handle);
254
243
  CACTUS_FFI_EXPORT int32_t cactus_get_n_embd_c(cactus_context_handle_t handle);
255
244
  CACTUS_FFI_EXPORT char* cactus_get_model_desc_c(cactus_context_handle_t handle);
256
245
  CACTUS_FFI_EXPORT int64_t cactus_get_model_size_c(cactus_context_handle_t handle);
257
246
  CACTUS_FFI_EXPORT int64_t cactus_get_model_params_c(cactus_context_handle_t handle);
258
247
 
259
- // Memory management functions
260
248
  CACTUS_FFI_EXPORT void cactus_free_bench_result_members_c(cactus_bench_result_c_t* result);
261
249
  CACTUS_FFI_EXPORT void cactus_free_lora_adapters_c(cactus_lora_adapters_c_t* adapters);
262
250
  CACTUS_FFI_EXPORT void cactus_free_chat_result_members_c(cactus_chat_result_c_t* result);
@@ -182,7 +182,6 @@ CACTUS_FFI_EXPORT cactus_float_array_c_t cactus_decode_audio_tokens_c(cactus_con
182
182
 
183
183
  CACTUS_FFI_EXPORT void cactus_release_vocoder_c(cactus_context_handle_t handle);
184
184
 
185
- // **HIGH PRIORITY ADDITIONS**
186
185
 
187
186
  typedef struct {
188
187
  const char* path;
@@ -204,19 +203,13 @@ typedef struct {
204
203
  double tg_std;
205
204
  } cactus_bench_result_c_t;
206
205
 
207
- // **HIGH PRIORITY: Benchmarking**
208
206
  CACTUS_FFI_EXPORT cactus_bench_result_c_t cactus_bench_c(cactus_context_handle_t handle, int pp, int tg, int pl, int nr);
209
-
210
- // **HIGH PRIORITY: LoRA Adapter Support**
211
207
  CACTUS_FFI_EXPORT int cactus_apply_lora_adapters_c(cactus_context_handle_t handle, const cactus_lora_adapters_c_t* adapters);
212
208
  CACTUS_FFI_EXPORT void cactus_remove_lora_adapters_c(cactus_context_handle_t handle);
213
209
  CACTUS_FFI_EXPORT cactus_lora_adapters_c_t cactus_get_loaded_lora_adapters_c(cactus_context_handle_t handle);
214
-
215
- // **HIGH PRIORITY: Chat Template Support**
216
210
  CACTUS_FFI_EXPORT bool cactus_validate_chat_template_c(cactus_context_handle_t handle, bool use_jinja, const char* name);
217
211
  CACTUS_FFI_EXPORT char* cactus_get_formatted_chat_c(cactus_context_handle_t handle, const char* messages, const char* chat_template);
218
212
 
219
- // **ADVANCED: Chat with Jinja and Tools Support**
220
213
  typedef struct {
221
214
  char* prompt;
222
215
  char* json_schema;
@@ -235,28 +228,23 @@ CACTUS_FFI_EXPORT cactus_chat_result_c_t cactus_get_formatted_chat_with_jinja_c(
235
228
  const char* tool_choice
236
229
  );
237
230
 
238
- // **HIGH PRIORITY: Context Management**
239
231
  CACTUS_FFI_EXPORT void cactus_rewind_c(cactus_context_handle_t handle);
240
232
  CACTUS_FFI_EXPORT bool cactus_init_sampling_c(cactus_context_handle_t handle);
241
233
 
242
- // **COMPLETION CONTROL**
243
234
  CACTUS_FFI_EXPORT void cactus_begin_completion_c(cactus_context_handle_t handle);
244
235
  CACTUS_FFI_EXPORT void cactus_end_completion_c(cactus_context_handle_t handle);
245
236
  CACTUS_FFI_EXPORT void cactus_load_prompt_c(cactus_context_handle_t handle);
246
237
  CACTUS_FFI_EXPORT void cactus_load_prompt_with_media_c(cactus_context_handle_t handle, const char** media_paths, int media_count);
247
238
 
248
- // **TOKEN PROCESSING**
249
239
  CACTUS_FFI_EXPORT int cactus_do_completion_step_c(cactus_context_handle_t handle, char** token_text);
250
240
  CACTUS_FFI_EXPORT size_t cactus_find_stopping_strings_c(cactus_context_handle_t handle, const char* text, size_t last_token_size, int stop_type);
251
241
 
252
- // **HIGH PRIORITY: Model Information**
253
242
  CACTUS_FFI_EXPORT int32_t cactus_get_n_ctx_c(cactus_context_handle_t handle);
254
243
  CACTUS_FFI_EXPORT int32_t cactus_get_n_embd_c(cactus_context_handle_t handle);
255
244
  CACTUS_FFI_EXPORT char* cactus_get_model_desc_c(cactus_context_handle_t handle);
256
245
  CACTUS_FFI_EXPORT int64_t cactus_get_model_size_c(cactus_context_handle_t handle);
257
246
  CACTUS_FFI_EXPORT int64_t cactus_get_model_params_c(cactus_context_handle_t handle);
258
247
 
259
- // Memory management functions
260
248
  CACTUS_FFI_EXPORT void cactus_free_bench_result_members_c(cactus_bench_result_c_t* result);
261
249
  CACTUS_FFI_EXPORT void cactus_free_lora_adapters_c(cactus_lora_adapters_c_t* adapters);
262
250
  CACTUS_FFI_EXPORT void cactus_free_chat_result_members_c(cactus_chat_result_c_t* result);
@@ -182,7 +182,6 @@ CACTUS_FFI_EXPORT cactus_float_array_c_t cactus_decode_audio_tokens_c(cactus_con
182
182
 
183
183
  CACTUS_FFI_EXPORT void cactus_release_vocoder_c(cactus_context_handle_t handle);
184
184
 
185
- // **HIGH PRIORITY ADDITIONS**
186
185
 
187
186
  typedef struct {
188
187
  const char* path;
@@ -204,19 +203,13 @@ typedef struct {
204
203
  double tg_std;
205
204
  } cactus_bench_result_c_t;
206
205
 
207
- // **HIGH PRIORITY: Benchmarking**
208
206
  CACTUS_FFI_EXPORT cactus_bench_result_c_t cactus_bench_c(cactus_context_handle_t handle, int pp, int tg, int pl, int nr);
209
-
210
- // **HIGH PRIORITY: LoRA Adapter Support**
211
207
  CACTUS_FFI_EXPORT int cactus_apply_lora_adapters_c(cactus_context_handle_t handle, const cactus_lora_adapters_c_t* adapters);
212
208
  CACTUS_FFI_EXPORT void cactus_remove_lora_adapters_c(cactus_context_handle_t handle);
213
209
  CACTUS_FFI_EXPORT cactus_lora_adapters_c_t cactus_get_loaded_lora_adapters_c(cactus_context_handle_t handle);
214
-
215
- // **HIGH PRIORITY: Chat Template Support**
216
210
  CACTUS_FFI_EXPORT bool cactus_validate_chat_template_c(cactus_context_handle_t handle, bool use_jinja, const char* name);
217
211
  CACTUS_FFI_EXPORT char* cactus_get_formatted_chat_c(cactus_context_handle_t handle, const char* messages, const char* chat_template);
218
212
 
219
- // **ADVANCED: Chat with Jinja and Tools Support**
220
213
  typedef struct {
221
214
  char* prompt;
222
215
  char* json_schema;
@@ -235,28 +228,23 @@ CACTUS_FFI_EXPORT cactus_chat_result_c_t cactus_get_formatted_chat_with_jinja_c(
235
228
  const char* tool_choice
236
229
  );
237
230
 
238
- // **HIGH PRIORITY: Context Management**
239
231
  CACTUS_FFI_EXPORT void cactus_rewind_c(cactus_context_handle_t handle);
240
232
  CACTUS_FFI_EXPORT bool cactus_init_sampling_c(cactus_context_handle_t handle);
241
233
 
242
- // **COMPLETION CONTROL**
243
234
  CACTUS_FFI_EXPORT void cactus_begin_completion_c(cactus_context_handle_t handle);
244
235
  CACTUS_FFI_EXPORT void cactus_end_completion_c(cactus_context_handle_t handle);
245
236
  CACTUS_FFI_EXPORT void cactus_load_prompt_c(cactus_context_handle_t handle);
246
237
  CACTUS_FFI_EXPORT void cactus_load_prompt_with_media_c(cactus_context_handle_t handle, const char** media_paths, int media_count);
247
238
 
248
- // **TOKEN PROCESSING**
249
239
  CACTUS_FFI_EXPORT int cactus_do_completion_step_c(cactus_context_handle_t handle, char** token_text);
250
240
  CACTUS_FFI_EXPORT size_t cactus_find_stopping_strings_c(cactus_context_handle_t handle, const char* text, size_t last_token_size, int stop_type);
251
241
 
252
- // **HIGH PRIORITY: Model Information**
253
242
  CACTUS_FFI_EXPORT int32_t cactus_get_n_ctx_c(cactus_context_handle_t handle);
254
243
  CACTUS_FFI_EXPORT int32_t cactus_get_n_embd_c(cactus_context_handle_t handle);
255
244
  CACTUS_FFI_EXPORT char* cactus_get_model_desc_c(cactus_context_handle_t handle);
256
245
  CACTUS_FFI_EXPORT int64_t cactus_get_model_size_c(cactus_context_handle_t handle);
257
246
  CACTUS_FFI_EXPORT int64_t cactus_get_model_params_c(cactus_context_handle_t handle);
258
247
 
259
- // Memory management functions
260
248
  CACTUS_FFI_EXPORT void cactus_free_bench_result_members_c(cactus_bench_result_c_t* result);
261
249
  CACTUS_FFI_EXPORT void cactus_free_lora_adapters_c(cactus_lora_adapters_c_t* adapters);
262
250
  CACTUS_FFI_EXPORT void cactus_free_chat_result_members_c(cactus_chat_result_c_t* result);
@@ -5,6 +5,5 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _reactNative = require("react-native");
8
- // New TTS/Audio types
9
8
  var _default = exports.default = _reactNative.TurboModuleRegistry.get('Cactus');
10
9
  //# sourceMappingURL=NativeCactus.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","get"],"sourceRoot":"../../src","sources":["NativeCactus.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAkSA;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAkMeC,gCAAmB,CAACC,GAAG,CAAO,QAAQ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","get"],"sourceRoot":"../../src","sources":["NativeCactus.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAkD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GA2TnCC,gCAAmB,CAACC,GAAG,CAAO,QAAQ,CAAC","ignoreList":[]}
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.ConversationHistoryManager = void 0;
6
7
  exports.formatChat = formatChat;
7
8
  function formatChat(messages) {
8
9
  const chat = [];
@@ -34,4 +35,36 @@ function formatChat(messages) {
34
35
  });
35
36
  return chat;
36
37
  }
38
+ class ConversationHistoryManager {
39
+ history = [];
40
+ processNewMessages(fullMessageHistory) {
41
+ let divergent = fullMessageHistory.length < this.history.length;
42
+ if (!divergent) {
43
+ for (let i = 0; i < this.history.length; i++) {
44
+ if (JSON.stringify(this.history[i]) !== JSON.stringify(fullMessageHistory[i])) {
45
+ divergent = true;
46
+ break;
47
+ }
48
+ }
49
+ }
50
+ if (divergent) {
51
+ return {
52
+ newMessages: fullMessageHistory,
53
+ requiresReset: true
54
+ };
55
+ }
56
+ const newMessages = fullMessageHistory.slice(this.history.length);
57
+ return {
58
+ newMessages,
59
+ requiresReset: false
60
+ };
61
+ }
62
+ update(newMessages, assistantResponse) {
63
+ this.history.push(...newMessages, assistantResponse);
64
+ }
65
+ reset() {
66
+ this.history = [];
67
+ }
68
+ }
69
+ exports.ConversationHistoryManager = ConversationHistoryManager;
37
70
  //# sourceMappingURL=chat.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["formatChat","messages","chat","forEach","currMsg","role","content","Array","isArray","part","text","TypeError","Error","push"],"sourceRoot":"../../src","sources":["chat.ts"],"mappings":";;;;;;AAWO,SAASA,UAAUA,CACxBC,QAAsC,EACZ;EAC1B,MAAMC,IAA8B,GAAG,EAAE;EAEzCD,QAAQ,CAACE,OAAO,CAAEC,OAAO,IAAK;IAC5B,MAAMC,IAAY,GAAGD,OAAO,CAACC,IAAI,IAAI,EAAE;IAEvC,IAAIC,OAAe,GAAG,EAAE;IACxB,IAAI,SAAS,IAAIF,OAAO,EAAE;MACxB,IAAI,OAAOA,OAAO,CAACE,OAAO,KAAK,QAAQ,EAAE;QACvC;QAAC,CAAC;UAAEA;QAAQ,CAAC,GAAGF,OAAO;MACzB,CAAC,MAAM,IAAIG,KAAK,CAACC,OAAO,CAACJ,OAAO,CAACE,OAAO,CAAC,EAAE;QACzCF,OAAO,CAACE,OAAO,CAACH,OAAO,CAAEM,IAAI,IAAK;UAChC,IAAI,MAAM,IAAIA,IAAI,EAAE;YAClBH,OAAO,IAAI,GAAGA,OAAO,GAAG,IAAI,GAAG,EAAE,GAAGG,IAAI,CAACC,IAAI,EAAE;UACjD;QACF,CAAC,CAAC;MACJ,CAAC,MAAM;QACL,MAAM,IAAIC,SAAS,CACjB,kFACF,CAAC;MACH;IACF,CAAC,MAAM;MACL,MAAM,IAAIC,KAAK,CACb,6EACF,CAAC;IACH;IAEAV,IAAI,CAACW,IAAI,CAAC;MAAER,IAAI;MAAEC;IAAQ,CAAC,CAAC;EAC9B,CAAC,CAAC;EACF,OAAOJ,IAAI;AACb","ignoreList":[]}
1
+ {"version":3,"names":["formatChat","messages","chat","forEach","currMsg","role","content","Array","isArray","part","text","TypeError","Error","push","ConversationHistoryManager","history","processNewMessages","fullMessageHistory","divergent","length","i","JSON","stringify","newMessages","requiresReset","slice","update","assistantResponse","reset","exports"],"sourceRoot":"../../src","sources":["chat.ts"],"mappings":";;;;;;;AAWO,SAASA,UAAUA,CACxBC,QAAsC,EACZ;EAC1B,MAAMC,IAA8B,GAAG,EAAE;EAEzCD,QAAQ,CAACE,OAAO,CAAEC,OAAO,IAAK;IAC5B,MAAMC,IAAY,GAAGD,OAAO,CAACC,IAAI,IAAI,EAAE;IAEvC,IAAIC,OAAe,GAAG,EAAE;IACxB,IAAI,SAAS,IAAIF,OAAO,EAAE;MACxB,IAAI,OAAOA,OAAO,CAACE,OAAO,KAAK,QAAQ,EAAE;QACvC;QAAC,CAAC;UAAEA;QAAQ,CAAC,GAAGF,OAAO;MACzB,CAAC,MAAM,IAAIG,KAAK,CAACC,OAAO,CAACJ,OAAO,CAACE,OAAO,CAAC,EAAE;QACzCF,OAAO,CAACE,OAAO,CAACH,OAAO,CAAEM,IAAI,IAAK;UAChC,IAAI,MAAM,IAAIA,IAAI,EAAE;YAClBH,OAAO,IAAI,GAAGA,OAAO,GAAG,IAAI,GAAG,EAAE,GAAGG,IAAI,CAACC,IAAI,EAAE;UACjD;QACF,CAAC,CAAC;MACJ,CAAC,MAAM;QACL,MAAM,IAAIC,SAAS,CACjB,kFACF,CAAC;MACH;IACF,CAAC,MAAM;MACL,MAAM,IAAIC,KAAK,CACb,6EACF,CAAC;IACH;IAEAV,IAAI,CAACW,IAAI,CAAC;MAAER,IAAI;MAAEC;IAAQ,CAAC,CAAC;EAC9B,CAAC,CAAC;EACF,OAAOJ,IAAI;AACb;AAOO,MAAMY,0BAA0B,CAAC;EAC9BC,OAAO,GAAiC,EAAE;EAE3CC,kBAAkBA,CACvBC,kBAAgD,EAC7B;IACnB,IAAIC,SAAS,GAAGD,kBAAkB,CAACE,MAAM,GAAG,IAAI,CAACJ,OAAO,CAACI,MAAM;IAC/D,IAAI,CAACD,SAAS,EAAE;MACd,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAACL,OAAO,CAACI,MAAM,EAAEC,CAAC,EAAE,EAAE;QAC5C,IAAIC,IAAI,CAACC,SAAS,CAAC,IAAI,CAACP,OAAO,CAACK,CAAC,CAAC,CAAC,KAAKC,IAAI,CAACC,SAAS,CAACL,kBAAkB,CAACG,CAAC,CAAC,CAAC,EAAE;UAC7EF,SAAS,GAAG,IAAI;UAChB;QACF;MACF;IACF;IAEA,IAAIA,SAAS,EAAE;MACb,OAAO;QAAEK,WAAW,EAAEN,kBAAkB;QAAEO,aAAa,EAAE;MAAK,CAAC;IACjE;IAEA,MAAMD,WAAW,GAAGN,kBAAkB,CAACQ,KAAK,CAAC,IAAI,CAACV,OAAO,CAACI,MAAM,CAAC;IACjE,OAAO;MAAEI,WAAW;MAAEC,aAAa,EAAE;IAAM,CAAC;EAC9C;EAEOE,MAAMA,CACXH,WAAyC,EACzCI,iBAA6C,EAC7C;IACA,IAAI,CAACZ,OAAO,CAACF,IAAI,CAAC,GAAGU,WAAW,EAAEI,iBAAiB,CAAC;EACtD;EAEOC,KAAKA,CAAA,EAAG;IACb,IAAI,CAACb,OAAO,GAAG,EAAE;EACnB;AACF;AAACc,OAAA,CAAAf,0BAAA,GAAAA,0BAAA","ignoreList":[]}
@@ -27,8 +27,6 @@ var _exportNames = {
27
27
  releaseVocoder: true,
28
28
  tokenize: true,
29
29
  getDeviceInfo: true,
30
- SchemaGrammarConverter: true,
31
- convertJsonSchemaToGrammar: true,
32
30
  Tools: true,
33
31
  CactusLM: true,
34
32
  CactusVLM: true,
@@ -53,12 +51,6 @@ Object.defineProperty(exports, "CactusVLM", {
53
51
  }
54
52
  });
55
53
  exports.LlamaContext = void 0;
56
- Object.defineProperty(exports, "SchemaGrammarConverter", {
57
- enumerable: true,
58
- get: function () {
59
- return _grammar.SchemaGrammarConverter;
60
- }
61
- });
62
54
  Object.defineProperty(exports, "Tools", {
63
55
  enumerable: true,
64
56
  get: function () {
@@ -66,12 +58,6 @@ Object.defineProperty(exports, "Tools", {
66
58
  }
67
59
  });
68
60
  exports.addNativeLogListener = addNativeLogListener;
69
- Object.defineProperty(exports, "convertJsonSchemaToGrammar", {
70
- enumerable: true,
71
- get: function () {
72
- return _grammar.convertJsonSchemaToGrammar;
73
- }
74
- });
75
61
  exports.initContext = exports.getTTSType = exports.getFormattedAudioCompletion = exports.getDeviceInfo = exports.getAudioCompletionGuideTokens = exports.decodeAudioTokens = void 0;
76
62
  exports.initLlama = initLlama;
77
63
  exports.isVocoderEnabled = exports.isMultimodalSupportVision = exports.isMultimodalSupportAudio = exports.isMultimodalEnabled = exports.initVocoder = exports.initMultimodal = void 0;
@@ -84,7 +70,6 @@ exports.toggleNativeLog = toggleNativeLog;
84
70
  exports.tokenize = void 0;
85
71
  var _reactNative = require("react-native");
86
72
  var _NativeCactus = _interopRequireDefault(require("./NativeCactus"));
87
- var _grammar = require("./grammar");
88
73
  var _chat = require("./chat");
89
74
  var _tools = require("./tools");
90
75
  var _telemetry = require("./telemetry");
@@ -202,7 +187,6 @@ class LlamaContext {
202
187
  return this.completion(params, callback);
203
188
  }
204
189
  if (recursionCount >= recursionLimit) {
205
- // console.log(`Recursion limit reached (${recursionCount}/${recursionLimit}), returning default completion`)
206
190
  return this.completion({
207
191
  ...params,
208
192
  jinja: true,
@@ -211,15 +195,12 @@ class LlamaContext {
211
195
  }
212
196
  const messages = [...params.messages]; // avoid mutating the original messages
213
197
 
214
- // console.log('Calling completion...')
215
198
  const result = await this.completion({
216
199
  ...params,
217
200
  messages: messages,
218
201
  jinja: true,
219
202
  tools: params.tools.getSchemas()
220
203
  }, callback);
221
- // console.log('Completion result:', result);
222
-
223
204
  const {
224
205
  toolCalled,
225
206
  toolName,
@@ -240,9 +221,6 @@ class LlamaContext {
240
221
  tool_call_id: toolCallId
241
222
  };
242
223
  messages.push(toolMessage);
243
-
244
- // console.log('Messages being sent to next completion:', JSON.stringify(messages, null, 2));
245
-
246
224
  return await this.completionWithTools({
247
225
  ...params,
248
226
  messages: messages
@@ -370,7 +348,6 @@ class LlamaContext {
370
348
  return _NativeCactus.default.releaseContext(this.id);
371
349
  }
372
350
  async rewind() {
373
- // @ts-ignore
374
351
  return _NativeCactus.default.rewind(this.id);
375
352
  }
376
353
  }