cactus-react-native 1.0.2 → 1.2.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 (126) hide show
  1. package/README.md +378 -21
  2. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusCrypto.kt +23 -15
  3. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusDeviceInfo.kt +12 -9
  4. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusFileSystem.kt +42 -41
  5. package/android/src/main/java/com/margelo/nitro/cactus/HybridCactusImage.kt +81 -0
  6. package/android/src/main/jniLibs/arm64-v8a/libcactus.a +0 -0
  7. package/cpp/HybridCactus.cpp +105 -0
  8. package/cpp/HybridCactus.hpp +13 -0
  9. package/cpp/cactus_ffi.h +27 -0
  10. package/ios/HybridCactusImage.swift +53 -0
  11. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/cactus_ffi.h +27 -0
  12. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/engine.h +37 -5
  13. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/ffi_utils.h +10 -9
  14. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/graph.h +49 -7
  15. package/ios/cactus.xcframework/ios-arm64/cactus.framework/Headers/kernel.h +31 -0
  16. package/ios/cactus.xcframework/ios-arm64/cactus.framework/cactus +0 -0
  17. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/cactus_ffi.h +27 -0
  18. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/engine.h +37 -5
  19. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/ffi_utils.h +10 -9
  20. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/graph.h +49 -7
  21. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/Headers/kernel.h +31 -0
  22. package/ios/cactus.xcframework/ios-arm64-simulator/cactus.framework/cactus +0 -0
  23. package/lib/module/api/Database.js +23 -0
  24. package/lib/module/api/Database.js.map +1 -1
  25. package/lib/module/api/RemoteLM.js +201 -0
  26. package/lib/module/api/RemoteLM.js.map +1 -0
  27. package/lib/module/classes/CactusLM.js +52 -26
  28. package/lib/module/classes/CactusLM.js.map +1 -1
  29. package/lib/module/classes/CactusSTT.js +139 -0
  30. package/lib/module/classes/CactusSTT.js.map +1 -0
  31. package/lib/module/config/CactusConfig.js +4 -0
  32. package/lib/module/config/CactusConfig.js.map +1 -1
  33. package/lib/module/constants/packageVersion.js +1 -1
  34. package/lib/module/hooks/useCactusLM.js +33 -10
  35. package/lib/module/hooks/useCactusLM.js.map +1 -1
  36. package/lib/module/hooks/useCactusSTT.js +234 -0
  37. package/lib/module/hooks/useCactusSTT.js.map +1 -0
  38. package/lib/module/index.js +2 -0
  39. package/lib/module/index.js.map +1 -1
  40. package/lib/module/native/Cactus.js +50 -1
  41. package/lib/module/native/Cactus.js.map +1 -1
  42. package/lib/module/native/CactusFileSystem.js +2 -3
  43. package/lib/module/native/CactusFileSystem.js.map +1 -1
  44. package/lib/module/native/CactusImage.js +13 -0
  45. package/lib/module/native/CactusImage.js.map +1 -0
  46. package/lib/module/native/index.js +1 -0
  47. package/lib/module/native/index.js.map +1 -1
  48. package/lib/module/specs/CactusImage.nitro.js +4 -0
  49. package/lib/module/specs/CactusImage.nitro.js.map +1 -0
  50. package/lib/module/telemetry/Telemetry.js +53 -1
  51. package/lib/module/telemetry/Telemetry.js.map +1 -1
  52. package/lib/module/types/CactusSTT.js +2 -0
  53. package/lib/module/types/CactusSTT.js.map +1 -0
  54. package/lib/typescript/src/api/Database.d.ts +1 -0
  55. package/lib/typescript/src/api/Database.d.ts.map +1 -1
  56. package/lib/typescript/src/api/RemoteLM.d.ts +14 -0
  57. package/lib/typescript/src/api/RemoteLM.d.ts.map +1 -0
  58. package/lib/typescript/src/classes/CactusLM.d.ts +6 -4
  59. package/lib/typescript/src/classes/CactusLM.d.ts.map +1 -1
  60. package/lib/typescript/src/classes/CactusSTT.d.ts +26 -0
  61. package/lib/typescript/src/classes/CactusSTT.d.ts.map +1 -0
  62. package/lib/typescript/src/config/CactusConfig.d.ts +1 -0
  63. package/lib/typescript/src/config/CactusConfig.d.ts.map +1 -1
  64. package/lib/typescript/src/constants/packageVersion.d.ts +1 -1
  65. package/lib/typescript/src/hooks/useCactusLM.d.ts +4 -3
  66. package/lib/typescript/src/hooks/useCactusLM.d.ts.map +1 -1
  67. package/lib/typescript/src/hooks/useCactusSTT.d.ts +20 -0
  68. package/lib/typescript/src/hooks/useCactusSTT.d.ts.map +1 -0
  69. package/lib/typescript/src/index.d.ts +4 -1
  70. package/lib/typescript/src/index.d.ts.map +1 -1
  71. package/lib/typescript/src/native/Cactus.d.ts +9 -2
  72. package/lib/typescript/src/native/Cactus.d.ts.map +1 -1
  73. package/lib/typescript/src/native/CactusFileSystem.d.ts +1 -1
  74. package/lib/typescript/src/native/CactusFileSystem.d.ts.map +1 -1
  75. package/lib/typescript/src/native/CactusImage.d.ts +6 -0
  76. package/lib/typescript/src/native/CactusImage.d.ts.map +1 -0
  77. package/lib/typescript/src/native/index.d.ts +1 -0
  78. package/lib/typescript/src/native/index.d.ts.map +1 -1
  79. package/lib/typescript/src/specs/Cactus.nitro.d.ts +3 -0
  80. package/lib/typescript/src/specs/Cactus.nitro.d.ts.map +1 -1
  81. package/lib/typescript/src/specs/CactusImage.nitro.d.ts +9 -0
  82. package/lib/typescript/src/specs/CactusImage.nitro.d.ts.map +1 -0
  83. package/lib/typescript/src/telemetry/Telemetry.d.ts +5 -1
  84. package/lib/typescript/src/telemetry/Telemetry.d.ts.map +1 -1
  85. package/lib/typescript/src/types/CactusLM.d.ts +8 -5
  86. package/lib/typescript/src/types/CactusLM.d.ts.map +1 -1
  87. package/lib/typescript/src/types/CactusSTT.d.ts +37 -0
  88. package/lib/typescript/src/types/CactusSTT.d.ts.map +1 -0
  89. package/nitro.json +4 -0
  90. package/nitrogen/generated/android/c++/JHybridCactusImageSpec.cpp +81 -0
  91. package/nitrogen/generated/android/c++/JHybridCactusImageSpec.hpp +66 -0
  92. package/nitrogen/generated/android/cactus+autolinking.cmake +2 -0
  93. package/nitrogen/generated/android/cactusOnLoad.cpp +10 -0
  94. package/nitrogen/generated/android/kotlin/com/margelo/nitro/cactus/HybridCactusImageSpec.kt +62 -0
  95. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Bridge.cpp +17 -0
  96. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Bridge.hpp +17 -0
  97. package/nitrogen/generated/ios/Cactus-Swift-Cxx-Umbrella.hpp +5 -0
  98. package/nitrogen/generated/ios/CactusAutolinking.mm +8 -0
  99. package/nitrogen/generated/ios/CactusAutolinking.swift +15 -0
  100. package/nitrogen/generated/ios/c++/HybridCactusImageSpecSwift.cpp +11 -0
  101. package/nitrogen/generated/ios/c++/HybridCactusImageSpecSwift.hpp +85 -0
  102. package/nitrogen/generated/ios/swift/HybridCactusImageSpec.swift +58 -0
  103. package/nitrogen/generated/ios/swift/HybridCactusImageSpec_cxx.swift +158 -0
  104. package/nitrogen/generated/shared/c++/HybridCactusImageSpec.cpp +22 -0
  105. package/nitrogen/generated/shared/c++/HybridCactusImageSpec.hpp +64 -0
  106. package/nitrogen/generated/shared/c++/HybridCactusSpec.cpp +3 -0
  107. package/nitrogen/generated/shared/c++/HybridCactusSpec.hpp +3 -0
  108. package/package.json +1 -1
  109. package/src/api/Database.ts +27 -0
  110. package/src/api/RemoteLM.ts +273 -0
  111. package/src/classes/CactusLM.ts +72 -38
  112. package/src/classes/CactusSTT.ts +188 -0
  113. package/src/config/CactusConfig.ts +4 -0
  114. package/src/constants/packageVersion.ts +1 -1
  115. package/src/hooks/useCactusLM.ts +45 -17
  116. package/src/hooks/useCactusSTT.ts +285 -0
  117. package/src/index.tsx +14 -2
  118. package/src/native/Cactus.ts +94 -4
  119. package/src/native/CactusFileSystem.ts +2 -2
  120. package/src/native/CactusImage.ts +20 -0
  121. package/src/native/index.ts +1 -0
  122. package/src/specs/Cactus.nitro.ts +9 -0
  123. package/src/specs/CactusImage.nitro.ts +12 -0
  124. package/src/telemetry/Telemetry.ts +78 -1
  125. package/src/types/CactusLM.ts +9 -5
  126. package/src/types/CactusSTT.ts +42 -0
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+
3
+ import { CactusConfig } from "../config/CactusConfig.js";
4
+ import { CactusImage } from "../native/CactusImage.js";
5
+ export class RemoteLM {
6
+ static completionsUrl = 'https://openrouter.ai/api/v1/chat/completions';
7
+ static defaultModel = 'google/gemini-2.5-flash-lite';
8
+ static async complete(messages, options, tools, callback) {
9
+ if (!CactusConfig.cactusToken) {
10
+ throw new Error('cactusToken is required for hybrid completions');
11
+ }
12
+ const payload = JSON.stringify({
13
+ model: this.defaultModel,
14
+ messages: await this.transformMessages(messages),
15
+ tools,
16
+ temperature: options?.temperature,
17
+ top_p: options?.topP,
18
+ top_k: options?.topK,
19
+ max_tokens: options?.maxTokens,
20
+ stop: options?.stopSequences,
21
+ stream: !!callback
22
+ });
23
+ return callback ? await this.streamXHR(payload, callback) : await this.nonStreamFetch(payload);
24
+ }
25
+ static getMimeType(filePath) {
26
+ const extension = filePath.toLowerCase().split('.').pop();
27
+ switch (extension) {
28
+ case 'jpg':
29
+ case 'jpeg':
30
+ return 'image/jpeg';
31
+ case 'png':
32
+ return 'image/png';
33
+ case 'gif':
34
+ return 'image/gif';
35
+ case 'webp':
36
+ return 'image/webp';
37
+ default:
38
+ throw new Error(`Unsupported image format: .${extension}`);
39
+ }
40
+ }
41
+ static async transformMessages(messages) {
42
+ const transformedMessages = [];
43
+ for (const message of messages) {
44
+ const content = [];
45
+ if (message.content) {
46
+ content.push({
47
+ type: 'text',
48
+ text: message.content
49
+ });
50
+ }
51
+ if (message.images) {
52
+ for (const image of message.images) {
53
+ const imagePath = image.replace('file://', '');
54
+ const mimeType = this.getMimeType(imagePath);
55
+ const base64Data = await CactusImage.base64(imagePath);
56
+ content.push({
57
+ type: 'image_url',
58
+ image_url: {
59
+ url: `data:${mimeType};base64,${base64Data}`
60
+ }
61
+ });
62
+ }
63
+ }
64
+ transformedMessages.push({
65
+ role: message.role,
66
+ content
67
+ });
68
+ }
69
+ return transformedMessages;
70
+ }
71
+ static streamXHR(payload, callback) {
72
+ return new Promise((resolve, reject) => {
73
+ const xhr = new XMLHttpRequest();
74
+ xhr.timeout = 3 * 60 * 1000; // 3 minutes
75
+ xhr.ontimeout = () => reject(new Error('Remote streaming completion timed out'));
76
+ xhr.open('POST', this.completionsUrl);
77
+ xhr.setRequestHeader('Authorization', `Bearer ${CactusConfig.cactusToken}`);
78
+ xhr.setRequestHeader('HTTP-Referer', 'https://cactuscompute.com');
79
+ xhr.setRequestHeader('X-Title', 'Cactus React Native SDK');
80
+ xhr.setRequestHeader('Content-Type', 'application/json');
81
+ const startTime = performance.now();
82
+ let lastIndex = 0;
83
+ let buffer = '';
84
+ let response = '';
85
+ let toolCalls;
86
+ let timeToFirstTokenMs = 0;
87
+ let prefillTokens = 0;
88
+ let decodeTokens = 0;
89
+ let totalTokens = 0;
90
+ xhr.onprogress = () => {
91
+ const chunk = xhr.responseText.substring(lastIndex);
92
+ lastIndex = xhr.responseText.length;
93
+ buffer += chunk;
94
+ const lines = buffer.split('\n');
95
+ buffer = lines.pop() || '';
96
+ for (const line of lines) {
97
+ if (!line.startsWith('data: ')) {
98
+ continue;
99
+ }
100
+ const jsonStr = line.slice(6).trim();
101
+ if (jsonStr === '[DONE]') {
102
+ continue;
103
+ }
104
+ try {
105
+ const data = JSON.parse(jsonStr);
106
+ if (timeToFirstTokenMs === 0) {
107
+ timeToFirstTokenMs = performance.now() - startTime;
108
+ }
109
+ const toolCallChunks = data?.choices?.[0]?.delta?.tool_calls;
110
+ if (toolCallChunks) {
111
+ if (!toolCalls) {
112
+ toolCalls = [];
113
+ }
114
+ for (const toolCallChunk of toolCallChunks) {
115
+ const index = toolCallChunk.index;
116
+ if (!toolCalls[index]) {
117
+ toolCalls[index] = {
118
+ name: '',
119
+ arguments: ''
120
+ };
121
+ }
122
+ if (toolCallChunk.function?.name) {
123
+ toolCalls[index].name = toolCallChunk.function.name;
124
+ }
125
+ if (toolCallChunk.function?.arguments) {
126
+ toolCalls[index].arguments += toolCallChunk.function.arguments;
127
+ }
128
+ }
129
+ }
130
+ const content = data?.choices?.[0]?.delta?.content;
131
+ if (content) {
132
+ response += content;
133
+ callback(content);
134
+ }
135
+ if (data?.usage) {
136
+ prefillTokens = data.usage.prompt_tokens;
137
+ decodeTokens = data.usage.completion_tokens;
138
+ totalTokens = data.usage.total_tokens;
139
+ }
140
+ } catch {}
141
+ }
142
+ };
143
+ xhr.onload = () => {
144
+ const totalTimeMs = performance.now() - startTime;
145
+ const functionCalls = toolCalls?.map(toolCall => ({
146
+ name: toolCall.name,
147
+ arguments: JSON.parse(toolCall.arguments)
148
+ }));
149
+ resolve({
150
+ success: true,
151
+ response,
152
+ functionCalls,
153
+ timeToFirstTokenMs,
154
+ totalTimeMs,
155
+ tokensPerSecond: decodeTokens * 1000 / totalTimeMs,
156
+ prefillTokens,
157
+ decodeTokens,
158
+ totalTokens
159
+ });
160
+ };
161
+ xhr.onerror = () => reject(new Error('Remote streaming completion failed'));
162
+ xhr.send(payload);
163
+ });
164
+ }
165
+ static async nonStreamFetch(payload) {
166
+ const startTime = performance.now();
167
+ const request = await fetch(this.completionsUrl, {
168
+ method: 'POST',
169
+ headers: {
170
+ 'Authorization': `Bearer ${CactusConfig.cactusToken}`,
171
+ 'HTTP-Referer': 'https://cactuscompute.com',
172
+ 'X-Title': 'Cactus React Native SDK',
173
+ 'Content-Type': 'application/json'
174
+ },
175
+ body: payload
176
+ });
177
+ if (!request.ok) {
178
+ throw new Error('Remote completion failed');
179
+ }
180
+ const data = await request.json();
181
+ const totalTimeMs = performance.now() - startTime;
182
+ const decodeTokens = data.usage.completion_tokens;
183
+ const toolCalls = data.choices[0].message.tool_calls;
184
+ const functionCalls = toolCalls?.map(toolCall => ({
185
+ name: toolCall.function.name,
186
+ arguments: toolCall.function.arguments
187
+ }));
188
+ return {
189
+ success: true,
190
+ response: data.choices[0].message.content,
191
+ functionCalls,
192
+ timeToFirstTokenMs: totalTimeMs,
193
+ totalTimeMs,
194
+ tokensPerSecond: decodeTokens * 1000 / totalTimeMs,
195
+ prefillTokens: data.usage.prompt_tokens,
196
+ decodeTokens,
197
+ totalTokens: data.usage.total_tokens
198
+ };
199
+ }
200
+ }
201
+ //# sourceMappingURL=RemoteLM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CactusConfig","CactusImage","RemoteLM","completionsUrl","defaultModel","complete","messages","options","tools","callback","cactusToken","Error","payload","JSON","stringify","model","transformMessages","temperature","top_p","topP","top_k","topK","max_tokens","maxTokens","stop","stopSequences","stream","streamXHR","nonStreamFetch","getMimeType","filePath","extension","toLowerCase","split","pop","transformedMessages","message","content","push","type","text","images","image","imagePath","replace","mimeType","base64Data","base64","image_url","url","role","Promise","resolve","reject","xhr","XMLHttpRequest","timeout","ontimeout","open","setRequestHeader","startTime","performance","now","lastIndex","buffer","response","toolCalls","timeToFirstTokenMs","prefillTokens","decodeTokens","totalTokens","onprogress","chunk","responseText","substring","length","lines","line","startsWith","jsonStr","slice","trim","data","parse","toolCallChunks","choices","delta","tool_calls","toolCallChunk","index","name","arguments","function","usage","prompt_tokens","completion_tokens","total_tokens","onload","totalTimeMs","functionCalls","map","toolCall","success","tokensPerSecond","onerror","send","request","fetch","method","headers","body","ok","json"],"sourceRoot":"../../../src","sources":["api/RemoteLM.ts"],"mappings":"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","ignoreList":[]}
@@ -5,6 +5,7 @@ import { Telemetry } from "../telemetry/Telemetry.js";
5
5
  import { CactusConfig } from "../config/CactusConfig.js";
6
6
  import { Database } from "../api/Database.js";
7
7
  import { getErrorMessage } from "../utils/error.js";
8
+ import { RemoteLM } from "../api/RemoteLM.js";
8
9
  export class CactusLM {
9
10
  cactus = new Cactus();
10
11
  isDownloading = false;
@@ -15,13 +16,15 @@ export class CactusLM {
15
16
  static defaultCompleteOptions = {
16
17
  maxTokens: 512
17
18
  };
19
+ static defaultCompleteMode = 'local';
18
20
  static defaultEmbedBufferSize = 2048;
19
- static modelsInfoPath = 'models/info.json';
21
+ static cactusModelsCache = null;
20
22
  constructor({
21
23
  model,
22
24
  contextSize,
23
25
  corpusDir
24
26
  } = {}) {
27
+ Telemetry.init(CactusConfig.telemetryToken);
25
28
  this.model = model ?? CactusLM.defaultModel;
26
29
  this.contextSize = contextSize ?? CactusLM.defaultContextSize;
27
30
  this.corpusDir = corpusDir;
@@ -38,10 +41,8 @@ export class CactusLM {
38
41
  }
39
42
  this.isDownloading = true;
40
43
  try {
41
- await CactusFileSystem.downloadModel(this.model, onProgress);
42
- await this.getModels({
43
- forceRefresh: true
44
- });
44
+ const model = await Database.getModel(this.model);
45
+ await CactusFileSystem.downloadModel(this.model, model.downloadUrl, onProgress);
45
46
  } finally {
46
47
  this.isDownloading = false;
47
48
  }
@@ -50,9 +51,6 @@ export class CactusLM {
50
51
  if (this.isInitialized) {
51
52
  return;
52
53
  }
53
- if (!Telemetry.isInitialized()) {
54
- await Telemetry.init(CactusConfig.telemetryToken);
55
- }
56
54
  if (!(await CactusFileSystem.modelExists(this.model))) {
57
55
  throw new Error(`Model "${this.model}" is not downloaded`);
58
56
  }
@@ -70,25 +68,39 @@ export class CactusLM {
70
68
  messages,
71
69
  options,
72
70
  tools,
73
- onToken
71
+ onToken,
72
+ mode
74
73
  }) {
75
74
  if (this.isGenerating) {
76
75
  throw new Error('CactusLM is already generating');
77
76
  }
78
- await this.init();
79
77
  options = {
80
78
  ...CactusLM.defaultCompleteOptions,
81
79
  ...options
82
80
  };
81
+ const toolsInternal = tools?.map(tool => ({
82
+ type: 'function',
83
+ function: tool
84
+ }));
85
+ mode = mode ?? CactusLM.defaultCompleteMode;
83
86
  const responseBufferSize = 8 * (options.maxTokens ?? CactusLM.defaultCompleteOptions.maxTokens) + 256;
84
- this.isGenerating = true;
85
87
  try {
86
- const result = await this.cactus.complete(messages, responseBufferSize, options, tools, onToken);
88
+ await this.init();
89
+ this.isGenerating = true;
90
+ const result = await this.cactus.complete(messages, responseBufferSize, options, toolsInternal, onToken);
87
91
  Telemetry.logCompletion(this.model, result.success, result.success ? undefined : result.response, result);
88
92
  return result;
89
- } catch (error) {
90
- Telemetry.logCompletion(this.model, false, getErrorMessage(error));
91
- throw error;
93
+ } catch (localError) {
94
+ if (mode === 'local') {
95
+ Telemetry.logCompletion(this.model, false, getErrorMessage(localError));
96
+ throw localError;
97
+ }
98
+ Telemetry.logCompletion(this.model, false, `Local completion error: ${getErrorMessage(localError)}. Falling back to remote completion.`);
99
+ try {
100
+ return RemoteLM.complete(messages, options, toolsInternal, onToken);
101
+ } catch (remoteError) {
102
+ throw new Error(`Remote completion error: ${getErrorMessage(remoteError)}`);
103
+ }
92
104
  } finally {
93
105
  this.isGenerating = false;
94
106
  }
@@ -114,6 +126,27 @@ export class CactusLM {
114
126
  this.isGenerating = false;
115
127
  }
116
128
  }
129
+ async imageEmbed({
130
+ imagePath
131
+ }) {
132
+ if (this.isGenerating) {
133
+ throw new Error('CactusLM is already generating');
134
+ }
135
+ await this.init();
136
+ this.isGenerating = true;
137
+ try {
138
+ const embedding = await this.cactus.imageEmbed(imagePath, CactusLM.defaultEmbedBufferSize);
139
+ Telemetry.logImageEmbedding(this.model, true);
140
+ return {
141
+ embedding
142
+ };
143
+ } catch (error) {
144
+ Telemetry.logImageEmbedding(this.model, false, getErrorMessage(error));
145
+ throw error;
146
+ } finally {
147
+ this.isGenerating = false;
148
+ }
149
+ }
117
150
  stop() {
118
151
  return this.cactus.stop();
119
152
  }
@@ -129,22 +162,15 @@ export class CactusLM {
129
162
  await this.cactus.destroy();
130
163
  this.isInitialized = false;
131
164
  }
132
- async getModels({
133
- forceRefresh = false
134
- } = {}) {
135
- if (!forceRefresh && (await CactusFileSystem.fileExists(CactusLM.modelsInfoPath))) {
136
- try {
137
- return JSON.parse(await CactusFileSystem.readFile(CactusLM.modelsInfoPath));
138
- } catch {
139
- // Delete corrupted models info
140
- await CactusFileSystem.deleteFile(CactusLM.modelsInfoPath);
141
- }
165
+ async getModels() {
166
+ if (CactusLM.cactusModelsCache) {
167
+ return CactusLM.cactusModelsCache;
142
168
  }
143
169
  const models = await Database.getModels();
144
170
  for (const model of models) {
145
171
  model.isDownloaded = await CactusFileSystem.modelExists(model.slug);
146
172
  }
147
- await CactusFileSystem.writeFile(CactusLM.modelsInfoPath, JSON.stringify(models));
173
+ CactusLM.cactusModelsCache = models;
148
174
  return models;
149
175
  }
150
176
  }
@@ -1 +1 @@
1
- {"version":3,"names":["Cactus","CactusFileSystem","Telemetry","CactusConfig","Database","getErrorMessage","CactusLM","cactus","isDownloading","isInitialized","isGenerating","defaultModel","defaultContextSize","defaultCompleteOptions","maxTokens","defaultEmbedBufferSize","modelsInfoPath","constructor","model","contextSize","corpusDir","download","onProgress","Error","modelExists","downloadModel","getModels","forceRefresh","init","telemetryToken","modelPath","getModelPath","logInit","error","complete","messages","options","tools","onToken","responseBufferSize","result","logCompletion","success","undefined","response","embed","text","embedding","logEmbedding","stop","reset","destroy","fileExists","JSON","parse","readFile","deleteFile","models","isDownloaded","slug","writeFile","stringify"],"sourceRoot":"../../../src","sources":["classes/CactusLM.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Cactus","CactusFileSystem","Telemetry","CactusConfig","Database","getErrorMessage","RemoteLM","CactusLM","cactus","isDownloading","isInitialized","isGenerating","defaultModel","defaultContextSize","defaultCompleteOptions","maxTokens","defaultCompleteMode","defaultEmbedBufferSize","cactusModelsCache","constructor","model","contextSize","corpusDir","init","telemetryToken","download","onProgress","Error","modelExists","getModel","downloadModel","downloadUrl","modelPath","getModelPath","logInit","error","complete","messages","options","tools","onToken","mode","toolsInternal","map","tool","type","function","responseBufferSize","result","logCompletion","success","undefined","response","localError","remoteError","embed","text","embedding","logEmbedding","imageEmbed","imagePath","logImageEmbedding","stop","reset","destroy","getModels","models","isDownloaded","slug"],"sourceRoot":"../../../src","sources":["classes/CactusLM.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+
3
+ import { Cactus, CactusFileSystem } from "../native/index.js";
4
+ import { Telemetry } from "../telemetry/Telemetry.js";
5
+ import { CactusConfig } from "../config/CactusConfig.js";
6
+ import { Database } from "../api/Database.js";
7
+ import { getErrorMessage } from "../utils/error.js";
8
+ export class CactusSTT {
9
+ cactus = new Cactus();
10
+ isDownloading = false;
11
+ isInitialized = false;
12
+ isGenerating = false;
13
+ static defaultModel = 'whisper-small';
14
+ static defaultContextSize = 2048;
15
+ static defaultPrompt = '<|startoftranscript|><|en|><|transcribe|><|notimestamps|>';
16
+ static defaultTranscribeOptions = {
17
+ maxTokens: 512
18
+ };
19
+ static defaultEmbedBufferSize = 4096;
20
+ static cactusModelsCache = null;
21
+ constructor({
22
+ model,
23
+ contextSize
24
+ } = {}) {
25
+ Telemetry.init(CactusConfig.telemetryToken);
26
+ this.model = model ?? CactusSTT.defaultModel;
27
+ this.contextSize = contextSize ?? CactusSTT.defaultContextSize;
28
+ }
29
+ async download({
30
+ onProgress
31
+ } = {}) {
32
+ if (this.isDownloading) {
33
+ throw new Error('CactusSTT is already downloading');
34
+ }
35
+ if (await CactusFileSystem.modelExists(this.model)) {
36
+ onProgress?.(1.0);
37
+ return;
38
+ }
39
+ this.isDownloading = true;
40
+ try {
41
+ await CactusFileSystem.downloadModel(this.model, `https://vlqqczxwyaodtcdmdmlw.supabase.co/storage/v1/object/public/voice-models/${this.model}.zip`, onProgress);
42
+ } finally {
43
+ this.isDownloading = false;
44
+ }
45
+ }
46
+ async init() {
47
+ if (this.isInitialized) {
48
+ return;
49
+ }
50
+ if (!(await CactusFileSystem.modelExists(this.model))) {
51
+ throw new Error(`Model "${this.model}" is not downloaded`);
52
+ }
53
+ const modelPath = await CactusFileSystem.getModelPath(this.model);
54
+ try {
55
+ await this.cactus.init(modelPath, this.contextSize);
56
+ Telemetry.logInit(this.model, true);
57
+ this.isInitialized = true;
58
+ } catch (error) {
59
+ Telemetry.logInit(this.model, false, getErrorMessage(error));
60
+ throw error;
61
+ }
62
+ }
63
+ async transcribe({
64
+ audioFilePath,
65
+ prompt,
66
+ options,
67
+ onToken
68
+ }) {
69
+ if (this.isGenerating) {
70
+ throw new Error('CactusSTT is already generating');
71
+ }
72
+ await this.init();
73
+ prompt = prompt ?? CactusSTT.defaultPrompt;
74
+ options = {
75
+ ...CactusSTT.defaultTranscribeOptions,
76
+ ...options
77
+ };
78
+ const responseBufferSize = 8 * (options.maxTokens ?? CactusSTT.defaultTranscribeOptions.maxTokens) + 256;
79
+ this.isGenerating = true;
80
+ try {
81
+ const result = await this.cactus.transcribe(audioFilePath, prompt, responseBufferSize, options, onToken);
82
+ Telemetry.logTranscribe(this.model, result.success, result.success ? undefined : result.response, result);
83
+ return result;
84
+ } catch (error) {
85
+ Telemetry.logTranscribe(this.model, false, getErrorMessage(error));
86
+ throw error;
87
+ } finally {
88
+ this.isGenerating = false;
89
+ }
90
+ }
91
+ async audioEmbed({
92
+ audioPath
93
+ }) {
94
+ if (this.isGenerating) {
95
+ throw new Error('CactusSTT is already generating');
96
+ }
97
+ await this.init();
98
+ this.isGenerating = true;
99
+ try {
100
+ const embedding = await this.cactus.audioEmbed(audioPath, CactusSTT.defaultEmbedBufferSize);
101
+ Telemetry.logAudioEmbedding(this.model, true);
102
+ return {
103
+ embedding
104
+ };
105
+ } catch (error) {
106
+ Telemetry.logAudioEmbedding(this.model, false, getErrorMessage(error));
107
+ throw error;
108
+ } finally {
109
+ this.isGenerating = false;
110
+ }
111
+ }
112
+ stop() {
113
+ return this.cactus.stop();
114
+ }
115
+ async reset() {
116
+ await this.stop();
117
+ return this.cactus.reset();
118
+ }
119
+ async destroy() {
120
+ if (!this.isInitialized) {
121
+ return;
122
+ }
123
+ await this.stop();
124
+ await this.cactus.destroy();
125
+ this.isInitialized = false;
126
+ }
127
+ async getModels() {
128
+ if (CactusSTT.cactusModelsCache) {
129
+ return CactusSTT.cactusModelsCache;
130
+ }
131
+ const models = await Database.getModels();
132
+ for (const model of models) {
133
+ model.isDownloaded = await CactusFileSystem.modelExists(model.slug);
134
+ }
135
+ CactusSTT.cactusModelsCache = models;
136
+ return models;
137
+ }
138
+ }
139
+ //# sourceMappingURL=CactusSTT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Cactus","CactusFileSystem","Telemetry","CactusConfig","Database","getErrorMessage","CactusSTT","cactus","isDownloading","isInitialized","isGenerating","defaultModel","defaultContextSize","defaultPrompt","defaultTranscribeOptions","maxTokens","defaultEmbedBufferSize","cactusModelsCache","constructor","model","contextSize","init","telemetryToken","download","onProgress","Error","modelExists","downloadModel","modelPath","getModelPath","logInit","error","transcribe","audioFilePath","prompt","options","onToken","responseBufferSize","result","logTranscribe","success","undefined","response","audioEmbed","audioPath","embedding","logAudioEmbedding","stop","reset","destroy","getModels","models","isDownloaded","slug"],"sourceRoot":"../../../src","sources":["classes/CactusSTT.ts"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
 
3
3
  export class CactusConfig {
4
+ // Telemetry
5
+
4
6
  static isTelemetryEnabled = true;
7
+
8
+ // Hybrid mode
5
9
  }
6
10
  //# sourceMappingURL=CactusConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["CactusConfig","isTelemetryEnabled"],"sourceRoot":"../../../src","sources":["config/CactusConfig.ts"],"mappings":";;AAAA,OAAO,MAAMA,YAAY,CAAC;EAExB,OAAcC,kBAAkB,GAAY,IAAI;AAClD","ignoreList":[]}
1
+ {"version":3,"names":["CactusConfig","isTelemetryEnabled"],"sourceRoot":"../../../src","sources":["config/CactusConfig.ts"],"mappings":";;AAAA,OAAO,MAAMA,YAAY,CAAC;EACxB;;EAEA,OAAcC,kBAAkB,GAAY,IAAI;;EAEhD;AAEF","ignoreList":[]}
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
 
3
- export const packageVersion = '1.0.2';
3
+ export const packageVersion = '1.2.0';
4
4
  //# sourceMappingURL=packageVersion.js.map
@@ -71,9 +71,12 @@ export const useCactusLM = ({
71
71
  setError(message);
72
72
  throw new Error(message);
73
73
  }
74
+ setError(null);
75
+ if (isDownloaded) {
76
+ return;
77
+ }
74
78
  const thisModel = currentModelRef.current;
75
79
  const thisDownloadId = ++currentDownloadIdRef.current;
76
- setError(null);
77
80
  setDownloadProgress(0);
78
81
  setIsDownloading(true);
79
82
  try {
@@ -103,7 +106,7 @@ export const useCactusLM = ({
103
106
  setIsDownloading(false);
104
107
  setDownloadProgress(0);
105
108
  }
106
- }, [cactusLM, isDownloading]);
109
+ }, [cactusLM, isDownloading, isDownloaded]);
107
110
  const init = useCallback(async () => {
108
111
  if (isInitializing) {
109
112
  const message = 'CactusLM is already initializing';
@@ -125,7 +128,8 @@ export const useCactusLM = ({
125
128
  messages,
126
129
  options,
127
130
  tools,
128
- onToken
131
+ onToken,
132
+ mode
129
133
  }) => {
130
134
  if (isGenerating) {
131
135
  const message = 'CactusLM is already generating';
@@ -143,7 +147,8 @@ export const useCactusLM = ({
143
147
  onToken: token => {
144
148
  setCompletion(prev => prev + token);
145
149
  onToken?.(token);
146
- }
150
+ },
151
+ mode
147
152
  });
148
153
  } catch (e) {
149
154
  setError(getErrorMessage(e));
@@ -173,6 +178,27 @@ export const useCactusLM = ({
173
178
  setIsGenerating(false);
174
179
  }
175
180
  }, [cactusLM, isGenerating]);
181
+ const imageEmbed = useCallback(async ({
182
+ imagePath
183
+ }) => {
184
+ if (isGenerating) {
185
+ const message = 'CactusLM is already generating';
186
+ setError(message);
187
+ throw new Error(message);
188
+ }
189
+ setError(null);
190
+ setIsGenerating(true);
191
+ try {
192
+ return await cactusLM.imageEmbed({
193
+ imagePath
194
+ });
195
+ } catch (e) {
196
+ setError(getErrorMessage(e));
197
+ throw e;
198
+ } finally {
199
+ setIsGenerating(false);
200
+ }
201
+ }, [cactusLM, isGenerating]);
176
202
  const stop = useCallback(async () => {
177
203
  setError(null);
178
204
  try {
@@ -204,14 +230,10 @@ export const useCactusLM = ({
204
230
  setCompletion('');
205
231
  }
206
232
  }, [cactusLM]);
207
- const getModels = useCallback(async ({
208
- forceRefresh
209
- } = {}) => {
233
+ const getModels = useCallback(async () => {
210
234
  setError(null);
211
235
  try {
212
- return await cactusLM.getModels({
213
- forceRefresh
214
- });
236
+ return await cactusLM.getModels();
215
237
  } catch (e) {
216
238
  setError(getErrorMessage(e));
217
239
  throw e;
@@ -229,6 +251,7 @@ export const useCactusLM = ({
229
251
  init,
230
252
  complete,
231
253
  embed,
254
+ imageEmbed,
232
255
  reset,
233
256
  stop,
234
257
  destroy,