react-native-nitro-mlx 0.2.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 (110) hide show
  1. package/MLXReactNative.podspec +7 -1
  2. package/ios/Sources/AudioCaptureManager.swift +110 -0
  3. package/ios/Sources/HybridLLM.swift +518 -42
  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/lib/module/index.js +3 -0
  11. package/lib/module/index.js.map +1 -1
  12. package/lib/module/llm.js +72 -4
  13. package/lib/module/llm.js.map +1 -1
  14. package/lib/module/models.js +97 -26
  15. package/lib/module/models.js.map +1 -1
  16. package/lib/module/specs/STT.nitro.js +4 -0
  17. package/lib/module/specs/STT.nitro.js.map +1 -0
  18. package/lib/module/specs/TTS.nitro.js +4 -0
  19. package/lib/module/specs/TTS.nitro.js.map +1 -0
  20. package/lib/module/stt.js +49 -0
  21. package/lib/module/stt.js.map +1 -0
  22. package/lib/module/tool-utils.js +56 -0
  23. package/lib/module/tool-utils.js.map +1 -0
  24. package/lib/module/tts.js +40 -0
  25. package/lib/module/tts.js.map +1 -0
  26. package/lib/typescript/src/index.d.ts +8 -3
  27. package/lib/typescript/src/index.d.ts.map +1 -1
  28. package/lib/typescript/src/llm.d.ts +46 -4
  29. package/lib/typescript/src/llm.d.ts.map +1 -1
  30. package/lib/typescript/src/models.d.ts +13 -4
  31. package/lib/typescript/src/models.d.ts.map +1 -1
  32. package/lib/typescript/src/specs/LLM.nitro.d.ts +79 -7
  33. package/lib/typescript/src/specs/LLM.nitro.d.ts.map +1 -1
  34. package/lib/typescript/src/specs/STT.nitro.d.ts +28 -0
  35. package/lib/typescript/src/specs/STT.nitro.d.ts.map +1 -0
  36. package/lib/typescript/src/specs/TTS.nitro.d.ts +22 -0
  37. package/lib/typescript/src/specs/TTS.nitro.d.ts.map +1 -0
  38. package/lib/typescript/src/stt.d.ts +16 -0
  39. package/lib/typescript/src/stt.d.ts.map +1 -0
  40. package/lib/typescript/src/tool-utils.d.ts +13 -0
  41. package/lib/typescript/src/tool-utils.d.ts.map +1 -0
  42. package/lib/typescript/src/tts.d.ts +13 -0
  43. package/lib/typescript/src/tts.d.ts.map +1 -0
  44. package/nitrogen/generated/ios/MLXReactNative+autolinking.rb +1 -1
  45. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.cpp +76 -1
  46. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Bridge.hpp +338 -1
  47. package/nitrogen/generated/ios/MLXReactNative-Swift-Cxx-Umbrella.hpp +28 -1
  48. package/nitrogen/generated/ios/MLXReactNativeAutolinking.mm +17 -1
  49. package/nitrogen/generated/ios/MLXReactNativeAutolinking.swift +31 -1
  50. package/nitrogen/generated/ios/c++/HybridLLMSpecSwift.cpp +1 -1
  51. package/nitrogen/generated/ios/c++/HybridLLMSpecSwift.hpp +18 -3
  52. package/nitrogen/generated/ios/c++/HybridModelManagerSpecSwift.cpp +1 -1
  53. package/nitrogen/generated/ios/c++/HybridModelManagerSpecSwift.hpp +1 -1
  54. package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.cpp +11 -0
  55. package/nitrogen/generated/ios/c++/HybridSTTSpecSwift.hpp +149 -0
  56. package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.cpp +11 -0
  57. package/nitrogen/generated/ios/c++/HybridTTSSpecSwift.hpp +128 -0
  58. 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
  59. package/nitrogen/generated/ios/swift/Func_void.swift +1 -1
  60. package/nitrogen/generated/ios/swift/Func_void_bool.swift +1 -1
  61. package/nitrogen/generated/ios/swift/Func_void_double.swift +1 -1
  62. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -1
  63. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_AnyMap_.swift +47 -0
  64. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift +47 -0
  65. package/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___.swift +67 -0
  66. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +1 -1
  67. package/nitrogen/generated/ios/swift/Func_void_std__string_std__string.swift +47 -0
  68. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +1 -1
  69. package/nitrogen/generated/ios/swift/GenerationStats.swift +14 -3
  70. package/nitrogen/generated/ios/swift/HybridLLMSpec.swift +3 -2
  71. package/nitrogen/generated/ios/swift/HybridLLMSpec_cxx.swift +38 -2
  72. package/nitrogen/generated/ios/swift/HybridModelManagerSpec.swift +1 -1
  73. package/nitrogen/generated/ios/swift/HybridModelManagerSpec_cxx.swift +1 -1
  74. package/nitrogen/generated/ios/swift/HybridSTTSpec.swift +66 -0
  75. package/nitrogen/generated/ios/swift/HybridSTTSpec_cxx.swift +286 -0
  76. package/nitrogen/generated/ios/swift/HybridTTSSpec.swift +63 -0
  77. package/nitrogen/generated/ios/swift/HybridTTSSpec_cxx.swift +229 -0
  78. package/nitrogen/generated/ios/swift/LLMLoadOptions.swift +44 -2
  79. package/nitrogen/generated/ios/swift/LLMMessage.swift +1 -1
  80. package/nitrogen/generated/ios/swift/STTLoadOptions.swift +66 -0
  81. package/nitrogen/generated/ios/swift/TTSGenerateOptions.swift +78 -0
  82. package/nitrogen/generated/ios/swift/TTSLoadOptions.swift +66 -0
  83. package/nitrogen/generated/ios/swift/ToolDefinition.swift +113 -0
  84. package/nitrogen/generated/ios/swift/ToolParameter.swift +69 -0
  85. package/nitrogen/generated/shared/c++/GenerationStats.hpp +7 -3
  86. package/nitrogen/generated/shared/c++/HybridLLMSpec.cpp +2 -1
  87. package/nitrogen/generated/shared/c++/HybridLLMSpec.hpp +3 -2
  88. package/nitrogen/generated/shared/c++/HybridModelManagerSpec.cpp +1 -1
  89. package/nitrogen/generated/shared/c++/HybridModelManagerSpec.hpp +1 -1
  90. package/nitrogen/generated/shared/c++/HybridSTTSpec.cpp +32 -0
  91. package/nitrogen/generated/shared/c++/HybridSTTSpec.hpp +78 -0
  92. package/nitrogen/generated/shared/c++/HybridTTSSpec.cpp +29 -0
  93. package/nitrogen/generated/shared/c++/HybridTTSSpec.hpp +78 -0
  94. package/nitrogen/generated/shared/c++/LLMLoadOptions.hpp +10 -3
  95. package/nitrogen/generated/shared/c++/LLMMessage.hpp +1 -1
  96. package/nitrogen/generated/shared/c++/STTLoadOptions.hpp +76 -0
  97. package/nitrogen/generated/shared/c++/TTSGenerateOptions.hpp +80 -0
  98. package/nitrogen/generated/shared/c++/TTSLoadOptions.hpp +76 -0
  99. package/nitrogen/generated/shared/c++/ToolDefinition.hpp +93 -0
  100. package/nitrogen/generated/shared/c++/ToolParameter.hpp +87 -0
  101. package/package.json +13 -8
  102. package/src/index.ts +40 -3
  103. package/src/llm.ts +90 -5
  104. package/src/models.ts +81 -1
  105. package/src/specs/LLM.nitro.ts +111 -7
  106. package/src/specs/STT.nitro.ts +35 -0
  107. package/src/specs/TTS.nitro.ts +30 -0
  108. package/src/stt.ts +67 -0
  109. package/src/tool-utils.ts +74 -0
  110. package/src/tts.ts +60 -0
@@ -0,0 +1,206 @@
1
+ import Foundation
2
+
3
+ struct ThinkingStateMachine {
4
+ enum Output {
5
+ case token(String)
6
+ case thinkingStart
7
+ case thinkingChunk(String)
8
+ case thinkingEnd(String)
9
+ }
10
+
11
+ private enum State {
12
+ case idle
13
+ case bufferingOpenTag(String)
14
+ case inThinking
15
+ case bufferingCloseTag(String)
16
+ }
17
+
18
+ private var state: State = .idle
19
+ private var thinkingContent: String = ""
20
+
21
+ private let openTag = "<think>"
22
+ private let closeTag = "</think>"
23
+
24
+ mutating func process(token: String) -> [Output] {
25
+ var outputs: [Output] = []
26
+ var remaining = token
27
+
28
+ while !remaining.isEmpty {
29
+ switch state {
30
+ case .idle:
31
+ outputs.append(contentsOf: processIdle(&remaining))
32
+
33
+ case .bufferingOpenTag(let buffer):
34
+ outputs.append(contentsOf: processBufferingOpenTag(buffer: buffer, remaining: &remaining))
35
+
36
+ case .inThinking:
37
+ outputs.append(contentsOf: processInThinking(&remaining))
38
+
39
+ case .bufferingCloseTag(let buffer):
40
+ outputs.append(contentsOf: processBufferingCloseTag(buffer: buffer, remaining: &remaining))
41
+ }
42
+ }
43
+
44
+ return outputs
45
+ }
46
+
47
+ mutating func flush() -> [Output] {
48
+ var outputs: [Output] = []
49
+
50
+ switch state {
51
+ case .bufferingOpenTag(let buffer):
52
+ if !buffer.isEmpty {
53
+ outputs.append(.token(buffer))
54
+ }
55
+ case .bufferingCloseTag(let buffer):
56
+ if !buffer.isEmpty {
57
+ outputs.append(.thinkingChunk(buffer))
58
+ }
59
+ outputs.append(.thinkingEnd(thinkingContent + buffer))
60
+ case .inThinking:
61
+ outputs.append(.thinkingEnd(thinkingContent))
62
+ case .idle:
63
+ break
64
+ }
65
+
66
+ state = .idle
67
+ thinkingContent = ""
68
+ return outputs
69
+ }
70
+
71
+ private mutating func processIdle(_ remaining: inout String) -> [Output] {
72
+ var outputs: [Output] = []
73
+
74
+ if let tagRange = remaining.range(of: openTag) {
75
+ let before = String(remaining[..<tagRange.lowerBound])
76
+ if !before.isEmpty {
77
+ outputs.append(.token(before))
78
+ }
79
+ outputs.append(.thinkingStart)
80
+ state = .inThinking
81
+ thinkingContent = ""
82
+ remaining = String(remaining[tagRange.upperBound...])
83
+ } else if let partialMatch = findPartialMatch(remaining, target: openTag) {
84
+ let before = String(remaining[..<partialMatch.range.lowerBound])
85
+ if !before.isEmpty {
86
+ outputs.append(.token(before))
87
+ }
88
+ state = .bufferingOpenTag(partialMatch.matched)
89
+ remaining = ""
90
+ } else {
91
+ outputs.append(.token(remaining))
92
+ remaining = ""
93
+ }
94
+
95
+ return outputs
96
+ }
97
+
98
+ private mutating func processBufferingOpenTag(buffer: String, remaining: inout String) -> [Output] {
99
+ var outputs: [Output] = []
100
+ let combined = buffer + remaining
101
+
102
+ if let tagRange = combined.range(of: openTag) {
103
+ let before = String(combined[..<tagRange.lowerBound])
104
+ if !before.isEmpty {
105
+ outputs.append(.token(before))
106
+ }
107
+ outputs.append(.thinkingStart)
108
+ state = .inThinking
109
+ thinkingContent = ""
110
+ remaining = String(combined[tagRange.upperBound...])
111
+ } else if openTag.hasPrefix(combined) {
112
+ state = .bufferingOpenTag(combined)
113
+ remaining = ""
114
+ } else if let partialMatch = findPartialMatch(combined, target: openTag) {
115
+ let before = String(combined[..<partialMatch.range.lowerBound])
116
+ if !before.isEmpty {
117
+ outputs.append(.token(before))
118
+ }
119
+ state = .bufferingOpenTag(partialMatch.matched)
120
+ remaining = ""
121
+ } else {
122
+ outputs.append(.token(combined))
123
+ state = .idle
124
+ remaining = ""
125
+ }
126
+
127
+ return outputs
128
+ }
129
+
130
+ private mutating func processInThinking(_ remaining: inout String) -> [Output] {
131
+ var outputs: [Output] = []
132
+
133
+ if let tagRange = remaining.range(of: closeTag) {
134
+ let before = String(remaining[..<tagRange.lowerBound])
135
+ if !before.isEmpty {
136
+ thinkingContent += before
137
+ outputs.append(.thinkingChunk(before))
138
+ }
139
+ outputs.append(.thinkingEnd(thinkingContent))
140
+ state = .idle
141
+ thinkingContent = ""
142
+ remaining = String(remaining[tagRange.upperBound...])
143
+ } else if let partialMatch = findPartialMatch(remaining, target: closeTag) {
144
+ let before = String(remaining[..<partialMatch.range.lowerBound])
145
+ if !before.isEmpty {
146
+ thinkingContent += before
147
+ outputs.append(.thinkingChunk(before))
148
+ }
149
+ state = .bufferingCloseTag(partialMatch.matched)
150
+ remaining = ""
151
+ } else {
152
+ thinkingContent += remaining
153
+ outputs.append(.thinkingChunk(remaining))
154
+ remaining = ""
155
+ }
156
+
157
+ return outputs
158
+ }
159
+
160
+ private mutating func processBufferingCloseTag(buffer: String, remaining: inout String) -> [Output] {
161
+ var outputs: [Output] = []
162
+ let combined = buffer + remaining
163
+
164
+ if let tagRange = combined.range(of: closeTag) {
165
+ let before = String(combined[..<tagRange.lowerBound])
166
+ if !before.isEmpty {
167
+ thinkingContent += before
168
+ outputs.append(.thinkingChunk(before))
169
+ }
170
+ outputs.append(.thinkingEnd(thinkingContent))
171
+ state = .idle
172
+ thinkingContent = ""
173
+ remaining = String(combined[tagRange.upperBound...])
174
+ } else if closeTag.hasPrefix(combined) {
175
+ state = .bufferingCloseTag(combined)
176
+ remaining = ""
177
+ } else if let partialMatch = findPartialMatch(combined, target: closeTag) {
178
+ let before = String(combined[..<partialMatch.range.lowerBound])
179
+ if !before.isEmpty {
180
+ thinkingContent += before
181
+ outputs.append(.thinkingChunk(before))
182
+ }
183
+ state = .bufferingCloseTag(partialMatch.matched)
184
+ remaining = ""
185
+ } else {
186
+ thinkingContent += combined
187
+ outputs.append(.thinkingChunk(combined))
188
+ state = .inThinking
189
+ remaining = ""
190
+ }
191
+
192
+ return outputs
193
+ }
194
+
195
+ private func findPartialMatch(_ str: String, target: String) -> (range: Range<String.Index>, matched: String)? {
196
+ for i in stride(from: target.count - 1, through: 1, by: -1) {
197
+ let suffix = String(str.suffix(i))
198
+ let prefix = String(target.prefix(i))
199
+ if suffix == prefix {
200
+ let startIndex = str.index(str.endIndex, offsetBy: -i)
201
+ return (startIndex..<str.endIndex, suffix)
202
+ }
203
+ }
204
+ return nil
205
+ }
206
+ }
@@ -3,4 +3,7 @@
3
3
  export { LLM } from "./llm.js";
4
4
  export { ModelManager } from "./modelManager.js";
5
5
  export { MLXModel, MLXModels, ModelFamily, ModelProvider } from "./models.js";
6
+ export { createTool } from "./tool-utils.js";
7
+ export { TTS } from "./tts.js";
8
+ export { STT } from "./stt.js";
6
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["LLM","ModelManager","MLXModel","MLXModels","ModelFamily","ModelProvider"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,GAAG,QAAsB,UAAO;AACzC,SAASC,YAAY,QAAQ,mBAAgB;AAC7C,SACEC,QAAQ,EACRC,SAAS,EACTC,WAAW,EAEXC,aAAa,QAER,aAAU","ignoreList":[]}
1
+ {"version":3,"names":["LLM","ModelManager","MLXModel","MLXModels","ModelFamily","ModelProvider","createTool","TTS","STT"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SACEA,GAAG,QAKE,UAAO;AACd,SAASC,YAAY,QAAQ,mBAAgB;AAC7C,SACEC,QAAQ,EACRC,SAAS,EACTC,WAAW,EAEXC,aAAa,QAGR,aAAU;AAqBjB,SAASC,UAAU,QAAqC,iBAAc;AACtE,SAASC,GAAG,QAAQ,UAAO;AAM3B,SAASC,GAAG,QAAQ,UAAO","ignoreList":[]}
package/lib/module/llm.js CHANGED
@@ -50,13 +50,81 @@ export const LLM = {
50
50
  return getInstance().generate(prompt);
51
51
  },
52
52
  /**
53
- * Stream a response token by token.
53
+ * Stream a response token by token with optional tool calling support.
54
+ * Tools must be provided when loading the model via `load()` options.
55
+ * Tools are automatically executed when the model calls them.
54
56
  * @param prompt - The input text to generate a response for
55
57
  * @param onToken - Callback invoked for each generated token
58
+ * @param onToolCall - Optional callback invoked when a tool is called.
59
+ * Receives the current tool call and an accumulated array of all tool calls so far.
56
60
  * @returns The complete generated text
57
61
  */
58
- stream(prompt, onToken) {
59
- return getInstance().stream(prompt, onToken);
62
+ stream(prompt, onToken, onToolCall) {
63
+ const accumulatedToolCalls = [];
64
+ return getInstance().stream(prompt, onToken, (name, argsJson) => {
65
+ if (onToolCall) {
66
+ try {
67
+ const args = JSON.parse(argsJson);
68
+ const toolCall = {
69
+ name,
70
+ arguments: args
71
+ };
72
+ accumulatedToolCalls.push(toolCall);
73
+ onToolCall({
74
+ toolCall,
75
+ allToolCalls: [...accumulatedToolCalls]
76
+ });
77
+ } catch {
78
+ const toolCall = {
79
+ name,
80
+ arguments: {}
81
+ };
82
+ accumulatedToolCalls.push(toolCall);
83
+ onToolCall({
84
+ toolCall,
85
+ allToolCalls: [...accumulatedToolCalls]
86
+ });
87
+ }
88
+ }
89
+ });
90
+ },
91
+ /**
92
+ * Stream with typed events for thinking blocks and tool calls.
93
+ * Provides granular lifecycle events for UI updates.
94
+ *
95
+ * @param prompt - The input text
96
+ * @param onEvent - Callback receiving typed StreamEvent objects
97
+ * @returns Promise resolving to final content string (thinking content stripped)
98
+ *
99
+ * @example
100
+ * ```ts
101
+ * await LLM.streamWithEvents(prompt, (event) => {
102
+ * switch (event.type) {
103
+ * case 'token':
104
+ * appendToContent(event.token)
105
+ * break
106
+ * case 'thinking_start':
107
+ * showThinkingIndicator()
108
+ * break
109
+ * case 'thinking_chunk':
110
+ * appendToThinking(event.chunk)
111
+ * break
112
+ * case 'tool_call_start':
113
+ * showToolCallCard(event.name, event.arguments)
114
+ * break
115
+ * }
116
+ * })
117
+ * ```
118
+ */
119
+ streamWithEvents(prompt, onEvent) {
120
+ return getInstance().streamWithEvents(prompt, eventJson => {
121
+ try {
122
+ const event = JSON.parse(eventJson);
123
+ onEvent(event);
124
+ } catch {
125
+ // Silently ignore malformed events
126
+ }
127
+ });
60
128
  },
61
129
  /**
62
130
  * Stop the current generation. Safe to call even if not generating.
@@ -73,7 +141,7 @@ export const LLM = {
73
141
  },
74
142
  /**
75
143
  * Get statistics from the last generation.
76
- * @returns Statistics including token count, tokens/sec, TTFT, and total time
144
+ * @returns Statistics including token count, tokens/sec (excluding tool execution), TTFT, total time, and tool execution time
77
145
  */
78
146
  getLastGenerationStats() {
79
147
  return getInstance().getLastGenerationStats();
@@ -1 +1 @@
1
- {"version":3,"names":["NitroModules","instance","getInstance","createHybridObject","LLM","load","modelId","options","generate","prompt","stream","onToken","stop","unload","getLastGenerationStats","getHistory","clearHistory","isLoaded","isGenerating","debug","value","systemPrompt"],"sourceRoot":"../../src","sources":["llm.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAGzD,IAAIC,QAAwB,GAAG,IAAI;AAOnC,SAASC,WAAWA,CAAA,EAAY;EAC9B,IAAI,CAACD,QAAQ,EAAE;IACbA,QAAQ,GAAGD,YAAY,CAACG,kBAAkB,CAAU,KAAK,CAAC;EAC5D;EACA,OAAOF,QAAQ;AACjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMG,GAAG,GAAG;EACjB;AACF;AACA;AACA;AACA;EACEC,IAAIA,CAACC,OAAe,EAAEC,OAAuB,EAAiB;IAC5D,OAAOL,WAAW,CAAC,CAAC,CAACG,IAAI,CAACC,OAAO,EAAEC,OAAO,CAAC;EAC7C,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEC,QAAQA,CAACC,MAAc,EAAmB;IACxC,OAAOP,WAAW,CAAC,CAAC,CAACM,QAAQ,CAACC,MAAM,CAAC;EACvC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEC,MAAMA,CAACD,MAAc,EAAEE,OAAgC,EAAmB;IACxE,OAAOT,WAAW,CAAC,CAAC,CAACQ,MAAM,CAACD,MAAM,EAAEE,OAAO,CAAC;EAC9C,CAAC;EAED;AACF;AACA;EACEC,IAAIA,CAAA,EAAS;IACXV,WAAW,CAAC,CAAC,CAACU,IAAI,CAAC,CAAC;EACtB,CAAC;EAED;AACF;AACA;AACA;EACEC,MAAMA,CAAA,EAAS;IACbX,WAAW,CAAC,CAAC,CAACW,MAAM,CAAC,CAAC;EACxB,CAAC;EAED;AACF;AACA;AACA;EACEC,sBAAsBA,CAAA,EAAoB;IACxC,OAAOZ,WAAW,CAAC,CAAC,CAACY,sBAAsB,CAAC,CAAC;EAC/C,CAAC;EAED;AACF;AACA;AACA;EACEC,UAAUA,CAAA,EAAc;IACtB,OAAOb,WAAW,CAAC,CAAC,CAACa,UAAU,CAAC,CAAC;EACnC,CAAC;EAED;AACF;AACA;EACEC,YAAYA,CAAA,EAAS;IACnBd,WAAW,CAAC,CAAC,CAACc,YAAY,CAAC,CAAC;EAC9B,CAAC;EAED;EACA,IAAIC,QAAQA,CAAA,EAAY;IACtB,OAAOf,WAAW,CAAC,CAAC,CAACe,QAAQ;EAC/B,CAAC;EAED;EACA,IAAIC,YAAYA,CAAA,EAAY;IAC1B,OAAOhB,WAAW,CAAC,CAAC,CAACgB,YAAY;EACnC,CAAC;EAED;EACA,IAAIZ,OAAOA,CAAA,EAAW;IACpB,OAAOJ,WAAW,CAAC,CAAC,CAACI,OAAO;EAC9B,CAAC;EAED;EACA,IAAIa,KAAKA,CAAA,EAAY;IACnB,OAAOjB,WAAW,CAAC,CAAC,CAACiB,KAAK;EAC5B,CAAC;EAED,IAAIA,KAAKA,CAACC,KAAc,EAAE;IACxBlB,WAAW,CAAC,CAAC,CAACiB,KAAK,GAAGC,KAAK;EAC7B,CAAC;EAED;AACF;AACA;AACA;AACA;EACE,IAAIC,YAAYA,CAAA,EAAW;IACzB,OAAOnB,WAAW,CAAC,CAAC,CAACmB,YAAY;EACnC,CAAC;EAED,IAAIA,YAAYA,CAACD,KAAa,EAAE;IAC9BlB,WAAW,CAAC,CAAC,CAACmB,YAAY,GAAGD,KAAK;EACpC;AACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["NitroModules","instance","getInstance","createHybridObject","LLM","load","modelId","options","generate","prompt","stream","onToken","onToolCall","accumulatedToolCalls","name","argsJson","args","JSON","parse","toolCall","arguments","push","allToolCalls","streamWithEvents","onEvent","eventJson","event","stop","unload","getLastGenerationStats","getHistory","clearHistory","isLoaded","isGenerating","debug","value","systemPrompt"],"sourceRoot":"../../src","sources":["llm.ts"],"mappings":"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","ignoreList":[]}
@@ -7,6 +7,8 @@ export let ModelFamily = /*#__PURE__*/function (ModelFamily) {
7
7
  ModelFamily["Phi"] = "Phi";
8
8
  ModelFamily["SmolLM"] = "SmolLM";
9
9
  ModelFamily["OpenELM"] = "OpenELM";
10
+ ModelFamily["PocketTTS"] = "PocketTTS";
11
+ ModelFamily["GLMASR"] = "GLMASR";
10
12
  return ModelFamily;
11
13
  }({});
12
14
  export let ModelProvider = /*#__PURE__*/function (ModelProvider) {
@@ -16,6 +18,7 @@ export let ModelProvider = /*#__PURE__*/function (ModelProvider) {
16
18
  ModelProvider["Microsoft"] = "Microsoft";
17
19
  ModelProvider["HuggingFace"] = "HuggingFace";
18
20
  ModelProvider["Apple"] = "Apple";
21
+ ModelProvider["Kyutai"] = "Kyutai";
19
22
  return ModelProvider;
20
23
  }({});
21
24
  export let MLXModel = /*#__PURE__*/function (MLXModel) {
@@ -54,6 +57,12 @@ export let MLXModel = /*#__PURE__*/function (MLXModel) {
54
57
  MLXModel["OpenELM_1_1B_8bit"] = "mlx-community/OpenELM-1_1B-8bit";
55
58
  MLXModel["OpenELM_3B_4bit"] = "mlx-community/OpenELM-3B-4bit";
56
59
  MLXModel["OpenELM_3B_8bit"] = "mlx-community/OpenELM-3B-8bit";
60
+ // PocketTTS (Kyutai) - 44.6M
61
+ MLXModel["PocketTTS"] = "mlx-community/pocket-tts";
62
+ MLXModel["PocketTTS_8bit"] = "mlx-community/pocket-tts-8bit";
63
+ MLXModel["PocketTTS_4bit"] = "mlx-community/pocket-tts-4bit";
64
+ // GLM-ASR (GLMASR) - Speech-to-Text
65
+ MLXModel["GLM_ASR_Nano_4bit"] = "mlx-community/GLM-ASR-Nano-2512-4bit";
57
66
  return MLXModel;
58
67
  }({});
59
68
  export const MLXModels = [{
@@ -63,7 +72,8 @@ export const MLXModels = [{
63
72
  parameters: '1B',
64
73
  quantization: '4bit',
65
74
  displayName: 'Llama 3.2 1B Instruct (4-bit)',
66
- downloadSize: 1407777762
75
+ downloadSize: 1407777762,
76
+ type: 'llm'
67
77
  }, {
68
78
  id: MLXModel.Llama_3_2_1B_Instruct_8bit,
69
79
  family: ModelFamily.Llama,
@@ -71,7 +81,8 @@ export const MLXModels = [{
71
81
  parameters: '1B',
72
82
  quantization: '8bit',
73
83
  displayName: 'Llama 3.2 1B Instruct (8-bit)',
74
- downloadSize: 1313157436
84
+ downloadSize: 1313157436,
85
+ type: 'llm'
75
86
  }, {
76
87
  id: MLXModel.Llama_3_2_3B_Instruct_4bit,
77
88
  family: ModelFamily.Llama,
@@ -79,7 +90,8 @@ export const MLXModels = [{
79
90
  parameters: '3B',
80
91
  quantization: '4bit',
81
92
  displayName: 'Llama 3.2 3B Instruct (4-bit)',
82
- downloadSize: 2019397474
93
+ downloadSize: 2019397474,
94
+ type: 'llm'
83
95
  }, {
84
96
  id: MLXModel.Llama_3_2_3B_Instruct_8bit,
85
97
  family: ModelFamily.Llama,
@@ -87,7 +99,8 @@ export const MLXModels = [{
87
99
  parameters: '3B',
88
100
  quantization: '8bit',
89
101
  displayName: 'Llama 3.2 3B Instruct (8-bit)',
90
- downloadSize: 3413784042
102
+ downloadSize: 3413784042,
103
+ type: 'llm'
91
104
  }, {
92
105
  id: MLXModel.Qwen2_5_0_5B_Instruct_4bit,
93
106
  family: ModelFamily.Qwen,
@@ -95,7 +108,8 @@ export const MLXModels = [{
95
108
  parameters: '0.5B',
96
109
  quantization: '4bit',
97
110
  displayName: 'Qwen 2.5 0.5B Instruct (4-bit)',
98
- downloadSize: 278064920
111
+ downloadSize: 278064920,
112
+ type: 'llm'
99
113
  }, {
100
114
  id: MLXModel.Qwen2_5_0_5B_Instruct_8bit,
101
115
  family: ModelFamily.Qwen,
@@ -103,7 +117,8 @@ export const MLXModels = [{
103
117
  parameters: '0.5B',
104
118
  quantization: '8bit',
105
119
  displayName: 'Qwen 2.5 0.5B Instruct (8-bit)',
106
- downloadSize: 525045902
120
+ downloadSize: 525045902,
121
+ type: 'llm'
107
122
  }, {
108
123
  id: MLXModel.Qwen2_5_1_5B_Instruct_4bit,
109
124
  family: ModelFamily.Qwen,
@@ -111,7 +126,8 @@ export const MLXModels = [{
111
126
  parameters: '1.5B',
112
127
  quantization: '4bit',
113
128
  displayName: 'Qwen 2.5 1.5B Instruct (4-bit)',
114
- downloadSize: 868628559
129
+ downloadSize: 868628559,
130
+ type: 'llm'
115
131
  }, {
116
132
  id: MLXModel.Qwen2_5_1_5B_Instruct_8bit,
117
133
  family: ModelFamily.Qwen,
@@ -119,7 +135,8 @@ export const MLXModels = [{
119
135
  parameters: '1.5B',
120
136
  quantization: '8bit',
121
137
  displayName: 'Qwen 2.5 1.5B Instruct (8-bit)',
122
- downloadSize: 1640414038
138
+ downloadSize: 1640414038,
139
+ type: 'llm'
123
140
  }, {
124
141
  id: MLXModel.Qwen2_5_3B_Instruct_4bit,
125
142
  family: ModelFamily.Qwen,
@@ -127,7 +144,8 @@ export const MLXModels = [{
127
144
  parameters: '3B',
128
145
  quantization: '4bit',
129
146
  displayName: 'Qwen 2.5 3B Instruct (4-bit)',
130
- downloadSize: 1736293090
147
+ downloadSize: 1736293090,
148
+ type: 'llm'
131
149
  }, {
132
150
  id: MLXModel.Qwen2_5_3B_Instruct_8bit,
133
151
  family: ModelFamily.Qwen,
@@ -135,7 +153,8 @@ export const MLXModels = [{
135
153
  parameters: '3B',
136
154
  quantization: '8bit',
137
155
  displayName: 'Qwen 2.5 3B Instruct (8-bit)',
138
- downloadSize: 3279142142
156
+ downloadSize: 3279142142,
157
+ type: 'llm'
139
158
  }, {
140
159
  id: MLXModel.Qwen3_1_7B_4bit,
141
160
  family: ModelFamily.Qwen,
@@ -143,7 +162,8 @@ export const MLXModels = [{
143
162
  parameters: '1.7B',
144
163
  quantization: '4bit',
145
164
  displayName: 'Qwen 3 1.7B (4-bit)',
146
- downloadSize: 979502864
165
+ downloadSize: 979502864,
166
+ type: 'llm'
147
167
  }, {
148
168
  id: MLXModel.Qwen3_1_7B_8bit,
149
169
  family: ModelFamily.Qwen,
@@ -151,7 +171,8 @@ export const MLXModels = [{
151
171
  parameters: '1.7B',
152
172
  quantization: '8bit',
153
173
  displayName: 'Qwen 3 1.7B (8-bit)',
154
- downloadSize: 1839729195
174
+ downloadSize: 1839729195,
175
+ type: 'llm'
155
176
  }, {
156
177
  id: MLXModel.Gemma_3_1B_IT_4bit,
157
178
  family: ModelFamily.Gemma,
@@ -159,7 +180,8 @@ export const MLXModels = [{
159
180
  parameters: '1B',
160
181
  quantization: '4bit',
161
182
  displayName: 'Gemma 3 1B IT (4-bit)',
162
- downloadSize: 770650946
183
+ downloadSize: 770650946,
184
+ type: 'llm'
163
185
  }, {
164
186
  id: MLXModel.Gemma_3_1B_IT_8bit,
165
187
  family: ModelFamily.Gemma,
@@ -167,7 +189,8 @@ export const MLXModels = [{
167
189
  parameters: '1B',
168
190
  quantization: '8bit',
169
191
  displayName: 'Gemma 3 1B IT (8-bit)',
170
- downloadSize: 1421522471
192
+ downloadSize: 1421522471,
193
+ type: 'llm'
171
194
  }, {
172
195
  id: MLXModel.Phi_3_5_Mini_Instruct_4bit,
173
196
  family: ModelFamily.Phi,
@@ -175,7 +198,8 @@ export const MLXModels = [{
175
198
  parameters: '3.8B',
176
199
  quantization: '4bit',
177
200
  displayName: 'Phi 3.5 Mini Instruct (4-bit)',
178
- downloadSize: 2150195856
201
+ downloadSize: 2150195856,
202
+ type: 'llm'
179
203
  }, {
180
204
  id: MLXModel.Phi_3_5_Mini_Instruct_8bit,
181
205
  family: ModelFamily.Phi,
@@ -183,7 +207,8 @@ export const MLXModels = [{
183
207
  parameters: '3.8B',
184
208
  quantization: '8bit',
185
209
  displayName: 'Phi 3.5 Mini Instruct (8-bit)',
186
- downloadSize: 4060636056
210
+ downloadSize: 4060636056,
211
+ type: 'llm'
187
212
  }, {
188
213
  id: MLXModel.Phi_4_Mini_Instruct_4bit,
189
214
  family: ModelFamily.Phi,
@@ -191,7 +216,8 @@ export const MLXModels = [{
191
216
  parameters: '3.8B',
192
217
  quantization: '4bit',
193
218
  displayName: 'Phi 4 Mini Instruct (4-bit)',
194
- downloadSize: 2173624891
219
+ downloadSize: 2173624891,
220
+ type: 'llm'
195
221
  }, {
196
222
  id: MLXModel.Phi_4_Mini_Instruct_8bit,
197
223
  family: ModelFamily.Phi,
@@ -199,7 +225,8 @@ export const MLXModels = [{
199
225
  parameters: '3.8B',
200
226
  quantization: '8bit',
201
227
  displayName: 'Phi 4 Mini Instruct (8-bit)',
202
- downloadSize: 4091536167
228
+ downloadSize: 4091536167,
229
+ type: 'llm'
203
230
  }, {
204
231
  id: MLXModel.SmolLM_1_7B_Instruct_4bit,
205
232
  family: ModelFamily.SmolLM,
@@ -207,7 +234,8 @@ export const MLXModels = [{
207
234
  parameters: '1.7B',
208
235
  quantization: '4bit',
209
236
  displayName: 'SmolLM 1.7B Instruct (4-bit)',
210
- downloadSize: 962855374
237
+ downloadSize: 962855374,
238
+ type: 'llm'
211
239
  }, {
212
240
  id: MLXModel.SmolLM_1_7B_Instruct_8bit,
213
241
  family: ModelFamily.SmolLM,
@@ -215,7 +243,8 @@ export const MLXModels = [{
215
243
  parameters: '1.7B',
216
244
  quantization: '8bit',
217
245
  displayName: 'SmolLM 1.7B Instruct (8-bit)',
218
- downloadSize: 1818493993
246
+ downloadSize: 1818493993,
247
+ type: 'llm'
219
248
  }, {
220
249
  id: MLXModel.SmolLM2_1_7B_Instruct_4bit,
221
250
  family: ModelFamily.SmolLM,
@@ -223,7 +252,8 @@ export const MLXModels = [{
223
252
  parameters: '1.7B',
224
253
  quantization: '4bit',
225
254
  displayName: 'SmolLM2 1.7B Instruct (4-bit)',
226
- downloadSize: 980000000
255
+ downloadSize: 980000000,
256
+ type: 'llm'
227
257
  }, {
228
258
  id: MLXModel.SmolLM2_1_7B_Instruct_8bit,
229
259
  family: ModelFamily.SmolLM,
@@ -231,7 +261,8 @@ export const MLXModels = [{
231
261
  parameters: '1.7B',
232
262
  quantization: '8bit',
233
263
  displayName: 'SmolLM2 1.7B Instruct (8-bit)',
234
- downloadSize: 1850000000
264
+ downloadSize: 1850000000,
265
+ type: 'llm'
235
266
  }, {
236
267
  id: MLXModel.OpenELM_1_1B_4bit,
237
268
  family: ModelFamily.OpenELM,
@@ -239,7 +270,8 @@ export const MLXModels = [{
239
270
  parameters: '1.1B',
240
271
  quantization: '4bit',
241
272
  displayName: 'OpenELM 1.1B (4-bit)',
242
- downloadSize: 608162655
273
+ downloadSize: 608162655,
274
+ type: 'llm'
243
275
  }, {
244
276
  id: MLXModel.OpenELM_1_1B_8bit,
245
277
  family: ModelFamily.OpenELM,
@@ -247,7 +279,8 @@ export const MLXModels = [{
247
279
  parameters: '1.1B',
248
280
  quantization: '8bit',
249
281
  displayName: 'OpenELM 1.1B (8-bit)',
250
- downloadSize: 1148048397
282
+ downloadSize: 1148048397,
283
+ type: 'llm'
251
284
  }, {
252
285
  id: MLXModel.OpenELM_3B_4bit,
253
286
  family: ModelFamily.OpenELM,
@@ -255,7 +288,8 @@ export const MLXModels = [{
255
288
  parameters: '3B',
256
289
  quantization: '4bit',
257
290
  displayName: 'OpenELM 3B (4-bit)',
258
- downloadSize: 1650000000
291
+ downloadSize: 1650000000,
292
+ type: 'llm'
259
293
  }, {
260
294
  id: MLXModel.OpenELM_3B_8bit,
261
295
  family: ModelFamily.OpenELM,
@@ -263,6 +297,43 @@ export const MLXModels = [{
263
297
  parameters: '3B',
264
298
  quantization: '8bit',
265
299
  displayName: 'OpenELM 3B (8-bit)',
266
- downloadSize: 3100000000
300
+ downloadSize: 3100000000,
301
+ type: 'llm'
302
+ }, {
303
+ id: MLXModel.PocketTTS,
304
+ family: ModelFamily.PocketTTS,
305
+ provider: ModelProvider.Kyutai,
306
+ parameters: '44.6M',
307
+ quantization: 'bf16',
308
+ displayName: 'PocketTTS (bf16)',
309
+ downloadSize: 180000000,
310
+ type: 'tts'
311
+ }, {
312
+ id: MLXModel.PocketTTS_8bit,
313
+ family: ModelFamily.PocketTTS,
314
+ provider: ModelProvider.Kyutai,
315
+ parameters: '44.6M',
316
+ quantization: '8bit',
317
+ displayName: 'PocketTTS (8-bit)',
318
+ downloadSize: 140000000,
319
+ type: 'tts'
320
+ }, {
321
+ id: MLXModel.PocketTTS_4bit,
322
+ family: ModelFamily.PocketTTS,
323
+ provider: ModelProvider.Kyutai,
324
+ parameters: '44.6M',
325
+ quantization: '4bit',
326
+ displayName: 'PocketTTS (4-bit)',
327
+ downloadSize: 80000000,
328
+ type: 'tts'
329
+ }, {
330
+ id: MLXModel.GLM_ASR_Nano_4bit,
331
+ family: ModelFamily.GLMASR,
332
+ provider: ModelProvider.Alibaba,
333
+ parameters: '1B',
334
+ quantization: '4bit',
335
+ displayName: 'GLM-ASR Nano (4-bit)',
336
+ downloadSize: 600000000,
337
+ type: 'stt'
267
338
  }];
268
339
  //# sourceMappingURL=models.js.map