cactus-react-native 0.2.2 → 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.
@@ -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;
@@ -307,7 +307,6 @@ Java_com_cactus_LlamaContext_initContext(
307
307
  llama->is_load_interrupted = false;
308
308
  llama->loading_progress = 0;
309
309
 
310
- callback_context *cb_ctx = nullptr;
311
310
  if (load_progress_callback != nullptr) {
312
311
  defaultParams.progress_callback = [](float progress, void * user_data) {
313
312
  callback_context *cb_ctx = (callback_context *)user_data;
@@ -324,7 +323,7 @@ Java_com_cactus_LlamaContext_initContext(
324
323
  return !llama->is_load_interrupted;
325
324
  };
326
325
 
327
- cb_ctx = new callback_context;
326
+ callback_context *cb_ctx = new callback_context;
328
327
  cb_ctx->env = env;
329
328
  cb_ctx->llama = llama;
330
329
  cb_ctx->callback = env->NewGlobalRef(load_progress_callback);
@@ -340,30 +339,20 @@ Java_com_cactus_LlamaContext_initContext(
340
339
  env->ReleaseStringUTFChars(cache_type_v, cache_type_v_chars);
341
340
 
342
341
  LOGI("[CACTUS] is_model_loaded %s", (is_model_loaded ? "true" : "false"));
343
-
344
- if (!is_model_loaded) {
345
- llama_free(llama->ctx);
346
- if (cb_ctx) {
347
- env->DeleteGlobalRef(cb_ctx->callback);
348
- delete cb_ctx;
342
+ if (is_model_loaded) {
343
+ if (embedding && llama_model_has_encoder(llama->model) && llama_model_has_decoder(llama->model)) {
344
+ LOGI("[CACTUS] computing embeddings in encoder-decoder models is not supported");
345
+ llama_free(llama->ctx);
346
+ return -1;
349
347
  }
350
- delete llama;
351
- return -1;
352
- }
353
-
354
- if (embedding && llama_model_has_encoder(llama->model) && llama_model_has_decoder(llama->model)) {
355
- LOGI("[CACTUS] computing embeddings in encoder-decoder models is not supported");
348
+ context_map[(long) llama->ctx] = llama;
349
+ } else {
350
+ LOGE("[CACTUS] Failed to load model from path: %s", model_path_chars);
356
351
  llama_free(llama->ctx);
357
- if (cb_ctx) {
358
- env->DeleteGlobalRef(cb_ctx->callback);
359
- delete cb_ctx;
360
- }
361
352
  delete llama;
362
353
  return -1;
363
354
  }
364
355
 
365
- context_map[(long) llama->ctx] = llama;
366
-
367
356
  std::vector<common_adapter_lora_info> lora;
368
357
  const char *lora_chars = env->GetStringUTFChars(lora_str, nullptr);
369
358
  if (lora_chars != nullptr && lora_chars[0] != '\0') {
@@ -392,20 +381,11 @@ Java_com_cactus_LlamaContext_initContext(
392
381
  env->ReleaseStringUTFChars(lora_str, lora_chars);
393
382
  int result = llama->applyLoraAdapters(lora);
394
383
  if (result != 0) {
395
- LOGI("[Cactus] Failed to apply lora adapters");
396
- context_map.erase((long) llama->ctx);
397
- llama_free(llama->ctx);
398
- if (cb_ctx) {
399
- env->DeleteGlobalRef(cb_ctx->callback);
400
- delete cb_ctx;
401
- }
402
- delete llama;
403
- return -1;
404
- }
405
-
406
- if (cb_ctx) {
407
- env->DeleteGlobalRef(cb_ctx->callback);
408
- delete cb_ctx;
384
+ LOGE("[CACTUS] Failed to apply lora adapters");
385
+ llama_free(llama->ctx);
386
+ context_map.erase((long) llama->ctx);
387
+ delete llama;
388
+ return -1;
409
389
  }
410
390
 
411
391
  return reinterpret_cast<jlong>(llama->ctx);
@@ -5,53 +5,71 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.CactusLM = void 0;
7
7
  var _index = require("./index");
8
- var _reactNative = require("react-native");
9
8
  var _telemetry = require("./telemetry");
10
9
  var _remote = require("./remote");
11
- // @ts-ignore
12
-
13
10
  class CactusLM {
14
11
  constructor(context) {
15
12
  this.context = context;
16
13
  }
17
- static async init(params, onProgress, cactusToken) {
14
+ static async init(params, onProgress, cactusToken, retryOptions) {
18
15
  if (cactusToken) {
19
16
  (0, _remote.setCactusToken)(cactusToken);
20
17
  }
21
-
22
- // Avoid two back-to-back loads on devices where GPU off-load is unsupported (Android).
23
- const needGpuAttempt = _reactNative.Platform.OS !== 'android' && (params.n_gpu_layers ?? 0) > 0;
24
- const configs = needGpuAttempt ? [params, {
25
- ...params,
26
- n_gpu_layers: 0
27
- }] : [{
18
+ const maxRetries = retryOptions?.maxRetries ?? 3;
19
+ const delayMs = retryOptions?.delayMs ?? 1000;
20
+ const configs = [params, {
28
21
  ...params,
29
22
  n_gpu_layers: 0
30
23
  }];
31
- for (const config of configs) {
32
- try {
33
- const context = await (0, _index.initLlama)(config, onProgress);
34
- return {
35
- lm: new CactusLM(context),
36
- 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
+ }
37
33
  };
38
- } catch (e) {
39
- _telemetry.Telemetry.error(e, {
40
- n_gpu_layers: config.n_gpu_layers ?? null,
41
- n_ctx: config.n_ctx ?? null,
42
- model: config.model ?? null
43
- });
44
- 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);
45
42
  return {
46
- lm: null,
47
- error: e
43
+ lm: new CactusLM(context),
44
+ error: null
48
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
+ }
49
61
  }
50
62
  }
63
+ if (configs.indexOf(config) === configs.length - 1 && lastError) {
64
+ return {
65
+ lm: null,
66
+ error: lastError
67
+ };
68
+ }
51
69
  }
52
70
  return {
53
71
  lm: null,
54
- error: new Error('Failed to initialize CactusLM')
72
+ error: new Error('Failed to initialize CactusLM after all retries')
55
73
  };
56
74
  }
57
75
  async completion(messages, params = {}, callback) {
@@ -1 +1 @@
1
- {"version":3,"names":["_index","require","_reactNative","_telemetry","_remote","CactusLM","constructor","context","init","params","onProgress","cactusToken","setCactusToken","needGpuAttempt","Platform","OS","n_gpu_layers","configs","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
@@ -1,52 +1,71 @@
1
1
  "use strict";
2
2
 
3
3
  import { initLlama } from './index';
4
- // @ts-ignore
5
- import { Platform } from 'react-native';
6
4
  import { Telemetry } from './telemetry';
7
5
  import { setCactusToken, getVertexAIEmbedding } from './remote';
8
6
  export class CactusLM {
9
7
  constructor(context) {
10
8
  this.context = context;
11
9
  }
12
- static async init(params, onProgress, cactusToken) {
10
+ static async init(params, onProgress, cactusToken, retryOptions) {
13
11
  if (cactusToken) {
14
12
  setCactusToken(cactusToken);
15
13
  }
16
-
17
- // Avoid two back-to-back loads on devices where GPU off-load is unsupported (Android).
18
- const needGpuAttempt = Platform.OS !== 'android' && (params.n_gpu_layers ?? 0) > 0;
19
- const configs = needGpuAttempt ? [params, {
20
- ...params,
21
- n_gpu_layers: 0
22
- }] : [{
14
+ const maxRetries = retryOptions?.maxRetries ?? 3;
15
+ const delayMs = retryOptions?.delayMs ?? 1000;
16
+ const configs = [params, {
23
17
  ...params,
24
18
  n_gpu_layers: 0
25
19
  }];
26
- for (const config of configs) {
27
- try {
28
- const context = await initLlama(config, onProgress);
29
- return {
30
- lm: new CactusLM(context),
31
- 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
+ }
32
29
  };
33
- } catch (e) {
34
- Telemetry.error(e, {
35
- n_gpu_layers: config.n_gpu_layers ?? null,
36
- n_ctx: config.n_ctx ?? null,
37
- model: config.model ?? null
38
- });
39
- 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);
40
38
  return {
41
- lm: null,
42
- error: e
39
+ lm: new CactusLM(context),
40
+ error: null
43
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
+ }
44
57
  }
45
58
  }
59
+ if (configs.indexOf(config) === configs.length - 1 && lastError) {
60
+ return {
61
+ lm: null,
62
+ error: lastError
63
+ };
64
+ }
46
65
  }
47
66
  return {
48
67
  lm: null,
49
- error: new Error('Failed to initialize CactusLM')
68
+ error: new Error('Failed to initialize CactusLM after all retries')
50
69
  };
51
70
  }
52
71
  async completion(messages, params = {}, callback) {
@@ -1 +1 @@
1
- {"version":3,"names":["initLlama","Platform","Telemetry","setCactusToken","getVertexAIEmbedding","CactusLM","constructor","context","init","params","onProgress","cactusToken","needGpuAttempt","OS","n_gpu_layers","configs","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":"AAGA,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;IA6BpB,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.2",
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
@@ -1,6 +1,4 @@
1
1
  import { initLlama, LlamaContext } from './index'
2
- // @ts-ignore
3
- import { Platform } from 'react-native'
4
2
  import type {
5
3
  ContextParams,
6
4
  CompletionParams,
@@ -28,33 +26,66 @@ export class CactusLM {
28
26
  params: ContextParams,
29
27
  onProgress?: (progress: number) => void,
30
28
  cactusToken?: string,
29
+ retryOptions?: { maxRetries?: number; delayMs?: number },
31
30
  ): Promise<CactusLMReturn> {
32
31
  if (cactusToken) {
33
32
  setCactusToken(cactusToken);
34
33
  }
35
34
 
36
- // Avoid two back-to-back loads on devices where GPU off-load is unsupported (Android).
37
- const needGpuAttempt = Platform.OS !== 'android' && (params.n_gpu_layers ?? 0) > 0
38
- const configs = needGpuAttempt
39
- ? [params, { ...params, n_gpu_layers: 0 }]
40
- : [{ ...params, n_gpu_layers: 0 }]
35
+ const maxRetries = retryOptions?.maxRetries ?? 3;
36
+ const delayMs = retryOptions?.delayMs ?? 1000;
37
+
38
+ const configs = [
39
+ params,
40
+ { ...params, n_gpu_layers: 0 }
41
+ ];
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
+ };
41
56
 
42
57
  for (const config of configs) {
43
- try {
44
- const context = await initLlama(config, onProgress);
45
- return { lm: new CactusLM(context), error: null };
46
- } catch (e) {
47
- Telemetry.error(e as Error, {
48
- n_gpu_layers: config.n_gpu_layers ?? null,
49
- n_ctx: config.n_ctx ?? null,
50
- model: config.model ?? null,
51
- });
52
- if (configs.indexOf(config) === configs.length - 1) {
53
- 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
+ }
54
81
  }
55
82
  }
83
+
84
+ if (configs.indexOf(config) === configs.length - 1 && lastError) {
85
+ return { lm: null, error: lastError };
86
+ }
56
87
  }
57
- return { lm: null, error: new Error('Failed to initialize CactusLM') };
88
+ return { lm: null, error: new Error('Failed to initialize CactusLM after all retries') };
58
89
  }
59
90
 
60
91
  async completion(