cactus-react-native 1.7.0 → 1.10.1

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 (52) hide show
  1. package/README.md +61 -0
  2. package/android/gradle.properties +1 -1
  3. package/android/src/main/jniLibs/arm64-v8a/libcactus.a +0 -0
  4. package/cpp/HybridCactus.cpp +49 -1
  5. package/cpp/HybridCactus.hpp +5 -0
  6. package/cpp/cactus_ffi.h +14 -1
  7. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus_cloud.h +48 -0
  8. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus_ffi.h +14 -1
  9. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus_utils.h +304 -66
  10. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/engine.h +32 -4
  11. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/graph.h +75 -11
  12. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/kernel.h +123 -4
  13. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/kernel_utils.h +37 -3
  14. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Info.plist +0 -0
  15. package/ios/cactus.xcframework/ios-arm64/cactus.framework/cactus +0 -0
  16. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/cactus_cloud.h +48 -0
  17. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/cactus_ffi.h +14 -1
  18. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/cactus_utils.h +304 -66
  19. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/engine.h +32 -4
  20. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/graph.h +75 -11
  21. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/kernel.h +123 -4
  22. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/kernel_utils.h +37 -3
  23. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Info.plist +0 -0
  24. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/_CodeSignature/CodeResources +1 -1
  25. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/cactus +0 -0
  26. package/lib/module/classes/CactusSTT.js +15 -0
  27. package/lib/module/classes/CactusSTT.js.map +1 -1
  28. package/lib/module/index.js +3 -0
  29. package/lib/module/index.js.map +1 -1
  30. package/lib/module/modelRegistry.js +27 -2
  31. package/lib/module/modelRegistry.js.map +1 -1
  32. package/lib/module/native/Cactus.js +18 -0
  33. package/lib/module/native/Cactus.js.map +1 -1
  34. package/lib/typescript/src/classes/CactusSTT.d.ts +2 -1
  35. package/lib/typescript/src/classes/CactusSTT.d.ts.map +1 -1
  36. package/lib/typescript/src/index.d.ts +2 -1
  37. package/lib/typescript/src/index.d.ts.map +1 -1
  38. package/lib/typescript/src/native/Cactus.d.ts +2 -1
  39. package/lib/typescript/src/native/Cactus.d.ts.map +1 -1
  40. package/lib/typescript/src/specs/Cactus.nitro.d.ts +1 -0
  41. package/lib/typescript/src/specs/Cactus.nitro.d.ts.map +1 -1
  42. package/lib/typescript/src/types/CactusSTT.d.ts +11 -0
  43. package/lib/typescript/src/types/CactusSTT.d.ts.map +1 -1
  44. package/nitrogen/generated/shared/c++/HybridCactusSpec.cpp +1 -0
  45. package/nitrogen/generated/shared/c++/HybridCactusSpec.hpp +1 -0
  46. package/package.json +1 -1
  47. package/src/classes/CactusSTT.ts +20 -0
  48. package/src/index.tsx +6 -0
  49. package/src/modelRegistry.ts +42 -2
  50. package/src/native/Cactus.ts +32 -0
  51. package/src/specs/Cactus.nitro.ts +5 -0
  52. package/src/types/CactusSTT.ts +14 -0
@@ -6,6 +6,7 @@
6
6
  #include <unordered_map>
7
7
  #include <unordered_set>
8
8
  #include <functional>
9
+ #include <cassert>
9
10
  #include <cstring>
10
11
  #include <stdexcept>
11
12
  #include <string>
@@ -109,23 +110,33 @@ enum class ComputeBackend {
109
110
  NPU
110
111
  };
111
112
 
113
+ enum class Activation {
114
+ SILU,
115
+ GELU,
116
+ GELU_ERF,
117
+ RELU,
118
+ SIGMOID,
119
+ TANH
120
+ };
121
+
112
122
  enum class OpType {
113
123
  INPUT, PRECISION_CAST,
114
124
  ADD, ADD_CLIPPED, SUBTRACT, MULTIPLY, DIVIDE,
115
125
  MATMUL, TRANSPOSE, RESHAPE, SLICE, GATHER, EMBEDDING,
116
126
  BILINEAR_INTERPOLATION,
117
127
  SUM, MEAN, VARIANCE, MIN, MAX,
118
- RMS_NORM, ROPE, ROPE_GPTJ, SOFTMAX, ATTENTION, ATTENTION_INT8_HYBRID, CONV1D_CAUSAL, CONV1D_K3, CONV1D_K7S3, CONV1D,
119
- SCALAR_ADD, SCALAR_SUBTRACT, SCALAR_MULTIPLY, SCALAR_DIVIDE, SCALAR_EXP, SCALAR_SQRT, SCALAR_COS, SCALAR_SIN,
128
+ RMS_NORM, ROPE, ROPE_GPTJ, SOFTMAX, ATTENTION, ATTENTION_INT8_HYBRID, REL_POS_BIAS, CONV1D_CAUSAL, CONV1D_K3, CONV1D_K7S3, CONV1D, CONV1D_SAME_DEPTHWISE_K9, CONV1D_POINTWISE, CONV2D_K3S2P1, CONV2D_DEPTHWISE_K3S2P1, CONV2D_POINTWISE_1X1, GLU, BATCHNORM,
129
+ SCALAR_ADD, SCALAR_SUBTRACT, SCALAR_MULTIPLY, SCALAR_DIVIDE, SCALAR_EXP, SCALAR_SQRT, SCALAR_COS, SCALAR_SIN, SCALAR_LOG,
120
130
  RELU, SILU, GELU, GELU_ERF, SIGMOID, TANH,
121
131
  SAMPLE, CONCAT,
122
132
  SCATTER_TOPK,
123
133
  TOPK, LAYERNORM, GROUPNORM,
134
+ MOE_LAYER,
124
135
  INDEX,
125
136
  PERSISTENT,
126
137
  QUANTIZE_ACTIVATIONS,
127
138
  LSTM_CELL,
128
- STFT_MAGNITUDE
139
+ STFT
129
140
  };
130
141
 
131
142
  struct PrecisionTraits {
@@ -141,11 +152,20 @@ struct PrecisionTraits {
141
152
 
142
153
  static constexpr size_t packed_size_of(Precision prec, size_t count) {
143
154
  switch (prec) {
144
- case Precision::INT4: return (count + 1) / 2;
155
+ case Precision::INT4: return (count + 1) / 2;
145
156
  default: return count * size_of(prec);
146
157
  }
147
158
  }
148
159
 
160
+ static size_t byte_offset_of(Precision prec, size_t element_offset) {
161
+ switch (prec) {
162
+ case Precision::INT4:
163
+ assert(element_offset % 32 == 0 && "INT4 byte offset must be group-aligned (multiple of 32)");
164
+ return element_offset / 2;
165
+ default: return element_offset * size_of(prec);
166
+ }
167
+ }
168
+
149
169
  static constexpr bool is_integer(Precision prec) {
150
170
  switch (prec) {
151
171
  case Precision::INT8: return true;
@@ -181,7 +201,6 @@ struct TensorConfig {
181
201
  Precision compute_precision = Precision::INT8;
182
202
  Precision output_precision = Precision::INT8;
183
203
  bool auto_mixed_precision = false;
184
- bool enable_int4_packing = true;
185
204
 
186
205
  static TensorConfig& global();
187
206
  };
@@ -243,6 +262,10 @@ struct BufferDesc {
243
262
  return precision == Precision::INT8 && group_size > 0;
244
263
  }
245
264
 
265
+ bool is_grouped_int4() const {
266
+ return precision == Precision::INT4 && group_size > 0;
267
+ }
268
+
246
269
  void set_grouped_scales(size_t gs, size_t ng, void* scales_ptr) {
247
270
  group_size = gs;
248
271
  num_groups = ng;
@@ -291,6 +314,7 @@ struct OpParams {
291
314
  size_t slice_length = 0;
292
315
  size_t window_size = 0;
293
316
  bool is_causal = true;
317
+ bool attention_mask_is_additive = false;
294
318
  std::vector<size_t> new_shape;
295
319
  std::vector<size_t> permutation;
296
320
  Precision output_precision = Precision::INT8;
@@ -309,6 +333,11 @@ struct OpParams {
309
333
  size_t num_groups = 0;
310
334
  size_t dst_height = 0;
311
335
  size_t dst_width = 0;
336
+ bool normalize_routing = false;
337
+ size_t num_experts = 0;
338
+ size_t num_experts_per_tok = 0;
339
+ bool moe_gated = true;
340
+ Activation activation = Activation::SILU;
312
341
 
313
342
  std::vector<float> bias_values;
314
343
  std::vector<uint32_t> bias_indices;
@@ -356,7 +385,6 @@ void compute_index_node(GraphNode& node, const std::vector<std::unique_ptr<Graph
356
385
  void compute_lstm_cell_node(GraphNode& node, const std::vector<std::unique_ptr<GraphNode>>& nodes, const std::unordered_map<size_t, size_t>& node_index_map);
357
386
 
358
387
  void shrink_thread_local_buffers();
359
-
360
388
  class BufferPool {
361
389
  public:
362
390
  BufferPool() = default;
@@ -418,6 +446,7 @@ public:
418
446
  size_t scalar_sqrt(size_t input);
419
447
  size_t scalar_cos(size_t input);
420
448
  size_t scalar_sin(size_t input);
449
+ size_t scalar_log(size_t input);
421
450
 
422
451
  size_t relu(size_t input);
423
452
  size_t silu(size_t input);
@@ -425,6 +454,7 @@ public:
425
454
  size_t gelu_erf(size_t input);
426
455
  size_t sigmoid(size_t input);
427
456
  size_t tanh(size_t input);
457
+ size_t glu(size_t input, int axis = -1);
428
458
 
429
459
  size_t matmul(size_t input1, size_t input2, bool pretransposed_rhs = false, ComputeBackend backend = ComputeBackend::CPU);
430
460
  size_t transpose(size_t input, ComputeBackend backend = ComputeBackend::CPU);
@@ -455,7 +485,30 @@ public:
455
485
  size_t layernorm(size_t input, size_t weight, size_t bias, float epsilon = 1e-5f);
456
486
  size_t layernorm(size_t input, size_t weight, float epsilon = 1e-5f); // No bias version
457
487
  size_t groupnorm(size_t input, size_t weight, size_t bias, size_t num_groups = 32, float epsilon = 1e-5f);
488
+ size_t batchnorm(size_t input, size_t weight, size_t bias, size_t running_mean, size_t running_var, int axis = 1, float epsilon = 1e-5f);
458
489
  size_t topk(size_t input, size_t k);
490
+ size_t moe_layer(size_t hidden,
491
+ size_t routing_probs,
492
+ size_t topk_indices,
493
+ const std::vector<size_t>& w1_weights,
494
+ const std::vector<size_t>& w3_weights,
495
+ const std::vector<size_t>& w2_weights,
496
+ size_t num_experts,
497
+ size_t num_experts_per_tok,
498
+ bool normalize_routing,
499
+ float epsilon,
500
+ float routed_scaling_factor);
501
+ size_t moe_layer(size_t hidden,
502
+ size_t routing_probs,
503
+ size_t topk_indices,
504
+ const std::vector<size_t>& w1_weights,
505
+ const std::vector<size_t>& w2_weights,
506
+ size_t num_experts,
507
+ size_t num_experts_per_tok,
508
+ bool normalize_routing,
509
+ float epsilon,
510
+ float routed_scaling_factor,
511
+ Activation activation);
459
512
  size_t rms_norm(size_t input, size_t weight, float epsilon = 1e-5f);
460
513
  size_t rope(size_t input, float theta, size_t position_offset = 0, ComputeBackend backend = ComputeBackend::CPU);
461
514
  size_t rope_gptj(size_t input, float theta, size_t position_offset = 0, size_t rot_dim = 0, ComputeBackend backend = ComputeBackend::CPU);
@@ -463,6 +516,10 @@ public:
463
516
  size_t attention(size_t query, size_t key, size_t value, float scale, bool is_causal = true, ComputeBackend backend = ComputeBackend::CPU);
464
517
  size_t attention(size_t query, size_t key, size_t value, float scale, size_t position_offset, ComputeBackend backend = ComputeBackend::CPU);
465
518
  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);
519
+ size_t attention_masked(size_t query, size_t key, size_t value, size_t mask, float scale,
520
+ bool is_causal = true, ComputeBackend backend = ComputeBackend::CPU,
521
+ bool additive_mask = false, size_t position_offset = 0, size_t window_size = 0);
522
+ size_t rel_pos_bias(size_t query, size_t relative_key, float scale);
466
523
 
467
524
  size_t attention_int8_hybrid(size_t query, size_t key_new, size_t value_new, float scale, size_t position_offset,
468
525
  const int8_t* cached_keys, const int8_t* cached_values,
@@ -474,9 +531,19 @@ public:
474
531
  size_t conv1d_k7s3(size_t input, size_t weight, size_t bias);
475
532
  size_t conv1d(size_t input, size_t weight, size_t stride);
476
533
  size_t conv1d(size_t input, size_t weight, size_t bias, size_t stride);
534
+ size_t conv1d_same_depthwise_k9(size_t input, size_t weight);
535
+ size_t conv1d_same_depthwise_k9(size_t input, size_t weight, size_t bias);
536
+ size_t conv1d_pointwise(size_t input, size_t weight);
537
+ size_t conv1d_pointwise(size_t input, size_t weight, size_t bias);
538
+ size_t conv2d_k3s2p1(size_t input, size_t weight);
539
+ size_t conv2d_k3s2p1(size_t input, size_t weight, size_t bias);
540
+ size_t conv2d_depthwise_k3s2p1(size_t input, size_t weight);
541
+ size_t conv2d_depthwise_k3s2p1(size_t input, size_t weight, size_t bias);
542
+ size_t conv2d_pointwise_1x1(size_t input, size_t weight);
543
+ size_t conv2d_pointwise_1x1(size_t input, size_t weight, size_t bias);
477
544
 
478
545
  size_t lstm_cell(size_t input, size_t h_prev, size_t c_prev, size_t weight_ih, size_t weight_hh, size_t bias_ih, size_t bias_hh);
479
- size_t stft_magnitude(size_t input, size_t weight, size_t stride, size_t num_fft_bins);
546
+ size_t stft(size_t input, size_t weight, size_t stride, size_t num_fft_bins);
480
547
 
481
548
  size_t sample(size_t logits, float temperature = 0.6f, float top_p = 0.95f, size_t top_k = 20,
482
549
  const std::unordered_map<uint32_t, float>& logit_bias = {});
@@ -581,12 +648,9 @@ namespace GraphFile {
581
648
  bool is_interleaved_ = false;
582
649
  size_t original_N_ = 0;
583
650
 
584
- std::unique_ptr<int8_t[]> unpacked_data_;
585
-
586
651
  void parse_header();
587
652
  void apply_madvise_hints();
588
- void unpack_int4_data();
589
653
  };
590
654
  }
591
655
 
592
- #endif
656
+ #endif
@@ -4,6 +4,8 @@
4
4
  #include <cstddef>
5
5
  #include <arm_neon.h>
6
6
 
7
+ enum class Precision;
8
+
7
9
  enum class ScalarOpType {
8
10
  ADD,
9
11
  SUBTRACT,
@@ -12,7 +14,8 @@ enum class ScalarOpType {
12
14
  EXP,
13
15
  SQRT,
14
16
  COS,
15
- SIN
17
+ SIN,
18
+ LOG
16
19
  };
17
20
 
18
21
  constexpr size_t KV_QUANT_GROUP_SIZE = 32;
@@ -21,6 +24,7 @@ void cactus_add_f16(const __fp16* a, const __fp16* b, __fp16* output, size_t num
21
24
  void cactus_add_f16_clipped(const __fp16* a, const __fp16* b, __fp16* output, size_t num_elements);
22
25
  void cactus_subtract_f16(const __fp16* a, const __fp16* b, __fp16* output, size_t num_elements);
23
26
  void cactus_multiply_f16(const __fp16* a, const __fp16* b, __fp16* output, size_t num_elements);
27
+ void cactus_add_scaled_f16(const __fp16* base, const __fp16* src, __fp16* output, size_t num_elements, float scale);
24
28
  void cactus_divide_f16(const __fp16* a, const __fp16* b, __fp16* output, size_t num_elements);
25
29
 
26
30
  void cactus_add_broadcast_f16(const __fp16* a, const __fp16* b, __fp16* output,
@@ -50,6 +54,23 @@ void cactus_matmul_int8(const int8_t* A, const float* A_scales,
50
54
  const int8_t* B, const __fp16* B_scales,
51
55
  __fp16* C, size_t M, size_t K, size_t N, size_t group_size);
52
56
 
57
+ void cactus_gemv_int4(const int8_t* A, float A_scale,
58
+ const int8_t* B_packed, const __fp16* B_scales,
59
+ __fp16* C, size_t K, size_t N, size_t group_size);
60
+
61
+ void cactus_gemm_int4(const int8_t* A, const float* A_scales,
62
+ const int8_t* B_packed, const __fp16* B_scales,
63
+ __fp16* C, size_t M, size_t K, size_t N, size_t group_size);
64
+
65
+ void cactus_matmul_int4(const int8_t* A, const float* A_scales,
66
+ const int8_t* B_packed, const __fp16* B_scales,
67
+ __fp16* C, size_t M, size_t K, size_t N, size_t group_size);
68
+
69
+ void cactus_matmul_integer(Precision precision,
70
+ const int8_t* A, const float* A_scales,
71
+ const int8_t* B, const __fp16* B_scales,
72
+ __fp16* C, size_t M, size_t K, size_t N, size_t group_size);
73
+
53
74
  void cactus_matmul_f16(const __fp16* a, const __fp16* b_transposed, __fp16* c,
54
75
  size_t M, size_t K, size_t N);
55
76
 
@@ -97,10 +118,52 @@ void cactus_sigmoid_f16(const __fp16* input, __fp16* output, size_t num_elements
97
118
 
98
119
  void cactus_tanh_f16(const __fp16* input, __fp16* output, size_t num_elements);
99
120
 
121
+ void cactus_glu_f16(
122
+ const __fp16* input,
123
+ __fp16* output,
124
+ size_t outer_size,
125
+ size_t split_size,
126
+ size_t inner_size
127
+ );
128
+
129
+ void cactus_glu_f32(
130
+ const float* input,
131
+ float* output,
132
+ size_t outer_size,
133
+ size_t split_size,
134
+ size_t inner_size
135
+ );
136
+
137
+ void cactus_batchnorm_f16(
138
+ const __fp16* input,
139
+ const float* weight,
140
+ const float* bias,
141
+ const float* running_mean,
142
+ const float* running_var,
143
+ __fp16* output,
144
+ size_t outer_size,
145
+ size_t channels,
146
+ size_t inner_size,
147
+ float epsilon
148
+ );
149
+
150
+ void cactus_batchnorm_f32(
151
+ const float* input,
152
+ const float* weight,
153
+ const float* bias,
154
+ const float* running_mean,
155
+ const float* running_var,
156
+ float* output,
157
+ size_t outer_size,
158
+ size_t channels,
159
+ size_t inner_size,
160
+ float epsilon
161
+ );
162
+
100
163
  void cactus_attention_f16(const __fp16* queries, const __fp16* keys, const __fp16* values, __fp16* output,
101
164
  size_t batch_size, size_t seq_len, size_t kv_seq_len, size_t num_q_heads, size_t num_kv_heads,
102
165
  size_t head_dim, float scale, const __fp16* mask, size_t position_offset = 0, size_t window_size = 0,
103
- bool is_causal = true);
166
+ bool is_causal = true, bool mask_is_additive = false, bool mask_per_head = false);
104
167
 
105
168
  void cactus_attention_hybrid_int8_fp16(
106
169
  const __fp16* queries,
@@ -150,7 +213,7 @@ void cactus_conv1d_f16(
150
213
  size_t stride
151
214
  );
152
215
 
153
- void cactus_stft_magnitude_f16(
216
+ void cactus_stft_f16(
154
217
  const __fp16* input,
155
218
  const __fp16* weight,
156
219
  __fp16* output,
@@ -171,6 +234,62 @@ void cactus_conv1d_f16_k7s3_oc8(
171
234
  size_t C_out
172
235
  );
173
236
 
237
+ void cactus_conv1d_same_depthwise_f16_k9(
238
+ const __fp16* input,
239
+ const __fp16* weight,
240
+ const __fp16* bias,
241
+ __fp16* output,
242
+ size_t N,
243
+ size_t L,
244
+ size_t C
245
+ );
246
+
247
+ void cactus_conv2d_f16_k3s2p1_nchw(
248
+ const __fp16* input,
249
+ const __fp16* weight,
250
+ const __fp16* bias,
251
+ __fp16* output,
252
+ size_t N,
253
+ size_t C_in,
254
+ size_t H,
255
+ size_t W,
256
+ size_t C_out
257
+ );
258
+
259
+ void cactus_conv2d_depthwise_f16_k3s2p1_nchw(
260
+ const __fp16* input,
261
+ const __fp16* weight,
262
+ const __fp16* bias,
263
+ __fp16* output,
264
+ size_t N,
265
+ size_t C,
266
+ size_t H,
267
+ size_t W
268
+ );
269
+
270
+ void cactus_conv2d_pointwise_f16_1x1_nchw_gemm(
271
+ const __fp16* input,
272
+ const __fp16* weight,
273
+ const __fp16* bias,
274
+ __fp16* output,
275
+ size_t N,
276
+ size_t C_in,
277
+ size_t H,
278
+ size_t W,
279
+ size_t C_out
280
+ );
281
+
282
+ void cactus_conv1d_pointwise_f16_gemm(
283
+ const __fp16* input,
284
+ const __fp16* weight,
285
+ const __fp16* bias,
286
+ __fp16* output,
287
+ size_t N,
288
+ size_t L,
289
+ size_t C_in,
290
+ size_t C_out
291
+ );
292
+
174
293
  void cactus_bilinear_interpolation_f16(const __fp16* input, __fp16* output, size_t src_height, size_t src_width, size_t embed_dim,
175
294
  size_t dst_height, size_t dst_width);
176
295
 
@@ -224,4 +343,4 @@ void cactus_lstm_cell_f16(
224
343
  size_t hidden_size
225
344
  );
226
345
 
227
- #endif
346
+ #endif
@@ -44,6 +44,34 @@ inline void stream_store_f16x8(__fp16* dst, float16x8_t val) {
44
44
  #endif
45
45
  }
46
46
 
47
+ inline bool cpu_has_sme2() {
48
+ #if defined(__aarch64__)
49
+ static std::once_flag once;
50
+ static bool has = false;
51
+
52
+ std::call_once(once, []() {
53
+
54
+ #if defined(__APPLE__)
55
+ int ret = 0;
56
+ size_t size = sizeof(ret);
57
+ if (sysctlbyname("hw.optional.arm.FEAT_SME2", &ret, &size, nullptr, 0) == 0) {
58
+ has = ret == 1;
59
+ }
60
+
61
+ #elif defined(__ANDROID__)
62
+ unsigned long hwcap2 = getauxval(AT_HWCAP2);
63
+ #ifdef HWCAP2_SME2
64
+ has = (hwcap2 & HWCAP2_SME2) != 0;
65
+ #endif
66
+
67
+ #endif
68
+ });
69
+
70
+ return has;
71
+ #else
72
+ return false;
73
+ #endif
74
+ }
47
75
 
48
76
  inline float32x4_t fast_exp_f32x4(float32x4_t x) {
49
77
  const float32x4_t log2e = vdupq_n_f32(1.4426950408889634f);
@@ -102,6 +130,12 @@ inline float32x4_t fast_tanh_f32x4(float32x4_t x) {
102
130
  return result;
103
131
  }
104
132
 
133
+ inline void unpack_int4_as_int8x16x2(const uint8_t* ptr, int8x16_t& high_decoded, int8x16_t& low_decoded) {
134
+ int8x16_t packed = vreinterpretq_s8_u8(vld1q_u8(ptr));
135
+ high_decoded = vshrq_n_s8(packed, 4);
136
+ low_decoded = vshrq_n_s8(vshlq_n_s8(packed, 4), 4);
137
+ }
138
+
105
139
  namespace CactusThreading {
106
140
 
107
141
  class ThreadPool {
@@ -297,7 +331,7 @@ namespace CactusThreading {
297
331
  }
298
332
  static size_t get_gemv_threads(size_t N_blocks, size_t pool_size) {
299
333
  if (N_blocks < GEMV_MIN_N_BLOCKS) return 1;
300
- return std::min(pool_size, static_cast<size_t>(2));
334
+ return std::min(pool_size, static_cast<size_t>(3));
301
335
  }
302
336
  #else
303
337
  static constexpr size_t GEMV_MIN_N_BLOCKS = 256;
@@ -308,7 +342,7 @@ namespace CactusThreading {
308
342
  static size_t get_gemv_threads(size_t N_blocks, size_t pool_size) {
309
343
  if (N_blocks < GEMV_MIN_N_BLOCKS) return 1;
310
344
  if (N_blocks < 512) return std::min(pool_size, static_cast<size_t>(2));
311
- return std::min(pool_size, static_cast<size_t>(4));
345
+ return std::min(pool_size, static_cast<size_t>(5));
312
346
  }
313
347
  #endif
314
348
  };
@@ -465,4 +499,4 @@ namespace CactusThreading {
465
499
  }
466
500
 
467
501
 
468
- #endif // KERNEL_UTILS_H
502
+ #endif // KERNEL_UTILS_H
@@ -6,7 +6,7 @@
6
6
  <dict>
7
7
  <key>Info.plist</key>
8
8
  <data>
9
- yMSW0g+AKq/xXqUOrMbK43roF5I=
9
+ cN36qyYdB+mdJFxX4r84gFZ7SS4=
10
10
  </data>
11
11
  </dict>
12
12
  <key>files2</key>
@@ -124,6 +124,21 @@ export class CactusSTT {
124
124
  this.isStreamTranscribing = false;
125
125
  }
126
126
  }
127
+ async detectLanguage({
128
+ audio,
129
+ options
130
+ }) {
131
+ if (this.isGenerating) {
132
+ throw new Error('CactusSTT is already generating');
133
+ }
134
+ await this.init();
135
+ this.isGenerating = true;
136
+ try {
137
+ return await this.cactus.detectLanguage(audio, options);
138
+ } finally {
139
+ this.isGenerating = false;
140
+ }
141
+ }
127
142
  async audioEmbed({
128
143
  audioPath
129
144
  }) {
@@ -1 +1 @@
1
- {"version":3,"names":["Cactus","CactusFileSystem","getRegistry","CactusSTT","cactus","isDownloading","isInitialized","isGenerating","isStreamTranscribing","defaultModel","defaultOptions","quantization","pro","defaultPrompt","defaultTranscribeOptions","maxTokens","defaultEmbedBufferSize","constructor","model","options","download","onProgress","isModelPath","Error","modelExists","getModelName","console","log","registry","modelConfig","url","apple","downloadModel","init","modelPath","replace","JSON","stringify","getModelPath","cacheDir","getCactusDirectory","setTelemetryEnvironment","transcribe","audio","prompt","onToken","responseBufferSize","streamTranscribeStart","streamTranscribeProcess","streamTranscribeStop","audioEmbed","audioPath","embedding","stop","reset","destroy","catch","getModels","Object","values","startsWith"],"sourceRoot":"../../../src","sources":["classes/CactusSTT.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Cactus","CactusFileSystem","getRegistry","CactusSTT","cactus","isDownloading","isInitialized","isGenerating","isStreamTranscribing","defaultModel","defaultOptions","quantization","pro","defaultPrompt","defaultTranscribeOptions","maxTokens","defaultEmbedBufferSize","constructor","model","options","download","onProgress","isModelPath","Error","modelExists","getModelName","console","log","registry","modelConfig","url","apple","downloadModel","init","modelPath","replace","JSON","stringify","getModelPath","cacheDir","getCactusDirectory","setTelemetryEnvironment","transcribe","audio","prompt","onToken","responseBufferSize","streamTranscribeStart","streamTranscribeProcess","streamTranscribeStop","detectLanguage","audioEmbed","audioPath","embedding","stop","reset","destroy","catch","getModels","Object","values","startsWith"],"sourceRoot":"../../../src","sources":["classes/CactusSTT.ts"],"mappings":"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","ignoreList":[]}
@@ -12,5 +12,8 @@ export { useCactusSTT } from "./hooks/useCactusSTT.js";
12
12
  export { useCactusVAD } from "./hooks/useCactusVAD.js";
13
13
  export { useCactusIndex } from "./hooks/useCactusIndex.js";
14
14
 
15
+ // Registry
16
+ export { getRegistry } from "./modelRegistry.js";
17
+
15
18
  // Types
16
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["CactusLM","CactusSTT","CactusVAD","CactusIndex","useCactusLM","useCactusSTT","useCactusVAD","useCactusIndex"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA,SAASA,QAAQ,QAAQ,uBAAoB;AAC7C,SAASC,SAAS,QAAQ,wBAAqB;AAC/C,SAASC,SAAS,QAAQ,wBAAqB;AAC/C,SAASC,WAAW,QAAQ,0BAAuB;;AAEnD;AACA,SAASC,WAAW,QAAQ,wBAAqB;AACjD,SAASC,YAAY,QAAQ,yBAAsB;AACnD,SAASC,YAAY,QAAQ,yBAAsB;AACnD,SAASC,cAAc,QAAQ,2BAAwB;;AAEvD","ignoreList":[]}
1
+ {"version":3,"names":["CactusLM","CactusSTT","CactusVAD","CactusIndex","useCactusLM","useCactusSTT","useCactusVAD","useCactusIndex","getRegistry"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA,SAASA,QAAQ,QAAQ,uBAAoB;AAC7C,SAASC,SAAS,QAAQ,wBAAqB;AAC/C,SAASC,SAAS,QAAQ,wBAAqB;AAC/C,SAASC,WAAW,QAAQ,0BAAuB;;AAEnD;AACA,SAASC,WAAW,QAAQ,wBAAqB;AACjD,SAASC,YAAY,QAAQ,yBAAsB;AACnD,SAASC,YAAY,QAAQ,yBAAsB;AACnD,SAASC,cAAc,QAAQ,2BAAwB;;AAEvD;AACA,SAASC,WAAW,QAAQ,oBAAiB;;AAE7C","ignoreList":[]}
@@ -1,10 +1,30 @@
1
1
  "use strict";
2
2
 
3
- const VERSION = 'v1.7';
3
+ const RUNTIME_VERSION = '1.10.1';
4
4
  let registryPromise = null;
5
5
  export function getRegistry() {
6
6
  return registryPromise ??= fetchRegistry();
7
7
  }
8
+ function parseVersionTag(tag) {
9
+ const m = tag.match(/^v(\d+)\.(\d+)(?:\.(\d+))?$/);
10
+ if (!m) return null;
11
+ return [+m[1], +m[2], +(m[3] ?? '0')];
12
+ }
13
+ function compareVersions(a, b) {
14
+ return a[0] - b[0] || a[1] - b[1] || a[2] - b[2];
15
+ }
16
+ async function resolveWeightVersion(modelId) {
17
+ const runtime = parseVersionTag(`v${RUNTIME_VERSION}`);
18
+ if (!runtime) throw new Error(`Invalid runtime version: ${RUNTIME_VERSION}`);
19
+ const res = await fetch(`https://huggingface.co/api/models/${modelId}/refs`);
20
+ if (!res.ok) throw new Error(`Failed to fetch refs for ${modelId}: ${res.status}`);
21
+ const {
22
+ tags = []
23
+ } = await res.json();
24
+ const compatible = tags.map(t => t.name).filter(name => parseVersionTag(name) !== null).filter(name => compareVersions(parseVersionTag(name), runtime) <= 0).sort((a, b) => compareVersions(parseVersionTag(b), parseVersionTag(a)));
25
+ if (!compatible.length) throw new Error('No compatible weight version found');
26
+ return compatible[0];
27
+ }
8
28
  async function fetchRegistry() {
9
29
  const response = await fetch('https://huggingface.co/api/models?author=Cactus-Compute&full=true').catch(e => {
10
30
  registryPromise = null;
@@ -15,6 +35,11 @@ async function fetchRegistry() {
15
35
  throw new Error(`Failed to fetch model registry: ${response.status}`);
16
36
  }
17
37
  const models = await response.json();
38
+ if (!models.length) return {};
39
+ const version = await resolveWeightVersion(models[0].id).catch(e => {
40
+ registryPromise = null;
41
+ throw e;
42
+ });
18
43
  const registry = {};
19
44
  for (const {
20
45
  id,
@@ -23,7 +48,7 @@ async function fetchRegistry() {
23
48
  const weights = siblings.map(s => s.rfilename).filter(f => f.startsWith('weights/') && f.endsWith('.zip'));
24
49
  if (!weights.some(f => f.endsWith('-int4.zip')) || !weights.some(f => f.endsWith('-int8.zip'))) continue;
25
50
  const key = weights.find(f => f.endsWith('-int4.zip')).replace('weights/', '').replace('-int4.zip', '');
26
- const base = `https://huggingface.co/${id}/resolve/${VERSION}/weights/${key}`;
51
+ const base = `https://huggingface.co/${id}/resolve/${version}/weights/${key}`;
27
52
  registry[key] = {
28
53
  quantization: {
29
54
  int4: {
@@ -1 +1 @@
1
- {"version":3,"names":["VERSION","registryPromise","getRegistry","fetchRegistry","response","fetch","catch","e","ok","Error","status","models","json","registry","id","siblings","weights","map","s","rfilename","filter","f","startsWith","endsWith","some","key","find","replace","base","quantization","int4","sizeMb","url","pro","apple","int8"],"sourceRoot":"../../src","sources":["modelRegistry.ts"],"mappings":";;AAEA,MAAMA,OAAO,GAAG,MAAM;AAEtB,IAAIC,eAA+D,GAAG,IAAI;AAE1E,OAAO,SAASC,WAAWA,CAAA,EAA4C;EACrE,OAAQD,eAAe,KAAKE,aAAa,CAAC,CAAC;AAC7C;AAEA,eAAeA,aAAaA,CAAA,EAA4C;EACtE,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAC1B,mEACF,CAAC,CAACC,KAAK,CAAEC,CAAC,IAAK;IACbN,eAAe,GAAG,IAAI;IACtB,MAAMM,CAAC;EACT,CAAC,CAAC;EACF,IAAI,CAACH,QAAQ,CAACI,EAAE,EAAE;IAChBP,eAAe,GAAG,IAAI;IACtB,MAAM,IAAIQ,KAAK,CAAC,mCAAmCL,QAAQ,CAACM,MAAM,EAAE,CAAC;EACvE;EAEA,MAAMC,MAAa,GAAG,MAAMP,QAAQ,CAACQ,IAAI,CAAC,CAAC;EAC3C,MAAMC,QAAwC,GAAG,CAAC,CAAC;EAEnD,KAAK,MAAM;IAAEC,EAAE;IAAEC,QAAQ,GAAG;EAAG,CAAC,IAAIJ,MAAM,EAAE;IAC1C,MAAMK,OAAiB,GAAGD,QAAQ,CAC/BE,GAAG,CAAEC,CAAM,IAAKA,CAAC,CAACC,SAAS,CAAC,CAC5BC,MAAM,CAAEC,CAAS,IAAKA,CAAC,CAACC,UAAU,CAAC,UAAU,CAAC,IAAID,CAAC,CAACE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAExE,IACE,CAACP,OAAO,CAACQ,IAAI,CAAEH,CAAC,IAAKA,CAAC,CAACE,QAAQ,CAAC,WAAW,CAAC,CAAC,IAC7C,CAACP,OAAO,CAACQ,IAAI,CAAEH,CAAC,IAAKA,CAAC,CAACE,QAAQ,CAAC,WAAW,CAAC,CAAC,EAE7C;IAEF,MAAME,GAAG,GAAGT,OAAO,CAChBU,IAAI,CAAEL,CAAC,IAAKA,CAAC,CAACE,QAAQ,CAAC,WAAW,CAAC,CAAC,CACpCI,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CACvBA,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;IAE3B,MAAMC,IAAI,GAAG,0BAA0Bd,EAAE,YAAYd,OAAO,YAAYyB,GAAG,EAAE;IAE7EZ,QAAQ,CAACY,GAAG,CAAC,GAAG;MACdI,YAAY,EAAE;QACZC,IAAI,EAAE;UACJC,MAAM,EAAE,CAAC;UACTC,GAAG,EAAE,GAAGJ,IAAI,WAAW;UACvB,IAAIZ,OAAO,CAACQ,IAAI,CAAEH,CAAC,IAAKA,CAAC,CAACE,QAAQ,CAAC,iBAAiB,CAAC,CAAC,GAClD;YAAEU,GAAG,EAAE;cAAEC,KAAK,EAAE,GAAGN,IAAI;YAAkB;UAAE,CAAC,GAC5C,CAAC,CAAC;QACR,CAAC;QACDO,IAAI,EAAE;UACJJ,MAAM,EAAE,CAAC;UACTC,GAAG,EAAE,GAAGJ,IAAI,WAAW;UACvB,IAAIZ,OAAO,CAACQ,IAAI,CAAEH,CAAC,IAAKA,CAAC,CAACE,QAAQ,CAAC,iBAAiB,CAAC,CAAC,GAClD;YAAEU,GAAG,EAAE;cAAEC,KAAK,EAAE,GAAGN,IAAI;YAAkB;UAAE,CAAC,GAC5C,CAAC,CAAC;QACR;MACF;IACF,CAAC;EACH;EAEA,OAAOf,QAAQ;AACjB","ignoreList":[]}
1
+ {"version":3,"names":["RUNTIME_VERSION","registryPromise","getRegistry","fetchRegistry","parseVersionTag","tag","m","match","compareVersions","a","b","resolveWeightVersion","modelId","runtime","Error","res","fetch","ok","status","tags","json","compatible","map","t","name","filter","sort","length","response","catch","e","models","version","id","registry","siblings","weights","s","rfilename","f","startsWith","endsWith","some","key","find","replace","base","quantization","int4","sizeMb","url","pro","apple","int8"],"sourceRoot":"../../src","sources":["modelRegistry.ts"],"mappings":"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","ignoreList":[]}
@@ -145,6 +145,24 @@ export class Cactus {
145
145
  throw new Error('Unable to parse stream transcribe process response');
146
146
  }
147
147
  }
148
+ async detectLanguage(audio, options) {
149
+ if (typeof audio === 'string') {
150
+ audio = audio.replace('file://', '');
151
+ }
152
+ const optionsJson = options ? JSON.stringify({
153
+ use_vad: options.useVad
154
+ }) : undefined;
155
+ const response = await this.hybridCactus.detectLanguage(audio, 1024, optionsJson);
156
+ try {
157
+ const parsed = JSON.parse(response);
158
+ return {
159
+ language: parsed.language,
160
+ confidence: parsed.confidence
161
+ };
162
+ } catch {
163
+ throw new Error('Unable to parse detect language response');
164
+ }
165
+ }
148
166
  async streamTranscribeStop() {
149
167
  const response = await this.hybridCactus.streamTranscribeStop();
150
168
  try {