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,612 @@
1
+ var _a;
2
+ import { __rest } from "tslib";
3
+ import { registerPlugin } from '@capacitor/core';
4
+ // Constants
5
+ export const LLAMACPP_MTMD_DEFAULT_MEDIA_MARKER = '<__media__>';
6
+ // Event names
7
+ const EVENT_ON_INIT_CONTEXT_PROGRESS = '@LlamaCpp_onInitContextProgress';
8
+ const EVENT_ON_TOKEN = '@LlamaCpp_onToken';
9
+ const EVENT_ON_NATIVE_LOG = '@LlamaCpp_onNativeLog';
10
+ // Register the plugin — web uses WASM; Electron desktop uses sidecar (via LlamaCppDesktop).
11
+ const LlamaCpp = registerPlugin('LlamaCpp', {
12
+ web: () => import('./isomorphic/desktop.runtime').then(async ({ isDesktopRuntime }) => {
13
+ if (isDesktopRuntime()) {
14
+ const m = await import('./desktop');
15
+ return new m.LlamaCppDesktop();
16
+ }
17
+ const w = await import('./web');
18
+ return new w.LlamaCppWeb();
19
+ }),
20
+ });
21
+ // Log listeners management
22
+ const logListeners = [];
23
+ // Best-effort wiring: Capacitor stubs can throw synchronously when a platform
24
+ // implementation is not ready yet (Node/CJS load, first paint before web impl).
25
+ try {
26
+ const sub = LlamaCpp.addListener(EVENT_ON_NATIVE_LOG, (evt) => {
27
+ logListeners.forEach((listener) => listener(evt.level, evt.text));
28
+ });
29
+ if (sub && typeof sub.catch === 'function') {
30
+ sub.catch(() => { });
31
+ }
32
+ }
33
+ catch (_b) {
34
+ /* ignore until platform impl is loaded */
35
+ }
36
+ try {
37
+ const p = (_a = LlamaCpp.toggleNativeLog) === null || _a === void 0 ? void 0 : _a.call(LlamaCpp, { enabled: false });
38
+ if (p && typeof p.catch === 'function') {
39
+ p.catch(() => { });
40
+ }
41
+ }
42
+ catch (_c) {
43
+ /* ignore unimplemented / sync stub throw */
44
+ }
45
+ export const RNLLAMA_MTMD_DEFAULT_MEDIA_MARKER = LLAMACPP_MTMD_DEFAULT_MEDIA_MARKER;
46
+ const validCacheTypes = [
47
+ 'f16',
48
+ 'f32',
49
+ 'bf16',
50
+ 'q8_0',
51
+ 'q4_0',
52
+ 'q4_1',
53
+ 'iq4_nl',
54
+ 'q5_0',
55
+ 'q5_1',
56
+ ];
57
+ const getJsonSchema = (responseFormat) => {
58
+ var _a;
59
+ if ((responseFormat === null || responseFormat === void 0 ? void 0 : responseFormat.type) === 'json_schema') {
60
+ return (_a = responseFormat.json_schema) === null || _a === void 0 ? void 0 : _a.schema;
61
+ }
62
+ if ((responseFormat === null || responseFormat === void 0 ? void 0 : responseFormat.type) === 'json_object') {
63
+ return responseFormat.schema || {};
64
+ }
65
+ return null;
66
+ };
67
+ // Utility function to convert JSON schema to GBNF grammar
68
+ const jsonSchemaToGrammar = async (schema) => {
69
+ // This will call the native method to convert JSON schema to GBNF
70
+ // For now, we'll return a basic implementation
71
+ try {
72
+ const result = await LlamaCpp.convertJsonSchemaToGrammar({ schema: JSON.stringify(schema) });
73
+ return result;
74
+ }
75
+ catch (error) {
76
+ console.warn('Failed to convert JSON schema to GBNF, using fallback:', error);
77
+ // Fallback for basic object structure
78
+ return `root ::= "{" ws object_content ws "}"
79
+ object_content ::= string_field ("," ws string_field)*
80
+ string_field ::= "\\"" [a-zA-Z_][a-zA-Z0-9_]* "\\"" ws ":" ws value
81
+ value ::= string | number | boolean | "null"
82
+ string ::= "\\"" [^"]* "\\""
83
+ number ::= "-"? [0-9]+ ("." [0-9]+)?
84
+ boolean ::= "true" | "false"
85
+ ws ::= [ \\t\\n]*`;
86
+ }
87
+ };
88
+ export class LlamaContext {
89
+ constructor({ contextId, gpu, reasonNoGPU, model }) {
90
+ this.gpu = false;
91
+ this.reasonNoGPU = '';
92
+ this.id = contextId;
93
+ this.gpu = gpu;
94
+ this.reasonNoGPU = reasonNoGPU;
95
+ this.model = model;
96
+ }
97
+ /**
98
+ * Load cached prompt & completion state from a file.
99
+ */
100
+ async loadSession(filepath) {
101
+ let path = filepath;
102
+ if (path.startsWith('file://'))
103
+ path = path.slice(7);
104
+ return LlamaCpp.loadSession({ contextId: this.id, filepath: path });
105
+ }
106
+ /**
107
+ * Save current cached prompt & completion state to a file.
108
+ */
109
+ async saveSession(filepath, options) {
110
+ return LlamaCpp.saveSession({
111
+ contextId: this.id,
112
+ filepath,
113
+ size: (options === null || options === void 0 ? void 0 : options.tokenSize) || -1
114
+ });
115
+ }
116
+ isLlamaChatSupported() {
117
+ return !!this.model.chatTemplates.llamaChat;
118
+ }
119
+ isJinjaSupported() {
120
+ const { minja } = this.model.chatTemplates;
121
+ return !!(minja === null || minja === void 0 ? void 0 : minja.toolUse) || !!(minja === null || minja === void 0 ? void 0 : minja.default);
122
+ }
123
+ async getFormattedChat(messages, template, params) {
124
+ var _a;
125
+ const mediaPaths = [];
126
+ const chat = messages.map((msg) => {
127
+ if (Array.isArray(msg.content)) {
128
+ const content = msg.content.map((part) => {
129
+ var _a;
130
+ // Handle multimodal content
131
+ if (part.type === 'image_url') {
132
+ let path = ((_a = part.image_url) === null || _a === void 0 ? void 0 : _a.url) || '';
133
+ if (path === null || path === void 0 ? void 0 : path.startsWith('file://'))
134
+ path = path.slice(7);
135
+ mediaPaths.push(path);
136
+ return {
137
+ type: 'text',
138
+ text: RNLLAMA_MTMD_DEFAULT_MEDIA_MARKER,
139
+ };
140
+ }
141
+ else if (part.type === 'input_audio') {
142
+ const { input_audio: audio } = part;
143
+ if (!audio)
144
+ throw new Error('input_audio is required');
145
+ const { format } = audio;
146
+ if (format != 'wav' && format != 'mp3') {
147
+ throw new Error(`Unsupported audio format: ${format}`);
148
+ }
149
+ if (audio.url) {
150
+ const path = audio.url.replace(/file:\/\//, '');
151
+ mediaPaths.push(path);
152
+ }
153
+ else if (audio.data) {
154
+ mediaPaths.push(audio.data);
155
+ }
156
+ return {
157
+ type: 'text',
158
+ text: RNLLAMA_MTMD_DEFAULT_MEDIA_MARKER,
159
+ };
160
+ }
161
+ return part;
162
+ });
163
+ return Object.assign(Object.assign({}, msg), { content });
164
+ }
165
+ return msg;
166
+ });
167
+ const useJinja = this.isJinjaSupported() && (params === null || params === void 0 ? void 0 : params.jinja);
168
+ let tmpl;
169
+ if (template)
170
+ tmpl = template; // Force replace if provided
171
+ const jsonSchema = getJsonSchema(params === null || params === void 0 ? void 0 : params.response_format);
172
+ const result = await LlamaCpp.getFormattedChat({
173
+ contextId: this.id,
174
+ messages: JSON.stringify(chat),
175
+ chatTemplate: tmpl,
176
+ params: {
177
+ jinja: useJinja,
178
+ json_schema: jsonSchema ? JSON.stringify(jsonSchema) : undefined,
179
+ tools: (params === null || params === void 0 ? void 0 : params.tools) ? JSON.stringify(params.tools) : undefined,
180
+ parallel_tool_calls: (params === null || params === void 0 ? void 0 : params.parallel_tool_calls)
181
+ ? JSON.stringify(params.parallel_tool_calls)
182
+ : undefined,
183
+ tool_choice: params === null || params === void 0 ? void 0 : params.tool_choice,
184
+ enable_thinking: (_a = params === null || params === void 0 ? void 0 : params.enable_thinking) !== null && _a !== void 0 ? _a : true,
185
+ add_generation_prompt: params === null || params === void 0 ? void 0 : params.add_generation_prompt,
186
+ now: typeof (params === null || params === void 0 ? void 0 : params.now) === 'number' ? params.now.toString() : params === null || params === void 0 ? void 0 : params.now,
187
+ chat_template_kwargs: (params === null || params === void 0 ? void 0 : params.chat_template_kwargs) ? JSON.stringify(Object.entries(params.chat_template_kwargs).reduce((acc, [key, value]) => {
188
+ acc[key] = JSON.stringify(value); // Each value is a stringified JSON object
189
+ return acc;
190
+ }, {})) : undefined,
191
+ },
192
+ });
193
+ if (!useJinja) {
194
+ return {
195
+ type: 'llama-chat',
196
+ prompt: result,
197
+ has_media: mediaPaths.length > 0,
198
+ media_paths: mediaPaths,
199
+ };
200
+ }
201
+ const jinjaResult = result;
202
+ jinjaResult.type = 'jinja';
203
+ jinjaResult.has_media = mediaPaths.length > 0;
204
+ jinjaResult.media_paths = mediaPaths;
205
+ return jinjaResult;
206
+ }
207
+ /**
208
+ * Generate a completion based on the provided parameters
209
+ * @param params Completion parameters including prompt or messages
210
+ * @param callback Optional callback for token-by-token streaming
211
+ * @returns Promise resolving to the completion result
212
+ *
213
+ * Note: For multimodal support, you can include an media_paths parameter.
214
+ * This will process the images and add them to the context before generating text.
215
+ * Multimodal support must be enabled via initMultimodal() first.
216
+ */
217
+ async completion(params, callback) {
218
+ const nativeParams = Object.assign(Object.assign({}, params), { prompt: params.prompt || '', emit_partial_completion: !!callback });
219
+ if (params.messages) {
220
+ const formattedResult = await this.getFormattedChat(params.messages, params.chat_template || params.chatTemplate, {
221
+ jinja: params.jinja,
222
+ tools: params.tools,
223
+ parallel_tool_calls: params.parallel_tool_calls,
224
+ tool_choice: params.tool_choice,
225
+ enable_thinking: params.enable_thinking,
226
+ add_generation_prompt: params.add_generation_prompt,
227
+ now: params.now,
228
+ chat_template_kwargs: params.chat_template_kwargs,
229
+ });
230
+ if (formattedResult.type === 'jinja') {
231
+ const jinjaResult = formattedResult;
232
+ nativeParams.prompt = jinjaResult.prompt || '';
233
+ if (typeof jinjaResult.chat_format === 'number')
234
+ nativeParams.chat_format = jinjaResult.chat_format;
235
+ if (jinjaResult.grammar)
236
+ nativeParams.grammar = jinjaResult.grammar;
237
+ if (typeof jinjaResult.grammar_lazy === 'boolean')
238
+ nativeParams.grammar_lazy = jinjaResult.grammar_lazy;
239
+ if (jinjaResult.grammar_triggers)
240
+ nativeParams.grammar_triggers = jinjaResult.grammar_triggers;
241
+ if (jinjaResult.preserved_tokens)
242
+ nativeParams.preserved_tokens = jinjaResult.preserved_tokens;
243
+ if (jinjaResult.additional_stops) {
244
+ if (!nativeParams.stop)
245
+ nativeParams.stop = [];
246
+ nativeParams.stop.push(...jinjaResult.additional_stops);
247
+ }
248
+ if (jinjaResult.has_media) {
249
+ nativeParams.media_paths = jinjaResult.media_paths;
250
+ }
251
+ }
252
+ else if (formattedResult.type === 'llama-chat') {
253
+ const llamaChatResult = formattedResult;
254
+ nativeParams.prompt = llamaChatResult.prompt || '';
255
+ if (llamaChatResult.has_media) {
256
+ nativeParams.media_paths = llamaChatResult.media_paths;
257
+ }
258
+ }
259
+ }
260
+ else {
261
+ nativeParams.prompt = params.prompt || '';
262
+ }
263
+ // If media_paths were explicitly provided or extracted from messages, use them
264
+ if (!nativeParams.media_paths && params.media_paths) {
265
+ nativeParams.media_paths = params.media_paths;
266
+ }
267
+ // Handle structured output and grammar
268
+ if (params.grammar) {
269
+ // Direct GBNF grammar takes precedence
270
+ nativeParams.grammar = params.grammar;
271
+ }
272
+ else if (nativeParams.response_format && !nativeParams.grammar) {
273
+ const jsonSchema = getJsonSchema(params.response_format);
274
+ if (jsonSchema) {
275
+ // Try to convert JSON schema to GBNF grammar
276
+ try {
277
+ nativeParams.grammar = await jsonSchemaToGrammar(jsonSchema);
278
+ }
279
+ catch (error) {
280
+ console.warn('Failed to convert JSON schema to grammar, falling back to json_schema parameter:', error);
281
+ nativeParams.json_schema = JSON.stringify(jsonSchema);
282
+ }
283
+ }
284
+ }
285
+ let tokenListener = callback &&
286
+ LlamaCpp.addListener(EVENT_ON_TOKEN, (evt) => {
287
+ const { contextId, tokenResult } = evt;
288
+ if (contextId !== this.id)
289
+ return;
290
+ callback(tokenResult);
291
+ });
292
+ if (!nativeParams.prompt)
293
+ throw new Error('Prompt is required');
294
+ const promise = LlamaCpp.completion({ contextId: this.id, params: nativeParams });
295
+ return promise
296
+ .then((completionResult) => {
297
+ tokenListener === null || tokenListener === void 0 ? void 0 : tokenListener.remove();
298
+ tokenListener = null;
299
+ return completionResult;
300
+ })
301
+ .catch((err) => {
302
+ tokenListener === null || tokenListener === void 0 ? void 0 : tokenListener.remove();
303
+ tokenListener = null;
304
+ throw err;
305
+ });
306
+ }
307
+ stopCompletion() {
308
+ return LlamaCpp.stopCompletion({ contextId: this.id });
309
+ }
310
+ /**
311
+ * Tokenize text or text with images
312
+ * @param text Text to tokenize
313
+ * @param params.media_paths Array of image paths to tokenize (if multimodal is enabled)
314
+ * @returns Promise resolving to the tokenize result
315
+ */
316
+ tokenize(text, { media_paths: mediaPaths, } = {}) {
317
+ return LlamaCpp.tokenize({ contextId: this.id, text, imagePaths: mediaPaths });
318
+ }
319
+ detokenize(tokens) {
320
+ return LlamaCpp.detokenize({ contextId: this.id, tokens });
321
+ }
322
+ embedding(text, params) {
323
+ return LlamaCpp.embedding({ contextId: this.id, text, params: params || {} });
324
+ }
325
+ /**
326
+ * Rerank documents based on relevance to a query
327
+ * @param query The query text to rank documents against
328
+ * @param documents Array of document texts to rank
329
+ * @param params Optional reranking parameters
330
+ * @returns Promise resolving to an array of ranking results with scores and indices
331
+ */
332
+ async rerank(query, documents, params) {
333
+ const results = await LlamaCpp.rerank({
334
+ contextId: this.id,
335
+ query,
336
+ documents,
337
+ params: params || {}
338
+ });
339
+ // Sort by score descending and add document text if requested
340
+ return results
341
+ .map((result) => (Object.assign(Object.assign({}, result), { document: documents[result.index] })))
342
+ .sort((a, b) => b.score - a.score);
343
+ }
344
+ async bench(pp, tg, pl, nr) {
345
+ const result = await LlamaCpp.bench({ contextId: this.id, pp, tg, pl, nr });
346
+ const [modelDesc, modelSize, modelNParams, ppAvg, ppStd, tgAvg, tgStd] = JSON.parse(result);
347
+ return {
348
+ modelDesc,
349
+ modelSize,
350
+ modelNParams,
351
+ ppAvg,
352
+ ppStd,
353
+ tgAvg,
354
+ tgStd,
355
+ };
356
+ }
357
+ async applyLoraAdapters(loraList) {
358
+ let loraAdapters = [];
359
+ if (loraList)
360
+ loraAdapters = loraList.map((l) => ({
361
+ path: l.path.replace(/file:\/\//, ''),
362
+ scaled: l.scaled,
363
+ }));
364
+ return LlamaCpp.applyLoraAdapters({ contextId: this.id, loraAdapters });
365
+ }
366
+ async removeLoraAdapters() {
367
+ return LlamaCpp.removeLoraAdapters({ contextId: this.id });
368
+ }
369
+ async getLoadedLoraAdapters() {
370
+ return LlamaCpp.getLoadedLoraAdapters({ contextId: this.id });
371
+ }
372
+ /**
373
+ * Initialize multimodal support with a mmproj file
374
+ * @param params Parameters for multimodal support
375
+ * @param params.path Path to the multimodal projector file
376
+ * @param params.use_gpu Whether to use GPU
377
+ * @returns Promise resolving to true if initialization was successful
378
+ */
379
+ async initMultimodal({ path, use_gpu: useGpu, }) {
380
+ if (path.startsWith('file://'))
381
+ path = path.slice(7);
382
+ return LlamaCpp.initMultimodal({
383
+ contextId: this.id,
384
+ params: {
385
+ path,
386
+ use_gpu: useGpu !== null && useGpu !== void 0 ? useGpu : true,
387
+ },
388
+ });
389
+ }
390
+ /**
391
+ * Check if multimodal support is enabled
392
+ * @returns Promise resolving to true if multimodal is enabled
393
+ */
394
+ async isMultimodalEnabled() {
395
+ return await LlamaCpp.isMultimodalEnabled({ contextId: this.id });
396
+ }
397
+ /**
398
+ * Check multimodal support
399
+ * @returns Promise resolving to an object with vision and audio support
400
+ */
401
+ async getMultimodalSupport() {
402
+ return await LlamaCpp.getMultimodalSupport({ contextId: this.id });
403
+ }
404
+ /**
405
+ * Release multimodal support
406
+ * @returns Promise resolving to void
407
+ */
408
+ async releaseMultimodal() {
409
+ return await LlamaCpp.releaseMultimodal({ contextId: this.id });
410
+ }
411
+ /**
412
+ * Initialize TTS support with a vocoder model
413
+ * @param params Parameters for TTS support
414
+ * @param params.path Path to the vocoder model
415
+ * @param params.n_batch Batch size for the vocoder model
416
+ * @returns Promise resolving to true if initialization was successful
417
+ */
418
+ async initVocoder({ path, n_batch: nBatch }) {
419
+ if (path.startsWith('file://'))
420
+ path = path.slice(7);
421
+ return await LlamaCpp.initVocoder({
422
+ contextId: this.id,
423
+ params: { path, n_batch: nBatch }
424
+ });
425
+ }
426
+ /**
427
+ * Check if TTS support is enabled
428
+ * @returns Promise resolving to true if TTS is enabled
429
+ */
430
+ async isVocoderEnabled() {
431
+ return await LlamaCpp.isVocoderEnabled({ contextId: this.id });
432
+ }
433
+ /**
434
+ * Get a formatted audio completion prompt
435
+ * @param speakerJsonStr JSON string representing the speaker
436
+ * @param textToSpeak Text to speak
437
+ * @returns Promise resolving to the formatted audio completion result with prompt and grammar
438
+ */
439
+ async getFormattedAudioCompletion(speaker, textToSpeak) {
440
+ return await LlamaCpp.getFormattedAudioCompletion({
441
+ contextId: this.id,
442
+ speakerJsonStr: speaker ? JSON.stringify(speaker) : '',
443
+ textToSpeak,
444
+ });
445
+ }
446
+ /**
447
+ * Get guide tokens for audio completion
448
+ * @param textToSpeak Text to speak
449
+ * @returns Promise resolving to the guide tokens
450
+ */
451
+ async getAudioCompletionGuideTokens(textToSpeak) {
452
+ return await LlamaCpp.getAudioCompletionGuideTokens({ contextId: this.id, textToSpeak });
453
+ }
454
+ /**
455
+ * Decode audio tokens
456
+ * @param tokens Array of audio tokens
457
+ * @returns Promise resolving to the decoded audio tokens
458
+ */
459
+ async decodeAudioTokens(tokens) {
460
+ return await LlamaCpp.decodeAudioTokens({ contextId: this.id, tokens });
461
+ }
462
+ /**
463
+ * Release TTS support
464
+ * @returns Promise resolving to void
465
+ */
466
+ async releaseVocoder() {
467
+ return await LlamaCpp.releaseVocoder({ contextId: this.id });
468
+ }
469
+ async release() {
470
+ return LlamaCpp.releaseContext({ contextId: this.id });
471
+ }
472
+ }
473
+ export async function toggleNativeLog(enabled) {
474
+ return LlamaCpp.toggleNativeLog({ enabled });
475
+ }
476
+ export function addNativeLogListener(listener) {
477
+ logListeners.push(listener);
478
+ return {
479
+ remove: () => {
480
+ logListeners.splice(logListeners.indexOf(listener), 1);
481
+ },
482
+ };
483
+ }
484
+ export async function setContextLimit(limit) {
485
+ return LlamaCpp.setContextLimit({ limit });
486
+ }
487
+ // Fix #14: pure monotonic counter — adding random() caused ID collisions when
488
+ // counter + random happened to produce the same value on successive calls.
489
+ let contextIdCounter = 0;
490
+ const modelInfoSkip = [
491
+ // Large fields
492
+ 'tokenizer.ggml.tokens',
493
+ 'tokenizer.ggml.token_type',
494
+ 'tokenizer.ggml.merges',
495
+ 'tokenizer.ggml.scores',
496
+ ];
497
+ export async function loadLlamaModelInfo(model) {
498
+ let path = model;
499
+ if (path.startsWith('file://'))
500
+ path = path.slice(7);
501
+ return LlamaCpp.modelInfo({ path, skip: modelInfoSkip });
502
+ }
503
+ const poolTypeMap = {
504
+ // -1 is unspecified as undefined
505
+ none: 0,
506
+ mean: 1,
507
+ cls: 2,
508
+ last: 3,
509
+ rank: 4,
510
+ };
511
+ export async function initLlama(_a, onProgress) {
512
+ var { model, is_model_asset: isModelAsset, pooling_type: poolingType, lora, lora_list: loraList } = _a, rest = __rest(_a, ["model", "is_model_asset", "pooling_type", "lora", "lora_list"]);
513
+ let path = model;
514
+ if (path.startsWith('file://'))
515
+ path = path.slice(7);
516
+ let loraPath = lora;
517
+ if (loraPath === null || loraPath === void 0 ? void 0 : loraPath.startsWith('file://'))
518
+ loraPath = loraPath.slice(7);
519
+ let loraAdapters = [];
520
+ if (loraList)
521
+ loraAdapters = loraList.map((l) => ({
522
+ path: l.path.replace(/file:\/\//, ''),
523
+ scaled: l.scaled,
524
+ }));
525
+ const contextId = ++contextIdCounter;
526
+ let removeProgressListener = null;
527
+ if (onProgress) {
528
+ removeProgressListener = LlamaCpp.addListener(EVENT_ON_INIT_CONTEXT_PROGRESS, (evt) => {
529
+ if (evt.contextId !== contextId)
530
+ return;
531
+ onProgress(evt.progress);
532
+ });
533
+ }
534
+ const poolType = poolTypeMap[poolingType];
535
+ if (rest.cache_type_k && !validCacheTypes.includes(rest.cache_type_k)) {
536
+ console.warn(`[LlamaCpp] initLlama: Invalid cache K type: ${rest.cache_type_k}, falling back to f16`);
537
+ delete rest.cache_type_k;
538
+ }
539
+ if (rest.cache_type_v && !validCacheTypes.includes(rest.cache_type_v)) {
540
+ console.warn(`[LlamaCpp] initLlama: Invalid cache V type: ${rest.cache_type_v}, falling back to f16`);
541
+ delete rest.cache_type_v;
542
+ }
543
+ // Log speculative decoding configuration if enabled
544
+ if (rest.draft_model) {
545
+ console.log(`🚀 Initializing with speculative decoding:
546
+ - Main model: ${path}
547
+ - Draft model: ${rest.draft_model}
548
+ - Speculative samples: ${rest.speculative_samples || 3}
549
+ - Mobile optimization: ${rest.mobile_speculative !== false ? 'enabled' : 'disabled'}`);
550
+ }
551
+ const { gpu, reasonNoGPU, model: modelDetails, androidLib, } = await LlamaCpp.initContext({
552
+ contextId,
553
+ params: Object.assign({ model: path, is_model_asset: !!isModelAsset, use_progress_callback: !!onProgress, pooling_type: poolType, lora: loraPath, lora_list: loraAdapters }, rest),
554
+ }).catch((err) => {
555
+ removeProgressListener === null || removeProgressListener === void 0 ? void 0 : removeProgressListener.remove();
556
+ throw err;
557
+ });
558
+ removeProgressListener === null || removeProgressListener === void 0 ? void 0 : removeProgressListener.remove();
559
+ return new LlamaContext({
560
+ contextId,
561
+ gpu,
562
+ reasonNoGPU,
563
+ model: modelDetails,
564
+ androidLib,
565
+ });
566
+ }
567
+ export async function releaseAllLlama() {
568
+ return LlamaCpp.releaseAllContexts();
569
+ }
570
+ // Model download and management functions
571
+ export async function downloadModel(url, filename) {
572
+ return LlamaCpp.downloadModel({ url, filename });
573
+ }
574
+ export async function getDownloadProgress(url) {
575
+ return LlamaCpp.getDownloadProgress({ url });
576
+ }
577
+ export async function cancelDownload(url) {
578
+ return LlamaCpp.cancelDownload({ url });
579
+ }
580
+ export async function getAvailableModels() {
581
+ return LlamaCpp.getAvailableModels();
582
+ }
583
+ /**
584
+ * Convert a JSON schema to GBNF grammar format
585
+ * @param schema JSON schema object
586
+ * @returns Promise resolving to GBNF grammar string
587
+ */
588
+ export async function convertJsonSchemaToGrammar(schema) {
589
+ return jsonSchemaToGrammar(schema);
590
+ }
591
+ export const BuildInfo = {
592
+ number: '1.0.0',
593
+ commit: 'capacitor-llama-cpp',
594
+ };
595
+ // Re-export the plugin for direct access
596
+ export { LlamaCpp };
597
+ // Isomorphic provider exports (Phase 0/1 scaffold)
598
+ export * from './isomorphic/provider.interface';
599
+ export * from './isomorphic/errors';
600
+ export * from './isomorphic/provider.factory';
601
+ export * from './isomorphic/provider.native';
602
+ export * from './isomorphic/provider.web';
603
+ export * from './isomorphic/provider.desktop';
604
+ export * from './isomorphic/desktop.runtime';
605
+ export { LlamaCppDesktop } from './desktop';
606
+ export * from './isomorphic/model.admission';
607
+ export * from './isomorphic/model.scheduler';
608
+ export * from './isomorphic/wasmMemoryPolicy';
609
+ export * from './isomorphic/wasmMemoryCalibration';
610
+ export * from './storage/manifest';
611
+ export * from './storage/opfs.store';
612
+ //# sourceMappingURL=index.js.map