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,594 @@
1
+ import crypto from 'node:crypto';
2
+ import { customAlphabet } from 'nanoid';
3
+ import { calculateContextIdentity } from './lib/calculateContextIdentity.js';
4
+ import { LogLevels, createLogger, withLogMeta, } from './lib/logger.js';
5
+ import { elapsedMillis, mergeAbortSignals } from './lib/util.js';
6
+ const idAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
7
+ const generateId = customAlphabet(idAlphabet, 8);
8
+ export class ModelInstance {
9
+ id;
10
+ status;
11
+ modelId;
12
+ config;
13
+ fingerprint;
14
+ createdAt;
15
+ lastUsed = 0;
16
+ gpu;
17
+ ttl;
18
+ log;
19
+ engine;
20
+ contextIdentity;
21
+ needsContextReset = false;
22
+ engineInstance;
23
+ currentRequest;
24
+ shutdownController;
25
+ constructor(engine, { log, gpu, ...options }) {
26
+ this.modelId = options.id;
27
+ this.id = this.generateInstanceId();
28
+ this.engine = engine;
29
+ this.config = options;
30
+ this.gpu = gpu;
31
+ this.ttl = options.ttl ?? 300;
32
+ this.status = 'preparing';
33
+ this.createdAt = new Date();
34
+ this.log = withLogMeta(log ?? createLogger(LogLevels.warn), {
35
+ instance: this.id,
36
+ });
37
+ this.shutdownController = new AbortController();
38
+ // TODO to implement this properly we should only include what changes the "behavior" of the model
39
+ this.fingerprint = crypto
40
+ .createHash('sha1')
41
+ .update(JSON.stringify(options))
42
+ .digest('hex');
43
+ this.log(LogLevels.info, 'Initializing new instance', {
44
+ model: this.modelId,
45
+ engine: this.config.engine,
46
+ device: this.config.device,
47
+ hasGpuLock: this.gpu,
48
+ });
49
+ }
50
+ generateInstanceId() {
51
+ return this.modelId + ':' + generateId(8);
52
+ }
53
+ generateTaskId() {
54
+ return this.id + '-' + generateId(8);
55
+ }
56
+ async load(signal) {
57
+ if (this.engineInstance) {
58
+ throw new Error('Instance is already loaded');
59
+ }
60
+ this.status = 'loading';
61
+ const loadBegin = process.hrtime.bigint();
62
+ const abortSignal = mergeAbortSignals([
63
+ this.shutdownController.signal,
64
+ signal,
65
+ ]);
66
+ try {
67
+ this.engineInstance = await this.engine.createInstance({
68
+ log: withLogMeta(this.log, {
69
+ instance: this.id,
70
+ }),
71
+ config: {
72
+ ...this.config,
73
+ device: {
74
+ ...this.config.device,
75
+ gpu: this.gpu ? this.config.device?.gpu : false,
76
+ },
77
+ },
78
+ }, abortSignal);
79
+ this.status = 'idle';
80
+ if (this.config.initialMessages?.length) {
81
+ this.contextIdentity = calculateContextIdentity({
82
+ messages: this.config.initialMessages,
83
+ });
84
+ }
85
+ if (this.config.prefix) {
86
+ this.contextIdentity = calculateContextIdentity({
87
+ text: this.config.prefix,
88
+ });
89
+ }
90
+ this.log(LogLevels.debug, 'Instance loaded', {
91
+ elapsed: elapsedMillis(loadBegin),
92
+ });
93
+ }
94
+ catch (error) {
95
+ this.status = 'error';
96
+ this.log(LogLevels.error, 'Failed to load instance:', {
97
+ error,
98
+ });
99
+ throw error;
100
+ }
101
+ }
102
+ dispose() {
103
+ this.status = 'busy';
104
+ if (!this.engineInstance) {
105
+ return Promise.resolve();
106
+ }
107
+ this.shutdownController.abort();
108
+ return this.engine.disposeInstance(this.engineInstance);
109
+ }
110
+ lock(request) {
111
+ if (this.status !== 'idle') {
112
+ throw new Error(`Cannot lock: Instance ${this.id} is not idle`);
113
+ }
114
+ this.currentRequest = request;
115
+ this.status = 'busy';
116
+ }
117
+ unlock() {
118
+ this.status = 'idle';
119
+ this.currentRequest = null;
120
+ }
121
+ resetContext() {
122
+ this.needsContextReset = true;
123
+ }
124
+ getContextStateIdentity() {
125
+ return this.contextIdentity;
126
+ }
127
+ hasContextState() {
128
+ return this.contextIdentity !== undefined;
129
+ }
130
+ matchesContextState(request) {
131
+ if (!this.contextIdentity) {
132
+ return false;
133
+ }
134
+ let incomingContextIdentity = '';
135
+ if ('messages' in request && request.messages?.length) {
136
+ incomingContextIdentity = calculateContextIdentity({
137
+ messages: request.messages,
138
+ dropLastMessage: true,
139
+ });
140
+ }
141
+ else if ('prompt' in request && request.prompt) {
142
+ incomingContextIdentity = calculateContextIdentity({
143
+ text: request.prompt,
144
+ });
145
+ }
146
+ if (!incomingContextIdentity) {
147
+ return false;
148
+ }
149
+ return (this.contextIdentity === incomingContextIdentity ||
150
+ incomingContextIdentity.startsWith(this.contextIdentity));
151
+ }
152
+ matchesRequirements(request) {
153
+ const requiresGpu = !!this.config.device?.gpu && this.config.device?.gpu !== 'auto';
154
+ const modelMatches = this.modelId === request.model;
155
+ const gpuMatches = requiresGpu ? this.gpu : true;
156
+ return modelMatches && gpuMatches;
157
+ }
158
+ createTaskController(args) {
159
+ const cancelController = new AbortController();
160
+ const timeoutController = new AbortController();
161
+ const abortSignals = [
162
+ cancelController.signal,
163
+ this.shutdownController.signal,
164
+ ];
165
+ if (args.signal) {
166
+ abortSignals.push(args.signal);
167
+ }
168
+ let timeout;
169
+ if (args.timeout) {
170
+ timeout = setTimeout(() => {
171
+ timeoutController.abort('timeout');
172
+ }, args.timeout);
173
+ abortSignals.push(timeoutController.signal);
174
+ }
175
+ return {
176
+ cancel: () => {
177
+ cancelController.abort('cancel');
178
+ if (timeout) {
179
+ clearTimeout(timeout);
180
+ }
181
+ },
182
+ complete: () => {
183
+ if (timeout) {
184
+ clearTimeout(timeout);
185
+ }
186
+ },
187
+ signal: mergeAbortSignals(abortSignals),
188
+ timeoutSignal: timeoutController.signal,
189
+ cancelSignal: cancelController.signal,
190
+ };
191
+ }
192
+ processChatCompletionTask(request, options) {
193
+ if (!('processChatCompletionTask' in this.engine)) {
194
+ throw new Error(`Engine "${this.config.engine}" does not implement chat completions`);
195
+ }
196
+ if (!request.messages?.length) {
197
+ throw new Error('Messages are required for chat completions');
198
+ }
199
+ const id = this.generateTaskId();
200
+ this.lastUsed = Date.now();
201
+ const taskLogger = withLogMeta(this.log, {
202
+ sequence: this.currentRequest.sequence,
203
+ task: id,
204
+ });
205
+ // checking if this instance has been flagged for reset
206
+ let resetContext = false;
207
+ if (this.needsContextReset) {
208
+ this.contextIdentity = undefined;
209
+ this.needsContextReset = false;
210
+ resetContext = true;
211
+ }
212
+ const controller = this.createTaskController({
213
+ timeout: options?.timeout,
214
+ signal: options?.signal,
215
+ });
216
+ // start completion processing
217
+ taskLogger(LogLevels.verbose, 'Creating chat completion');
218
+ const taskBegin = process.hrtime.bigint();
219
+ const completionPromise = this.engine.processChatCompletionTask({
220
+ request,
221
+ resetContext,
222
+ config: this.config,
223
+ log: taskLogger,
224
+ onChunk: options?.onChunk,
225
+ }, this.engineInstance, controller.signal)
226
+ .then((result) => {
227
+ if (controller.timeoutSignal.aborted) {
228
+ result.finishReason = 'timeout';
229
+ }
230
+ else if (controller.cancelSignal.aborted) {
231
+ result.finishReason = 'cancel';
232
+ }
233
+ this.contextIdentity = calculateContextIdentity({
234
+ messages: [...request.messages, result.message],
235
+ });
236
+ return result;
237
+ })
238
+ .catch((error) => {
239
+ if (error.name === 'AbortError') {
240
+ const emptyResponse = {
241
+ finishReason: 'abort',
242
+ message: {
243
+ role: 'assistant',
244
+ content: '',
245
+ },
246
+ promptTokens: 0,
247
+ completionTokens: 0,
248
+ contextTokens: 0,
249
+ };
250
+ if (controller.timeoutSignal.aborted) {
251
+ emptyResponse.finishReason = 'timeout';
252
+ return emptyResponse;
253
+ }
254
+ if (controller.cancelSignal.aborted) {
255
+ emptyResponse.finishReason = 'cancel';
256
+ return emptyResponse;
257
+ }
258
+ return emptyResponse;
259
+ }
260
+ taskLogger(LogLevels.error, 'Error while processing task - ', {
261
+ error,
262
+ });
263
+ throw error;
264
+ })
265
+ .finally(() => {
266
+ const elapsedTime = elapsedMillis(taskBegin);
267
+ controller.complete();
268
+ taskLogger(LogLevels.info, 'Chat completion task done', {
269
+ elapsed: elapsedTime,
270
+ });
271
+ });
272
+ return {
273
+ id,
274
+ model: this.modelId,
275
+ createdAt: new Date(),
276
+ result: completionPromise,
277
+ cancel: controller.cancel,
278
+ };
279
+ }
280
+ processTextCompletionTask(request, options) {
281
+ if (!('processTextCompletionTask' in this.engine)) {
282
+ throw new Error(`Engine "${this.config.engine}" does not implement text completion`);
283
+ }
284
+ if (!request.prompt) {
285
+ throw new Error('Prompt is required for text completion');
286
+ }
287
+ this.lastUsed = Date.now();
288
+ const id = this.generateTaskId();
289
+ const taskLogger = withLogMeta(this.log, {
290
+ sequence: this.currentRequest.sequence,
291
+ task: id,
292
+ });
293
+ const controller = this.createTaskController({
294
+ timeout: options?.timeout,
295
+ signal: options?.signal,
296
+ });
297
+ taskLogger(LogLevels.verbose, 'Creating text completion task');
298
+ // pass on resetContext if this instance has been flagged for reset
299
+ let resetContext = false;
300
+ if (this.needsContextReset) {
301
+ this.contextIdentity = undefined;
302
+ this.needsContextReset = false;
303
+ resetContext = true;
304
+ }
305
+ const taskBegin = process.hrtime.bigint();
306
+ const completionPromise = this.engine.processTextCompletionTask({
307
+ request,
308
+ config: this.config,
309
+ resetContext,
310
+ log: taskLogger,
311
+ onChunk: options?.onChunk,
312
+ }, this.engineInstance, controller.signal)
313
+ .then((result) => {
314
+ if (controller.timeoutSignal.aborted) {
315
+ result.finishReason = 'timeout';
316
+ }
317
+ else if (controller.cancelSignal.aborted) {
318
+ result.finishReason = 'cancel';
319
+ }
320
+ this.contextIdentity = calculateContextIdentity({
321
+ text: request.prompt + result.text,
322
+ });
323
+ return result;
324
+ })
325
+ .catch((error) => {
326
+ if (error.name === 'AbortError') {
327
+ const emptyResponse = {
328
+ finishReason: 'abort',
329
+ text: '',
330
+ promptTokens: 0,
331
+ completionTokens: 0,
332
+ contextTokens: 0,
333
+ };
334
+ if (controller.timeoutSignal.aborted) {
335
+ emptyResponse.finishReason = 'timeout';
336
+ return emptyResponse;
337
+ }
338
+ if (controller.cancelSignal.aborted) {
339
+ emptyResponse.finishReason = 'cancel';
340
+ return emptyResponse;
341
+ }
342
+ return emptyResponse;
343
+ }
344
+ taskLogger(LogLevels.error, 'Error while processing task - ', {
345
+ error,
346
+ });
347
+ throw error;
348
+ })
349
+ .finally(() => {
350
+ const elapsedTime = elapsedMillis(taskBegin);
351
+ controller.complete();
352
+ taskLogger(LogLevels.info, 'Text completion task done', {
353
+ elapsed: elapsedTime,
354
+ });
355
+ });
356
+ return {
357
+ id,
358
+ model: this.modelId,
359
+ createdAt: new Date(),
360
+ cancel: controller.cancel,
361
+ result: completionPromise,
362
+ };
363
+ }
364
+ processEmbeddingTask(request, options) {
365
+ if (!('processEmbeddingTask' in this.engine)) {
366
+ throw new Error(`Engine "${this.config.engine}" does not implement embedding`);
367
+ }
368
+ if (!request.input) {
369
+ throw new Error('Input is required for embedding');
370
+ }
371
+ this.lastUsed = Date.now();
372
+ const id = this.generateTaskId();
373
+ const taskLogger = withLogMeta(this.log, {
374
+ sequence: this.currentRequest.sequence,
375
+ task: id,
376
+ });
377
+ const controller = this.createTaskController({
378
+ timeout: options?.timeout,
379
+ signal: options?.signal,
380
+ });
381
+ taskLogger(LogLevels.verbose, 'Creating embedding task');
382
+ const taskBegin = process.hrtime.bigint();
383
+ const result = this.engine.processEmbeddingTask({
384
+ request,
385
+ config: this.config,
386
+ log: taskLogger,
387
+ }, this.engineInstance, controller.signal)
388
+ .then((result) => {
389
+ const timeElapsed = elapsedMillis(taskBegin);
390
+ controller.complete();
391
+ if (controller.timeoutSignal.aborted) {
392
+ taskLogger(LogLevels.warn, 'Embedding task timed out');
393
+ }
394
+ taskLogger(LogLevels.verbose, 'Embedding task done', {
395
+ elapsed: timeElapsed,
396
+ });
397
+ return result;
398
+ })
399
+ .catch((error) => {
400
+ taskLogger(LogLevels.error, 'Task failed - ', {
401
+ error,
402
+ });
403
+ throw error;
404
+ });
405
+ return {
406
+ id,
407
+ model: this.modelId,
408
+ createdAt: new Date(),
409
+ cancel: controller.cancel,
410
+ result,
411
+ };
412
+ }
413
+ processImageToTextTask(request, options) {
414
+ if (!('processImageToTextTask' in this.engine)) {
415
+ throw new Error(`Engine "${this.config.engine}" does not implement image to text`);
416
+ }
417
+ this.lastUsed = Date.now();
418
+ const id = this.generateTaskId();
419
+ const taskLogger = withLogMeta(this.log, {
420
+ sequence: this.currentRequest.sequence,
421
+ task: id,
422
+ });
423
+ const controller = this.createTaskController({
424
+ timeout: options?.timeout,
425
+ signal: options?.signal,
426
+ });
427
+ const taskBegin = process.hrtime.bigint();
428
+ const result = this.engine.processImageToTextTask({
429
+ request,
430
+ config: this.config,
431
+ log: taskLogger,
432
+ }, this.engineInstance, controller.signal)
433
+ .then((result) => {
434
+ const timeElapsed = elapsedMillis(taskBegin);
435
+ controller.complete();
436
+ if (controller.timeoutSignal.aborted) {
437
+ taskLogger(LogLevels.warn, 'ImageToText task timed out');
438
+ }
439
+ taskLogger(LogLevels.verbose, 'ImageToText task done', {
440
+ elapsed: timeElapsed,
441
+ });
442
+ return result;
443
+ })
444
+ .catch((error) => {
445
+ taskLogger(LogLevels.error, 'Task failed - ', {
446
+ error,
447
+ });
448
+ throw error;
449
+ });
450
+ return {
451
+ id,
452
+ model: this.modelId,
453
+ createdAt: new Date(),
454
+ cancel: controller.cancel,
455
+ result,
456
+ };
457
+ }
458
+ processImageToImageTask(request, options) {
459
+ if (!('processImageToImageTask' in this.engine)) {
460
+ throw new Error(`Engine "${this.config.engine}" does not implement image to image`);
461
+ }
462
+ this.lastUsed = Date.now();
463
+ const id = this.generateTaskId();
464
+ const taskLogger = withLogMeta(this.log, {
465
+ sequence: this.currentRequest.sequence,
466
+ task: id,
467
+ });
468
+ const controller = this.createTaskController({
469
+ timeout: options?.timeout,
470
+ signal: options?.signal,
471
+ });
472
+ const taskBegin = process.hrtime.bigint();
473
+ const result = this.engine.processImageToImageTask({
474
+ request,
475
+ config: this.config,
476
+ log: taskLogger,
477
+ }, this.engineInstance, controller.signal)
478
+ .then((result) => {
479
+ const timeElapsed = elapsedMillis(taskBegin);
480
+ controller.complete();
481
+ if (controller.timeoutSignal.aborted) {
482
+ taskLogger(LogLevels.warn, 'ImageToImage task timed out');
483
+ }
484
+ taskLogger(LogLevels.verbose, 'ImageToImage task done', {
485
+ elapsed: timeElapsed,
486
+ });
487
+ return result;
488
+ })
489
+ .catch((error) => {
490
+ taskLogger(LogLevels.error, 'Task failed - ', {
491
+ error,
492
+ });
493
+ throw error;
494
+ });
495
+ return {
496
+ id,
497
+ model: this.modelId,
498
+ createdAt: new Date(),
499
+ cancel: controller.cancel,
500
+ result,
501
+ };
502
+ }
503
+ processSpeechToTextTask(request, options) {
504
+ if (!('processSpeechToTextTask' in this.engine)) {
505
+ throw new Error(`Engine "${this.config.engine}" does not implement speech to text`);
506
+ }
507
+ this.lastUsed = Date.now();
508
+ const id = this.generateTaskId();
509
+ const taskLogger = withLogMeta(this.log, {
510
+ sequence: this.currentRequest.sequence,
511
+ task: id,
512
+ });
513
+ const controller = this.createTaskController({
514
+ timeout: options?.timeout,
515
+ signal: options?.signal,
516
+ });
517
+ const taskBegin = process.hrtime.bigint();
518
+ const result = this.engine.processSpeechToTextTask({
519
+ request,
520
+ config: this.config,
521
+ log: taskLogger,
522
+ }, this.engineInstance, controller.signal)
523
+ .then((result) => {
524
+ const timeElapsed = elapsedMillis(taskBegin);
525
+ controller.complete();
526
+ if (controller.timeoutSignal.aborted) {
527
+ taskLogger(LogLevels.warn, 'SpeechToText task timed out');
528
+ }
529
+ taskLogger(LogLevels.verbose, 'SpeechToText task done', {
530
+ elapsed: timeElapsed,
531
+ });
532
+ return result;
533
+ })
534
+ .catch((error) => {
535
+ taskLogger(LogLevels.error, 'Task failed - ', {
536
+ error,
537
+ });
538
+ throw error;
539
+ });
540
+ return {
541
+ id,
542
+ model: this.modelId,
543
+ createdAt: new Date(),
544
+ cancel: controller.cancel,
545
+ result,
546
+ };
547
+ }
548
+ processTextToImageTask(request, options) {
549
+ if (!('processTextToImageTask' in this.engine)) {
550
+ throw new Error(`Engine "${this.config.engine}" does not implement text to image`);
551
+ }
552
+ this.lastUsed = Date.now();
553
+ const id = this.generateTaskId();
554
+ const taskLogger = withLogMeta(this.log, {
555
+ sequence: this.currentRequest.sequence,
556
+ task: id,
557
+ });
558
+ const controller = this.createTaskController({
559
+ timeout: options?.timeout,
560
+ signal: options?.signal,
561
+ });
562
+ const taskBegin = process.hrtime.bigint();
563
+ const result = this.engine.processTextToImageTask({
564
+ request,
565
+ config: this.config,
566
+ log: taskLogger,
567
+ }, this.engineInstance, controller.signal)
568
+ .then((result) => {
569
+ const timeElapsed = elapsedMillis(taskBegin);
570
+ controller.complete();
571
+ if (controller.timeoutSignal.aborted) {
572
+ taskLogger(LogLevels.warn, 'TextToImage task timed out');
573
+ }
574
+ taskLogger(LogLevels.verbose, 'TextToImage task done', {
575
+ elapsed: timeElapsed,
576
+ });
577
+ return result;
578
+ })
579
+ .catch((error) => {
580
+ taskLogger(LogLevels.error, 'Task failed - ', {
581
+ error,
582
+ });
583
+ throw error;
584
+ });
585
+ return {
586
+ id,
587
+ model: this.modelId,
588
+ createdAt: new Date(),
589
+ cancel: controller.cancel,
590
+ result,
591
+ };
592
+ }
593
+ }
594
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../src/instance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Acquire a lock on a file or directory, creating the resource if it does not exist.
3
+ * @param fileOrDirPath Path to the file or directory to lock.
4
+ * @param signal Abort signal to release the lock.
5
+ * @returns A function that releases the lock.
6
+ */
7
+ export declare function acquireFileLock(fileOrDirPath: string, signal?: AbortSignal): Promise<() => void>;
@@ -0,0 +1,38 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import lockfile from 'proper-lockfile';
4
+ import { touchFileSync } from '../lib/util.js';
5
+ /**
6
+ * Acquire a lock on a file or directory, creating the resource if it does not exist.
7
+ * @param fileOrDirPath Path to the file or directory to lock.
8
+ * @param signal Abort signal to release the lock.
9
+ * @returns A function that releases the lock.
10
+ */
11
+ export function acquireFileLock(fileOrDirPath, signal) {
12
+ const pathInfo = path.parse(fileOrDirPath);
13
+ const looksLikeFile = !!pathInfo.ext;
14
+ const doesExist = fs.existsSync(fileOrDirPath);
15
+ if (looksLikeFile && !doesExist) {
16
+ touchFileSync(fileOrDirPath);
17
+ }
18
+ if (!looksLikeFile && !doesExist) {
19
+ fs.mkdirSync(fileOrDirPath, { recursive: true });
20
+ }
21
+ const isLocked = lockfile.checkSync(fileOrDirPath);
22
+ const lockExists = fs.existsSync(`${fileOrDirPath}.lock`);
23
+ if (!isLocked && lockExists) {
24
+ fs.unlinkSync(`${fileOrDirPath}.lock`);
25
+ }
26
+ return new Promise((resolve, reject) => {
27
+ lockfile.lock(fileOrDirPath, { retries: { forever: true } })
28
+ .then((release) => {
29
+ signal?.addEventListener('abort', release);
30
+ resolve(() => {
31
+ release();
32
+ signal?.removeEventListener('abort', release);
33
+ });
34
+ })
35
+ .catch(reject);
36
+ });
37
+ }
38
+ //# sourceMappingURL=acquireFileLock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acquireFileLock.js","sourceRoot":"","sources":["../../src/lib/acquireFileLock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,QAAQ,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,aAAqB,EAAE,MAAoB;IAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;IAC1C,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAA;IACpC,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;IAC9C,IAAI,aAAa,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,aAAa,CAAC,aAAa,CAAC,CAAA;IAC7B,CAAC;IACD,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS,EAAE,CAAC;QAClC,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACjD,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;IAClD,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,aAAa,OAAO,CAAC,CAAA;IACzD,IAAI,CAAC,QAAQ,IAAI,UAAU,EAAE,CAAC;QAC7B,EAAE,CAAC,UAAU,CAAC,GAAG,aAAa,OAAO,CAAC,CAAA;IACvC,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;aAC3D,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACjB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC1C,OAAO,CAAC,GAAG,EAAE;gBACZ,OAAO,EAAE,CAAA;gBACT,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC9C,CAAC,CAAC,CAAA;QACH,CAAC,CAAC;aACD,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC,CAAC,CAAA;AACH,CAAC"}