inference-server 1.0.0-beta.19
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 +216 -0
- package/dist/api/openai/enums.d.ts +4 -0
- package/dist/api/openai/enums.js +17 -0
- package/dist/api/openai/enums.js.map +1 -0
- package/dist/api/openai/handlers/chat.d.ts +3 -0
- package/dist/api/openai/handlers/chat.js +358 -0
- package/dist/api/openai/handlers/chat.js.map +1 -0
- package/dist/api/openai/handlers/completions.d.ts +3 -0
- package/dist/api/openai/handlers/completions.js +169 -0
- package/dist/api/openai/handlers/completions.js.map +1 -0
- package/dist/api/openai/handlers/embeddings.d.ts +3 -0
- package/dist/api/openai/handlers/embeddings.js +74 -0
- package/dist/api/openai/handlers/embeddings.js.map +1 -0
- package/dist/api/openai/handlers/images.d.ts +0 -0
- package/dist/api/openai/handlers/images.js +4 -0
- package/dist/api/openai/handlers/images.js.map +1 -0
- package/dist/api/openai/handlers/models.d.ts +3 -0
- package/dist/api/openai/handlers/models.js +23 -0
- package/dist/api/openai/handlers/models.js.map +1 -0
- package/dist/api/openai/handlers/transcription.d.ts +0 -0
- package/dist/api/openai/handlers/transcription.js +4 -0
- package/dist/api/openai/handlers/transcription.js.map +1 -0
- package/dist/api/openai/index.d.ts +7 -0
- package/dist/api/openai/index.js +14 -0
- package/dist/api/openai/index.js.map +1 -0
- package/dist/api/parseJSONRequestBody.d.ts +2 -0
- package/dist/api/parseJSONRequestBody.js +24 -0
- package/dist/api/parseJSONRequestBody.js.map +1 -0
- package/dist/api/v1/index.d.ts +2 -0
- package/dist/api/v1/index.js +29 -0
- package/dist/api/v1/index.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +10 -0
- package/dist/cli.js.map +1 -0
- package/dist/engines/gpt4all/engine.d.ts +34 -0
- package/dist/engines/gpt4all/engine.js +357 -0
- package/dist/engines/gpt4all/engine.js.map +1 -0
- package/dist/engines/gpt4all/util.d.ts +3 -0
- package/dist/engines/gpt4all/util.js +29 -0
- package/dist/engines/gpt4all/util.js.map +1 -0
- package/dist/engines/index.d.ts +19 -0
- package/dist/engines/index.js +21 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/node-llama-cpp/engine.d.ts +49 -0
- package/dist/engines/node-llama-cpp/engine.js +666 -0
- package/dist/engines/node-llama-cpp/engine.js.map +1 -0
- package/dist/engines/node-llama-cpp/types.d.ts +13 -0
- package/dist/engines/node-llama-cpp/types.js +2 -0
- package/dist/engines/node-llama-cpp/types.js.map +1 -0
- package/dist/engines/node-llama-cpp/util.d.ts +15 -0
- package/dist/engines/node-llama-cpp/util.js +84 -0
- package/dist/engines/node-llama-cpp/util.js.map +1 -0
- package/dist/engines/node-llama-cpp/validateModelFile.d.ts +8 -0
- package/dist/engines/node-llama-cpp/validateModelFile.js +36 -0
- package/dist/engines/node-llama-cpp/validateModelFile.js.map +1 -0
- package/dist/engines/stable-diffusion-cpp/engine.d.ts +90 -0
- package/dist/engines/stable-diffusion-cpp/engine.js +294 -0
- package/dist/engines/stable-diffusion-cpp/engine.js.map +1 -0
- package/dist/engines/stable-diffusion-cpp/types.d.ts +3 -0
- package/dist/engines/stable-diffusion-cpp/types.js +2 -0
- package/dist/engines/stable-diffusion-cpp/types.js.map +1 -0
- package/dist/engines/stable-diffusion-cpp/util.d.ts +4 -0
- package/dist/engines/stable-diffusion-cpp/util.js +55 -0
- package/dist/engines/stable-diffusion-cpp/util.js.map +1 -0
- package/dist/engines/stable-diffusion-cpp/validateModelFiles.d.ts +19 -0
- package/dist/engines/stable-diffusion-cpp/validateModelFiles.js +91 -0
- package/dist/engines/stable-diffusion-cpp/validateModelFiles.js.map +1 -0
- package/dist/engines/transformers-js/engine.d.ts +37 -0
- package/dist/engines/transformers-js/engine.js +538 -0
- package/dist/engines/transformers-js/engine.js.map +1 -0
- package/dist/engines/transformers-js/types.d.ts +7 -0
- package/dist/engines/transformers-js/types.js +2 -0
- package/dist/engines/transformers-js/types.js.map +1 -0
- package/dist/engines/transformers-js/util.d.ts +7 -0
- package/dist/engines/transformers-js/util.js +36 -0
- package/dist/engines/transformers-js/util.js.map +1 -0
- package/dist/engines/transformers-js/validateModelFiles.d.ts +17 -0
- package/dist/engines/transformers-js/validateModelFiles.js +133 -0
- package/dist/engines/transformers-js/validateModelFiles.js.map +1 -0
- package/dist/experiments/ChatWithVision.d.ts +11 -0
- package/dist/experiments/ChatWithVision.js +91 -0
- package/dist/experiments/ChatWithVision.js.map +1 -0
- package/dist/experiments/StableDiffPromptGenerator.d.ts +0 -0
- package/dist/experiments/StableDiffPromptGenerator.js +4 -0
- package/dist/experiments/StableDiffPromptGenerator.js.map +1 -0
- package/dist/experiments/VoiceFunctionCall.d.ts +18 -0
- package/dist/experiments/VoiceFunctionCall.js +51 -0
- package/dist/experiments/VoiceFunctionCall.js.map +1 -0
- package/dist/http.d.ts +19 -0
- package/dist/http.js +54 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/instance.d.ts +88 -0
- package/dist/instance.js +594 -0
- package/dist/instance.js.map +1 -0
- package/dist/lib/acquireFileLock.d.ts +7 -0
- package/dist/lib/acquireFileLock.js +38 -0
- package/dist/lib/acquireFileLock.js.map +1 -0
- package/dist/lib/calculateContextIdentity.d.ts +7 -0
- package/dist/lib/calculateContextIdentity.js +39 -0
- package/dist/lib/calculateContextIdentity.js.map +1 -0
- package/dist/lib/calculateFileChecksum.d.ts +1 -0
- package/dist/lib/calculateFileChecksum.js +16 -0
- package/dist/lib/calculateFileChecksum.js.map +1 -0
- package/dist/lib/copyDirectory.d.ts +6 -0
- package/dist/lib/copyDirectory.js +27 -0
- package/dist/lib/copyDirectory.js.map +1 -0
- package/dist/lib/decodeAudio.d.ts +1 -0
- package/dist/lib/decodeAudio.js +26 -0
- package/dist/lib/decodeAudio.js.map +1 -0
- package/dist/lib/downloadModelFile.d.ts +10 -0
- package/dist/lib/downloadModelFile.js +58 -0
- package/dist/lib/downloadModelFile.js.map +1 -0
- package/dist/lib/flattenMessageTextContent.d.ts +2 -0
- package/dist/lib/flattenMessageTextContent.js +11 -0
- package/dist/lib/flattenMessageTextContent.js.map +1 -0
- package/dist/lib/getCacheDirPath.d.ts +12 -0
- package/dist/lib/getCacheDirPath.js +31 -0
- package/dist/lib/getCacheDirPath.js.map +1 -0
- package/dist/lib/loadImage.d.ts +12 -0
- package/dist/lib/loadImage.js +30 -0
- package/dist/lib/loadImage.js.map +1 -0
- package/dist/lib/logger.d.ts +12 -0
- package/dist/lib/logger.js +98 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/math.d.ts +7 -0
- package/dist/lib/math.js +30 -0
- package/dist/lib/math.js.map +1 -0
- package/dist/lib/resolveModelFileLocation.d.ts +15 -0
- package/dist/lib/resolveModelFileLocation.js +41 -0
- package/dist/lib/resolveModelFileLocation.js.map +1 -0
- package/dist/lib/util.d.ts +7 -0
- package/dist/lib/util.js +61 -0
- package/dist/lib/util.js.map +1 -0
- package/dist/lib/validateModelFile.d.ts +9 -0
- package/dist/lib/validateModelFile.js +62 -0
- package/dist/lib/validateModelFile.js.map +1 -0
- package/dist/lib/validateModelOptions.d.ts +3 -0
- package/dist/lib/validateModelOptions.js +23 -0
- package/dist/lib/validateModelOptions.js.map +1 -0
- package/dist/pool.d.ts +61 -0
- package/dist/pool.js +512 -0
- package/dist/pool.js.map +1 -0
- package/dist/server.d.ts +59 -0
- package/dist/server.js +221 -0
- package/dist/server.js.map +1 -0
- package/dist/standalone.d.ts +1 -0
- package/dist/standalone.js +306 -0
- package/dist/standalone.js.map +1 -0
- package/dist/store.d.ts +60 -0
- package/dist/store.js +203 -0
- package/dist/store.js.map +1 -0
- package/dist/types/completions.d.ts +57 -0
- package/dist/types/completions.js +2 -0
- package/dist/types/completions.js.map +1 -0
- package/dist/types/index.d.ts +326 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/docs/engines.md +28 -0
- package/docs/gpu.md +72 -0
- package/docs/http-api.md +147 -0
- package/examples/all-options.js +108 -0
- package/examples/chat-cli.js +56 -0
- package/examples/chat-server.js +65 -0
- package/examples/concurrency.js +70 -0
- package/examples/express.js +70 -0
- package/examples/pool.js +91 -0
- package/package.json +113 -0
- package/src/api/openai/enums.ts +20 -0
- package/src/api/openai/handlers/chat.ts +408 -0
- package/src/api/openai/handlers/completions.ts +196 -0
- package/src/api/openai/handlers/embeddings.ts +92 -0
- package/src/api/openai/handlers/images.ts +3 -0
- package/src/api/openai/handlers/models.ts +33 -0
- package/src/api/openai/handlers/transcription.ts +2 -0
- package/src/api/openai/index.ts +16 -0
- package/src/api/parseJSONRequestBody.ts +26 -0
- package/src/api/v1/DRAFT.md +16 -0
- package/src/api/v1/index.ts +37 -0
- package/src/cli.ts +9 -0
- package/src/engines/gpt4all/engine.ts +441 -0
- package/src/engines/gpt4all/util.ts +31 -0
- package/src/engines/index.ts +28 -0
- package/src/engines/node-llama-cpp/engine.ts +811 -0
- package/src/engines/node-llama-cpp/types.ts +17 -0
- package/src/engines/node-llama-cpp/util.ts +126 -0
- package/src/engines/node-llama-cpp/validateModelFile.ts +46 -0
- package/src/engines/stable-diffusion-cpp/engine.ts +369 -0
- package/src/engines/stable-diffusion-cpp/types.ts +54 -0
- package/src/engines/stable-diffusion-cpp/util.ts +58 -0
- package/src/engines/stable-diffusion-cpp/validateModelFiles.ts +119 -0
- package/src/engines/transformers-js/engine.ts +659 -0
- package/src/engines/transformers-js/types.ts +25 -0
- package/src/engines/transformers-js/util.ts +40 -0
- package/src/engines/transformers-js/validateModelFiles.ts +168 -0
- package/src/experiments/ChatWithVision.ts +103 -0
- package/src/experiments/StableDiffPromptGenerator.ts +2 -0
- package/src/experiments/VoiceFunctionCall.ts +71 -0
- package/src/http.ts +72 -0
- package/src/index.ts +7 -0
- package/src/instance.ts +723 -0
- package/src/lib/acquireFileLock.ts +38 -0
- package/src/lib/calculateContextIdentity.ts +53 -0
- package/src/lib/calculateFileChecksum.ts +18 -0
- package/src/lib/copyDirectory.ts +29 -0
- package/src/lib/decodeAudio.ts +39 -0
- package/src/lib/downloadModelFile.ts +70 -0
- package/src/lib/flattenMessageTextContent.ts +19 -0
- package/src/lib/getCacheDirPath.ts +34 -0
- package/src/lib/loadImage.ts +46 -0
- package/src/lib/logger.ts +112 -0
- package/src/lib/math.ts +31 -0
- package/src/lib/resolveModelFileLocation.ts +49 -0
- package/src/lib/util.ts +75 -0
- package/src/lib/validateModelFile.ts +71 -0
- package/src/lib/validateModelOptions.ts +31 -0
- package/src/pool.ts +651 -0
- package/src/server.ts +270 -0
- package/src/standalone.ts +320 -0
- package/src/store.ts +278 -0
- package/src/types/completions.ts +86 -0
- package/src/types/index.ts +488 -0
- package/tsconfig.json +29 -0
- package/tsconfig.release.json +11 -0
- package/vitest.config.ts +18 -0
package/dist/lib/util.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { inspect } from 'node:util';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
export function elapsedMillis(since) {
|
|
5
|
+
const now = process.hrtime.bigint();
|
|
6
|
+
return Number(now - BigInt(since)) / 1e6;
|
|
7
|
+
}
|
|
8
|
+
export function omitEmptyValues(dict) {
|
|
9
|
+
return Object.fromEntries(Object.entries(dict).filter(([_, v]) => {
|
|
10
|
+
return v !== null && v !== undefined;
|
|
11
|
+
}));
|
|
12
|
+
}
|
|
13
|
+
export function touchFileSync(filePath) {
|
|
14
|
+
fs.closeSync(fs.openSync(filePath, 'w'));
|
|
15
|
+
}
|
|
16
|
+
function isSubpath(parent, child) {
|
|
17
|
+
// Normalize paths to resolve .. and . segments
|
|
18
|
+
const normalizedParent = path.normalize(parent);
|
|
19
|
+
const normalizedChild = path.normalize(child);
|
|
20
|
+
// Get relative path from parent to child
|
|
21
|
+
const relativePath = path.relative(normalizedParent, normalizedChild);
|
|
22
|
+
// Check if relative path:
|
|
23
|
+
// 1. Doesn't start with .. (which would mean going up directories)
|
|
24
|
+
// 2. Isn't an absolute path (which would start with / or C:\ etc)
|
|
25
|
+
return !relativePath.startsWith('..') && !path.isAbsolute(relativePath);
|
|
26
|
+
}
|
|
27
|
+
export function mergeAbortSignals(signals) {
|
|
28
|
+
const controller = new AbortController();
|
|
29
|
+
const onAbort = () => {
|
|
30
|
+
controller.abort();
|
|
31
|
+
};
|
|
32
|
+
for (const signal of signals) {
|
|
33
|
+
if (signal) {
|
|
34
|
+
signal.addEventListener('abort', onAbort);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return controller.signal;
|
|
38
|
+
}
|
|
39
|
+
export function getRandomNumber(min, max) {
|
|
40
|
+
min = Math.ceil(min);
|
|
41
|
+
max = Math.floor(max);
|
|
42
|
+
return Math.floor(Math.random() * (max - min)) + min;
|
|
43
|
+
}
|
|
44
|
+
export function printActiveHandles() {
|
|
45
|
+
//@ts-ignore
|
|
46
|
+
const handles = process._getActiveHandles();
|
|
47
|
+
//@ts-ignore
|
|
48
|
+
const requests = process._getActiveRequests();
|
|
49
|
+
console.log('Active Handles:', inspect(handles, { depth: 1 }));
|
|
50
|
+
console.log('Active Requests:', inspect(requests, { depth: 1 }));
|
|
51
|
+
}
|
|
52
|
+
export function formatBytesPerSecond(speed) {
|
|
53
|
+
const units = ['B/s', 'KB/s', 'MB/s', 'GB/s', 'TB/s'];
|
|
54
|
+
let unitIndex = 0;
|
|
55
|
+
while (speed >= 1024 && unitIndex < units.length - 1) {
|
|
56
|
+
speed /= 1024;
|
|
57
|
+
unitIndex++;
|
|
58
|
+
}
|
|
59
|
+
return `${speed.toFixed(2)} ${units[unitIndex]}`;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,MAAM,UAAU,aAAa,CAAC,KAAa;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;IACnC,OAAO,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,eAAe,CAAgC,IAAO;IACrE,OAAO,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QACtC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAA;IACrC,CAAC,CAAC,CACG,CAAA;AACP,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC7C,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA;AACzC,CAAC;AAED,SAAS,SAAS,CAAC,MAAc,EAAE,KAAa;IAC/C,+CAA+C;IAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAE7C,yCAAyC;IACzC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAA;IAErE,0BAA0B;IAC1B,mEAAmE;IACnE,kEAAkE;IAClE,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAuC;IACxE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,GAAG,EAAE;QACpB,UAAU,CAAC,KAAK,EAAE,CAAA;IACnB,CAAC,CAAA;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC1C,CAAC;IACF,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,GAAW;IACvD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACpB,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACrB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,kBAAkB;IACjC,YAAY;IACZ,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAA;IAC3C,YAAY;IACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAA;IAE7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC9D,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IACjD,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACrD,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,OAAO,KAAK,IAAI,IAAI,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,KAAK,IAAI,IAAI,CAAA;QACb,SAAS,EAAE,CAAA;IACZ,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,CAAA;AACjD,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { calculateFileChecksum } from '../lib/calculateFileChecksum.js';
|
|
3
|
+
import { resolveModelFileLocation } from '../lib/resolveModelFileLocation.js';
|
|
4
|
+
export async function validateModelFile(config) {
|
|
5
|
+
const fileLocation = resolveModelFileLocation({
|
|
6
|
+
url: config.url,
|
|
7
|
+
filePath: config.location,
|
|
8
|
+
modelsCachePath: config.modelsCachePath,
|
|
9
|
+
});
|
|
10
|
+
if (!fs.existsSync(fileLocation)) {
|
|
11
|
+
return `Model file missing at ${fileLocation}`;
|
|
12
|
+
}
|
|
13
|
+
const hasChecksum = config.sha256 || config.md5;
|
|
14
|
+
let validatedChecksum = false;
|
|
15
|
+
const validateChecksum = async () => {
|
|
16
|
+
if (config.md5) {
|
|
17
|
+
const fileHash = await calculateFileChecksum(fileLocation, 'md5');
|
|
18
|
+
if (fileHash === config.md5) {
|
|
19
|
+
validatedChecksum = true;
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else if (config.sha256) {
|
|
24
|
+
const fileHash = await calculateFileChecksum(fileLocation, 'sha256');
|
|
25
|
+
if (fileHash === config.sha256) {
|
|
26
|
+
validatedChecksum = true;
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
};
|
|
32
|
+
const ipullFile = fileLocation + '.ipull';
|
|
33
|
+
if (fs.existsSync(ipullFile)) {
|
|
34
|
+
// if we have a valid file at the download destination, we can remove the ipull file
|
|
35
|
+
if (hasChecksum) {
|
|
36
|
+
const isValid = await validateChecksum();
|
|
37
|
+
if (isValid) {
|
|
38
|
+
fs.unlinkSync(ipullFile);
|
|
39
|
+
validatedChecksum = true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (!validatedChecksum) {
|
|
43
|
+
return `Model file with incomplete download`;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (!validatedChecksum && hasChecksum) {
|
|
47
|
+
if (config.sha256) {
|
|
48
|
+
const fileHash = await calculateFileChecksum(fileLocation, 'sha256');
|
|
49
|
+
if (fileHash !== config.sha256) {
|
|
50
|
+
return `File sha256 checksum mismatch: expected ${config.sha256} got ${fileHash} at ${fileLocation}`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else if (config.md5) {
|
|
54
|
+
const fileHash = await calculateFileChecksum(fileLocation, 'md5');
|
|
55
|
+
if (fileHash !== config.md5) {
|
|
56
|
+
return `File md5 checksum mismatch: expected ${config.md5} got ${fileHash} at ${fileLocation}`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=validateModelFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateModelFile.js","sourceRoot":"","sources":["../../src/lib/validateModelFile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAA;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAA;AAUnF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAA8B;IACrE,MAAM,YAAY,GAAG,wBAAwB,CAAC;QAC7C,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,eAAe,EAAE,MAAM,CAAC,eAAe;KACvC,CAAC,CAAA;IACF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,OAAO,yBAAyB,YAAY,EAAE,CAAA;IAC/C,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAA;IAC/C,IAAI,iBAAiB,GAAG,KAAK,CAAA;IAC7B,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;QACnC,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;YACjE,IAAI,QAAQ,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;gBAC7B,iBAAiB,GAAG,IAAI,CAAA;gBACxB,OAAO,IAAI,CAAA;YACZ,CAAC;QACF,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;YACpE,IAAI,QAAQ,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChC,iBAAiB,GAAG,IAAI,CAAA;gBACxB,OAAO,IAAI,CAAA;YACZ,CAAC;QACF,CAAC;QACD,OAAO,KAAK,CAAA;IACb,CAAC,CAAA;IACD,MAAM,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAA;IACzC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,oFAAoF;QACpF,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAA;YACxC,IAAI,OAAO,EAAE,CAAC;gBACb,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;gBACxB,iBAAiB,GAAG,IAAI,CAAA;YACzB,CAAC;QACF,CAAC;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACxB,OAAO,qCAAqC,CAAA;QAC7C,CAAC;IACF,CAAC;IAED,IAAI,CAAC,iBAAiB,IAAI,WAAW,EAAE,CAAC;QACvC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;YACpE,IAAI,QAAQ,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChC,OAAO,2CAA2C,MAAM,CAAC,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,CAAA;YACrG,CAAC;QACF,CAAC;aAAM,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;YACjE,IAAI,QAAQ,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;gBAC7B,OAAO,wCAAwC,MAAM,CAAC,GAAG,QAAQ,QAAQ,OAAO,YAAY,EAAE,CAAA;YAC/F,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { builtInEngineNames } from '../engines/index.js';
|
|
2
|
+
const modelIdPattern = /^[a-zA-Z0-9_\-\.]+$/;
|
|
3
|
+
export function validateModelId(id) {
|
|
4
|
+
if (!modelIdPattern.test(id)) {
|
|
5
|
+
throw new Error(`Model "${id}" has invalid name; requires ${modelIdPattern}`);
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export function validateModelOptions(id, modelOptions) {
|
|
9
|
+
validateModelId(id);
|
|
10
|
+
if (!modelOptions.engine) {
|
|
11
|
+
throw new Error(`Model "${id}" must have an engine`);
|
|
12
|
+
}
|
|
13
|
+
const isSourceMissing = !('file' in modelOptions && modelOptions.file) &&
|
|
14
|
+
!modelOptions.url &&
|
|
15
|
+
!modelOptions.location;
|
|
16
|
+
if (builtInEngineNames.includes(modelOptions.engine) && isSourceMissing) {
|
|
17
|
+
throw new Error(`Model "${id}" must have either file or url`);
|
|
18
|
+
}
|
|
19
|
+
if (!modelOptions.task) {
|
|
20
|
+
throw new Error(`Model "${id}" must have a task`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=validateModelOptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateModelOptions.js","sourceRoot":"","sources":["../../src/lib/validateModelOptions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,MAAM,cAAc,GAAG,qBAAqB,CAAA;AAC5C,MAAM,UAAU,eAAe,CAAC,EAAU;IACzC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACd,UAAU,EAAE,gCAAgC,cAAc,EAAE,CAC5D,CAAA;IACF,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CACnC,EAAU,EACV,YAAiC;IAEjC,eAAe,CAAC,EAAE,CAAC,CAAA;IACnB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAA;IACrD,CAAC;IACD,MAAM,eAAe,GACpB,CAAC,CAAC,MAAM,IAAI,YAAY,IAAI,YAAY,CAAC,IAAI,CAAC;QAC9C,CAAC,YAAY,CAAC,GAAG;QACjB,CAAC,YAAY,CAAC,QAAQ,CAAA;IACvB,IAAI,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,gCAAgC,CAAC,CAAA;IAC9D,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAA;IAClD,CAAC;AACF,CAAC"}
|
package/dist/pool.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import PQueue from 'p-queue';
|
|
2
|
+
import EventEmitter3 from 'eventemitter3';
|
|
3
|
+
import { ModelInstance } from './instance.js';
|
|
4
|
+
import { ModelConfig, IncomingRequest, ModelEngine } from './types/index.js';
|
|
5
|
+
import { Logger, LogLevel } from './lib/logger.js';
|
|
6
|
+
export interface ModelInstanceHandle {
|
|
7
|
+
instance: ModelInstance;
|
|
8
|
+
release: () => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
type PrepareModelInstanceCallback = (instance: ModelInstance, signal?: AbortSignal) => Promise<void>;
|
|
11
|
+
interface ModelPoolConfig {
|
|
12
|
+
concurrency: number;
|
|
13
|
+
models: Record<string, ModelConfig>;
|
|
14
|
+
}
|
|
15
|
+
export interface ModelPoolOptions {
|
|
16
|
+
concurrency?: number;
|
|
17
|
+
models: Record<string, ModelConfig>;
|
|
18
|
+
log?: Logger | LogLevel;
|
|
19
|
+
}
|
|
20
|
+
type ModelPoolEvent = 'ready' | 'spawn' | 'release';
|
|
21
|
+
export declare class ModelPool extends EventEmitter3<ModelPoolEvent> {
|
|
22
|
+
queue: PQueue;
|
|
23
|
+
config: ModelPoolConfig;
|
|
24
|
+
instances: Record<string, ModelInstance>;
|
|
25
|
+
private engines?;
|
|
26
|
+
private cleanupInterval?;
|
|
27
|
+
private log;
|
|
28
|
+
private requestSequence;
|
|
29
|
+
private pendingRequests;
|
|
30
|
+
private shutdownController;
|
|
31
|
+
private gpuLock;
|
|
32
|
+
private prepareInstance?;
|
|
33
|
+
constructor(options: ModelPoolOptions, prepareInstance?: PrepareModelInstanceCallback);
|
|
34
|
+
init(engines: Record<string, ModelEngine>): Promise<void>;
|
|
35
|
+
ensureModelInstances(model: ModelConfig): Promise<ModelInstance<unknown>>[];
|
|
36
|
+
dispose(): Promise<void>;
|
|
37
|
+
private disposeOutdatedInstances;
|
|
38
|
+
getStatus(): {
|
|
39
|
+
processing: number;
|
|
40
|
+
pending: number;
|
|
41
|
+
instances: {
|
|
42
|
+
[k: string]: {
|
|
43
|
+
model: string;
|
|
44
|
+
status: "error" | "preparing" | "idle" | "busy" | "loading";
|
|
45
|
+
engine: (string & {}) | import("./engines").BuiltInEngineName;
|
|
46
|
+
device: string;
|
|
47
|
+
contextState: string | undefined;
|
|
48
|
+
lastUsed: string;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
canSpawnInstance(modelId: string): boolean;
|
|
53
|
+
private disposeInstance;
|
|
54
|
+
private spawnInstance;
|
|
55
|
+
private acquireGpuInstance;
|
|
56
|
+
private acquireIdleInstance;
|
|
57
|
+
private acquireInstance;
|
|
58
|
+
private createRequestSequence;
|
|
59
|
+
requestInstance(incomingRequest: IncomingRequest, signal?: AbortSignal): Promise<ModelInstanceHandle>;
|
|
60
|
+
}
|
|
61
|
+
export {};
|