@dr33m/react-native-litert-lm 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +627 -0
  3. package/android/CMakeLists.txt +32 -0
  4. package/android/build.gradle +104 -0
  5. package/android/src/main/AndroidManifest.xml +19 -0
  6. package/android/src/main/java/com/margelo/nitro/dev/litert/litertlm/HybridLiteRTLM.kt +888 -0
  7. package/android/src/main/java/com/margelo/nitro/dev/litert/litertlm/HybridModelStore.kt +189 -0
  8. package/android/src/main/java/com/margelo/nitro/dev/litert/litertlm/LiteRTLMRegistry.kt +32 -0
  9. package/android/src/main/java/com/margelo/nitro/dev/litert/litertlm/MultimodalPartFactories.kt +15 -0
  10. package/android/src/main/java/com/margelo/nitro/dev/litert/litertlm/StreamingCallbackListener.kt +89 -0
  11. package/android/src/main/java/dev/litert/litertlm/LiteRTLMInitProvider.kt +57 -0
  12. package/android/src/main/java/dev/litert/litertlm/LiteRTLMPackage.kt +43 -0
  13. package/android/src/test/java/com/margelo/nitro/core/Promise.kt +46 -0
  14. package/android/src/test/java/com/margelo/nitro/dev/litert/litertlm/HybridLiteRTLMTest.kt +122 -0
  15. package/app.plugin.js +58 -0
  16. package/cpp/cpp-adapter.cpp +21 -0
  17. package/cpp/include/README.md +32 -0
  18. package/cpp/include/litert_lm_engine.h +516 -0
  19. package/cpp/include/stb_image.h +7988 -0
  20. package/ios/HybridLiteRTLM+Execute.swift +287 -0
  21. package/ios/HybridLiteRTLM+Streaming.swift +153 -0
  22. package/ios/HybridLiteRTLM.swift +541 -0
  23. package/ios/HybridModelStore.swift +206 -0
  24. package/ios/MultimodalPart+Factories.swift +22 -0
  25. package/ios/Tests/HybridLiteRTLMTests.swift +187 -0
  26. package/lib/__mocks__/react-native-nitro-modules.d.ts +81 -0
  27. package/lib/__mocks__/react-native-nitro-modules.js +98 -0
  28. package/lib/__tests__/hooks.test.d.ts +1 -0
  29. package/lib/__tests__/hooks.test.js +175 -0
  30. package/lib/__tests__/inferenceRouting.test.d.ts +1 -0
  31. package/lib/__tests__/inferenceRouting.test.js +28 -0
  32. package/lib/__tests__/memoryTracker.test.d.ts +1 -0
  33. package/lib/__tests__/memoryTracker.test.js +74 -0
  34. package/lib/__tests__/modelFactory.test.d.ts +1 -0
  35. package/lib/__tests__/modelFactory.test.js +107 -0
  36. package/lib/__tests__/modelPath.test.d.ts +1 -0
  37. package/lib/__tests__/modelPath.test.js +12 -0
  38. package/lib/__tests__/modelRegistry.test.d.ts +1 -0
  39. package/lib/__tests__/modelRegistry.test.js +61 -0
  40. package/lib/hooks.d.ts +46 -0
  41. package/lib/hooks.js +159 -0
  42. package/lib/index.d.ts +142 -0
  43. package/lib/index.js +184 -0
  44. package/lib/inferenceRouting.d.ts +18 -0
  45. package/lib/inferenceRouting.js +63 -0
  46. package/lib/memoryTracker.d.ts +128 -0
  47. package/lib/memoryTracker.js +155 -0
  48. package/lib/modelFactory.d.ts +24 -0
  49. package/lib/modelFactory.js +128 -0
  50. package/lib/modelPath.d.ts +8 -0
  51. package/lib/modelPath.js +18 -0
  52. package/lib/modelRegistry.d.ts +55 -0
  53. package/lib/modelRegistry.js +82 -0
  54. package/lib/specs/LiteRTLM.nitro.d.ts +380 -0
  55. package/lib/specs/LiteRTLM.nitro.js +2 -0
  56. package/nitrogen/generated/.gitattributes +1 -0
  57. package/nitrogen/generated/android/LiteRTLM+autolinking.cmake +83 -0
  58. package/nitrogen/generated/android/LiteRTLM+autolinking.gradle +27 -0
  59. package/nitrogen/generated/android/LiteRTLMOnLoad.cpp +74 -0
  60. package/nitrogen/generated/android/LiteRTLMOnLoad.hpp +34 -0
  61. package/nitrogen/generated/android/c++/JBackend.hpp +61 -0
  62. package/nitrogen/generated/android/c++/JExecuteResult.hpp +86 -0
  63. package/nitrogen/generated/android/c++/JFunc_void_double.hpp +75 -0
  64. package/nitrogen/generated/android/c++/JFunc_void_std__string_bool.hpp +76 -0
  65. package/nitrogen/generated/android/c++/JGenerationStats.hpp +77 -0
  66. package/nitrogen/generated/android/c++/JHybridLiteRTLMSpec.cpp +371 -0
  67. package/nitrogen/generated/android/c++/JHybridLiteRTLMSpec.hpp +83 -0
  68. package/nitrogen/generated/android/c++/JHybridModelStoreSpec.cpp +101 -0
  69. package/nitrogen/generated/android/c++/JHybridModelStoreSpec.hpp +67 -0
  70. package/nitrogen/generated/android/c++/JLLMConfig.hpp +125 -0
  71. package/nitrogen/generated/android/c++/JMemoryUsage.hpp +69 -0
  72. package/nitrogen/generated/android/c++/JMessage.hpp +63 -0
  73. package/nitrogen/generated/android/c++/JModelFile.hpp +69 -0
  74. package/nitrogen/generated/android/c++/JMultimodalPart.hpp +78 -0
  75. package/nitrogen/generated/android/c++/JPartType.hpp +61 -0
  76. package/nitrogen/generated/android/c++/JRole.hpp +61 -0
  77. package/nitrogen/generated/android/c++/JToolCall.hpp +61 -0
  78. package/nitrogen/generated/android/c++/JToolDefinition.hpp +65 -0
  79. package/nitrogen/generated/android/c++/JToolResponse.hpp +61 -0
  80. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/Backend.kt +24 -0
  81. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/ExecuteResult.kt +61 -0
  82. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/Func_void_double.kt +80 -0
  83. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/Func_void_std__string_bool.kt +80 -0
  84. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/GenerationStats.kt +76 -0
  85. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/HybridLiteRTLMSpec.kt +165 -0
  86. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/HybridModelStoreSpec.kt +76 -0
  87. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/LLMConfig.kt +106 -0
  88. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/LiteRTLMOnLoad.kt +35 -0
  89. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/MemoryUsage.kt +66 -0
  90. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/Message.kt +56 -0
  91. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/ModelFile.kt +66 -0
  92. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/MultimodalPart.kt +71 -0
  93. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/PartType.kt +24 -0
  94. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/Role.kt +24 -0
  95. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/ToolCall.kt +56 -0
  96. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/ToolDefinition.kt +61 -0
  97. package/nitrogen/generated/android/kotlin/com/margelo/nitro/dev/litert/litertlm/ToolResponse.kt +56 -0
  98. package/nitrogen/generated/ios/LiteRTLM+autolinking.rb +62 -0
  99. package/nitrogen/generated/ios/LiteRTLM-Swift-Cxx-Bridge.cpp +98 -0
  100. package/nitrogen/generated/ios/LiteRTLM-Swift-Cxx-Bridge.hpp +585 -0
  101. package/nitrogen/generated/ios/LiteRTLM-Swift-Cxx-Umbrella.hpp +93 -0
  102. package/nitrogen/generated/ios/LiteRTLMAutolinking.mm +41 -0
  103. package/nitrogen/generated/ios/LiteRTLMAutolinking.swift +38 -0
  104. package/nitrogen/generated/ios/c++/HybridLiteRTLMSpecSwift.cpp +11 -0
  105. package/nitrogen/generated/ios/c++/HybridLiteRTLMSpecSwift.hpp +279 -0
  106. package/nitrogen/generated/ios/c++/HybridModelStoreSpecSwift.cpp +11 -0
  107. package/nitrogen/generated/ios/c++/HybridModelStoreSpecSwift.hpp +117 -0
  108. package/nitrogen/generated/ios/swift/Backend.swift +44 -0
  109. package/nitrogen/generated/ios/swift/ExecuteResult.swift +45 -0
  110. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  111. package/nitrogen/generated/ios/swift/Func_void_ExecuteResult.swift +46 -0
  112. package/nitrogen/generated/ios/swift/Func_void_double.swift +46 -0
  113. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  114. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +46 -0
  115. package/nitrogen/generated/ios/swift/Func_void_std__string_bool.swift +46 -0
  116. package/nitrogen/generated/ios/swift/GenerationStats.swift +54 -0
  117. package/nitrogen/generated/ios/swift/HybridLiteRTLMSpec.swift +75 -0
  118. package/nitrogen/generated/ios/swift/HybridLiteRTLMSpec_cxx.swift +516 -0
  119. package/nitrogen/generated/ios/swift/HybridModelStoreSpec.swift +59 -0
  120. package/nitrogen/generated/ios/swift/HybridModelStoreSpec_cxx.swift +203 -0
  121. package/nitrogen/generated/ios/swift/LLMConfig.swift +239 -0
  122. package/nitrogen/generated/ios/swift/MemoryUsage.swift +44 -0
  123. package/nitrogen/generated/ios/swift/Message.swift +34 -0
  124. package/nitrogen/generated/ios/swift/ModelFile.swift +44 -0
  125. package/nitrogen/generated/ios/swift/MultimodalPart.swift +101 -0
  126. package/nitrogen/generated/ios/swift/PartType.swift +44 -0
  127. package/nitrogen/generated/ios/swift/Role.swift +44 -0
  128. package/nitrogen/generated/ios/swift/ToolCall.swift +34 -0
  129. package/nitrogen/generated/ios/swift/ToolDefinition.swift +39 -0
  130. package/nitrogen/generated/ios/swift/ToolResponse.swift +34 -0
  131. package/nitrogen/generated/shared/c++/Backend.hpp +80 -0
  132. package/nitrogen/generated/shared/c++/ExecuteResult.hpp +94 -0
  133. package/nitrogen/generated/shared/c++/GenerationStats.hpp +103 -0
  134. package/nitrogen/generated/shared/c++/HybridLiteRTLMSpec.cpp +41 -0
  135. package/nitrogen/generated/shared/c++/HybridLiteRTLMSpec.hpp +109 -0
  136. package/nitrogen/generated/shared/c++/HybridModelStoreSpec.cpp +25 -0
  137. package/nitrogen/generated/shared/c++/HybridModelStoreSpec.hpp +71 -0
  138. package/nitrogen/generated/shared/c++/LLMConfig.hpp +134 -0
  139. package/nitrogen/generated/shared/c++/MemoryUsage.hpp +95 -0
  140. package/nitrogen/generated/shared/c++/Message.hpp +89 -0
  141. package/nitrogen/generated/shared/c++/ModelFile.hpp +95 -0
  142. package/nitrogen/generated/shared/c++/MultimodalPart.hpp +103 -0
  143. package/nitrogen/generated/shared/c++/PartType.hpp +80 -0
  144. package/nitrogen/generated/shared/c++/Role.hpp +80 -0
  145. package/nitrogen/generated/shared/c++/ToolCall.hpp +87 -0
  146. package/nitrogen/generated/shared/c++/ToolDefinition.hpp +91 -0
  147. package/nitrogen/generated/shared/c++/ToolResponse.hpp +87 -0
  148. package/package.json +115 -0
  149. package/react-native-litert-lm.podspec +62 -0
  150. package/react-native.config.js +16 -0
  151. package/scripts/download-ios-frameworks.sh +39 -0
  152. package/scripts/framework-source.js +46 -0
  153. package/scripts/postinstall.js +145 -0
  154. package/src/__mocks__/react-native-nitro-modules.ts +132 -0
  155. package/src/__tests__/hooks.test.ts +216 -0
  156. package/src/__tests__/inferenceRouting.test.ts +36 -0
  157. package/src/__tests__/memoryTracker.test.ts +87 -0
  158. package/src/__tests__/modelFactory.test.ts +153 -0
  159. package/src/__tests__/modelPath.test.ts +14 -0
  160. package/src/__tests__/modelRegistry.test.ts +73 -0
  161. package/src/hooks.ts +234 -0
  162. package/src/index.ts +214 -0
  163. package/src/inferenceRouting.ts +80 -0
  164. package/src/memoryTracker.ts +268 -0
  165. package/src/modelFactory.ts +163 -0
  166. package/src/modelPath.ts +16 -0
  167. package/src/modelRegistry.ts +104 -0
  168. package/src/specs/LiteRTLM.nitro.ts +451 -0
package/lib/hooks.js ADDED
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useModel = useModel;
4
+ const react_1 = require("react");
5
+ const modelFactory_1 = require("./modelFactory");
6
+ const modelRegistry_1 = require("./modelRegistry");
7
+ const modelPath_1 = require("./modelPath");
8
+ function useModel(pathOrUrl, config) {
9
+ const modelRef = (0, react_1.useRef)(null);
10
+ const [isReady, setIsReady] = (0, react_1.useState)(false);
11
+ const [isGenerating, setIsGenerating] = (0, react_1.useState)(false);
12
+ const [downloadProgress, setDownloadProgress] = (0, react_1.useState)(0);
13
+ const [error, setError] = (0, react_1.useState)(null);
14
+ const [memorySummary, setMemorySummary] = (0, react_1.useState)(null);
15
+ // Destructure config into primitive values for stable dependency arrays.
16
+ // This prevents infinite re-render loops when consumers pass inline config
17
+ // objects (e.g. useModel(url, { backend: 'cpu' })) without useMemo.
18
+ const autoLoad = config?.autoLoad ?? true;
19
+ const enableMemoryTracking = config?.enableMemoryTracking ?? false;
20
+ const maxMemorySnapshots = config?.maxMemorySnapshots ?? 256;
21
+ const backend = config?.backend;
22
+ const systemPrompt = config?.systemPrompt;
23
+ const maxTokens = config?.maxTokens;
24
+ const maxContextTokens = config?.maxContextTokens;
25
+ const maxOutputTokens = config?.maxOutputTokens;
26
+ const temperature = config?.temperature;
27
+ const topK = config?.topK;
28
+ const topP = config?.topP;
29
+ const multimodal = config?.multimodal;
30
+ const tools = config?.tools;
31
+ const enableSpeculativeDecoding = config?.enableSpeculativeDecoding;
32
+ const enableThinking = config?.enableThinking;
33
+ const toolsKey = tools ? JSON.stringify(tools) : undefined;
34
+ // Build a stable config object from the destructured primitives
35
+ const nativeConfig = (0, react_1.useMemo)(() => ({
36
+ ...(backend !== undefined && { backend }),
37
+ ...(systemPrompt !== undefined && { systemPrompt }),
38
+ ...(maxTokens !== undefined && { maxTokens }),
39
+ ...(maxContextTokens !== undefined && { maxContextTokens }),
40
+ ...(maxOutputTokens !== undefined && { maxOutputTokens }),
41
+ ...(temperature !== undefined && { temperature }),
42
+ ...(topK !== undefined && { topK }),
43
+ ...(topP !== undefined && { topP }),
44
+ ...(multimodal !== undefined && { multimodal }),
45
+ ...(tools !== undefined && { tools }),
46
+ ...(enableSpeculativeDecoding !== undefined && {
47
+ enableSpeculativeDecoding,
48
+ }),
49
+ ...(enableThinking !== undefined && { enableThinking }),
50
+ }), [
51
+ backend,
52
+ systemPrompt,
53
+ maxTokens,
54
+ maxContextTokens,
55
+ maxOutputTokens,
56
+ temperature,
57
+ topK,
58
+ topP,
59
+ multimodal,
60
+ toolsKey,
61
+ enableSpeculativeDecoding,
62
+ enableThinking,
63
+ ]);
64
+ /**
65
+ * Refresh memory summary from the tracker's native buffer.
66
+ */
67
+ const refreshMemorySummary = (0, react_1.useCallback)(() => {
68
+ if (modelRef.current?.memoryTracker) {
69
+ setMemorySummary(modelRef.current.memoryTracker.getSummary());
70
+ }
71
+ }, []);
72
+ // Initialize the model instance
73
+ (0, react_1.useEffect)(() => {
74
+ modelRef.current = (0, modelFactory_1.createLLM)({
75
+ enableMemoryTracking,
76
+ maxMemorySnapshots,
77
+ });
78
+ // Reset ready state — the new instance has no model loaded yet.
79
+ // This prevents stale isReady=true after Fast Refresh (which
80
+ // preserves useState but re-runs useEffect).
81
+ setIsReady(false);
82
+ // Cleanup on unmount
83
+ return () => {
84
+ try {
85
+ modelRef.current?.close();
86
+ }
87
+ catch (e) {
88
+ console.warn("Failed to close model", e);
89
+ }
90
+ };
91
+ }, [enableMemoryTracking, maxMemorySnapshots]);
92
+ const load = (0, react_1.useCallback)(async () => {
93
+ setIsReady(false);
94
+ setError(null);
95
+ setDownloadProgress(0);
96
+ try {
97
+ if (modelRef.current) {
98
+ // Delegate URL handling + download to the factory's loadModel,
99
+ // passing our progress setter as the callback (eliminates
100
+ // duplicate download logic that was previously in this hook).
101
+ await modelRef.current.loadModel(pathOrUrl, nativeConfig, (progress) => {
102
+ setDownloadProgress(progress);
103
+ });
104
+ setIsReady(true);
105
+ }
106
+ }
107
+ catch (e) {
108
+ setError(e.message || "Failed to load model");
109
+ console.error(e);
110
+ }
111
+ }, [pathOrUrl, nativeConfig]);
112
+ (0, react_1.useEffect)(() => {
113
+ if (autoLoad) {
114
+ load();
115
+ }
116
+ }, [autoLoad, load]);
117
+ const generate = (0, react_1.useCallback)(async (prompt) => {
118
+ if (!modelRef.current || !isReady) {
119
+ throw new Error("Model not ready");
120
+ }
121
+ setIsGenerating(true);
122
+ try {
123
+ const response = await modelRef.current.execute([{ type: "text", text: prompt }], undefined);
124
+ refreshMemorySummary();
125
+ return response;
126
+ }
127
+ catch (e) {
128
+ setError(e.message || "Generation failed");
129
+ throw e;
130
+ }
131
+ finally {
132
+ setIsGenerating(false);
133
+ }
134
+ }, [isReady, refreshMemorySummary]);
135
+ const reset = (0, react_1.useCallback)(() => {
136
+ if (modelRef.current) {
137
+ modelRef.current.resetConversation();
138
+ }
139
+ }, []);
140
+ const deleteModel = (0, react_1.useCallback)(async (fileName) => {
141
+ const resolvedName = fileName ?? (0, modelPath_1.extractFileName)(pathOrUrl);
142
+ modelRegistry_1.ModelRegistry.deleteFile(resolvedName);
143
+ setIsReady(false);
144
+ setDownloadProgress(0);
145
+ }, [pathOrUrl]);
146
+ return {
147
+ model: modelRef.current,
148
+ isReady,
149
+ isGenerating,
150
+ downloadProgress,
151
+ error,
152
+ generate,
153
+ reset,
154
+ deleteModel,
155
+ load,
156
+ memoryTracker: modelRef.current?.memoryTracker ?? null,
157
+ memorySummary,
158
+ };
159
+ }
package/lib/index.d.ts ADDED
@@ -0,0 +1,142 @@
1
+ import type { Backend } from "./specs/LiteRTLM.nitro";
2
+ export type { LiteRTLM, LLMConfig, Message, Backend, Role, GenerationStats, MemoryUsage,
3
+ /** New in v0.5: pass to execute() instead of individual send methods */
4
+ MultimodalPart, PartType,
5
+ /** Tool calling types */
6
+ ToolDefinition, ToolCall, ToolResponse, ExecuteResult, } from "./specs/LiteRTLM.nitro";
7
+ export type { MemorySnapshot, MemoryTracker, MemoryTrackerSummary, } from "./memoryTracker";
8
+ export { createMemoryTracker, createNativeBuffer } from "./memoryTracker";
9
+ export type { LiteRTLMInstance } from "./modelFactory";
10
+ export { ModelRegistry } from "./modelRegistry";
11
+ export type { ModelDownloadOptions } from "./modelRegistry";
12
+ export * from "./hooks";
13
+ /**
14
+ * Creates a new LiteRT-LM inference engine instance.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { createLLM } from 'react-native-litert-lm';
19
+ *
20
+ * const llm = createLLM();
21
+ * await llm.loadModel('/path/to/gemma-3n-e2b.litertlm', {
22
+ * backend: 'gpu',
23
+ * temperature: 0.7,
24
+ * maxContextTokens: 4096,
25
+ * maxOutputTokens: 512
26
+ * });
27
+ *
28
+ * // ── Unified entry point (recommended) ─────────────────────────────────────
29
+ * // Blocking text
30
+ * const response = await llm.execute([{ type: 'text', text: 'Hello!' }]);
31
+ *
32
+ * // Streaming text
33
+ * await llm.execute(
34
+ * [{ type: 'text', text: 'Write me a haiku' }],
35
+ * (token, done) => { process.stdout.write(token); }
36
+ * );
37
+ *
38
+ * // Multimodal (image path — auto-scaled to 1024px on both platforms)
39
+ * const desc = await llm.execute([
40
+ * { type: 'text', text: 'Describe this image' },
41
+ * { type: 'image', path: '/path/to/photo.jpg' },
42
+ * ]);
43
+ *
44
+ * // ── Legacy methods (still fully supported) ────────────────────────────────
45
+ * const r = await llm.sendMessage('Hello');
46
+ * llm.sendMessageAsync('Stream this', (t, done) => console.log(t));
47
+ *
48
+ * llm.close();
49
+ * ```
50
+ */
51
+ export { createLLM } from "./modelFactory";
52
+ /**
53
+ * Pre-defined model identifiers for common models.
54
+ * Use with model download utilities or as reference.
55
+ */
56
+ export declare const Models: {
57
+ /** Gemma 4 E2B Instruct (2B parameters, latest generation) */
58
+ readonly GEMMA_4_E2B: "gemma-4-E2B-it-litert-lm";
59
+ /** Gemma 4 E4B Instruct (4B parameters, higher quality) */
60
+ readonly GEMMA_4_E4B: "gemma-4-E4B-it-litert-lm";
61
+ /** Gemma 3n E2B (2B parameters, efficient) */
62
+ readonly GEMMA_3N_E2B: "gemma-3n-E2B-it-litert-lm-preview";
63
+ /** Gemma 3n E4B (4B parameters, higher quality) */
64
+ readonly GEMMA_3N_E4B: "gemma-3n-E4B-it-litert-lm-preview";
65
+ /** Gemma 3 1B (smallest Gemma) */
66
+ readonly GEMMA_3_1B: "Gemma3-1B-IT_multi-prefill-seq_q4_ekv4096";
67
+ /** Phi-4 Mini Instruct */
68
+ readonly PHI_4_MINI: "Phi-4-mini-instruct_multi-prefill-seq_q8_ekv4096";
69
+ /** Qwen 2.5 1.5B Instruct */
70
+ readonly QWEN_2_5_1_5B: "Qwen2.5-1.5B-Instruct_multi-prefill-seq_q8_ekv4096";
71
+ };
72
+ export type ModelId = (typeof Models)[keyof typeof Models];
73
+ /**
74
+ * Get the recommended backend for the current platform.
75
+ * Returns 'cpu' as the safe default. GPU (Metal on iOS, GPU delegate on Android)
76
+ * is faster but may not be available on all devices or model configurations.
77
+ *
78
+ * @returns The recommended backend ('cpu')
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * const backend = getRecommendedBackend();
83
+ * llm.loadModel(path, { backend });
84
+ * ```
85
+ */
86
+ export declare function getRecommendedBackend(): Backend;
87
+ /**
88
+ * Check if a backend configuration is supported on the current platform.
89
+ * Returns a warning message if the configuration may have issues.
90
+ *
91
+ * @param backend The backend to check
92
+ * @returns Warning message if there may be issues, undefined if OK
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * const warning = checkBackendSupport('npu');
97
+ * if (warning) {
98
+ * console.warn(warning);
99
+ * }
100
+ * ```
101
+ */
102
+ export declare function checkBackendSupport(backend: Backend): string | undefined;
103
+ /**
104
+ * Check if multimodal features (image/audio) are supported on the current platform.
105
+ * Returns an error message if not supported, undefined if OK.
106
+ *
107
+ * Both iOS (v0.12.0 CLiteRTLM xcframework) and Android (LiteRT-LM SDK) ship the
108
+ * vision/audio executor ops, so there is no platform-level block. Whether a
109
+ * given call succeeds depends on the **loaded model**: only multimodal models
110
+ * (e.g. Gemma 3n) bundle the vision/audio executors. Pass `multimodal: true` to
111
+ * `loadModel` for such models, or rely on filename sniffing ("3n"/"gemma3").
112
+ *
113
+ * @returns Error message if multimodal is not supported, undefined if OK
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * const error = checkMultimodalSupport();
118
+ * if (error) {
119
+ * console.warn(error);
120
+ * // Fall back to text-only
121
+ * } else {
122
+ * llm.sendMessageWithImage('Describe this', imagePath);
123
+ * }
124
+ * ```
125
+ */
126
+ export declare function checkMultimodalSupport(): string | undefined;
127
+ /**
128
+ * Download URL for the Gemma 3n E2B IT INT4 model (~1.3 GB).
129
+ * Public — hosted on litert.dev, no authentication required.
130
+ */
131
+ export declare const GEMMA_3N_E2B_IT_INT4 = "https://litert.dev/gemma-3n-E2B-it-int4.litertlm";
132
+ /**
133
+ * Download URL for the Gemma 4 E2B IT model (2.58 GB).
134
+ * Public — no HuggingFace account required.
135
+ */
136
+ export declare const GEMMA_4_E2B_IT = "https://huggingface.co/litert-community/gemma-4-E2B-it-litert-lm/resolve/main/gemma-4-E2B-it.litertlm";
137
+ /**
138
+ * Download URL for the Gemma 4 E4B IT model (3.65 GB).
139
+ * Higher quality than E2B but requires more device memory.
140
+ * Public — no HuggingFace account required.
141
+ */
142
+ export declare const GEMMA_4_E4B_IT = "https://huggingface.co/litert-community/gemma-4-E4B-it-litert-lm/resolve/main/gemma-4-E4B-it.litertlm";
package/lib/index.js ADDED
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.GEMMA_4_E4B_IT = exports.GEMMA_4_E2B_IT = exports.GEMMA_3N_E2B_IT_INT4 = exports.Models = exports.createLLM = exports.ModelRegistry = exports.createNativeBuffer = exports.createMemoryTracker = void 0;
18
+ exports.getRecommendedBackend = getRecommendedBackend;
19
+ exports.checkBackendSupport = checkBackendSupport;
20
+ exports.checkMultimodalSupport = checkMultimodalSupport;
21
+ const react_native_1 = require("react-native");
22
+ var memoryTracker_1 = require("./memoryTracker");
23
+ Object.defineProperty(exports, "createMemoryTracker", { enumerable: true, get: function () { return memoryTracker_1.createMemoryTracker; } });
24
+ Object.defineProperty(exports, "createNativeBuffer", { enumerable: true, get: function () { return memoryTracker_1.createNativeBuffer; } });
25
+ var modelRegistry_1 = require("./modelRegistry");
26
+ Object.defineProperty(exports, "ModelRegistry", { enumerable: true, get: function () { return modelRegistry_1.ModelRegistry; } });
27
+ __exportStar(require("./hooks"), exports);
28
+ /**
29
+ * Creates a new LiteRT-LM inference engine instance.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * import { createLLM } from 'react-native-litert-lm';
34
+ *
35
+ * const llm = createLLM();
36
+ * await llm.loadModel('/path/to/gemma-3n-e2b.litertlm', {
37
+ * backend: 'gpu',
38
+ * temperature: 0.7,
39
+ * maxContextTokens: 4096,
40
+ * maxOutputTokens: 512
41
+ * });
42
+ *
43
+ * // ── Unified entry point (recommended) ─────────────────────────────────────
44
+ * // Blocking text
45
+ * const response = await llm.execute([{ type: 'text', text: 'Hello!' }]);
46
+ *
47
+ * // Streaming text
48
+ * await llm.execute(
49
+ * [{ type: 'text', text: 'Write me a haiku' }],
50
+ * (token, done) => { process.stdout.write(token); }
51
+ * );
52
+ *
53
+ * // Multimodal (image path — auto-scaled to 1024px on both platforms)
54
+ * const desc = await llm.execute([
55
+ * { type: 'text', text: 'Describe this image' },
56
+ * { type: 'image', path: '/path/to/photo.jpg' },
57
+ * ]);
58
+ *
59
+ * // ── Legacy methods (still fully supported) ────────────────────────────────
60
+ * const r = await llm.sendMessage('Hello');
61
+ * llm.sendMessageAsync('Stream this', (t, done) => console.log(t));
62
+ *
63
+ * llm.close();
64
+ * ```
65
+ */
66
+ var modelFactory_1 = require("./modelFactory");
67
+ Object.defineProperty(exports, "createLLM", { enumerable: true, get: function () { return modelFactory_1.createLLM; } });
68
+ /**
69
+ * Pre-defined model identifiers for common models.
70
+ * Use with model download utilities or as reference.
71
+ */
72
+ exports.Models = {
73
+ /** Gemma 4 E2B Instruct (2B parameters, latest generation) */
74
+ GEMMA_4_E2B: "gemma-4-E2B-it-litert-lm",
75
+ /** Gemma 4 E4B Instruct (4B parameters, higher quality) */
76
+ GEMMA_4_E4B: "gemma-4-E4B-it-litert-lm",
77
+ /** Gemma 3n E2B (2B parameters, efficient) */
78
+ GEMMA_3N_E2B: "gemma-3n-E2B-it-litert-lm-preview",
79
+ /** Gemma 3n E4B (4B parameters, higher quality) */
80
+ GEMMA_3N_E4B: "gemma-3n-E4B-it-litert-lm-preview",
81
+ /** Gemma 3 1B (smallest Gemma) */
82
+ GEMMA_3_1B: "Gemma3-1B-IT_multi-prefill-seq_q4_ekv4096",
83
+ /** Phi-4 Mini Instruct */
84
+ PHI_4_MINI: "Phi-4-mini-instruct_multi-prefill-seq_q8_ekv4096",
85
+ /** Qwen 2.5 1.5B Instruct */
86
+ QWEN_2_5_1_5B: "Qwen2.5-1.5B-Instruct_multi-prefill-seq_q8_ekv4096",
87
+ };
88
+ /**
89
+ * Get the recommended backend for the current platform.
90
+ * Returns 'cpu' as the safe default. GPU (Metal on iOS, GPU delegate on Android)
91
+ * is faster but may not be available on all devices or model configurations.
92
+ *
93
+ * @returns The recommended backend ('cpu')
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const backend = getRecommendedBackend();
98
+ * llm.loadModel(path, { backend });
99
+ * ```
100
+ */
101
+ function getRecommendedBackend() {
102
+ // CPU is the safe default — always available, broadly compatible.
103
+ // GPU is faster but may fail on some models/devices.
104
+ return "cpu";
105
+ }
106
+ /**
107
+ * Check if a backend configuration is supported on the current platform.
108
+ * Returns a warning message if the configuration may have issues.
109
+ *
110
+ * @param backend The backend to check
111
+ * @returns Warning message if there may be issues, undefined if OK
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * const warning = checkBackendSupport('npu');
116
+ * if (warning) {
117
+ * console.warn(warning);
118
+ * }
119
+ * ```
120
+ */
121
+ function checkBackendSupport(backend) {
122
+ if (backend === "gpu") {
123
+ if (react_native_1.Platform.OS === "android") {
124
+ // GPU uses OpenCL on Android. Supported on many devices (Mali, Adreno, etc.)
125
+ // but may not be available on all. The engine will automatically fall back
126
+ // to CPU if GPU initialization fails.
127
+ return "GPU acceleration uses OpenCL. If unavailable on this device, the engine will automatically fall back to CPU.";
128
+ }
129
+ // iOS always supports GPU via Metal
130
+ return undefined;
131
+ }
132
+ if (backend === "npu") {
133
+ if (react_native_1.Platform.OS === "android") {
134
+ return "NPU backend requires compatible hardware (Qualcomm Hexagon, MediaTek APU, etc.). Will automatically fall back to CPU if unavailable.";
135
+ }
136
+ if (react_native_1.Platform.OS === "ios") {
137
+ return "NPU (Neural Engine) is not yet supported on iOS. Mapped to GPU (Metal) internally.";
138
+ }
139
+ }
140
+ return undefined;
141
+ }
142
+ /**
143
+ * Check if multimodal features (image/audio) are supported on the current platform.
144
+ * Returns an error message if not supported, undefined if OK.
145
+ *
146
+ * Both iOS (v0.12.0 CLiteRTLM xcframework) and Android (LiteRT-LM SDK) ship the
147
+ * vision/audio executor ops, so there is no platform-level block. Whether a
148
+ * given call succeeds depends on the **loaded model**: only multimodal models
149
+ * (e.g. Gemma 3n) bundle the vision/audio executors. Pass `multimodal: true` to
150
+ * `loadModel` for such models, or rely on filename sniffing ("3n"/"gemma3").
151
+ *
152
+ * @returns Error message if multimodal is not supported, undefined if OK
153
+ *
154
+ * @example
155
+ * ```typescript
156
+ * const error = checkMultimodalSupport();
157
+ * if (error) {
158
+ * console.warn(error);
159
+ * // Fall back to text-only
160
+ * } else {
161
+ * llm.sendMessageWithImage('Describe this', imagePath);
162
+ * }
163
+ * ```
164
+ */
165
+ function checkMultimodalSupport() {
166
+ // Supported on both platforms with a multimodal model loaded.
167
+ return undefined;
168
+ }
169
+ /**
170
+ * Download URL for the Gemma 3n E2B IT INT4 model (~1.3 GB).
171
+ * Public — hosted on litert.dev, no authentication required.
172
+ */
173
+ exports.GEMMA_3N_E2B_IT_INT4 = "https://litert.dev/gemma-3n-E2B-it-int4.litertlm";
174
+ /**
175
+ * Download URL for the Gemma 4 E2B IT model (2.58 GB).
176
+ * Public — no HuggingFace account required.
177
+ */
178
+ exports.GEMMA_4_E2B_IT = "https://huggingface.co/litert-community/gemma-4-E2B-it-litert-lm/resolve/main/gemma-4-E2B-it.litertlm";
179
+ /**
180
+ * Download URL for the Gemma 4 E4B IT model (3.65 GB).
181
+ * Higher quality than E2B but requires more device memory.
182
+ * Public — no HuggingFace account required.
183
+ */
184
+ exports.GEMMA_4_E4B_IT = "https://huggingface.co/litert-community/gemma-4-E4B-it-litert-lm/resolve/main/gemma-4-E4B-it.litertlm";
@@ -0,0 +1,18 @@
1
+ import type { MultimodalPart } from "./specs/LiteRTLM.nitro";
2
+ export type TokenCallback = (token: string, done: boolean) => void;
3
+ /** Legacy inference entry points on LiteRTLM (createLLM routes these to execute). */
4
+ export declare const LEGACY_INFERENCE_METHODS: readonly ["sendMessage", "sendMessageWithImage", "sendMessageWithAudio", "sendMultimodalMessage", "sendMessageAsync", "sendMessageWithImageAsync", "sendMessageWithAudioAsync"];
5
+ export type LegacyInferenceMethod = (typeof LEGACY_INFERENCE_METHODS)[number];
6
+ export declare function textPart(text: string): MultimodalPart;
7
+ export declare function imagePart(path: string): MultimodalPart;
8
+ export declare function audioPart(path: string): MultimodalPart;
9
+ export type InferenceRoute = {
10
+ parts: MultimodalPart[];
11
+ onToken?: TokenCallback;
12
+ };
13
+ /**
14
+ * Maps legacy public API names to unified MultimodalPart payloads.
15
+ * JS source of truth — native legacy wrappers mirror these shapes for direct hybrid access.
16
+ */
17
+ export declare function routeLegacyInference(method: string, args: unknown[]): InferenceRoute | null;
18
+ export declare function isLegacyInferenceMethod(method: string): method is LegacyInferenceMethod;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LEGACY_INFERENCE_METHODS = void 0;
4
+ exports.textPart = textPart;
5
+ exports.imagePart = imagePart;
6
+ exports.audioPart = audioPart;
7
+ exports.routeLegacyInference = routeLegacyInference;
8
+ exports.isLegacyInferenceMethod = isLegacyInferenceMethod;
9
+ /** Legacy inference entry points on LiteRTLM (createLLM routes these to execute). */
10
+ exports.LEGACY_INFERENCE_METHODS = [
11
+ "sendMessage",
12
+ "sendMessageWithImage",
13
+ "sendMessageWithAudio",
14
+ "sendMultimodalMessage",
15
+ "sendMessageAsync",
16
+ "sendMessageWithImageAsync",
17
+ "sendMessageWithAudioAsync",
18
+ ];
19
+ function textPart(text) {
20
+ return { type: "text", text };
21
+ }
22
+ function imagePart(path) {
23
+ return { type: "image", path };
24
+ }
25
+ function audioPart(path) {
26
+ return { type: "audio", path };
27
+ }
28
+ const LEGACY_ROUTES = {
29
+ sendMessage: (args) => ({ parts: [textPart(args[0])] }),
30
+ sendMessageWithImage: (args) => ({
31
+ parts: [textPart(args[0]), imagePart(args[1])],
32
+ }),
33
+ sendMessageWithAudio: (args) => ({
34
+ parts: [textPart(args[0]), audioPart(args[1])],
35
+ }),
36
+ sendMultimodalMessage: (args) => ({ parts: args[0] }),
37
+ sendMessageAsync: (args) => ({
38
+ parts: [textPart(args[0])],
39
+ onToken: args[1],
40
+ }),
41
+ sendMessageWithImageAsync: (args) => ({
42
+ parts: [textPart(args[0]), imagePart(args[1])],
43
+ onToken: args[2],
44
+ }),
45
+ sendMessageWithAudioAsync: (args) => ({
46
+ parts: [textPart(args[0]), audioPart(args[1])],
47
+ onToken: args[2],
48
+ }),
49
+ };
50
+ const LEGACY_METHOD_SET = new Set(exports.LEGACY_INFERENCE_METHODS);
51
+ /**
52
+ * Maps legacy public API names to unified MultimodalPart payloads.
53
+ * JS source of truth — native legacy wrappers mirror these shapes for direct hybrid access.
54
+ */
55
+ function routeLegacyInference(method, args) {
56
+ if (!LEGACY_METHOD_SET.has(method)) {
57
+ return null;
58
+ }
59
+ return LEGACY_ROUTES[method](args);
60
+ }
61
+ function isLegacyInferenceMethod(method) {
62
+ return LEGACY_METHOD_SET.has(method);
63
+ }