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.
Files changed (227) hide show
  1. package/README.md +216 -0
  2. package/dist/api/openai/enums.d.ts +4 -0
  3. package/dist/api/openai/enums.js +17 -0
  4. package/dist/api/openai/enums.js.map +1 -0
  5. package/dist/api/openai/handlers/chat.d.ts +3 -0
  6. package/dist/api/openai/handlers/chat.js +358 -0
  7. package/dist/api/openai/handlers/chat.js.map +1 -0
  8. package/dist/api/openai/handlers/completions.d.ts +3 -0
  9. package/dist/api/openai/handlers/completions.js +169 -0
  10. package/dist/api/openai/handlers/completions.js.map +1 -0
  11. package/dist/api/openai/handlers/embeddings.d.ts +3 -0
  12. package/dist/api/openai/handlers/embeddings.js +74 -0
  13. package/dist/api/openai/handlers/embeddings.js.map +1 -0
  14. package/dist/api/openai/handlers/images.d.ts +0 -0
  15. package/dist/api/openai/handlers/images.js +4 -0
  16. package/dist/api/openai/handlers/images.js.map +1 -0
  17. package/dist/api/openai/handlers/models.d.ts +3 -0
  18. package/dist/api/openai/handlers/models.js +23 -0
  19. package/dist/api/openai/handlers/models.js.map +1 -0
  20. package/dist/api/openai/handlers/transcription.d.ts +0 -0
  21. package/dist/api/openai/handlers/transcription.js +4 -0
  22. package/dist/api/openai/handlers/transcription.js.map +1 -0
  23. package/dist/api/openai/index.d.ts +7 -0
  24. package/dist/api/openai/index.js +14 -0
  25. package/dist/api/openai/index.js.map +1 -0
  26. package/dist/api/parseJSONRequestBody.d.ts +2 -0
  27. package/dist/api/parseJSONRequestBody.js +24 -0
  28. package/dist/api/parseJSONRequestBody.js.map +1 -0
  29. package/dist/api/v1/index.d.ts +2 -0
  30. package/dist/api/v1/index.js +29 -0
  31. package/dist/api/v1/index.js.map +1 -0
  32. package/dist/cli.d.ts +1 -0
  33. package/dist/cli.js +10 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/engines/gpt4all/engine.d.ts +34 -0
  36. package/dist/engines/gpt4all/engine.js +357 -0
  37. package/dist/engines/gpt4all/engine.js.map +1 -0
  38. package/dist/engines/gpt4all/util.d.ts +3 -0
  39. package/dist/engines/gpt4all/util.js +29 -0
  40. package/dist/engines/gpt4all/util.js.map +1 -0
  41. package/dist/engines/index.d.ts +19 -0
  42. package/dist/engines/index.js +21 -0
  43. package/dist/engines/index.js.map +1 -0
  44. package/dist/engines/node-llama-cpp/engine.d.ts +49 -0
  45. package/dist/engines/node-llama-cpp/engine.js +666 -0
  46. package/dist/engines/node-llama-cpp/engine.js.map +1 -0
  47. package/dist/engines/node-llama-cpp/types.d.ts +13 -0
  48. package/dist/engines/node-llama-cpp/types.js +2 -0
  49. package/dist/engines/node-llama-cpp/types.js.map +1 -0
  50. package/dist/engines/node-llama-cpp/util.d.ts +15 -0
  51. package/dist/engines/node-llama-cpp/util.js +84 -0
  52. package/dist/engines/node-llama-cpp/util.js.map +1 -0
  53. package/dist/engines/node-llama-cpp/validateModelFile.d.ts +8 -0
  54. package/dist/engines/node-llama-cpp/validateModelFile.js +36 -0
  55. package/dist/engines/node-llama-cpp/validateModelFile.js.map +1 -0
  56. package/dist/engines/stable-diffusion-cpp/engine.d.ts +90 -0
  57. package/dist/engines/stable-diffusion-cpp/engine.js +294 -0
  58. package/dist/engines/stable-diffusion-cpp/engine.js.map +1 -0
  59. package/dist/engines/stable-diffusion-cpp/types.d.ts +3 -0
  60. package/dist/engines/stable-diffusion-cpp/types.js +2 -0
  61. package/dist/engines/stable-diffusion-cpp/types.js.map +1 -0
  62. package/dist/engines/stable-diffusion-cpp/util.d.ts +4 -0
  63. package/dist/engines/stable-diffusion-cpp/util.js +55 -0
  64. package/dist/engines/stable-diffusion-cpp/util.js.map +1 -0
  65. package/dist/engines/stable-diffusion-cpp/validateModelFiles.d.ts +19 -0
  66. package/dist/engines/stable-diffusion-cpp/validateModelFiles.js +91 -0
  67. package/dist/engines/stable-diffusion-cpp/validateModelFiles.js.map +1 -0
  68. package/dist/engines/transformers-js/engine.d.ts +37 -0
  69. package/dist/engines/transformers-js/engine.js +538 -0
  70. package/dist/engines/transformers-js/engine.js.map +1 -0
  71. package/dist/engines/transformers-js/types.d.ts +7 -0
  72. package/dist/engines/transformers-js/types.js +2 -0
  73. package/dist/engines/transformers-js/types.js.map +1 -0
  74. package/dist/engines/transformers-js/util.d.ts +7 -0
  75. package/dist/engines/transformers-js/util.js +36 -0
  76. package/dist/engines/transformers-js/util.js.map +1 -0
  77. package/dist/engines/transformers-js/validateModelFiles.d.ts +17 -0
  78. package/dist/engines/transformers-js/validateModelFiles.js +133 -0
  79. package/dist/engines/transformers-js/validateModelFiles.js.map +1 -0
  80. package/dist/experiments/ChatWithVision.d.ts +11 -0
  81. package/dist/experiments/ChatWithVision.js +91 -0
  82. package/dist/experiments/ChatWithVision.js.map +1 -0
  83. package/dist/experiments/StableDiffPromptGenerator.d.ts +0 -0
  84. package/dist/experiments/StableDiffPromptGenerator.js +4 -0
  85. package/dist/experiments/StableDiffPromptGenerator.js.map +1 -0
  86. package/dist/experiments/VoiceFunctionCall.d.ts +18 -0
  87. package/dist/experiments/VoiceFunctionCall.js +51 -0
  88. package/dist/experiments/VoiceFunctionCall.js.map +1 -0
  89. package/dist/http.d.ts +19 -0
  90. package/dist/http.js +54 -0
  91. package/dist/http.js.map +1 -0
  92. package/dist/index.d.ts +7 -0
  93. package/dist/index.js +8 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/instance.d.ts +88 -0
  96. package/dist/instance.js +594 -0
  97. package/dist/instance.js.map +1 -0
  98. package/dist/lib/acquireFileLock.d.ts +7 -0
  99. package/dist/lib/acquireFileLock.js +38 -0
  100. package/dist/lib/acquireFileLock.js.map +1 -0
  101. package/dist/lib/calculateContextIdentity.d.ts +7 -0
  102. package/dist/lib/calculateContextIdentity.js +39 -0
  103. package/dist/lib/calculateContextIdentity.js.map +1 -0
  104. package/dist/lib/calculateFileChecksum.d.ts +1 -0
  105. package/dist/lib/calculateFileChecksum.js +16 -0
  106. package/dist/lib/calculateFileChecksum.js.map +1 -0
  107. package/dist/lib/copyDirectory.d.ts +6 -0
  108. package/dist/lib/copyDirectory.js +27 -0
  109. package/dist/lib/copyDirectory.js.map +1 -0
  110. package/dist/lib/decodeAudio.d.ts +1 -0
  111. package/dist/lib/decodeAudio.js +26 -0
  112. package/dist/lib/decodeAudio.js.map +1 -0
  113. package/dist/lib/downloadModelFile.d.ts +10 -0
  114. package/dist/lib/downloadModelFile.js +58 -0
  115. package/dist/lib/downloadModelFile.js.map +1 -0
  116. package/dist/lib/flattenMessageTextContent.d.ts +2 -0
  117. package/dist/lib/flattenMessageTextContent.js +11 -0
  118. package/dist/lib/flattenMessageTextContent.js.map +1 -0
  119. package/dist/lib/getCacheDirPath.d.ts +12 -0
  120. package/dist/lib/getCacheDirPath.js +31 -0
  121. package/dist/lib/getCacheDirPath.js.map +1 -0
  122. package/dist/lib/loadImage.d.ts +12 -0
  123. package/dist/lib/loadImage.js +30 -0
  124. package/dist/lib/loadImage.js.map +1 -0
  125. package/dist/lib/logger.d.ts +12 -0
  126. package/dist/lib/logger.js +98 -0
  127. package/dist/lib/logger.js.map +1 -0
  128. package/dist/lib/math.d.ts +7 -0
  129. package/dist/lib/math.js +30 -0
  130. package/dist/lib/math.js.map +1 -0
  131. package/dist/lib/resolveModelFileLocation.d.ts +15 -0
  132. package/dist/lib/resolveModelFileLocation.js +41 -0
  133. package/dist/lib/resolveModelFileLocation.js.map +1 -0
  134. package/dist/lib/util.d.ts +7 -0
  135. package/dist/lib/util.js +61 -0
  136. package/dist/lib/util.js.map +1 -0
  137. package/dist/lib/validateModelFile.d.ts +9 -0
  138. package/dist/lib/validateModelFile.js +62 -0
  139. package/dist/lib/validateModelFile.js.map +1 -0
  140. package/dist/lib/validateModelOptions.d.ts +3 -0
  141. package/dist/lib/validateModelOptions.js +23 -0
  142. package/dist/lib/validateModelOptions.js.map +1 -0
  143. package/dist/pool.d.ts +61 -0
  144. package/dist/pool.js +512 -0
  145. package/dist/pool.js.map +1 -0
  146. package/dist/server.d.ts +59 -0
  147. package/dist/server.js +221 -0
  148. package/dist/server.js.map +1 -0
  149. package/dist/standalone.d.ts +1 -0
  150. package/dist/standalone.js +306 -0
  151. package/dist/standalone.js.map +1 -0
  152. package/dist/store.d.ts +60 -0
  153. package/dist/store.js +203 -0
  154. package/dist/store.js.map +1 -0
  155. package/dist/types/completions.d.ts +57 -0
  156. package/dist/types/completions.js +2 -0
  157. package/dist/types/completions.js.map +1 -0
  158. package/dist/types/index.d.ts +326 -0
  159. package/dist/types/index.js +2 -0
  160. package/dist/types/index.js.map +1 -0
  161. package/docs/engines.md +28 -0
  162. package/docs/gpu.md +72 -0
  163. package/docs/http-api.md +147 -0
  164. package/examples/all-options.js +108 -0
  165. package/examples/chat-cli.js +56 -0
  166. package/examples/chat-server.js +65 -0
  167. package/examples/concurrency.js +70 -0
  168. package/examples/express.js +70 -0
  169. package/examples/pool.js +91 -0
  170. package/package.json +113 -0
  171. package/src/api/openai/enums.ts +20 -0
  172. package/src/api/openai/handlers/chat.ts +408 -0
  173. package/src/api/openai/handlers/completions.ts +196 -0
  174. package/src/api/openai/handlers/embeddings.ts +92 -0
  175. package/src/api/openai/handlers/images.ts +3 -0
  176. package/src/api/openai/handlers/models.ts +33 -0
  177. package/src/api/openai/handlers/transcription.ts +2 -0
  178. package/src/api/openai/index.ts +16 -0
  179. package/src/api/parseJSONRequestBody.ts +26 -0
  180. package/src/api/v1/DRAFT.md +16 -0
  181. package/src/api/v1/index.ts +37 -0
  182. package/src/cli.ts +9 -0
  183. package/src/engines/gpt4all/engine.ts +441 -0
  184. package/src/engines/gpt4all/util.ts +31 -0
  185. package/src/engines/index.ts +28 -0
  186. package/src/engines/node-llama-cpp/engine.ts +811 -0
  187. package/src/engines/node-llama-cpp/types.ts +17 -0
  188. package/src/engines/node-llama-cpp/util.ts +126 -0
  189. package/src/engines/node-llama-cpp/validateModelFile.ts +46 -0
  190. package/src/engines/stable-diffusion-cpp/engine.ts +369 -0
  191. package/src/engines/stable-diffusion-cpp/types.ts +54 -0
  192. package/src/engines/stable-diffusion-cpp/util.ts +58 -0
  193. package/src/engines/stable-diffusion-cpp/validateModelFiles.ts +119 -0
  194. package/src/engines/transformers-js/engine.ts +659 -0
  195. package/src/engines/transformers-js/types.ts +25 -0
  196. package/src/engines/transformers-js/util.ts +40 -0
  197. package/src/engines/transformers-js/validateModelFiles.ts +168 -0
  198. package/src/experiments/ChatWithVision.ts +103 -0
  199. package/src/experiments/StableDiffPromptGenerator.ts +2 -0
  200. package/src/experiments/VoiceFunctionCall.ts +71 -0
  201. package/src/http.ts +72 -0
  202. package/src/index.ts +7 -0
  203. package/src/instance.ts +723 -0
  204. package/src/lib/acquireFileLock.ts +38 -0
  205. package/src/lib/calculateContextIdentity.ts +53 -0
  206. package/src/lib/calculateFileChecksum.ts +18 -0
  207. package/src/lib/copyDirectory.ts +29 -0
  208. package/src/lib/decodeAudio.ts +39 -0
  209. package/src/lib/downloadModelFile.ts +70 -0
  210. package/src/lib/flattenMessageTextContent.ts +19 -0
  211. package/src/lib/getCacheDirPath.ts +34 -0
  212. package/src/lib/loadImage.ts +46 -0
  213. package/src/lib/logger.ts +112 -0
  214. package/src/lib/math.ts +31 -0
  215. package/src/lib/resolveModelFileLocation.ts +49 -0
  216. package/src/lib/util.ts +75 -0
  217. package/src/lib/validateModelFile.ts +71 -0
  218. package/src/lib/validateModelOptions.ts +31 -0
  219. package/src/pool.ts +651 -0
  220. package/src/server.ts +270 -0
  221. package/src/standalone.ts +320 -0
  222. package/src/store.ts +278 -0
  223. package/src/types/completions.ts +86 -0
  224. package/src/types/index.ts +488 -0
  225. package/tsconfig.json +29 -0
  226. package/tsconfig.release.json +11 -0
  227. package/vitest.config.ts +18 -0
@@ -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":"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"}
@@ -0,0 +1,9 @@
1
+ interface ValidatableModelConfig {
2
+ url?: string;
3
+ location?: string;
4
+ modelsCachePath: string;
5
+ sha256?: string;
6
+ md5?: string;
7
+ }
8
+ export declare function validateModelFile(config: ValidatableModelConfig): Promise<string | undefined>;
9
+ export {};
@@ -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,3 @@
1
+ import { BuiltInModelOptions } from '../types/index.js';
2
+ export declare function validateModelId(id: string): void;
3
+ export declare function validateModelOptions(id: string, modelOptions: BuiltInModelOptions): void;
@@ -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 {};