cactus-react-native 0.2.1 → 0.2.3

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.
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # Cactus React Native
2
2
 
3
- Running LLMs, VLMs, and TTS models directly on mobile devices.
3
+ Run LLMs, VLMs, and TTS models directly on mobile devices.
4
4
 
5
5
  ## Installation
6
6
 
7
7
  ```json
8
8
  {
9
9
  "dependencies": {
10
- "cactus-react-native": "^0.2.0",
10
+ "cactus-react-native": "^0.2.1",
11
11
  "react-native-fs": "^2.20.0"
12
12
  }
13
13
  }
@@ -64,6 +64,17 @@ public class LlamaContext {
64
64
  if (!params.hasKey("model")) {
65
65
  throw new IllegalArgumentException("Missing required parameter: model");
66
66
  }
67
+
68
+ String modelPath = params.getString("model");
69
+ File modelFile = new File(modelPath);
70
+ if (!modelFile.exists()) {
71
+ Log.e(NAME, "Model file does not exist: " + modelPath);
72
+ throw new IllegalArgumentException("Model file does not exist: " + modelPath);
73
+ }
74
+ if (!modelFile.canRead()) {
75
+ Log.e(NAME, "Model file is not readable: " + modelPath);
76
+ throw new IllegalArgumentException("Model file is not readable: " + modelPath);
77
+ }
67
78
  eventEmitter = reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class);
68
79
  this.id = id;
69
80
  this.context = initContext(
@@ -115,7 +126,8 @@ public class LlamaContext {
115
126
  params.hasKey("use_progress_callback") ? new LoadProgressCallback(this) : null
116
127
  );
117
128
  if (this.context == -1) {
118
- throw new IllegalStateException("Failed to initialize context");
129
+ throw new IllegalStateException("Failed to initialize context for model: " + modelPath +
130
+ ". Please check if the model file exists and is accessible.");
119
131
  }
120
132
  this.modelDetails = loadModelDetails(this.context);
121
133
  this.reactContext = reactContext;
@@ -347,7 +347,10 @@ Java_com_cactus_LlamaContext_initContext(
347
347
  }
348
348
  context_map[(long) llama->ctx] = llama;
349
349
  } else {
350
+ LOGE("[CACTUS] Failed to load model from path: %s", model_path_chars);
350
351
  llama_free(llama->ctx);
352
+ delete llama;
353
+ return -1;
351
354
  }
352
355
 
353
356
  std::vector<common_adapter_lora_info> lora;
@@ -378,8 +381,10 @@ Java_com_cactus_LlamaContext_initContext(
378
381
  env->ReleaseStringUTFChars(lora_str, lora_chars);
379
382
  int result = llama->applyLoraAdapters(lora);
380
383
  if (result != 0) {
381
- LOGI("[Cactus] Failed to apply lora adapters");
384
+ LOGE("[CACTUS] Failed to apply lora adapters");
382
385
  llama_free(llama->ctx);
386
+ context_map.erase((long) llama->ctx);
387
+ delete llama;
383
388
  return -1;
384
389
  }
385
390
 
@@ -11,38 +11,65 @@ class CactusLM {
11
11
  constructor(context) {
12
12
  this.context = context;
13
13
  }
14
- static async init(params, onProgress, cactusToken) {
14
+ static async init(params, onProgress, cactusToken, retryOptions) {
15
15
  if (cactusToken) {
16
16
  (0, _remote.setCactusToken)(cactusToken);
17
17
  }
18
+ const maxRetries = retryOptions?.maxRetries ?? 3;
19
+ const delayMs = retryOptions?.delayMs ?? 1000;
18
20
  const configs = [params, {
19
21
  ...params,
20
22
  n_gpu_layers: 0
21
23
  }];
22
- for (const config of configs) {
23
- try {
24
- const context = await (0, _index.initLlama)(config, onProgress);
25
- return {
26
- lm: new CactusLM(context),
27
- error: null
24
+ const sleep = ms => {
25
+ return new Promise(resolve => {
26
+ const start = Date.now();
27
+ const wait = () => {
28
+ if (Date.now() - start >= ms) {
29
+ resolve();
30
+ } else {
31
+ Promise.resolve().then(wait);
32
+ }
28
33
  };
29
- } catch (e) {
30
- _telemetry.Telemetry.error(e, {
31
- n_gpu_layers: config.n_gpu_layers ?? null,
32
- n_ctx: config.n_ctx ?? null,
33
- model: config.model ?? null
34
- });
35
- if (configs.indexOf(config) === configs.length - 1) {
34
+ wait();
35
+ });
36
+ };
37
+ for (const config of configs) {
38
+ let lastError = null;
39
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
40
+ try {
41
+ const context = await (0, _index.initLlama)(config, onProgress);
36
42
  return {
37
- lm: null,
38
- error: e
43
+ lm: new CactusLM(context),
44
+ error: null
39
45
  };
46
+ } catch (e) {
47
+ lastError = e;
48
+ const isLastConfig = configs.indexOf(config) === configs.length - 1;
49
+ const isLastAttempt = attempt === maxRetries;
50
+ _telemetry.Telemetry.error(e, {
51
+ n_gpu_layers: config.n_gpu_layers ?? null,
52
+ n_ctx: config.n_ctx ?? null,
53
+ model: config.model ?? null
54
+ });
55
+ if (!isLastAttempt) {
56
+ const delay = delayMs * Math.pow(2, attempt - 1);
57
+ await sleep(delay);
58
+ } else if (!isLastConfig) {
59
+ break;
60
+ }
40
61
  }
41
62
  }
63
+ if (configs.indexOf(config) === configs.length - 1 && lastError) {
64
+ return {
65
+ lm: null,
66
+ error: lastError
67
+ };
68
+ }
42
69
  }
43
70
  return {
44
71
  lm: null,
45
- error: new Error('Failed to initialize CactusLM')
72
+ error: new Error('Failed to initialize CactusLM after all retries')
46
73
  };
47
74
  }
48
75
  async completion(messages, params = {}, callback) {
@@ -1 +1 @@
1
- {"version":3,"names":["_index","require","_telemetry","_remote","CactusLM","constructor","context","init","params","onProgress","cactusToken","setCactusToken","configs","n_gpu_layers","config","initLlama","lm","error","e","Telemetry","n_ctx","model","indexOf","length","Error","completion","messages","callback","embedding","text","mode","result","lastError","_handleRemoteEmbedding","_handleLocalEmbedding","remoteError","localError","embeddingValues","getVertexAIEmbedding","rewind","release","exports"],"sourceRoot":"../../src","sources":["lm.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_index","require","_telemetry","_remote","CactusLM","constructor","context","init","params","onProgress","cactusToken","retryOptions","setCactusToken","maxRetries","delayMs","configs","n_gpu_layers","sleep","ms","Promise","resolve","start","Date","now","wait","then","config","lastError","attempt","initLlama","lm","error","e","isLastConfig","indexOf","length","isLastAttempt","Telemetry","n_ctx","model","delay","Math","pow","Error","completion","messages","callback","embedding","text","mode","result","_handleRemoteEmbedding","_handleLocalEmbedding","remoteError","localError","embeddingValues","getVertexAIEmbedding","rewind","release","exports"],"sourceRoot":"../../src","sources":["lm.ts"],"mappings":"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","ignoreList":[]}
package/lib/module/lm.js CHANGED
@@ -7,38 +7,65 @@ export class CactusLM {
7
7
  constructor(context) {
8
8
  this.context = context;
9
9
  }
10
- static async init(params, onProgress, cactusToken) {
10
+ static async init(params, onProgress, cactusToken, retryOptions) {
11
11
  if (cactusToken) {
12
12
  setCactusToken(cactusToken);
13
13
  }
14
+ const maxRetries = retryOptions?.maxRetries ?? 3;
15
+ const delayMs = retryOptions?.delayMs ?? 1000;
14
16
  const configs = [params, {
15
17
  ...params,
16
18
  n_gpu_layers: 0
17
19
  }];
18
- for (const config of configs) {
19
- try {
20
- const context = await initLlama(config, onProgress);
21
- return {
22
- lm: new CactusLM(context),
23
- error: null
20
+ const sleep = ms => {
21
+ return new Promise(resolve => {
22
+ const start = Date.now();
23
+ const wait = () => {
24
+ if (Date.now() - start >= ms) {
25
+ resolve();
26
+ } else {
27
+ Promise.resolve().then(wait);
28
+ }
24
29
  };
25
- } catch (e) {
26
- Telemetry.error(e, {
27
- n_gpu_layers: config.n_gpu_layers ?? null,
28
- n_ctx: config.n_ctx ?? null,
29
- model: config.model ?? null
30
- });
31
- if (configs.indexOf(config) === configs.length - 1) {
30
+ wait();
31
+ });
32
+ };
33
+ for (const config of configs) {
34
+ let lastError = null;
35
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
36
+ try {
37
+ const context = await initLlama(config, onProgress);
32
38
  return {
33
- lm: null,
34
- error: e
39
+ lm: new CactusLM(context),
40
+ error: null
35
41
  };
42
+ } catch (e) {
43
+ lastError = e;
44
+ const isLastConfig = configs.indexOf(config) === configs.length - 1;
45
+ const isLastAttempt = attempt === maxRetries;
46
+ Telemetry.error(e, {
47
+ n_gpu_layers: config.n_gpu_layers ?? null,
48
+ n_ctx: config.n_ctx ?? null,
49
+ model: config.model ?? null
50
+ });
51
+ if (!isLastAttempt) {
52
+ const delay = delayMs * Math.pow(2, attempt - 1);
53
+ await sleep(delay);
54
+ } else if (!isLastConfig) {
55
+ break;
56
+ }
36
57
  }
37
58
  }
59
+ if (configs.indexOf(config) === configs.length - 1 && lastError) {
60
+ return {
61
+ lm: null,
62
+ error: lastError
63
+ };
64
+ }
38
65
  }
39
66
  return {
40
67
  lm: null,
41
- error: new Error('Failed to initialize CactusLM')
68
+ error: new Error('Failed to initialize CactusLM after all retries')
42
69
  };
43
70
  }
44
71
  async completion(messages, params = {}, callback) {
@@ -1 +1 @@
1
- {"version":3,"names":["initLlama","Telemetry","setCactusToken","getVertexAIEmbedding","CactusLM","constructor","context","init","params","onProgress","cactusToken","configs","n_gpu_layers","config","lm","error","e","n_ctx","model","indexOf","length","Error","completion","messages","callback","embedding","text","mode","result","lastError","_handleRemoteEmbedding","_handleLocalEmbedding","remoteError","localError","embeddingValues","rewind","release"],"sourceRoot":"../../src","sources":["lm.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["initLlama","Telemetry","setCactusToken","getVertexAIEmbedding","CactusLM","constructor","context","init","params","onProgress","cactusToken","retryOptions","maxRetries","delayMs","configs","n_gpu_layers","sleep","ms","Promise","resolve","start","Date","now","wait","then","config","lastError","attempt","lm","error","e","isLastConfig","indexOf","length","isLastAttempt","n_ctx","model","delay","Math","pow","Error","completion","messages","callback","embedding","text","mode","result","_handleRemoteEmbedding","_handleLocalEmbedding","remoteError","localError","embeddingValues","rewind","release"],"sourceRoot":"../../src","sources":["lm.ts"],"mappings":"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","ignoreList":[]}
@@ -6,7 +6,10 @@ interface CactusLMReturn {
6
6
  export declare class CactusLM {
7
7
  private context;
8
8
  private constructor();
9
- static init(params: ContextParams, onProgress?: (progress: number) => void, cactusToken?: string): Promise<CactusLMReturn>;
9
+ static init(params: ContextParams, onProgress?: (progress: number) => void, cactusToken?: string, retryOptions?: {
10
+ maxRetries?: number;
11
+ delayMs?: number;
12
+ }): Promise<CactusLMReturn>;
10
13
  completion(messages: CactusOAICompatibleMessage[], params?: CompletionParams, callback?: (data: any) => void): Promise<NativeCompletionResult>;
11
14
  embedding(text: string, params?: EmbeddingParams, mode?: string): Promise<NativeEmbeddingResult>;
12
15
  private _handleLocalEmbedding;
@@ -1 +1 @@
1
- {"version":3,"file":"lm.d.ts","sourceRoot":"","sources":["../../src/lm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,0BAA0B,EAC1B,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAIhB,UAAU,cAAc;IACtB,EAAE,EAAE,QAAQ,GAAG,IAAI,CAAA;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAc;IAE7B,OAAO;WAIM,IAAI,CACf,MAAM,EAAE,aAAa,EACrB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EACvC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,CAAC;IA4BpB,UAAU,CACd,QAAQ,EAAE,0BAA0B,EAAE,EACtC,MAAM,GAAE,gBAAqB,EAC7B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAC7B,OAAO,CAAC,sBAAsB,CAAC;IAI5B,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,eAAe,EACxB,IAAI,GAAE,MAAgB,GACrB,OAAO,CAAC,qBAAqB,CAAC;YAoCnB,qBAAqB;YAIrB,sBAAsB;IAO9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAKvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
1
+ {"version":3,"file":"lm.d.ts","sourceRoot":"","sources":["../../src/lm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,0BAA0B,EAC1B,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAIhB,UAAU,cAAc;IACtB,EAAE,EAAE,QAAQ,GAAG,IAAI,CAAA;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAc;IAE7B,OAAO;WAIM,IAAI,CACf,MAAM,EAAE,aAAa,EACrB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EACvC,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,cAAc,CAAC;IA6DpB,UAAU,CACd,QAAQ,EAAE,0BAA0B,EAAE,EACtC,MAAM,GAAE,gBAAqB,EAC7B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAC7B,OAAO,CAAC,sBAAsB,CAAC;IAI5B,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,eAAe,EACxB,IAAI,GAAE,MAAgB,GACrB,OAAO,CAAC,qBAAqB,CAAC;YAoCnB,qBAAqB;YAIrB,sBAAsB;IAO9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAKvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cactus-react-native",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Run AI models locally on mobile devices",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
package/src/lm.ts CHANGED
@@ -26,32 +26,66 @@ export class CactusLM {
26
26
  params: ContextParams,
27
27
  onProgress?: (progress: number) => void,
28
28
  cactusToken?: string,
29
+ retryOptions?: { maxRetries?: number; delayMs?: number },
29
30
  ): Promise<CactusLMReturn> {
30
31
  if (cactusToken) {
31
32
  setCactusToken(cactusToken);
32
33
  }
33
34
 
35
+ const maxRetries = retryOptions?.maxRetries ?? 3;
36
+ const delayMs = retryOptions?.delayMs ?? 1000;
37
+
34
38
  const configs = [
35
39
  params,
36
40
  { ...params, n_gpu_layers: 0 }
37
41
  ];
38
42
 
43
+ const sleep = (ms: number): Promise<void> => {
44
+ return new Promise(resolve => {
45
+ const start = Date.now();
46
+ const wait = () => {
47
+ if (Date.now() - start >= ms) {
48
+ resolve();
49
+ } else {
50
+ Promise.resolve().then(wait);
51
+ }
52
+ };
53
+ wait();
54
+ });
55
+ };
56
+
39
57
  for (const config of configs) {
40
- try {
41
- const context = await initLlama(config, onProgress);
42
- return { lm: new CactusLM(context), error: null };
43
- } catch (e) {
44
- Telemetry.error(e as Error, {
45
- n_gpu_layers: config.n_gpu_layers ?? null,
46
- n_ctx: config.n_ctx ?? null,
47
- model: config.model ?? null,
48
- });
49
- if (configs.indexOf(config) === configs.length - 1) {
50
- return { lm: null, error: e as Error };
58
+ let lastError: Error | null = null;
59
+
60
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
61
+ try {
62
+ const context = await initLlama(config, onProgress);
63
+ return { lm: new CactusLM(context), error: null };
64
+ } catch (e) {
65
+ lastError = e as Error;
66
+ const isLastConfig = configs.indexOf(config) === configs.length - 1;
67
+ const isLastAttempt = attempt === maxRetries;
68
+
69
+ Telemetry.error(e as Error, {
70
+ n_gpu_layers: config.n_gpu_layers ?? null,
71
+ n_ctx: config.n_ctx ?? null,
72
+ model: config.model ?? null,
73
+ });
74
+
75
+ if (!isLastAttempt) {
76
+ const delay = delayMs * Math.pow(2, attempt - 1);
77
+ await sleep(delay);
78
+ } else if (!isLastConfig) {
79
+ break;
80
+ }
51
81
  }
52
82
  }
83
+
84
+ if (configs.indexOf(config) === configs.length - 1 && lastError) {
85
+ return { lm: null, error: lastError };
86
+ }
53
87
  }
54
- return { lm: null, error: new Error('Failed to initialize CactusLM') };
88
+ return { lm: null, error: new Error('Failed to initialize CactusLM after all retries') };
55
89
  }
56
90
 
57
91
  async completion(