@inferrlm/react-native-mlx 0.4.2-alpha.9 → 0.4.8

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.
@@ -24,13 +24,19 @@ Pod::Spec.new do |s|
24
24
 
25
25
  spm_dependency(s,
26
26
  url: "https://github.com/ml-explore/mlx-swift-lm.git",
27
- requirement: {kind: "branch", branch: "main"},
27
+ requirement: {kind: "upToNextMinorVersion", minimumVersion: "3.31.3"},
28
28
  products: ["MLXLLM", "MLXLMCommon"]
29
29
  )
30
30
 
31
+ spm_dependency(s,
32
+ url: "https://github.com/huggingface/swift-transformers",
33
+ requirement: {kind: "upToNextMinorVersion", minimumVersion: "1.2.0"},
34
+ products: ["Tokenizers"]
35
+ )
36
+
31
37
  spm_dependency(s,
32
38
  url: "https://github.com/Blaizzy/mlx-audio-swift.git",
33
- requirement: {kind: "branch", branch: "main"},
39
+ requirement: {kind: "revision", revision: "856e04afb3c6eb931d92bb0d6ae7bbfbdfa89b15"},
34
40
  products: ["MLXAudioTTS", "MLXAudioSTT", "MLXAudioCore"]
35
41
  )
36
42
 
package/app.plugin.js ADDED
@@ -0,0 +1,63 @@
1
+ const { withPodfile } = require('@expo/config-plugins');
2
+
3
+ function disableDeterministicPodUuids(contents) {
4
+ const line = "install! 'cocoapods', :deterministic_uuids => false";
5
+
6
+ if (contents.includes(line)) {
7
+ return contents;
8
+ }
9
+
10
+ const anchor = 'prepare_react_native_project!';
11
+
12
+ if (!contents.includes(anchor)) {
13
+ return contents;
14
+ }
15
+
16
+ return contents.replace(anchor, `${line}\n\n${anchor}`);
17
+ }
18
+
19
+ function injectSpmRootFix(contents) {
20
+ const block = [
21
+ 'if defined?(::SPMManager) && ::SPMManager.instance_methods.include?(:add_spm_to_target)',
22
+ ' ::SPMManager.class_eval do',
23
+ ' unless method_defined?(:inferrlm_add_spm_to_target)',
24
+ ' alias_method :inferrlm_add_spm_to_target, :add_spm_to_target',
25
+ '',
26
+ ' def add_spm_to_target(project, target, url, requirement, products)',
27
+ ' root = project.root_object',
28
+ ' if root && project.objects_by_uuid[root.uuid] != root',
29
+ ' root.add_referrer(project)',
30
+ ' end',
31
+ '',
32
+ ' inferrlm_add_spm_to_target(project, target, url, requirement, products)',
33
+ ' end',
34
+ ' end',
35
+ ' end',
36
+ 'end',
37
+ ].join('\n');
38
+
39
+ if (contents.includes('::SPMManager.class_eval do')) {
40
+ return contents;
41
+ }
42
+
43
+ const anchor = 'prepare_react_native_project!';
44
+
45
+ if (!contents.includes(anchor)) {
46
+ return contents;
47
+ }
48
+
49
+ return contents.replace(anchor, `${block}\n\n${anchor}`);
50
+ }
51
+
52
+ module.exports = function withMlxIosPods(config) {
53
+ return withPodfile(config, (modConfig) => {
54
+ modConfig.modResults.contents = disableDeterministicPodUuids(modConfig.modResults.contents);
55
+ modConfig.modResults.contents = injectSpmRootFix(modConfig.modResults.contents);
56
+ return modConfig;
57
+ });
58
+ };
59
+
60
+ module.exports._helpers = {
61
+ disableDeterministicPodUuids,
62
+ injectSpmRootFix,
63
+ };
@@ -1,9 +1,149 @@
1
1
  import Foundation
2
2
  import NitroModules
3
+ import Tokenizers
3
4
  internal import MLX
4
5
  internal import MLXLLM
5
6
  internal import MLXLMCommon
6
- internal import Tokenizers
7
+
8
+ private typealias ToolSpec = [String: Any]
9
+
10
+ private func isJANGModel(at dir: URL) -> Bool {
11
+ FileManager.default.fileExists(atPath: dir.appendingPathComponent("jang_config.json").path)
12
+ }
13
+
14
+ private protocol ChatTemplateConfigurableTokenizer: MLXLMCommon.Tokenizer {
15
+ func applyChatTemplate(
16
+ messages: [[String: any Sendable]],
17
+ chatTemplate: Tokenizers.ChatTemplateArgument?,
18
+ addGenerationPrompt: Bool,
19
+ truncation: Bool,
20
+ maxLength: Int?,
21
+ tools: [[String: any Sendable]]?,
22
+ additionalContext: [String: any Sendable]?
23
+ ) throws -> [Int]
24
+ }
25
+
26
+ private extension MLXLMCommon.Tokenizer {
27
+ func applyChatTemplate(
28
+ messages: [[String: any Sendable]],
29
+ chatTemplate: Tokenizers.ChatTemplateArgument?,
30
+ addGenerationPrompt: Bool,
31
+ truncation: Bool,
32
+ maxLength: Int?,
33
+ tools: [[String: any Sendable]]?,
34
+ additionalContext: [String: any Sendable]?
35
+ ) throws -> [Int] {
36
+ guard let tokenizer = self as? any ChatTemplateConfigurableTokenizer else {
37
+ throw MLXLMCommon.TokenizerError.missingChatTemplate
38
+ }
39
+
40
+ return try tokenizer.applyChatTemplate(
41
+ messages: messages,
42
+ chatTemplate: chatTemplate,
43
+ addGenerationPrompt: addGenerationPrompt,
44
+ truncation: truncation,
45
+ maxLength: maxLength,
46
+ tools: tools,
47
+ additionalContext: additionalContext
48
+ )
49
+ }
50
+ }
51
+
52
+ private struct TransformersTokenizerBridge: ChatTemplateConfigurableTokenizer {
53
+ private let upstream: any Tokenizers.Tokenizer
54
+
55
+ init(_ upstream: any Tokenizers.Tokenizer) {
56
+ self.upstream = upstream
57
+ }
58
+
59
+ func encode(text: String, addSpecialTokens: Bool) -> [Int] {
60
+ upstream.encode(text: text, addSpecialTokens: addSpecialTokens)
61
+ }
62
+
63
+ func decode(tokenIds: [Int], skipSpecialTokens: Bool) -> String {
64
+ upstream.decode(tokens: tokenIds, skipSpecialTokens: skipSpecialTokens)
65
+ }
66
+
67
+ func convertTokenToId(_ token: String) -> Int? {
68
+ upstream.convertTokenToId(token)
69
+ }
70
+
71
+ func convertIdToToken(_ id: Int) -> String? {
72
+ upstream.convertIdToToken(id)
73
+ }
74
+
75
+ var bosToken: String? { upstream.bosToken }
76
+ var eosToken: String? { upstream.eosToken }
77
+ var unknownToken: String? { upstream.unknownToken }
78
+
79
+ func applyChatTemplate(
80
+ messages: [[String: any Sendable]],
81
+ tools: [[String: any Sendable]]?,
82
+ additionalContext: [String: any Sendable]?
83
+ ) throws -> [Int] {
84
+ do {
85
+ return try upstream.applyChatTemplate(
86
+ messages: messages,
87
+ tools: tools,
88
+ additionalContext: additionalContext
89
+ )
90
+ } catch Tokenizers.TokenizerError.missingChatTemplate {
91
+ throw MLXLMCommon.TokenizerError.missingChatTemplate
92
+ }
93
+ }
94
+
95
+ func applyChatTemplate(
96
+ messages: [[String: any Sendable]],
97
+ chatTemplate: Tokenizers.ChatTemplateArgument?,
98
+ addGenerationPrompt: Bool,
99
+ truncation: Bool,
100
+ maxLength: Int?,
101
+ tools: [[String: any Sendable]]?,
102
+ additionalContext: [String: any Sendable]?
103
+ ) throws -> [Int] {
104
+ do {
105
+ return try upstream.applyChatTemplate(
106
+ messages: messages,
107
+ chatTemplate: chatTemplate,
108
+ addGenerationPrompt: addGenerationPrompt,
109
+ truncation: truncation,
110
+ maxLength: maxLength,
111
+ tools: tools,
112
+ additionalContext: additionalContext
113
+ )
114
+ } catch Tokenizers.TokenizerError.missingChatTemplate {
115
+ throw MLXLMCommon.TokenizerError.missingChatTemplate
116
+ }
117
+ }
118
+ }
119
+
120
+ private struct TransformersTokenizerLoader: MLXLMCommon.TokenizerLoader {
121
+ func load(from directory: URL) async throws -> any MLXLMCommon.Tokenizer {
122
+ let upstream = try await Tokenizers.AutoTokenizer.from(modelFolder: directory)
123
+ return TransformersTokenizerBridge(upstream)
124
+ }
125
+ }
126
+
127
+ @MainActor
128
+ private final class LoadProgress {
129
+ private let callback: ((Double) -> Void)?
130
+ private(set) var value: Double = 0
131
+
132
+ init(callback: ((Double) -> Void)?) {
133
+ self.callback = callback
134
+ }
135
+
136
+ func set(_ nextValue: Double) {
137
+ let clamped = min(1.0, max(value, nextValue))
138
+ guard clamped > value else { return }
139
+ value = clamped
140
+ callback?(clamped)
141
+ }
142
+
143
+ func tick(toward upperBound: Double, step: Double) {
144
+ set(min(upperBound, value + step))
145
+ }
146
+ }
7
147
 
8
148
  class HybridLLM: HybridLLMSpec {
9
149
  private var session: ChatSession?
@@ -16,7 +156,6 @@ class HybridLLM: HybridLLMSpec {
16
156
  totalTime: 0,
17
157
  toolExecutionTime: 0
18
158
  )
19
- private var modelFactory: ModelFactory = LLMModelFactory.shared
20
159
  private var manageHistory: Bool = false
21
160
  private var messageHistory: [LLMMessage] = []
22
161
  private var loadTask: Task<Void, Error>?
@@ -29,9 +168,11 @@ class HybridLLM: HybridLLMSpec {
29
168
  var modelId: String = ""
30
169
  var debug: Bool = false
31
170
  var systemPrompt: String = "You are a helpful assistant."
32
- var maxTokens: Int = 2048
33
- var temperature: Float = 0.7
171
+ var maxTokens: Double = 2048
172
+ var temperature: Double = 0.7
173
+ var enableThinking: Bool = true
34
174
  var additionalContext: LLMMessage = LLMMessage()
175
+ private var lastInputContainedThinkTag = false
35
176
 
36
177
  private func log(_ message: String) {
37
178
  if debug {
@@ -140,6 +281,9 @@ class HybridLLM: HybridLLMSpec {
140
281
 
141
282
  return Promise.async { [self] in
142
283
  let task = Task { @MainActor in
284
+ let progress = LoadProgress(callback: options?.onProgress)
285
+ progress.set(0.02)
286
+
143
287
  Memory.cacheLimit = 2000000
144
288
 
145
289
  self.currentTask?.cancel()
@@ -149,6 +293,7 @@ class HybridLLM: HybridLLMSpec {
149
293
  self.tools = []
150
294
  self.toolSchemas = []
151
295
  Memory.clearCache()
296
+ progress.set(0.12)
152
297
 
153
298
  let memoryAfterCleanup = self.getMemoryUsage()
154
299
  let gpuAfterCleanup = self.getGPUMemoryUsage()
@@ -156,13 +301,30 @@ class HybridLLM: HybridLLMSpec {
156
301
 
157
302
  let modelDir = await ModelDownloader.shared.getModelDirectory(modelId: modelId)
158
303
  log("Loading from directory: \(modelDir.path)")
304
+ progress.set(0.18)
159
305
 
160
- let config = ModelConfiguration(directory: modelDir)
161
- let loadedContainer = try await self.modelFactory.loadContainer(
162
- configuration: config
163
- ) { progress in
164
- options?.onProgress?(progress.fractionCompleted)
306
+ if isJANGModel(at: modelDir) {
307
+ throw LLMError.unsupportedModel("JANG model format is not supported by the current MLX dependency set")
308
+ }
309
+
310
+ var loadingPulse: Task<Void, Never>?
311
+ if options?.onProgress != nil {
312
+ loadingPulse = Task { @MainActor in
313
+ while !Task.isCancelled {
314
+ try? await Task.sleep(nanoseconds: 250_000_000)
315
+ progress.tick(toward: 0.78, step: 0.04)
316
+ }
317
+ }
165
318
  }
319
+ defer { loadingPulse?.cancel() }
320
+
321
+ progress.set(0.22)
322
+
323
+ let loadedContainer = try await LLMModelFactory.shared.loadContainer(
324
+ from: modelDir,
325
+ using: TransformersTokenizerLoader()
326
+ )
327
+ progress.set(0.86)
166
328
 
167
329
  try Task.checkCancellation()
168
330
 
@@ -192,6 +354,9 @@ class HybridLLM: HybridLLMSpec {
192
354
  let updatedExtra = await loadedContainer.configuration.extraEOSTokens
193
355
  log("EOS patched - ids: \(updated), extra: \(updatedExtra)")
194
356
  }
357
+ progress.set(0.92)
358
+
359
+ progress.set(0.95)
195
360
 
196
361
  let memoryAfterContainer = self.getMemoryUsage()
197
362
  let gpuAfterContainer = self.getGPUMemoryUsage()
@@ -203,10 +368,14 @@ class HybridLLM: HybridLLMSpec {
203
368
  log("Loaded \(self.tools.count) tools: \(self.tools.map { $0.name })")
204
369
  }
205
370
 
206
- let additionalContextDict: [String: Any]? = if let messages = options?.additionalContext {
207
- ["messages": messages.map { ["role": $0.role, "content": $0.content] }]
371
+ let additionalContextDict: [String: any Sendable]?
372
+ if let messages = options?.additionalContext {
373
+ let contextMessages: [[String: String]] = messages.map {
374
+ ["role": $0.role, "content": $0.content]
375
+ }
376
+ additionalContextDict = ["messages": contextMessages]
208
377
  } else {
209
- nil
378
+ additionalContextDict = nil
210
379
  }
211
380
 
212
381
  self.container = loadedContainer
@@ -219,6 +388,8 @@ class HybridLLM: HybridLLMSpec {
219
388
  if self.manageHistory {
220
389
  log("History management enabled with \(self.messageHistory.count) initial messages")
221
390
  }
391
+
392
+ progress.set(1.0)
222
393
  }
223
394
 
224
395
  self.loadTask = task
@@ -454,7 +625,8 @@ class HybridLLM: HybridLLMSpec {
454
625
  chat: [Chat.Message]
455
626
  ) async throws -> LMInput {
456
627
  let tools = !self.toolSchemas.isEmpty ? self.toolSchemas : nil
457
- let additionalCtx: [String: any Sendable] = ["enable_thinking": true]
628
+ let thinkingEnabled = self.enableThinking
629
+ let additionalCtx: [String: any Sendable] = ["enable_thinking": thinkingEnabled]
458
630
 
459
631
  let messages: [[String: any Sendable]] = chat.map {
460
632
  ["role": $0.role.rawValue, "content": $0.content]
@@ -464,13 +636,13 @@ class HybridLLM: HybridLLMSpec {
464
636
  do {
465
637
  let result = try context.tokenizer.applyChatTemplate(
466
638
  messages: messages,
467
- addGenerationPrompt: true,
468
639
  tools: tools,
469
640
  additionalContext: additionalCtx
470
641
  )
471
642
  self.log("template_applied token_count=\(result.count)")
472
- let decoded = context.tokenizer.decode(tokens: Array(result.suffix(60)))
643
+ let decoded = context.tokenizer.decode(tokenIds: Array(result.suffix(60)))
473
644
  self.log("input_tail_decoded: \(decoded)")
645
+ self.lastInputContainedThinkTag = decoded.contains("<think>")
474
646
  return result
475
647
  } catch {
476
648
  self.log("template_error: \(error), retrying with fallback")
@@ -484,8 +656,9 @@ class HybridLLM: HybridLLMSpec {
484
656
  additionalContext: additionalCtx
485
657
  )
486
658
  self.log("fallback_template_applied token_count=\(result.count)")
487
- let decoded = context.tokenizer.decode(tokens: Array(result.suffix(60)))
659
+ let decoded = context.tokenizer.decode(tokenIds: Array(result.suffix(60)))
488
660
  self.log("fallback_input_tail_decoded: \(decoded)")
661
+ self.lastInputContainedThinkTag = decoded.contains("<think>")
489
662
  return result
490
663
  }
491
664
  }
@@ -536,8 +709,21 @@ class HybridLLM: HybridLLMSpec {
536
709
  let lmInput = try await prepareInput(container: container, chat: chat)
537
710
  log("perform_gen_events input_prepared messages=\(chat.count) maxTokens=\(self.maxTokens) temperature=\(self.temperature)")
538
711
 
712
+ if self.lastInputContainedThinkTag {
713
+ let seed = thinkingMachine.process(token: "<think>")
714
+ for seedOutput in seed {
715
+ switch seedOutput {
716
+ case .thinkingStart:
717
+ log("thinking_seeded_events")
718
+ emitter.emitThinkingStart()
719
+ default:
720
+ break
721
+ }
722
+ }
723
+ }
724
+
539
725
  let stream = try await container.perform { context in
540
- let parameters = GenerateParameters(maxTokens: self.maxTokens, temperature: Float(self.temperature))
726
+ let parameters = GenerateParameters(maxTokens: Int(self.maxTokens), temperature: Float(self.temperature))
541
727
  return try MLXLMCommon.generate(
542
728
  input: lmInput,
543
729
  parameters: parameters,
@@ -725,8 +911,27 @@ class HybridLLM: HybridLLMSpec {
725
911
  let lmInput = try await prepareInput(container: container, chat: chat)
726
912
  log("perform_gen input_prepared messages=\(chat.count) maxTokens=\(self.maxTokens) temperature=\(self.temperature)")
727
913
 
914
+ /*
915
+ When the chat template injects <think> at the end of the prompt,
916
+ the model generates thinking content directly — the opening tag
917
+ is NOT part of the generated stream. Seed the state machine so
918
+ the TS layer receives <think> and sets isThinking = true.
919
+ */
920
+ if self.lastInputContainedThinkTag {
921
+ let seed = thinkingMachine.process(token: "<think>")
922
+ for seedOutput in seed {
923
+ switch seedOutput {
924
+ case .thinkingStart:
925
+ log("thinking_seeded")
926
+ onToken("<think>")
927
+ default:
928
+ break
929
+ }
930
+ }
931
+ }
932
+
728
933
  let stream = try await container.perform { context in
729
- let parameters = GenerateParameters(maxTokens: self.maxTokens, temperature: Float(self.temperature))
934
+ let parameters = GenerateParameters(maxTokens: Int(self.maxTokens), temperature: Float(self.temperature))
730
935
  return try MLXLMCommon.generate(
731
936
  input: lmInput,
732
937
  parameters: parameters,
@@ -3,4 +3,5 @@ import Foundation
3
3
  public enum LLMError: Error {
4
4
  case notLoaded
5
5
  case generationFailed(String)
6
+ case unsupportedModel(String)
6
7
  }
package/lib/module/llm.js CHANGED
@@ -200,6 +200,12 @@ export const LLM = {
200
200
  },
201
201
  set temperature(value) {
202
202
  getInstance().temperature = value;
203
+ },
204
+ get enableThinking() {
205
+ return getInstance().enableThinking;
206
+ },
207
+ set enableThinking(value) {
208
+ getInstance().enableThinking = value;
203
209
  }
204
210
  };
205
211
  //# sourceMappingURL=llm.js.map
@@ -1 +1 @@
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","maxTokens","temperature"],"sourceRoot":"../../src","sources":["llm.ts"],"mappings":"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","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","maxTokens","temperature","enableThinking"],"sourceRoot":"../../src","sources":["llm.ts"],"mappings":"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","ignoreList":[]}
@@ -127,5 +127,6 @@ export declare const LLM: {
127
127
  systemPrompt: string;
128
128
  maxTokens: number;
129
129
  temperature: number;
130
+ enableThinking: boolean;
130
131
  };
131
132
  //# sourceMappingURL=llm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/llm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAEd,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;AAIxD,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAA;IACrC,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,YAAY,CAAA;IACtB,YAAY,EAAE,YAAY,EAAE,CAAA;CAC7B,CAAA;AASD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,GAAG;IACd;;;;OAIG;kBACW,MAAM,WAAW,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;OAKG;qBACc,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzC;;;;;;;;;OASG;mBAEO,MAAM,WACL,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,eACnB,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAC5C,OAAO,CAAC,MAAM,CAAC;IAyBlB;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;6BACsB,MAAM,WAAW,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAWzE;;OAEG;YACK,IAAI;IAIZ;;;OAGG;cACO,IAAI;IAId;;;OAGG;8BACuB,eAAe;IAIzC;;;OAGG;kBACW,OAAO,EAAE;IAIvB;;OAEG;oBACa,IAAI;IAIpB,mEAAmE;uBACnD,OAAO;IAIvB,gDAAgD;2BAC5B,OAAO;IAI3B,oEAAoE;sBACrD,MAAM;IAIrB,sCAAsC;WACzB,OAAO;IAQpB;;;;OAIG;kBACiB,MAAM;eAQT,MAAM;iBAQJ,MAAM;CAO1B,CAAA"}
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/llm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAEd,WAAW,EACZ,MAAM,mBAAmB,CAAA;AAE1B,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;AAIxD,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAA;IACrC,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,YAAY,CAAA;IACtB,YAAY,EAAE,YAAY,EAAE,CAAA;CAC7B,CAAA;AASD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,GAAG;IACd;;;;OAIG;kBACW,MAAM,WAAW,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;OAKG;qBACc,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzC;;;;;;;;;OASG;mBAEO,MAAM,WACL,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,eACnB,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,GAC5C,OAAO,CAAC,MAAM,CAAC;IAyBlB;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;6BACsB,MAAM,WAAW,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAWzE;;OAEG;YACK,IAAI;IAIZ;;;OAGG;cACO,IAAI;IAId;;;OAGG;8BACuB,eAAe;IAIzC;;;OAGG;kBACW,OAAO,EAAE;IAIvB;;OAEG;oBACa,IAAI;IAIpB,mEAAmE;uBACnD,OAAO;IAIvB,gDAAgD;2BAC5B,OAAO;IAI3B,oEAAoE;sBACrD,MAAM;IAIrB,sCAAsC;WACzB,OAAO;IAQpB;;;;OAIG;kBACiB,MAAM;eAQT,MAAM;iBAQJ,MAAM;oBAQH,OAAO;CAO9B,CAAA"}
@@ -155,6 +155,8 @@ export interface LLM extends HybridObject<{
155
155
  maxTokens: number;
156
156
  /** Sampling temperature (0 = deterministic, higher = more random) */
157
157
  temperature: number;
158
+ /** Enable thinking mode for models that support it */
159
+ enableThinking: boolean;
158
160
  }
159
161
  /**
160
162
  * Supported parameter types for tool definitions.
@@ -1 +1 @@
1
- {"version":3,"file":"LLM.nitro.d.ts","sourceRoot":"","sources":["../../../../src/specs/LLM.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAEtE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,kBAAkB,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,gBAAgB,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,gBAAgB,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,iBAAiB,CAAA;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,qBAAqB,CAAA;IAC3B,EAAE,EAAE,MAAM,CAAA;CACX;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,qBAAqB,CAAA;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,kBAAkB,CAAA;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,gBAAgB,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,eAAe,CAAA;CACvB;AAED,MAAM,MAAM,WAAW,GACnB,oBAAoB,GACpB,UAAU,GACV,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,GAChB,kBAAkB,GAClB,sBAAsB,GACtB,sBAAsB,GACtB,mBAAmB,GACnB,kBAAkB,CAAA;AAEtB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,aAAa,EAAE,CAAA;IAC3B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAC3C;AAED;GACG;AACH,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,iDAAiD;IACjD,iBAAiB,CAAC,EAAE,UAAU,EAAE,CAAA;IAChC,sDAAsD;IACtD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,cAAc,EAAE,CAAA;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,GAAI,SAAQ,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,CAAC;IACzD;;;;OAIG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE9D;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAEzC;;;;;;;OAOG;IACH,MAAM,CACJ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAChC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,MAAM,CAAC,CAAA;IAElB,gBAAgB,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACnC,OAAO,CAAC,MAAM,CAAC,CAAA;IAElB;;OAEG;IACH,IAAI,IAAI,IAAI,CAAA;IAEZ;;OAEG;IACH,MAAM,IAAI,IAAI,CAAA;IAEd;;;OAGG;IACH,sBAAsB,IAAI,eAAe,CAAA;IAEzC;;;OAGG;IACH,UAAU,IAAI,UAAU,EAAE,CAAA;IAE1B;;OAEG;IACH,YAAY,IAAI,IAAI,CAAA;IAEpB,0CAA0C;IAC1C,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;IAC9B,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IAExB,2BAA2B;IAC3B,KAAK,EAAE,OAAO,CAAA;IACd,gDAAgD;IAChD,YAAY,EAAE,MAAM,CAAA;IACpB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAA"}
1
+ {"version":3,"file":"LLM.nitro.d.ts","sourceRoot":"","sources":["../../../../src/specs/LLM.nitro.ts"],"names":[],"mappings":"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"}
@@ -98,6 +98,24 @@ namespace margelo::nitro::mlxreactnative {
98
98
  inline void setSystemPrompt(const std::string& systemPrompt) noexcept override {
99
99
  _swiftPart.setSystemPrompt(systemPrompt);
100
100
  }
101
+ inline double getMaxTokens() noexcept override {
102
+ return _swiftPart.getMaxTokens();
103
+ }
104
+ inline void setMaxTokens(double maxTokens) noexcept override {
105
+ _swiftPart.setMaxTokens(std::forward<decltype(maxTokens)>(maxTokens));
106
+ }
107
+ inline double getTemperature() noexcept override {
108
+ return _swiftPart.getTemperature();
109
+ }
110
+ inline void setTemperature(double temperature) noexcept override {
111
+ _swiftPart.setTemperature(std::forward<decltype(temperature)>(temperature));
112
+ }
113
+ inline bool getEnableThinking() noexcept override {
114
+ return _swiftPart.getEnableThinking();
115
+ }
116
+ inline void setEnableThinking(bool enableThinking) noexcept override {
117
+ _swiftPart.setEnableThinking(std::forward<decltype(enableThinking)>(enableThinking));
118
+ }
101
119
 
102
120
  public:
103
121
  // Methods
@@ -16,6 +16,9 @@ public protocol HybridLLMSpec_protocol: HybridObject {
16
16
  var modelId: String { get }
17
17
  var debug: Bool { get set }
18
18
  var systemPrompt: String { get set }
19
+ var maxTokens: Double { get set }
20
+ var temperature: Double { get set }
21
+ var enableThinking: Bool { get set }
19
22
 
20
23
  // Methods
21
24
  func load(modelId: String, options: LLMLoadOptions?) throws -> Promise<Void>
@@ -156,6 +156,39 @@ open class HybridLLMSpec_cxx {
156
156
  self.__implementation.systemPrompt = String(newValue)
157
157
  }
158
158
  }
159
+
160
+ public final var maxTokens: Double {
161
+ @inline(__always)
162
+ get {
163
+ return self.__implementation.maxTokens
164
+ }
165
+ @inline(__always)
166
+ set {
167
+ self.__implementation.maxTokens = newValue
168
+ }
169
+ }
170
+
171
+ public final var temperature: Double {
172
+ @inline(__always)
173
+ get {
174
+ return self.__implementation.temperature
175
+ }
176
+ @inline(__always)
177
+ set {
178
+ self.__implementation.temperature = newValue
179
+ }
180
+ }
181
+
182
+ public final var enableThinking: Bool {
183
+ @inline(__always)
184
+ get {
185
+ return self.__implementation.enableThinking
186
+ }
187
+ @inline(__always)
188
+ set {
189
+ self.__implementation.enableThinking = newValue
190
+ }
191
+ }
159
192
 
160
193
  // Methods
161
194
  @inline(__always)
@@ -21,6 +21,12 @@ namespace margelo::nitro::mlxreactnative {
21
21
  prototype.registerHybridSetter("debug", &HybridLLMSpec::setDebug);
22
22
  prototype.registerHybridGetter("systemPrompt", &HybridLLMSpec::getSystemPrompt);
23
23
  prototype.registerHybridSetter("systemPrompt", &HybridLLMSpec::setSystemPrompt);
24
+ prototype.registerHybridGetter("maxTokens", &HybridLLMSpec::getMaxTokens);
25
+ prototype.registerHybridSetter("maxTokens", &HybridLLMSpec::setMaxTokens);
26
+ prototype.registerHybridGetter("temperature", &HybridLLMSpec::getTemperature);
27
+ prototype.registerHybridSetter("temperature", &HybridLLMSpec::setTemperature);
28
+ prototype.registerHybridGetter("enableThinking", &HybridLLMSpec::getEnableThinking);
29
+ prototype.registerHybridSetter("enableThinking", &HybridLLMSpec::setEnableThinking);
24
30
  prototype.registerHybridMethod("load", &HybridLLMSpec::load);
25
31
  prototype.registerHybridMethod("generate", &HybridLLMSpec::generate);
26
32
  prototype.registerHybridMethod("stream", &HybridLLMSpec::stream);
@@ -63,6 +63,12 @@ namespace margelo::nitro::mlxreactnative {
63
63
  virtual void setDebug(bool debug) = 0;
64
64
  virtual std::string getSystemPrompt() = 0;
65
65
  virtual void setSystemPrompt(const std::string& systemPrompt) = 0;
66
+ virtual double getMaxTokens() = 0;
67
+ virtual void setMaxTokens(double maxTokens) = 0;
68
+ virtual double getTemperature() = 0;
69
+ virtual void setTemperature(double temperature) = 0;
70
+ virtual bool getEnableThinking() = 0;
71
+ virtual void setEnableThinking(bool enableThinking) = 0;
66
72
 
67
73
  public:
68
74
  // Methods
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@inferrlm/react-native-mlx",
3
3
  "description": "MLX Swift integration for React Native - InferrLM fork with enhanced features",
4
- "version": "0.4.2-alpha.9",
4
+ "version": "0.4.8",
5
5
  "main": "./lib/module/index.js",
6
6
  "module": "./lib/module/index.js",
7
7
  "types": "./lib/typescript/src/index.d.ts",
package/src/llm.ts CHANGED
@@ -242,4 +242,12 @@ export const LLM = {
242
242
  set temperature(value: number) {
243
243
  getInstance().temperature = value
244
244
  },
245
+
246
+ get enableThinking(): boolean {
247
+ return getInstance().enableThinking
248
+ },
249
+
250
+ set enableThinking(value: boolean) {
251
+ getInstance().enableThinking = value
252
+ },
245
253
  }
@@ -197,6 +197,8 @@ export interface LLM extends HybridObject<{ ios: 'swift' }> {
197
197
  maxTokens: number
198
198
  /** Sampling temperature (0 = deterministic, higher = more random) */
199
199
  temperature: number
200
+ /** Enable thinking mode for models that support it */
201
+ enableThinking: boolean
200
202
  }
201
203
 
202
204
  /**