llama-cpp-pro 0.2.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 (310) hide show
  1. package/CHANGELOG.md +295 -0
  2. package/LICENSE +21 -0
  3. package/LlamaCpp.podspec +33 -0
  4. package/LlamaCppCapacitor.podspec +33 -0
  5. package/Package.swift +29 -0
  6. package/README.md +93 -0
  7. package/android/build.gradle +88 -0
  8. package/android/src/main/AndroidManifest.xml +4 -0
  9. package/android/src/main/CMakeLists-arm64.txt +138 -0
  10. package/android/src/main/CMakeLists-x86_64.txt +141 -0
  11. package/android/src/main/CMakeLists.txt +138 -0
  12. package/android/src/main/java/ai/annadata/plugin/capacitor/LlamaCpp.java +1340 -0
  13. package/android/src/main/java/ai/annadata/plugin/capacitor/LlamaCppPlugin.java +814 -0
  14. package/android/src/main/java/ai/annadata/plugin/capacitor/ModelAdmissionController.java +214 -0
  15. package/android/src/main/jni-chat-session.cpp +261 -0
  16. package/android/src/main/jni-lora.cpp +197 -0
  17. package/android/src/main/jni-multimodal.cpp +167 -0
  18. package/android/src/main/jni-tts.cpp +290 -0
  19. package/android/src/main/jni-utils.h +148 -0
  20. package/android/src/main/jni.cpp +1808 -0
  21. package/android/src/main/jniLibs/arm64-v8a/libllama-cpp-arm64.so +0 -0
  22. package/android/src/main/res/.gitkeep +0 -0
  23. package/build-native.sh +280 -0
  24. package/cmake/desktop-metal-embed.cmake +30 -0
  25. package/cmake/desktop-sources.cmake +100 -0
  26. package/cmake/ggml-backends.cmake +44 -0
  27. package/cpp/LICENSE +21 -0
  28. package/cpp/README.md +15 -0
  29. package/cpp/anyascii.c +22223 -0
  30. package/cpp/anyascii.h +42 -0
  31. package/cpp/cap-completion.cpp +942 -0
  32. package/cpp/cap-completion.h +127 -0
  33. package/cpp/cap-embedding.cpp +193 -0
  34. package/cpp/cap-embedding.h +35 -0
  35. package/cpp/cap-ios-bridge.cpp +1810 -0
  36. package/cpp/cap-ios-bridge.h +61 -0
  37. package/cpp/cap-llama.cpp +412 -0
  38. package/cpp/cap-llama.h +161 -0
  39. package/cpp/cap-mtmd.hpp +602 -0
  40. package/cpp/cap-native-server.cpp +1095 -0
  41. package/cpp/cap-native-server.h +40 -0
  42. package/cpp/cap-tts.cpp +591 -0
  43. package/cpp/cap-tts.h +59 -0
  44. package/cpp/cap-wasm-fs.cpp +156 -0
  45. package/cpp/cap-wasm-jspi.cpp +19 -0
  46. package/cpp/cap-wasm-jspi.h +30 -0
  47. package/cpp/cap-wasm-vfs.cpp +22 -0
  48. package/cpp/chat-parser.cpp +393 -0
  49. package/cpp/chat-parser.h +120 -0
  50. package/cpp/chat.cpp +2315 -0
  51. package/cpp/chat.h +221 -0
  52. package/cpp/common.cpp +1664 -0
  53. package/cpp/common.h +744 -0
  54. package/cpp/ggml-alloc.c +1028 -0
  55. package/cpp/ggml-alloc.h +76 -0
  56. package/cpp/ggml-backend-impl.h +255 -0
  57. package/cpp/ggml-backend-reg.cpp +600 -0
  58. package/cpp/ggml-backend.cpp +2121 -0
  59. package/cpp/ggml-backend.h +354 -0
  60. package/cpp/ggml-common.h +1878 -0
  61. package/cpp/ggml-cpp.h +39 -0
  62. package/cpp/ggml-cpu/amx/amx.cpp +221 -0
  63. package/cpp/ggml-cpu/amx/amx.h +8 -0
  64. package/cpp/ggml-cpu/amx/common.h +91 -0
  65. package/cpp/ggml-cpu/amx/mmq.cpp +2512 -0
  66. package/cpp/ggml-cpu/amx/mmq.h +10 -0
  67. package/cpp/ggml-cpu/arch/arm/cpu-feats.cpp +94 -0
  68. package/cpp/ggml-cpu/arch/arm/quants.c +3650 -0
  69. package/cpp/ggml-cpu/arch/arm/repack.cpp +1891 -0
  70. package/cpp/ggml-cpu/arch/x86/cpu-feats.cpp +327 -0
  71. package/cpp/ggml-cpu/arch/x86/quants.c +3820 -0
  72. package/cpp/ggml-cpu/arch/x86/repack.cpp +6307 -0
  73. package/cpp/ggml-cpu/arch-fallback.h +215 -0
  74. package/cpp/ggml-cpu/binary-ops.cpp +158 -0
  75. package/cpp/ggml-cpu/binary-ops.h +16 -0
  76. package/cpp/ggml-cpu/common.h +73 -0
  77. package/cpp/ggml-cpu/ggml-cpu-impl.h +559 -0
  78. package/cpp/ggml-cpu/ggml-cpu.c +3578 -0
  79. package/cpp/ggml-cpu/ggml-cpu.cpp +672 -0
  80. package/cpp/ggml-cpu/ops.cpp +10587 -0
  81. package/cpp/ggml-cpu/ops.h +114 -0
  82. package/cpp/ggml-cpu/quants.c +1193 -0
  83. package/cpp/ggml-cpu/quants.h +97 -0
  84. package/cpp/ggml-cpu/repack.cpp +1982 -0
  85. package/cpp/ggml-cpu/repack.h +120 -0
  86. package/cpp/ggml-cpu/simd-mappings.h +1184 -0
  87. package/cpp/ggml-cpu/traits.cpp +36 -0
  88. package/cpp/ggml-cpu/traits.h +38 -0
  89. package/cpp/ggml-cpu/unary-ops.cpp +186 -0
  90. package/cpp/ggml-cpu/unary-ops.h +28 -0
  91. package/cpp/ggml-cpu/vec.cpp +348 -0
  92. package/cpp/ggml-cpu/vec.h +1121 -0
  93. package/cpp/ggml-cpu.h +145 -0
  94. package/cpp/ggml-impl.h +622 -0
  95. package/cpp/ggml-metal-impl.h +688 -0
  96. package/cpp/ggml-metal.h +66 -0
  97. package/cpp/ggml-metal.m +6833 -0
  98. package/cpp/ggml-metal.metal +10754 -0
  99. package/cpp/ggml-opt.cpp +1093 -0
  100. package/cpp/ggml-opt.h +256 -0
  101. package/cpp/ggml-quants.c +5324 -0
  102. package/cpp/ggml-quants.h +106 -0
  103. package/cpp/ggml-threading.cpp +12 -0
  104. package/cpp/ggml-threading.h +14 -0
  105. package/cpp/ggml.c +7108 -0
  106. package/cpp/ggml.h +2492 -0
  107. package/cpp/gguf.cpp +1358 -0
  108. package/cpp/gguf.h +202 -0
  109. package/cpp/json-partial.cpp +256 -0
  110. package/cpp/json-partial.h +38 -0
  111. package/cpp/json-schema-to-grammar.cpp +985 -0
  112. package/cpp/json-schema-to-grammar.h +21 -0
  113. package/cpp/llama-adapter.cpp +388 -0
  114. package/cpp/llama-adapter.h +76 -0
  115. package/cpp/llama-arch.cpp +2355 -0
  116. package/cpp/llama-arch.h +499 -0
  117. package/cpp/llama-batch.cpp +875 -0
  118. package/cpp/llama-batch.h +160 -0
  119. package/cpp/llama-chat.cpp +783 -0
  120. package/cpp/llama-chat.h +65 -0
  121. package/cpp/llama-context.cpp +2788 -0
  122. package/cpp/llama-context.h +306 -0
  123. package/cpp/llama-cparams.cpp +5 -0
  124. package/cpp/llama-cparams.h +41 -0
  125. package/cpp/llama-cpp.h +30 -0
  126. package/cpp/llama-grammar.cpp +1229 -0
  127. package/cpp/llama-grammar.h +173 -0
  128. package/cpp/llama-graph.cpp +1891 -0
  129. package/cpp/llama-graph.h +810 -0
  130. package/cpp/llama-hparams.cpp +180 -0
  131. package/cpp/llama-hparams.h +233 -0
  132. package/cpp/llama-impl.cpp +167 -0
  133. package/cpp/llama-impl.h +61 -0
  134. package/cpp/llama-io.cpp +15 -0
  135. package/cpp/llama-io.h +35 -0
  136. package/cpp/llama-kv-cache-iswa.cpp +318 -0
  137. package/cpp/llama-kv-cache-iswa.h +135 -0
  138. package/cpp/llama-kv-cache.cpp +2059 -0
  139. package/cpp/llama-kv-cache.h +374 -0
  140. package/cpp/llama-kv-cells.h +491 -0
  141. package/cpp/llama-memory-hybrid.cpp +258 -0
  142. package/cpp/llama-memory-hybrid.h +137 -0
  143. package/cpp/llama-memory-recurrent.cpp +1146 -0
  144. package/cpp/llama-memory-recurrent.h +179 -0
  145. package/cpp/llama-memory.cpp +59 -0
  146. package/cpp/llama-memory.h +119 -0
  147. package/cpp/llama-mmap.cpp +609 -0
  148. package/cpp/llama-mmap.h +68 -0
  149. package/cpp/llama-model-loader.cpp +1166 -0
  150. package/cpp/llama-model-loader.h +170 -0
  151. package/cpp/llama-model-saver.cpp +282 -0
  152. package/cpp/llama-model-saver.h +37 -0
  153. package/cpp/llama-model.cpp +19061 -0
  154. package/cpp/llama-model.h +491 -0
  155. package/cpp/llama-sampling.cpp +2575 -0
  156. package/cpp/llama-sampling.h +32 -0
  157. package/cpp/llama-vocab.cpp +3792 -0
  158. package/cpp/llama-vocab.h +176 -0
  159. package/cpp/llama.cpp +358 -0
  160. package/cpp/llama.h +1373 -0
  161. package/cpp/log.cpp +428 -0
  162. package/cpp/log.h +103 -0
  163. package/cpp/minja/chat-template.hpp +550 -0
  164. package/cpp/minja/minja.hpp +3009 -0
  165. package/cpp/nlohmann/json.hpp +25526 -0
  166. package/cpp/nlohmann/json_fwd.hpp +187 -0
  167. package/cpp/regex-partial.cpp +204 -0
  168. package/cpp/regex-partial.h +56 -0
  169. package/cpp/sampling.cpp +579 -0
  170. package/cpp/sampling.h +107 -0
  171. package/cpp/tools/mtmd/clip-impl.h +473 -0
  172. package/cpp/tools/mtmd/clip.cpp +4322 -0
  173. package/cpp/tools/mtmd/clip.h +106 -0
  174. package/cpp/tools/mtmd/miniaudio/miniaudio.h +93468 -0
  175. package/cpp/tools/mtmd/mtmd-audio.cpp +769 -0
  176. package/cpp/tools/mtmd/mtmd-audio.h +47 -0
  177. package/cpp/tools/mtmd/mtmd-helper.cpp +460 -0
  178. package/cpp/tools/mtmd/mtmd-helper.h +95 -0
  179. package/cpp/tools/mtmd/mtmd.cpp +1066 -0
  180. package/cpp/tools/mtmd/mtmd.h +302 -0
  181. package/cpp/tools/mtmd/stb/stb_image.h +7988 -0
  182. package/cpp/unicode-data.cpp +7034 -0
  183. package/cpp/unicode-data.h +20 -0
  184. package/cpp/unicode.cpp +1061 -0
  185. package/cpp/unicode.h +68 -0
  186. package/cpp/vendor/cpp-httplib/httplib.cpp +16509 -0
  187. package/cpp/vendor/cpp-httplib/httplib.h +3883 -0
  188. package/desktop/electron-builder.config.cjs +157 -0
  189. package/desktop/entitlements.mac.plist +12 -0
  190. package/desktop/package.json +11 -0
  191. package/desktop/resolve-package-root.cjs +88 -0
  192. package/desktop/src/main/backend-selector.cjs +148 -0
  193. package/desktop/src/main/gpu-probe.cjs +142 -0
  194. package/desktop/src/main/index.cjs +58 -0
  195. package/desktop/src/main/ipc-handlers.cjs +212 -0
  196. package/desktop/src/main/model-store.cjs +50 -0
  197. package/desktop/src/main/preload.cjs +39 -0
  198. package/desktop/src/main/sidecar-client.cjs +76 -0
  199. package/desktop/src/main/sidecar-manager.cjs +364 -0
  200. package/dist/docs.json +14357 -0
  201. package/dist/esm/definitions.d.ts +731 -0
  202. package/dist/esm/definitions.js +2 -0
  203. package/dist/esm/definitions.js.map +1 -0
  204. package/dist/esm/desktop.d.ts +37 -0
  205. package/dist/esm/desktop.js +133 -0
  206. package/dist/esm/desktop.js.map +1 -0
  207. package/dist/esm/index.d.ts +200 -0
  208. package/dist/esm/index.js +612 -0
  209. package/dist/esm/index.js.map +1 -0
  210. package/dist/esm/isomorphic/desktop.runtime.d.ts +37 -0
  211. package/dist/esm/isomorphic/desktop.runtime.js +36 -0
  212. package/dist/esm/isomorphic/desktop.runtime.js.map +1 -0
  213. package/dist/esm/isomorphic/errors.d.ts +6 -0
  214. package/dist/esm/isomorphic/errors.js +9 -0
  215. package/dist/esm/isomorphic/errors.js.map +1 -0
  216. package/dist/esm/isomorphic/model.admission.d.ts +17 -0
  217. package/dist/esm/isomorphic/model.admission.js +27 -0
  218. package/dist/esm/isomorphic/model.admission.js.map +1 -0
  219. package/dist/esm/isomorphic/model.scheduler.d.ts +31 -0
  220. package/dist/esm/isomorphic/model.scheduler.js +95 -0
  221. package/dist/esm/isomorphic/model.scheduler.js.map +1 -0
  222. package/dist/esm/isomorphic/provider.desktop.d.ts +40 -0
  223. package/dist/esm/isomorphic/provider.desktop.js +411 -0
  224. package/dist/esm/isomorphic/provider.desktop.js.map +1 -0
  225. package/dist/esm/isomorphic/provider.factory.d.ts +2 -0
  226. package/dist/esm/isomorphic/provider.factory.js +16 -0
  227. package/dist/esm/isomorphic/provider.factory.js.map +1 -0
  228. package/dist/esm/isomorphic/provider.interface.d.ts +76 -0
  229. package/dist/esm/isomorphic/provider.interface.js +2 -0
  230. package/dist/esm/isomorphic/provider.interface.js.map +1 -0
  231. package/dist/esm/isomorphic/provider.native.d.ts +18 -0
  232. package/dist/esm/isomorphic/provider.native.js +173 -0
  233. package/dist/esm/isomorphic/provider.native.js.map +1 -0
  234. package/dist/esm/isomorphic/provider.web.d.ts +88 -0
  235. package/dist/esm/isomorphic/provider.web.js +573 -0
  236. package/dist/esm/isomorphic/provider.web.js.map +1 -0
  237. package/dist/esm/isomorphic/sidecar-sse.d.ts +14 -0
  238. package/dist/esm/isomorphic/sidecar-sse.js +76 -0
  239. package/dist/esm/isomorphic/sidecar-sse.js.map +1 -0
  240. package/dist/esm/isomorphic/wasmMemoryCalibration.d.ts +26 -0
  241. package/dist/esm/isomorphic/wasmMemoryCalibration.js +60 -0
  242. package/dist/esm/isomorphic/wasmMemoryCalibration.js.map +1 -0
  243. package/dist/esm/isomorphic/wasmMemoryPolicy.d.ts +55 -0
  244. package/dist/esm/isomorphic/wasmMemoryPolicy.js +93 -0
  245. package/dist/esm/isomorphic/wasmMemoryPolicy.js.map +1 -0
  246. package/dist/esm/storage/manifest.d.ts +13 -0
  247. package/dist/esm/storage/manifest.js +87 -0
  248. package/dist/esm/storage/manifest.js.map +1 -0
  249. package/dist/esm/storage/opfs.store.d.ts +31 -0
  250. package/dist/esm/storage/opfs.store.js +241 -0
  251. package/dist/esm/storage/opfs.store.js.map +1 -0
  252. package/dist/esm/web.d.ts +206 -0
  253. package/dist/esm/web.js +521 -0
  254. package/dist/esm/web.js.map +1 -0
  255. package/dist/esm/workers/async-file.d.ts +13 -0
  256. package/dist/esm/workers/async-file.js +12 -0
  257. package/dist/esm/workers/async-file.js.map +1 -0
  258. package/dist/esm/workers/heapfs.d.ts +55 -0
  259. package/dist/esm/workers/heapfs.js +115 -0
  260. package/dist/esm/workers/heapfs.js.map +1 -0
  261. package/dist/esm/workers/wasm.engine.d.ts +86 -0
  262. package/dist/esm/workers/wasm.engine.js +504 -0
  263. package/dist/esm/workers/wasm.engine.js.map +1 -0
  264. package/dist/esm/workers/worker.protocol.d.ts +160 -0
  265. package/dist/esm/workers/worker.protocol.js +2 -0
  266. package/dist/esm/workers/worker.protocol.js.map +1 -0
  267. package/dist/plugin.cjs +3179 -0
  268. package/dist/plugin.cjs.map +1 -0
  269. package/dist/plugin.js +3181 -0
  270. package/dist/plugin.js.map +1 -0
  271. package/dist/wasm/llama_engine.d.ts +74 -0
  272. package/dist/wasm/llama_engine.js +1829 -0
  273. package/dist/wasm/llama_engine.wasm +0 -0
  274. package/dist/wasm/llama_engine_emscripten.mjs +2 -0
  275. package/dist/wasm/package.json +16 -0
  276. package/dist/workers/llm.worker.js +1226 -0
  277. package/dist/workers/llm.worker.js.map +7 -0
  278. package/extraResources/llama-wasm/llama_engine.d.ts +74 -0
  279. package/extraResources/llama-wasm/llama_engine.js +1829 -0
  280. package/extraResources/llama-wasm/llama_engine.wasm +0 -0
  281. package/extraResources/llama-wasm/llama_engine_emscripten.mjs +2 -0
  282. package/extraResources/llama-wasm/package.json +16 -0
  283. package/extraResources/sidecar/README.md +11 -0
  284. package/extraResources/sidecar/darwin-arm64 +0 -0
  285. package/extraResources/sidecar/darwin-x64 +0 -0
  286. package/ios/CMakeLists-arm64.txt +161 -0
  287. package/ios/CMakeLists-x86_64.txt +188 -0
  288. package/ios/CMakeLists.txt +161 -0
  289. package/ios/Frameworks/llama-cpp.framework/Info.plist +28 -0
  290. package/ios/Frameworks/llama-cpp.framework/llama-cpp +0 -0
  291. package/ios/Sources/LlamaCppCapacitor/LlamaCpp.swift +1365 -0
  292. package/ios/Sources/LlamaCppCapacitor/LlamaCppPlugin.swift +694 -0
  293. package/ios/Sources/LlamaCppCapacitor/LlamaNativeBridge.swift +349 -0
  294. package/ios/Sources/LlamaCppCapacitor/ModelAdmissionController.swift +177 -0
  295. package/ios/embed-metal-shaders.sh +24 -0
  296. package/ios/metal-embed.cmake +29 -0
  297. package/package.json +281 -0
  298. package/scripts/build-js-preserve-wasm.cjs +53 -0
  299. package/scripts/build-sidecar-linux.sh +6 -0
  300. package/scripts/build-sidecar-win.bat +19 -0
  301. package/scripts/build-sidecar.sh +184 -0
  302. package/scripts/embed-llama-ios-app-framework.sh +63 -0
  303. package/scripts/ensure-desktop-sidecar-bundle.cjs +103 -0
  304. package/scripts/ensure-llama-ios-xcframework.sh +108 -0
  305. package/scripts/fix-esm-extensions.cjs +45 -0
  306. package/scripts/prepare-js-dist.cjs +28 -0
  307. package/scripts/stage-desktop-resources.cjs +116 -0
  308. package/sidecar/CMakeLists.txt +192 -0
  309. package/sidecar/cap-sidecar-main.cpp +68 -0
  310. package/types/llama-cpp-pro.d.ts +441 -0
@@ -0,0 +1,167 @@
1
+ // Multimodal Methods for Android JNI
2
+
3
+ JNIEXPORT jboolean JNICALL
4
+ Java_ai_annadata_plugin_capacitor_LlamaCpp_initMultimodalNative(
5
+ JNIEnv* env, jobject thiz, jlong contextId, jstring mmproj_path, jboolean use_gpu) {
6
+
7
+ try {
8
+ LOGI("Initializing multimodal for context ID: %ld", contextId);
9
+
10
+ std::string path = jni_utils::jstring_to_string(env, mmproj_path);
11
+ LOGI("Multimodal projection path: %s", path.c_str());
12
+
13
+ auto it = contexts.find(contextId);
14
+ if (it == contexts.end()) {
15
+ LOGE("Context not found: %ld", contextId);
16
+ throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
17
+ return JNI_FALSE;
18
+ }
19
+
20
+ auto& ctx = it->second;
21
+ if (!ctx || !ctx->ctx || !ctx->model) {
22
+ LOGE("Invalid context, llama context, or model is null");
23
+ throw_java_exception(env, "java/lang/RuntimeException", "Invalid context or model not loaded");
24
+ return JNI_FALSE;
25
+ }
26
+
27
+ // Check if model file exists
28
+ std::ifstream mmproj_file(path, std::ios::binary);
29
+ if (!mmproj_file.good()) {
30
+ LOGE("Multimodal projection file not found: %s", path.c_str());
31
+ throw_java_exception(env, "java/lang/RuntimeException", "Multimodal projection file not found");
32
+ return JNI_FALSE;
33
+ }
34
+ mmproj_file.close();
35
+
36
+ // Initialize multimodal
37
+ bool result = ctx->initMultimodal(path, jni_utils::jboolean_to_bool(use_gpu));
38
+
39
+ if (!result) {
40
+ LOGE("Failed to initialize multimodal");
41
+ throw_java_exception(env, "java/lang/RuntimeException", "Failed to initialize multimodal");
42
+ return JNI_FALSE;
43
+ }
44
+
45
+ LOGI("Multimodal initialized successfully");
46
+ return JNI_TRUE;
47
+
48
+ } catch (const std::exception& e) {
49
+ LOGE("Exception in initMultimodal: %s", e.what());
50
+ throw_java_exception(env, "java/lang/RuntimeException", e.what());
51
+ return JNI_FALSE;
52
+ }
53
+ }
54
+
55
+ JNIEXPORT jboolean JNICALL
56
+ Java_ai_annadata_plugin_capacitor_LlamaCpp_isMultimodalEnabledNative(
57
+ JNIEnv* env, jobject thiz, jlong contextId) {
58
+
59
+ try {
60
+ auto it = contexts.find(contextId);
61
+ if (it == contexts.end()) {
62
+ LOGE("Context not found: %ld", contextId);
63
+ throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
64
+ return JNI_FALSE;
65
+ }
66
+
67
+ auto& ctx = it->second;
68
+ if (!ctx) {
69
+ LOGE("Invalid context");
70
+ throw_java_exception(env, "java/lang/RuntimeException", "Invalid context");
71
+ return JNI_FALSE;
72
+ }
73
+
74
+ bool enabled = ctx->isMultimodalEnabled();
75
+ LOGI("Multimodal enabled: %s", enabled ? "true" : "false");
76
+ return enabled ? JNI_TRUE : JNI_FALSE;
77
+
78
+ } catch (const std::exception& e) {
79
+ LOGE("Exception in isMultimodalEnabled: %s", e.what());
80
+ throw_java_exception(env, "java/lang/RuntimeException", e.what());
81
+ return JNI_FALSE;
82
+ }
83
+ }
84
+
85
+ JNIEXPORT jobject JNICALL
86
+ Java_ai_annadata_plugin_capacitor_LlamaCpp_getMultimodalSupportNative(
87
+ JNIEnv* env, jobject thiz, jlong contextId) {
88
+
89
+ try {
90
+ auto it = contexts.find(contextId);
91
+ if (it == contexts.end()) {
92
+ LOGE("Context not found: %ld", contextId);
93
+ throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
94
+ return nullptr;
95
+ }
96
+
97
+ auto& ctx = it->second;
98
+ if (!ctx) {
99
+ LOGE("Invalid context");
100
+ throw_java_exception(env, "java/lang/RuntimeException", "Invalid context");
101
+ return nullptr;
102
+ }
103
+
104
+ // Create result HashMap
105
+ jclass hashMapClass = env->FindClass("java/util/HashMap");
106
+ jmethodID hashMapConstructor = env->GetMethodID(hashMapClass, "<init>", "()V");
107
+ jmethodID putMethod = env->GetMethodID(hashMapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
108
+
109
+ jobject resultMap = env->NewObject(hashMapClass, hashMapConstructor);
110
+
111
+ bool supports_vision = ctx->isMultimodalSupportVision();
112
+ bool supports_audio = ctx->isMultimodalSupportAudio();
113
+
114
+ env->CallObjectMethod(resultMap, putMethod,
115
+ jni_utils::string_to_jstring(env, "vision"),
116
+ env->NewObject(env->FindClass("java/lang/Boolean"),
117
+ env->GetMethodID(env->FindClass("java/lang/Boolean"), "<init>", "(Z)V"),
118
+ supports_vision ? JNI_TRUE : JNI_FALSE));
119
+
120
+ env->CallObjectMethod(resultMap, putMethod,
121
+ jni_utils::string_to_jstring(env, "audio"),
122
+ env->NewObject(env->FindClass("java/lang/Boolean"),
123
+ env->GetMethodID(env->FindClass("java/lang/Boolean"), "<init>", "(Z)V"),
124
+ supports_audio ? JNI_TRUE : JNI_FALSE));
125
+
126
+ LOGI("Multimodal support - vision: %s, audio: %s",
127
+ supports_vision ? "true" : "false",
128
+ supports_audio ? "true" : "false");
129
+
130
+ return resultMap;
131
+
132
+ } catch (const std::exception& e) {
133
+ LOGE("Exception in getMultimodalSupport: %s", e.what());
134
+ throw_java_exception(env, "java/lang/RuntimeException", e.what());
135
+ return nullptr;
136
+ }
137
+ }
138
+
139
+ JNIEXPORT void JNICALL
140
+ Java_ai_annadata_plugin_capacitor_LlamaCpp_releaseMultimodalNative(
141
+ JNIEnv* env, jobject thiz, jlong contextId) {
142
+
143
+ try {
144
+ LOGI("Releasing multimodal for context ID: %ld", contextId);
145
+
146
+ auto it = contexts.find(contextId);
147
+ if (it == contexts.end()) {
148
+ LOGE("Context not found: %ld", contextId);
149
+ throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
150
+ return;
151
+ }
152
+
153
+ auto& ctx = it->second;
154
+ if (!ctx) {
155
+ LOGE("Invalid context");
156
+ throw_java_exception(env, "java/lang/RuntimeException", "Invalid context");
157
+ return;
158
+ }
159
+
160
+ ctx->releaseMultimodal();
161
+ LOGI("Multimodal released successfully");
162
+
163
+ } catch (const std::exception& e) {
164
+ LOGE("Exception in releaseMultimodal: %s", e.what());
165
+ throw_java_exception(env, "java/lang/RuntimeException", e.what());
166
+ }
167
+ }
@@ -0,0 +1,290 @@
1
+ // TTS/Vocoder Methods for Android JNI
2
+
3
+ JNIEXPORT jboolean JNICALL
4
+ Java_ai_annadata_plugin_capacitor_LlamaCpp_initVocoderNative(
5
+ JNIEnv* env, jobject thiz, jlong contextId, jstring vocoder_model_path, jint n_batch) {
6
+
7
+ try {
8
+ LOGI("Initializing vocoder for context ID: %ld", contextId);
9
+
10
+ std::string path = jni_utils::jstring_to_string(env, vocoder_model_path);
11
+ LOGI("Vocoder model path: %s", path.c_str());
12
+
13
+ auto it = contexts.find(contextId);
14
+ if (it == contexts.end()) {
15
+ LOGE("Context not found: %ld", contextId);
16
+ throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
17
+ return JNI_FALSE;
18
+ }
19
+
20
+ auto& ctx = it->second;
21
+ if (!ctx || !ctx->ctx || !ctx->model) {
22
+ LOGE("Invalid context, llama context, or model is null");
23
+ throw_java_exception(env, "java/lang/RuntimeException", "Invalid context or model not loaded");
24
+ return JNI_FALSE;
25
+ }
26
+
27
+ // Check if vocoder model file exists
28
+ std::ifstream vocoder_file(path, std::ios::binary);
29
+ if (!vocoder_file.good()) {
30
+ LOGE("Vocoder model file not found: %s", path.c_str());
31
+ throw_java_exception(env, "java/lang/RuntimeException", "Vocoder model file not found");
32
+ return JNI_FALSE;
33
+ }
34
+ vocoder_file.close();
35
+
36
+ // Initialize vocoder with batch size (-1 means use default)
37
+ int batch_size = (n_batch > 0) ? static_cast<int>(n_batch) : -1;
38
+ bool result = ctx->initVocoder(path, batch_size);
39
+
40
+ if (!result) {
41
+ LOGE("Failed to initialize vocoder");
42
+ throw_java_exception(env, "java/lang/RuntimeException", "Failed to initialize vocoder");
43
+ return JNI_FALSE;
44
+ }
45
+
46
+ LOGI("Vocoder initialized successfully with batch size: %d", batch_size);
47
+ return JNI_TRUE;
48
+
49
+ } catch (const std::exception& e) {
50
+ LOGE("Exception in initVocoder: %s", e.what());
51
+ throw_java_exception(env, "java/lang/RuntimeException", e.what());
52
+ return JNI_FALSE;
53
+ }
54
+ }
55
+
56
+ JNIEXPORT jboolean JNICALL
57
+ Java_ai_annadata_plugin_capacitor_LlamaCpp_isVocoderEnabledNative(
58
+ JNIEnv* env, jobject thiz, jlong contextId) {
59
+
60
+ try {
61
+ auto it = contexts.find(contextId);
62
+ if (it == contexts.end()) {
63
+ LOGE("Context not found: %ld", contextId);
64
+ throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
65
+ return JNI_FALSE;
66
+ }
67
+
68
+ auto& ctx = it->second;
69
+ if (!ctx) {
70
+ LOGE("Invalid context");
71
+ throw_java_exception(env, "java/lang/RuntimeException", "Invalid context");
72
+ return JNI_FALSE;
73
+ }
74
+
75
+ bool enabled = ctx->isVocoderEnabled();
76
+ LOGI("Vocoder enabled: %s", enabled ? "true" : "false");
77
+ return enabled ? JNI_TRUE : JNI_FALSE;
78
+
79
+ } catch (const std::exception& e) {
80
+ LOGE("Exception in isVocoderEnabled: %s", e.what());
81
+ throw_java_exception(env, "java/lang/RuntimeException", e.what());
82
+ return JNI_FALSE;
83
+ }
84
+ }
85
+
86
+ JNIEXPORT jobject JNICALL
87
+ Java_ai_annadata_plugin_capacitor_LlamaCpp_getFormattedAudioCompletionNative(
88
+ JNIEnv* env, jobject thiz, jlong contextId, jstring speaker_json_str, jstring text_to_speak) {
89
+
90
+ try {
91
+ LOGI("Getting formatted audio completion for context ID: %ld", contextId);
92
+
93
+ auto it = contexts.find(contextId);
94
+ if (it == contexts.end()) {
95
+ LOGE("Context not found: %ld", contextId);
96
+ throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
97
+ return nullptr;
98
+ }
99
+
100
+ auto& ctx = it->second;
101
+ if (!ctx || !ctx->tts_wrapper) {
102
+ LOGE("Context or vocoder not initialized");
103
+ throw_java_exception(env, "java/lang/RuntimeException", "Vocoder not initialized");
104
+ return nullptr;
105
+ }
106
+
107
+ std::string speaker_json = jni_utils::jstring_to_string(env, speaker_json_str);
108
+ std::string text = jni_utils::jstring_to_string(env, text_to_speak);
109
+
110
+ LOGI("Text to synthesize: %s", text.c_str());
111
+
112
+ // Get formatted audio completion
113
+ capllama::llama_cap_audio_completion_result result =
114
+ ctx->tts_wrapper->getFormattedAudioCompletion(ctx.get(), speaker_json, text);
115
+
116
+ // Create result HashMap
117
+ jclass hashMapClass = env->FindClass("java/util/HashMap");
118
+ jmethodID hashMapConstructor = env->GetMethodID(hashMapClass, "<init>", "()V");
119
+ jmethodID putMethod = env->GetMethodID(hashMapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
120
+
121
+ jobject resultMap = env->NewObject(hashMapClass, hashMapConstructor);
122
+
123
+ env->CallObjectMethod(resultMap, putMethod,
124
+ jni_utils::string_to_jstring(env, "prompt"),
125
+ jni_utils::string_to_jstring(env, result.prompt));
126
+
127
+ if (result.grammar != nullptr) {
128
+ env->CallObjectMethod(resultMap, putMethod,
129
+ jni_utils::string_to_jstring(env, "grammar"),
130
+ jni_utils::string_to_jstring(env, result.grammar));
131
+ }
132
+
133
+ LOGI("Audio completion formatted successfully");
134
+ return resultMap;
135
+
136
+ } catch (const std::exception& e) {
137
+ LOGE("Exception in getFormattedAudioCompletion: %s", e.what());
138
+ throw_java_exception(env, "java/lang/RuntimeException", e.what());
139
+ return nullptr;
140
+ }
141
+ }
142
+
143
+ JNIEXPORT jobject JNICALL
144
+ Java_ai_annadata_plugin_capacitor_LlamaCpp_getAudioCompletionGuideTokensNative(
145
+ JNIEnv* env, jobject thiz, jlong contextId, jstring text_to_speak) {
146
+
147
+ try {
148
+ LOGI("Getting audio completion guide tokens for context ID: %ld", contextId);
149
+
150
+ auto it = contexts.find(contextId);
151
+ if (it == contexts.end()) {
152
+ LOGE("Context not found: %ld", contextId);
153
+ throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
154
+ return nullptr;
155
+ }
156
+
157
+ auto& ctx = it->second;
158
+ if (!ctx || !ctx->tts_wrapper) {
159
+ LOGE("Context or vocoder not initialized");
160
+ throw_java_exception(env, "java/lang/RuntimeException", "Vocoder not initialized");
161
+ return nullptr;
162
+ }
163
+
164
+ std::string text = jni_utils::jstring_to_string(env, text_to_speak);
165
+ LOGI("Text for guide tokens: %s", text.c_str());
166
+
167
+ // Get guide tokens
168
+ std::vector<llama_token> guide_tokens =
169
+ ctx->tts_wrapper->getAudioCompletionGuideTokens(ctx.get(), text);
170
+
171
+ // Create Java ArrayList for tokens
172
+ jclass arrayListClass = env->FindClass("java/util/ArrayList");
173
+ jmethodID arrayListConstructor = env->GetMethodID(arrayListClass, "<init>", "()V");
174
+ jmethodID addMethod = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z");
175
+
176
+ jobject tokenList = env->NewObject(arrayListClass, arrayListConstructor);
177
+
178
+ // Add tokens
179
+ jclass integerClass = env->FindClass("java/lang/Integer");
180
+ jmethodID integerConstructor = env->GetMethodID(integerClass, "<init>", "(I)V");
181
+
182
+ for (llama_token token : guide_tokens) {
183
+ jobject jToken = env->NewObject(integerClass, integerConstructor, static_cast<jint>(token));
184
+ env->CallBooleanMethod(tokenList, addMethod, jToken);
185
+ env->DeleteLocalRef(jToken);
186
+ }
187
+
188
+ LOGI("Retrieved %zu guide tokens", guide_tokens.size());
189
+ return tokenList;
190
+
191
+ } catch (const std::exception& e) {
192
+ LOGE("Exception in getAudioCompletionGuideTokens: %s", e.what());
193
+ throw_java_exception(env, "java/lang/RuntimeException", e.what());
194
+ return nullptr;
195
+ }
196
+ }
197
+
198
+ JNIEXPORT jobject JNICALL
199
+ Java_ai_annadata_plugin_capacitor_LlamaCpp_decodeAudioTokensNative(
200
+ JNIEnv* env, jobject thiz, jlong contextId, jintArray tokens_array) {
201
+
202
+ try {
203
+ LOGI("Decoding audio tokens for context ID: %ld", contextId);
204
+
205
+ auto it = contexts.find(contextId);
206
+ if (it == contexts.end()) {
207
+ LOGE("Context not found: %ld", contextId);
208
+ throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
209
+ return nullptr;
210
+ }
211
+
212
+ auto& ctx = it->second;
213
+ if (!ctx || !ctx->tts_wrapper) {
214
+ LOGE("Context or vocoder not initialized");
215
+ throw_java_exception(env, "java/lang/RuntimeException", "Vocoder not initialized");
216
+ return nullptr;
217
+ }
218
+
219
+ // Convert Java int array to C++ vector
220
+ jsize length = env->GetArrayLength(tokens_array);
221
+ jint* tokenArray = env->GetIntArrayElements(tokens_array, nullptr);
222
+
223
+ std::vector<llama_token> tokens;
224
+ for (jsize i = 0; i < length; i++) {
225
+ tokens.push_back(static_cast<llama_token>(tokenArray[i]));
226
+ }
227
+
228
+ env->ReleaseIntArrayElements(tokens_array, tokenArray, JNI_ABORT);
229
+
230
+ LOGI("Decoding %zu audio tokens", tokens.size());
231
+
232
+ // Decode audio tokens
233
+ std::vector<float> audio_samples = ctx->tts_wrapper->decodeAudioTokens(ctx.get(), tokens);
234
+
235
+ // Create Java ArrayList for audio samples
236
+ jclass arrayListClass = env->FindClass("java/util/ArrayList");
237
+ jmethodID arrayListConstructor = env->GetMethodID(arrayListClass, "<init>", "()V");
238
+ jmethodID addMethod = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z");
239
+
240
+ jobject audioList = env->NewObject(arrayListClass, arrayListConstructor);
241
+
242
+ // Add audio samples
243
+ jclass floatClass = env->FindClass("java/lang/Float");
244
+ jmethodID floatConstructor = env->GetMethodID(floatClass, "<init>", "(F)V");
245
+
246
+ for (float sample : audio_samples) {
247
+ jobject jSample = env->NewObject(floatClass, floatConstructor, sample);
248
+ env->CallBooleanMethod(audioList, addMethod, jSample);
249
+ env->DeleteLocalRef(jSample);
250
+ }
251
+
252
+ LOGI("Decoded %zu audio samples", audio_samples.size());
253
+ return audioList;
254
+
255
+ } catch (const std::exception& e) {
256
+ LOGE("Exception in decodeAudioTokens: %s", e.what());
257
+ throw_java_exception(env, "java/lang/RuntimeException", e.what());
258
+ return nullptr;
259
+ }
260
+ }
261
+
262
+ JNIEXPORT void JNICALL
263
+ Java_ai_annadata_plugin_capacitor_LlamaCpp_releaseVocoderNative(
264
+ JNIEnv* env, jobject thiz, jlong contextId) {
265
+
266
+ try {
267
+ LOGI("Releasing vocoder for context ID: %ld", contextId);
268
+
269
+ auto it = contexts.find(contextId);
270
+ if (it == contexts.end()) {
271
+ LOGE("Context not found: %ld", contextId);
272
+ throw_java_exception(env, "java/lang/RuntimeException", "Context not found");
273
+ return;
274
+ }
275
+
276
+ auto& ctx = it->second;
277
+ if (!ctx) {
278
+ LOGE("Invalid context");
279
+ throw_java_exception(env, "java/lang/RuntimeException", "Invalid context");
280
+ return;
281
+ }
282
+
283
+ ctx->releaseVocoder();
284
+ LOGI("Vocoder released successfully");
285
+
286
+ } catch (const std::exception& e) {
287
+ LOGE("Exception in releaseVocoder: %s", e.what());
288
+ throw_java_exception(env, "java/lang/RuntimeException", e.what());
289
+ }
290
+ }
@@ -0,0 +1,148 @@
1
+ #ifndef JNI_UTILS_H
2
+ #define JNI_UTILS_H
3
+
4
+ #include <jni.h>
5
+ #include <string>
6
+ #include <vector>
7
+ #include "cap-llama.h"
8
+
9
+ namespace jni_utils {
10
+
11
+ // Convert Java string to C++ string
12
+ std::string jstring_to_string(JNIEnv* env, jstring jstr);
13
+
14
+ // Convert C++ string to Java string
15
+ jstring string_to_jstring(JNIEnv* env, const std::string& str);
16
+
17
+ // Convert Java string array to C++ string vector
18
+ std::vector<std::string> jstring_array_to_string_vector(JNIEnv* env, jobjectArray jarray);
19
+
20
+ // Convert C++ string vector to Java string array
21
+ jobjectArray string_vector_to_jstring_array(JNIEnv* env, const std::vector<std::string>& vec);
22
+
23
+ // Convert Java boolean to C++ bool
24
+ bool jboolean_to_bool(jboolean jbool);
25
+
26
+ // Convert C++ bool to Java boolean
27
+ jboolean bool_to_jboolean(bool b);
28
+
29
+ // Convert Java int to C++ int
30
+ int jint_to_int(jint jint_val);
31
+
32
+ // Convert C++ int to Java int
33
+ jint int_to_jint(int val);
34
+
35
+ // Convert Java float to C++ float
36
+ float jfloat_to_float(jfloat jfloat_val);
37
+
38
+ // Convert C++ float to Java float
39
+ jfloat float_to_jfloat(float val);
40
+
41
+ // Convert Java long to C++ long
42
+ long jlong_to_long(jlong jlong_val);
43
+
44
+ // Convert C++ long to Java long
45
+ jlong long_to_jlong(long val);
46
+
47
+ // Convert Java double to C++ double
48
+ double jdouble_to_double(jdouble jdouble_val);
49
+
50
+ // Convert C++ double to Java double
51
+ jdouble double_to_jdouble(double val);
52
+
53
+ // Throw Java exception
54
+ void throw_java_exception(JNIEnv* env, const char* class_name, const char* message);
55
+
56
+ // Check if exception occurred
57
+ bool check_exception(JNIEnv* env);
58
+
59
+ /** Capacitor 8+ JSObject has no getDouble(); read via inherited JSONObject.optDouble. */
60
+ double jsobject_opt_double(JNIEnv* env, jobject jso, const char* key, double default_value);
61
+
62
+ /** Capacitor 8+ JSObject has no getBoolean(String); read via inherited JSONObject.optBoolean. */
63
+ bool jsobject_opt_bool(JNIEnv* env, jobject jso, const char* key, bool default_value);
64
+
65
+ /** Read optional string via inherited JSONObject.optString. */
66
+ std::string jsobject_opt_string(JNIEnv* env, jobject jso, const char* key, const std::string& default_value);
67
+
68
+ // Get field ID safely
69
+ jfieldID get_field_id(JNIEnv* env, jclass clazz, const char* name, const char* sig);
70
+
71
+ // Get method ID safely
72
+ jmethodID get_method_id(JNIEnv* env, jclass clazz, const char* name, const char* sig);
73
+
74
+ // Find class safely
75
+ jclass find_class(JNIEnv* env, const char* name);
76
+
77
+ // Create object safely
78
+ jobject create_object(JNIEnv* env, jclass clazz, jmethodID constructor, ...);
79
+
80
+ // Call method safely
81
+ jobject call_method(JNIEnv* env, jobject obj, jmethodID method, ...);
82
+
83
+ // Call static method safely
84
+ jobject call_static_method(JNIEnv* env, jclass clazz, jmethodID method, ...);
85
+
86
+ // Set field safely
87
+ void set_field(JNIEnv* env, jobject obj, jfieldID field, ...);
88
+
89
+ // Get field safely
90
+ jobject get_field(JNIEnv* env, jobject obj, jfieldID field);
91
+
92
+ // Set static field safely
93
+ void set_static_field(JNIEnv* env, jclass clazz, jfieldID field, ...);
94
+
95
+ // Get static field safely
96
+ jobject get_static_field(JNIEnv* env, jclass clazz, jfieldID field);
97
+
98
+ // Convert llama_cap_context to jobject
99
+ jobject llama_context_to_jobject(JNIEnv* env, const capllama::llama_cap_context* context);
100
+
101
+ // Convert jobject to llama_cap_context
102
+ capllama::llama_cap_context* jobject_to_llama_context(JNIEnv* env, jobject obj);
103
+
104
+ // Convert completion result to jobject
105
+ jobject completion_result_to_jobject(JNIEnv* env, const capllama::completion_token_output& result);
106
+
107
+ // Convert jobject to completion parameters
108
+ common_params jobject_to_completion_params(JNIEnv* env, jobject obj);
109
+
110
+ // Convert chat parameters to jobject
111
+ jobject chat_params_to_jobject(JNIEnv* env, const common_chat_params& params);
112
+
113
+ // Convert jobject to chat parameters
114
+ common_chat_params jobject_to_chat_params(JNIEnv* env, jobject obj);
115
+
116
+ // Convert tokenize result to jobject
117
+ jobject tokenize_result_to_jobject(JNIEnv* env, const capllama::llama_cap_tokenize_result& result);
118
+
119
+ // Convert embedding result to jobject
120
+ jobject embedding_result_to_jobject(JNIEnv* env, const std::vector<float>& embedding);
121
+
122
+ // Convert rerank result to jobject
123
+ jobject rerank_result_to_jobject(JNIEnv* env, const std::vector<std::pair<size_t, float>>& results);
124
+
125
+ // Convert benchmark result to jobject
126
+ jobject benchmark_result_to_jobject(JNIEnv* env, const std::vector<float>& timings);
127
+
128
+ // Convert LoRA adapter info to jobject
129
+ jobject lora_adapter_info_to_jobject(JNIEnv* env, const common_adapter_lora_info& info);
130
+
131
+ // Convert jobject to LoRA adapter info
132
+ common_adapter_lora_info jobject_to_lora_adapter_info(JNIEnv* env, jobject obj);
133
+
134
+ // Convert multimodal support info to jobject
135
+ jobject multimodal_support_to_jobject(JNIEnv* env, bool vision, bool audio);
136
+
137
+ // Convert TTS result to jobject
138
+ jobject tts_result_to_jobject(JNIEnv* env, const std::vector<float>& audio_data, int sample_rate);
139
+
140
+ // Convert session data to jobject
141
+ jobject session_data_to_jobject(JNIEnv* env, const std::string& data);
142
+
143
+ // Convert jobject to session data
144
+ std::string jobject_to_session_data(JNIEnv* env, jobject obj);
145
+
146
+ } // namespace jni_utils
147
+
148
+ #endif // JNI_UTILS_H