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
package/dist/pool.js ADDED
@@ -0,0 +1,512 @@
1
+ import process from 'node:process';
2
+ import PQueue from 'p-queue';
3
+ import EventEmitter3 from 'eventemitter3';
4
+ import { ModelInstance } from './instance.js';
5
+ import { LogLevels, createSublogger, } from './lib/logger.js';
6
+ import { mergeAbortSignals } from './lib/util.js';
7
+ export class ModelPool extends EventEmitter3 {
8
+ queue;
9
+ config;
10
+ instances;
11
+ engines;
12
+ cleanupInterval;
13
+ log;
14
+ requestSequence = 0;
15
+ pendingRequests = new Set();
16
+ shutdownController = new AbortController();
17
+ gpuLock = false; // TODO could derive this from "is there any instance that has gpu=true"
18
+ prepareInstance;
19
+ constructor(options, prepareInstance) {
20
+ super();
21
+ this.log = createSublogger(options.log);
22
+ const models = {};
23
+ for (const id in options.models) {
24
+ const modelConfig = options.models[id];
25
+ models[id] = {
26
+ ...modelConfig,
27
+ id: modelConfig.id ?? id,
28
+ };
29
+ }
30
+ const config = {
31
+ concurrency: 1,
32
+ ...options,
33
+ models,
34
+ };
35
+ this.queue = new PQueue({
36
+ concurrency: config.concurrency,
37
+ });
38
+ this.config = config;
39
+ this.instances = {};
40
+ this.prepareInstance = prepareInstance;
41
+ }
42
+ // start up pool, creating instances and loading models
43
+ async init(engines) {
44
+ const initPromises = [];
45
+ const modelConfigs = this.config.models;
46
+ this.engines = engines;
47
+ // making sure id is set.
48
+ for (const modelId in modelConfigs) {
49
+ const modelConfig = modelConfigs[modelId];
50
+ if (!modelConfig.id) {
51
+ modelConfig.id = modelId;
52
+ }
53
+ }
54
+ // prioritize initializing the first model defined that has gpu explicitly set
55
+ // so lock cant be acquired first by another model that has gpu=auto/undefined
56
+ const firstGpuModel = Object.entries(modelConfigs).find(([id, config]) => !!config.device?.gpu && config.device?.gpu !== 'auto');
57
+ if (firstGpuModel) {
58
+ const modelConfig = modelConfigs[firstGpuModel[0]];
59
+ const spawnPromises = this.ensureModelInstances(modelConfig);
60
+ initPromises.push(...spawnPromises);
61
+ }
62
+ // then handle other models in the order they were defined
63
+ for (const modelId in modelConfigs) {
64
+ if (firstGpuModel && modelId === firstGpuModel[0]) {
65
+ continue;
66
+ }
67
+ const modelConfig = modelConfigs[modelId];
68
+ const spawnPromises = this.ensureModelInstances(modelConfig);
69
+ initPromises.push(...spawnPromises);
70
+ }
71
+ // resolve when all initial instances are loaded
72
+ await Promise.allSettled(initPromises);
73
+ this.emit('ready');
74
+ this.cleanupInterval = setInterval(() => {
75
+ this.disposeOutdatedInstances();
76
+ }, 1000 * 60); // every minute
77
+ }
78
+ // see if the minInstances for a models are spawned. if not, spawn them.
79
+ ensureModelInstances(model) {
80
+ const spawnPromises = [];
81
+ const instanceCount = model.minInstances ?? 0;
82
+ for (let i = 0; i < instanceCount; i++) {
83
+ if (this.canSpawnInstance(model.id)) {
84
+ const spawnPromise = this.spawnInstance(model.id);
85
+ spawnPromises.push(spawnPromise);
86
+ }
87
+ else {
88
+ this.log(LogLevels.warn, 'Failed to spawn min instances for', {
89
+ model: model.id,
90
+ });
91
+ break;
92
+ }
93
+ }
94
+ return spawnPromises;
95
+ }
96
+ async dispose() {
97
+ this.log(LogLevels.debug, 'Disposing pool');
98
+ clearInterval(this.cleanupInterval);
99
+ super.removeAllListeners();
100
+ this.queue.pause();
101
+ this.queue.clear();
102
+ this.shutdownController.abort();
103
+ for (const request of this.pendingRequests) {
104
+ request.abortController.abort();
105
+ }
106
+ const disposePromises = [];
107
+ for (const key in this.instances) {
108
+ const instance = this.instances[key];
109
+ disposePromises.push(this.disposeInstance(instance));
110
+ }
111
+ await Promise.allSettled(disposePromises);
112
+ }
113
+ // disposes instances that have been idle for longer than their ttl
114
+ disposeOutdatedInstances() {
115
+ const now = new Date().getTime();
116
+ for (const key in this.instances) {
117
+ const instance = this.instances[key];
118
+ const instanceAge = (now - instance.lastUsed) / 1000;
119
+ const modelInstanceCount = Object.values(this.instances).filter((i) => i.modelId === instance.modelId).length;
120
+ const minInstanceCount = this.config.models[instance.modelId].minInstances ?? 0;
121
+ if (modelInstanceCount > minInstanceCount &&
122
+ instanceAge > instance.ttl &&
123
+ instance.status === 'idle') {
124
+ this.log(LogLevels.info, 'Auto disposing instance', {
125
+ instance: instance.id,
126
+ });
127
+ this.disposeInstance(instance);
128
+ }
129
+ }
130
+ }
131
+ getStatus() {
132
+ const processingInstances = Object.values(this.instances).filter((instance) => instance.status === 'busy');
133
+ const poolStatusInfo = {
134
+ processing: processingInstances.length,
135
+ pending: this.pendingRequests.size,
136
+ instances: Object.fromEntries(Object.entries(this.instances).map(([key, instance]) => {
137
+ return [
138
+ key,
139
+ {
140
+ model: instance.modelId,
141
+ status: instance.status,
142
+ engine: instance.config.engine,
143
+ device: instance.gpu ? 'gpu' : 'cpu',
144
+ contextState: instance.getContextStateIdentity(),
145
+ lastUsed: new Date(instance.lastUsed).toISOString(),
146
+ },
147
+ ];
148
+ })),
149
+ };
150
+ return poolStatusInfo;
151
+ }
152
+ // checks if another instance can be spawned for given model
153
+ canSpawnInstance(modelId) {
154
+ const modelConfig = this.config.models[modelId];
155
+ // if the model is configured with gpu=true, interpret that as "it MUST run on gpu"
156
+ // and prevent spawning more instances if the gpu is already locked.
157
+ const requiresGpu = !!modelConfig.device?.gpu;
158
+ if (requiresGpu && this.gpuLock && modelConfig.device?.gpu !== 'auto') {
159
+ this.log(LogLevels.debug, 'Cannot spawn new instance: model requires gpu, but its already in use', { model: modelId });
160
+ return false;
161
+ }
162
+ // see if we're within maxInstances limit
163
+ const maxInstances = modelConfig.maxInstances ?? 1;
164
+ const currentInstances = Object.values(this.instances).filter((instance) => instance.modelId === modelId);
165
+ if (currentInstances.length >= maxInstances) {
166
+ this.log(LogLevels.debug, 'Cannot spawn new instance: maxInstances reached', { model: modelId, curent: currentInstances.length, max: maxInstances });
167
+ return false;
168
+ }
169
+ return true;
170
+ }
171
+ async disposeInstance(instance) {
172
+ this.log(LogLevels.debug, 'Disposing instance', {
173
+ instance: instance.id,
174
+ });
175
+ await instance.dispose();
176
+ if (instance.gpu) {
177
+ this.gpuLock = false;
178
+ }
179
+ delete this.instances[instance.id];
180
+ }
181
+ // spawns a new instance for the given model, without checking whether it's allowed
182
+ async spawnInstance(modelId, options = {}) {
183
+ if (!this.engines) {
184
+ throw new Error('No engines available. Make sure the pool is initialized and ModelServer.start() or ModelPool.init() were called.');
185
+ }
186
+ const model = this.config.models[modelId];
187
+ const engine = this.engines[model.engine];
188
+ if (!engine) {
189
+ throw new Error(`Engine not found: ${model.engine}`);
190
+ }
191
+ const autoGpuEnabled = !!engine.autoGpu;
192
+ // if the model is configured with gpu=auto (or unset), we can use the gpu if its not locked
193
+ const autoGpu = model.device?.gpu === undefined || model.device?.gpu === 'auto';
194
+ let useGpu = autoGpu ? autoGpuEnabled && !this.gpuLock : false;
195
+ if (!!model.device?.gpu) {
196
+ useGpu = true;
197
+ }
198
+ const instance = new ModelInstance(engine, {
199
+ ...model,
200
+ gpu: useGpu,
201
+ log: this.log,
202
+ });
203
+ this.instances[instance.id] = instance;
204
+ if (useGpu) {
205
+ this.gpuLock = true;
206
+ }
207
+ const signals = [this.shutdownController.signal];
208
+ if (options.signal) {
209
+ signals.push(options.signal);
210
+ }
211
+ const abortSignal = mergeAbortSignals(signals);
212
+ if (this.prepareInstance) {
213
+ this.log(LogLevels.debug, 'Preparing instance', {
214
+ instance: instance.id,
215
+ });
216
+ try {
217
+ await this.prepareInstance(instance, abortSignal);
218
+ instance.status = 'idle';
219
+ }
220
+ catch (error) {
221
+ this.log(LogLevels.error, 'Error preparing instance', {
222
+ model: modelId,
223
+ instance: instance.id,
224
+ error,
225
+ });
226
+ instance.status = 'error';
227
+ return instance;
228
+ }
229
+ }
230
+ await instance.load(abortSignal);
231
+ if (options.emit !== false) {
232
+ this.emit('spawn', instance);
233
+ }
234
+ return instance;
235
+ }
236
+ // wait to acquire a gpu instance for the given request
237
+ acquireGpuInstance(request, signal) {
238
+ return new Promise(async (resolve, reject) => {
239
+ // if we have an idle gpu instance and the model matches we can lock and return immediately
240
+ const gpuInstance = Object.values(this.instances).find((instance) => instance.gpu === true);
241
+ if (gpuInstance.status === 'idle') {
242
+ if (gpuInstance.modelId === request.model) {
243
+ gpuInstance.lock(request);
244
+ resolve(gpuInstance);
245
+ return;
246
+ }
247
+ else {
248
+ await this.disposeInstance(gpuInstance);
249
+ const newInstance = await this.spawnInstance(request.model, {
250
+ emit: false,
251
+ });
252
+ newInstance.lock(request);
253
+ resolve(newInstance);
254
+ return;
255
+ }
256
+ }
257
+ // otherwise attach the listener and wait until gpu slot becomes available
258
+ const listener = async (instance) => {
259
+ if (instance.gpu === true && instance.status === 'idle') {
260
+ if (instance.matchesRequirements(request)) {
261
+ // model matches whats needed, lock and resolve
262
+ this.off('release', listener);
263
+ instance.lock(request);
264
+ resolve(instance);
265
+ }
266
+ else {
267
+ // model doesnt match, dispose and spawn new instance
268
+ this.off('release', listener);
269
+ await this.disposeInstance(instance);
270
+ const newInstance = await this.spawnInstance(request.model, {
271
+ emit: false,
272
+ });
273
+ newInstance.lock(request);
274
+ resolve(newInstance);
275
+ }
276
+ }
277
+ };
278
+ this.on('release', listener);
279
+ if (signal) {
280
+ signal.addEventListener('abort', () => {
281
+ this.off('release', listener);
282
+ reject(signal.reason);
283
+ });
284
+ }
285
+ });
286
+ }
287
+ // wait to acquire an idle instance for the given request
288
+ acquireIdleInstance(request, signal) {
289
+ return new Promise((resolve, reject) => {
290
+ const listener = (instance) => {
291
+ if (instance.matchesRequirements(request) &&
292
+ instance.status === 'idle') {
293
+ this.off('release', listener);
294
+ this.off('spawn', listener);
295
+ try {
296
+ instance.lock(request);
297
+ resolve(instance);
298
+ }
299
+ catch (error) {
300
+ this.log(LogLevels.error, 'Error acquiring idle instance', {
301
+ error,
302
+ });
303
+ reject(error);
304
+ }
305
+ }
306
+ };
307
+ this.on('spawn', listener);
308
+ this.on('release', listener);
309
+ if (signal) {
310
+ signal.addEventListener('abort', () => {
311
+ this.off('release', listener);
312
+ this.off('spawn', listener);
313
+ reject(signal.reason);
314
+ });
315
+ }
316
+ });
317
+ }
318
+ // acquire an instance for the given request
319
+ async acquireInstance(request, signal) {
320
+ if ('messages' in request || 'prompt' in request) {
321
+ // for text and chat completions first search for an instance that has the context ready
322
+ for (const key in this.instances) {
323
+ const instance = this.instances[key];
324
+ if (instance.matchesRequirements(request) &&
325
+ instance.status === 'idle' &&
326
+ instance.matchesContextState(request)) {
327
+ this.log(LogLevels.debug, 'Cache hit - reusing cached instance', {
328
+ instance: instance.id,
329
+ sequence: request.sequence,
330
+ });
331
+ instance.lock(request);
332
+ return instance;
333
+ }
334
+ }
335
+ this.log(LogLevels.debug, 'Cache miss - continue acquiring model instance', { sequence: request.sequence });
336
+ }
337
+ // prefer an instance of the model that has no context state.
338
+ for (const key in this.instances) {
339
+ const instance = this.instances[key];
340
+ if (instance.matchesRequirements(request) &&
341
+ instance.status === 'idle' &&
342
+ !instance.hasContextState()) {
343
+ this.log(LogLevels.debug, 'Reusing idle instance without context state', {
344
+ instance: instance.id,
345
+ sequence: request.sequence,
346
+ });
347
+ instance.lock(request);
348
+ return instance;
349
+ }
350
+ }
351
+ // still havent found any, see if we're allowed to spawn a new instance
352
+ if (this.canSpawnInstance(request.model)) {
353
+ const instance = await this.spawnInstance(request.model, {
354
+ emit: false,
355
+ });
356
+ // reset the context if the request doesnt match the instances preloaded context state
357
+ const hasInitialContextState = instance.config.initialMessages?.length || instance.config.prefix;
358
+ if (hasInitialContextState && !instance.matchesContextState(request)) {
359
+ instance.resetContext();
360
+ }
361
+ this.log(LogLevels.debug, 'Spawned instance acquired', {
362
+ instance: instance.id,
363
+ sequence: request.sequence,
364
+ });
365
+ instance.lock(request);
366
+ return instance;
367
+ }
368
+ // if all instances have cached state, prefer the one that was used the longest time ago
369
+ const availableInstances = Object.values(this.instances).filter((instance) => instance.matchesRequirements(request) && instance.status === 'idle');
370
+ if (availableInstances.length > 0) {
371
+ const lruInstance = availableInstances.reduce((prev, current) => prev.lastUsed < current.lastUsed ? prev : current);
372
+ this.log(LogLevels.debug, 'Reusing least recently used instance', {
373
+ instance: lruInstance.id,
374
+ sequence: request.sequence,
375
+ });
376
+ lruInstance.lock(request);
377
+ lruInstance.resetContext(); // make sure we reset its cache.
378
+ return lruInstance;
379
+ }
380
+ const requiresGpu = this.config.models[request.model].device?.gpu === true;
381
+ if (requiresGpu && this.gpuLock) {
382
+ const gpuInstance = Object.values(this.instances).find((instance) => instance.gpu === true);
383
+ if (gpuInstance.modelId !== request.model) {
384
+ this.log(LogLevels.debug, 'GPU already in use, waiting ...', {
385
+ sequence: request.sequence,
386
+ });
387
+ const instance = await this.acquireGpuInstance(request, signal);
388
+ this.log(LogLevels.debug, 'GPU instance acquired', {
389
+ instance: instance.id,
390
+ sequence: request.sequence,
391
+ });
392
+ if (signal?.aborted) {
393
+ instance.unlock();
394
+ throw signal.reason;
395
+ }
396
+ else {
397
+ return instance;
398
+ }
399
+ }
400
+ }
401
+ // before starting to wait, make sure sure we're not stuck with an error'd instance (and wait forever)
402
+ // currently instances only enter error state if prepareInstance throws an error
403
+ const errorInstance = Object.values(this.instances).find((instance) => instance.modelId === request.model && instance.status === 'error');
404
+ if (errorInstance) {
405
+ throw new Error('Instance is in error state');
406
+ }
407
+ // wait until an instance of our model is released or spawned
408
+ this.log(LogLevels.debug, 'Awaiting idle instance', {
409
+ model: request.model,
410
+ sequence: request.sequence,
411
+ });
412
+ const instance = await this.acquireIdleInstance(request, signal);
413
+ this.log(LogLevels.debug, 'Idle instance acquired', {
414
+ instance: instance.id,
415
+ sequence: request.sequence,
416
+ });
417
+ if (signal?.aborted) {
418
+ instance.unlock();
419
+ throw signal.reason;
420
+ }
421
+ else {
422
+ return instance;
423
+ }
424
+ }
425
+ createRequestSequence() {
426
+ if (this.requestSequence > 999999) {
427
+ this.requestSequence = 0;
428
+ }
429
+ return ++this.requestSequence;
430
+ }
431
+ // requests a model instance from the pool
432
+ async requestInstance(incomingRequest, signal) {
433
+ if (this.shutdownController.signal.aborted) {
434
+ throw new Error('Pool is disposed');
435
+ }
436
+ const requestSequence = this.createRequestSequence();
437
+ const request = {
438
+ ...incomingRequest,
439
+ sequence: requestSequence,
440
+ abortController: new AbortController(),
441
+ };
442
+ if (!this.config.models[request.model]) {
443
+ this.log(LogLevels.error, `Model not found: ${request.model}`);
444
+ throw new Error(`Model not found: ${request.model}`);
445
+ }
446
+ this.log(LogLevels.info, 'Incoming request', {
447
+ model: request.model,
448
+ sequence: request.sequence,
449
+ });
450
+ this.pendingRequests.add(request);
451
+ const abortSignal = mergeAbortSignals([
452
+ request.abortController.signal,
453
+ signal,
454
+ ]);
455
+ abortSignal.addEventListener('abort', () => {
456
+ this.log(LogLevels.info, 'Request aborted', {
457
+ model: request.model,
458
+ sequence: request.sequence,
459
+ });
460
+ this.pendingRequests.delete(request);
461
+ });
462
+ const instance = await this.acquireInstance(request, abortSignal);
463
+ // once instance is acquired & locked, we can pass it on to the caller
464
+ // the queue task promise will be forwarded as releaseInstance
465
+ let resolveQueueTask = () => { };
466
+ this.queue
467
+ .add(() => {
468
+ this.pendingRequests.delete(request);
469
+ return new Promise((resolve, reject) => {
470
+ resolveQueueTask = resolve;
471
+ });
472
+ })
473
+ .then((task) => {
474
+ // if there are more requests waiting, prioritize handling them before spawning new instances
475
+ // deferred to avoid AbortError when the pool is disposed right after the operation
476
+ process.nextTick(() => {
477
+ if (!this.pendingRequests.size &&
478
+ this.canSpawnInstance(request.model) &&
479
+ !this.shutdownController.signal.aborted) {
480
+ this.spawnInstance(request.model);
481
+ }
482
+ });
483
+ if (task?.instance) {
484
+ this.emit('release', instance);
485
+ }
486
+ });
487
+ // TODO what if user never calls release? automatically resolve or reject after a timeout?
488
+ const releaseInstance = () => {
489
+ return new Promise((resolve, reject) => {
490
+ process.nextTick(() => {
491
+ resolveQueueTask({ instance, request });
492
+ this.log(LogLevels.info, 'Task completed, releasing', {
493
+ instance: instance.id,
494
+ sequence: request.sequence,
495
+ });
496
+ if (instance.config.ttl === 0) {
497
+ this.disposeInstance(instance);
498
+ }
499
+ else {
500
+ instance.unlock();
501
+ }
502
+ resolve();
503
+ });
504
+ });
505
+ };
506
+ return {
507
+ instance,
508
+ release: releaseInstance,
509
+ };
510
+ }
511
+ }
512
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { ModelPool } from './pool.js';
2
+ import { ModelStore } from './store.js';
3
+ import { ModelOptions, IncomingRequest, CompletionProcessingOptions, ChatCompletionRequest, EmbeddingRequest, ProcessingOptions, TextCompletionRequest, ModelEngine, ImageToTextRequest, SpeechToTextRequest, SpeechToTextProcessingOptions, TextToImageRequest, ImageToImageRequest } from './types/index.js';
4
+ import { Logger, LogLevel } from './lib/logger.js';
5
+ export interface ModelServerOptions {
6
+ engines?: Record<string, ModelEngine>;
7
+ models: Record<string, ModelOptions>;
8
+ concurrency?: number;
9
+ cachePath?: string;
10
+ log?: Logger | LogLevel;
11
+ }
12
+ export declare function startModelServer(options: ModelServerOptions): ModelServer;
13
+ export declare class ModelServer {
14
+ pool: ModelPool;
15
+ store: ModelStore;
16
+ engines: Record<string, ModelEngine>;
17
+ log: Logger;
18
+ constructor(options: ModelServerOptions);
19
+ modelExists(modelId: string): boolean;
20
+ start(): Promise<void>;
21
+ stop(): Promise<void>;
22
+ requestInstance(request: IncomingRequest, signal?: AbortSignal): Promise<import("./pool.js").ModelInstanceHandle>;
23
+ private prepareInstance;
24
+ processChatCompletionTask(args: ChatCompletionRequest, options?: CompletionProcessingOptions): Promise<import("./types/index.js").EngineChatCompletionResult>;
25
+ processTextCompletionTask(args: TextCompletionRequest, options?: CompletionProcessingOptions): Promise<import("./types/index.js").EngineTextCompletionResult>;
26
+ processEmbeddingTask(args: EmbeddingRequest, options?: ProcessingOptions): Promise<import("./types/index.js").EngineEmbeddingResult>;
27
+ processImageToTextTask(args: ImageToTextRequest, options?: ProcessingOptions): Promise<import("./types/index.js").EngineImageToTextResult>;
28
+ processSpeechToTextTask(args: SpeechToTextRequest, options?: SpeechToTextProcessingOptions): Promise<import("./types/index.js").EngineSpeechToTextResult>;
29
+ processTextToImageTask(args: TextToImageRequest, options?: ProcessingOptions): Promise<import("./types/index.js").EngineTextToImageResult>;
30
+ processImageToImageTask(args: ImageToImageRequest, options?: ProcessingOptions): Promise<import("./types/index.js").EngineImageToImageResult>;
31
+ getStatus(): {
32
+ pool: {
33
+ processing: number;
34
+ pending: number;
35
+ instances: {
36
+ [k: string]: {
37
+ model: string;
38
+ status: "error" | "preparing" | "idle" | "busy" | "loading";
39
+ engine: (string & {}) | import("./engines/index.js").BuiltInEngineName;
40
+ device: string;
41
+ contextState: string | undefined;
42
+ lastUsed: string;
43
+ };
44
+ };
45
+ };
46
+ store: {
47
+ [k: string]: {
48
+ engine: (string & {}) | import("./engines/index.js").BuiltInEngineName;
49
+ device: {
50
+ gpu?: boolean | "auto" | (string & {});
51
+ } | undefined;
52
+ minInstances: number;
53
+ maxInstances: number;
54
+ status: "error" | "unloaded" | "preparing" | "ready";
55
+ downloads: any;
56
+ };
57
+ };
58
+ };
59
+ }