@qvac/sdk 0.2.7-dev.1761566029.f834aa3 → 0.4.0

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 (215) hide show
  1. package/README.md +26 -3
  2. package/dist/client/api/cancel.d.ts +1 -1
  3. package/dist/client/api/cancel.js +4 -3
  4. package/dist/client/api/completion-stream.d.ts +24 -32
  5. package/dist/client/api/completion-stream.js +142 -50
  6. package/dist/client/api/delete-cache.js +3 -2
  7. package/dist/client/api/download-asset.d.ts +3 -3
  8. package/dist/client/api/download-asset.js +12 -17
  9. package/dist/client/api/embed.d.ts +1 -1
  10. package/dist/client/api/embed.js +4 -3
  11. package/dist/client/api/get-model-info.d.ts +29 -0
  12. package/dist/client/api/get-model-info.js +14 -0
  13. package/dist/client/api/index.d.ts +4 -0
  14. package/dist/client/api/index.js +4 -0
  15. package/dist/client/api/load-model.d.ts +3 -3
  16. package/dist/client/api/load-model.js +13 -22
  17. package/dist/client/api/logging-stream.d.ts +1 -1
  18. package/dist/client/api/logging-stream.js +3 -2
  19. package/dist/client/api/ping.d.ts +1 -1
  20. package/dist/client/api/ping.js +3 -2
  21. package/dist/client/api/provide.d.ts +1 -1
  22. package/dist/client/api/provide.js +4 -3
  23. package/dist/client/api/rag.d.ts +3 -3
  24. package/dist/client/api/rag.js +13 -12
  25. package/dist/client/api/set-config.d.ts +7 -0
  26. package/dist/client/api/set-config.js +20 -0
  27. package/dist/client/api/stop-provider.d.ts +15 -0
  28. package/dist/client/api/stop-provider.js +25 -0
  29. package/dist/client/api/text-to-speech.d.ts +7 -0
  30. package/dist/client/api/text-to-speech.js +58 -0
  31. package/dist/client/api/transcribe.d.ts +4 -2
  32. package/dist/client/api/transcribe.js +9 -5
  33. package/dist/client/api/translate.d.ts +1 -1
  34. package/dist/client/api/translate.js +3 -2
  35. package/dist/client/api/unload-model.d.ts +5 -1
  36. package/dist/client/api/unload-model.js +14 -4
  37. package/dist/client/config-manager.d.ts +4 -0
  38. package/dist/client/config-manager.js +8 -0
  39. package/dist/client/index.d.ts +1 -1
  40. package/dist/client/index.js +1 -1
  41. package/dist/client/init-hooks.d.ts +6 -0
  42. package/dist/client/init-hooks.js +37 -0
  43. package/dist/client/rpc/bare-client.d.ts +73 -0
  44. package/dist/client/rpc/bare-client.js +5 -4
  45. package/dist/client/rpc/bare-rpc-client.js +7 -3
  46. package/dist/client/rpc/expo-rpc-client.d.ts +1 -0
  47. package/dist/client/rpc/expo-rpc-client.js +9 -1
  48. package/dist/client/rpc/node-rpc-client.d.ts +1 -1
  49. package/dist/client/rpc/node-rpc-client.js +22 -9
  50. package/dist/client/rpc/rpc-client.d.ts +1 -0
  51. package/dist/client/rpc/rpc-client.js +27 -3
  52. package/dist/examples/cache-management.d.ts +2 -0
  53. package/dist/examples/cache-management.js +97 -0
  54. package/dist/examples/delegated-inference/consumer.js +2 -2
  55. package/dist/examples/download-with-blind-relays.d.ts +2 -0
  56. package/dist/examples/download-with-blind-relays.js +48 -0
  57. package/dist/examples/download-with-cancel.js +3 -4
  58. package/dist/examples/embed-hyperdrive.js +0 -1
  59. package/dist/examples/kv-cache-cleanup.js +0 -1
  60. package/dist/examples/kv-cache-custom-key.js +0 -1
  61. package/dist/examples/kv-cache-example.js +0 -1
  62. package/dist/examples/llamacpp-file-logging.js +0 -1
  63. package/dist/examples/llamacpp-filesystem.js +2 -2
  64. package/dist/examples/llamacpp-http.js +0 -1
  65. package/dist/examples/llamacpp-hyperdrive.js +0 -1
  66. package/dist/examples/llamacpp-multimodal.js +0 -1
  67. package/dist/examples/llamacpp-native-tools.js +118 -36
  68. package/dist/examples/llamacpp-sharded.d.ts +2 -0
  69. package/dist/examples/llamacpp-sharded.js +44 -0
  70. package/dist/examples/multi-model-demo.js +0 -1
  71. package/dist/examples/parallel-download.js +2 -2
  72. package/dist/examples/rag/rag-chromadb.js +0 -1
  73. package/dist/examples/rag/rag-hyperdb-workspaces.js +0 -1
  74. package/dist/examples/rag/rag-hyperdb.js +0 -1
  75. package/dist/examples/rag/rag-lancedb.js +0 -1
  76. package/dist/examples/rag/rag-sqlite.js +0 -1
  77. package/dist/examples/text-to-speech.d.ts +3 -0
  78. package/dist/examples/text-to-speech.js +137 -0
  79. package/dist/examples/translation/translation-indic.js +3 -1
  80. package/dist/examples/translation/translation-llm-context.js +0 -1
  81. package/dist/examples/translation/translation-llm.js +2 -2
  82. package/dist/examples/translation/translation-opus.js +3 -1
  83. package/dist/examples/translation/translation-stream.js +0 -1
  84. package/dist/examples/whispercpp-filesystem.js +32 -5
  85. package/dist/examples/whispercpp-microphone-record.js +9 -9
  86. package/dist/examples/whispercpp-prompt.d.ts +2 -0
  87. package/dist/examples/whispercpp-prompt.js +68 -0
  88. package/dist/expo/plugins/withMobileBundle.js +9 -3
  89. package/dist/index.d.ts +4 -2
  90. package/dist/index.js +4 -2
  91. package/dist/models/hyperdrive/models.d.ts +1924 -100
  92. package/dist/models/hyperdrive/models.js +2051 -105
  93. package/dist/schemas/common.d.ts +420 -58
  94. package/dist/schemas/common.js +12 -0
  95. package/dist/schemas/completion-stream.d.ts +26 -22
  96. package/dist/schemas/completion-stream.js +9 -23
  97. package/dist/schemas/download-asset.d.ts +77 -2
  98. package/dist/schemas/download-asset.js +15 -4
  99. package/dist/schemas/get-model-info.d.ts +100 -0
  100. package/dist/schemas/get-model-info.js +40 -0
  101. package/dist/schemas/index.d.ts +8 -0
  102. package/dist/schemas/index.js +8 -0
  103. package/dist/schemas/llamacpp-config.d.ts +2 -1
  104. package/dist/schemas/llamacpp-config.js +3 -4
  105. package/dist/schemas/load-model.d.ts +2316 -266
  106. package/dist/schemas/load-model.js +157 -10
  107. package/dist/schemas/model-src-utils.d.ts +98 -0
  108. package/dist/schemas/model-src-utils.js +31 -0
  109. package/dist/schemas/sdk-errors-client.d.ts +25 -0
  110. package/dist/schemas/sdk-errors-client.js +111 -0
  111. package/dist/schemas/sdk-errors-server.d.ts +55 -0
  112. package/dist/schemas/sdk-errors-server.js +271 -0
  113. package/dist/schemas/set-config.d.ts +21 -0
  114. package/dist/schemas/set-config.js +14 -0
  115. package/dist/schemas/stop-provide.d.ts +17 -0
  116. package/dist/schemas/stop-provide.js +15 -0
  117. package/dist/schemas/text-to-speech.d.ts +34 -0
  118. package/dist/schemas/text-to-speech.js +25 -0
  119. package/dist/schemas/tools.d.ts +62 -0
  120. package/dist/schemas/tools.js +43 -0
  121. package/dist/schemas/transcription.d.ts +25 -2
  122. package/dist/schemas/transcription.js +12 -1
  123. package/dist/schemas/translation-config.d.ts +33 -5
  124. package/dist/schemas/translation-config.js +18 -1
  125. package/dist/schemas/unload-model.d.ts +2 -0
  126. package/dist/schemas/unload-model.js +2 -0
  127. package/dist/schemas/whispercpp-config.d.ts +55 -18
  128. package/dist/schemas/whispercpp-config.js +63 -15
  129. package/dist/server/bare/addons/cancel.js +2 -1
  130. package/dist/server/bare/addons/llamacpp/create-model.d.ts +9 -2
  131. package/dist/server/bare/addons/llamacpp/create-model.js +23 -23
  132. package/dist/server/bare/addons/llamacpp/handlers/completion-stream.d.ts +10 -2
  133. package/dist/server/bare/addons/llamacpp/handlers/completion-stream.js +62 -43
  134. package/dist/server/bare/addons/llamacpp/handlers/embed.js +3 -2
  135. package/dist/server/bare/addons/llamacpp/kv-cache-utils.d.ts +1 -1
  136. package/dist/server/bare/addons/llamacpp/kv-cache-utils.js +6 -2
  137. package/dist/server/bare/addons/load-model.js +59 -28
  138. package/dist/server/bare/addons/translation/create-model.d.ts +5 -1
  139. package/dist/server/bare/addons/translation/create-model.js +17 -25
  140. package/dist/server/bare/addons/translation/handlers/translate.js +10 -1
  141. package/dist/server/bare/addons/tts/create-model.d.ts +10 -0
  142. package/dist/server/bare/addons/tts/create-model.js +25 -0
  143. package/dist/server/bare/addons/tts/handlers/text-to-speech.d.ts +3 -0
  144. package/dist/server/bare/addons/tts/handlers/text-to-speech.js +87 -0
  145. package/dist/server/bare/addons/tts/index.d.ts +3 -0
  146. package/dist/server/bare/addons/tts/index.js +2 -0
  147. package/dist/server/bare/addons/unload-model.js +21 -3
  148. package/dist/server/bare/addons/whispercpp/create-model.d.ts +5 -1
  149. package/dist/server/bare/addons/whispercpp/create-model.js +13 -32
  150. package/dist/server/bare/addons/whispercpp/handlers/transcribe-stream.js +41 -20
  151. package/dist/server/bare/delegate-rpc-client.js +3 -2
  152. package/dist/server/bare/hyperswarm.d.ts +3 -0
  153. package/dist/server/bare/hyperswarm.js +22 -1
  154. package/dist/server/bare/rag-hyperdb/rag-manager.js +16 -13
  155. package/dist/server/bare/registry/config-registry.d.ts +5 -0
  156. package/dist/server/bare/registry/config-registry.js +39 -0
  157. package/dist/server/bare/registry/logging-stream-registry.d.ts +1 -0
  158. package/dist/server/bare/registry/logging-stream-registry.js +7 -0
  159. package/dist/server/bare/registry/model-registry.d.ts +13 -0
  160. package/dist/server/bare/registry/model-registry.js +24 -7
  161. package/dist/server/rpc/handle-request.js +48 -3
  162. package/dist/server/rpc/handlers/completion-stream-delegated.js +2 -1
  163. package/dist/server/rpc/handlers/completion-stream.js +11 -4
  164. package/dist/server/rpc/handlers/download-asset.js +2 -3
  165. package/dist/server/rpc/handlers/get-model-info.d.ts +3 -0
  166. package/dist/server/rpc/handlers/get-model-info.js +148 -0
  167. package/dist/server/rpc/handlers/index.d.ts +6 -0
  168. package/dist/server/rpc/handlers/index.js +8 -0
  169. package/dist/server/rpc/handlers/load-model/download-manager.d.ts +1 -0
  170. package/dist/server/rpc/handlers/load-model/download-manager.js +12 -31
  171. package/dist/server/rpc/handlers/load-model/http.js +51 -10
  172. package/dist/server/rpc/handlers/load-model/hyperdrive.js +336 -156
  173. package/dist/server/rpc/handlers/load-model/index.js +1 -1
  174. package/dist/server/rpc/handlers/load-model/resolve.d.ts +1 -1
  175. package/dist/server/rpc/handlers/load-model/resolve.js +17 -60
  176. package/dist/server/rpc/handlers/load-model-delegated.js +7 -4
  177. package/dist/server/rpc/handlers/load-model.js +19 -1
  178. package/dist/server/rpc/handlers/provideHandler/handler.js +2 -1
  179. package/dist/server/rpc/handlers/rag.js +0 -3
  180. package/dist/server/rpc/handlers/set-config.d.ts +3 -0
  181. package/dist/server/rpc/handlers/set-config.js +18 -0
  182. package/dist/server/rpc/handlers/stopProvideHandler.d.ts +3 -0
  183. package/dist/server/rpc/handlers/stopProvideHandler.js +22 -0
  184. package/dist/server/rpc/handlers/text-to-speech.d.ts +3 -0
  185. package/dist/server/rpc/handlers/text-to-speech.js +7 -0
  186. package/dist/server/rpc/handlers/transcribe-stream.js +6 -2
  187. package/dist/server/rpc/handlers/unload-model.js +7 -0
  188. package/dist/server/utils/cache.d.ts +13 -8
  189. package/dist/server/utils/cache.js +69 -14
  190. package/dist/server/utils/checksum.d.ts +2 -0
  191. package/dist/server/utils/checksum.js +24 -0
  192. package/dist/server/utils/index.d.ts +2 -0
  193. package/dist/server/utils/index.js +2 -0
  194. package/dist/server/utils/shard-utils.d.ts +22 -0
  195. package/dist/server/utils/shard-utils.js +37 -0
  196. package/dist/server/utils/tool-integration.d.ts +13 -0
  197. package/dist/server/utils/tool-integration.js +43 -0
  198. package/dist/server/utils/tool-parser.d.ts +7 -0
  199. package/dist/server/utils/tool-parser.js +244 -0
  200. package/dist/server/worker.js +28 -10
  201. package/dist/utils/errors-base.d.ts +3 -0
  202. package/dist/utils/errors-base.js +13 -0
  203. package/dist/utils/errors-client.d.ts +107 -0
  204. package/dist/utils/errors-client.js +186 -0
  205. package/dist/utils/errors-server.d.ts +146 -0
  206. package/dist/utils/errors-server.js +253 -0
  207. package/dist/utils/tool-helpers.d.ts +17 -0
  208. package/dist/utils/tool-helpers.js +99 -0
  209. package/package.json +15 -11
  210. package/dist/examples/llamacpp-tools-routing.d.ts +0 -2
  211. package/dist/examples/llamacpp-tools-routing.js +0 -364
  212. package/dist/examples/llamacpp-tools.d.ts +0 -2
  213. package/dist/examples/llamacpp-tools.js +0 -81
  214. package/dist/server/http-server.d.ts +0 -2
  215. package/dist/server/http-server.js +0 -189
@@ -1,11 +1,9 @@
1
1
  import {} from "../../../../schemas/index.js";
2
- import process from "bare-process";
3
2
  const activeDownloads = new Map();
4
3
  const clearCacheFlags = new Map();
5
4
  export const getActiveDownload = (key) => activeDownloads.get(key);
6
5
  export const registerDownload = (key, entry) => {
7
6
  activeDownloads.set(key, entry);
8
- registerCleanupHandlers();
9
7
  };
10
8
  export const unregisterDownload = (key) => {
11
9
  activeDownloads.delete(key);
@@ -38,36 +36,19 @@ export const cancelAllDownloads = () => {
38
36
  console.log(`🧹 Cancelling ${activeDownloads.size} active downloads`);
39
37
  Array.from(activeDownloads.keys()).forEach((key) => createCancelFunction(key)());
40
38
  };
41
- // Register cleanup handlers for graceful shutdown
42
- let cleanupRegistered = false;
43
39
  let isCleaningUp = false;
44
- const registerCleanupHandlers = () => {
45
- if (cleanupRegistered)
40
+ export const cleanupDownloads = async () => {
41
+ if (isCleaningUp)
46
42
  return;
47
- cleanupRegistered = true;
48
- const cleanup = async () => {
49
- if (isCleaningUp)
50
- return;
51
- isCleaningUp = true;
52
- try {
53
- const downloadPromises = Array.from(activeDownloads.values()).map((entry) => entry.promise.catch(() => { }));
54
- cancelAllDownloads();
55
- if (downloadPromises.length > 0) {
56
- await Promise.allSettled(downloadPromises);
57
- }
43
+ isCleaningUp = true;
44
+ try {
45
+ const downloadPromises = Array.from(activeDownloads.values()).map((entry) => entry.promise.catch(() => { }));
46
+ cancelAllDownloads();
47
+ if (downloadPromises.length > 0) {
48
+ await Promise.allSettled(downloadPromises);
58
49
  }
59
- catch (error) {
60
- console.error("❌ Error during download cleanup:", error);
61
- }
62
- };
63
- let handlingExit = false;
64
- const exitHandler = async () => {
65
- if (handlingExit)
66
- return;
67
- handlingExit = true;
68
- await cleanup();
69
- process.exit(0);
70
- };
71
- process.once("SIGTERM", () => void exitHandler());
72
- process.once("SIGINT", () => void exitHandler());
50
+ }
51
+ catch (error) {
52
+ console.error("❌ Error during download cleanup:", error);
53
+ }
73
54
  };
@@ -4,6 +4,7 @@ import fetch from "bare-fetch";
4
4
  import { AbortController } from "bare-abort-controller";
5
5
  import { getModelsCacheDir, generateShortHash } from "../../../utils/index.js";
6
6
  import { getActiveDownload, registerDownload, unregisterDownload, createHttpDownloadKey, shouldClearCache, clearClearCacheFlag, } from "./download-manager.js";
7
+ import { DownloadCancelledError, HTTPError, NoResponseBodyError, ResponseBodyNotReadableError, } from "../../../../utils/errors-server.js";
7
8
  function extractFilenameFromUrl(url) {
8
9
  // Parse URL to get the filename from the path
9
10
  const urlParts = url.split("/");
@@ -27,11 +28,10 @@ async function validateCachedFile(modelPath, url, signal) {
27
28
  expectedSize = parseInt(response.headers.get("content-length") || "0");
28
29
  }
29
30
  catch (error) {
30
- console.log(`⚠️ Could not get expected file size from HEAD request: ${String(error)}`);
31
- console.log(`✅ Using cached HTTP model: ${modelPath}`);
32
- return modelPath;
31
+ console.log(`⚠️ Could not get expected file size from HEAD request, will re-download: ${String(error)}`);
32
+ return null;
33
33
  }
34
- if (expectedSize > 0 && localSize !== expectedSize) {
34
+ if (localSize !== expectedSize) {
35
35
  console.log(`📥 Cached file size mismatch. Expected: ${expectedSize}, Found: ${localSize}. Re-downloading...`);
36
36
  return null;
37
37
  }
@@ -45,7 +45,7 @@ async function validateCachedFile(modelPath, url, signal) {
45
45
  }
46
46
  async function performHttpDownload(url, modelPath, downloadKey, progressCallback, signal) {
47
47
  if (signal?.aborted) {
48
- throw new Error("Download cancelled");
48
+ throw new DownloadCancelledError();
49
49
  }
50
50
  console.log(`📥 Downloading model from HTTP: ${url}`);
51
51
  // Check if file exists for resuming
@@ -78,6 +78,16 @@ async function performHttpDownload(url, modelPath, downloadKey, progressCallback
78
78
  // Check if it's a 416 (Range Not Satisfiable) - file already complete
79
79
  if (response.status === 416 && startOffset > 0) {
80
80
  console.log(`✅ File already completely downloaded`);
81
+ // Send 100% progress for already complete file
82
+ if (progressCallback) {
83
+ progressCallback({
84
+ type: "modelProgress",
85
+ downloaded: startOffset,
86
+ total: startOffset,
87
+ percentage: 100,
88
+ downloadKey,
89
+ });
90
+ }
81
91
  return;
82
92
  }
83
93
  // Check if server doesn't support range requests
@@ -94,14 +104,14 @@ async function performHttpDownload(url, modelPath, downloadKey, progressCallback
94
104
  ...(signal && { signal }),
95
105
  });
96
106
  if (!freshResponse.ok) {
97
- throw new Error(`HTTP error: ${freshResponse.status} ${freshResponse.statusText}`);
107
+ throw new HTTPError(freshResponse.status, freshResponse.statusText);
98
108
  }
99
109
  // Use the fresh response
100
110
  Object.assign(response, freshResponse);
101
111
  }
102
112
  else if (response.status !== 206) {
103
113
  // 206 is Partial Content (successful resume)
104
- throw new Error(`HTTP error: ${response.status} ${response.statusText}`);
114
+ throw new HTTPError(response.status, response.statusText);
105
115
  }
106
116
  }
107
117
  // Get total size from headers
@@ -128,7 +138,7 @@ async function performHttpDownload(url, modelPath, downloadKey, progressCallback
128
138
  // Get the response body
129
139
  const body = response.body;
130
140
  if (!body) {
131
- throw new Error("No response body received");
141
+ throw new NoResponseBodyError();
132
142
  }
133
143
  try {
134
144
  // Check if body has pipe method (it's a Node/Bare stream)
@@ -180,7 +190,7 @@ async function performHttpDownload(url, modelPath, downloadKey, progressCallback
180
190
  // Check if abort signal is triggered
181
191
  if (signal && signal.aborted) {
182
192
  writeStream.destroy();
183
- throw new Error("Download cancelled");
193
+ throw new DownloadCancelledError();
184
194
  }
185
195
  const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
186
196
  downloadedBytes += buffer.length;
@@ -259,7 +269,7 @@ async function performHttpDownload(url, modelPath, downloadKey, progressCallback
259
269
  });
260
270
  }
261
271
  else {
262
- throw new Error("Response body is not readable");
272
+ throw new ResponseBodyNotReadableError();
263
273
  }
264
274
  }
265
275
  }
@@ -288,10 +298,41 @@ export async function downloadModelFromHttp(url, progressCallback) {
288
298
  // Check if already cached
289
299
  const cachedPath = await validateCachedFile(modelPath, url, abortController.signal);
290
300
  if (cachedPath) {
301
+ if (progressCallback) {
302
+ try {
303
+ const stats = await fsPromises.stat(cachedPath);
304
+ progressCallback({
305
+ type: "modelProgress",
306
+ downloaded: stats.size,
307
+ total: stats.size,
308
+ percentage: 100,
309
+ downloadKey,
310
+ });
311
+ }
312
+ catch {
313
+ // Ignore stat errors, file exists but might not be readable
314
+ }
315
+ }
291
316
  return cachedPath;
292
317
  }
293
318
  // Download the file
294
319
  await performHttpDownload(url, modelPath, downloadKey, progressCallback, abortController.signal);
320
+ // Send final 100% progress update
321
+ if (progressCallback) {
322
+ try {
323
+ const stats = await fsPromises.stat(modelPath);
324
+ progressCallback({
325
+ type: "modelProgress",
326
+ downloaded: stats.size,
327
+ total: stats.size,
328
+ percentage: 100,
329
+ downloadKey,
330
+ });
331
+ }
332
+ catch {
333
+ // Ignore stat errors
334
+ }
335
+ }
295
336
  return modelPath;
296
337
  }
297
338
  catch (error) {