cactus-react-native 1.5.0 → 1.7.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 (216) hide show
  1. package/Cactus.podspec +1 -1
  2. package/README.md +347 -241
  3. package/android/CMakeLists.txt +24 -5
  4. package/android/src/main/jniLibs/arm64-v8a/libcactus.a +0 -0
  5. package/android/src/main/jniLibs/arm64-v8a/libcurl.a +0 -0
  6. package/android/src/main/jniLibs/arm64-v8a/libmbedcrypto.a +0 -0
  7. package/android/src/main/jniLibs/arm64-v8a/libmbedtls.a +0 -0
  8. package/android/src/main/jniLibs/arm64-v8a/libmbedx509.a +0 -0
  9. package/cpp/HybridCactus.cpp +149 -117
  10. package/cpp/HybridCactus.hpp +14 -10
  11. package/cpp/cactus_ffi.h +54 -43
  12. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus.h +0 -1
  13. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus_ffi.h +54 -43
  14. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus_utils.h +318 -123
  15. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/engine.h +118 -15
  16. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/graph.h +77 -32
  17. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/kernel.h +68 -6
  18. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/kernel_utils.h +21 -155
  19. package/ios/cactus.xcframework/ios-arm64/cactus.framework/cactus +0 -0
  20. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/cactus.h +0 -1
  21. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/cactus_ffi.h +54 -43
  22. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/cactus_utils.h +318 -123
  23. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/engine.h +118 -15
  24. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/graph.h +77 -32
  25. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/kernel.h +68 -6
  26. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/kernel_utils.h +21 -155
  27. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/cactus +0 -0
  28. package/lib/module/classes/CactusLM.js +16 -49
  29. package/lib/module/classes/CactusLM.js.map +1 -1
  30. package/lib/module/classes/CactusSTT.js +30 -79
  31. package/lib/module/classes/CactusSTT.js.map +1 -1
  32. package/lib/module/classes/CactusVAD.js +95 -0
  33. package/lib/module/classes/CactusVAD.js.map +1 -0
  34. package/lib/module/hooks/useCactusLM.js +10 -11
  35. package/lib/module/hooks/useCactusLM.js.map +1 -1
  36. package/lib/module/hooks/useCactusSTT.js +23 -62
  37. package/lib/module/hooks/useCactusSTT.js.map +1 -1
  38. package/lib/module/hooks/useCactusVAD.js +171 -0
  39. package/lib/module/hooks/useCactusVAD.js.map +1 -0
  40. package/lib/module/index.js +2 -3
  41. package/lib/module/index.js.map +1 -1
  42. package/lib/module/modelRegistry.js +52 -0
  43. package/lib/module/modelRegistry.js.map +1 -0
  44. package/lib/module/native/Cactus.js +85 -23
  45. package/lib/module/native/Cactus.js.map +1 -1
  46. package/lib/module/native/CactusIndex.js.map +1 -1
  47. package/lib/module/native/index.js +0 -3
  48. package/lib/module/native/index.js.map +1 -1
  49. package/lib/module/types/CactusVAD.js +4 -0
  50. package/lib/module/{specs/CactusUtil.nitro.js.map → types/CactusVAD.js.map} +1 -1
  51. package/lib/typescript/src/classes/CactusLM.d.ts +5 -7
  52. package/lib/typescript/src/classes/CactusLM.d.ts.map +1 -1
  53. package/lib/typescript/src/classes/CactusSTT.d.ts +8 -12
  54. package/lib/typescript/src/classes/CactusSTT.d.ts.map +1 -1
  55. package/lib/typescript/src/classes/CactusVAD.d.ts +20 -0
  56. package/lib/typescript/src/classes/CactusVAD.d.ts.map +1 -0
  57. package/lib/typescript/src/hooks/useCactusLM.d.ts +2 -2
  58. package/lib/typescript/src/hooks/useCactusLM.d.ts.map +1 -1
  59. package/lib/typescript/src/hooks/useCactusSTT.d.ts +6 -8
  60. package/lib/typescript/src/hooks/useCactusSTT.d.ts.map +1 -1
  61. package/lib/typescript/src/hooks/useCactusVAD.d.ts +15 -0
  62. package/lib/typescript/src/hooks/useCactusVAD.d.ts.map +1 -0
  63. package/lib/typescript/src/index.d.ts +7 -5
  64. package/lib/typescript/src/index.d.ts.map +1 -1
  65. package/lib/typescript/src/modelRegistry.d.ts +5 -0
  66. package/lib/typescript/src/modelRegistry.d.ts.map +1 -0
  67. package/lib/typescript/src/native/Cactus.d.ts +12 -11
  68. package/lib/typescript/src/native/Cactus.d.ts.map +1 -1
  69. package/lib/typescript/src/native/CactusIndex.d.ts +2 -2
  70. package/lib/typescript/src/native/CactusIndex.d.ts.map +1 -1
  71. package/lib/typescript/src/native/index.d.ts +0 -3
  72. package/lib/typescript/src/native/index.d.ts.map +1 -1
  73. package/lib/typescript/src/specs/Cactus.nitro.d.ts +6 -6
  74. package/lib/typescript/src/specs/Cactus.nitro.d.ts.map +1 -1
  75. package/lib/typescript/src/types/CactusIndex.d.ts +2 -2
  76. package/lib/typescript/src/types/CactusIndex.d.ts.map +1 -1
  77. package/lib/typescript/src/types/CactusLM.d.ts +19 -11
  78. package/lib/typescript/src/types/CactusLM.d.ts.map +1 -1
  79. package/lib/typescript/src/types/CactusSTT.d.ts +33 -12
  80. package/lib/typescript/src/types/CactusSTT.d.ts.map +1 -1
  81. package/lib/typescript/src/types/CactusVAD.d.ts +34 -0
  82. package/lib/typescript/src/types/CactusVAD.d.ts.map +1 -0
  83. package/lib/typescript/src/types/common.d.ts +1 -6
  84. package/lib/typescript/src/types/common.d.ts.map +1 -1
  85. package/nitro.json +0 -11
  86. package/nitrogen/generated/android/cactus+autolinking.cmake +0 -5
  87. package/nitrogen/generated/android/cactusOnLoad.cpp +0 -30
  88. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Bridge.cpp +0 -50
  89. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Bridge.hpp +9 -147
  90. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Umbrella.hpp +0 -13
  91. package/nitrogen/generated/ios/CactusAutolinking.mm +0 -26
  92. package/nitrogen/generated/ios/CactusAutolinking.swift +0 -30
  93. package/nitrogen/generated/shared/c++/HybridCactusSpec.cpp +4 -4
  94. package/nitrogen/generated/shared/c++/HybridCactusSpec.hpp +6 -6
  95. package/package.json +3 -3
  96. package/src/classes/CactusLM.ts +18 -65
  97. package/src/classes/CactusSTT.ts +39 -97
  98. package/src/classes/CactusVAD.ts +129 -0
  99. package/src/hooks/useCactusLM.ts +14 -17
  100. package/src/hooks/useCactusSTT.ts +47 -98
  101. package/src/hooks/useCactusVAD.ts +215 -0
  102. package/src/index.tsx +18 -12
  103. package/src/modelRegistry.ts +65 -0
  104. package/src/native/Cactus.ts +102 -41
  105. package/src/native/CactusIndex.ts +2 -2
  106. package/src/native/index.ts +0 -3
  107. package/src/specs/Cactus.nitro.ts +11 -7
  108. package/src/types/CactusIndex.ts +2 -2
  109. package/src/types/CactusLM.ts +19 -11
  110. package/src/types/CactusSTT.ts +33 -13
  111. package/src/types/CactusVAD.ts +39 -0
  112. package/src/types/common.ts +1 -6
  113. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusCrypto.kt +0 -46
  114. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusDeviceInfo.kt +0 -27
  115. package/android/src/main/jniLibs/arm64-v8a/libcactus_util.a +0 -0
  116. package/cpp/HybridCactusUtil.cpp +0 -47
  117. package/cpp/HybridCactusUtil.hpp +0 -27
  118. package/cpp/cactus_util.h +0 -25
  119. package/ios/HybridCactusCrypto.swift +0 -37
  120. package/ios/HybridCactusDeviceInfo.swift +0 -32
  121. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus_telemetry.h +0 -656
  122. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/cactus_telemetry.h +0 -656
  123. package/ios/cactus_util.xcframework/Info.plist +0 -39
  124. package/ios/cactus_util.xcframework/ios-arm64/cactus_util.framework/Headers/cactus_util.h +0 -25
  125. package/ios/cactus_util.xcframework/ios-arm64/cactus_util.framework/Headers/database.h +0 -27
  126. package/ios/cactus_util.xcframework/ios-arm64/cactus_util.framework/Headers/ios_utils.h +0 -10
  127. package/ios/cactus_util.xcframework/ios-arm64/cactus_util.framework/Headers/logging.h +0 -25
  128. package/ios/cactus_util.xcframework/ios-arm64/cactus_util.framework/Info.plist +0 -0
  129. package/ios/cactus_util.xcframework/ios-arm64/cactus_util.framework/cactus_util +0 -0
  130. package/ios/cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework/Headers/cactus_util.h +0 -25
  131. package/ios/cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework/Headers/database.h +0 -27
  132. package/ios/cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework/Headers/ios_utils.h +0 -10
  133. package/ios/cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework/Headers/logging.h +0 -25
  134. package/ios/cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework/Info.plist +0 -0
  135. package/ios/cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework/_CodeSignature/CodeResources +0 -135
  136. package/ios/cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework/cactus_util +0 -0
  137. package/lib/module/api/Database.js +0 -45
  138. package/lib/module/api/Database.js.map +0 -1
  139. package/lib/module/api/RemoteLM.js +0 -201
  140. package/lib/module/api/RemoteLM.js.map +0 -1
  141. package/lib/module/config/CactusConfig.js +0 -12
  142. package/lib/module/config/CactusConfig.js.map +0 -1
  143. package/lib/module/models.js +0 -336
  144. package/lib/module/models.js.map +0 -1
  145. package/lib/module/native/CactusCrypto.js +0 -10
  146. package/lib/module/native/CactusCrypto.js.map +0 -1
  147. package/lib/module/native/CactusDeviceInfo.js +0 -13
  148. package/lib/module/native/CactusDeviceInfo.js.map +0 -1
  149. package/lib/module/native/CactusUtil.js +0 -36
  150. package/lib/module/native/CactusUtil.js.map +0 -1
  151. package/lib/module/specs/CactusCrypto.nitro.js +0 -4
  152. package/lib/module/specs/CactusCrypto.nitro.js.map +0 -1
  153. package/lib/module/specs/CactusDeviceInfo.nitro.js +0 -4
  154. package/lib/module/specs/CactusDeviceInfo.nitro.js.map +0 -1
  155. package/lib/module/specs/CactusUtil.nitro.js +0 -4
  156. package/lib/module/telemetry/Telemetry.js +0 -154
  157. package/lib/module/telemetry/Telemetry.js.map +0 -1
  158. package/lib/typescript/src/api/Database.d.ts +0 -12
  159. package/lib/typescript/src/api/Database.d.ts.map +0 -1
  160. package/lib/typescript/src/api/RemoteLM.d.ts +0 -14
  161. package/lib/typescript/src/api/RemoteLM.d.ts.map +0 -1
  162. package/lib/typescript/src/config/CactusConfig.d.ts +0 -7
  163. package/lib/typescript/src/config/CactusConfig.d.ts.map +0 -1
  164. package/lib/typescript/src/models.d.ts +0 -6
  165. package/lib/typescript/src/models.d.ts.map +0 -1
  166. package/lib/typescript/src/native/CactusCrypto.d.ts +0 -5
  167. package/lib/typescript/src/native/CactusCrypto.d.ts.map +0 -1
  168. package/lib/typescript/src/native/CactusDeviceInfo.d.ts +0 -7
  169. package/lib/typescript/src/native/CactusDeviceInfo.d.ts.map +0 -1
  170. package/lib/typescript/src/native/CactusUtil.d.ts +0 -6
  171. package/lib/typescript/src/native/CactusUtil.d.ts.map +0 -1
  172. package/lib/typescript/src/specs/CactusCrypto.nitro.d.ts +0 -8
  173. package/lib/typescript/src/specs/CactusCrypto.nitro.d.ts.map +0 -1
  174. package/lib/typescript/src/specs/CactusDeviceInfo.nitro.d.ts +0 -16
  175. package/lib/typescript/src/specs/CactusDeviceInfo.nitro.d.ts.map +0 -1
  176. package/lib/typescript/src/specs/CactusUtil.nitro.d.ts +0 -10
  177. package/lib/typescript/src/specs/CactusUtil.nitro.d.ts.map +0 -1
  178. package/lib/typescript/src/telemetry/Telemetry.d.ts +0 -34
  179. package/lib/typescript/src/telemetry/Telemetry.d.ts.map +0 -1
  180. package/nitrogen/generated/android/c++/JDeviceInfo.hpp +0 -74
  181. package/nitrogen/generated/android/c++/JHybridCactusCryptoSpec.cpp +0 -65
  182. package/nitrogen/generated/android/c++/JHybridCactusCryptoSpec.hpp +0 -65
  183. package/nitrogen/generated/android/c++/JHybridCactusDeviceInfoSpec.cpp +0 -85
  184. package/nitrogen/generated/android/c++/JHybridCactusDeviceInfoSpec.hpp +0 -66
  185. package/nitrogen/generated/android/kotlin/com/margelo/nitro/cactus/DeviceInfo.kt +0 -50
  186. package/nitrogen/generated/android/kotlin/com/margelo/nitro/cactus/HybridCactusCryptoSpec.kt +0 -58
  187. package/nitrogen/generated/android/kotlin/com/margelo/nitro/cactus/HybridCactusDeviceInfoSpec.kt +0 -62
  188. package/nitrogen/generated/ios/c++/HybridCactusCryptoSpecSwift.cpp +0 -11
  189. package/nitrogen/generated/ios/c++/HybridCactusCryptoSpecSwift.hpp +0 -77
  190. package/nitrogen/generated/ios/c++/HybridCactusDeviceInfoSpecSwift.cpp +0 -11
  191. package/nitrogen/generated/ios/c++/HybridCactusDeviceInfoSpecSwift.hpp +0 -88
  192. package/nitrogen/generated/ios/swift/DeviceInfo.swift +0 -98
  193. package/nitrogen/generated/ios/swift/Func_void_DeviceInfo.swift +0 -47
  194. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__string_.swift +0 -54
  195. package/nitrogen/generated/ios/swift/HybridCactusCryptoSpec.swift +0 -57
  196. package/nitrogen/generated/ios/swift/HybridCactusCryptoSpec_cxx.swift +0 -139
  197. package/nitrogen/generated/ios/swift/HybridCactusDeviceInfoSpec.swift +0 -58
  198. package/nitrogen/generated/ios/swift/HybridCactusDeviceInfoSpec_cxx.swift +0 -164
  199. package/nitrogen/generated/shared/c++/DeviceInfo.hpp +0 -92
  200. package/nitrogen/generated/shared/c++/HybridCactusCryptoSpec.cpp +0 -21
  201. package/nitrogen/generated/shared/c++/HybridCactusCryptoSpec.hpp +0 -63
  202. package/nitrogen/generated/shared/c++/HybridCactusDeviceInfoSpec.cpp +0 -22
  203. package/nitrogen/generated/shared/c++/HybridCactusDeviceInfoSpec.hpp +0 -67
  204. package/nitrogen/generated/shared/c++/HybridCactusUtilSpec.cpp +0 -23
  205. package/nitrogen/generated/shared/c++/HybridCactusUtilSpec.hpp +0 -66
  206. package/src/api/Database.ts +0 -55
  207. package/src/api/RemoteLM.ts +0 -273
  208. package/src/config/CactusConfig.ts +0 -11
  209. package/src/models.ts +0 -344
  210. package/src/native/CactusCrypto.ts +0 -11
  211. package/src/native/CactusDeviceInfo.ts +0 -18
  212. package/src/native/CactusUtil.ts +0 -43
  213. package/src/specs/CactusCrypto.nitro.ts +0 -6
  214. package/src/specs/CactusDeviceInfo.nitro.ts +0 -15
  215. package/src/specs/CactusUtil.nitro.ts +0 -8
  216. package/src/telemetry/Telemetry.ts +0 -236
@@ -4,6 +4,7 @@
4
4
  #include <arm_neon.h>
5
5
  #if defined(__APPLE__)
6
6
  #include <TargetConditionals.h>
7
+ #include <sys/sysctl.h>
7
8
  #endif
8
9
  #if defined(__ANDROID__)
9
10
  #include <sys/auxv.h>
@@ -43,59 +44,6 @@ inline void stream_store_f16x8(__fp16* dst, float16x8_t val) {
43
44
  #endif
44
45
  }
45
46
 
46
- #if defined(__ARM_FEATURE_DOTPROD)
47
- inline int32x4_t accum_dot(int32x4_t acc, int8x16_t a, int8x16_t b) {
48
- return vdotq_s32(acc, a, b);
49
- }
50
- #else
51
- inline int32x4_t accum_dot(int32x4_t acc, int8x16_t a, int8x16_t b) {
52
- int16x8_t prod_low = vmull_s8(vget_low_s8(a), vget_low_s8(b));
53
- int32x4_t acc_high = vpaddlq_s16(vmull_s8(vget_high_s8(a), vget_high_s8(b)));
54
- return vaddq_s32(vaddq_s32(acc, vpaddlq_s16(prod_low)), acc_high);
55
- }
56
- #endif
57
-
58
- // I8MM support: runtime detection on Android, compile-time on Apple
59
- #if defined(__ANDROID__) && defined(__aarch64__)
60
-
61
- inline bool cactus_has_i8mm() {
62
- static int8_t supported = -1;
63
- if (supported == -1) {
64
- unsigned long hwcaps = getauxval(AT_HWCAP2);
65
- supported = (hwcaps & HWCAP2_I8MM) ? 1 : 0;
66
- }
67
- return supported;
68
- }
69
-
70
- __attribute__((target("arch=armv8.2-a+i8mm")))
71
- inline int32x4_t accum_matmul(int32x4_t acc, int8x16_t a, int8x16_t b) {
72
- return vmmlaq_s32(acc, a, b);
73
- }
74
-
75
- #elif defined(__APPLE__) && defined(__aarch64__)
76
-
77
- inline bool cactus_has_i8mm() {
78
- return true;
79
- }
80
-
81
- __attribute__((target("i8mm")))
82
- inline int32x4_t accum_matmul(int32x4_t acc, int8x16_t a, int8x16_t b) {
83
- return vmmlaq_s32(acc, a, b);
84
- }
85
-
86
- #else
87
-
88
- inline bool cactus_has_i8mm() {
89
- return false;
90
- }
91
-
92
- #endif
93
-
94
- inline float16x8_t accum_f16_dot(float16x8_t acc, float16x8_t a_low, float16x8_t a_high,
95
- float16x8_t b_low, float16x8_t b_high) {
96
- acc = vfmaq_f16(acc, a_low, b_low);
97
- return vfmaq_f16(acc, a_high, b_high);
98
- }
99
47
 
100
48
  inline float32x4_t fast_exp_f32x4(float32x4_t x) {
101
49
  const float32x4_t log2e = vdupq_n_f32(1.4426950408889634f);
@@ -154,102 +102,6 @@ inline float32x4_t fast_tanh_f32x4(float32x4_t x) {
154
102
  return result;
155
103
  }
156
104
 
157
- inline int8x16_t unpack_int4_lo(uint8x16_t packed) {
158
- uint8x16_t lo = vandq_u8(packed, vdupq_n_u8(0x0F));
159
- uint8x16_t sign_mask = vcgtq_u8(lo, vdupq_n_u8(7));
160
- uint8x16_t correction = vandq_u8(sign_mask, vdupq_n_u8(16));
161
- return vreinterpretq_s8_u8(vsubq_u8(lo, correction));
162
- }
163
-
164
- inline int8x16_t unpack_int4_hi(uint8x16_t packed) {
165
- uint8x16_t hi = vshrq_n_u8(packed, 4);
166
- uint8x16_t sign_mask = vcgtq_u8(hi, vdupq_n_u8(7));
167
- uint8x16_t correction = vandq_u8(sign_mask, vdupq_n_u8(16));
168
- return vreinterpretq_s8_u8(vsubq_u8(hi, correction));
169
- }
170
-
171
- inline void unpack_int4_to_int8x32(uint8x16_t packed, int8x16_t& out_lo, int8x16_t& out_hi) {
172
- int8x16_t lo_nibbles = unpack_int4_lo(packed);
173
- int8x16_t hi_nibbles = unpack_int4_hi(packed);
174
- int8x16x2_t interleaved = vzipq_s8(lo_nibbles, hi_nibbles);
175
- out_lo = interleaved.val[0];
176
- out_hi = interleaved.val[1];
177
- }
178
-
179
- inline int32x4_t int4_dot_asm(int32x4_t acc, uint8x16_t packed, int8x16_t a_lo, int8x16_t a_hi) {
180
- #if defined(__aarch64__)
181
- int8x16_t b_lo, b_hi;
182
-
183
- __asm__ __volatile__ (
184
- "movi v16.16b, #0x0F \n" // low nibble mask
185
- "movi v17.16b, #7 \n" // sign threshold
186
- "movi v18.16b, #16 \n" // sign correction
187
-
188
- "and %[b_lo].16b, %[packed].16b, v16.16b \n"
189
-
190
- "ushr %[b_hi].16b, %[packed].16b, #4 \n"
191
-
192
- "cmgt v19.16b, %[b_lo].16b, v17.16b \n"
193
- "and v19.16b, v19.16b, v18.16b \n"
194
- "sub %[b_lo].16b, %[b_lo].16b, v19.16b \n"
195
-
196
- "cmgt v20.16b, %[b_hi].16b, v17.16b \n"
197
- "and v20.16b, v20.16b, v18.16b \n"
198
- "sub %[b_hi].16b, %[b_hi].16b, v20.16b \n"
199
-
200
- "zip1 v21.16b, %[b_lo].16b, %[b_hi].16b \n"
201
- "zip2 v22.16b, %[b_lo].16b, %[b_hi].16b \n"
202
-
203
- ".arch armv8.2-a+dotprod \n"
204
- "sdot %[acc].4s, %[a_lo].16b, v21.16b \n"
205
- "sdot %[acc].4s, %[a_hi].16b, v22.16b \n"
206
-
207
- : [acc] "+w"(acc), [b_lo] "=w"(b_lo), [b_hi] "=w"(b_hi)
208
- : [packed] "w"(packed), [a_lo] "w"(a_lo), [a_hi] "w"(a_hi)
209
- : "v16", "v17", "v18", "v19", "v20", "v21", "v22"
210
- );
211
-
212
- return acc;
213
- #else
214
- int8x16_t b_lo, b_hi;
215
- unpack_int4_to_int8x32(packed, b_lo, b_hi);
216
- acc = accum_dot(acc, a_lo, b_lo);
217
- acc = accum_dot(acc, a_hi, b_hi);
218
- return acc;
219
- #endif
220
- }
221
-
222
- inline int32_t int4_dot_m1_asm(const int8_t* a_ptr, const uint8_t* b_packed, size_t group_size) {
223
- #if defined(__aarch64__)
224
- int32x4_t acc = vdupq_n_s32(0);
225
-
226
- for (size_t k = 0; k < group_size; k += 64) {
227
- uint8x16_t p0 = vld1q_u8(b_packed + k/2);
228
- uint8x16_t p1 = vld1q_u8(b_packed + k/2 + 16);
229
-
230
- int8x16_t a0 = vld1q_s8(a_ptr + k);
231
- int8x16_t a1 = vld1q_s8(a_ptr + k + 16);
232
- int8x16_t a2 = vld1q_s8(a_ptr + k + 32);
233
- int8x16_t a3 = vld1q_s8(a_ptr + k + 48);
234
-
235
- acc = int4_dot_asm(acc, p0, a0, a1);
236
- acc = int4_dot_asm(acc, p1, a2, a3);
237
- }
238
-
239
- return vaddvq_s32(acc);
240
- #else
241
- int32x4_t acc = vdupq_n_s32(0);
242
- for (size_t k = 0; k < group_size; k += 32) {
243
- uint8x16_t packed = vld1q_u8(b_packed + k/2);
244
- int8x16_t b_lo, b_hi;
245
- unpack_int4_to_int8x32(packed, b_lo, b_hi);
246
- acc = accum_dot(acc, vld1q_s8(a_ptr + k), b_lo);
247
- acc = accum_dot(acc, vld1q_s8(a_ptr + k + 16), b_hi);
248
- }
249
- return vaddvq_s32(acc);
250
- #endif
251
- }
252
-
253
105
  namespace CactusThreading {
254
106
 
255
107
  class ThreadPool {
@@ -431,18 +283,32 @@ namespace CactusThreading {
431
283
  struct GemmThreading {
432
284
  #if defined(__ANDROID__)
433
285
  static size_t get_num_threads(size_t M, size_t pool_size) {
434
- if (M <= 1) return 1;
435
- return pool_size;
286
+ if (M <= 1) return 1;
287
+ return pool_size;
288
+ }
289
+ static size_t get_gemv_threads(size_t /*N_blocks*/, size_t /*pool_size*/) {
290
+ return 1;
436
291
  }
437
292
  #elif defined(__APPLE__) && TARGET_OS_IPHONE
293
+ static constexpr size_t GEMV_MIN_N_BLOCKS = 512;
438
294
  static size_t get_num_threads(size_t M, size_t pool_size) {
439
- if (M <= 1) return std::min(pool_size, static_cast<size_t>(2));
440
- return pool_size;
295
+ if (M <= 1) return std::min(pool_size, static_cast<size_t>(2));
296
+ return pool_size;
297
+ }
298
+ static size_t get_gemv_threads(size_t N_blocks, size_t pool_size) {
299
+ if (N_blocks < GEMV_MIN_N_BLOCKS) return 1;
300
+ return std::min(pool_size, static_cast<size_t>(2));
441
301
  }
442
- #else // Mac
302
+ #else
303
+ static constexpr size_t GEMV_MIN_N_BLOCKS = 256;
443
304
  static size_t get_num_threads(size_t M, size_t pool_size) {
444
305
  if (M <= 1) return std::min(pool_size, static_cast<size_t>(4));
445
- return pool_size;
306
+ return pool_size;
307
+ }
308
+ static size_t get_gemv_threads(size_t N_blocks, size_t pool_size) {
309
+ if (N_blocks < GEMV_MIN_N_BLOCKS) return 1;
310
+ 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));
446
312
  }
447
313
  #endif
448
314
  };
@@ -7,7 +7,6 @@
7
7
  #include "engine/engine.h"
8
8
  #include "models/model.h"
9
9
  #include "ffi/cactus_ffi.h"
10
- #include "ffi/cactus_telemetry.h"
11
10
  #include "npu/npu.h"
12
11
 
13
12
  #endif // CACTUS_H
@@ -6,11 +6,11 @@
6
6
  #include <stdbool.h>
7
7
 
8
8
  #if __GNUC__ >= 4
9
- #define CACTUS_FFI_EXPORT __attribute__ ((visibility ("default")))
10
- #define CACTUS_FFI_LOCAL __attribute__ ((visibility ("hidden")))
9
+ #define CACTUS_FFI_EXPORT __attribute__((visibility("default")))
10
+ #define CACTUS_FFI_LOCAL __attribute__((visibility("hidden")))
11
11
  #else
12
- #define CACTUS_FFI_EXPORT
13
- #define CACTUS_FFI_LOCAL
12
+ #define CACTUS_FFI_EXPORT
13
+ #define CACTUS_FFI_LOCAL
14
14
  #endif
15
15
 
16
16
  #ifdef __cplusplus
@@ -18,20 +18,30 @@ extern "C" {
18
18
  #endif
19
19
 
20
20
  typedef void* cactus_model_t;
21
+ typedef void* cactus_index_t;
22
+ typedef void* cactus_stream_transcribe_t;
21
23
 
22
24
  typedef void (*cactus_token_callback)(const char* token, uint32_t token_id, void* user_data);
23
25
 
24
- CACTUS_FFI_EXPORT cactus_model_t cactus_init(const char* model_path, size_t context_size, const char* corpus_dir);
26
+ CACTUS_FFI_EXPORT cactus_model_t cactus_init(
27
+ const char* model_path,
28
+ const char* corpus_dir, // optional: NULL if no RAG corpus
29
+ bool cache_index // false = always rebuild index, true = load cached if available
30
+ );
31
+
32
+ CACTUS_FFI_EXPORT void cactus_destroy(cactus_model_t model);
33
+ CACTUS_FFI_EXPORT void cactus_reset(cactus_model_t model);
34
+ CACTUS_FFI_EXPORT void cactus_stop(cactus_model_t model);
25
35
 
26
36
  CACTUS_FFI_EXPORT int cactus_complete(
27
37
  cactus_model_t model,
28
38
  const char* messages_json,
29
39
  char* response_buffer,
30
40
  size_t buffer_size,
31
- const char* options_json,
32
- const char* tools_json,
33
- cactus_token_callback callback,
34
- void* user_data
41
+ const char* options_json, // optional
42
+ const char* tools_json, // optional
43
+ cactus_token_callback callback, // optional
44
+ void* user_data // optional
35
45
  );
36
46
 
37
47
  CACTUS_FFI_EXPORT int cactus_tokenize(
@@ -53,45 +63,38 @@ CACTUS_FFI_EXPORT int cactus_score_window(
53
63
  size_t buffer_size
54
64
  );
55
65
 
56
-
57
66
  CACTUS_FFI_EXPORT int cactus_transcribe(
58
67
  cactus_model_t model,
59
- const char* audio_file_path,
68
+ const char* audio_file_path, // NULL if using pcm_buffer
60
69
  const char* prompt,
61
70
  char* response_buffer,
62
71
  size_t buffer_size,
63
- const char* options_json,
64
- cactus_token_callback callback,
65
- void* user_data,
66
- const uint8_t* pcm_buffer,
72
+ const char* options_json, // optional
73
+ cactus_token_callback callback, // optional
74
+ void* user_data, // optional
75
+ const uint8_t* pcm_buffer, // NULL if using audio_file_path
67
76
  size_t pcm_buffer_size
68
77
  );
69
78
 
70
- typedef void* cactus_stream_transcribe_t;
71
-
72
- CACTUS_FFI_EXPORT cactus_stream_transcribe_t cactus_stream_transcribe_init(cactus_model_t model);
73
-
74
- CACTUS_FFI_EXPORT int cactus_stream_transcribe_insert(
75
- cactus_stream_transcribe_t stream,
76
- const uint8_t* pcm_buffer,
77
- size_t pcm_buffer_size
79
+ CACTUS_FFI_EXPORT cactus_stream_transcribe_t cactus_stream_transcribe_start(
80
+ cactus_model_t model,
81
+ const char* options_json // optional
78
82
  );
79
83
 
80
84
  CACTUS_FFI_EXPORT int cactus_stream_transcribe_process(
81
85
  cactus_stream_transcribe_t stream,
86
+ const uint8_t* pcm_buffer,
87
+ size_t pcm_buffer_size,
82
88
  char* response_buffer,
83
- size_t buffer_size,
84
- const char* options_json
89
+ size_t buffer_size
85
90
  );
86
91
 
87
- CACTUS_FFI_EXPORT int cactus_stream_transcribe_finalize(
92
+ CACTUS_FFI_EXPORT int cactus_stream_transcribe_stop(
88
93
  cactus_stream_transcribe_t stream,
89
94
  char* response_buffer,
90
95
  size_t buffer_size
91
96
  );
92
97
 
93
- CACTUS_FFI_EXPORT void cactus_stream_transcribe_destroy(cactus_stream_transcribe_t stream);
94
-
95
98
  CACTUS_FFI_EXPORT int cactus_embed(
96
99
  cactus_model_t model,
97
100
  const char* text,
@@ -117,19 +120,24 @@ CACTUS_FFI_EXPORT int cactus_audio_embed(
117
120
  size_t* embedding_dim
118
121
  );
119
122
 
120
- CACTUS_FFI_EXPORT void cactus_reset(cactus_model_t model);
121
-
122
- CACTUS_FFI_EXPORT void cactus_stop(cactus_model_t model);
123
-
124
- CACTUS_FFI_EXPORT void cactus_destroy(cactus_model_t model);
125
-
126
- CACTUS_FFI_EXPORT const char* cactus_get_last_error(void);
127
-
128
- CACTUS_FFI_EXPORT void cactus_set_telemetry_token(const char* token);
123
+ CACTUS_FFI_EXPORT int cactus_vad(
124
+ cactus_model_t model,
125
+ const char* audio_file_path,
126
+ char* response_buffer,
127
+ size_t buffer_size,
128
+ const char* options_json,
129
+ const uint8_t* pcm_buffer,
130
+ size_t pcm_buffer_size
131
+ );
129
132
 
130
- CACTUS_FFI_EXPORT void cactus_set_pro_key(const char* pro_key);
133
+ CACTUS_FFI_EXPORT int cactus_rag_query(
134
+ cactus_model_t model,
135
+ const char* query,
136
+ char* response_buffer,
137
+ size_t buffer_size,
138
+ size_t top_k
139
+ );
131
140
 
132
- typedef void* cactus_index_t;
133
141
 
134
142
  CACTUS_FFI_EXPORT cactus_index_t cactus_index_init(
135
143
  const char* index_dir,
@@ -140,7 +148,7 @@ CACTUS_FFI_EXPORT int cactus_index_add(
140
148
  cactus_index_t index,
141
149
  const int* ids,
142
150
  const char** documents,
143
- const char** metadatas,
151
+ const char** metadatas, // optional: can be NULL
144
152
  const float** embeddings,
145
153
  size_t count,
146
154
  size_t embedding_dim
@@ -169,7 +177,7 @@ CACTUS_FFI_EXPORT int cactus_index_query(
169
177
  const float** embeddings,
170
178
  size_t embeddings_count,
171
179
  size_t embedding_dim,
172
- const char* options_json,
180
+ const char* options_json, // optional
173
181
  int** id_buffers,
174
182
  size_t* id_buffer_sizes,
175
183
  float** score_buffers,
@@ -177,11 +185,14 @@ CACTUS_FFI_EXPORT int cactus_index_query(
177
185
  );
178
186
 
179
187
  CACTUS_FFI_EXPORT int cactus_index_compact(cactus_index_t index);
180
-
181
188
  CACTUS_FFI_EXPORT void cactus_index_destroy(cactus_index_t index);
182
189
 
190
+ CACTUS_FFI_EXPORT const char* cactus_get_last_error(void);
191
+
192
+ CACTUS_FFI_EXPORT void cactus_set_telemetry_environment(const char* framework, const char* cache_location);
193
+
183
194
  #ifdef __cplusplus
184
195
  }
185
196
  #endif
186
197
 
187
- #endif
198
+ #endif // CACTUS_FFI_H