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 +2 -2
- package/android/src/main/java/com/cactus/LlamaContext.java +13 -1
- package/android/src/main/jni.cpp +6 -1
- package/android/src/main/jniLibs/arm64-v8a/libcactus.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libcactus_v8.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2_dotprod.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2_dotprod_i8mm.so +0 -0
- package/android/src/main/jniLibs/arm64-v8a/libcactus_v8_2_i8mm.so +0 -0
- package/android/src/main/jniLibs/x86_64/libcactus.so +0 -0
- package/android/src/main/jniLibs/x86_64/libcactus_x86_64.so +0 -0
- package/ios/cactus.xcframework/ios-arm64_x86_64-simulator/cactus.framework/cactus +0 -0
- package/ios/cactus.xcframework/tvos-arm64_x86_64-simulator/cactus.framework/cactus +0 -0
- package/lib/commonjs/lm.js +44 -17
- package/lib/commonjs/lm.js.map +1 -1
- package/lib/module/lm.js +44 -17
- package/lib/module/lm.js.map +1 -1
- package/lib/typescript/lm.d.ts +4 -1
- package/lib/typescript/lm.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/lm.ts +46 -12
package/README.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# Cactus React Native
|
|
2
2
|
|
|
3
|
-
|
|
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.
|
|
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;
|
package/android/src/main/jni.cpp
CHANGED
|
@@ -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
|
-
|
|
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
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/lib/commonjs/lm.js
CHANGED
|
@@ -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
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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:
|
|
38
|
-
error:
|
|
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) {
|
package/lib/commonjs/lm.js.map
CHANGED
|
@@ -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","
|
|
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":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AASA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAOO,MAAMG,QAAQ,CAAC;EAGZC,WAAWA,CAACC,OAAqB,EAAE;IACzC,IAAI,CAACA,OAAO,GAAGA,OAAO;EACxB;EAEA,aAAaC,IAAIA,CACfC,MAAqB,EACrBC,UAAuC,EACvCC,WAAoB,EACpBC,YAAwD,EAC/B;IACzB,IAAID,WAAW,EAAE;MACf,IAAAE,sBAAc,EAACF,WAAW,CAAC;IAC7B;IAEA,MAAMG,UAAU,GAAGF,YAAY,EAAEE,UAAU,IAAI,CAAC;IAChD,MAAMC,OAAO,GAAGH,YAAY,EAAEG,OAAO,IAAI,IAAI;IAE7C,MAAMC,OAAO,GAAG,CACdP,MAAM,EACN;MAAE,GAAGA,MAAM;MAAEQ,YAAY,EAAE;IAAE,CAAC,CAC/B;IAED,MAAMC,KAAK,GAAIC,EAAU,IAAoB;MAC3C,OAAO,IAAIC,OAAO,CAACC,OAAO,IAAI;QAC5B,MAAMC,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;QACxB,MAAMC,IAAI,GAAGA,CAAA,KAAM;UACjB,IAAIF,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGF,KAAK,IAAIH,EAAE,EAAE;YAC5BE,OAAO,CAAC,CAAC;UACX,CAAC,MAAM;YACLD,OAAO,CAACC,OAAO,CAAC,CAAC,CAACK,IAAI,CAACD,IAAI,CAAC;UAC9B;QACF,CAAC;QACDA,IAAI,CAAC,CAAC;MACR,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,MAAME,MAAM,IAAIX,OAAO,EAAE;MAC5B,IAAIY,SAAuB,GAAG,IAAI;MAElC,KAAK,IAAIC,OAAO,GAAG,CAAC,EAAEA,OAAO,IAAIf,UAAU,EAAEe,OAAO,EAAE,EAAE;QACtD,IAAI;UACF,MAAMtB,OAAO,GAAG,MAAM,IAAAuB,gBAAS,EAACH,MAAM,EAAEjB,UAAU,CAAC;UACnD,OAAO;YAAEqB,EAAE,EAAE,IAAI1B,QAAQ,CAACE,OAAO,CAAC;YAAEyB,KAAK,EAAE;UAAK,CAAC;QACnD,CAAC,CAAC,OAAOC,CAAC,EAAE;UACVL,SAAS,GAAGK,CAAU;UACtB,MAAMC,YAAY,GAAGlB,OAAO,CAACmB,OAAO,CAACR,MAAM,CAAC,KAAKX,OAAO,CAACoB,MAAM,GAAG,CAAC;UACnE,MAAMC,aAAa,GAAGR,OAAO,KAAKf,UAAU;UAE5CwB,oBAAS,CAACN,KAAK,CAACC,CAAC,EAAW;YAC1BhB,YAAY,EAAEU,MAAM,CAACV,YAAY,IAAI,IAAI;YACzCsB,KAAK,EAAEZ,MAAM,CAACY,KAAK,IAAI,IAAI;YAC3BC,KAAK,EAAEb,MAAM,CAACa,KAAK,IAAI;UACzB,CAAC,CAAC;UAEF,IAAI,CAACH,aAAa,EAAE;YAClB,MAAMI,KAAK,GAAG1B,OAAO,GAAG2B,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEd,OAAO,GAAG,CAAC,CAAC;YAChD,MAAMX,KAAK,CAACuB,KAAK,CAAC;UACpB,CAAC,MAAM,IAAI,CAACP,YAAY,EAAE;YACxB;UACF;QACF;MACF;MAEA,IAAIlB,OAAO,CAACmB,OAAO,CAACR,MAAM,CAAC,KAAKX,OAAO,CAACoB,MAAM,GAAG,CAAC,IAAIR,SAAS,EAAE;QAC/D,OAAO;UAAEG,EAAE,EAAE,IAAI;UAAEC,KAAK,EAAEJ;QAAU,CAAC;MACvC;IACF;IACA,OAAO;MAAEG,EAAE,EAAE,IAAI;MAAEC,KAAK,EAAE,IAAIY,KAAK,CAAC,iDAAiD;IAAE,CAAC;EAC1F;EAEA,MAAMC,UAAUA,CACdC,QAAsC,EACtCrC,MAAwB,GAAG,CAAC,CAAC,EAC7BsC,QAA8B,EACG;IACjC,OAAO,MAAM,IAAI,CAACxC,OAAO,CAACsC,UAAU,CAAC;MAAEC,QAAQ;MAAE,GAAGrC;IAAO,CAAC,EAAEsC,QAAQ,CAAC;EACzE;EAEA,MAAMC,SAASA,CACbC,IAAY,EACZxC,MAAwB,EACxByC,IAAY,GAAG,OAAO,EACU;IAChC,IAAIC,MAA6B;IACjC,IAAIvB,SAAuB,GAAG,IAAI;IAElC,IAAIsB,IAAI,KAAK,QAAQ,EAAE;MACrBC,MAAM,GAAG,MAAM,IAAI,CAACC,sBAAsB,CAACH,IAAI,CAAC;IAClD,CAAC,MAAM,IAAIC,IAAI,KAAK,OAAO,EAAE;MAC3BC,MAAM,GAAG,MAAM,IAAI,CAACE,qBAAqB,CAACJ,IAAI,EAAExC,MAAM,CAAC;IACzD,CAAC,MAAM,IAAIyC,IAAI,KAAK,YAAY,EAAE;MAChC,IAAI;QACFC,MAAM,GAAG,MAAM,IAAI,CAACE,qBAAqB,CAACJ,IAAI,EAAExC,MAAM,CAAC;MACzD,CAAC,CAAC,OAAOwB,CAAC,EAAE;QACVL,SAAS,GAAGK,CAAU;QACtB,IAAI;UACFkB,MAAM,GAAG,MAAM,IAAI,CAACC,sBAAsB,CAACH,IAAI,CAAC;QAClD,CAAC,CAAC,OAAOK,WAAW,EAAE;UACpB,MAAM1B,SAAS;QACjB;MACF;IACF,CAAC,MAAM,IAAIsB,IAAI,KAAK,aAAa,EAAE;MACjC,IAAI;QACFC,MAAM,GAAG,MAAM,IAAI,CAACC,sBAAsB,CAACH,IAAI,CAAC;MAClD,CAAC,CAAC,OAAOhB,CAAC,EAAE;QACVL,SAAS,GAAGK,CAAU;QACtB,IAAI;UACFkB,MAAM,GAAG,MAAM,IAAI,CAACE,qBAAqB,CAACJ,IAAI,EAAExC,MAAM,CAAC;QACzD,CAAC,CAAC,OAAO8C,UAAU,EAAE;UACnB,MAAM3B,SAAS;QACjB;MACF;IACF,CAAC,MAAM;MACL,MAAM,IAAIgB,KAAK,CAAC,gBAAgB,GAAGM,IAAI,GAAG,6DAA6D,CAAC;IAC1G;IACA,OAAOC,MAAM;EACf;EAEA,MAAcE,qBAAqBA,CAACJ,IAAY,EAAExC,MAAwB,EAAkC;IAC1G,OAAO,IAAI,CAACF,OAAO,CAACyC,SAAS,CAACC,IAAI,EAAExC,MAAM,CAAC;EAC7C;EAEA,MAAc2C,sBAAsBA,CAACH,IAAY,EAAkC;IACjF,MAAMO,eAAe,GAAG,MAAM,IAAAC,4BAAoB,EAACR,IAAI,CAAC;IACxD,OAAO;MACLD,SAAS,EAAEQ;IACb,CAAC;EACH;EAEA,MAAME,MAAMA,CAAA,EAAkB;IAC5B;IACA,OAAO,IAAI,CAACnD,OAAO,EAAEmD,MAAM,CAAC,CAAC;EAC/B;EAEA,MAAMC,OAAOA,CAAA,EAAkB;IAC7B,OAAO,IAAI,CAACpD,OAAO,CAACoD,OAAO,CAAC,CAAC;EAC/B;AACF;AAACC,OAAA,CAAAvD,QAAA,GAAAA,QAAA","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
|
-
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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:
|
|
34
|
-
error:
|
|
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) {
|
package/lib/module/lm.js.map
CHANGED
|
@@ -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","
|
|
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":[]}
|
package/lib/typescript/lm.d.ts
CHANGED
|
@@ -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
|
|
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,
|
|
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
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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(
|