@inferrlm/react-native-mlx 0.2.0-inferrlm.2 → 0.4.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 (102) hide show
  1. package/MLXReactNative.podspec +9 -3
  2. package/ios/Sources/AudioCaptureManager.swift +110 -0
  3. package/ios/Sources/HybridLLM.swift +562 -74
  4. package/ios/Sources/HybridSTT.swift +202 -0
  5. package/ios/Sources/HybridTTS.swift +145 -0
  6. package/ios/Sources/JSONHelpers.swift +9 -0
  7. package/ios/Sources/ModelDownloader.swift +26 -12
  8. package/ios/Sources/StreamEventEmitter.swift +132 -0
  9. package/ios/Sources/ThinkingStateMachine.swift +206 -0
  10. package/nitrogen/generated/ios/MLXReactNative+autolinking.rb +1 -1
  11. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.cpp +76 -1
  12. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.hpp +338 -1
  13. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Umbrella.hpp +28 -1
  14. package/nitrogen/generated/ios/MLXReactNativeAutolinking.mm +17 -1
  15. package/nitrogen/generated/ios/MLXReactNativeAutolinking.swift +31 -1
  16. package/nitrogen/generated/ios/c++/HybridLLMSpecSwift.cpp +1 -1
  17. package/nitrogen/generated/ios/c++/HybridLLMSpecSwift.hpp +18 -3
  18. package/nitrogen/generated/ios/c++/HybridModelManagerSpecSwift.cpp +1 -1
  19. package/nitrogen/generated/ios/c++/HybridModelManagerSpecSwift.hpp +1 -1
  20. package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.cpp +11 -0
  21. package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.hpp +149 -0
  22. package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.cpp +11 -0
  23. package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.hpp +128 -0
  24. package/nitrogen/generated/ios/swift/Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_.swift +62 -0
  25. package/nitrogen/generated/ios/swift/Func_void.swift +1 -1
  26. package/nitrogen/generated/ios/swift/Func_void_bool.swift +1 -1
  27. package/nitrogen/generated/ios/swift/Func_void_double.swift +1 -1
  28. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -1
  29. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_AnyMap_.swift +47 -0
  30. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift +47 -0
  31. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___.swift +67 -0
  32. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +1 -1
  33. package/nitrogen/generated/ios/swift/Func_void_std__string_std__string.swift +47 -0
  34. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +1 -1
  35. package/nitrogen/generated/ios/swift/GenerationStats.swift +14 -3
  36. package/nitrogen/generated/ios/swift/HybridLLMSpec.swift +3 -2
  37. package/nitrogen/generated/ios/swift/HybridLLMSpec_cxx.swift +38 -2
  38. package/nitrogen/generated/ios/swift/HybridModelManagerSpec.swift +1 -1
  39. package/nitrogen/generated/ios/swift/HybridModelManagerSpec_cxx.swift +1 -1
  40. package/nitrogen/generated/ios/swift/HybridSTTSpec.swift +66 -0
  41. package/nitrogen/generated/ios/swift/HybridSTTSpec_cxx.swift +286 -0
  42. package/nitrogen/generated/ios/swift/HybridTTSSpec.swift +63 -0
  43. package/nitrogen/generated/ios/swift/HybridTTSSpec_cxx.swift +229 -0
  44. package/nitrogen/generated/ios/swift/LLMLoadOptions.swift +44 -2
  45. package/nitrogen/generated/ios/swift/LLMMessage.swift +1 -1
  46. package/nitrogen/generated/ios/swift/STTLoadOptions.swift +66 -0
  47. package/nitrogen/generated/ios/swift/TTSGenerateOptions.swift +78 -0
  48. package/nitrogen/generated/ios/swift/TTSLoadOptions.swift +66 -0
  49. package/nitrogen/generated/ios/swift/ToolDefinition.swift +113 -0
  50. package/nitrogen/generated/ios/swift/ToolParameter.swift +69 -0
  51. package/nitrogen/generated/shared/c++/GenerationStats.hpp +7 -3
  52. package/nitrogen/generated/shared/c++/HybridLLMSpec.cpp +2 -1
  53. package/nitrogen/generated/shared/c++/HybridLLMSpec.hpp +3 -2
  54. package/nitrogen/generated/shared/c++/HybridModelManagerSpec.cpp +1 -1
  55. package/nitrogen/generated/shared/c++/HybridModelManagerSpec.hpp +1 -1
  56. package/nitrogen/generated/shared/c++/HybridSTTSpec.cpp +32 -0
  57. package/nitrogen/generated/shared/c++/HybridSTTSpec.hpp +78 -0
  58. package/nitrogen/generated/shared/c++/HybridTTSSpec.cpp +29 -0
  59. package/nitrogen/generated/shared/c++/HybridTTSSpec.hpp +78 -0
  60. package/nitrogen/generated/shared/c++/LLMLoadOptions.hpp +10 -3
  61. package/nitrogen/generated/shared/c++/LLMMessage.hpp +1 -1
  62. package/nitrogen/generated/shared/c++/STTLoadOptions.hpp +76 -0
  63. package/nitrogen/generated/shared/c++/TTSGenerateOptions.hpp +80 -0
  64. package/nitrogen/generated/shared/c++/TTSLoadOptions.hpp +76 -0
  65. package/nitrogen/generated/shared/c++/ToolDefinition.hpp +93 -0
  66. package/nitrogen/generated/shared/c++/ToolParameter.hpp +87 -0
  67. package/package.json +13 -8
  68. package/src/index.ts +48 -4
  69. package/src/llm.ts +90 -5
  70. package/src/models.ts +347 -0
  71. package/src/specs/LLM.nitro.ts +111 -7
  72. package/src/specs/STT.nitro.ts +35 -0
  73. package/src/specs/TTS.nitro.ts +30 -0
  74. package/src/stt.ts +67 -0
  75. package/src/tool-utils.ts +74 -0
  76. package/src/tts.ts +60 -0
  77. package/lib/module/index.js +0 -6
  78. package/lib/module/index.js.map +0 -1
  79. package/lib/module/llm.js +0 -125
  80. package/lib/module/llm.js.map +0 -1
  81. package/lib/module/modelManager.js +0 -79
  82. package/lib/module/modelManager.js.map +0 -1
  83. package/lib/module/models.js +0 -41
  84. package/lib/module/models.js.map +0 -1
  85. package/lib/module/package.json +0 -1
  86. package/lib/module/specs/LLM.nitro.js +0 -4
  87. package/lib/module/specs/LLM.nitro.js.map +0 -1
  88. package/lib/module/specs/ModelManager.nitro.js +0 -4
  89. package/lib/module/specs/ModelManager.nitro.js.map +0 -1
  90. package/lib/typescript/package.json +0 -1
  91. package/lib/typescript/src/index.d.ts +0 -6
  92. package/lib/typescript/src/index.d.ts.map +0 -1
  93. package/lib/typescript/src/llm.d.ts +0 -87
  94. package/lib/typescript/src/llm.d.ts.map +0 -1
  95. package/lib/typescript/src/modelManager.d.ts +0 -53
  96. package/lib/typescript/src/modelManager.d.ts.map +0 -1
  97. package/lib/typescript/src/models.d.ts +0 -29
  98. package/lib/typescript/src/models.d.ts.map +0 -1
  99. package/lib/typescript/src/specs/LLM.nitro.d.ts +0 -88
  100. package/lib/typescript/src/specs/LLM.nitro.d.ts.map +0 -1
  101. package/lib/typescript/src/specs/ModelManager.nitro.d.ts +0 -41
  102. package/lib/typescript/src/specs/ModelManager.nitro.d.ts.map +0 -1
package/src/models.ts CHANGED
@@ -1,3 +1,39 @@
1
+ export enum ModelFamily {
2
+ Llama = 'Llama',
3
+ Qwen = 'Qwen',
4
+ Gemma = 'Gemma',
5
+ Phi = 'Phi',
6
+ SmolLM = 'SmolLM',
7
+ OpenELM = 'OpenELM',
8
+ PocketTTS = 'PocketTTS',
9
+ GLMASR = 'GLMASR',
10
+ }
11
+
12
+ export enum ModelProvider {
13
+ Meta = 'Meta',
14
+ Alibaba = 'Alibaba',
15
+ Google = 'Google',
16
+ Microsoft = 'Microsoft',
17
+ HuggingFace = 'HuggingFace',
18
+ Apple = 'Apple',
19
+ Kyutai = 'Kyutai',
20
+ }
21
+
22
+ export type ModelQuantization = '4bit' | '8bit' | 'bf16'
23
+
24
+ export type ModelType = 'llm' | 'tts' | 'stt'
25
+
26
+ export interface ModelInfo {
27
+ id: MLXModel
28
+ family: ModelFamily
29
+ provider: ModelProvider
30
+ parameters: string
31
+ quantization: ModelQuantization
32
+ displayName: string
33
+ downloadSize: number
34
+ type: ModelType
35
+ }
36
+
1
37
  export enum MLXModel {
2
38
  // Llama 3.2 (Meta) - 1B and 3B variants
3
39
  Llama_3_2_1B_Instruct_4bit = 'mlx-community/Llama-3.2-1B-Instruct-4bit',
@@ -42,4 +78,315 @@ export enum MLXModel {
42
78
  OpenELM_1_1B_8bit = 'mlx-community/OpenELM-1_1B-8bit',
43
79
  OpenELM_3B_4bit = 'mlx-community/OpenELM-3B-4bit',
44
80
  OpenELM_3B_8bit = 'mlx-community/OpenELM-3B-8bit',
81
+
82
+ // PocketTTS (Kyutai) - 44.6M
83
+ PocketTTS = 'mlx-community/pocket-tts',
84
+ PocketTTS_8bit = 'mlx-community/pocket-tts-8bit',
85
+ PocketTTS_4bit = 'mlx-community/pocket-tts-4bit',
86
+
87
+ // GLM-ASR (GLMASR) - Speech-to-Text
88
+ GLM_ASR_Nano_4bit = 'mlx-community/GLM-ASR-Nano-2512-4bit',
45
89
  }
90
+
91
+ export const MLXModels: ModelInfo[] = [
92
+ {
93
+ id: MLXModel.Llama_3_2_1B_Instruct_4bit,
94
+ family: ModelFamily.Llama,
95
+ provider: ModelProvider.Meta,
96
+ parameters: '1B',
97
+ quantization: '4bit',
98
+ displayName: 'Llama 3.2 1B Instruct (4-bit)',
99
+ downloadSize: 1407777762,
100
+ type: 'llm',
101
+ },
102
+ {
103
+ id: MLXModel.Llama_3_2_1B_Instruct_8bit,
104
+ family: ModelFamily.Llama,
105
+ provider: ModelProvider.Meta,
106
+ parameters: '1B',
107
+ quantization: '8bit',
108
+ displayName: 'Llama 3.2 1B Instruct (8-bit)',
109
+ downloadSize: 1313157436,
110
+ type: 'llm',
111
+ },
112
+ {
113
+ id: MLXModel.Llama_3_2_3B_Instruct_4bit,
114
+ family: ModelFamily.Llama,
115
+ provider: ModelProvider.Meta,
116
+ parameters: '3B',
117
+ quantization: '4bit',
118
+ displayName: 'Llama 3.2 3B Instruct (4-bit)',
119
+ downloadSize: 2019397474,
120
+ type: 'llm',
121
+ },
122
+ {
123
+ id: MLXModel.Llama_3_2_3B_Instruct_8bit,
124
+ family: ModelFamily.Llama,
125
+ provider: ModelProvider.Meta,
126
+ parameters: '3B',
127
+ quantization: '8bit',
128
+ displayName: 'Llama 3.2 3B Instruct (8-bit)',
129
+ downloadSize: 3413784042,
130
+ type: 'llm',
131
+ },
132
+ {
133
+ id: MLXModel.Qwen2_5_0_5B_Instruct_4bit,
134
+ family: ModelFamily.Qwen,
135
+ provider: ModelProvider.Alibaba,
136
+ parameters: '0.5B',
137
+ quantization: '4bit',
138
+ displayName: 'Qwen 2.5 0.5B Instruct (4-bit)',
139
+ downloadSize: 278064920,
140
+ type: 'llm',
141
+ },
142
+ {
143
+ id: MLXModel.Qwen2_5_0_5B_Instruct_8bit,
144
+ family: ModelFamily.Qwen,
145
+ provider: ModelProvider.Alibaba,
146
+ parameters: '0.5B',
147
+ quantization: '8bit',
148
+ displayName: 'Qwen 2.5 0.5B Instruct (8-bit)',
149
+ downloadSize: 525045902,
150
+ type: 'llm',
151
+ },
152
+ {
153
+ id: MLXModel.Qwen2_5_1_5B_Instruct_4bit,
154
+ family: ModelFamily.Qwen,
155
+ provider: ModelProvider.Alibaba,
156
+ parameters: '1.5B',
157
+ quantization: '4bit',
158
+ displayName: 'Qwen 2.5 1.5B Instruct (4-bit)',
159
+ downloadSize: 868628559,
160
+ type: 'llm',
161
+ },
162
+ {
163
+ id: MLXModel.Qwen2_5_1_5B_Instruct_8bit,
164
+ family: ModelFamily.Qwen,
165
+ provider: ModelProvider.Alibaba,
166
+ parameters: '1.5B',
167
+ quantization: '8bit',
168
+ displayName: 'Qwen 2.5 1.5B Instruct (8-bit)',
169
+ downloadSize: 1640414038,
170
+ type: 'llm',
171
+ },
172
+ {
173
+ id: MLXModel.Qwen2_5_3B_Instruct_4bit,
174
+ family: ModelFamily.Qwen,
175
+ provider: ModelProvider.Alibaba,
176
+ parameters: '3B',
177
+ quantization: '4bit',
178
+ displayName: 'Qwen 2.5 3B Instruct (4-bit)',
179
+ downloadSize: 1736293090,
180
+ type: 'llm',
181
+ },
182
+ {
183
+ id: MLXModel.Qwen2_5_3B_Instruct_8bit,
184
+ family: ModelFamily.Qwen,
185
+ provider: ModelProvider.Alibaba,
186
+ parameters: '3B',
187
+ quantization: '8bit',
188
+ displayName: 'Qwen 2.5 3B Instruct (8-bit)',
189
+ downloadSize: 3279142142,
190
+ type: 'llm',
191
+ },
192
+ {
193
+ id: MLXModel.Qwen3_1_7B_4bit,
194
+ family: ModelFamily.Qwen,
195
+ provider: ModelProvider.Alibaba,
196
+ parameters: '1.7B',
197
+ quantization: '4bit',
198
+ displayName: 'Qwen 3 1.7B (4-bit)',
199
+ downloadSize: 979502864,
200
+ type: 'llm',
201
+ },
202
+ {
203
+ id: MLXModel.Qwen3_1_7B_8bit,
204
+ family: ModelFamily.Qwen,
205
+ provider: ModelProvider.Alibaba,
206
+ parameters: '1.7B',
207
+ quantization: '8bit',
208
+ displayName: 'Qwen 3 1.7B (8-bit)',
209
+ downloadSize: 1839729195,
210
+ type: 'llm',
211
+ },
212
+ {
213
+ id: MLXModel.Gemma_3_1B_IT_4bit,
214
+ family: ModelFamily.Gemma,
215
+ provider: ModelProvider.Google,
216
+ parameters: '1B',
217
+ quantization: '4bit',
218
+ displayName: 'Gemma 3 1B IT (4-bit)',
219
+ downloadSize: 770650946,
220
+ type: 'llm',
221
+ },
222
+ {
223
+ id: MLXModel.Gemma_3_1B_IT_8bit,
224
+ family: ModelFamily.Gemma,
225
+ provider: ModelProvider.Google,
226
+ parameters: '1B',
227
+ quantization: '8bit',
228
+ displayName: 'Gemma 3 1B IT (8-bit)',
229
+ downloadSize: 1421522471,
230
+ type: 'llm',
231
+ },
232
+ {
233
+ id: MLXModel.Phi_3_5_Mini_Instruct_4bit,
234
+ family: ModelFamily.Phi,
235
+ provider: ModelProvider.Microsoft,
236
+ parameters: '3.8B',
237
+ quantization: '4bit',
238
+ displayName: 'Phi 3.5 Mini Instruct (4-bit)',
239
+ downloadSize: 2150195856,
240
+ type: 'llm',
241
+ },
242
+ {
243
+ id: MLXModel.Phi_3_5_Mini_Instruct_8bit,
244
+ family: ModelFamily.Phi,
245
+ provider: ModelProvider.Microsoft,
246
+ parameters: '3.8B',
247
+ quantization: '8bit',
248
+ displayName: 'Phi 3.5 Mini Instruct (8-bit)',
249
+ downloadSize: 4060636056,
250
+ type: 'llm',
251
+ },
252
+ {
253
+ id: MLXModel.Phi_4_Mini_Instruct_4bit,
254
+ family: ModelFamily.Phi,
255
+ provider: ModelProvider.Microsoft,
256
+ parameters: '3.8B',
257
+ quantization: '4bit',
258
+ displayName: 'Phi 4 Mini Instruct (4-bit)',
259
+ downloadSize: 2173624891,
260
+ type: 'llm',
261
+ },
262
+ {
263
+ id: MLXModel.Phi_4_Mini_Instruct_8bit,
264
+ family: ModelFamily.Phi,
265
+ provider: ModelProvider.Microsoft,
266
+ parameters: '3.8B',
267
+ quantization: '8bit',
268
+ displayName: 'Phi 4 Mini Instruct (8-bit)',
269
+ downloadSize: 4091536167,
270
+ type: 'llm',
271
+ },
272
+ {
273
+ id: MLXModel.SmolLM_1_7B_Instruct_4bit,
274
+ family: ModelFamily.SmolLM,
275
+ provider: ModelProvider.HuggingFace,
276
+ parameters: '1.7B',
277
+ quantization: '4bit',
278
+ displayName: 'SmolLM 1.7B Instruct (4-bit)',
279
+ downloadSize: 962855374,
280
+ type: 'llm',
281
+ },
282
+ {
283
+ id: MLXModel.SmolLM_1_7B_Instruct_8bit,
284
+ family: ModelFamily.SmolLM,
285
+ provider: ModelProvider.HuggingFace,
286
+ parameters: '1.7B',
287
+ quantization: '8bit',
288
+ displayName: 'SmolLM 1.7B Instruct (8-bit)',
289
+ downloadSize: 1818493993,
290
+ type: 'llm',
291
+ },
292
+ {
293
+ id: MLXModel.SmolLM2_1_7B_Instruct_4bit,
294
+ family: ModelFamily.SmolLM,
295
+ provider: ModelProvider.HuggingFace,
296
+ parameters: '1.7B',
297
+ quantization: '4bit',
298
+ displayName: 'SmolLM2 1.7B Instruct (4-bit)',
299
+ downloadSize: 980000000,
300
+ type: 'llm',
301
+ },
302
+ {
303
+ id: MLXModel.SmolLM2_1_7B_Instruct_8bit,
304
+ family: ModelFamily.SmolLM,
305
+ provider: ModelProvider.HuggingFace,
306
+ parameters: '1.7B',
307
+ quantization: '8bit',
308
+ displayName: 'SmolLM2 1.7B Instruct (8-bit)',
309
+ downloadSize: 1850000000,
310
+ type: 'llm',
311
+ },
312
+ {
313
+ id: MLXModel.OpenELM_1_1B_4bit,
314
+ family: ModelFamily.OpenELM,
315
+ provider: ModelProvider.Apple,
316
+ parameters: '1.1B',
317
+ quantization: '4bit',
318
+ displayName: 'OpenELM 1.1B (4-bit)',
319
+ downloadSize: 608162655,
320
+ type: 'llm',
321
+ },
322
+ {
323
+ id: MLXModel.OpenELM_1_1B_8bit,
324
+ family: ModelFamily.OpenELM,
325
+ provider: ModelProvider.Apple,
326
+ parameters: '1.1B',
327
+ quantization: '8bit',
328
+ displayName: 'OpenELM 1.1B (8-bit)',
329
+ downloadSize: 1148048397,
330
+ type: 'llm',
331
+ },
332
+ {
333
+ id: MLXModel.OpenELM_3B_4bit,
334
+ family: ModelFamily.OpenELM,
335
+ provider: ModelProvider.Apple,
336
+ parameters: '3B',
337
+ quantization: '4bit',
338
+ displayName: 'OpenELM 3B (4-bit)',
339
+ downloadSize: 1650000000,
340
+ type: 'llm',
341
+ },
342
+ {
343
+ id: MLXModel.OpenELM_3B_8bit,
344
+ family: ModelFamily.OpenELM,
345
+ provider: ModelProvider.Apple,
346
+ parameters: '3B',
347
+ quantization: '8bit',
348
+ displayName: 'OpenELM 3B (8-bit)',
349
+ downloadSize: 3100000000,
350
+ type: 'llm',
351
+ },
352
+ {
353
+ id: MLXModel.PocketTTS,
354
+ family: ModelFamily.PocketTTS,
355
+ provider: ModelProvider.Kyutai,
356
+ parameters: '44.6M',
357
+ quantization: 'bf16',
358
+ displayName: 'PocketTTS (bf16)',
359
+ downloadSize: 180000000,
360
+ type: 'tts',
361
+ },
362
+ {
363
+ id: MLXModel.PocketTTS_8bit,
364
+ family: ModelFamily.PocketTTS,
365
+ provider: ModelProvider.Kyutai,
366
+ parameters: '44.6M',
367
+ quantization: '8bit',
368
+ displayName: 'PocketTTS (8-bit)',
369
+ downloadSize: 140000000,
370
+ type: 'tts',
371
+ },
372
+ {
373
+ id: MLXModel.PocketTTS_4bit,
374
+ family: ModelFamily.PocketTTS,
375
+ provider: ModelProvider.Kyutai,
376
+ parameters: '44.6M',
377
+ quantization: '4bit',
378
+ displayName: 'PocketTTS (4-bit)',
379
+ downloadSize: 80000000,
380
+ type: 'tts',
381
+ },
382
+ {
383
+ id: MLXModel.GLM_ASR_Nano_4bit,
384
+ family: ModelFamily.GLMASR,
385
+ provider: ModelProvider.Alibaba,
386
+ parameters: '1B',
387
+ quantization: '4bit',
388
+ displayName: 'GLM-ASR Nano (4-bit)',
389
+ downloadSize: 600000000,
390
+ type: 'stt',
391
+ },
392
+ ]
@@ -1,24 +1,109 @@
1
- import type { HybridObject } from 'react-native-nitro-modules'
1
+ import type { AnyMap, HybridObject } from 'react-native-nitro-modules'
2
2
 
3
3
  /**
4
4
  * Statistics from the last text generation.
5
5
  */
6
6
  export interface GenerationStats {
7
- /** Total number of tokens generated */
8
7
  tokenCount: number
9
- /** Generation speed in tokens per second */
10
8
  tokensPerSecond: number
11
- /** Time in milliseconds until the first token was generated */
12
9
  timeToFirstToken: number
13
- /** Total generation time in milliseconds */
14
10
  totalTime: number
11
+ toolExecutionTime: number
15
12
  }
16
13
 
14
+ export interface GenerationStartEvent {
15
+ type: 'generation_start'
16
+ timestamp: number
17
+ }
18
+
19
+ export interface TokenEvent {
20
+ type: 'token'
21
+ token: string
22
+ }
23
+
24
+ export interface ThinkingStartEvent {
25
+ type: 'thinking_start'
26
+ timestamp: number
27
+ }
28
+
29
+ export interface ThinkingChunkEvent {
30
+ type: 'thinking_chunk'
31
+ chunk: string
32
+ }
33
+
34
+ export interface ThinkingEndEvent {
35
+ type: 'thinking_end'
36
+ content: string
37
+ timestamp: number
38
+ }
39
+
40
+ export interface ToolCallStartEvent {
41
+ type: 'tool_call_start'
42
+ id: string
43
+ name: string
44
+ arguments: string
45
+ }
46
+
47
+ export interface ToolCallExecutingEvent {
48
+ type: 'tool_call_executing'
49
+ id: string
50
+ }
51
+
52
+ export interface ToolCallCompletedEvent {
53
+ type: 'tool_call_completed'
54
+ id: string
55
+ result: string
56
+ }
57
+
58
+ export interface ToolCallFailedEvent {
59
+ type: 'tool_call_failed'
60
+ id: string
61
+ error: string
62
+ }
63
+
64
+ export interface GenerationEndEvent {
65
+ type: 'generation_end'
66
+ content: string
67
+ stats: GenerationStats
68
+ }
69
+
70
+ export type StreamEvent =
71
+ | GenerationStartEvent
72
+ | TokenEvent
73
+ | ThinkingStartEvent
74
+ | ThinkingChunkEvent
75
+ | ThinkingEndEvent
76
+ | ToolCallStartEvent
77
+ | ToolCallExecutingEvent
78
+ | ToolCallCompletedEvent
79
+ | ToolCallFailedEvent
80
+ | GenerationEndEvent
81
+
17
82
  export interface LLMMessage {
18
83
  role: string
19
84
  content: string
20
85
  }
21
86
 
87
+ /**
88
+ * Parameter definition for a tool.
89
+ */
90
+ export interface ToolParameter {
91
+ name: string
92
+ type: string
93
+ description: string
94
+ required: boolean
95
+ }
96
+
97
+ /**
98
+ * Tool definition that can be called by the model.
99
+ */
100
+ export interface ToolDefinition {
101
+ name: string
102
+ description: string
103
+ parameters: ToolParameter[]
104
+ handler: (args: AnyMap) => Promise<AnyMap>
105
+ }
106
+
22
107
  /** Options for loading a model.
23
108
  */
24
109
  export interface LLMLoadOptions {
@@ -28,6 +113,8 @@ export interface LLMLoadOptions {
28
113
  additionalContext?: LLMMessage[]
29
114
  /** Whether to automatically manage message history */
30
115
  manageHistory?: boolean
116
+ /** Tools available for the model to call */
117
+ tools?: ToolDefinition[]
31
118
  }
32
119
 
33
120
  /**
@@ -50,12 +137,23 @@ export interface LLM extends HybridObject<{ ios: 'swift' }> {
50
137
  generate(prompt: string): Promise<string>
51
138
 
52
139
  /**
53
- * Stream a response token by token.
140
+ * Stream a response token by token with optional tool calling support.
141
+ * Tools are automatically executed when the model calls them.
54
142
  * @param prompt - The input text to generate a response for
55
143
  * @param onToken - Callback invoked for each generated token
144
+ * @param onToolCall - Optional callback invoked when a tool is called (for UI feedback)
56
145
  * @returns The complete generated text
57
146
  */
58
- stream(prompt: string, onToken: (token: string) => void): Promise<string>
147
+ stream(
148
+ prompt: string,
149
+ onToken: (token: string) => void,
150
+ onToolCall?: (toolName: string, args: string) => void,
151
+ ): Promise<string>
152
+
153
+ streamWithEvents(
154
+ prompt: string,
155
+ onEvent: (eventJson: string) => void,
156
+ ): Promise<string>
59
157
 
60
158
  /**
61
159
  * Stop the current generation.
@@ -96,3 +194,9 @@ export interface LLM extends HybridObject<{ ios: 'swift' }> {
96
194
  /** System prompt used when loading the model */
97
195
  systemPrompt: string
98
196
  }
197
+
198
+ /**
199
+ * Supported parameter types for tool definitions.
200
+ * Used for type safety in createTool().
201
+ */
202
+ export type ToolParameterType = 'string' | 'number' | 'boolean' | 'array' | 'object'
@@ -0,0 +1,35 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules'
2
+
3
+ export interface STTLoadOptions {
4
+ onProgress?: (progress: number) => void
5
+ }
6
+
7
+ export interface STTTranscriptionInfo {
8
+ promptTokens: number
9
+ generationTokens: number
10
+ tokensPerSecond: number
11
+ prefillTime: number
12
+ generateTime: number
13
+ }
14
+
15
+ export interface STT extends HybridObject<{ ios: 'swift' }> {
16
+ readonly isLoaded: boolean
17
+ readonly isTranscribing: boolean
18
+ readonly isListening: boolean
19
+ readonly modelId: string
20
+
21
+ load(modelId: string, options?: STTLoadOptions): Promise<void>
22
+
23
+ transcribe(audio: ArrayBuffer): Promise<string>
24
+ transcribeStream(
25
+ audio: ArrayBuffer,
26
+ onToken: (token: string) => void
27
+ ): Promise<string>
28
+
29
+ startListening(): Promise<void>
30
+ transcribeBuffer(): Promise<string>
31
+ stopListening(): Promise<string>
32
+
33
+ stop(): void
34
+ unload(): void
35
+ }
@@ -0,0 +1,30 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules'
2
+
3
+ export interface TTSLoadOptions {
4
+ onProgress?: (progress: number) => void
5
+ }
6
+
7
+ export interface TTSGenerateOptions {
8
+ voice?: string
9
+ speed?: number
10
+ }
11
+
12
+ export interface TTS extends HybridObject<{ ios: 'swift' }> {
13
+ readonly isLoaded: boolean
14
+ readonly isGenerating: boolean
15
+ readonly modelId: string
16
+ readonly sampleRate: number
17
+
18
+ load(modelId: string, options?: TTSLoadOptions): Promise<void>
19
+ generate(
20
+ text: string,
21
+ options?: TTSGenerateOptions
22
+ ): Promise<ArrayBuffer>
23
+ stream(
24
+ text: string,
25
+ onAudioChunk: (audio: ArrayBuffer) => void,
26
+ options?: TTSGenerateOptions
27
+ ): Promise<void>
28
+ stop(): void
29
+ unload(): void
30
+ }
package/src/stt.ts ADDED
@@ -0,0 +1,67 @@
1
+ import { NitroModules } from 'react-native-nitro-modules'
2
+ import type {
3
+ STT as STTSpec,
4
+ STTLoadOptions,
5
+ } from './specs/STT.nitro'
6
+
7
+ let instance: STTSpec | null = null
8
+
9
+ function getInstance(): STTSpec {
10
+ if (!instance) {
11
+ instance = NitroModules.createHybridObject<STTSpec>('STT')
12
+ }
13
+ return instance
14
+ }
15
+
16
+ export const STT = {
17
+ load(modelId: string, options?: STTLoadOptions): Promise<void> {
18
+ return getInstance().load(modelId, options)
19
+ },
20
+
21
+ transcribe(audio: ArrayBuffer): Promise<string> {
22
+ return getInstance().transcribe(audio)
23
+ },
24
+
25
+ transcribeStream(
26
+ audio: ArrayBuffer,
27
+ onToken: (token: string) => void
28
+ ): Promise<string> {
29
+ return getInstance().transcribeStream(audio, onToken)
30
+ },
31
+
32
+ startListening(): Promise<void> {
33
+ return getInstance().startListening()
34
+ },
35
+
36
+ transcribeBuffer(): Promise<string> {
37
+ return getInstance().transcribeBuffer()
38
+ },
39
+
40
+ stopListening(): Promise<string> {
41
+ return getInstance().stopListening()
42
+ },
43
+
44
+ stop(): void {
45
+ getInstance().stop()
46
+ },
47
+
48
+ unload(): void {
49
+ getInstance().unload()
50
+ },
51
+
52
+ get isLoaded(): boolean {
53
+ return getInstance().isLoaded
54
+ },
55
+
56
+ get isTranscribing(): boolean {
57
+ return getInstance().isTranscribing
58
+ },
59
+
60
+ get isListening(): boolean {
61
+ return getInstance().isListening
62
+ },
63
+
64
+ get modelId(): string {
65
+ return getInstance().modelId
66
+ },
67
+ }