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/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
|
package/dist/pool.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,aAAa,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAOpD,OAAO,EAEN,SAAS,EACT,eAAe,GAEf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AA8BxD,MAAM,OAAO,SAAU,SAAQ,aAA6B;IAC3D,KAAK,CAAQ;IACb,MAAM,CAAiB;IACvB,SAAS,CAA+B;IAChC,OAAO,CAA8B;IACrC,eAAe,CAAiB;IAChC,GAAG,CAAQ;IACX,eAAe,GAAW,CAAC,CAAA;IAC3B,eAAe,GAA8B,IAAI,GAAG,EAAE,CAAA;IACtD,kBAAkB,GAAoB,IAAI,eAAe,EAAE,CAAA;IAC3D,OAAO,GAAY,KAAK,CAAA,CAAC,wEAAwE;IACjG,eAAe,CAA+B;IAEtD,YACC,OAAyB,EACzB,eAA8C;QAE9C,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACvC,MAAM,MAAM,GAAgC,EAAE,CAAA;QAC9C,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACtC,MAAM,CAAC,EAAE,CAAC,GAAG;gBACZ,GAAG,WAAW;gBACd,EAAE,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE;aACxB,CAAA;QACF,CAAC;QACD,MAAM,MAAM,GAAoB;YAC/B,WAAW,EAAE,CAAC;YACd,GAAG,OAAO;YACV,MAAM;SACN,CAAA;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;SAC/B,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QACnB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;IACvC,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,IAAI,CAAC,OAAoC;QAC9C,MAAM,YAAY,GAAG,EAAE,CAAA;QACvB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,yBAAyB;QACzB,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACpC,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;YACzC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;gBACrB,WAAW,CAAC,EAAE,GAAG,OAAO,CAAA;YACzB,CAAC;QACF,CAAC;QAED,8EAA8E;QAC9E,8EAA8E;QAC9E,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CACtD,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CACvE,CAAA;QACD,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,WAAW,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;YAClD,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAA;YAC5D,YAAY,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAA;QACpC,CAAC;QAED,0DAA0D;QAC1D,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,aAAa,IAAI,OAAO,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,SAAQ;YACT,CAAC;YACD,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;YACzC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAA;YAC5D,YAAY,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAA;QACpC,CAAC;QAED,gDAAgD;QAChD,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAClB,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,wBAAwB,EAAE,CAAA;QAChC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA,CAAC,eAAe;IAC9B,CAAC;IAED,wEAAwE;IACxE,oBAAoB,CAAC,KAAkB;QACtC,MAAM,aAAa,GAAG,EAAE,CAAA;QACxB,MAAM,aAAa,GAAG,KAAK,CAAC,YAAY,IAAI,CAAC,CAAA;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBACrC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBACjD,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YACjC,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,mCAAmC,EAAE;oBAC7D,KAAK,EAAE,KAAK,CAAC,EAAE;iBACf,CAAC,CAAA;gBACF,MAAK;YACN,CAAC;QACF,CAAC;QACD,OAAO,aAAa,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAA;QAC3C,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACnC,KAAK,CAAC,kBAAkB,EAAE,CAAA;QAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAClB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QAClB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAA;QAC/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;QAChC,CAAC;QACD,MAAM,eAAe,GAAyB,EAAE,CAAA;QAChD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YACpC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAA;QACrD,CAAC;QACD,MAAM,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;IAC1C,CAAC;IAED,mEAAmE;IAC3D,wBAAwB;QAC/B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;QAChC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YACpC,MAAM,WAAW,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAA;YACpD,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAC9D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CACrC,CAAC,MAAM,CAAA;YACR,MAAM,gBAAgB,GACrB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAY,IAAI,CAAC,CAAA;YACvD,IACC,kBAAkB,GAAG,gBAAgB;gBACrC,WAAW,GAAG,QAAQ,CAAC,GAAG;gBAC1B,QAAQ,CAAC,MAAM,KAAK,MAAM,EACzB,CAAC;gBACF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,yBAAyB,EAAE;oBACnD,QAAQ,EAAE,QAAQ,CAAC,EAAE;iBACrB,CAAC,CAAA;gBACF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;YAC/B,CAAC;QACF,CAAC;IACF,CAAC;IAED,SAAS;QACR,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAC/D,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,MAAM,CACxC,CAAA;QACD,MAAM,cAAc,GAAG;YACtB,UAAU,EAAE,mBAAmB,CAAC,MAAM;YACtC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI;YAClC,SAAS,EAAE,MAAM,CAAC,WAAW,CAC5B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE;gBACtD,OAAO;oBACN,GAAG;oBACH;wBACC,KAAK,EAAE,QAAQ,CAAC,OAAO;wBACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;wBAC9B,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;wBACpC,YAAY,EAAE,QAAQ,CAAC,uBAAuB,EAAE;wBAChD,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;qBACnD;iBACD,CAAA;YACF,CAAC,CAAC,CACF;SACD,CAAA;QACD,OAAO,cAAc,CAAA;IACtB,CAAC;IAED,4DAA4D;IAC5D,gBAAgB,CAAC,OAAe;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC/C,mFAAmF;QACnF,oEAAoE;QACpE,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAA;QAC7C,IAAI,WAAW,IAAI,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,EAAE,CAAC;YACvE,IAAI,CAAC,GAAG,CACP,SAAS,CAAC,KAAK,EACf,uEAAuE,EACvE,EAAE,KAAK,EAAE,OAAO,EAAE,CAClB,CAAA;YACD,OAAO,KAAK,CAAA;QACb,CAAC;QACD,yCAAyC;QACzC,MAAM,YAAY,GAAG,WAAW,CAAC,YAAY,IAAI,CAAC,CAAA;QAClD,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAC5D,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,KAAK,OAAO,CAC1C,CAAA;QACD,IAAI,gBAAgB,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;YAC7C,IAAI,CAAC,GAAG,CACP,SAAS,CAAC,KAAK,EACf,iDAAiD,EACjD,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,CACtE,CAAA;YACD,OAAO,KAAK,CAAA;QACb,CAAC;QACD,OAAO,IAAI,CAAA;IACZ,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,QAAuB;QACpD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,oBAAoB,EAAE;YAC/C,QAAQ,EAAE,QAAQ,CAAC,EAAE;SACrB,CAAC,CAAA;QACF,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAA;QACxB,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC;IAED,mFAAmF;IAC3E,KAAK,CAAC,aAAa,CAC1B,OAAe,EACf,UAAoD,EAAE;QAEtD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACd,kHAAkH,CAClH,CAAA;QACF,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;QACrD,CAAC;QACD,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAA;QAEvC,4FAA4F;QAC5F,MAAM,OAAO,GACZ,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAA;QAChE,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;QAE9D,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;YACzB,MAAM,GAAG,IAAI,CAAA;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE;YAC1C,GAAG,KAAK;YACR,GAAG,EAAE,MAAM;YACX,GAAG,EAAE,IAAI,CAAC,GAAG;SACb,CAAC,CAAA;QACF,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAA;QAEtC,IAAI,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACpB,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAChD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC;QACD,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAA;QAC9C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,oBAAoB,EAAE;gBAC/C,QAAQ,EAAE,QAAQ,CAAC,EAAE;aACrB,CAAC,CAAA;YACF,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;gBACjD,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAA;YACzB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,0BAA0B,EAAE;oBACrD,KAAK,EAAE,OAAO;oBACd,QAAQ,EAAE,QAAQ,CAAC,EAAE;oBACrB,KAAK;iBACL,CAAC,CAAA;gBACF,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAA;gBACzB,OAAO,QAAQ,CAAA;YAChB,CAAC;QACF,CAAC;QACD,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAC7B,CAAC;QACD,OAAO,QAAQ,CAAA;IAChB,CAAC;IAED,uDAAuD;IAC/C,kBAAkB,CACzB,OAA6B,EAC7B,MAAoB;QAEpB,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YAC5C,2FAA2F;YAC3F,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CACrD,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,IAAI,CAClC,CAAA;YACF,IAAI,WAAW,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACnC,IAAI,WAAW,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;oBAC3C,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBACzB,OAAO,CAAC,WAAW,CAAC,CAAA;oBACpB,OAAM;gBACP,CAAC;qBAAM,CAAC;oBACP,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAA;oBAEvC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE;wBAC3D,IAAI,EAAE,KAAK;qBACX,CAAC,CAAA;oBACF,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBACzB,OAAO,CAAC,WAAW,CAAC,CAAA;oBACpB,OAAM;gBACP,CAAC;YACF,CAAC;YAED,0EAA0E;YAC1E,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAuB,EAAE,EAAE;gBAClD,IAAI,QAAQ,CAAC,GAAG,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBACzD,IAAI,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC3C,+CAA+C;wBAC/C,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;wBAC7B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;wBACtB,OAAO,CAAC,QAAQ,CAAC,CAAA;oBAClB,CAAC;yBAAM,CAAC;wBACP,qDAAqD;wBACrD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;wBAC7B,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;wBACpC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE;4BAC3D,IAAI,EAAE,KAAK;yBACX,CAAC,CAAA;wBACF,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;wBACzB,OAAO,CAAC,WAAW,CAAC,CAAA;oBACrB,CAAC;gBACF,CAAC;YACF,CAAC,CAAA;YACD,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;YAC5B,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBACrC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;oBAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBACtB,CAAC,CAAC,CAAA;YACH,CAAC;QACF,CAAC,CAAC,CAAA;IACH,CAAC;IAED,yDAAyD;IACjD,mBAAmB,CAC1B,OAA6B,EAC7B,MAAoB;QAEpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtC,MAAM,QAAQ,GAAG,CAAC,QAAuB,EAAE,EAAE;gBAC5C,IACC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC;oBACrC,QAAQ,CAAC,MAAM,KAAK,MAAM,EACzB,CAAC;oBACF,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;oBAC7B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;oBAC3B,IAAI,CAAC;wBACJ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;wBACtB,OAAO,CAAC,QAAQ,CAAC,CAAA;oBAClB,CAAC;oBAAC,OAAO,KAAU,EAAE,CAAC;wBACrB,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,+BAA+B,EAAE;4BAC1D,KAAK;yBACL,CAAC,CAAA;wBACF,MAAM,CAAC,KAAK,CAAC,CAAA;oBACd,CAAC;gBACF,CAAC;YACF,CAAC,CAAA;YACD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YAC1B,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;YAC5B,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBACrC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;oBAC7B,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;oBAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBACtB,CAAC,CAAC,CAAA;YACH,CAAC;QACF,CAAC,CAAC,CAAA;IACH,CAAC;IAED,4CAA4C;IACpC,KAAK,CAAC,eAAe,CAC5B,OAA6B,EAC7B,MAAoB;QAEpB,IAAI,UAAU,IAAI,OAAO,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YAClD,wFAAwF;YACxF,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;gBACpC,IACC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC;oBACrC,QAAQ,CAAC,MAAM,KAAK,MAAM;oBAC1B,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,EACpC,CAAC;oBACF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,qCAAqC,EAAE;wBAChE,QAAQ,EAAE,QAAQ,CAAC,EAAE;wBACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;qBAC1B,CAAC,CAAA;oBACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBACtB,OAAO,QAAQ,CAAA;gBAChB,CAAC;YACF,CAAC;YACD,IAAI,CAAC,GAAG,CACP,SAAS,CAAC,KAAK,EACf,gDAAgD,EAChD,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAC9B,CAAA;QACF,CAAC;QAED,6DAA6D;QAC7D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YACpC,IACC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC;gBACrC,QAAQ,CAAC,MAAM,KAAK,MAAM;gBAC1B,CAAC,QAAQ,CAAC,eAAe,EAAE,EAC1B,CAAC;gBACF,IAAI,CAAC,GAAG,CACP,SAAS,CAAC,KAAK,EACf,6CAA6C,EAC7C;oBACC,QAAQ,EAAE,QAAQ,CAAC,EAAE;oBACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC1B,CACD,CAAA;gBACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACtB,OAAO,QAAQ,CAAA;YAChB,CAAC;QACF,CAAC;QAED,uEAAuE;QACvE,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE;gBACxD,IAAI,EAAE,KAAK;aACX,CAAC,CAAA;YACF,sFAAsF;YACtF,MAAM,sBAAsB,GAAG,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAA;YAChG,IAAI,sBAAsB,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtE,QAAQ,CAAC,YAAY,EAAE,CAAA;YACxB,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,2BAA2B,EAAE;gBACtD,QAAQ,EAAE,QAAQ,CAAC,EAAE;gBACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC1B,CAAC,CAAA;YACF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACtB,OAAO,QAAQ,CAAA;QAChB,CAAC;QAED,wFAAwF;QACxF,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAC9D,CAAC,QAAQ,EAAE,EAAE,CACZ,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,CACpE,CAAA;QACD,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAC/D,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CACjD,CAAA;YACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,sCAAsC,EAAE;gBACjE,QAAQ,EAAE,WAAW,CAAC,EAAE;gBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC1B,CAAC,CAAA;YACF,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACzB,WAAW,CAAC,YAAY,EAAE,CAAA,CAAC,gCAAgC;YAC3D,OAAO,WAAW,CAAA;QACnB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAA;QAC1E,IAAI,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CACrD,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,IAAI,CAClC,CAAA;YAEF,IAAI,WAAW,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC3C,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,iCAAiC,EAAE;oBAC5D,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC1B,CAAC,CAAA;gBACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBAC/D,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,uBAAuB,EAAE;oBAClD,QAAQ,EAAE,QAAQ,CAAC,EAAE;oBACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC1B,CAAC,CAAA;gBACF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;oBACrB,QAAQ,CAAC,MAAM,EAAE,CAAA;oBACjB,MAAM,MAAM,CAAC,MAAM,CAAA;gBACpB,CAAC;qBAAM,CAAC;oBACP,OAAO,QAAQ,CAAA;gBAChB,CAAC;YACF,CAAC;QACF,CAAC;QAED,sGAAsG;QACtG,gFAAgF;QAChF,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CACvD,CAAC,QAAQ,EAAE,EAAE,CACZ,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAClE,CAAA;QACD,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;QAC9C,CAAC;QAED,6DAA6D;QAC7D,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,wBAAwB,EAAE;YACnD,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC1B,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAChE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,wBAAwB,EAAE;YACnD,QAAQ,EAAE,QAAQ,CAAC,EAAE;YACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC1B,CAAC,CAAA;QAEF,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACrB,QAAQ,CAAC,MAAM,EAAE,CAAA;YACjB,MAAM,MAAM,CAAC,MAAM,CAAA;QACpB,CAAC;aAAM,CAAC;YACP,OAAO,QAAQ,CAAA;QAChB,CAAC;IACF,CAAC;IAEO,qBAAqB;QAC5B,IAAI,IAAI,CAAC,eAAe,GAAG,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;QACzB,CAAC;QACD,OAAO,EAAE,IAAI,CAAC,eAAe,CAAA;IAC9B,CAAC;IAED,0CAA0C;IAC1C,KAAK,CAAC,eAAe,CACpB,eAAgC,EAChC,MAAoB;QAEpB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACpC,CAAC;QACD,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAA;QACpD,MAAM,OAAO,GAAG;YACf,GAAG,eAAe;YAClB,QAAQ,EAAE,eAAe;YACzB,eAAe,EAAE,IAAI,eAAe,EAAE;SACtC,CAAA;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,oBAAoB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;YAC9D,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;QACrD,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,kBAAkB,EAAE;YAC5C,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC1B,CAAC,CAAA;QAEF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACjC,MAAM,WAAW,GAAG,iBAAiB,CAAC;YACrC,OAAO,CAAC,eAAe,CAAC,MAAM;YAC9B,MAAM;SACN,CAAC,CAAA;QACF,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YAC1C,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,iBAAiB,EAAE;gBAC3C,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC1B,CAAC,CAAA;YACF,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QAEjE,sEAAsE;QACtE,8DAA8D;QAC9D,IAAI,gBAAgB,GAA+B,GAAG,EAAE,GAAE,CAAC,CAAA;QAE3D,IAAI,CAAC,KAAK;aACR,GAAG,CAAC,GAAuB,EAAE;YAC7B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACtC,gBAAgB,GAAG,OAAO,CAAA;YAC3B,CAAC,CAAC,CAAA;QACH,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACd,6FAA6F;YAC7F,mFAAmF;YACnF,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACrB,IACC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI;oBAC1B,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;oBACpC,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,EACtC,CAAC;oBACF,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAClC,CAAC;YACF,CAAC,CAAC,CAAA;YACF,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACpB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;YAC/B,CAAC;QACF,CAAC,CAAC,CAAA;QAEH,0FAA0F;QAC1F,MAAM,eAAe,GAAG,GAAG,EAAE;YAC5B,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC5C,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;oBACrB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;oBACvC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,2BAA2B,EAAE;wBACrD,QAAQ,EAAE,QAAQ,CAAC,EAAE;wBACrB,QAAQ,EAAE,OAAO,CAAC,QAAQ;qBAC1B,CAAC,CAAA;oBACF,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;wBAC/B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;oBAC/B,CAAC;yBAAM,CAAC;wBACP,QAAQ,CAAC,MAAM,EAAE,CAAA;oBAClB,CAAC;oBACD,OAAO,EAAE,CAAA;gBACV,CAAC,CAAC,CAAA;YACH,CAAC,CAAC,CAAA;QACH,CAAC,CAAA;QAED,OAAO;YACN,QAAQ;YACR,OAAO,EAAE,eAAe;SACxB,CAAA;IACF,CAAC;CACD"}
|
package/dist/server.d.ts
ADDED
|
@@ -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
|
+
}
|