cactus-react-native 1.0.1 → 1.1.0

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 (128) hide show
  1. package/README.md +609 -56
  2. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusCrypto.kt +23 -15
  3. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusDeviceInfo.kt +12 -9
  4. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusFileSystem.kt +42 -41
  5. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusImage.kt +81 -0
  6. package/android/src/main/jniLibs/arm64-v8a/libcactus.a +0 -0
  7. package/cpp/HybridCactus.cpp +161 -44
  8. package/cpp/HybridCactus.hpp +34 -14
  9. package/cpp/HybridCactusUtil.cpp +13 -11
  10. package/cpp/HybridCactusUtil.hpp +9 -9
  11. package/cpp/cactus_ffi.h +28 -1
  12. package/ios/HybridCactusImage.swift +53 -0
  13. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus_ffi.h +28 -1
  14. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/engine.h +237 -7
  15. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ffi_utils.h +158 -43
  16. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/graph.h +23 -2
  17. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/kernel.h +52 -0
  18. package/ios/cactus.xcframework/ios-arm64/cactus.framework/cactus +0 -0
  19. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/cactus_ffi.h +28 -1
  20. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/engine.h +237 -7
  21. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/ffi_utils.h +158 -43
  22. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/graph.h +23 -2
  23. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/kernel.h +52 -0
  24. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/cactus +0 -0
  25. package/lib/module/api/Database.js +23 -0
  26. package/lib/module/api/Database.js.map +1 -1
  27. package/lib/module/api/RemoteLM.js +201 -0
  28. package/lib/module/api/RemoteLM.js.map +1 -0
  29. package/lib/module/classes/CactusLM.js +56 -28
  30. package/lib/module/classes/CactusLM.js.map +1 -1
  31. package/lib/module/classes/CactusSTT.js +137 -0
  32. package/lib/module/classes/CactusSTT.js.map +1 -0
  33. package/lib/module/config/CactusConfig.js +4 -0
  34. package/lib/module/config/CactusConfig.js.map +1 -1
  35. package/lib/module/constants/packageVersion.js +1 -1
  36. package/lib/module/hooks/useCactusLM.js +44 -16
  37. package/lib/module/hooks/useCactusLM.js.map +1 -1
  38. package/lib/module/hooks/useCactusSTT.js +234 -0
  39. package/lib/module/hooks/useCactusSTT.js.map +1 -0
  40. package/lib/module/index.js +2 -0
  41. package/lib/module/index.js.map +1 -1
  42. package/lib/module/native/Cactus.js +52 -3
  43. package/lib/module/native/Cactus.js.map +1 -1
  44. package/lib/module/native/CactusFileSystem.js +2 -3
  45. package/lib/module/native/CactusFileSystem.js.map +1 -1
  46. package/lib/module/native/CactusImage.js +13 -0
  47. package/lib/module/native/CactusImage.js.map +1 -0
  48. package/lib/module/native/index.js +1 -0
  49. package/lib/module/native/index.js.map +1 -1
  50. package/lib/module/specs/CactusImage.nitro.js +4 -0
  51. package/lib/module/specs/CactusImage.nitro.js.map +1 -0
  52. package/lib/module/telemetry/Telemetry.js +53 -1
  53. package/lib/module/telemetry/Telemetry.js.map +1 -1
  54. package/lib/module/types/CactusSTT.js +2 -0
  55. package/lib/module/types/CactusSTT.js.map +1 -0
  56. package/lib/typescript/src/api/Database.d.ts +1 -0
  57. package/lib/typescript/src/api/Database.d.ts.map +1 -1
  58. package/lib/typescript/src/api/RemoteLM.d.ts +14 -0
  59. package/lib/typescript/src/api/RemoteLM.d.ts.map +1 -0
  60. package/lib/typescript/src/classes/CactusLM.d.ts +8 -5
  61. package/lib/typescript/src/classes/CactusLM.d.ts.map +1 -1
  62. package/lib/typescript/src/classes/CactusSTT.d.ts +25 -0
  63. package/lib/typescript/src/classes/CactusSTT.d.ts.map +1 -0
  64. package/lib/typescript/src/config/CactusConfig.d.ts +1 -0
  65. package/lib/typescript/src/config/CactusConfig.d.ts.map +1 -1
  66. package/lib/typescript/src/constants/packageVersion.d.ts +1 -1
  67. package/lib/typescript/src/hooks/useCactusLM.d.ts +5 -4
  68. package/lib/typescript/src/hooks/useCactusLM.d.ts.map +1 -1
  69. package/lib/typescript/src/hooks/useCactusSTT.d.ts +20 -0
  70. package/lib/typescript/src/hooks/useCactusSTT.d.ts.map +1 -0
  71. package/lib/typescript/src/index.d.ts +4 -1
  72. package/lib/typescript/src/index.d.ts.map +1 -1
  73. package/lib/typescript/src/native/Cactus.d.ts +10 -3
  74. package/lib/typescript/src/native/Cactus.d.ts.map +1 -1
  75. package/lib/typescript/src/native/CactusFileSystem.d.ts +1 -1
  76. package/lib/typescript/src/native/CactusFileSystem.d.ts.map +1 -1
  77. package/lib/typescript/src/native/CactusImage.d.ts +6 -0
  78. package/lib/typescript/src/native/CactusImage.d.ts.map +1 -0
  79. package/lib/typescript/src/native/index.d.ts +1 -0
  80. package/lib/typescript/src/native/index.d.ts.map +1 -1
  81. package/lib/typescript/src/specs/Cactus.nitro.d.ts +4 -1
  82. package/lib/typescript/src/specs/Cactus.nitro.d.ts.map +1 -1
  83. package/lib/typescript/src/specs/CactusImage.nitro.d.ts +9 -0
  84. package/lib/typescript/src/specs/CactusImage.nitro.d.ts.map +1 -0
  85. package/lib/typescript/src/telemetry/Telemetry.d.ts +5 -1
  86. package/lib/typescript/src/telemetry/Telemetry.d.ts.map +1 -1
  87. package/lib/typescript/src/types/CactusLM.d.ts +11 -6
  88. package/lib/typescript/src/types/CactusLM.d.ts.map +1 -1
  89. package/lib/typescript/src/types/CactusSTT.d.ts +37 -0
  90. package/lib/typescript/src/types/CactusSTT.d.ts.map +1 -0
  91. package/nitro.json +4 -0
  92. package/nitrogen/generated/android/c++/JHybridCactusImageSpec.cpp +81 -0
  93. package/nitrogen/generated/android/c++/JHybridCactusImageSpec.hpp +66 -0
  94. package/nitrogen/generated/android/cactus+autolinking.cmake +2 -0
  95. package/nitrogen/generated/android/cactusOnLoad.cpp +10 -0
  96. package/nitrogen/generated/android/kotlin/com/margelo/nitro/cactus/HybridCactusImageSpec.kt +62 -0
  97. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Bridge.cpp +17 -0
  98. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Bridge.hpp +17 -0
  99. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Umbrella.hpp +5 -0
  100. package/nitrogen/generated/ios/CactusAutolinking.mm +8 -0
  101. package/nitrogen/generated/ios/CactusAutolinking.swift +15 -0
  102. package/nitrogen/generated/ios/c++/HybridCactusImageSpecSwift.cpp +11 -0
  103. package/nitrogen/generated/ios/c++/HybridCactusImageSpecSwift.hpp +85 -0
  104. package/nitrogen/generated/ios/swift/HybridCactusImageSpec.swift +58 -0
  105. package/nitrogen/generated/ios/swift/HybridCactusImageSpec_cxx.swift +158 -0
  106. package/nitrogen/generated/shared/c++/HybridCactusImageSpec.cpp +22 -0
  107. package/nitrogen/generated/shared/c++/HybridCactusImageSpec.hpp +64 -0
  108. package/nitrogen/generated/shared/c++/HybridCactusSpec.cpp +3 -0
  109. package/nitrogen/generated/shared/c++/HybridCactusSpec.hpp +4 -1
  110. package/package.json +1 -1
  111. package/src/api/Database.ts +27 -0
  112. package/src/api/RemoteLM.ts +273 -0
  113. package/src/classes/CactusLM.ts +76 -40
  114. package/src/classes/CactusSTT.ts +182 -0
  115. package/src/config/CactusConfig.ts +4 -0
  116. package/src/constants/packageVersion.ts +1 -1
  117. package/src/hooks/useCactusLM.ts +53 -22
  118. package/src/hooks/useCactusSTT.ts +285 -0
  119. package/src/index.tsx +14 -2
  120. package/src/native/Cactus.ts +100 -6
  121. package/src/native/CactusFileSystem.ts +2 -2
  122. package/src/native/CactusImage.ts +20 -0
  123. package/src/native/index.ts +1 -0
  124. package/src/specs/Cactus.nitro.ts +14 -1
  125. package/src/specs/CactusImage.nitro.ts +12 -0
  126. package/src/telemetry/Telemetry.ts +78 -1
  127. package/src/types/CactusLM.ts +12 -6
  128. package/src/types/CactusSTT.ts +42 -0
@@ -28,10 +28,11 @@ enum class OpType {
28
28
  INPUT, PRECISION_CAST,
29
29
  ADD, ADD_CLIPPED, SUBTRACT, MULTIPLY, DIVIDE,
30
30
  MATMUL, TRANSPOSE, RESHAPE, SLICE, GATHER, EMBEDDING,
31
+ BILINEAR_INTERPOLATION,
31
32
  SUM, MEAN, VARIANCE, MIN, MAX,
32
- RMS_NORM, ROPE, SOFTMAX, ATTENTION, CONV1D_CAUSAL,
33
+ RMS_NORM, ROPE, SOFTMAX, ATTENTION, CONV1D_CAUSAL, CONV1D_K3,
33
34
  SCALAR_ADD, SCALAR_SUBTRACT, SCALAR_MULTIPLY, SCALAR_DIVIDE, SCALAR_EXP, SCALAR_SQRT, SCALAR_COS, SCALAR_SIN,
34
- SILU, GELU,
35
+ SILU, GELU, GELU_ERF,
35
36
  SAMPLE, CONCAT,
36
37
  SCATTER_TOPK,
37
38
  TOPK, LAYERNORM,
@@ -139,6 +140,7 @@ struct OpParams {
139
140
  ComputeBackend backend = ComputeBackend::CPU;
140
141
 
141
142
  size_t dilation = 1;
143
+ size_t stride = 1;
142
144
  float temperature = 1.0f;
143
145
  float top_p = 1.0f;
144
146
  size_t top_k = 0;
@@ -146,6 +148,8 @@ struct OpParams {
146
148
 
147
149
  size_t index_value = 0; // For INDEX operation
148
150
  size_t num_classes = 0; // For scatter operations
151
+ size_t dst_height = 0;
152
+ size_t dst_width = 0;
149
153
  };
150
154
 
151
155
  struct GraphNode {
@@ -187,6 +191,12 @@ namespace ValidationUtils {
187
191
  class CactusGraph {
188
192
  public:
189
193
  CactusGraph();
194
+
195
+ struct DebugNodeEntry {
196
+ uint32_t layer_idx;
197
+ std::string name;
198
+ size_t node_id;
199
+ };
190
200
 
191
201
  size_t input(const std::vector<size_t>& shape, Precision precision = Precision::INT8);
192
202
  size_t precision_cast(size_t input, Precision target_precision);
@@ -209,9 +219,11 @@ public:
209
219
 
210
220
  size_t silu(size_t input);
211
221
  size_t gelu(size_t input);
222
+ size_t gelu_erf(size_t input);
212
223
 
213
224
  size_t matmul(size_t input1, size_t input2, bool pretransposed_rhs = false, ComputeBackend backend = ComputeBackend::CPU);
214
225
  size_t transpose(size_t input, ComputeBackend backend = ComputeBackend::CPU);
226
+ size_t transposeN(size_t input, const std::vector<size_t>& permutation, ComputeBackend backend = ComputeBackend::CPU);
215
227
  size_t reshape(size_t input, const std::vector<size_t>& new_shape);
216
228
  size_t slice(size_t input, int axis, size_t start, size_t length);
217
229
  size_t index(size_t input, size_t index_value, int dim);
@@ -225,9 +237,11 @@ public:
225
237
  size_t gather(size_t embeddings, size_t indices);
226
238
  size_t mmap_embeddings(const std::string& filename);
227
239
  size_t mmap_weights(const std::string& filename);
240
+ size_t load_weights(const std::string& filename);
228
241
  void set_quantization_scale(size_t node_id, float scale);
229
242
  size_t embedding(const std::string& filename, size_t indices);
230
243
  size_t embedding(size_t embedding_tensor, size_t indices);
244
+ size_t bilinear_interpolation(size_t pos_embeds, size_t dst_height, size_t dst_width);
231
245
 
232
246
  size_t layernorm(size_t input, size_t weight, size_t bias, float epsilon = 1e-5f);
233
247
  size_t topk(size_t input, size_t k);
@@ -239,6 +253,7 @@ public:
239
253
  size_t attention(size_t query, size_t key, size_t value, float scale, size_t position_offset, size_t window_size, ComputeBackend backend = ComputeBackend::CPU);
240
254
 
241
255
  size_t conv1d_causal(size_t input, size_t weight, size_t kernel_size, size_t dilation = 1);
256
+ size_t conv1d_k3(size_t input, size_t weight, size_t stride);
242
257
 
243
258
  size_t sample(size_t logits, float temperature = 0.6f, float top_p = 0.95f, size_t top_k = 20);
244
259
 
@@ -252,6 +267,11 @@ public:
252
267
  void execute(const std::string& profile_file = "");
253
268
  void hard_reset();
254
269
  void soft_reset();
270
+
271
+ void register_debug_node(uint32_t layer_idx, const std::string& name, size_t node_id);
272
+ void capture_debug_node(uint32_t layer_idx, const std::string& name, size_t node_id);
273
+ const std::vector<DebugNodeEntry>& get_debug_nodes() const;
274
+ void clear_debug_nodes();
255
275
 
256
276
  size_t add_node(OpType op_type, const std::vector<size_t>& inputs, const std::vector<size_t>& output_shape, const OpParams& params = {});
257
277
  const BufferDesc& get_output_buffer(size_t node_id) const;
@@ -265,6 +285,7 @@ private:
265
285
  size_t next_node_id_;
266
286
  std::vector<std::unique_ptr<GraphFile::MappedFile>> mapped_files_;
267
287
  std::unordered_map<std::string, size_t> weight_cache_;
288
+ std::vector<DebugNodeEntry> debug_nodes_;
268
289
  };
269
290
 
270
291
 
@@ -174,6 +174,15 @@ void cactus_gelu_f16(const __fp16* input, __fp16* output, size_t num_elements);
174
174
  void cactus_gelu_int8(const int8_t* input, int8_t* output, size_t num_elements,
175
175
  float input_scale, float output_scale);
176
176
 
177
+ void cactus_gelu_f32_erf(const float* input, float* output, size_t num_elements);
178
+ void cactus_gelu_f16_erf(const __fp16* input, __fp16* output, size_t num_elements);
179
+ void cactus_gelu_int8_erf(
180
+ const int8_t* input,
181
+ int8_t* output,
182
+ size_t num_elements,
183
+ float scale_in,
184
+ float scale_out);
185
+
177
186
 
178
187
  void cactus_attention_int8(const int8_t* queries, const int8_t* keys, const int8_t* values, int8_t* output,
179
188
  size_t batch_size, size_t seq_len, size_t kv_seq_len, size_t num_q_heads, size_t num_kv_heads,
@@ -225,6 +234,49 @@ void cactus_conv1d_causal_depthwise_int8(
225
234
  float weight_scale,
226
235
  float output_scale);
227
236
 
237
+ void cactus_conv1d_f32_k3(
238
+ const float* input,
239
+ const float* weight,
240
+ float* output,
241
+ size_t N,
242
+ size_t L,
243
+ size_t C_in,
244
+ size_t C_out,
245
+ size_t stride
246
+ );
247
+
248
+ void cactus_conv1d_f16_k3(
249
+ const __fp16* input,
250
+ const __fp16* weight,
251
+ __fp16* output,
252
+ size_t N,
253
+ size_t L,
254
+ size_t C_in,
255
+ size_t C_out,
256
+ size_t stride
257
+ );
258
+
259
+ void cactus_conv1d_f32_k3(
260
+ const float* input,
261
+ const float* weight,
262
+ float* output,
263
+ size_t N, size_t L,
264
+ size_t C_in, size_t C_out,
265
+ size_t stride
266
+ );
267
+
268
+ void cactus_conv1d_f16_k3(
269
+ const __fp16* input,
270
+ const __fp16* weight,
271
+ __fp16* output,
272
+ size_t N, size_t L,
273
+ size_t C_in, size_t C_out,
274
+ size_t stride
275
+ );
276
+
277
+ void cactus_bilinear_interpolation_fp32(const float* input, float* output, size_t src_height, size_t src_width, size_t embed_dim,
278
+ size_t dst_height, size_t dst_width);
279
+
228
280
  void cactus_sample_f32(const float* logits, uint32_t* output, size_t vocab_size,
229
281
  float temperature, float top_p, size_t top_k, size_t random_seed);
230
282
  void cactus_sample_f16(const __fp16* logits, uint32_t* output, size_t vocab_size,
@@ -33,6 +33,29 @@ export class Database {
33
33
  }
34
34
  return await CactusUtil.registerApp(await response.text());
35
35
  }
36
+ static async getModel(slug) {
37
+ const response = await fetch(`${this.url}/functions/v1/get-models?slug=${slug}&sdk_name=react&sdk_version=${packageVersion}`, {
38
+ headers: {
39
+ apikey: this.key,
40
+ Authorization: `Bearer ${this.key}`
41
+ }
42
+ });
43
+ if (!response.ok) {
44
+ throw new Error('Getting model failed');
45
+ }
46
+ const model = await response.json();
47
+ return {
48
+ name: model.name,
49
+ slug: model.slug,
50
+ quantization: model.quantization,
51
+ sizeMb: model.size_mb,
52
+ downloadUrl: model.download_url,
53
+ supportsToolCalling: model.supports_tool_calling,
54
+ supportsVision: model.supports_vision,
55
+ createdAt: model.created_at,
56
+ isDownloaded: false
57
+ };
58
+ }
36
59
  static async getModels() {
37
60
  const response = await fetch(`${this.url}/functions/v1/get-models?sdk_name=react&sdk_version=${packageVersion}`, {
38
61
  headers: {
@@ -1 +1 @@
1
- {"version":3,"names":["CactusUtil","packageVersion","Database","url","key","sendLogRecords","records","response","fetch","method","headers","body","JSON","stringify","ok","Error","registerDevice","device_data","registerApp","text","getModels","apikey","Authorization","models","json","map","model","name","slug","quantization","sizeMb","size_mb","downloadUrl","download_url","supportsToolCalling","supports_tool_calling","supportsVision","supports_vision","createdAt","created_at","isDownloaded"],"sourceRoot":"../../../src","sources":["api/Database.ts"],"mappings":";;AAAA,SAASA,UAAU,QAAQ,oBAAW;AAGtC,SAASC,cAAc,QAAQ,gCAA6B;AAc5D,OAAO,MAAMC,QAAQ,CAAC;EACpB,OAAwBC,GAAG,GAAG,0CAA0C;EACxE,OAAwBC,GAAG,GACzB,kNAAkN;EAEpN,aAAoBC,cAAcA,CAACC,OAAoB,EAAiB;IACtE,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAAC,GAAG,IAAI,CAACL,GAAG,eAAe,EAAE;MACvDM,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE;QACP,QAAQ,EAAE,IAAI,CAACN,GAAG;QAClB,eAAe,EAAE,UAAU,IAAI,CAACA,GAAG,EAAE;QACrC,cAAc,EAAE,kBAAkB;QAClC,iBAAiB,EAAE,QAAQ;QAC3B,QAAQ,EAAE;MACZ,CAAC;MACDO,IAAI,EAAEC,IAAI,CAACC,SAAS,CAACP,OAAO;IAC9B,CAAC,CAAC;IAEF,IAAI,CAACC,QAAQ,CAACO,EAAE,EAAE;MAChB,MAAM,IAAIC,KAAK,CAAC,qBAAqB,CAAC;IACxC;EACF;EAEA,aAAoBC,cAAcA,CAACC,WAAuB,EAAmB;IAC3E,MAAMV,QAAQ,GAAG,MAAMC,KAAK,CAC1B,GAAG,IAAI,CAACL,GAAG,mCAAmC,EAC9C;MACEM,MAAM,EAAE,MAAM;MACdE,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;QAAEI;MAAY,CAAC;IACtC,CACF,CAAC;IAED,IAAI,CAACV,QAAQ,CAACO,EAAE,EAAE;MAChB,MAAM,IAAIC,KAAK,CAAC,2BAA2B,CAAC;IAC9C;IAEA,OAAO,MAAMf,UAAU,CAACkB,WAAW,CAAC,MAAMX,QAAQ,CAACY,IAAI,CAAC,CAAC,CAAC;EAC5D;EAEA,aAAoBC,SAASA,CAAA,EAA2B;IACtD,MAAMb,QAAQ,GAAG,MAAMC,KAAK,CAC1B,GAAG,IAAI,CAACL,GAAG,uDAAuDF,cAAc,EAAE,EAClF;MACES,OAAO,EAAE;QAAEW,MAAM,EAAE,IAAI,CAACjB,GAAG;QAAEkB,aAAa,EAAE,UAAU,IAAI,CAAClB,GAAG;MAAG;IACnE,CACF,CAAC;IAED,IAAI,CAACG,QAAQ,CAACO,EAAE,EAAE;MAChB,MAAM,IAAIC,KAAK,CAAC,uBAAuB,CAAC;IAC1C;IAEA,MAAMQ,MAAM,GAAI,MAAMhB,QAAQ,CAACiB,IAAI,CAAC,CAA2B;IAE/D,OAAOD,MAAM,CAACE,GAAG,CAAEC,KAAK,KAAM;MAC5BC,IAAI,EAAED,KAAK,CAACC,IAAI;MAChBC,IAAI,EAAEF,KAAK,CAACE,IAAI;MAChBC,YAAY,EAAEH,KAAK,CAACG,YAAY;MAChCC,MAAM,EAAEJ,KAAK,CAACK,OAAO;MACrBC,WAAW,EAAEN,KAAK,CAACO,YAAY;MAC/BC,mBAAmB,EAAER,KAAK,CAACS,qBAAqB;MAChDC,cAAc,EAAEV,KAAK,CAACW,eAAe;MACrCC,SAAS,EAAEZ,KAAK,CAACa,UAAU;MAC3BC,YAAY,EAAE;IAChB,CAAC,CAAC,CAAC;EACL;AACF","ignoreList":[]}
1
+ {"version":3,"names":["CactusUtil","packageVersion","Database","url","key","sendLogRecords","records","response","fetch","method","headers","body","JSON","stringify","ok","Error","registerDevice","device_data","registerApp","text","getModel","slug","apikey","Authorization","model","json","name","quantization","sizeMb","size_mb","downloadUrl","download_url","supportsToolCalling","supports_tool_calling","supportsVision","supports_vision","createdAt","created_at","isDownloaded","getModels","models","map"],"sourceRoot":"../../../src","sources":["api/Database.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+
3
+ import { CactusConfig } from "../config/CactusConfig.js";
4
+ import { CactusImage } from "../native/CactusImage.js";
5
+ export class RemoteLM {
6
+ static completionsUrl = 'https://openrouter.ai/api/v1/chat/completions';
7
+ static defaultModel = 'google/gemini-2.5-flash-lite';
8
+ static async complete(messages, options, tools, callback) {
9
+ if (!CactusConfig.cactusToken) {
10
+ throw new Error('cactusToken is required for hybrid completions');
11
+ }
12
+ const payload = JSON.stringify({
13
+ model: this.defaultModel,
14
+ messages: await this.transformMessages(messages),
15
+ tools,
16
+ temperature: options?.temperature,
17
+ top_p: options?.topP,
18
+ top_k: options?.topK,
19
+ max_tokens: options?.maxTokens,
20
+ stop: options?.stopSequences,
21
+ stream: !!callback
22
+ });
23
+ return callback ? await this.streamXHR(payload, callback) : await this.nonStreamFetch(payload);
24
+ }
25
+ static getMimeType(filePath) {
26
+ const extension = filePath.toLowerCase().split('.').pop();
27
+ switch (extension) {
28
+ case 'jpg':
29
+ case 'jpeg':
30
+ return 'image/jpeg';
31
+ case 'png':
32
+ return 'image/png';
33
+ case 'gif':
34
+ return 'image/gif';
35
+ case 'webp':
36
+ return 'image/webp';
37
+ default:
38
+ throw new Error(`Unsupported image format: .${extension}`);
39
+ }
40
+ }
41
+ static async transformMessages(messages) {
42
+ const transformedMessages = [];
43
+ for (const message of messages) {
44
+ const content = [];
45
+ if (message.content) {
46
+ content.push({
47
+ type: 'text',
48
+ text: message.content
49
+ });
50
+ }
51
+ if (message.images) {
52
+ for (const image of message.images) {
53
+ const imagePath = image.replace('file://', '');
54
+ const mimeType = this.getMimeType(imagePath);
55
+ const base64Data = await CactusImage.base64(imagePath);
56
+ content.push({
57
+ type: 'image_url',
58
+ image_url: {
59
+ url: `data:${mimeType};base64,${base64Data}`
60
+ }
61
+ });
62
+ }
63
+ }
64
+ transformedMessages.push({
65
+ role: message.role,
66
+ content
67
+ });
68
+ }
69
+ return transformedMessages;
70
+ }
71
+ static streamXHR(payload, callback) {
72
+ return new Promise((resolve, reject) => {
73
+ const xhr = new XMLHttpRequest();
74
+ xhr.timeout = 3 * 60 * 1000; // 3 minutes
75
+ xhr.ontimeout = () => reject(new Error('Remote streaming completion timed out'));
76
+ xhr.open('POST', this.completionsUrl);
77
+ xhr.setRequestHeader('Authorization', `Bearer ${CactusConfig.cactusToken}`);
78
+ xhr.setRequestHeader('HTTP-Referer', 'https://cactuscompute.com');
79
+ xhr.setRequestHeader('X-Title', 'Cactus React Native SDK');
80
+ xhr.setRequestHeader('Content-Type', 'application/json');
81
+ const startTime = performance.now();
82
+ let lastIndex = 0;
83
+ let buffer = '';
84
+ let response = '';
85
+ let toolCalls;
86
+ let timeToFirstTokenMs = 0;
87
+ let prefillTokens = 0;
88
+ let decodeTokens = 0;
89
+ let totalTokens = 0;
90
+ xhr.onprogress = () => {
91
+ const chunk = xhr.responseText.substring(lastIndex);
92
+ lastIndex = xhr.responseText.length;
93
+ buffer += chunk;
94
+ const lines = buffer.split('\n');
95
+ buffer = lines.pop() || '';
96
+ for (const line of lines) {
97
+ if (!line.startsWith('data: ')) {
98
+ continue;
99
+ }
100
+ const jsonStr = line.slice(6).trim();
101
+ if (jsonStr === '[DONE]') {
102
+ continue;
103
+ }
104
+ try {
105
+ const data = JSON.parse(jsonStr);
106
+ if (timeToFirstTokenMs === 0) {
107
+ timeToFirstTokenMs = performance.now() - startTime;
108
+ }
109
+ const toolCallChunks = data?.choices?.[0]?.delta?.tool_calls;
110
+ if (toolCallChunks) {
111
+ if (!toolCalls) {
112
+ toolCalls = [];
113
+ }
114
+ for (const toolCallChunk of toolCallChunks) {
115
+ const index = toolCallChunk.index;
116
+ if (!toolCalls[index]) {
117
+ toolCalls[index] = {
118
+ name: '',
119
+ arguments: ''
120
+ };
121
+ }
122
+ if (toolCallChunk.function?.name) {
123
+ toolCalls[index].name = toolCallChunk.function.name;
124
+ }
125
+ if (toolCallChunk.function?.arguments) {
126
+ toolCalls[index].arguments += toolCallChunk.function.arguments;
127
+ }
128
+ }
129
+ }
130
+ const content = data?.choices?.[0]?.delta?.content;
131
+ if (content) {
132
+ response += content;
133
+ callback(content);
134
+ }
135
+ if (data?.usage) {
136
+ prefillTokens = data.usage.prompt_tokens;
137
+ decodeTokens = data.usage.completion_tokens;
138
+ totalTokens = data.usage.total_tokens;
139
+ }
140
+ } catch {}
141
+ }
142
+ };
143
+ xhr.onload = () => {
144
+ const totalTimeMs = performance.now() - startTime;
145
+ const functionCalls = toolCalls?.map(toolCall => ({
146
+ name: toolCall.name,
147
+ arguments: JSON.parse(toolCall.arguments)
148
+ }));
149
+ resolve({
150
+ success: true,
151
+ response,
152
+ functionCalls,
153
+ timeToFirstTokenMs,
154
+ totalTimeMs,
155
+ tokensPerSecond: decodeTokens * 1000 / totalTimeMs,
156
+ prefillTokens,
157
+ decodeTokens,
158
+ totalTokens
159
+ });
160
+ };
161
+ xhr.onerror = () => reject(new Error('Remote streaming completion failed'));
162
+ xhr.send(payload);
163
+ });
164
+ }
165
+ static async nonStreamFetch(payload) {
166
+ const startTime = performance.now();
167
+ const request = await fetch(this.completionsUrl, {
168
+ method: 'POST',
169
+ headers: {
170
+ 'Authorization': `Bearer ${CactusConfig.cactusToken}`,
171
+ 'HTTP-Referer': 'https://cactuscompute.com',
172
+ 'X-Title': 'Cactus React Native SDK',
173
+ 'Content-Type': 'application/json'
174
+ },
175
+ body: payload
176
+ });
177
+ if (!request.ok) {
178
+ throw new Error('Remote completion failed');
179
+ }
180
+ const data = await request.json();
181
+ const totalTimeMs = performance.now() - startTime;
182
+ const decodeTokens = data.usage.completion_tokens;
183
+ const toolCalls = data.choices[0].message.tool_calls;
184
+ const functionCalls = toolCalls?.map(toolCall => ({
185
+ name: toolCall.function.name,
186
+ arguments: toolCall.function.arguments
187
+ }));
188
+ return {
189
+ success: true,
190
+ response: data.choices[0].message.content,
191
+ functionCalls,
192
+ timeToFirstTokenMs: totalTimeMs,
193
+ totalTimeMs,
194
+ tokensPerSecond: decodeTokens * 1000 / totalTimeMs,
195
+ prefillTokens: data.usage.prompt_tokens,
196
+ decodeTokens,
197
+ totalTokens: data.usage.total_tokens
198
+ };
199
+ }
200
+ }
201
+ //# sourceMappingURL=RemoteLM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CactusConfig","CactusImage","RemoteLM","completionsUrl","defaultModel","complete","messages","options","tools","callback","cactusToken","Error","payload","JSON","stringify","model","transformMessages","temperature","top_p","topP","top_k","topK","max_tokens","maxTokens","stop","stopSequences","stream","streamXHR","nonStreamFetch","getMimeType","filePath","extension","toLowerCase","split","pop","transformedMessages","message","content","push","type","text","images","image","imagePath","replace","mimeType","base64Data","base64","image_url","url","role","Promise","resolve","reject","xhr","XMLHttpRequest","timeout","ontimeout","open","setRequestHeader","startTime","performance","now","lastIndex","buffer","response","toolCalls","timeToFirstTokenMs","prefillTokens","decodeTokens","totalTokens","onprogress","chunk","responseText","substring","length","lines","line","startsWith","jsonStr","slice","trim","data","parse","toolCallChunks","choices","delta","tool_calls","toolCallChunk","index","name","arguments","function","usage","prompt_tokens","completion_tokens","total_tokens","onload","totalTimeMs","functionCalls","map","toolCall","success","tokensPerSecond","onerror","send","request","fetch","method","headers","body","ok","json"],"sourceRoot":"../../../src","sources":["api/RemoteLM.ts"],"mappings":"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","ignoreList":[]}
@@ -5,6 +5,7 @@ import { Telemetry } from "../telemetry/Telemetry.js";
5
5
  import { CactusConfig } from "../config/CactusConfig.js";
6
6
  import { Database } from "../api/Database.js";
7
7
  import { getErrorMessage } from "../utils/error.js";
8
+ import { RemoteLM } from "../api/RemoteLM.js";
8
9
  export class CactusLM {
9
10
  cactus = new Cactus();
10
11
  isDownloading = false;
@@ -15,14 +16,18 @@ export class CactusLM {
15
16
  static defaultCompleteOptions = {
16
17
  maxTokens: 512
17
18
  };
19
+ static defaultCompleteMode = 'local';
18
20
  static defaultEmbedBufferSize = 2048;
19
- static modelsInfoPath = 'models/info.json';
21
+ static cactusModelsCache = null;
20
22
  constructor({
21
23
  model,
22
- contextSize
24
+ contextSize,
25
+ corpusDir
23
26
  } = {}) {
27
+ Telemetry.init(CactusConfig.telemetryToken);
24
28
  this.model = model ?? CactusLM.defaultModel;
25
29
  this.contextSize = contextSize ?? CactusLM.defaultContextSize;
30
+ this.corpusDir = corpusDir;
26
31
  }
27
32
  async download({
28
33
  onProgress
@@ -36,10 +41,8 @@ export class CactusLM {
36
41
  }
37
42
  this.isDownloading = true;
38
43
  try {
39
- await CactusFileSystem.downloadModel(this.model, onProgress);
40
- await this.getModels({
41
- forceRefresh: true
42
- });
44
+ const model = await Database.getModel(this.model);
45
+ await CactusFileSystem.downloadModel(this.model, model.downloadUrl, onProgress);
43
46
  } finally {
44
47
  this.isDownloading = false;
45
48
  }
@@ -48,15 +51,12 @@ export class CactusLM {
48
51
  if (this.isInitialized) {
49
52
  return;
50
53
  }
51
- if (!Telemetry.isInitialized()) {
52
- await Telemetry.init(CactusConfig.telemetryToken);
53
- }
54
54
  if (!(await CactusFileSystem.modelExists(this.model))) {
55
55
  throw new Error(`Model "${this.model}" is not downloaded`);
56
56
  }
57
57
  const modelPath = await CactusFileSystem.getModelPath(this.model);
58
58
  try {
59
- await this.cactus.init(modelPath, this.contextSize);
59
+ await this.cactus.init(modelPath, this.contextSize, this.corpusDir);
60
60
  Telemetry.logInit(this.model, true);
61
61
  this.isInitialized = true;
62
62
  } catch (error) {
@@ -68,25 +68,39 @@ export class CactusLM {
68
68
  messages,
69
69
  options,
70
70
  tools,
71
- onToken
71
+ onToken,
72
+ mode
72
73
  }) {
73
74
  if (this.isGenerating) {
74
75
  throw new Error('CactusLM is already generating');
75
76
  }
76
- await this.init();
77
77
  options = {
78
78
  ...CactusLM.defaultCompleteOptions,
79
79
  ...options
80
80
  };
81
+ const toolsInternal = tools?.map(tool => ({
82
+ type: 'function',
83
+ function: tool
84
+ }));
85
+ mode = mode ?? CactusLM.defaultCompleteMode;
81
86
  const responseBufferSize = 8 * (options.maxTokens ?? CactusLM.defaultCompleteOptions.maxTokens) + 256;
82
- this.isGenerating = true;
83
87
  try {
84
- const result = await this.cactus.complete(messages, responseBufferSize, options, tools, onToken);
88
+ await this.init();
89
+ this.isGenerating = true;
90
+ const result = await this.cactus.complete(messages, responseBufferSize, options, toolsInternal, onToken);
85
91
  Telemetry.logCompletion(this.model, result.success, result.success ? undefined : result.response, result);
86
92
  return result;
87
- } catch (error) {
88
- Telemetry.logCompletion(this.model, false, getErrorMessage(error));
89
- throw error;
93
+ } catch (localError) {
94
+ if (mode === 'local') {
95
+ Telemetry.logCompletion(this.model, false, getErrorMessage(localError));
96
+ throw localError;
97
+ }
98
+ Telemetry.logCompletion(this.model, false, `Local completion error: ${getErrorMessage(localError)}. Falling back to remote completion.`);
99
+ try {
100
+ return RemoteLM.complete(messages, options, toolsInternal, onToken);
101
+ } catch (remoteError) {
102
+ throw new Error(`Remote completion error: ${getErrorMessage(remoteError)}`);
103
+ }
90
104
  } finally {
91
105
  this.isGenerating = false;
92
106
  }
@@ -112,6 +126,27 @@ export class CactusLM {
112
126
  this.isGenerating = false;
113
127
  }
114
128
  }
129
+ async imageEmbed({
130
+ imagePath
131
+ }) {
132
+ if (this.isGenerating) {
133
+ throw new Error('CactusLM is already generating');
134
+ }
135
+ await this.init();
136
+ this.isGenerating = true;
137
+ try {
138
+ const embedding = await this.cactus.imageEmbed(imagePath, CactusLM.defaultEmbedBufferSize);
139
+ Telemetry.logImageEmbedding(this.model, true);
140
+ return {
141
+ embedding
142
+ };
143
+ } catch (error) {
144
+ Telemetry.logImageEmbedding(this.model, false, getErrorMessage(error));
145
+ throw error;
146
+ } finally {
147
+ this.isGenerating = false;
148
+ }
149
+ }
115
150
  stop() {
116
151
  return this.cactus.stop();
117
152
  }
@@ -127,22 +162,15 @@ export class CactusLM {
127
162
  await this.cactus.destroy();
128
163
  this.isInitialized = false;
129
164
  }
130
- async getModels({
131
- forceRefresh = false
132
- } = {}) {
133
- if (!forceRefresh && (await CactusFileSystem.fileExists(CactusLM.modelsInfoPath))) {
134
- try {
135
- return JSON.parse(await CactusFileSystem.readFile(CactusLM.modelsInfoPath));
136
- } catch {
137
- // Delete corrupted models info
138
- await CactusFileSystem.deleteFile(CactusLM.modelsInfoPath);
139
- }
165
+ async getModels() {
166
+ if (CactusLM.cactusModelsCache) {
167
+ return CactusLM.cactusModelsCache;
140
168
  }
141
169
  const models = await Database.getModels();
142
170
  for (const model of models) {
143
171
  model.isDownloaded = await CactusFileSystem.modelExists(model.slug);
144
172
  }
145
- await CactusFileSystem.writeFile(CactusLM.modelsInfoPath, JSON.stringify(models));
173
+ CactusLM.cactusModelsCache = models;
146
174
  return models;
147
175
  }
148
176
  }
@@ -1 +1 @@
1
- {"version":3,"names":["Cactus","CactusFileSystem","Telemetry","CactusConfig","Database","getErrorMessage","CactusLM","cactus","isDownloading","isInitialized","isGenerating","defaultModel","defaultContextSize","defaultCompleteOptions","maxTokens","defaultEmbedBufferSize","modelsInfoPath","constructor","model","contextSize","download","onProgress","Error","modelExists","downloadModel","getModels","forceRefresh","init","telemetryToken","modelPath","getModelPath","logInit","error","complete","messages","options","tools","onToken","responseBufferSize","result","logCompletion","success","undefined","response","embed","text","embedding","logEmbedding","stop","reset","destroy","fileExists","JSON","parse","readFile","deleteFile","models","isDownloaded","slug","writeFile","stringify"],"sourceRoot":"../../../src","sources":["classes/CactusLM.ts"],"mappings":";;AAAA,SAASA,MAAM,EAAEC,gBAAgB,QAAQ,oBAAW;AAWpD,SAASC,SAAS,QAAQ,2BAAwB;AAClD,SAASC,YAAY,QAAQ,2BAAwB;AACrD,SAASC,QAAQ,QAAQ,oBAAiB;AAC1C,SAASC,eAAe,QAAQ,mBAAgB;AAEhD,OAAO,MAAMC,QAAQ,CAAC;EACHC,MAAM,GAAG,IAAIP,MAAM,CAAC,CAAC;EAK9BQ,aAAa,GAAG,KAAK;EACrBC,aAAa,GAAG,KAAK;EACrBC,YAAY,GAAG,KAAK;EAE5B,OAAwBC,YAAY,GAAG,WAAW;EAClD,OAAwBC,kBAAkB,GAAG,IAAI;EACjD,OAAwBC,sBAAsB,GAAG;IAC/CC,SAAS,EAAE;EACb,CAAC;EACD,OAAwBC,sBAAsB,GAAG,IAAI;EAErD,OAAwBC,cAAc,GAAG,kBAAkB;EAE3DC,WAAWA,CAAC;IAAEC,KAAK;IAAEC;EAA4B,CAAC,GAAG,CAAC,CAAC,EAAE;IACvD,IAAI,CAACD,KAAK,GAAGA,KAAK,IAAIZ,QAAQ,CAACK,YAAY;IAC3C,IAAI,CAACQ,WAAW,GAAGA,WAAW,IAAIb,QAAQ,CAACM,kBAAkB;EAC/D;EAEA,MAAaQ,QAAQA,CAAC;IACpBC;EACsB,CAAC,GAAG,CAAC,CAAC,EAAiB;IAC7C,IAAI,IAAI,CAACb,aAAa,EAAE;MACtB,MAAM,IAAIc,KAAK,CAAC,iCAAiC,CAAC;IACpD;IAEA,IAAI,MAAMrB,gBAAgB,CAACsB,WAAW,CAAC,IAAI,CAACL,KAAK,CAAC,EAAE;MAClDG,UAAU,GAAG,GAAG,CAAC;MACjB;IACF;IAEA,IAAI,CAACb,aAAa,GAAG,IAAI;IACzB,IAAI;MACF,MAAMP,gBAAgB,CAACuB,aAAa,CAAC,IAAI,CAACN,KAAK,EAAEG,UAAU,CAAC;MAC5D,MAAM,IAAI,CAACI,SAAS,CAAC;QAAEC,YAAY,EAAE;MAAK,CAAC,CAAC;IAC9C,CAAC,SAAS;MACR,IAAI,CAAClB,aAAa,GAAG,KAAK;IAC5B;EACF;EAEA,MAAamB,IAAIA,CAAA,EAAkB;IACjC,IAAI,IAAI,CAAClB,aAAa,EAAE;MACtB;IACF;IAEA,IAAI,CAACP,SAAS,CAACO,aAAa,CAAC,CAAC,EAAE;MAC9B,MAAMP,SAAS,CAACyB,IAAI,CAACxB,YAAY,CAACyB,cAAc,CAAC;IACnD;IAEA,IAAI,EAAE,MAAM3B,gBAAgB,CAACsB,WAAW,CAAC,IAAI,CAACL,KAAK,CAAC,CAAC,EAAE;MACrD,MAAM,IAAII,KAAK,CAAC,UAAU,IAAI,CAACJ,KAAK,qBAAqB,CAAC;IAC5D;IAEA,MAAMW,SAAS,GAAG,MAAM5B,gBAAgB,CAAC6B,YAAY,CAAC,IAAI,CAACZ,KAAK,CAAC;IAEjE,IAAI;MACF,MAAM,IAAI,CAACX,MAAM,CAACoB,IAAI,CAACE,SAAS,EAAE,IAAI,CAACV,WAAW,CAAC;MACnDjB,SAAS,CAAC6B,OAAO,CAAC,IAAI,CAACb,KAAK,EAAE,IAAI,CAAC;MACnC,IAAI,CAACT,aAAa,GAAG,IAAI;IAC3B,CAAC,CAAC,OAAOuB,KAAK,EAAE;MACd9B,SAAS,CAAC6B,OAAO,CAAC,IAAI,CAACb,KAAK,EAAE,KAAK,EAAEb,eAAe,CAAC2B,KAAK,CAAC,CAAC;MAC5D,MAAMA,KAAK;IACb;EACF;EAEA,MAAaC,QAAQA,CAAC;IACpBC,QAAQ;IACRC,OAAO;IACPC,KAAK;IACLC;EACsB,CAAC,EAAmC;IAC1D,IAAI,IAAI,CAAC3B,YAAY,EAAE;MACrB,MAAM,IAAIY,KAAK,CAAC,gCAAgC,CAAC;IACnD;IAEA,MAAM,IAAI,CAACK,IAAI,CAAC,CAAC;IAEjBQ,OAAO,GAAG;MAAE,GAAG7B,QAAQ,CAACO,sBAAsB;MAAE,GAAGsB;IAAQ,CAAC;IAC5D,MAAMG,kBAAkB,GACtB,CAAC,IAAIH,OAAO,CAACrB,SAAS,IAAIR,QAAQ,CAACO,sBAAsB,CAACC,SAAS,CAAC,GACpE,GAAG;IAEL,IAAI,CAACJ,YAAY,GAAG,IAAI;IACxB,IAAI;MACF,MAAM6B,MAAM,GAAG,MAAM,IAAI,CAAChC,MAAM,CAAC0B,QAAQ,CACvCC,QAAQ,EACRI,kBAAkB,EAClBH,OAAO,EACPC,KAAK,EACLC,OACF,CAAC;MACDnC,SAAS,CAACsC,aAAa,CACrB,IAAI,CAACtB,KAAK,EACVqB,MAAM,CAACE,OAAO,EACdF,MAAM,CAACE,OAAO,GAAGC,SAAS,GAAGH,MAAM,CAACI,QAAQ,EAC5CJ,MACF,CAAC;MACD,OAAOA,MAAM;IACf,CAAC,CAAC,OAAOP,KAAK,EAAE;MACd9B,SAAS,CAACsC,aAAa,CAAC,IAAI,CAACtB,KAAK,EAAE,KAAK,EAAEb,eAAe,CAAC2B,KAAK,CAAC,CAAC;MAClE,MAAMA,KAAK;IACb,CAAC,SAAS;MACR,IAAI,CAACtB,YAAY,GAAG,KAAK;IAC3B;EACF;EAEA,MAAakC,KAAKA,CAAC;IACjBC;EACmB,CAAC,EAAgC;IACpD,IAAI,IAAI,CAACnC,YAAY,EAAE;MACrB,MAAM,IAAIY,KAAK,CAAC,gCAAgC,CAAC;IACnD;IAEA,MAAM,IAAI,CAACK,IAAI,CAAC,CAAC;IAEjB,IAAI,CAACjB,YAAY,GAAG,IAAI;IACxB,IAAI;MACF,MAAMoC,SAAS,GAAG,MAAM,IAAI,CAACvC,MAAM,CAACqC,KAAK,CACvCC,IAAI,EACJvC,QAAQ,CAACS,sBACX,CAAC;MACDb,SAAS,CAAC6C,YAAY,CAAC,IAAI,CAAC7B,KAAK,EAAE,IAAI,CAAC;MACxC,OAAO;QAAE4B;MAAU,CAAC;IACtB,CAAC,CAAC,OAAOd,KAAK,EAAE;MACd9B,SAAS,CAAC6C,YAAY,CAAC,IAAI,CAAC7B,KAAK,EAAE,KAAK,EAAEb,eAAe,CAAC2B,KAAK,CAAC,CAAC;MACjE,MAAMA,KAAK;IACb,CAAC,SAAS;MACR,IAAI,CAACtB,YAAY,GAAG,KAAK;IAC3B;EACF;EAEOsC,IAAIA,CAAA,EAAkB;IAC3B,OAAO,IAAI,CAACzC,MAAM,CAACyC,IAAI,CAAC,CAAC;EAC3B;EAEA,MAAaC,KAAKA,CAAA,EAAkB;IAClC,MAAM,IAAI,CAACD,IAAI,CAAC,CAAC;IACjB,OAAO,IAAI,CAACzC,MAAM,CAAC0C,KAAK,CAAC,CAAC;EAC5B;EAEA,MAAaC,OAAOA,CAAA,EAAkB;IACpC,IAAI,CAAC,IAAI,CAACzC,aAAa,EAAE;MACvB;IACF;IAEA,MAAM,IAAI,CAACuC,IAAI,CAAC,CAAC;IACjB,MAAM,IAAI,CAACzC,MAAM,CAAC2C,OAAO,CAAC,CAAC;IAE3B,IAAI,CAACzC,aAAa,GAAG,KAAK;EAC5B;EAEA,MAAagB,SAASA,CAAC;IACrBC,YAAY,GAAG;EACQ,CAAC,GAAG,CAAC,CAAC,EAA0B;IACvD,IACE,CAACA,YAAY,KACZ,MAAMzB,gBAAgB,CAACkD,UAAU,CAAC7C,QAAQ,CAACU,cAAc,CAAC,CAAC,EAC5D;MACA,IAAI;QACF,OAAOoC,IAAI,CAACC,KAAK,CACf,MAAMpD,gBAAgB,CAACqD,QAAQ,CAAChD,QAAQ,CAACU,cAAc,CACzD,CAAC;MACH,CAAC,CAAC,MAAM;QACN;QACA,MAAMf,gBAAgB,CAACsD,UAAU,CAACjD,QAAQ,CAACU,cAAc,CAAC;MAC5D;IACF;IAEA,MAAMwC,MAAM,GAAG,MAAMpD,QAAQ,CAACqB,SAAS,CAAC,CAAC;IAEzC,KAAK,MAAMP,KAAK,IAAIsC,MAAM,EAAE;MAC1BtC,KAAK,CAACuC,YAAY,GAAG,MAAMxD,gBAAgB,CAACsB,WAAW,CAACL,KAAK,CAACwC,IAAI,CAAC;IACrE;IAEA,MAAMzD,gBAAgB,CAAC0D,SAAS,CAC9BrD,QAAQ,CAACU,cAAc,EACvBoC,IAAI,CAACQ,SAAS,CAACJ,MAAM,CACvB,CAAC;IAED,OAAOA,MAAM;EACf;AACF","ignoreList":[]}
1
+ {"version":3,"names":["Cactus","CactusFileSystem","Telemetry","CactusConfig","Database","getErrorMessage","RemoteLM","CactusLM","cactus","isDownloading","isInitialized","isGenerating","defaultModel","defaultContextSize","defaultCompleteOptions","maxTokens","defaultCompleteMode","defaultEmbedBufferSize","cactusModelsCache","constructor","model","contextSize","corpusDir","init","telemetryToken","download","onProgress","Error","modelExists","getModel","downloadModel","downloadUrl","modelPath","getModelPath","logInit","error","complete","messages","options","tools","onToken","mode","toolsInternal","map","tool","type","function","responseBufferSize","result","logCompletion","success","undefined","response","localError","remoteError","embed","text","embedding","logEmbedding","imageEmbed","imagePath","logImageEmbedding","stop","reset","destroy","getModels","models","isDownloaded","slug"],"sourceRoot":"../../../src","sources":["classes/CactusLM.ts"],"mappings":";;AAAA,SAASA,MAAM,EAAEC,gBAAgB,QAAQ,oBAAW;AAYpD,SAASC,SAAS,QAAQ,2BAAwB;AAClD,SAASC,YAAY,QAAQ,2BAAwB;AACrD,SAASC,QAAQ,QAAQ,oBAAiB;AAC1C,SAASC,eAAe,QAAQ,mBAAgB;AAChD,SAASC,QAAQ,QAAQ,oBAAiB;AAE1C,OAAO,MAAMC,QAAQ,CAAC;EACHC,MAAM,GAAG,IAAIR,MAAM,CAAC,CAAC;EAM9BS,aAAa,GAAG,KAAK;EACrBC,aAAa,GAAG,KAAK;EACrBC,YAAY,GAAG,KAAK;EAE5B,OAAwBC,YAAY,GAAG,WAAW;EAClD,OAAwBC,kBAAkB,GAAG,IAAI;EACjD,OAAwBC,sBAAsB,GAAG;IAC/CC,SAAS,EAAE;EACb,CAAC;EACD,OAAwBC,mBAAmB,GAAG,OAAO;EACrD,OAAwBC,sBAAsB,GAAG,IAAI;EAErD,OAAeC,iBAAiB,GAAyB,IAAI;EAE7DC,WAAWA,CAAC;IAAEC,KAAK;IAAEC,WAAW;IAAEC;EAA0B,CAAC,GAAG,CAAC,CAAC,EAAE;IAClEpB,SAAS,CAACqB,IAAI,CAACpB,YAAY,CAACqB,cAAc,CAAC;IAE3C,IAAI,CAACJ,KAAK,GAAGA,KAAK,IAAIb,QAAQ,CAACK,YAAY;IAC3C,IAAI,CAACS,WAAW,GAAGA,WAAW,IAAId,QAAQ,CAACM,kBAAkB;IAC7D,IAAI,CAACS,SAAS,GAAGA,SAAS;EAC5B;EAEA,MAAaG,QAAQA,CAAC;IACpBC;EACsB,CAAC,GAAG,CAAC,CAAC,EAAiB;IAC7C,IAAI,IAAI,CAACjB,aAAa,EAAE;MACtB,MAAM,IAAIkB,KAAK,CAAC,iCAAiC,CAAC;IACpD;IAEA,IAAI,MAAM1B,gBAAgB,CAAC2B,WAAW,CAAC,IAAI,CAACR,KAAK,CAAC,EAAE;MAClDM,UAAU,GAAG,GAAG,CAAC;MACjB;IACF;IAEA,IAAI,CAACjB,aAAa,GAAG,IAAI;IACzB,IAAI;MACF,MAAMW,KAAK,GAAG,MAAMhB,QAAQ,CAACyB,QAAQ,CAAC,IAAI,CAACT,KAAK,CAAC;MACjD,MAAMnB,gBAAgB,CAAC6B,aAAa,CAClC,IAAI,CAACV,KAAK,EACVA,KAAK,CAACW,WAAW,EACjBL,UACF,CAAC;IACH,CAAC,SAAS;MACR,IAAI,CAACjB,aAAa,GAAG,KAAK;IAC5B;EACF;EAEA,MAAac,IAAIA,CAAA,EAAkB;IACjC,IAAI,IAAI,CAACb,aAAa,EAAE;MACtB;IACF;IAEA,IAAI,EAAE,MAAMT,gBAAgB,CAAC2B,WAAW,CAAC,IAAI,CAACR,KAAK,CAAC,CAAC,EAAE;MACrD,MAAM,IAAIO,KAAK,CAAC,UAAU,IAAI,CAACP,KAAK,qBAAqB,CAAC;IAC5D;IAEA,MAAMY,SAAS,GAAG,MAAM/B,gBAAgB,CAACgC,YAAY,CAAC,IAAI,CAACb,KAAK,CAAC;IAEjE,IAAI;MACF,MAAM,IAAI,CAACZ,MAAM,CAACe,IAAI,CAACS,SAAS,EAAE,IAAI,CAACX,WAAW,EAAE,IAAI,CAACC,SAAS,CAAC;MACnEpB,SAAS,CAACgC,OAAO,CAAC,IAAI,CAACd,KAAK,EAAE,IAAI,CAAC;MACnC,IAAI,CAACV,aAAa,GAAG,IAAI;IAC3B,CAAC,CAAC,OAAOyB,KAAK,EAAE;MACdjC,SAAS,CAACgC,OAAO,CAAC,IAAI,CAACd,KAAK,EAAE,KAAK,EAAEf,eAAe,CAAC8B,KAAK,CAAC,CAAC;MAC5D,MAAMA,KAAK;IACb;EACF;EAEA,MAAaC,QAAQA,CAAC;IACpBC,QAAQ;IACRC,OAAO;IACPC,KAAK;IACLC,OAAO;IACPC;EACsB,CAAC,EAAmC;IAC1D,IAAI,IAAI,CAAC9B,YAAY,EAAE;MACrB,MAAM,IAAIgB,KAAK,CAAC,gCAAgC,CAAC;IACnD;IAEAW,OAAO,GAAG;MAAE,GAAG/B,QAAQ,CAACO,sBAAsB;MAAE,GAAGwB;IAAQ,CAAC;IAC5D,MAAMI,aAAa,GAAGH,KAAK,EAAEI,GAAG,CAAEC,IAAI,KAAM;MAC1CC,IAAI,EAAE,UAAmB;MACzBC,QAAQ,EAAEF;IACZ,CAAC,CAAC,CAAC;IACHH,IAAI,GAAGA,IAAI,IAAIlC,QAAQ,CAACS,mBAAmB;IAE3C,MAAM+B,kBAAkB,GACtB,CAAC,IAAIT,OAAO,CAACvB,SAAS,IAAIR,QAAQ,CAACO,sBAAsB,CAACC,SAAS,CAAC,GACpE,GAAG;IAEL,IAAI;MACF,MAAM,IAAI,CAACQ,IAAI,CAAC,CAAC;MAEjB,IAAI,CAACZ,YAAY,GAAG,IAAI;MACxB,MAAMqC,MAAM,GAAG,MAAM,IAAI,CAACxC,MAAM,CAAC4B,QAAQ,CACvCC,QAAQ,EACRU,kBAAkB,EAClBT,OAAO,EACPI,aAAa,EACbF,OACF,CAAC;MACDtC,SAAS,CAAC+C,aAAa,CACrB,IAAI,CAAC7B,KAAK,EACV4B,MAAM,CAACE,OAAO,EACdF,MAAM,CAACE,OAAO,GAAGC,SAAS,GAAGH,MAAM,CAACI,QAAQ,EAC5CJ,MACF,CAAC;MACD,OAAOA,MAAM;IACf,CAAC,CAAC,OAAOK,UAAU,EAAE;MACnB,IAAIZ,IAAI,KAAK,OAAO,EAAE;QACpBvC,SAAS,CAAC+C,aAAa,CAAC,IAAI,CAAC7B,KAAK,EAAE,KAAK,EAAEf,eAAe,CAACgD,UAAU,CAAC,CAAC;QACvE,MAAMA,UAAU;MAClB;MAEAnD,SAAS,CAAC+C,aAAa,CACrB,IAAI,CAAC7B,KAAK,EACV,KAAK,EACL,2BAA2Bf,eAAe,CAACgD,UAAU,CAAC,sCACxD,CAAC;MAED,IAAI;QACF,OAAO/C,QAAQ,CAAC8B,QAAQ,CAACC,QAAQ,EAAEC,OAAO,EAAEI,aAAa,EAAEF,OAAO,CAAC;MACrE,CAAC,CAAC,OAAOc,WAAW,EAAE;QACpB,MAAM,IAAI3B,KAAK,CACb,4BAA4BtB,eAAe,CAACiD,WAAW,CAAC,EAC1D,CAAC;MACH;IACF,CAAC,SAAS;MACR,IAAI,CAAC3C,YAAY,GAAG,KAAK;IAC3B;EACF;EAEA,MAAa4C,KAAKA,CAAC;IACjBC;EACmB,CAAC,EAAgC;IACpD,IAAI,IAAI,CAAC7C,YAAY,EAAE;MACrB,MAAM,IAAIgB,KAAK,CAAC,gCAAgC,CAAC;IACnD;IAEA,MAAM,IAAI,CAACJ,IAAI,CAAC,CAAC;IAEjB,IAAI,CAACZ,YAAY,GAAG,IAAI;IACxB,IAAI;MACF,MAAM8C,SAAS,GAAG,MAAM,IAAI,CAACjD,MAAM,CAAC+C,KAAK,CACvCC,IAAI,EACJjD,QAAQ,CAACU,sBACX,CAAC;MACDf,SAAS,CAACwD,YAAY,CAAC,IAAI,CAACtC,KAAK,EAAE,IAAI,CAAC;MACxC,OAAO;QAAEqC;MAAU,CAAC;IACtB,CAAC,CAAC,OAAOtB,KAAK,EAAE;MACdjC,SAAS,CAACwD,YAAY,CAAC,IAAI,CAACtC,KAAK,EAAE,KAAK,EAAEf,eAAe,CAAC8B,KAAK,CAAC,CAAC;MACjE,MAAMA,KAAK;IACb,CAAC,SAAS;MACR,IAAI,CAACxB,YAAY,GAAG,KAAK;IAC3B;EACF;EAEA,MAAagD,UAAUA,CAAC;IACtBC;EACwB,CAAC,EAAqC;IAC9D,IAAI,IAAI,CAACjD,YAAY,EAAE;MACrB,MAAM,IAAIgB,KAAK,CAAC,gCAAgC,CAAC;IACnD;IAEA,MAAM,IAAI,CAACJ,IAAI,CAAC,CAAC;IAEjB,IAAI,CAACZ,YAAY,GAAG,IAAI;IACxB,IAAI;MACF,MAAM8C,SAAS,GAAG,MAAM,IAAI,CAACjD,MAAM,CAACmD,UAAU,CAC5CC,SAAS,EACTrD,QAAQ,CAACU,sBACX,CAAC;MACDf,SAAS,CAAC2D,iBAAiB,CAAC,IAAI,CAACzC,KAAK,EAAE,IAAI,CAAC;MAC7C,OAAO;QAAEqC;MAAU,CAAC;IACtB,CAAC,CAAC,OAAOtB,KAAK,EAAE;MACdjC,SAAS,CAAC2D,iBAAiB,CAAC,IAAI,CAACzC,KAAK,EAAE,KAAK,EAAEf,eAAe,CAAC8B,KAAK,CAAC,CAAC;MACtE,MAAMA,KAAK;IACb,CAAC,SAAS;MACR,IAAI,CAACxB,YAAY,GAAG,KAAK;IAC3B;EACF;EAEOmD,IAAIA,CAAA,EAAkB;IAC3B,OAAO,IAAI,CAACtD,MAAM,CAACsD,IAAI,CAAC,CAAC;EAC3B;EAEA,MAAaC,KAAKA,CAAA,EAAkB;IAClC,MAAM,IAAI,CAACD,IAAI,CAAC,CAAC;IACjB,OAAO,IAAI,CAACtD,MAAM,CAACuD,KAAK,CAAC,CAAC;EAC5B;EAEA,MAAaC,OAAOA,CAAA,EAAkB;IACpC,IAAI,CAAC,IAAI,CAACtD,aAAa,EAAE;MACvB;IACF;IAEA,MAAM,IAAI,CAACoD,IAAI,CAAC,CAAC;IACjB,MAAM,IAAI,CAACtD,MAAM,CAACwD,OAAO,CAAC,CAAC;IAE3B,IAAI,CAACtD,aAAa,GAAG,KAAK;EAC5B;EAEA,MAAauD,SAASA,CAAA,EAA2B;IAC/C,IAAI1D,QAAQ,CAACW,iBAAiB,EAAE;MAC9B,OAAOX,QAAQ,CAACW,iBAAiB;IACnC;IACA,MAAMgD,MAAM,GAAG,MAAM9D,QAAQ,CAAC6D,SAAS,CAAC,CAAC;IACzC,KAAK,MAAM7C,KAAK,IAAI8C,MAAM,EAAE;MAC1B9C,KAAK,CAAC+C,YAAY,GAAG,MAAMlE,gBAAgB,CAAC2B,WAAW,CAACR,KAAK,CAACgD,IAAI,CAAC;IACrE;IACA7D,QAAQ,CAACW,iBAAiB,GAAGgD,MAAM;IACnC,OAAOA,MAAM;EACf;AACF","ignoreList":[]}