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,538 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs';
3
+ import { env, AutoModel, AutoProcessor, AutoTokenizer, RawImage, TextStreamer, mean_pooling, } from '@huggingface/transformers';
4
+ import { LogLevels } from '../../lib/logger.js';
5
+ import { acquireFileLock } from '../../lib/acquireFileLock.js';
6
+ import { decodeAudio } from '../../lib/decodeAudio.js';
7
+ import { resolveModelFileLocation } from '../../lib/resolveModelFileLocation.js';
8
+ import { parseHuggingfaceModelIdAndBranch, remoteFileExists } from './util.js';
9
+ import { validateModelFiles } from './validateModelFiles.js';
10
+ import { copyDirectory } from '../../lib/copyDirectory.js';
11
+ export const autoGpu = true;
12
+ let didConfigureEnvironment = false;
13
+ function configureEnvironment(modelsPath) {
14
+ // console.debug({
15
+ // cacheDir: env.cacheDir,
16
+ // localModelPaths: env.localModelPath,
17
+ // })
18
+ // env.useFSCache = false
19
+ // env.useCustomCache = true
20
+ // env.customCache = new TransformersFileCache(modelsPath)
21
+ env.localModelPath = '';
22
+ didConfigureEnvironment = true;
23
+ }
24
+ async function loadModelComponents(modelOpts, config) {
25
+ const device = config.device?.gpu ? 'gpu' : 'cpu';
26
+ const modelClass = modelOpts.modelClass ?? AutoModel;
27
+ let modelPath = config.location;
28
+ if (!modelPath.endsWith('/')) {
29
+ modelPath += '/';
30
+ }
31
+ const loadPromises = [];
32
+ const modelPromise = modelClass.from_pretrained(modelPath, {
33
+ local_files_only: true,
34
+ device: device,
35
+ dtype: modelOpts.dtype || 'fp32',
36
+ });
37
+ loadPromises.push(modelPromise);
38
+ const tokenizerClass = modelOpts.tokenizerClass ?? AutoTokenizer;
39
+ const tokenizerPromise = tokenizerClass.from_pretrained(modelPath, {
40
+ local_files_only: true,
41
+ });
42
+ loadPromises.push(tokenizerPromise);
43
+ const hasPreprocessor = fs.existsSync(modelPath + 'preprocessor_config.json');
44
+ const hasProcessor = fs.existsSync(modelPath + 'processor_config.json');
45
+ if (hasProcessor || hasPreprocessor || modelOpts.processor) {
46
+ const processorClass = modelOpts.processorClass ?? AutoProcessor;
47
+ if (modelOpts.processor) {
48
+ const processorPath = resolveModelFileLocation({
49
+ url: modelOpts.processor.url,
50
+ filePath: modelOpts.processor.file,
51
+ modelsCachePath: config.modelsCachePath,
52
+ });
53
+ const processorPromise = processorClass.from_pretrained(processorPath, {
54
+ local_files_only: true,
55
+ });
56
+ loadPromises.push(processorPromise);
57
+ }
58
+ else {
59
+ const processorPromise = processorClass.from_pretrained(modelPath, {
60
+ local_files_only: true,
61
+ });
62
+ loadPromises.push(processorPromise);
63
+ }
64
+ }
65
+ const loadedComponents = await Promise.all(loadPromises);
66
+ const modelComponents = {};
67
+ if (loadedComponents[0]) {
68
+ modelComponents.model = loadedComponents[0];
69
+ }
70
+ if (loadedComponents[1]) {
71
+ modelComponents.tokenizer = loadedComponents[1];
72
+ }
73
+ if (loadedComponents[2]) {
74
+ modelComponents.processor = loadedComponents[2];
75
+ }
76
+ return modelComponents;
77
+ }
78
+ async function disposeModelComponents(modelComponents) {
79
+ if (modelComponents.model && 'dispose' in modelComponents.model) {
80
+ await modelComponents.model.dispose();
81
+ }
82
+ }
83
+ async function acquireModelFileLocks(config, signal) {
84
+ const requestedLocks = [];
85
+ const modelId = config.id;
86
+ const modelCacheDir = path.join(env.cacheDir, modelId);
87
+ fs.mkdirSync(modelCacheDir, { recursive: true });
88
+ requestedLocks.push(acquireFileLock(modelCacheDir, signal));
89
+ if (config.visionModel?.processor?.url) {
90
+ const { modelId } = parseHuggingfaceModelIdAndBranch(config.visionModel.processor.url);
91
+ const processorCacheDir = path.join(env.cacheDir, modelId);
92
+ fs.mkdirSync(processorCacheDir, { recursive: true });
93
+ requestedLocks.push(acquireFileLock(processorCacheDir, signal));
94
+ }
95
+ const acquiredLocks = await Promise.all(requestedLocks);
96
+ return () => {
97
+ for (const releaseLock of acquiredLocks) {
98
+ releaseLock();
99
+ }
100
+ };
101
+ }
102
+ export async function prepareModel({ config, log }, onProgress, signal) {
103
+ if (!didConfigureEnvironment) {
104
+ configureEnvironment(config.modelsCachePath);
105
+ }
106
+ fs.mkdirSync(config.location, { recursive: true });
107
+ const releaseFileLocks = await acquireModelFileLocks(config, signal);
108
+ if (signal?.aborted) {
109
+ releaseFileLocks();
110
+ return;
111
+ }
112
+ log(LogLevels.info, `Preparing transformers.js model at ${config.location}`, {
113
+ model: config.id,
114
+ });
115
+ const downloadModelFiles = async (modelOpts, { modelId, branch }, requiredComponents = ['model', 'tokenizer', 'processor']) => {
116
+ const modelClass = modelOpts.modelClass ?? AutoModel;
117
+ const downloadPromises = {};
118
+ const progressCallback = (progress) => {
119
+ if (onProgress && progress.status === 'progress') {
120
+ onProgress({
121
+ file: env.cacheDir + progress.name + '/' + progress.file,
122
+ loadedBytes: progress.loaded,
123
+ totalBytes: progress.total,
124
+ });
125
+ }
126
+ };
127
+ if (requiredComponents.includes('model')) {
128
+ const modelDownloadPromise = modelClass.from_pretrained(modelId, {
129
+ revision: branch,
130
+ dtype: modelOpts.dtype || 'fp32',
131
+ progress_callback: progressCallback,
132
+ // use_external_data_format: true, // https://github.com/xenova/transformers.js/blob/38a3bf6dab2265d9f0c2f613064535863194e6b9/src/models.js#L205-L207
133
+ });
134
+ downloadPromises.model = modelDownloadPromise;
135
+ }
136
+ if (requiredComponents.includes('tokenizer')) {
137
+ const hasTokenizer = await remoteFileExists(`${config.url}/blob/${branch}/tokenizer.json`);
138
+ if (hasTokenizer) {
139
+ const tokenizerClass = modelOpts.tokenizerClass ?? AutoTokenizer;
140
+ const tokenizerDownload = tokenizerClass.from_pretrained(modelId, {
141
+ revision: branch,
142
+ progress_callback: progressCallback,
143
+ // use_external_data_format: true,
144
+ });
145
+ downloadPromises.tokenizer = tokenizerDownload;
146
+ }
147
+ }
148
+ if (requiredComponents.includes('processor')) {
149
+ if (modelOpts.processor?.url) {
150
+ const { modelId, branch } = parseHuggingfaceModelIdAndBranch(modelOpts.processor.url);
151
+ const processorDownload = AutoProcessor.from_pretrained(modelId, {
152
+ revision: branch,
153
+ progress_callback: progressCallback,
154
+ });
155
+ downloadPromises.processor = processorDownload;
156
+ }
157
+ else {
158
+ const [hasProcessor, hasPreprocessor] = await Promise.all([
159
+ remoteFileExists(`${config.url}/blob/${branch}/processor_config.json`),
160
+ remoteFileExists(`${config.url}/blob/${branch}/preprocessor_config.json`),
161
+ ]);
162
+ if (hasProcessor || hasPreprocessor) {
163
+ const processorDownload = AutoProcessor.from_pretrained(modelId, {
164
+ revision: branch,
165
+ progress_callback: progressCallback,
166
+ // use_external_data_format: true,
167
+ });
168
+ downloadPromises.processor = processorDownload;
169
+ }
170
+ }
171
+ }
172
+ await Promise.all(Object.values(downloadPromises));
173
+ const modelComponents = {};
174
+ if (downloadPromises.model) {
175
+ modelComponents.model = (await downloadPromises.model);
176
+ }
177
+ if (downloadPromises.tokenizer) {
178
+ modelComponents.tokenizer = (await downloadPromises.tokenizer);
179
+ }
180
+ if (downloadPromises.processor) {
181
+ modelComponents.processor = (await downloadPromises.processor);
182
+ }
183
+ return modelComponents;
184
+ };
185
+ const downloadModel = async (validationResult) => {
186
+ log(LogLevels.info, `${validationResult.message} - Downloading files`, {
187
+ model: config.id,
188
+ url: config.url,
189
+ location: config.location,
190
+ errors: validationResult.errors,
191
+ });
192
+ const modelDownloadPromises = [];
193
+ if (!config.url) {
194
+ throw new Error(`Missing URL for model ${config.id}`);
195
+ }
196
+ const { modelId, branch } = parseHuggingfaceModelIdAndBranch(config.url);
197
+ const directoriesToCopy = {};
198
+ const modelCacheDir = path.join(env.cacheDir, modelId);
199
+ directoriesToCopy[modelCacheDir] = config.location;
200
+ const noModelConfigured = !config.textModel && !config.visionModel && !config.speechModel;
201
+ if (config.textModel || noModelConfigured) {
202
+ const requiredComponents = validationResult.errors?.textModel
203
+ ? Object.keys(validationResult.errors.textModel)
204
+ : undefined;
205
+ modelDownloadPromises.push(downloadModelFiles(config.textModel || {}, { modelId, branch }, requiredComponents));
206
+ }
207
+ if (config.visionModel) {
208
+ const requiredComponents = validationResult.errors?.visionModel
209
+ ? Object.keys(validationResult.errors.visionModel)
210
+ : undefined;
211
+ modelDownloadPromises.push(downloadModelFiles(config.visionModel, { modelId, branch }, requiredComponents));
212
+ if (config.visionModel.processor?.url) {
213
+ const processorPath = resolveModelFileLocation({
214
+ url: config.visionModel.processor.url,
215
+ filePath: config.visionModel.processor.file,
216
+ modelsCachePath: config.modelsCachePath,
217
+ });
218
+ const { modelId } = parseHuggingfaceModelIdAndBranch(config.visionModel.processor.url);
219
+ const processorCacheDir = path.join(env.cacheDir, modelId);
220
+ directoriesToCopy[processorCacheDir] = processorPath;
221
+ }
222
+ }
223
+ if (config.speechModel) {
224
+ const requiredComponents = validationResult.errors?.speechModel
225
+ ? Object.keys(validationResult.errors.speechModel)
226
+ : undefined;
227
+ modelDownloadPromises.push(downloadModelFiles(config.speechModel, { modelId, branch }, requiredComponents));
228
+ }
229
+ const models = await Promise.all(modelDownloadPromises);
230
+ for (const modelComponents of models) {
231
+ disposeModelComponents(modelComponents);
232
+ }
233
+ if (signal?.aborted) {
234
+ return;
235
+ }
236
+ // copy all downloads to their actual location, then remove the cache so we dont duplicate
237
+ await Promise.all(Object.entries(directoriesToCopy).map(async ([from, to]) => {
238
+ await copyDirectory(from, to);
239
+ await fs.promises.rmdir(from, { recursive: true });
240
+ }));
241
+ };
242
+ try {
243
+ const validationResults = await validateModelFiles(config);
244
+ if (signal?.aborted) {
245
+ releaseFileLocks();
246
+ return;
247
+ }
248
+ if (validationResults) {
249
+ if (config.url) {
250
+ await downloadModel(validationResults);
251
+ }
252
+ else {
253
+ throw new Error(`Model files are invalid: ${validationResults.message}`);
254
+ }
255
+ }
256
+ }
257
+ catch (error) {
258
+ throw error;
259
+ }
260
+ finally {
261
+ releaseFileLocks();
262
+ }
263
+ const configMeta = {};
264
+ const fileList = [];
265
+ const modelFiles = fs.readdirSync(config.location, { recursive: true });
266
+ const pushFile = (file) => {
267
+ const targetFile = path.join(config.location, file);
268
+ const targetStat = fs.statSync(targetFile);
269
+ fileList.push({
270
+ file: targetFile,
271
+ size: targetStat.size,
272
+ });
273
+ if (targetFile.endsWith('.json')) {
274
+ const key = path.basename(targetFile).replace('.json', '');
275
+ configMeta[key] = JSON.parse(fs.readFileSync(targetFile, 'utf8'));
276
+ }
277
+ };
278
+ // add model files to the list
279
+ for (const file of modelFiles) {
280
+ pushFile(file.toString());
281
+ }
282
+ // add extra stuff from external repos
283
+ if (config.visionModel?.processor) {
284
+ const processorPath = resolveModelFileLocation({
285
+ url: config.visionModel.processor.url,
286
+ filePath: config.visionModel.processor.file,
287
+ modelsCachePath: config.modelsCachePath,
288
+ });
289
+ const processorFiles = fs.readdirSync(processorPath, { recursive: true });
290
+ for (const file of processorFiles) {
291
+ pushFile(file.toString());
292
+ }
293
+ }
294
+ return {
295
+ files: modelFiles,
296
+ ...configMeta,
297
+ };
298
+ }
299
+ export async function createInstance({ config, log }, signal) {
300
+ const modelLoadPromises = [];
301
+ const noModelConfigured = !config.textModel && !config.visionModel && !config.speechModel;
302
+ if (config.textModel || noModelConfigured) {
303
+ modelLoadPromises.push(loadModelComponents(config.textModel || {}, config));
304
+ }
305
+ else {
306
+ modelLoadPromises.push(Promise.resolve(undefined));
307
+ }
308
+ if (config.visionModel) {
309
+ modelLoadPromises.push(loadModelComponents(config.visionModel, config));
310
+ }
311
+ else {
312
+ modelLoadPromises.push(Promise.resolve(undefined));
313
+ }
314
+ if (config.speechModel) {
315
+ modelLoadPromises.push(loadModelComponents(config.speechModel, config));
316
+ }
317
+ else {
318
+ modelLoadPromises.push(Promise.resolve(undefined));
319
+ }
320
+ const models = await Promise.all(modelLoadPromises);
321
+ const instance = {
322
+ textModel: models[0],
323
+ visionModel: models[1],
324
+ speechModel: models[2],
325
+ };
326
+ // TODO preload whisper / any speech to text?
327
+ // await model.generate({
328
+ // input_features: full([1, 80, 3000], 0.0),
329
+ // max_new_tokens: 1,
330
+ // });
331
+ return instance;
332
+ }
333
+ export async function disposeInstance(instance) {
334
+ const disposePromises = [];
335
+ if (instance.textModel) {
336
+ disposePromises.push(disposeModelComponents(instance.textModel));
337
+ }
338
+ if (instance.visionModel) {
339
+ disposePromises.push(disposeModelComponents(instance.visionModel));
340
+ }
341
+ if (instance.speechModel) {
342
+ disposePromises.push(disposeModelComponents(instance.speechModel));
343
+ }
344
+ await Promise.all(disposePromises);
345
+ }
346
+ export async function processTextCompletionTask({ request, config, log, onChunk }, instance, signal) {
347
+ if (!request.prompt) {
348
+ throw new Error('Prompt is required for text completion.');
349
+ }
350
+ if (!(instance.textModel?.tokenizer && instance.textModel?.model)) {
351
+ throw new Error('Text model is not loaded.');
352
+ }
353
+ const inputTokens = instance.textModel.tokenizer(request.prompt);
354
+ const outputTokens = await instance.textModel.model.generate({
355
+ ...inputTokens,
356
+ max_new_tokens: request.maxTokens ?? 128,
357
+ });
358
+ // @ts-ignore
359
+ const outputText = instance.textModel.tokenizer.batch_decode(outputTokens, {
360
+ skip_special_tokens: true,
361
+ });
362
+ return {
363
+ finishReason: 'eogToken',
364
+ text: outputText[0],
365
+ promptTokens: inputTokens.length,
366
+ // @ts-ignore
367
+ completionTokens: outputTokens.length,
368
+ // @ts-ignore
369
+ contextTokens: inputTokens.length + outputTokens.length,
370
+ };
371
+ }
372
+ // see https://github.com/xenova/transformers.js/blob/v3/src/utils/tensor.js
373
+ // https://github.com/xenova/transformers.js/blob/v3/src/pipelines.js#L1284
374
+ export async function processEmbeddingTask({ request, config }, instance, signal) {
375
+ if (!request.input) {
376
+ throw new Error('Input is required for embedding.');
377
+ }
378
+ const inputs = Array.isArray(request.input) ? request.input : [request.input];
379
+ const normalizedInputs = inputs.map((input) => {
380
+ if (typeof input === 'string') {
381
+ return {
382
+ type: 'text',
383
+ content: input,
384
+ };
385
+ }
386
+ else if (input.type) {
387
+ return input;
388
+ }
389
+ else {
390
+ throw new Error('Invalid input type');
391
+ }
392
+ });
393
+ const embeddings = [];
394
+ let inputTokens = 0;
395
+ const applyPooling = (result, pooling, modelInputs) => {
396
+ if (pooling === 'mean') {
397
+ return mean_pooling(result, modelInputs.attention_mask);
398
+ }
399
+ else if (pooling === 'cls') {
400
+ return result.slice(null, 0);
401
+ }
402
+ else {
403
+ throw Error(`Pooling method '${pooling}' not supported.`);
404
+ }
405
+ };
406
+ const truncateDimensions = (result, dimensions) => {
407
+ const truncatedData = new Float32Array(dimensions);
408
+ truncatedData.set(result.data.slice(0, dimensions));
409
+ return truncatedData;
410
+ };
411
+ for (const embeddingInput of normalizedInputs) {
412
+ if (signal?.aborted) {
413
+ break;
414
+ }
415
+ let result;
416
+ let modelInputs;
417
+ if (embeddingInput.type === 'text') {
418
+ if (!instance.textModel?.tokenizer || !instance.textModel?.model) {
419
+ throw new Error('Text model is not loaded.');
420
+ }
421
+ modelInputs = instance.textModel.tokenizer(embeddingInput.content, {
422
+ padding: true, // pads input if it is shorter than context window
423
+ truncation: true, // truncates input if it exceeds context window
424
+ });
425
+ inputTokens += modelInputs.input_ids.size;
426
+ const modelOutputs = await instance.textModel.model(modelInputs);
427
+ result =
428
+ modelOutputs.last_hidden_state ??
429
+ modelOutputs.logits ??
430
+ modelOutputs.token_embeddings ??
431
+ modelOutputs.text_embeds;
432
+ }
433
+ else if (embeddingInput.type === 'image') {
434
+ if (!instance.visionModel?.processor || !instance.visionModel?.model) {
435
+ throw new Error('Vision model is not loaded.');
436
+ }
437
+ const { data, info } = await embeddingInput.content.handle.raw().toBuffer({ resolveWithObject: true });
438
+ const image = new RawImage(new Uint8ClampedArray(data), info.width, info.height, info.channels);
439
+ modelInputs = await instance.visionModel.processor(image);
440
+ const modelOutputs = await instance.visionModel.model(modelInputs);
441
+ result = modelOutputs.last_hidden_state ?? modelOutputs.logits ?? modelOutputs.image_embeds;
442
+ }
443
+ if (request.pooling) {
444
+ result = applyPooling(result, request.pooling, modelInputs);
445
+ }
446
+ if (request.dimensions && result.data.length > request.dimensions) {
447
+ embeddings.push(truncateDimensions(result, request.dimensions));
448
+ }
449
+ else {
450
+ embeddings.push(result.data);
451
+ }
452
+ }
453
+ return {
454
+ embeddings,
455
+ inputTokens,
456
+ };
457
+ }
458
+ export async function processImageToTextTask({ request, config, log }, instance, signal) {
459
+ if (!request.image) {
460
+ throw new Error('No image provided');
461
+ }
462
+ const { data, info } = await request.image.handle.raw().toBuffer({ resolveWithObject: true });
463
+ const image = new RawImage(new Uint8ClampedArray(data), info.width, info.height, info.channels);
464
+ if (signal?.aborted) {
465
+ return;
466
+ }
467
+ const model = instance.visionModel || instance.textModel;
468
+ if (!(model && model.tokenizer && model.processor && model.model)) {
469
+ throw new Error('No model loaded');
470
+ }
471
+ let textInputs = {};
472
+ if (request.prompt) {
473
+ textInputs = model.tokenizer(request.prompt);
474
+ }
475
+ const imageInputs = await model.processor(image);
476
+ const outputTokens = await model.model.generate({
477
+ ...textInputs,
478
+ ...imageInputs,
479
+ max_new_tokens: request.maxTokens ?? 128,
480
+ });
481
+ // @ts-ignore
482
+ const outputText = model.tokenizer.batch_decode(outputTokens, {
483
+ skip_special_tokens: true,
484
+ });
485
+ return {
486
+ text: outputText[0],
487
+ };
488
+ }
489
+ async function readAudioFile(filePath) {
490
+ const WHISPER_SAMPLING_RATE = 16_000;
491
+ const MAX_AUDIO_LENGTH = 30; // seconds
492
+ const MAX_SAMPLES = WHISPER_SAMPLING_RATE * MAX_AUDIO_LENGTH;
493
+ // Read the file into a buffer
494
+ const fileBuffer = fs.readFileSync(filePath);
495
+ // Decode the audio data
496
+ let decodedAudio = await decodeAudio(fileBuffer, WHISPER_SAMPLING_RATE);
497
+ // Trim the audio data if it exceeds MAX_SAMPLES
498
+ if (decodedAudio.length > MAX_SAMPLES) {
499
+ decodedAudio = decodedAudio.slice(-MAX_SAMPLES);
500
+ }
501
+ return decodedAudio;
502
+ }
503
+ // see examples
504
+ // https://huggingface.co/docs/transformers.js/guides/node-audio-processing
505
+ // https://github.com/xenova/transformers.js/tree/v3/examples/node-audio-processing
506
+ export async function processSpeechToTextTask({ request, onChunk }, instance, signal) {
507
+ if (!(instance.speechModel?.tokenizer && instance.speechModel?.model)) {
508
+ throw new Error('No speech model loaded');
509
+ }
510
+ const streamer = new TextStreamer(instance.speechModel.tokenizer, {
511
+ skip_prompt: true,
512
+ // skip_special_tokens: true,
513
+ callback_function: (output) => {
514
+ if (onChunk) {
515
+ onChunk({ text: output });
516
+ }
517
+ },
518
+ });
519
+ let inputs;
520
+ if (request.file) {
521
+ const audio = await readAudioFile(request.file);
522
+ inputs = await instance.speechModel.processor(audio);
523
+ }
524
+ const outputs = await instance.speechModel.model.generate({
525
+ ...inputs,
526
+ max_new_tokens: request.maxTokens ?? 128,
527
+ language: request.language ?? 'en',
528
+ streamer,
529
+ });
530
+ // @ts-ignore
531
+ const outputText = instance.speechModel.tokenizer.batch_decode(outputs, {
532
+ skip_special_tokens: true,
533
+ });
534
+ return {
535
+ text: outputText[0],
536
+ };
537
+ }
538
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/engines/transformers-js/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { PreTrainedModel, PreTrainedTokenizer, AutoProcessor } from '@huggingface/transformers';
2
+ export type TransformersJsModelClass = typeof PreTrainedModel;
3
+ export type TransformersJsTokenizerClass = typeof PreTrainedTokenizer;
4
+ export interface TransformersJsProcessorClass {
5
+ from_pretrained: (typeof AutoProcessor)['from_pretrained'];
6
+ }
7
+ export type TransformersJsDataType = 'fp32' | 'fp16' | 'q8' | 'int8' | 'uint8' | 'q4' | 'bnb4' | 'q4f16';
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/engines/transformers-js/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ export declare function remoteFileExists(url: string): Promise<boolean>;
2
+ interface HuggingfaceModelInfo {
3
+ modelId: string;
4
+ branch: string;
5
+ }
6
+ export declare function parseHuggingfaceModelIdAndBranch(url: string): HuggingfaceModelInfo;
7
+ export {};
@@ -0,0 +1,36 @@
1
+ export async function remoteFileExists(url) {
2
+ try {
3
+ const response = await fetch(url, { method: 'HEAD' });
4
+ return response.ok;
5
+ }
6
+ catch (error) {
7
+ console.error('Error checking remote file:', error);
8
+ return false;
9
+ }
10
+ }
11
+ export function parseHuggingfaceModelIdAndBranch(url) {
12
+ // url to the hub model, like https://huggingface.co/jinaai/jina-clip-v1
13
+ const parsedUrl = new URL(url);
14
+ const urlSegments = parsedUrl.pathname.split('/');
15
+ const repoOrg = urlSegments[1];
16
+ const repoName = urlSegments[2];
17
+ const branch = urlSegments[4] || 'main';
18
+ return {
19
+ modelId: `${repoOrg}/${repoName}`,
20
+ branch,
21
+ };
22
+ // if (filePath) { // path to the cached model, like /path/to/huggingface/jinaai/jina-clip-v1-main
23
+ // const filePathSegments = filePath.split('/')
24
+ // const modelDir = filePathSegments[filePathSegments.length - 1]
25
+ // const branch = modelDir.split('-').pop() || 'main'
26
+ // const repoName = modelDir.replace(new RegExp(`-${branch}$`), '')
27
+ // const repoOrg = filePathSegments[filePathSegments.length - 2]
28
+ // const modelId = `${repoOrg}/${repoName}`
29
+ // return {
30
+ // modelId,
31
+ // branch,
32
+ // }
33
+ // }
34
+ // throw new Error('Either url or filePath must be provided')
35
+ }
36
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/engines/transformers-js/util.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IACjD,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QACrD,OAAO,QAAQ,CAAC,EAAE,CAAA;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAA;QACnD,OAAO,KAAK,CAAA;IACb,CAAC;AACF,CAAC;AAOD,MAAM,UAAU,gCAAgC,CAAC,GAAW;IAC3D,wEAAwE;IACxE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IAC9B,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;IAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,CAAA;IACvC,OAAO;QACN,OAAO,EAAE,GAAG,OAAO,IAAI,QAAQ,EAAE;QACjC,MAAM;KACN,CAAA;IACD,kGAAkG;IAClG,gDAAgD;IAChD,kEAAkE;IAClE,sDAAsD;IACtD,oEAAoE;IACpE,iEAAiE;IACjE,4CAA4C;IAC5C,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,KAAK;IACL,IAAI;IACJ,6DAA6D;AAC9D,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { TransformersJsModelConfig } from './engine.js';
2
+ interface ComponentValidationErrors {
3
+ model?: string;
4
+ tokenizer?: string;
5
+ processor?: string;
6
+ }
7
+ interface ModelValidationErrors {
8
+ textModel?: ComponentValidationErrors;
9
+ visionModel?: ComponentValidationErrors;
10
+ speechModel?: ComponentValidationErrors;
11
+ }
12
+ export interface ModelValidationResult {
13
+ message: string;
14
+ errors?: ModelValidationErrors;
15
+ }
16
+ export declare function validateModelFiles(config: TransformersJsModelConfig): Promise<ModelValidationResult | undefined>;
17
+ export {};