cactus-react-native 0.2.11 → 1.0.2

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 (510) hide show
  1. package/Cactus.podspec +34 -0
  2. package/LICENSE +38 -0
  3. package/README.md +550 -69
  4. package/android/CMakeLists.txt +40 -0
  5. package/android/build.gradle +68 -44
  6. package/android/gradle.properties +5 -5
  7. package/android/src/main/AndroidManifest.xml +1 -3
  8. package/android/src/main/cpp/cpp-adapter.cpp +6 -0
  9. package/android/src/main/java/com/margelo/nitro/cactus/CactusPackage.kt +22 -0
  10. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusCrypto.kt +38 -0
  11. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusDeviceInfo.kt +24 -0
  12. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusFileSystem.kt +227 -0
  13. package/android/src/main/jniLibs/arm64-v8a/{libcactus_v8.so → libcactus.a} +0 -0
  14. package/android/src/main/jniLibs/arm64-v8a/libcactus_util.so +0 -0
  15. package/cpp/HybridCactus.cpp +135 -0
  16. package/cpp/HybridCactus.hpp +42 -0
  17. package/cpp/HybridCactusUtil.cpp +47 -0
  18. package/cpp/HybridCactusUtil.hpp +26 -0
  19. package/cpp/cactus_ffi.h +55 -0
  20. package/cpp/cactus_util.h +25 -0
  21. package/ios/HybridCactusCrypto.swift +37 -0
  22. package/ios/HybridCactusDeviceInfo.swift +32 -0
  23. package/ios/HybridCactusFileSystem.swift +234 -0
  24. package/ios/cactus.xcframework/{info.plist → Info.plist} +2 -37
  25. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus.h +8 -229
  26. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus_ffi.h +28 -229
  27. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/engine.h +545 -0
  28. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ffi_utils.h +400 -0
  29. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/graph.h +338 -0
  30. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/kernel.h +275 -0
  31. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/kernel_utils.h +343 -0
  32. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Info.plist +0 -0
  33. package/ios/cactus.xcframework/ios-arm64/cactus.framework/cactus +0 -0
  34. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/cactus.h +11 -0
  35. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/cactus_ffi.h +55 -0
  36. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/engine.h +545 -0
  37. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/ffi_utils.h +400 -0
  38. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/graph.h +338 -0
  39. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/kernel.h +275 -0
  40. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/kernel_utils.h +343 -0
  41. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Info.plist +0 -0
  42. package/ios/cactus.xcframework/{tvos-arm64_x86_64-simulator → ios-arm64-simulator}/cactus.framework/_CodeSignature/CodeResources +1 -1
  43. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/cactus +0 -0
  44. package/ios/cactus_util.xcframework/Info.plist +39 -0
  45. package/ios/cactus_util.xcframework/ios-arm64/cactus_util.framework/Headers/cactus_util.h +25 -0
  46. package/ios/cactus_util.xcframework/ios-arm64/cactus_util.framework/Headers/ios_utils.h +10 -0
  47. package/ios/cactus_util.xcframework/ios-arm64/cactus_util.framework/Headers/logging.h +25 -0
  48. package/ios/cactus_util.xcframework/ios-arm64/cactus_util.framework/Info.plist +0 -0
  49. package/ios/cactus_util.xcframework/ios-arm64/cactus_util.framework/cactus_util +0 -0
  50. package/ios/cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework/Headers/cactus_util.h +25 -0
  51. package/ios/cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework/Headers/ios_utils.h +10 -0
  52. package/ios/cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework/Headers/logging.h +25 -0
  53. package/ios/{cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework → cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework}/Info.plist +0 -0
  54. package/ios/{cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework → cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework}/_CodeSignature/CodeResources +36 -2
  55. package/ios/cactus_util.xcframework/ios-arm64-simulator/cactus_util.framework/cactus_util +0 -0
  56. package/lib/module/api/Database.js +60 -0
  57. package/lib/module/api/Database.js.map +1 -0
  58. package/lib/module/classes/CactusLM.js +151 -0
  59. package/lib/module/classes/CactusLM.js.map +1 -0
  60. package/lib/module/config/CactusConfig.js +6 -0
  61. package/lib/module/config/CactusConfig.js.map +1 -0
  62. package/lib/module/constants/packageVersion.js +4 -0
  63. package/lib/module/constants/packageVersion.js.map +1 -0
  64. package/lib/module/hooks/useCactusLM.js +238 -0
  65. package/lib/module/hooks/useCactusLM.js.map +1 -0
  66. package/lib/module/index.js +9 -409
  67. package/lib/module/index.js.map +1 -1
  68. package/lib/module/native/Cactus.js +50 -0
  69. package/lib/module/native/Cactus.js.map +1 -0
  70. package/lib/module/native/CactusCrypto.js +10 -0
  71. package/lib/module/native/CactusCrypto.js.map +1 -0
  72. package/lib/module/native/CactusDeviceInfo.js +13 -0
  73. package/lib/module/native/CactusDeviceInfo.js.map +1 -0
  74. package/lib/module/native/CactusFileSystem.js +35 -0
  75. package/lib/module/native/CactusFileSystem.js.map +1 -0
  76. package/lib/module/native/CactusUtil.js +23 -0
  77. package/lib/module/native/CactusUtil.js.map +1 -0
  78. package/lib/module/native/index.js +8 -0
  79. package/lib/module/native/index.js.map +1 -0
  80. package/lib/module/specs/Cactus.nitro.js +4 -0
  81. package/lib/module/specs/Cactus.nitro.js.map +1 -0
  82. package/lib/module/specs/CactusCrypto.nitro.js +4 -0
  83. package/lib/module/specs/CactusCrypto.nitro.js.map +1 -0
  84. package/lib/module/specs/CactusDeviceInfo.nitro.js +4 -0
  85. package/lib/module/specs/CactusDeviceInfo.nitro.js.map +1 -0
  86. package/lib/module/specs/CactusFileSystem.nitro.js +4 -0
  87. package/lib/module/specs/CactusFileSystem.nitro.js.map +1 -0
  88. package/lib/module/specs/CactusUtil.nitro.js +4 -0
  89. package/lib/module/specs/CactusUtil.nitro.js.map +1 -0
  90. package/lib/module/telemetry/Telemetry.js +100 -0
  91. package/lib/module/telemetry/Telemetry.js.map +1 -0
  92. package/lib/module/types/CactusLM.js +2 -0
  93. package/lib/module/types/CactusLM.js.map +1 -0
  94. package/lib/module/types/CactusModel.js +2 -0
  95. package/lib/module/types/CactusModel.js.map +1 -0
  96. package/lib/module/utils/error.js +4 -0
  97. package/lib/module/utils/error.js.map +1 -0
  98. package/lib/typescript/package.json +1 -0
  99. package/lib/typescript/src/api/Database.d.ts +11 -0
  100. package/lib/typescript/src/api/Database.d.ts.map +1 -0
  101. package/lib/typescript/src/classes/CactusLM.d.ts +26 -0
  102. package/lib/typescript/src/classes/CactusLM.d.ts.map +1 -0
  103. package/lib/typescript/src/config/CactusConfig.d.ts +5 -0
  104. package/lib/typescript/src/config/CactusConfig.d.ts.map +1 -0
  105. package/lib/typescript/src/constants/packageVersion.d.ts +2 -0
  106. package/lib/typescript/src/constants/packageVersion.d.ts.map +1 -0
  107. package/lib/typescript/src/hooks/useCactusLM.d.ts +20 -0
  108. package/lib/typescript/src/hooks/useCactusLM.d.ts.map +1 -0
  109. package/lib/typescript/src/index.d.ts +6 -0
  110. package/lib/typescript/src/index.d.ts.map +1 -0
  111. package/lib/typescript/src/native/Cactus.d.ts +11 -0
  112. package/lib/typescript/src/native/Cactus.d.ts.map +1 -0
  113. package/lib/typescript/src/native/CactusCrypto.d.ts +5 -0
  114. package/lib/typescript/src/native/CactusCrypto.d.ts.map +1 -0
  115. package/lib/typescript/src/native/CactusDeviceInfo.d.ts +7 -0
  116. package/lib/typescript/src/native/CactusDeviceInfo.d.ts.map +1 -0
  117. package/lib/typescript/src/native/CactusFileSystem.d.ts +13 -0
  118. package/lib/typescript/src/native/CactusFileSystem.d.ts.map +1 -0
  119. package/lib/typescript/src/native/CactusUtil.d.ts +6 -0
  120. package/lib/typescript/src/native/CactusUtil.d.ts.map +1 -0
  121. package/lib/typescript/src/native/index.d.ts +6 -0
  122. package/lib/typescript/src/native/index.d.ts.map +1 -0
  123. package/lib/typescript/src/specs/Cactus.nitro.d.ts +13 -0
  124. package/lib/typescript/src/specs/Cactus.nitro.d.ts.map +1 -0
  125. package/lib/typescript/src/specs/CactusCrypto.nitro.d.ts +8 -0
  126. package/lib/typescript/src/specs/CactusCrypto.nitro.d.ts.map +1 -0
  127. package/lib/typescript/src/specs/CactusDeviceInfo.nitro.d.ts +16 -0
  128. package/lib/typescript/src/specs/CactusDeviceInfo.nitro.d.ts.map +1 -0
  129. package/lib/typescript/src/specs/CactusFileSystem.nitro.d.ts +16 -0
  130. package/lib/typescript/src/specs/CactusFileSystem.nitro.d.ts.map +1 -0
  131. package/lib/typescript/src/specs/CactusUtil.nitro.d.ts +10 -0
  132. package/lib/typescript/src/specs/CactusUtil.nitro.d.ts.map +1 -0
  133. package/lib/typescript/src/telemetry/Telemetry.d.ts +30 -0
  134. package/lib/typescript/src/telemetry/Telemetry.d.ts.map +1 -0
  135. package/lib/typescript/src/types/CactusLM.d.ts +67 -0
  136. package/lib/typescript/src/types/CactusLM.d.ts.map +1 -0
  137. package/lib/typescript/src/types/CactusModel.d.ts +12 -0
  138. package/lib/typescript/src/types/CactusModel.d.ts.map +1 -0
  139. package/lib/typescript/src/utils/error.d.ts +2 -0
  140. package/lib/typescript/src/utils/error.d.ts.map +1 -0
  141. package/nitro.json +31 -0
  142. package/nitrogen/generated/android/c++/JDeviceInfo.hpp +74 -0
  143. package/nitrogen/generated/android/c++/JFunc_void_double.hpp +74 -0
  144. package/nitrogen/generated/android/c++/JHybridCactusCryptoSpec.cpp +65 -0
  145. package/nitrogen/generated/android/c++/JHybridCactusCryptoSpec.hpp +65 -0
  146. package/nitrogen/generated/android/c++/JHybridCactusDeviceInfoSpec.cpp +85 -0
  147. package/nitrogen/generated/android/c++/JHybridCactusDeviceInfoSpec.hpp +66 -0
  148. package/nitrogen/generated/android/c++/JHybridCactusFileSystemSpec.cpp +192 -0
  149. package/nitrogen/generated/android/c++/JHybridCactusFileSystemSpec.hpp +73 -0
  150. package/nitrogen/generated/android/cactus+autolinking.cmake +87 -0
  151. package/nitrogen/generated/android/cactus+autolinking.gradle +27 -0
  152. package/nitrogen/generated/android/cactusOnLoad.cpp +86 -0
  153. package/nitrogen/generated/android/cactusOnLoad.hpp +25 -0
  154. package/nitrogen/generated/android/kotlin/com/margelo/nitro/cactus/DeviceInfo.kt +50 -0
  155. package/nitrogen/generated/android/kotlin/com/margelo/nitro/cactus/Func_void_double.kt +80 -0
  156. package/nitrogen/generated/android/kotlin/com/margelo/nitro/cactus/HybridCactusCryptoSpec.kt +58 -0
  157. package/nitrogen/generated/android/kotlin/com/margelo/nitro/cactus/HybridCactusDeviceInfoSpec.kt +62 -0
  158. package/nitrogen/generated/android/kotlin/com/margelo/nitro/cactus/HybridCactusFileSystemSpec.kt +95 -0
  159. package/nitrogen/generated/android/kotlin/com/margelo/nitro/cactus/cactusOnLoad.kt +35 -0
  160. package/nitrogen/generated/ios/Cactus+autolinking.rb +60 -0
  161. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Bridge.cpp +122 -0
  162. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Bridge.hpp +373 -0
  163. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Umbrella.hpp +60 -0
  164. package/nitrogen/generated/ios/CactusAutolinking.mm +69 -0
  165. package/nitrogen/generated/ios/CactusAutolinking.swift +55 -0
  166. package/nitrogen/generated/ios/c++/HybridCactusCryptoSpecSwift.cpp +11 -0
  167. package/nitrogen/generated/ios/c++/HybridCactusCryptoSpecSwift.hpp +77 -0
  168. package/nitrogen/generated/ios/c++/HybridCactusDeviceInfoSpecSwift.cpp +11 -0
  169. package/nitrogen/generated/ios/c++/HybridCactusDeviceInfoSpecSwift.hpp +88 -0
  170. package/nitrogen/generated/ios/c++/HybridCactusFileSystemSpecSwift.cpp +11 -0
  171. package/nitrogen/generated/ios/c++/HybridCactusFileSystemSpecSwift.hpp +143 -0
  172. package/nitrogen/generated/ios/swift/DeviceInfo.swift +98 -0
  173. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  174. package/nitrogen/generated/ios/swift/Func_void_DeviceInfo.swift +47 -0
  175. package/nitrogen/generated/ios/swift/Func_void_bool.swift +47 -0
  176. package/nitrogen/generated/ios/swift/Func_void_double.swift +47 -0
  177. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  178. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__string_.swift +54 -0
  179. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  180. package/nitrogen/generated/ios/swift/HybridCactusCryptoSpec.swift +57 -0
  181. package/nitrogen/generated/ios/swift/HybridCactusCryptoSpec_cxx.swift +139 -0
  182. package/nitrogen/generated/ios/swift/HybridCactusDeviceInfoSpec.swift +58 -0
  183. package/nitrogen/generated/ios/swift/HybridCactusDeviceInfoSpec_cxx.swift +164 -0
  184. package/nitrogen/generated/ios/swift/HybridCactusFileSystemSpec.swift +65 -0
  185. package/nitrogen/generated/ios/swift/HybridCactusFileSystemSpec_cxx.swift +303 -0
  186. package/nitrogen/generated/shared/c++/DeviceInfo.hpp +92 -0
  187. package/nitrogen/generated/shared/c++/HybridCactusCryptoSpec.cpp +21 -0
  188. package/nitrogen/generated/shared/c++/HybridCactusCryptoSpec.hpp +63 -0
  189. package/nitrogen/generated/shared/c++/HybridCactusDeviceInfoSpec.cpp +22 -0
  190. package/nitrogen/generated/shared/c++/HybridCactusDeviceInfoSpec.hpp +67 -0
  191. package/nitrogen/generated/shared/c++/HybridCactusFileSystemSpec.cpp +29 -0
  192. package/nitrogen/generated/shared/c++/HybridCactusFileSystemSpec.hpp +73 -0
  193. package/nitrogen/generated/shared/c++/HybridCactusSpec.cpp +26 -0
  194. package/nitrogen/generated/shared/c++/HybridCactusSpec.hpp +71 -0
  195. package/nitrogen/generated/shared/c++/HybridCactusUtilSpec.cpp +23 -0
  196. package/nitrogen/generated/shared/c++/HybridCactusUtilSpec.hpp +66 -0
  197. package/package.json +84 -143
  198. package/src/api/Database.ts +83 -0
  199. package/src/classes/CactusLM.ts +205 -0
  200. package/src/config/CactusConfig.ts +4 -0
  201. package/src/constants/packageVersion.ts +1 -0
  202. package/src/hooks/useCactusLM.ts +285 -0
  203. package/src/index.tsx +23 -0
  204. package/src/native/Cactus.ts +83 -0
  205. package/src/native/CactusCrypto.ts +11 -0
  206. package/src/native/CactusDeviceInfo.ts +18 -0
  207. package/src/native/CactusFileSystem.ts +47 -0
  208. package/src/native/CactusUtil.ts +27 -0
  209. package/src/native/index.ts +5 -0
  210. package/src/specs/Cactus.nitro.ts +20 -0
  211. package/src/specs/CactusCrypto.nitro.ts +6 -0
  212. package/src/specs/CactusDeviceInfo.nitro.ts +15 -0
  213. package/src/specs/CactusFileSystem.nitro.ts +21 -0
  214. package/src/specs/CactusUtil.nitro.ts +8 -0
  215. package/src/telemetry/Telemetry.ts +159 -0
  216. package/src/types/CactusLM.ts +73 -0
  217. package/src/types/CactusModel.ts +14 -0
  218. package/src/utils/error.ts +2 -0
  219. package/LICENSE.txt +0 -20
  220. package/android/src/main/CMakeLists.txt +0 -140
  221. package/android/src/main/java/com/cactus/Cactus.java +0 -1190
  222. package/android/src/main/java/com/cactus/CactusPackage.java +0 -48
  223. package/android/src/main/java/com/cactus/LlamaContext.java +0 -748
  224. package/android/src/main/jni-utils.h +0 -100
  225. package/android/src/main/jni.cpp +0 -1605
  226. package/android/src/main/jniLibs/arm64-v8a/libcactus.so +0 -0
  227. package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2.so +0 -0
  228. package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2_dotprod.so +0 -0
  229. package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2_dotprod_i8mm.so +0 -0
  230. package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2_i8mm.so +0 -0
  231. package/android/src/newarch/java/com/cactus/CactusModule.java +0 -204
  232. package/android/src/oldarch/java/com/cactus/CactusModule.java +0 -205
  233. package/cactus-react-native.podspec +0 -42
  234. package/ios/CMakeLists.txt +0 -131
  235. package/ios/Cactus.h +0 -6
  236. package/ios/Cactus.mm +0 -681
  237. package/ios/CactusContext.h +0 -81
  238. package/ios/CactusContext.mm +0 -1032
  239. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/chat.h +0 -145
  240. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/common.h +0 -674
  241. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-alloc.h +0 -76
  242. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-backend-impl.h +0 -255
  243. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-backend.h +0 -354
  244. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-common.h +0 -1857
  245. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-cpp.h +0 -39
  246. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-cpu.h +0 -143
  247. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-impl.h +0 -601
  248. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-metal-impl.h +0 -622
  249. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-metal.h +0 -66
  250. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-opt.h +0 -237
  251. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-quants.h +0 -100
  252. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml-threading.h +0 -14
  253. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ggml.h +0 -2202
  254. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/gguf.h +0 -202
  255. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/json-schema-to-grammar.h +0 -21
  256. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/json.hpp +0 -24766
  257. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-adapter.h +0 -76
  258. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-arch.h +0 -437
  259. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-batch.h +0 -89
  260. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-chat.h +0 -58
  261. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-context.h +0 -276
  262. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-cparams.h +0 -39
  263. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-cpp.h +0 -30
  264. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-grammar.h +0 -173
  265. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-graph.h +0 -640
  266. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-hparams.h +0 -190
  267. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-impl.h +0 -61
  268. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-io.h +0 -35
  269. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-kv-cache.h +0 -515
  270. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-memory.h +0 -32
  271. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-mmap.h +0 -68
  272. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-model-loader.h +0 -169
  273. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-model-saver.h +0 -37
  274. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-model.h +0 -425
  275. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-sampling.h +0 -32
  276. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama-vocab.h +0 -131
  277. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/llama.h +0 -1376
  278. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/log.h +0 -103
  279. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/minja/chat-template.hpp +0 -542
  280. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/minja/minja.hpp +0 -2974
  281. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/sampling.h +0 -107
  282. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/unicode-data.h +0 -20
  283. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/unicode.h +0 -66
  284. package/ios/cactus.xcframework/ios-arm64/cactus.framework/ggml-llama.metallib +0 -0
  285. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/cactus.h +0 -232
  286. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/cactus_ffi.h +0 -256
  287. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/chat.h +0 -145
  288. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/common.h +0 -674
  289. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-alloc.h +0 -76
  290. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-backend-impl.h +0 -255
  291. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-backend.h +0 -354
  292. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-common.h +0 -1857
  293. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-cpp.h +0 -39
  294. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-cpu.h +0 -143
  295. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-impl.h +0 -601
  296. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-metal-impl.h +0 -622
  297. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-metal.h +0 -66
  298. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-opt.h +0 -237
  299. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-quants.h +0 -100
  300. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml-threading.h +0 -14
  301. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/ggml.h +0 -2202
  302. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/gguf.h +0 -202
  303. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/json-schema-to-grammar.h +0 -21
  304. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/json.hpp +0 -24766
  305. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-adapter.h +0 -76
  306. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-arch.h +0 -437
  307. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-batch.h +0 -89
  308. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-chat.h +0 -58
  309. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-context.h +0 -276
  310. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-cparams.h +0 -39
  311. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-cpp.h +0 -30
  312. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-grammar.h +0 -173
  313. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-graph.h +0 -640
  314. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-hparams.h +0 -190
  315. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-impl.h +0 -61
  316. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-io.h +0 -35
  317. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-kv-cache.h +0 -515
  318. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-memory.h +0 -32
  319. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-mmap.h +0 -68
  320. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-model-loader.h +0 -169
  321. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-model-saver.h +0 -37
  322. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-model.h +0 -425
  323. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-sampling.h +0 -32
  324. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama-vocab.h +0 -131
  325. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/llama.h +0 -1376
  326. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/log.h +0 -103
  327. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/minja/chat-template.hpp +0 -542
  328. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/minja/minja.hpp +0 -2974
  329. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/sampling.h +0 -107
  330. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/unicode-data.h +0 -20
  331. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/Headers/unicode.h +0 -66
  332. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/cactus +0 -0
  333. package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/ggml-llama-sim.metallib +0 -0
  334. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/cactus.h +0 -232
  335. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/cactus_ffi.h +0 -256
  336. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/chat.h +0 -145
  337. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/common.h +0 -674
  338. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-alloc.h +0 -76
  339. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-backend-impl.h +0 -255
  340. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-backend.h +0 -354
  341. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-common.h +0 -1857
  342. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-cpp.h +0 -39
  343. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-cpu.h +0 -143
  344. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-impl.h +0 -601
  345. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-metal-impl.h +0 -622
  346. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-metal.h +0 -66
  347. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-opt.h +0 -237
  348. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-quants.h +0 -100
  349. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml-threading.h +0 -14
  350. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/ggml.h +0 -2202
  351. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/gguf.h +0 -202
  352. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/json-schema-to-grammar.h +0 -21
  353. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/json.hpp +0 -24766
  354. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-adapter.h +0 -76
  355. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-arch.h +0 -437
  356. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-batch.h +0 -89
  357. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-chat.h +0 -58
  358. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-context.h +0 -276
  359. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-cparams.h +0 -39
  360. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-cpp.h +0 -30
  361. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-grammar.h +0 -173
  362. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-graph.h +0 -640
  363. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-hparams.h +0 -190
  364. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-impl.h +0 -61
  365. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-io.h +0 -35
  366. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-kv-cache.h +0 -515
  367. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-memory.h +0 -32
  368. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-mmap.h +0 -68
  369. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-model-loader.h +0 -169
  370. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-model-saver.h +0 -37
  371. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-model.h +0 -425
  372. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-sampling.h +0 -32
  373. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama-vocab.h +0 -131
  374. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/llama.h +0 -1376
  375. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/log.h +0 -103
  376. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/minja/chat-template.hpp +0 -542
  377. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/minja/minja.hpp +0 -2974
  378. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/sampling.h +0 -107
  379. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/unicode-data.h +0 -20
  380. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Headers/unicode.h +0 -66
  381. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/Info.plist +0 -0
  382. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/cactus +0 -0
  383. package/ios/cactus.xcframework/tvos-arm64/cactus.framework/ggml-llama.metallib +0 -0
  384. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/cactus.h +0 -232
  385. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/cactus_ffi.h +0 -256
  386. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/chat.h +0 -145
  387. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/common.h +0 -674
  388. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-alloc.h +0 -76
  389. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-backend-impl.h +0 -255
  390. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-backend.h +0 -354
  391. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-common.h +0 -1857
  392. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-cpp.h +0 -39
  393. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-cpu.h +0 -143
  394. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-impl.h +0 -601
  395. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-metal-impl.h +0 -622
  396. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-metal.h +0 -66
  397. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-opt.h +0 -237
  398. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-quants.h +0 -100
  399. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml-threading.h +0 -14
  400. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/ggml.h +0 -2202
  401. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/gguf.h +0 -202
  402. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/json-schema-to-grammar.h +0 -21
  403. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/json.hpp +0 -24766
  404. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-adapter.h +0 -76
  405. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-arch.h +0 -437
  406. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-batch.h +0 -89
  407. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-chat.h +0 -58
  408. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-context.h +0 -276
  409. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-cparams.h +0 -39
  410. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-cpp.h +0 -30
  411. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-grammar.h +0 -173
  412. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-graph.h +0 -640
  413. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-hparams.h +0 -190
  414. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-impl.h +0 -61
  415. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-io.h +0 -35
  416. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-kv-cache.h +0 -515
  417. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-memory.h +0 -32
  418. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-mmap.h +0 -68
  419. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-model-loader.h +0 -169
  420. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-model-saver.h +0 -37
  421. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-model.h +0 -425
  422. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-sampling.h +0 -32
  423. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama-vocab.h +0 -131
  424. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/llama.h +0 -1376
  425. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/log.h +0 -103
  426. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/minja/chat-template.hpp +0 -542
  427. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/minja/minja.hpp +0 -2974
  428. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/sampling.h +0 -107
  429. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/unicode-data.h +0 -20
  430. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Headers/unicode.h +0 -66
  431. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/Info.plist +0 -0
  432. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/cactus +0 -0
  433. package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/ggml-llama-sim.metallib +0 -0
  434. package/lib/commonjs/NativeCactus.js +0 -9
  435. package/lib/commonjs/NativeCactus.js.map +0 -1
  436. package/lib/commonjs/agent.js +0 -73
  437. package/lib/commonjs/agent.js.map +0 -1
  438. package/lib/commonjs/chat.js +0 -73
  439. package/lib/commonjs/chat.js.map +0 -1
  440. package/lib/commonjs/index.js +0 -523
  441. package/lib/commonjs/index.js.map +0 -1
  442. package/lib/commonjs/lm.js +0 -272
  443. package/lib/commonjs/lm.js.map +0 -1
  444. package/lib/commonjs/package.json +0 -1
  445. package/lib/commonjs/projectId.js +0 -9
  446. package/lib/commonjs/projectId.js.map +0 -1
  447. package/lib/commonjs/remote.js +0 -100
  448. package/lib/commonjs/remote.js.map +0 -1
  449. package/lib/commonjs/telemetry.js +0 -102
  450. package/lib/commonjs/telemetry.js.map +0 -1
  451. package/lib/commonjs/tools.js +0 -72
  452. package/lib/commonjs/tools.js.map +0 -1
  453. package/lib/commonjs/tts.js +0 -141
  454. package/lib/commonjs/tts.js.map +0 -1
  455. package/lib/commonjs/vlm.js +0 -221
  456. package/lib/commonjs/vlm.js.map +0 -1
  457. package/lib/module/NativeCactus.js +0 -5
  458. package/lib/module/NativeCactus.js.map +0 -1
  459. package/lib/module/agent.js +0 -68
  460. package/lib/module/agent.js.map +0 -1
  461. package/lib/module/chat.js +0 -67
  462. package/lib/module/chat.js.map +0 -1
  463. package/lib/module/lm.js +0 -267
  464. package/lib/module/lm.js.map +0 -1
  465. package/lib/module/projectId.js +0 -5
  466. package/lib/module/projectId.js.map +0 -1
  467. package/lib/module/remote.js +0 -91
  468. package/lib/module/remote.js.map +0 -1
  469. package/lib/module/telemetry.js +0 -97
  470. package/lib/module/telemetry.js.map +0 -1
  471. package/lib/module/tools.js +0 -66
  472. package/lib/module/tools.js.map +0 -1
  473. package/lib/module/tts.js +0 -135
  474. package/lib/module/tts.js.map +0 -1
  475. package/lib/module/vlm.js +0 -216
  476. package/lib/module/vlm.js.map +0 -1
  477. package/lib/typescript/NativeCactus.d.ts +0 -252
  478. package/lib/typescript/NativeCactus.d.ts.map +0 -1
  479. package/lib/typescript/agent.d.ts +0 -31
  480. package/lib/typescript/agent.d.ts.map +0 -1
  481. package/lib/typescript/chat.d.ts +0 -23
  482. package/lib/typescript/chat.d.ts.map +0 -1
  483. package/lib/typescript/index.d.ts +0 -114
  484. package/lib/typescript/index.d.ts.map +0 -1
  485. package/lib/typescript/lm.d.ts +0 -36
  486. package/lib/typescript/lm.d.ts.map +0 -1
  487. package/lib/typescript/projectId.d.ts +0 -2
  488. package/lib/typescript/projectId.d.ts.map +0 -1
  489. package/lib/typescript/remote.d.ts +0 -8
  490. package/lib/typescript/remote.d.ts.map +0 -1
  491. package/lib/typescript/telemetry.d.ts +0 -25
  492. package/lib/typescript/telemetry.d.ts.map +0 -1
  493. package/lib/typescript/tools.d.ts +0 -36
  494. package/lib/typescript/tools.d.ts.map +0 -1
  495. package/lib/typescript/tts.d.ts +0 -54
  496. package/lib/typescript/tts.d.ts.map +0 -1
  497. package/lib/typescript/vlm.d.ts +0 -33
  498. package/lib/typescript/vlm.d.ts.map +0 -1
  499. package/scripts/postInstall.js +0 -33
  500. package/src/NativeCactus.ts +0 -317
  501. package/src/agent.ts +0 -112
  502. package/src/chat.ts +0 -91
  503. package/src/index.ts +0 -663
  504. package/src/lm.ts +0 -324
  505. package/src/projectId.ts +0 -1
  506. package/src/remote.ts +0 -113
  507. package/src/telemetry.ts +0 -137
  508. package/src/tools.ts +0 -94
  509. package/src/tts.ts +0 -236
  510. package/src/vlm.ts +0 -276
@@ -1,1605 +0,0 @@
1
- #include <jni.h>
2
- // #include <android/asset_manager.h>
3
- // #include <android/asset_manager_jni.h>
4
- #include <android/log.h>
5
- #include <cstdlib>
6
- #include <ctime>
7
- #include <sys/sysinfo.h>
8
- #include <string>
9
- #include <thread>
10
- #include <unordered_map>
11
- #include "json-schema-to-grammar.h"
12
- #include "llama.h"
13
- #include "llama-impl.h"
14
- #include "ggml.h"
15
- #include "cactus.h"
16
- #include "jni-utils.h"
17
- #define UNUSED(x) (void)(x)
18
- #define TAG "CACTUS_ANDROID_JNI"
19
-
20
- #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
21
- #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
22
- #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
23
- static inline int min(int a, int b) {
24
- return (a < b) ? a : b;
25
- }
26
-
27
- static void cactus_log_callback_default(lm_ggml_log_level level, const char * fmt, void * data) {
28
- if (level == LM_GGML_LOG_LEVEL_ERROR) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, data);
29
- else if (level == LM_GGML_LOG_LEVEL_INFO) __android_log_print(ANDROID_LOG_INFO, TAG, fmt, data);
30
- else if (level == LM_GGML_LOG_LEVEL_WARN) __android_log_print(ANDROID_LOG_WARN, TAG, fmt, data);
31
- else __android_log_print(ANDROID_LOG_DEFAULT, TAG, fmt, data);
32
- }
33
-
34
- extern "C" {
35
-
36
- // Method to create WritableMap
37
- static inline jobject createWriteableMap(JNIEnv *env) {
38
- jclass mapClass = env->FindClass("com/facebook/react/bridge/Arguments");
39
- jmethodID init = env->GetStaticMethodID(mapClass, "createMap", "()Lcom/facebook/react/bridge/WritableMap;");
40
- jobject map = env->CallStaticObjectMethod(mapClass, init);
41
- return map;
42
- }
43
-
44
- // Method to put string into WritableMap
45
- static inline void putString(JNIEnv *env, jobject map, const char *key, const char *value) {
46
- jclass mapClass = env->FindClass("com/facebook/react/bridge/WritableMap");
47
- jmethodID putStringMethod = env->GetMethodID(mapClass, "putString", "(Ljava/lang/String;Ljava/lang/String;)V");
48
-
49
- jstring jKey = env->NewStringUTF(key);
50
- jstring jValue = env->NewStringUTF(value);
51
-
52
- env->CallVoidMethod(map, putStringMethod, jKey, jValue);
53
- }
54
-
55
- // Method to put int into WritableMap
56
- static inline void putInt(JNIEnv *env, jobject map, const char *key, int value) {
57
- jclass mapClass = env->FindClass("com/facebook/react/bridge/WritableMap");
58
- jmethodID putIntMethod = env->GetMethodID(mapClass, "putInt", "(Ljava/lang/String;I)V");
59
-
60
- jstring jKey = env->NewStringUTF(key);
61
-
62
- env->CallVoidMethod(map, putIntMethod, jKey, value);
63
- }
64
-
65
- // Method to put double into WritableMap
66
- static inline void putDouble(JNIEnv *env, jobject map, const char *key, double value) {
67
- jclass mapClass = env->FindClass("com/facebook/react/bridge/WritableMap");
68
- jmethodID putDoubleMethod = env->GetMethodID(mapClass, "putDouble", "(Ljava/lang/String;D)V");
69
-
70
- jstring jKey = env->NewStringUTF(key);
71
-
72
- env->CallVoidMethod(map, putDoubleMethod, jKey, value);
73
- }
74
-
75
- // Method to put boolean into WritableMap
76
- static inline void putBoolean(JNIEnv *env, jobject map, const char *key, bool value) {
77
- jclass mapClass = env->FindClass("com/facebook/react/bridge/WritableMap");
78
- jmethodID putBooleanMethod = env->GetMethodID(mapClass, "putBoolean", "(Ljava/lang/String;Z)V");
79
-
80
- jstring jKey = env->NewStringUTF(key);
81
-
82
- env->CallVoidMethod(map, putBooleanMethod, jKey, value);
83
- }
84
-
85
- // Method to put WriteableMap into WritableMap
86
- static inline void putMap(JNIEnv *env, jobject map, const char *key, jobject value) {
87
- jclass mapClass = env->FindClass("com/facebook/react/bridge/WritableMap");
88
- jmethodID putMapMethod = env->GetMethodID(mapClass, "putMap", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableMap;)V");
89
-
90
- jstring jKey = env->NewStringUTF(key);
91
-
92
- env->CallVoidMethod(map, putMapMethod, jKey, value);
93
- }
94
-
95
- // Method to create WritableArray
96
- static inline jobject createWritableArray(JNIEnv *env) {
97
- jclass mapClass = env->FindClass("com/facebook/react/bridge/Arguments");
98
- jmethodID init = env->GetStaticMethodID(mapClass, "createArray", "()Lcom/facebook/react/bridge/WritableArray;");
99
- jobject map = env->CallStaticObjectMethod(mapClass, init);
100
- return map;
101
- }
102
-
103
- // Method to push int into WritableArray
104
- static inline void pushInt(JNIEnv *env, jobject arr, int value) {
105
- jclass mapClass = env->FindClass("com/facebook/react/bridge/WritableArray");
106
- jmethodID pushIntMethod = env->GetMethodID(mapClass, "pushInt", "(I)V");
107
-
108
- env->CallVoidMethod(arr, pushIntMethod, value);
109
- }
110
-
111
- // Method to push double into WritableArray
112
- static inline void pushDouble(JNIEnv *env, jobject arr, double value) {
113
- jclass mapClass = env->FindClass("com/facebook/react/bridge/WritableArray");
114
- jmethodID pushDoubleMethod = env->GetMethodID(mapClass, "pushDouble", "(D)V");
115
-
116
- env->CallVoidMethod(arr, pushDoubleMethod, value);
117
- }
118
-
119
- // Method to push string into WritableArray
120
- static inline void pushString(JNIEnv *env, jobject arr, const char *value) {
121
- jclass mapClass = env->FindClass("com/facebook/react/bridge/WritableArray");
122
- jmethodID pushStringMethod = env->GetMethodID(mapClass, "pushString", "(Ljava/lang/String;)V");
123
-
124
- jstring jValue = env->NewStringUTF(value);
125
- env->CallVoidMethod(arr, pushStringMethod, jValue);
126
- }
127
-
128
- // Method to push WritableMap into WritableArray
129
- static inline void pushMap(JNIEnv *env, jobject arr, jobject value) {
130
- jclass mapClass = env->FindClass("com/facebook/react/bridge/WritableArray");
131
- jmethodID pushMapMethod = env->GetMethodID(mapClass, "pushMap", "(Lcom/facebook/react/bridge/ReadableMap;)V");
132
-
133
- env->CallVoidMethod(arr, pushMapMethod, value);
134
- }
135
-
136
- // Method to put WritableArray into WritableMap
137
- static inline void putArray(JNIEnv *env, jobject map, const char *key, jobject value) {
138
- jclass mapClass = env->FindClass("com/facebook/react/bridge/WritableMap");
139
- jmethodID putArrayMethod = env->GetMethodID(mapClass, "putArray", "(Ljava/lang/String;Lcom/facebook/react/bridge/ReadableArray;)V");
140
-
141
- jstring jKey = env->NewStringUTF(key);
142
-
143
- env->CallVoidMethod(map, putArrayMethod, jKey, value);
144
- }
145
-
146
- JNIEXPORT jobject JNICALL
147
- Java_com_cactus_LlamaContext_modelInfo(
148
- JNIEnv *env,
149
- jobject thiz,
150
- jstring model_path_str,
151
- jobjectArray skip
152
- ) {
153
- UNUSED(thiz);
154
-
155
- const char *model_path_chars = env->GetStringUTFChars(model_path_str, nullptr);
156
-
157
- std::vector<std::string> skip_vec;
158
- int skip_len = env->GetArrayLength(skip);
159
- for (int i = 0; i < skip_len; i++) {
160
- jstring skip_str = (jstring) env->GetObjectArrayElement(skip, i);
161
- const char *skip_chars = env->GetStringUTFChars(skip_str, nullptr);
162
- skip_vec.push_back(skip_chars);
163
- env->ReleaseStringUTFChars(skip_str, skip_chars);
164
- }
165
-
166
- struct lm_gguf_init_params params = {
167
- /*.no_alloc = */ false,
168
- /*.ctx = */ NULL,
169
- };
170
- struct lm_gguf_context * ctx = lm_gguf_init_from_file(model_path_chars, params);
171
-
172
- if (!ctx) {
173
- LOGI("%s: failed to load '%s'\n", __func__, model_path_chars);
174
- return nullptr;
175
- }
176
-
177
- auto info = createWriteableMap(env);
178
- putInt(env, info, "version", lm_gguf_get_version(ctx));
179
- putInt(env, info, "alignment", lm_gguf_get_alignment(ctx));
180
- putInt(env, info, "data_offset", lm_gguf_get_data_offset(ctx));
181
- {
182
- const int n_kv = lm_gguf_get_n_kv(ctx);
183
-
184
- for (int i = 0; i < n_kv; ++i) {
185
- const char * key = lm_gguf_get_key(ctx, i);
186
-
187
- bool skipped = false;
188
- if (skip_len > 0) {
189
- for (int j = 0; j < skip_len; j++) {
190
- if (skip_vec[j] == key) {
191
- skipped = true;
192
- break;
193
- }
194
- }
195
- }
196
-
197
- if (skipped) {
198
- continue;
199
- }
200
-
201
- const std::string value = lm_gguf_kv_to_str(ctx, i);
202
- putString(env, info, key, value.c_str());
203
- }
204
- }
205
-
206
- env->ReleaseStringUTFChars(model_path_str, model_path_chars);
207
- lm_gguf_free(ctx);
208
-
209
- return reinterpret_cast<jobject>(info);
210
- }
211
-
212
- struct callback_context {
213
- JNIEnv *env;
214
- cactus::cactus_context *llama;
215
- jobject callback;
216
- };
217
-
218
- std::unordered_map<long, cactus::cactus_context *> context_map;
219
-
220
- JNIEXPORT jlong JNICALL
221
- Java_com_cactus_LlamaContext_initContext(
222
- JNIEnv *env,
223
- jobject thiz,
224
- jstring model_path_str,
225
- jstring chat_template,
226
- jstring reasoning_format,
227
- jboolean embedding,
228
- jint embd_normalize,
229
- jint n_ctx,
230
- jint n_batch,
231
- jint n_ubatch,
232
- jint n_threads,
233
- jint n_gpu_layers, // TODO: Support this
234
- jboolean flash_attn,
235
- jstring cache_type_k,
236
- jstring cache_type_v,
237
- jboolean use_mlock,
238
- jboolean use_mmap,
239
- jboolean vocab_only,
240
- jstring lora_str,
241
- jfloat lora_scaled,
242
- jobject lora_list,
243
- jfloat rope_freq_base,
244
- jfloat rope_freq_scale,
245
- jint pooling_type,
246
- jobject load_progress_callback
247
- ) {
248
- UNUSED(thiz);
249
-
250
- common_params defaultParams;
251
-
252
- defaultParams.vocab_only = vocab_only;
253
- if(vocab_only) {
254
- defaultParams.warmup = false;
255
- }
256
-
257
- const char *model_path_chars = env->GetStringUTFChars(model_path_str, nullptr);
258
- defaultParams.model.path = model_path_chars;
259
-
260
- const char *chat_template_chars = env->GetStringUTFChars(chat_template, nullptr);
261
- defaultParams.chat_template = chat_template_chars;
262
-
263
- const char *reasoning_format_chars = env->GetStringUTFChars(reasoning_format, nullptr);
264
- if (strcmp(reasoning_format_chars, "deepseek") == 0) {
265
- defaultParams.reasoning_format = COMMON_REASONING_FORMAT_DEEPSEEK;
266
- } else {
267
- defaultParams.reasoning_format = COMMON_REASONING_FORMAT_NONE;
268
- }
269
-
270
- defaultParams.n_ctx = n_ctx;
271
- defaultParams.n_batch = n_batch;
272
- defaultParams.n_ubatch = n_ubatch;
273
-
274
- if (pooling_type != -1) {
275
- defaultParams.pooling_type = static_cast<enum llama_pooling_type>(pooling_type);
276
- }
277
-
278
- defaultParams.embedding = embedding;
279
- if (embd_normalize != -1) {
280
- defaultParams.embd_normalize = embd_normalize;
281
- }
282
- if (embedding) {
283
- // For non-causal models, batch size must be equal to ubatch size
284
- defaultParams.n_ubatch = defaultParams.n_batch;
285
- }
286
-
287
- int max_threads = std::thread::hardware_concurrency();
288
- // Use 2 threads by default on 4-core devices, 4 threads on more cores
289
- int default_n_threads = max_threads == 4 ? 2 : min(4, max_threads);
290
- defaultParams.cpuparams.n_threads = n_threads > 0 ? n_threads : default_n_threads;
291
-
292
- defaultParams.n_gpu_layers = n_gpu_layers;
293
- defaultParams.flash_attn = flash_attn;
294
-
295
- const char *cache_type_k_chars = env->GetStringUTFChars(cache_type_k, nullptr);
296
- const char *cache_type_v_chars = env->GetStringUTFChars(cache_type_v, nullptr);
297
- defaultParams.cache_type_k = cactus::kv_cache_type_from_str(cache_type_k_chars);
298
- defaultParams.cache_type_v = cactus::kv_cache_type_from_str(cache_type_v_chars);
299
-
300
- defaultParams.use_mlock = use_mlock;
301
- defaultParams.use_mmap = use_mmap;
302
-
303
- defaultParams.rope_freq_base = rope_freq_base;
304
- defaultParams.rope_freq_scale = rope_freq_scale;
305
-
306
- auto llama = new cactus::cactus_context();
307
- llama->is_load_interrupted = false;
308
- llama->loading_progress = 0;
309
-
310
- callback_context *cb_ctx = nullptr;
311
- if (load_progress_callback != nullptr) {
312
- defaultParams.progress_callback = [](float progress, void * user_data) {
313
- callback_context *cb_ctx = (callback_context *)user_data;
314
- JNIEnv *env = cb_ctx->env;
315
- auto llama = cb_ctx->llama;
316
- jobject callback = cb_ctx->callback;
317
- int percentage = (int) (100 * progress);
318
- if (percentage > llama->loading_progress) {
319
- llama->loading_progress = percentage;
320
- jclass callback_class = env->GetObjectClass(callback);
321
- jmethodID onLoadProgress = env->GetMethodID(callback_class, "onLoadProgress", "(I)V");
322
- env->CallVoidMethod(callback, onLoadProgress, percentage);
323
- }
324
- return !llama->is_load_interrupted;
325
- };
326
-
327
- cb_ctx = new callback_context;
328
- cb_ctx->env = env;
329
- cb_ctx->llama = llama;
330
- cb_ctx->callback = env->NewGlobalRef(load_progress_callback);
331
- defaultParams.progress_callback_user_data = cb_ctx;
332
- }
333
-
334
- bool is_model_loaded = llama->loadModel(defaultParams);
335
-
336
- env->ReleaseStringUTFChars(model_path_str, model_path_chars);
337
- env->ReleaseStringUTFChars(chat_template, chat_template_chars);
338
- env->ReleaseStringUTFChars(reasoning_format, reasoning_format_chars);
339
- env->ReleaseStringUTFChars(cache_type_k, cache_type_k_chars);
340
- env->ReleaseStringUTFChars(cache_type_v, cache_type_v_chars);
341
-
342
- LOGI("[CACTUS] is_model_loaded %s", (is_model_loaded ? "true" : "false"));
343
-
344
- if (!is_model_loaded) {
345
- llama_free(llama->ctx);
346
- if (cb_ctx) {
347
- env->DeleteGlobalRef(cb_ctx->callback);
348
- delete cb_ctx;
349
- }
350
- delete llama;
351
- return -1;
352
- }
353
-
354
- if (embedding && llama_model_has_encoder(llama->model) && llama_model_has_decoder(llama->model)) {
355
- LOGI("[CACTUS] computing embeddings in encoder-decoder models is not supported");
356
- llama_free(llama->ctx);
357
- if (cb_ctx) {
358
- env->DeleteGlobalRef(cb_ctx->callback);
359
- delete cb_ctx;
360
- }
361
- delete llama;
362
- return -1;
363
- }
364
-
365
- context_map[(long) llama->ctx] = llama;
366
-
367
- std::vector<common_adapter_lora_info> lora;
368
- const char *lora_chars = env->GetStringUTFChars(lora_str, nullptr);
369
- if (lora_chars != nullptr && lora_chars[0] != '\0') {
370
- common_adapter_lora_info la;
371
- la.path = lora_chars;
372
- la.scale = lora_scaled;
373
- lora.push_back(la);
374
- }
375
-
376
- if (lora_list != nullptr) {
377
- // lora_adapters: ReadableArray<ReadableMap>
378
- int lora_list_size = readablearray::size(env, lora_list);
379
- for (int i = 0; i < lora_list_size; i++) {
380
- jobject lora_adapter = readablearray::getMap(env, lora_list, i);
381
- jstring path = readablemap::getString(env, lora_adapter, "path", nullptr);
382
- if (path != nullptr) {
383
- const char *path_chars = env->GetStringUTFChars(path, nullptr);
384
- common_adapter_lora_info la;
385
- la.path = path_chars;
386
- la.scale = readablemap::getFloat(env, lora_adapter, "scaled", 1.0f);
387
- lora.push_back(la);
388
- env->ReleaseStringUTFChars(path, path_chars);
389
- }
390
- }
391
- }
392
- env->ReleaseStringUTFChars(lora_str, lora_chars);
393
- int result = llama->applyLoraAdapters(lora);
394
- if (result != 0) {
395
- LOGI("[Cactus] Failed to apply lora adapters");
396
- context_map.erase((long) llama->ctx);
397
- llama_free(llama->ctx);
398
- if (cb_ctx) {
399
- env->DeleteGlobalRef(cb_ctx->callback);
400
- delete cb_ctx;
401
- }
402
- delete llama;
403
- return -1;
404
- }
405
-
406
- if (cb_ctx) {
407
- env->DeleteGlobalRef(cb_ctx->callback);
408
- delete cb_ctx;
409
- }
410
-
411
- return reinterpret_cast<jlong>(llama->ctx);
412
- }
413
-
414
-
415
- JNIEXPORT void JNICALL
416
- Java_com_cactus_LlamaContext_interruptLoad(
417
- JNIEnv *env,
418
- jobject thiz,
419
- jlong context_ptr
420
- ) {
421
- UNUSED(thiz);
422
- auto llama = context_map[(long) context_ptr];
423
- if (llama) {
424
- llama->is_load_interrupted = true;
425
- }
426
- }
427
-
428
- JNIEXPORT jobject JNICALL
429
- Java_com_cactus_LlamaContext_loadModelDetails(
430
- JNIEnv *env,
431
- jobject thiz,
432
- jlong context_ptr
433
- ) {
434
- UNUSED(thiz);
435
- auto llama = context_map[(long) context_ptr];
436
-
437
- int count = llama_model_meta_count(llama->model);
438
- auto meta = createWriteableMap(env);
439
- for (int i = 0; i < count; i++) {
440
- char key[256];
441
- llama_model_meta_key_by_index(llama->model, i, key, sizeof(key));
442
- char val[4096];
443
- llama_model_meta_val_str_by_index(llama->model, i, val, sizeof(val));
444
-
445
- putString(env, meta, key, val);
446
- }
447
-
448
- auto result = createWriteableMap(env);
449
-
450
- char desc[1024];
451
- llama_model_desc(llama->model, desc, sizeof(desc));
452
-
453
- putString(env, result, "desc", desc);
454
- putDouble(env, result, "size", llama_model_size(llama->model));
455
- putDouble(env, result, "nEmbd", llama_model_n_embd(llama->model));
456
- putDouble(env, result, "nParams", llama_model_n_params(llama->model));
457
- auto chat_templates = createWriteableMap(env);
458
- putBoolean(env, chat_templates, "llamaChat", llama->validateModelChatTemplate(false, nullptr));
459
-
460
- auto minja = createWriteableMap(env);
461
- putBoolean(env, minja, "default", llama->validateModelChatTemplate(true, nullptr));
462
-
463
- auto default_caps = createWriteableMap(env);
464
-
465
- auto default_tmpl = llama->templates.get()->template_default.get();
466
- auto default_tmpl_caps = default_tmpl->original_caps();
467
- putBoolean(env, default_caps, "tools", default_tmpl_caps.supports_tools);
468
- putBoolean(env, default_caps, "toolCalls", default_tmpl_caps.supports_tool_calls);
469
- putBoolean(env, default_caps, "parallelToolCalls", default_tmpl_caps.supports_parallel_tool_calls);
470
- putBoolean(env, default_caps, "toolResponses", default_tmpl_caps.supports_tool_responses);
471
- putBoolean(env, default_caps, "systemRole", default_tmpl_caps.supports_system_role);
472
- putBoolean(env, default_caps, "toolCallId", default_tmpl_caps.supports_tool_call_id);
473
- putMap(env, minja, "defaultCaps", default_caps);
474
-
475
- putBoolean(env, minja, "toolUse", llama->validateModelChatTemplate(true, "tool_use"));
476
- auto tool_use_tmpl = llama->templates.get()->template_tool_use.get();
477
- if (tool_use_tmpl != nullptr) {
478
- auto tool_use_caps = createWriteableMap(env);
479
- auto tool_use_tmpl_caps = tool_use_tmpl->original_caps();
480
- putBoolean(env, tool_use_caps, "tools", tool_use_tmpl_caps.supports_tools);
481
- putBoolean(env, tool_use_caps, "toolCalls", tool_use_tmpl_caps.supports_tool_calls);
482
- putBoolean(env, tool_use_caps, "parallelToolCalls", tool_use_tmpl_caps.supports_parallel_tool_calls);
483
- putBoolean(env, tool_use_caps, "systemRole", tool_use_tmpl_caps.supports_system_role);
484
- putBoolean(env, tool_use_caps, "toolResponses", tool_use_tmpl_caps.supports_tool_responses);
485
- putBoolean(env, tool_use_caps, "toolCallId", tool_use_tmpl_caps.supports_tool_call_id);
486
- putMap(env, minja, "toolUseCaps", tool_use_caps);
487
- }
488
-
489
- putMap(env, chat_templates, "minja", minja);
490
- putMap(env, result, "metadata", meta);
491
- putMap(env, result, "chatTemplates", chat_templates);
492
-
493
- // deprecated
494
- putBoolean(env, result, "isChatTemplateSupported", llama->validateModelChatTemplate(false, nullptr));
495
-
496
- return reinterpret_cast<jobject>(result);
497
- }
498
-
499
- JNIEXPORT jobject JNICALL
500
- Java_com_cactus_LlamaContext_getFormattedChatWithJinja(
501
- JNIEnv *env,
502
- jobject thiz,
503
- jlong context_ptr,
504
- jstring messages,
505
- jstring chat_template,
506
- jstring json_schema,
507
- jstring tools,
508
- jboolean parallel_tool_calls,
509
- jstring tool_choice
510
- ) {
511
- UNUSED(thiz);
512
- auto llama = context_map[(long) context_ptr];
513
-
514
- const char *messages_chars = env->GetStringUTFChars(messages, nullptr);
515
- const char *tmpl_chars = env->GetStringUTFChars(chat_template, nullptr);
516
- const char *json_schema_chars = env->GetStringUTFChars(json_schema, nullptr);
517
- const char *tools_chars = env->GetStringUTFChars(tools, nullptr);
518
- const char *tool_choice_chars = env->GetStringUTFChars(tool_choice, nullptr);
519
-
520
- auto result = createWriteableMap(env);
521
- try {
522
- auto formatted = llama->getFormattedChatWithJinja(
523
- messages_chars,
524
- tmpl_chars,
525
- json_schema_chars,
526
- tools_chars,
527
- parallel_tool_calls,
528
- tool_choice_chars
529
- );
530
- putString(env, result, "prompt", formatted.prompt.c_str());
531
- putInt(env, result, "chat_format", static_cast<int>(formatted.format));
532
- putString(env, result, "grammar", formatted.grammar.c_str());
533
- putBoolean(env, result, "grammar_lazy", formatted.grammar_lazy);
534
- auto grammar_triggers = createWritableArray(env);
535
- for (const auto &trigger : formatted.grammar_triggers) {
536
- auto trigger_map = createWriteableMap(env);
537
- putInt(env, trigger_map, "type", trigger.type);
538
- putString(env, trigger_map, "value", trigger.value.c_str());
539
- putInt(env, trigger_map, "token", trigger.token);
540
- pushMap(env, grammar_triggers, trigger_map);
541
- }
542
- putArray(env, result, "grammar_triggers", grammar_triggers);
543
- auto preserved_tokens = createWritableArray(env);
544
- for (const auto &token : formatted.preserved_tokens) {
545
- pushString(env, preserved_tokens, token.c_str());
546
- }
547
- putArray(env, result, "preserved_tokens", preserved_tokens);
548
- auto additional_stops = createWritableArray(env);
549
- for (const auto &stop : formatted.additional_stops) {
550
- pushString(env, additional_stops, stop.c_str());
551
- }
552
- putArray(env, result, "additional_stops", additional_stops);
553
- } catch (const std::runtime_error &e) {
554
- LOGI("[Cactus] Error: %s", e.what());
555
- putString(env, result, "_error", e.what());
556
- }
557
- env->ReleaseStringUTFChars(tools, tools_chars);
558
- env->ReleaseStringUTFChars(messages, messages_chars);
559
- env->ReleaseStringUTFChars(chat_template, tmpl_chars);
560
- env->ReleaseStringUTFChars(json_schema, json_schema_chars);
561
- env->ReleaseStringUTFChars(tool_choice, tool_choice_chars);
562
- return reinterpret_cast<jobject>(result);
563
- }
564
-
565
- JNIEXPORT jobject JNICALL
566
- Java_com_cactus_LlamaContext_getFormattedChat(
567
- JNIEnv *env,
568
- jobject thiz,
569
- jlong context_ptr,
570
- jstring messages,
571
- jstring chat_template
572
- ) {
573
- UNUSED(thiz);
574
- auto llama = context_map[(long) context_ptr];
575
-
576
- const char *messages_chars = env->GetStringUTFChars(messages, nullptr);
577
- const char *tmpl_chars = env->GetStringUTFChars(chat_template, nullptr);
578
-
579
- std::string formatted_chat = llama->getFormattedChat(messages_chars, tmpl_chars);
580
-
581
- env->ReleaseStringUTFChars(messages, messages_chars);
582
- env->ReleaseStringUTFChars(chat_template, tmpl_chars);
583
-
584
- return env->NewStringUTF(formatted_chat.c_str());
585
- }
586
-
587
- JNIEXPORT jobject JNICALL
588
- Java_com_cactus_LlamaContext_loadSession(
589
- JNIEnv *env,
590
- jobject thiz,
591
- jlong context_ptr,
592
- jstring path
593
- ) {
594
- UNUSED(thiz);
595
- auto llama = context_map[(long) context_ptr];
596
- const char *path_chars = env->GetStringUTFChars(path, nullptr);
597
-
598
- auto result = createWriteableMap(env);
599
- size_t n_token_count_out = 0;
600
- llama->embd.resize(llama->params.n_ctx);
601
- if (!llama_state_load_file(llama->ctx, path_chars, llama->embd.data(), llama->embd.capacity(), &n_token_count_out)) {
602
- env->ReleaseStringUTFChars(path, path_chars);
603
-
604
- putString(env, result, "error", "Failed to load session");
605
- return reinterpret_cast<jobject>(result);
606
- }
607
- llama->embd.resize(n_token_count_out);
608
- env->ReleaseStringUTFChars(path, path_chars);
609
-
610
- const std::string text = cactus::tokens_to_str(llama->ctx, llama->embd.cbegin(), llama->embd.cend());
611
- putInt(env, result, "tokens_loaded", n_token_count_out);
612
- putString(env, result, "prompt", text.c_str());
613
- return reinterpret_cast<jobject>(result);
614
- }
615
-
616
- JNIEXPORT jint JNICALL
617
- Java_com_cactus_LlamaContext_saveSession(
618
- JNIEnv *env,
619
- jobject thiz,
620
- jlong context_ptr,
621
- jstring path,
622
- jint size
623
- ) {
624
- UNUSED(thiz);
625
- auto llama = context_map[(long) context_ptr];
626
-
627
- const char *path_chars = env->GetStringUTFChars(path, nullptr);
628
-
629
- std::vector<llama_token> session_tokens = llama->embd;
630
- int default_size = session_tokens.size();
631
- int save_size = size > 0 && size <= default_size ? size : default_size;
632
- if (!llama_state_save_file(llama->ctx, path_chars, session_tokens.data(), save_size)) {
633
- env->ReleaseStringUTFChars(path, path_chars);
634
- return -1;
635
- }
636
-
637
- env->ReleaseStringUTFChars(path, path_chars);
638
- return session_tokens.size();
639
- }
640
-
641
- static inline jobject tokenProbsToMap(
642
- JNIEnv *env,
643
- cactus::cactus_context *llama,
644
- std::vector<cactus::completion_token_output> probs
645
- ) {
646
- auto result = createWritableArray(env);
647
- for (const auto &prob : probs) {
648
- auto probsForToken = createWritableArray(env);
649
- for (const auto &p : prob.probs) {
650
- std::string tokStr = cactus::tokens_to_output_formatted_string(llama->ctx, p.tok);
651
- auto probResult = createWriteableMap(env);
652
- putString(env, probResult, "tok_str", tokStr.c_str());
653
- putDouble(env, probResult, "prob", p.prob);
654
- pushMap(env, probsForToken, probResult);
655
- }
656
- std::string tokStr = cactus::tokens_to_output_formatted_string(llama->ctx, prob.tok);
657
- auto tokenResult = createWriteableMap(env);
658
- putString(env, tokenResult, "content", tokStr.c_str());
659
- putArray(env, tokenResult, "probs", probsForToken);
660
- pushMap(env, result, tokenResult);
661
- }
662
- return result;
663
- }
664
-
665
- JNIEXPORT jobject JNICALL
666
- Java_com_cactus_LlamaContext_doCompletion(
667
- JNIEnv *env,
668
- jobject thiz,
669
- jlong context_ptr,
670
- jstring prompt,
671
- jint chat_format,
672
- jstring grammar,
673
- jstring json_schema,
674
- jboolean grammar_lazy,
675
- jobject grammar_triggers,
676
- jobject preserved_tokens,
677
- jfloat temperature,
678
- jint n_threads,
679
- jint n_predict,
680
- jint n_probs,
681
- jint penalty_last_n,
682
- jfloat penalty_repeat,
683
- jfloat penalty_freq,
684
- jfloat penalty_present,
685
- jfloat mirostat,
686
- jfloat mirostat_tau,
687
- jfloat mirostat_eta,
688
- jint top_k,
689
- jfloat top_p,
690
- jfloat min_p,
691
- jfloat xtc_threshold,
692
- jfloat xtc_probability,
693
- jfloat typical_p,
694
- jint seed,
695
- jobjectArray stop,
696
- jboolean ignore_eos,
697
- jobjectArray logit_bias,
698
- jfloat dry_multiplier,
699
- jfloat dry_base,
700
- jint dry_allowed_length,
701
- jint dry_penalty_last_n,
702
- jfloat top_n_sigma,
703
- jobjectArray dry_sequence_breakers,
704
- jobject partial_completion_callback
705
- ) {
706
- UNUSED(thiz);
707
- auto llama = context_map[(long) context_ptr];
708
-
709
- // llama->rewind();
710
-
711
- //llama_reset_timings(llama->ctx);
712
-
713
- auto prompt_chars = env->GetStringUTFChars(prompt, nullptr);
714
- llama->params.prompt = prompt_chars;
715
- llama->params.sampling.seed = (seed == -1) ? time(NULL) : seed;
716
-
717
- int max_threads = std::thread::hardware_concurrency();
718
- // Use 2 threads by default on 4-core devices, 4 threads on more cores
719
- int default_n_threads = max_threads == 4 ? 2 : min(4, max_threads);
720
- llama->params.cpuparams.n_threads = n_threads > 0 ? n_threads : default_n_threads;
721
-
722
- llama->params.n_predict = n_predict;
723
- llama->params.sampling.ignore_eos = ignore_eos;
724
-
725
- auto & sparams = llama->params.sampling;
726
- sparams.temp = temperature;
727
- sparams.penalty_last_n = penalty_last_n;
728
- sparams.penalty_repeat = penalty_repeat;
729
- sparams.penalty_freq = penalty_freq;
730
- sparams.penalty_present = penalty_present;
731
- sparams.mirostat = mirostat;
732
- sparams.mirostat_tau = mirostat_tau;
733
- sparams.mirostat_eta = mirostat_eta;
734
- sparams.top_k = top_k;
735
- sparams.top_p = top_p;
736
- sparams.min_p = min_p;
737
- sparams.typ_p = typical_p;
738
- sparams.n_probs = n_probs;
739
- sparams.xtc_threshold = xtc_threshold;
740
- sparams.xtc_probability = xtc_probability;
741
- sparams.dry_multiplier = dry_multiplier;
742
- sparams.dry_base = dry_base;
743
- sparams.dry_allowed_length = dry_allowed_length;
744
- sparams.dry_penalty_last_n = dry_penalty_last_n;
745
- sparams.top_n_sigma = top_n_sigma;
746
-
747
- // grammar
748
- auto grammar_chars = env->GetStringUTFChars(grammar, nullptr);
749
- if (grammar_chars && grammar_chars[0] != '\0') {
750
- sparams.grammar = grammar_chars;
751
- }
752
- sparams.grammar_lazy = grammar_lazy;
753
-
754
- if (preserved_tokens != nullptr) {
755
- int preserved_tokens_size = readablearray::size(env, preserved_tokens);
756
- for (int i = 0; i < preserved_tokens_size; i++) {
757
- jstring preserved_token = readablearray::getString(env, preserved_tokens, i);
758
- auto ids = common_tokenize(llama->ctx, env->GetStringUTFChars(preserved_token, nullptr), /* add_special= */ false, /* parse_special= */ true);
759
- if (ids.size() == 1) {
760
- sparams.preserved_tokens.insert(ids[0]);
761
- } else {
762
- LOGI("[Cactus] Not preserved because more than 1 token (wrong chat template override?): %s", env->GetStringUTFChars(preserved_token, nullptr));
763
- }
764
- }
765
- }
766
-
767
- if (grammar_triggers != nullptr) {
768
- int grammar_triggers_size = readablearray::size(env, grammar_triggers);
769
- for (int i = 0; i < grammar_triggers_size; i++) {
770
- auto trigger_map = readablearray::getMap(env, grammar_triggers, i);
771
- const auto type = static_cast<common_grammar_trigger_type>(readablemap::getInt(env, trigger_map, "type", 0));
772
- jstring trigger_word = readablemap::getString(env, trigger_map, "value", nullptr);
773
- auto word = env->GetStringUTFChars(trigger_word, nullptr);
774
-
775
- if (type == COMMON_GRAMMAR_TRIGGER_TYPE_WORD) {
776
- auto ids = common_tokenize(llama->ctx, word, /* add_special= */ false, /* parse_special= */ true);
777
- if (ids.size() == 1) {
778
- auto token = ids[0];
779
- if (std::find(sparams.preserved_tokens.begin(), sparams.preserved_tokens.end(), (llama_token) token) == sparams.preserved_tokens.end()) {
780
- throw std::runtime_error("Grammar trigger word should be marked as preserved token");
781
- }
782
- common_grammar_trigger trigger;
783
- trigger.type = COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN;
784
- trigger.value = word;
785
- trigger.token = token;
786
- sparams.grammar_triggers.push_back(std::move(trigger));
787
- } else {
788
- sparams.grammar_triggers.push_back({COMMON_GRAMMAR_TRIGGER_TYPE_WORD, word});
789
- }
790
- } else {
791
- common_grammar_trigger trigger;
792
- trigger.type = type;
793
- trigger.value = word;
794
- if (type == COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN) {
795
- const auto token = (llama_token) readablemap::getInt(env, trigger_map, "token", 0);
796
- trigger.token = token;
797
- }
798
- sparams.grammar_triggers.push_back(std::move(trigger));
799
- }
800
- }
801
- }
802
-
803
- auto json_schema_chars = env->GetStringUTFChars(json_schema, nullptr);
804
- if ((!grammar_chars || grammar_chars[0] == '\0') && json_schema_chars && json_schema_chars[0] != '\0') {
805
- auto schema = json::parse(json_schema_chars);
806
- sparams.grammar = json_schema_to_grammar(schema);
807
- }
808
- env->ReleaseStringUTFChars(json_schema, json_schema_chars);
809
-
810
-
811
- const llama_model * model = llama_get_model(llama->ctx);
812
- const llama_vocab * vocab = llama_model_get_vocab(model);
813
-
814
- sparams.logit_bias.clear();
815
- if (ignore_eos) {
816
- sparams.logit_bias[llama_vocab_eos(vocab)].bias = -INFINITY;
817
- }
818
-
819
- // dry break seq
820
-
821
- jint size = env->GetArrayLength(dry_sequence_breakers);
822
- std::vector<std::string> dry_sequence_breakers_vector;
823
-
824
- for (jint i = 0; i < size; i++) {
825
- jstring javaString = (jstring)env->GetObjectArrayElement(dry_sequence_breakers, i);
826
- const char *nativeString = env->GetStringUTFChars(javaString, 0);
827
- dry_sequence_breakers_vector.push_back(std::string(nativeString));
828
- env->ReleaseStringUTFChars(javaString, nativeString);
829
- env->DeleteLocalRef(javaString);
830
- }
831
-
832
- sparams.dry_sequence_breakers = dry_sequence_breakers_vector;
833
-
834
- // logit bias
835
- const int n_vocab = llama_vocab_n_tokens(vocab);
836
- jsize logit_bias_len = env->GetArrayLength(logit_bias);
837
-
838
- for (jsize i = 0; i < logit_bias_len; i++) {
839
- jdoubleArray el = (jdoubleArray) env->GetObjectArrayElement(logit_bias, i);
840
- if (el && env->GetArrayLength(el) == 2) {
841
- jdouble* doubleArray = env->GetDoubleArrayElements(el, 0);
842
-
843
- llama_token tok = static_cast<llama_token>(doubleArray[0]);
844
- if (tok >= 0 && tok < n_vocab) {
845
- if (doubleArray[1] != 0) { // If the second element is not false (0)
846
- sparams.logit_bias[tok].bias = doubleArray[1];
847
- } else {
848
- sparams.logit_bias[tok].bias = -INFINITY;
849
- }
850
- }
851
-
852
- env->ReleaseDoubleArrayElements(el, doubleArray, 0);
853
- }
854
- env->DeleteLocalRef(el);
855
- }
856
-
857
- llama->params.antiprompt.clear();
858
- int stop_len = env->GetArrayLength(stop);
859
- for (int i = 0; i < stop_len; i++) {
860
- jstring stop_str = (jstring) env->GetObjectArrayElement(stop, i);
861
- const char *stop_chars = env->GetStringUTFChars(stop_str, nullptr);
862
- llama->params.antiprompt.push_back(stop_chars);
863
- env->ReleaseStringUTFChars(stop_str, stop_chars);
864
- }
865
-
866
- if (!llama->initSampling()) {
867
- auto result = createWriteableMap(env);
868
- putString(env, result, "error", "Failed to initialize sampling");
869
- return reinterpret_cast<jobject>(result);
870
- }
871
- llama->beginCompletion();
872
- llama->loadPrompt();
873
-
874
- size_t sent_count = 0;
875
- size_t sent_token_probs_index = 0;
876
-
877
- while (llama->has_next_token && !llama->is_interrupted) {
878
- const cactus::completion_token_output token_with_probs = llama->doCompletion();
879
- if (token_with_probs.tok == -1 || llama->incomplete) {
880
- continue;
881
- }
882
- const std::string token_text = common_token_to_piece(llama->ctx, token_with_probs.tok);
883
-
884
- size_t pos = std::min(sent_count, llama->generated_text.size());
885
-
886
- const std::string str_test = llama->generated_text.substr(pos);
887
- bool is_stop_full = false;
888
- size_t stop_pos =
889
- llama->findStoppingStrings(str_test, token_text.size(), cactus::STOP_FULL);
890
- if (stop_pos != std::string::npos) {
891
- is_stop_full = true;
892
- llama->generated_text.erase(
893
- llama->generated_text.begin() + pos + stop_pos,
894
- llama->generated_text.end());
895
- pos = std::min(sent_count, llama->generated_text.size());
896
- } else {
897
- is_stop_full = false;
898
- stop_pos = llama->findStoppingStrings(str_test, token_text.size(),
899
- cactus::STOP_PARTIAL);
900
- }
901
-
902
- if (
903
- stop_pos == std::string::npos ||
904
- // Send rest of the text if we are at the end of the generation
905
- (!llama->has_next_token && !is_stop_full && stop_pos > 0)
906
- ) {
907
- const std::string to_send = llama->generated_text.substr(pos, std::string::npos);
908
-
909
- sent_count += to_send.size();
910
-
911
- std::vector<cactus::completion_token_output> probs_output = {};
912
-
913
- auto tokenResult = createWriteableMap(env);
914
- putString(env, tokenResult, "token", to_send.c_str());
915
-
916
- if (llama->params.sampling.n_probs > 0) {
917
- const std::vector<llama_token> to_send_toks = common_tokenize(llama->ctx, to_send, false);
918
- size_t probs_pos = std::min(sent_token_probs_index, llama->generated_token_probs.size());
919
- size_t probs_stop_pos = std::min(sent_token_probs_index + to_send_toks.size(), llama->generated_token_probs.size());
920
- if (probs_pos < probs_stop_pos) {
921
- probs_output = std::vector<cactus::completion_token_output>(llama->generated_token_probs.begin() + probs_pos, llama->generated_token_probs.begin() + probs_stop_pos);
922
- }
923
- sent_token_probs_index = probs_stop_pos;
924
-
925
- putArray(env, tokenResult, "completion_probabilities", tokenProbsToMap(env, llama, probs_output));
926
- }
927
-
928
- jclass cb_class = env->GetObjectClass(partial_completion_callback);
929
- jmethodID onPartialCompletion = env->GetMethodID(cb_class, "onPartialCompletion", "(Lcom/facebook/react/bridge/WritableMap;)V");
930
- env->CallVoidMethod(partial_completion_callback, onPartialCompletion, tokenResult);
931
- }
932
- }
933
-
934
- env->ReleaseStringUTFChars(grammar, grammar_chars);
935
- env->ReleaseStringUTFChars(prompt, prompt_chars);
936
- llama_perf_context_print(llama->ctx);
937
- llama->is_predicting = false;
938
-
939
- auto toolCalls = createWritableArray(env);
940
- std::string reasoningContent = "";
941
- std::string content;
942
- auto toolCallsSize = 0;
943
- if (!llama->is_interrupted) {
944
- try {
945
- common_chat_msg message = common_chat_parse(llama->generated_text, static_cast<common_chat_format>(chat_format));
946
- if (!message.reasoning_content.empty()) {
947
- reasoningContent = message.reasoning_content;
948
- }
949
- content = message.content;
950
- for (const auto &tc : message.tool_calls) {
951
- auto toolCall = createWriteableMap(env);
952
- putString(env, toolCall, "type", "function");
953
- auto functionMap = createWriteableMap(env);
954
- putString(env, functionMap, "name", tc.name.c_str());
955
- putString(env, functionMap, "arguments", tc.arguments.c_str());
956
- putMap(env, toolCall, "function", functionMap);
957
- if (!tc.id.empty()) {
958
- putString(env, toolCall, "id", tc.id.c_str());
959
- }
960
- pushMap(env, toolCalls, toolCall);
961
- toolCallsSize++;
962
- }
963
- } catch (const std::exception &e) {
964
- // LOGI("Error parsing tool calls: %s", e.what());
965
- }
966
- }
967
-
968
- auto result = createWriteableMap(env);
969
- putString(env, result, "text", llama->generated_text.c_str());
970
- if (!content.empty()) {
971
- putString(env, result, "content", content.c_str());
972
- }
973
- if (!reasoningContent.empty()) {
974
- putString(env, result, "reasoning_content", reasoningContent.c_str());
975
- }
976
- if (toolCallsSize > 0) {
977
- putArray(env, result, "tool_calls", toolCalls);
978
- }
979
- putArray(env, result, "completion_probabilities", tokenProbsToMap(env, llama, llama->generated_token_probs));
980
- putInt(env, result, "tokens_predicted", llama->num_tokens_predicted);
981
- putInt(env, result, "tokens_evaluated", llama->num_prompt_tokens);
982
- putInt(env, result, "truncated", llama->truncated);
983
- putInt(env, result, "stopped_eos", llama->stopped_eos);
984
- putInt(env, result, "stopped_word", llama->stopped_word);
985
- putInt(env, result, "stopped_limit", llama->stopped_limit);
986
- putString(env, result, "stopping_word", llama->stopping_word.c_str());
987
- putInt(env, result, "tokens_cached", llama->n_past);
988
-
989
- const auto timings_token = llama_perf_context(llama -> ctx);
990
-
991
- auto timingsResult = createWriteableMap(env);
992
- putInt(env, timingsResult, "prompt_n", timings_token.n_p_eval);
993
- putInt(env, timingsResult, "prompt_ms", timings_token.t_p_eval_ms);
994
- putInt(env, timingsResult, "prompt_per_token_ms", timings_token.t_p_eval_ms / timings_token.n_p_eval);
995
- putDouble(env, timingsResult, "prompt_per_second", 1e3 / timings_token.t_p_eval_ms * timings_token.n_p_eval);
996
- putInt(env, timingsResult, "predicted_n", timings_token.n_eval);
997
- putInt(env, timingsResult, "predicted_ms", timings_token.t_eval_ms);
998
- putInt(env, timingsResult, "predicted_per_token_ms", timings_token.t_eval_ms / timings_token.n_eval);
999
- putDouble(env, timingsResult, "predicted_per_second", 1e3 / timings_token.t_eval_ms * timings_token.n_eval);
1000
-
1001
- putMap(env, result, "timings", timingsResult);
1002
-
1003
- return reinterpret_cast<jobject>(result);
1004
- }
1005
-
1006
- // ===== MULTIMODAL COMPLETION SUPPORT =====
1007
- JNIEXPORT jobject JNICALL
1008
- Java_com_cactus_LlamaContext_doMultimodalCompletion(
1009
- JNIEnv *env, jobject thiz, jlong context_ptr, jstring prompt, jobjectArray media_paths,
1010
- jint chat_format, jstring grammar, jstring json_schema, jboolean grammar_lazy,
1011
- jobject grammar_triggers, jobject preserved_tokens, jfloat temperature, jint n_threads,
1012
- jint n_predict, jint n_probs, jint penalty_last_n, jfloat penalty_repeat,
1013
- jfloat penalty_freq, jfloat penalty_present, jfloat mirostat, jfloat mirostat_tau,
1014
- jfloat mirostat_eta, jint top_k, jfloat top_p, jfloat min_p, jfloat xtc_threshold,
1015
- jfloat xtc_probability, jfloat typical_p, jint seed, jobjectArray stop,
1016
- jboolean ignore_eos, jobjectArray logit_bias, jfloat dry_multiplier, jfloat dry_base,
1017
- jint dry_allowed_length, jint dry_penalty_last_n, jfloat top_n_sigma,
1018
- jobjectArray dry_sequence_breakers, jobject partial_completion_callback) {
1019
-
1020
- UNUSED(thiz);
1021
- auto llama = context_map[(long) context_ptr];
1022
-
1023
- if (!llama->isMultimodalEnabled()) {
1024
- auto result = createWriteableMap(env);
1025
- putString(env, result, "error", "Multimodal is not enabled");
1026
- return reinterpret_cast<jobject>(result);
1027
- }
1028
-
1029
- // Set all parameters (same as regular doCompletion)
1030
- const char *prompt_chars = env->GetStringUTFChars(prompt, nullptr);
1031
- llama->params.prompt = prompt_chars;
1032
- llama->params.sampling.seed = seed == -1 ? LLAMA_DEFAULT_SEED : seed;
1033
- llama->params.cpuparams.n_threads = n_threads;
1034
- llama->params.n_predict = n_predict;
1035
- llama->params.sampling.ignore_eos = ignore_eos;
1036
-
1037
- auto & sparams = llama->params.sampling;
1038
- sparams.temp = temperature;
1039
- sparams.n_probs = n_probs;
1040
- sparams.penalty_last_n = penalty_last_n;
1041
- sparams.penalty_repeat = penalty_repeat;
1042
- sparams.penalty_freq = penalty_freq;
1043
- sparams.penalty_present = penalty_present;
1044
- sparams.mirostat = mirostat;
1045
- sparams.mirostat_tau = mirostat_tau;
1046
- sparams.mirostat_eta = mirostat_eta;
1047
- sparams.top_k = top_k;
1048
- sparams.top_p = top_p;
1049
- sparams.min_p = min_p;
1050
- sparams.xtc_threshold = xtc_threshold;
1051
- sparams.xtc_probability = xtc_probability;
1052
- sparams.typ_p = typical_p;
1053
-
1054
- // Convert media paths
1055
- std::vector<std::string> media_paths_vector;
1056
- if (media_paths != nullptr) {
1057
- jsize media_paths_len = env->GetArrayLength(media_paths);
1058
- for (jsize i = 0; i < media_paths_len; i++) {
1059
- jstring media_path = (jstring) env->GetObjectArrayElement(media_paths, i);
1060
- if (media_path != nullptr) {
1061
- const char *media_path_chars = env->GetStringUTFChars(media_path, nullptr);
1062
- media_paths_vector.push_back(std::string(media_path_chars));
1063
- env->ReleaseStringUTFChars(media_path, media_path_chars);
1064
- env->DeleteLocalRef(media_path);
1065
- }
1066
- }
1067
- }
1068
-
1069
- // Initialize sampling and begin completion with media
1070
- if (!llama->initSampling()) {
1071
- auto result = createWriteableMap(env);
1072
- putString(env, result, "error", "Failed to initialize sampling");
1073
- env->ReleaseStringUTFChars(prompt, prompt_chars);
1074
- return reinterpret_cast<jobject>(result);
1075
- }
1076
-
1077
- llama->beginCompletion();
1078
-
1079
- try {
1080
- llama->loadPrompt(media_paths_vector); // Use media-aware loadPrompt
1081
- } catch (const std::exception& e) {
1082
- auto result = createWriteableMap(env);
1083
- putString(env, result, "error", e.what());
1084
- env->ReleaseStringUTFChars(prompt, prompt_chars);
1085
- return reinterpret_cast<jobject>(result);
1086
- }
1087
-
1088
- // Rest of completion logic (same as doCompletion but simplified for key parts)
1089
- size_t sent_count = 0;
1090
- while (llama->has_next_token && !llama->is_interrupted) {
1091
- const cactus::completion_token_output token_with_probs = llama->doCompletion();
1092
- if (token_with_probs.tok == -1 || llama->incomplete) {
1093
- continue;
1094
- }
1095
-
1096
- const std::string token_text = common_token_to_piece(llama->ctx, token_with_probs.tok);
1097
- size_t pos = std::min(sent_count, llama->generated_text.size());
1098
- const std::string str_test = llama->generated_text.substr(pos);
1099
-
1100
- size_t stop_pos = llama->findStoppingStrings(str_test, token_text.size(), cactus::STOP_FULL);
1101
-
1102
- if (stop_pos == std::string::npos || (!llama->has_next_token && stop_pos > 0)) {
1103
- const std::string to_send = llama->generated_text.substr(pos, std::string::npos);
1104
- sent_count += to_send.size();
1105
-
1106
- if (partial_completion_callback != nullptr) {
1107
- auto tokenResult = createWriteableMap(env);
1108
- putString(env, tokenResult, "token", to_send.c_str());
1109
-
1110
- jclass cb_class = env->GetObjectClass(partial_completion_callback);
1111
- jmethodID onPartialCompletion = env->GetMethodID(cb_class, "onPartialCompletion", "(Lcom/facebook/react/bridge/WritableMap;)V");
1112
- env->CallVoidMethod(partial_completion_callback, onPartialCompletion, tokenResult);
1113
- }
1114
- }
1115
- }
1116
-
1117
- llama->is_predicting = false;
1118
-
1119
- auto result = createWriteableMap(env);
1120
- putString(env, result, "text", llama->generated_text.c_str());
1121
- putInt(env, result, "tokens_predicted", llama->num_tokens_predicted);
1122
- putInt(env, result, "tokens_evaluated", llama->num_prompt_tokens);
1123
- putInt(env, result, "truncated", llama->truncated);
1124
- putInt(env, result, "stopped_eos", llama->stopped_eos);
1125
- putInt(env, result, "stopped_word", llama->stopped_word);
1126
- putInt(env, result, "stopped_limit", llama->stopped_limit);
1127
- putString(env, result, "stopping_word", llama->stopping_word.c_str());
1128
- putInt(env, result, "tokens_cached", llama->n_past);
1129
-
1130
- env->ReleaseStringUTFChars(prompt, prompt_chars);
1131
- return reinterpret_cast<jobject>(result);
1132
- }
1133
-
1134
- JNIEXPORT void JNICALL
1135
- Java_com_cactus_LlamaContext_stopCompletion(
1136
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1137
- UNUSED(env);
1138
- UNUSED(thiz);
1139
- auto llama = context_map[(long) context_ptr];
1140
- llama->is_interrupted = true;
1141
- }
1142
-
1143
- JNIEXPORT jboolean JNICALL
1144
- Java_com_cactus_LlamaContext_isPredicting(
1145
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1146
- UNUSED(env);
1147
- UNUSED(thiz);
1148
- auto llama = context_map[(long) context_ptr];
1149
- return llama->is_predicting;
1150
- }
1151
-
1152
- JNIEXPORT jobject JNICALL
1153
- Java_com_cactus_LlamaContext_tokenize(
1154
- JNIEnv *env, jobject thiz, jlong context_ptr, jstring text, jobjectArray media_paths) {
1155
- UNUSED(thiz);
1156
- auto llama = context_map[(long) context_ptr];
1157
-
1158
- const char *text_chars = env->GetStringUTFChars(text, nullptr);
1159
-
1160
- std::vector<std::string> media_paths_vector;
1161
- if (media_paths != nullptr) {
1162
- jsize media_paths_len = env->GetArrayLength(media_paths);
1163
- for (jsize i = 0; i < media_paths_len; i++) {
1164
- jstring media_path = (jstring) env->GetObjectArrayElement(media_paths, i);
1165
- if (media_path != nullptr) {
1166
- const char *media_path_chars = env->GetStringUTFChars(media_path, nullptr);
1167
- media_paths_vector.push_back(std::string(media_path_chars));
1168
- env->ReleaseStringUTFChars(media_path, media_path_chars);
1169
- env->DeleteLocalRef(media_path);
1170
- }
1171
- }
1172
- }
1173
-
1174
- cactus::cactus_tokenize_result tokenize_result = llama->tokenize(text_chars, media_paths_vector);
1175
-
1176
- auto result = createWriteableMap(env);
1177
-
1178
- // Add tokens array
1179
- auto tokens_array = createWritableArray(env);
1180
- for (const auto &tok : tokenize_result.tokens) {
1181
- pushInt(env, tokens_array, tok);
1182
- }
1183
- putArray(env, result, "tokens", tokens_array);
1184
-
1185
- // Add media info if present
1186
- putBoolean(env, result, "has_media", tokenize_result.has_media);
1187
-
1188
- if (tokenize_result.has_media) {
1189
- auto bitmap_hashes_array = createWritableArray(env);
1190
- for (const auto &hash : tokenize_result.bitmap_hashes) {
1191
- pushString(env, bitmap_hashes_array, hash.c_str());
1192
- }
1193
- putArray(env, result, "bitmap_hashes", bitmap_hashes_array);
1194
-
1195
- auto chunk_pos_array = createWritableArray(env);
1196
- for (const auto &pos : tokenize_result.chunk_pos) {
1197
- pushInt(env, chunk_pos_array, static_cast<int>(pos));
1198
- }
1199
- putArray(env, result, "chunk_pos", chunk_pos_array);
1200
-
1201
- auto chunk_pos_media_array = createWritableArray(env);
1202
- for (const auto &pos : tokenize_result.chunk_pos_media) {
1203
- pushInt(env, chunk_pos_media_array, static_cast<int>(pos));
1204
- }
1205
- putArray(env, result, "chunk_pos_media", chunk_pos_media_array);
1206
- }
1207
-
1208
- env->ReleaseStringUTFChars(text, text_chars);
1209
- return result;
1210
- }
1211
-
1212
- JNIEXPORT jstring JNICALL
1213
- Java_com_cactus_LlamaContext_detokenize(
1214
- JNIEnv *env, jobject thiz, jlong context_ptr, jintArray tokens) {
1215
- UNUSED(thiz);
1216
- auto llama = context_map[(long) context_ptr];
1217
-
1218
- jsize tokens_len = env->GetArrayLength(tokens);
1219
- jint *tokens_ptr = env->GetIntArrayElements(tokens, 0);
1220
- std::vector<llama_token> toks;
1221
- for (int i = 0; i < tokens_len; i++) {
1222
- toks.push_back(tokens_ptr[i]);
1223
- }
1224
-
1225
- auto text = cactus::tokens_to_str(llama->ctx, toks.cbegin(), toks.cend());
1226
-
1227
- env->ReleaseIntArrayElements(tokens, tokens_ptr, 0);
1228
-
1229
- return env->NewStringUTF(text.c_str());
1230
- }
1231
-
1232
- JNIEXPORT jboolean JNICALL
1233
- Java_com_cactus_LlamaContext_isEmbeddingEnabled(
1234
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1235
- UNUSED(env);
1236
- UNUSED(thiz);
1237
- auto llama = context_map[(long) context_ptr];
1238
- return llama->params.embedding;
1239
- }
1240
-
1241
- JNIEXPORT jobject JNICALL
1242
- Java_com_cactus_LlamaContext_embedding(
1243
- JNIEnv *env, jobject thiz,
1244
- jlong context_ptr,
1245
- jstring text,
1246
- jint embd_normalize
1247
- ) {
1248
- UNUSED(thiz);
1249
- auto llama = context_map[(long) context_ptr];
1250
-
1251
- common_params embdParams;
1252
- embdParams.embedding = true;
1253
- embdParams.embd_normalize = llama->params.embd_normalize;
1254
- if (embd_normalize != -1) {
1255
- embdParams.embd_normalize = embd_normalize;
1256
- }
1257
-
1258
- const char *text_chars = env->GetStringUTFChars(text, nullptr);
1259
-
1260
- llama->rewind();
1261
-
1262
- llama_perf_context_reset(llama->ctx);
1263
-
1264
- llama->params.prompt = text_chars;
1265
-
1266
- llama->params.n_predict = 0;
1267
-
1268
- auto result = createWriteableMap(env);
1269
- if (!llama->initSampling()) {
1270
- putString(env, result, "error", "Failed to initialize sampling");
1271
- return reinterpret_cast<jobject>(result);
1272
- }
1273
-
1274
- llama->beginCompletion();
1275
- llama->loadPrompt();
1276
- llama->doCompletion();
1277
-
1278
- std::vector<float> embedding = llama->getEmbedding(embdParams);
1279
-
1280
- auto embeddings = createWritableArray(env);
1281
- for (const auto &val : embedding) {
1282
- pushDouble(env, embeddings, (double) val);
1283
- }
1284
- putArray(env, result, "embedding", embeddings);
1285
-
1286
- auto promptTokens = createWritableArray(env);
1287
- for (const auto &tok : llama->embd) {
1288
- pushString(env, promptTokens, common_token_to_piece(llama->ctx, tok).c_str());
1289
- }
1290
- putArray(env, result, "prompt_tokens", promptTokens);
1291
-
1292
- env->ReleaseStringUTFChars(text, text_chars);
1293
- return result;
1294
- }
1295
-
1296
- JNIEXPORT jstring JNICALL
1297
- Java_com_cactus_LlamaContext_bench(
1298
- JNIEnv *env,
1299
- jobject thiz,
1300
- jlong context_ptr,
1301
- jint pp,
1302
- jint tg,
1303
- jint pl,
1304
- jint nr
1305
- ) {
1306
- UNUSED(thiz);
1307
- auto llama = context_map[(long) context_ptr];
1308
- std::string result = llama->bench(pp, tg, pl, nr);
1309
- return env->NewStringUTF(result.c_str());
1310
- }
1311
-
1312
- JNIEXPORT jint JNICALL
1313
- Java_com_cactus_LlamaContext_applyLoraAdapters(
1314
- JNIEnv *env, jobject thiz, jlong context_ptr, jobjectArray loraAdapters) {
1315
- UNUSED(thiz);
1316
- auto llama = context_map[(long) context_ptr];
1317
-
1318
- // lora_adapters: ReadableArray<ReadableMap>
1319
- std::vector<common_adapter_lora_info> lora_adapters;
1320
- int lora_adapters_size = readablearray::size(env, loraAdapters);
1321
- for (int i = 0; i < lora_adapters_size; i++) {
1322
- jobject lora_adapter = readablearray::getMap(env, loraAdapters, i);
1323
- jstring path = readablemap::getString(env, lora_adapter, "path", nullptr);
1324
- if (path != nullptr) {
1325
- const char *path_chars = env->GetStringUTFChars(path, nullptr);
1326
- env->ReleaseStringUTFChars(path, path_chars);
1327
- float scaled = readablemap::getFloat(env, lora_adapter, "scaled", 1.0f);
1328
- common_adapter_lora_info la;
1329
- la.path = path_chars;
1330
- la.scale = scaled;
1331
- lora_adapters.push_back(la);
1332
- }
1333
- }
1334
- return llama->applyLoraAdapters(lora_adapters);
1335
- }
1336
-
1337
- JNIEXPORT void JNICALL
1338
- Java_com_cactus_LlamaContext_removeLoraAdapters(
1339
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1340
- UNUSED(env);
1341
- UNUSED(thiz);
1342
- auto llama = context_map[(long) context_ptr];
1343
- llama->removeLoraAdapters();
1344
- }
1345
-
1346
- JNIEXPORT jobject JNICALL
1347
- Java_com_cactus_LlamaContext_getLoadedLoraAdapters(
1348
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1349
- UNUSED(thiz);
1350
- auto llama = context_map[(long) context_ptr];
1351
- auto loaded_lora_adapters = llama->getLoadedLoraAdapters();
1352
- auto result = createWritableArray(env);
1353
- for (common_adapter_lora_info &la : loaded_lora_adapters) {
1354
- auto map = createWriteableMap(env);
1355
- putString(env, map, "path", la.path.c_str());
1356
- putDouble(env, map, "scaled", la.scale);
1357
- pushMap(env, result, map);
1358
- }
1359
- return result;
1360
- }
1361
-
1362
- JNIEXPORT void JNICALL
1363
- Java_com_cactus_LlamaContext_rewind(
1364
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1365
- UNUSED(env);
1366
- UNUSED(thiz);
1367
- auto llama = context_map[(long) context_ptr];
1368
- if (llama != nullptr) {
1369
- llama->rewind();
1370
- }
1371
- }
1372
-
1373
- JNIEXPORT void JNICALL
1374
- Java_com_cactus_LlamaContext_freeContext(
1375
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1376
- UNUSED(env);
1377
- UNUSED(thiz);
1378
- auto llama = context_map[(long) context_ptr];
1379
- context_map.erase((long) llama->ctx);
1380
- delete llama;
1381
- }
1382
-
1383
- // ===== MULTIMODAL SUPPORT =====
1384
- JNIEXPORT jboolean JNICALL
1385
- Java_com_cactus_LlamaContext_initMultimodal(
1386
- JNIEnv *env, jobject thiz, jlong context_ptr, jstring mmproj_path, jboolean use_gpu) {
1387
- UNUSED(thiz);
1388
- auto llama = context_map[(long) context_ptr];
1389
-
1390
- const char *mmproj_path_chars = env->GetStringUTFChars(mmproj_path, nullptr);
1391
- bool result = llama->initMultimodal(mmproj_path_chars, use_gpu);
1392
- env->ReleaseStringUTFChars(mmproj_path, mmproj_path_chars);
1393
-
1394
- return result;
1395
- }
1396
-
1397
- JNIEXPORT jboolean JNICALL
1398
- Java_com_cactus_LlamaContext_isMultimodalEnabled(
1399
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1400
- UNUSED(env);
1401
- UNUSED(thiz);
1402
- auto llama = context_map[(long) context_ptr];
1403
- return llama->isMultimodalEnabled();
1404
- }
1405
-
1406
- JNIEXPORT jboolean JNICALL
1407
- Java_com_cactus_LlamaContext_isMultimodalSupportVision(
1408
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1409
- UNUSED(env);
1410
- UNUSED(thiz);
1411
- auto llama = context_map[(long) context_ptr];
1412
- return llama->isMultimodalSupportVision();
1413
- }
1414
-
1415
- JNIEXPORT jboolean JNICALL
1416
- Java_com_cactus_LlamaContext_isMultimodalSupportAudio(
1417
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1418
- UNUSED(env);
1419
- UNUSED(thiz);
1420
- auto llama = context_map[(long) context_ptr];
1421
- return llama->isMultimodalSupportAudio();
1422
- }
1423
-
1424
- JNIEXPORT void JNICALL
1425
- Java_com_cactus_LlamaContext_releaseMultimodal(
1426
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1427
- UNUSED(env);
1428
- UNUSED(thiz);
1429
- auto llama = context_map[(long) context_ptr];
1430
- llama->releaseMultimodal();
1431
- }
1432
-
1433
- // ===== TTS/VOCODER SUPPORT =====
1434
- JNIEXPORT jboolean JNICALL
1435
- Java_com_cactus_LlamaContext_initVocoder(
1436
- JNIEnv *env, jobject thiz, jlong context_ptr, jstring vocoder_model_path) {
1437
- UNUSED(thiz);
1438
- auto llama = context_map[(long) context_ptr];
1439
-
1440
- const char *vocoder_path_chars = env->GetStringUTFChars(vocoder_model_path, nullptr);
1441
- bool result = llama->initVocoder(vocoder_path_chars);
1442
- env->ReleaseStringUTFChars(vocoder_model_path, vocoder_path_chars);
1443
-
1444
- return result;
1445
- }
1446
-
1447
- JNIEXPORT jboolean JNICALL
1448
- Java_com_cactus_LlamaContext_isVocoderEnabled(
1449
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1450
- UNUSED(env);
1451
- UNUSED(thiz);
1452
- auto llama = context_map[(long) context_ptr];
1453
- return llama->isVocoderEnabled();
1454
- }
1455
-
1456
- JNIEXPORT jint JNICALL
1457
- Java_com_cactus_LlamaContext_getTTSType(
1458
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1459
- UNUSED(env);
1460
- UNUSED(thiz);
1461
- auto llama = context_map[(long) context_ptr];
1462
- return static_cast<jint>(llama->getTTSType());
1463
- }
1464
-
1465
- JNIEXPORT jstring JNICALL
1466
- Java_com_cactus_LlamaContext_getFormattedAudioCompletion(
1467
- JNIEnv *env, jobject thiz, jlong context_ptr, jstring speaker_json_str, jstring text_to_speak) {
1468
- UNUSED(thiz);
1469
- auto llama = context_map[(long) context_ptr];
1470
-
1471
- const char *speaker_chars = env->GetStringUTFChars(speaker_json_str, nullptr);
1472
- const char *text_chars = env->GetStringUTFChars(text_to_speak, nullptr);
1473
-
1474
- std::string result = llama->getFormattedAudioCompletion(speaker_chars, text_chars);
1475
-
1476
- env->ReleaseStringUTFChars(speaker_json_str, speaker_chars);
1477
- env->ReleaseStringUTFChars(text_to_speak, text_chars);
1478
-
1479
- return env->NewStringUTF(result.c_str());
1480
- }
1481
-
1482
- JNIEXPORT jobject JNICALL
1483
- Java_com_cactus_LlamaContext_getAudioCompletionGuideTokens(
1484
- JNIEnv *env, jobject thiz, jlong context_ptr, jstring text_to_speak) {
1485
- UNUSED(thiz);
1486
- auto llama = context_map[(long) context_ptr];
1487
-
1488
- const char *text_chars = env->GetStringUTFChars(text_to_speak, nullptr);
1489
- std::vector<llama_token> tokens = llama->getAudioCompletionGuideTokens(text_chars);
1490
- env->ReleaseStringUTFChars(text_to_speak, text_chars);
1491
-
1492
- jobject result = createWritableArray(env);
1493
- for (const auto &token : tokens) {
1494
- pushInt(env, result, token);
1495
- }
1496
-
1497
- return result;
1498
- }
1499
-
1500
- JNIEXPORT jobject JNICALL
1501
- Java_com_cactus_LlamaContext_decodeAudioTokens(
1502
- JNIEnv *env, jobject thiz, jlong context_ptr, jintArray tokens) {
1503
- UNUSED(thiz);
1504
- auto llama = context_map[(long) context_ptr];
1505
-
1506
- jsize tokens_len = env->GetArrayLength(tokens);
1507
- jint *tokens_ptr = env->GetIntArrayElements(tokens, 0);
1508
- std::vector<llama_token> token_vector;
1509
- for (int i = 0; i < tokens_len; i++) {
1510
- token_vector.push_back(tokens_ptr[i]);
1511
- }
1512
- env->ReleaseIntArrayElements(tokens, tokens_ptr, 0);
1513
-
1514
- std::vector<float> audio_data = llama->decodeAudioTokens(token_vector);
1515
-
1516
- jobject result = createWritableArray(env);
1517
- for (const auto &sample : audio_data) {
1518
- pushDouble(env, result, static_cast<double>(sample));
1519
- }
1520
-
1521
- return result;
1522
- }
1523
-
1524
- JNIEXPORT void JNICALL
1525
- Java_com_cactus_LlamaContext_releaseVocoder(
1526
- JNIEnv *env, jobject thiz, jlong context_ptr) {
1527
- UNUSED(env);
1528
- UNUSED(thiz);
1529
- auto llama = context_map[(long) context_ptr];
1530
- llama->releaseVocoder();
1531
- }
1532
-
1533
- struct log_callback_context {
1534
- JavaVM *jvm;
1535
- jobject callback;
1536
- };
1537
-
1538
- static void cactus_log_callback_to_j(lm_ggml_log_level level, const char * text, void * data) {
1539
- auto level_c = "";
1540
- if (level == LM_GGML_LOG_LEVEL_ERROR) {
1541
- __android_log_print(ANDROID_LOG_ERROR, TAG, text, nullptr);
1542
- level_c = "error";
1543
- } else if (level == LM_GGML_LOG_LEVEL_INFO) {
1544
- __android_log_print(ANDROID_LOG_INFO, TAG, text, nullptr);
1545
- level_c = "info";
1546
- } else if (level == LM_GGML_LOG_LEVEL_WARN) {
1547
- __android_log_print(ANDROID_LOG_WARN, TAG, text, nullptr);
1548
- level_c = "warn";
1549
- } else {
1550
- __android_log_print(ANDROID_LOG_DEFAULT, TAG, text, nullptr);
1551
- }
1552
-
1553
- log_callback_context *cb_ctx = (log_callback_context *) data;
1554
-
1555
- JNIEnv *env;
1556
- bool need_detach = false;
1557
- int getEnvResult = cb_ctx->jvm->GetEnv((void**)&env, JNI_VERSION_1_6);
1558
-
1559
- if (getEnvResult == JNI_EDETACHED) {
1560
- if (cb_ctx->jvm->AttachCurrentThread(&env, nullptr) == JNI_OK) {
1561
- need_detach = true;
1562
- } else {
1563
- return;
1564
- }
1565
- } else if (getEnvResult != JNI_OK) {
1566
- return;
1567
- }
1568
-
1569
- jobject callback = cb_ctx->callback;
1570
- jclass cb_class = env->GetObjectClass(callback);
1571
- jmethodID emitNativeLog = env->GetMethodID(cb_class, "emitNativeLog", "(Ljava/lang/String;Ljava/lang/String;)V");
1572
-
1573
- jstring level_str = env->NewStringUTF(level_c);
1574
- jstring text_str = env->NewStringUTF(text);
1575
- env->CallVoidMethod(callback, emitNativeLog, level_str, text_str);
1576
- env->DeleteLocalRef(level_str);
1577
- env->DeleteLocalRef(text_str);
1578
-
1579
- if (need_detach) {
1580
- cb_ctx->jvm->DetachCurrentThread();
1581
- }
1582
- }
1583
-
1584
- JNIEXPORT void JNICALL
1585
- Java_com_cactus_LlamaContext_setupLog(JNIEnv *env, jobject thiz, jobject logCallback) {
1586
- UNUSED(thiz);
1587
-
1588
- log_callback_context *cb_ctx = new log_callback_context;
1589
-
1590
- JavaVM *jvm;
1591
- env->GetJavaVM(&jvm);
1592
- cb_ctx->jvm = jvm;
1593
- cb_ctx->callback = env->NewGlobalRef(logCallback);
1594
-
1595
- llama_log_set(cactus_log_callback_to_j, cb_ctx);
1596
- }
1597
-
1598
- JNIEXPORT void JNICALL
1599
- Java_com_cactus_LlamaContext_unsetLog(JNIEnv *env, jobject thiz) {
1600
- UNUSED(env);
1601
- UNUSED(thiz);
1602
- llama_log_set(cactus_log_callback_default, NULL);
1603
- }
1604
-
1605
- } // extern "C"