@qvac/sdk 0.5.0 → 0.6.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 (259) hide show
  1. package/README.md +48 -11
  2. package/bare-imports.json +35 -0
  3. package/dist/client/api/cancel.d.ts +12 -3
  4. package/dist/client/api/cancel.js +12 -3
  5. package/dist/client/api/get-model-info.d.ts +2 -2
  6. package/dist/client/api/get-model-info.js +2 -2
  7. package/dist/client/api/index.d.ts +2 -1
  8. package/dist/client/api/index.js +2 -1
  9. package/dist/client/api/load-model.js +6 -1
  10. package/dist/client/api/ocr.d.ts +31 -0
  11. package/dist/client/api/ocr.js +88 -0
  12. package/dist/client/api/rag.d.ts +215 -20
  13. package/dist/client/api/rag.js +382 -23
  14. package/dist/client/api/translate.js +10 -11
  15. package/dist/client/api/unload-model.js +1 -1
  16. package/dist/client/init-hooks.d.ts +4 -3
  17. package/dist/client/init-hooks.js +40 -31
  18. package/dist/client/rpc/bare-client.d.ts +1 -178
  19. package/dist/client/rpc/bare-client.js +42 -9
  20. package/dist/client/rpc/expo-rpc-client.js +57 -2
  21. package/dist/client/rpc/node-rpc-client.js +5 -1
  22. package/dist/client/rpc/rpc-client.d.ts +1 -1
  23. package/dist/client/rpc/rpc-client.js +11 -57
  24. package/dist/examples/config/blind-relay/blind-relay.config.d.ts +5 -0
  25. package/dist/examples/config/blind-relay/blind-relay.config.js +7 -0
  26. package/dist/examples/config/default/default.config.d.ts +8 -0
  27. package/dist/examples/config/default/default.config.js +6 -0
  28. package/dist/examples/default-config-usage.d.ts +17 -0
  29. package/dist/examples/default-config-usage.js +47 -0
  30. package/dist/examples/delegated-inference/consumer.js +1 -0
  31. package/dist/examples/download-with-blind-relays.js +4 -3
  32. package/dist/examples/embed-hyperdrive.js +4 -0
  33. package/dist/examples/kv-cache-custom-key.js +16 -1
  34. package/dist/examples/llamacpp-sharded.js +12 -3
  35. package/dist/examples/ocr-fasttext.d.ts +2 -0
  36. package/dist/examples/ocr-fasttext.js +52 -0
  37. package/dist/examples/quickstart.d.ts +2 -0
  38. package/dist/examples/quickstart.js +28 -0
  39. package/dist/examples/rag/rag-hyperdb/cancellation.d.ts +2 -0
  40. package/dist/examples/rag/rag-hyperdb/cancellation.js +75 -0
  41. package/dist/examples/rag/rag-hyperdb/ingest.d.ts +2 -0
  42. package/dist/examples/rag/{rag-hyperdb.js → rag-hyperdb/ingest.js} +10 -4
  43. package/dist/examples/rag/rag-hyperdb/pipeline.d.ts +2 -0
  44. package/dist/examples/rag/rag-hyperdb/pipeline.js +74 -0
  45. package/dist/examples/rag/rag-hyperdb/workspaces.d.ts +2 -0
  46. package/dist/examples/rag/rag-hyperdb/workspaces.js +178 -0
  47. package/dist/examples/translation/translation-bergamot-batch.d.ts +2 -0
  48. package/dist/examples/translation/translation-bergamot-batch.js +49 -0
  49. package/dist/examples/translation/translation-bergamot.d.ts +2 -0
  50. package/dist/examples/translation/translation-bergamot.js +39 -0
  51. package/dist/examples/translation/translation-indic.js +1 -0
  52. package/dist/examples/translation/translation-opus.js +1 -0
  53. package/dist/examples/translation/translation-stream.js +1 -0
  54. package/dist/expo/plugins/withMobileBundle.js +29 -10
  55. package/dist/index.d.ts +3 -2
  56. package/dist/index.js +3 -1
  57. package/dist/logging/addon.js +23 -7
  58. package/dist/logging/base-logger.js +2 -2
  59. package/dist/logging/client-logger.js +15 -4
  60. package/dist/logging/index.d.ts +1 -0
  61. package/dist/logging/index.js +1 -0
  62. package/dist/logging/logger.js +11 -3
  63. package/dist/logging/namespaces.d.ts +1 -0
  64. package/dist/logging/namespaces.js +1 -0
  65. package/dist/logging/registry.d.ts +5 -0
  66. package/dist/logging/registry.js +17 -5
  67. package/dist/logging/transport.js +2 -2
  68. package/dist/logging/utils.d.ts +2 -0
  69. package/dist/logging/utils.js +62 -0
  70. package/dist/models/hyperdrive/models.d.ts +1096 -178
  71. package/dist/models/hyperdrive/models.js +1476 -507
  72. package/dist/schemas/archive.d.ts +9 -0
  73. package/dist/schemas/archive.js +17 -0
  74. package/dist/schemas/cancel.d.ts +6 -0
  75. package/dist/schemas/cancel.js +5 -0
  76. package/dist/schemas/common.d.ts +582 -77
  77. package/dist/schemas/common.js +6 -1
  78. package/dist/schemas/delegate.d.ts +1 -0
  79. package/dist/schemas/delegate.js +1 -0
  80. package/dist/schemas/download-asset.d.ts +21 -9
  81. package/dist/schemas/get-model-info.d.ts +12 -10
  82. package/dist/schemas/get-model-info.js +9 -1
  83. package/dist/schemas/index.d.ts +6 -2
  84. package/dist/schemas/index.js +9 -2
  85. package/dist/schemas/llamacpp-config.d.ts +112 -8
  86. package/dist/schemas/llamacpp-config.js +40 -8
  87. package/dist/schemas/load-model.d.ts +2993 -525
  88. package/dist/schemas/load-model.js +88 -33
  89. package/dist/schemas/logging-stream.d.ts +2 -2
  90. package/dist/schemas/model-src-utils.d.ts +38 -16
  91. package/dist/schemas/model-src-utils.js +4 -8
  92. package/dist/schemas/model-types.d.ts +154 -0
  93. package/dist/schemas/model-types.js +140 -0
  94. package/dist/schemas/ocr.d.ts +88 -0
  95. package/dist/schemas/ocr.js +52 -0
  96. package/dist/schemas/rag.d.ts +183 -52
  97. package/dist/schemas/rag.js +148 -23
  98. package/dist/schemas/reload-config.d.ts +20 -8
  99. package/dist/schemas/reload-config.js +7 -5
  100. package/dist/schemas/runtime-context.d.ts +19 -0
  101. package/dist/schemas/runtime-context.js +7 -0
  102. package/dist/schemas/sdk-config.d.ts +697 -2
  103. package/dist/schemas/sdk-config.js +99 -1
  104. package/dist/schemas/sdk-errors-client.d.ts +1 -0
  105. package/dist/schemas/sdk-errors-client.js +5 -0
  106. package/dist/schemas/sdk-errors-server.d.ts +14 -0
  107. package/dist/schemas/sdk-errors-server.js +70 -0
  108. package/dist/schemas/shard.d.ts +21 -0
  109. package/dist/schemas/shard.js +17 -0
  110. package/dist/schemas/translate.d.ts +68 -23
  111. package/dist/schemas/translate.js +37 -11
  112. package/dist/schemas/translation-config.d.ts +272 -29
  113. package/dist/schemas/translation-config.js +63 -6
  114. package/dist/scripts/run-unit-tests.d.ts +2 -0
  115. package/dist/scripts/run-unit-tests.js +17 -0
  116. package/dist/server/bare/addons/llamacpp-completion/cache-logger.d.ts +6 -0
  117. package/dist/server/bare/addons/llamacpp-completion/cache-logger.js +34 -0
  118. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/create-model.d.ts +1 -5
  119. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/create-model.js +3 -26
  120. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/handlers/completion-stream.js +26 -7
  121. package/dist/server/bare/addons/llamacpp-completion/index.d.ts +4 -0
  122. package/dist/server/bare/addons/llamacpp-completion/index.js +3 -0
  123. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/kv-cache-utils.d.ts +4 -1
  124. package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/kv-cache-utils.js +43 -10
  125. package/dist/server/bare/addons/llamacpp-embedding/create-model.d.ts +8 -0
  126. package/dist/server/bare/addons/llamacpp-embedding/create-model.js +38 -0
  127. package/dist/server/bare/addons/llamacpp-embedding/index.d.ts +3 -0
  128. package/dist/server/bare/addons/llamacpp-embedding/index.js +2 -0
  129. package/dist/server/bare/addons/load-model.js +28 -24
  130. package/dist/server/bare/addons/{translation → nmtcpp-translation}/create-model.js +23 -8
  131. package/dist/server/bare/addons/{translation → nmtcpp-translation}/handlers/translate.js +35 -11
  132. package/dist/server/bare/addons/onnx-ocr/create-model.d.ts +10 -0
  133. package/dist/server/bare/addons/onnx-ocr/create-model.js +39 -0
  134. package/dist/server/bare/addons/onnx-ocr/handlers/ocr-stream.d.ts +10 -0
  135. package/dist/server/bare/addons/onnx-ocr/handlers/ocr-stream.js +109 -0
  136. package/dist/server/bare/addons/onnx-ocr/index.d.ts +3 -0
  137. package/dist/server/bare/addons/onnx-ocr/index.js +2 -0
  138. package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/create-model.js +2 -1
  139. package/dist/server/bare/delegate-rpc-client.js +19 -1
  140. package/dist/server/bare/rag-hyperdb/handlers/chunk.d.ts +3 -0
  141. package/dist/server/bare/rag-hyperdb/handlers/chunk.js +7 -0
  142. package/dist/server/bare/rag-hyperdb/handlers/close-workspace.d.ts +3 -0
  143. package/dist/server/bare/rag-hyperdb/handlers/close-workspace.js +9 -0
  144. package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.d.ts +1 -1
  145. package/dist/server/bare/rag-hyperdb/handlers/delete-embeddings.js +9 -10
  146. package/dist/server/bare/rag-hyperdb/handlers/delete-workspace.d.ts +3 -0
  147. package/dist/server/bare/rag-hyperdb/handlers/delete-workspace.js +14 -0
  148. package/dist/server/bare/rag-hyperdb/handlers/ingest.d.ts +9 -0
  149. package/dist/server/bare/rag-hyperdb/handlers/ingest.js +18 -0
  150. package/dist/server/bare/rag-hyperdb/handlers/list-workspaces.d.ts +3 -0
  151. package/dist/server/bare/rag-hyperdb/handlers/list-workspaces.js +4 -0
  152. package/dist/server/bare/rag-hyperdb/handlers/reindex.d.ts +9 -0
  153. package/dist/server/bare/rag-hyperdb/handlers/reindex.js +16 -0
  154. package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.d.ts +7 -4
  155. package/dist/server/bare/rag-hyperdb/handlers/save-embeddings.js +13 -14
  156. package/dist/server/bare/rag-hyperdb/handlers/search.js +10 -10
  157. package/dist/server/bare/rag-hyperdb/index.d.ts +8 -1
  158. package/dist/server/bare/rag-hyperdb/index.js +8 -1
  159. package/dist/server/bare/rag-hyperdb/rag-operation-manager.d.ts +7 -0
  160. package/dist/server/bare/rag-hyperdb/rag-operation-manager.js +39 -0
  161. package/dist/server/bare/rag-hyperdb/rag-workspace-manager.d.ts +15 -0
  162. package/dist/server/bare/rag-hyperdb/rag-workspace-manager.js +135 -0
  163. package/dist/server/bare/registry/config-registry.js +11 -0
  164. package/dist/server/bare/registry/logging-stream-registry.js +3 -3
  165. package/dist/server/bare/registry/model-config-registry.d.ts +4 -0
  166. package/dist/server/bare/registry/model-config-registry.js +15 -0
  167. package/dist/server/bare/registry/model-config-utils.d.ts +15 -0
  168. package/dist/server/bare/registry/model-config-utils.js +121 -0
  169. package/dist/server/bare/registry/model-registry.d.ts +6 -29
  170. package/dist/server/bare/registry/runtime-context-registry.d.ts +7 -0
  171. package/dist/server/bare/registry/runtime-context-registry.js +26 -0
  172. package/dist/server/bare/utils/loader-adapter.d.ts +7 -0
  173. package/dist/server/bare/utils/loader-adapter.js +9 -0
  174. package/dist/server/error-handlers.js +4 -2
  175. package/dist/server/rpc/handle-request.js +91 -9
  176. package/dist/server/rpc/handlers/cancelHandler.js +10 -1
  177. package/dist/server/rpc/handlers/completion-stream.js +1 -1
  178. package/dist/server/rpc/handlers/delete-cache.js +1 -1
  179. package/dist/server/rpc/handlers/embed.js +1 -1
  180. package/dist/server/rpc/handlers/get-model-info.d.ts +1 -1
  181. package/dist/server/rpc/handlers/get-model-info.js +22 -10
  182. package/dist/server/rpc/handlers/index.d.ts +4 -1
  183. package/dist/server/rpc/handlers/index.js +2 -0
  184. package/dist/server/rpc/handlers/load-model/download-manager.d.ts +11 -11
  185. package/dist/server/rpc/handlers/load-model/download-manager.js +36 -26
  186. package/dist/server/rpc/handlers/{load-model.d.ts → load-model/handler.d.ts} +2 -2
  187. package/dist/server/rpc/handlers/load-model/handler.js +179 -0
  188. package/dist/server/rpc/handlers/load-model/http.js +342 -33
  189. package/dist/server/rpc/handlers/load-model/hyperdrive.js +5 -3
  190. package/dist/server/rpc/handlers/load-model/index.d.ts +2 -2
  191. package/dist/server/rpc/handlers/load-model/index.js +2 -2
  192. package/dist/server/rpc/handlers/load-model/resolve.js +32 -3
  193. package/dist/server/rpc/handlers/load-model-delegated.js +6 -3
  194. package/dist/server/rpc/handlers/ocr-stream.d.ts +3 -0
  195. package/dist/server/rpc/handlers/ocr-stream.js +39 -0
  196. package/dist/server/rpc/handlers/rag.d.ts +2 -2
  197. package/dist/server/rpc/handlers/rag.js +107 -43
  198. package/dist/server/rpc/handlers/text-to-speech.js +1 -1
  199. package/dist/server/rpc/handlers/transcribe-stream.js +1 -1
  200. package/dist/server/rpc/handlers/translate.js +6 -15
  201. package/dist/server/utils/archive.d.ts +3 -0
  202. package/dist/server/utils/archive.js +171 -0
  203. package/dist/server/utils/audio/decoder.js +2 -2
  204. package/dist/server/utils/cache.d.ts +5 -5
  205. package/dist/server/utils/cache.js +6 -6
  206. package/dist/server/utils/config-transform.d.ts +2 -2
  207. package/dist/server/utils/config-transform.js +8 -6
  208. package/dist/server/utils/formatting.d.ts +13 -0
  209. package/dist/server/utils/formatting.js +26 -0
  210. package/dist/server/utils/gguf-tensor-extractor.d.ts +15 -0
  211. package/dist/server/utils/gguf-tensor-extractor.js +314 -0
  212. package/dist/server/utils/index.d.ts +3 -1
  213. package/dist/server/utils/index.js +3 -1
  214. package/dist/server/utils/shard-utils.d.ts +42 -16
  215. package/dist/server/utils/shard-utils.js +95 -7
  216. package/dist/server/worker.js +8 -3
  217. package/dist/utils/errors-base.d.ts +1 -1
  218. package/dist/utils/errors-base.js +2 -2
  219. package/dist/utils/errors-client.d.ts +12 -0
  220. package/dist/utils/errors-client.js +20 -0
  221. package/dist/utils/errors-server.d.ts +33 -0
  222. package/dist/utils/errors-server.js +55 -0
  223. package/package.json +40 -15
  224. package/dist/client/rpc/bare-rpc-client.d.ts +0 -4
  225. package/dist/client/rpc/bare-rpc-client.js +0 -94
  226. package/dist/examples/config/config-path.d.ts +0 -8
  227. package/dist/examples/config/config-path.js +0 -13
  228. package/dist/examples/rag/rag-hyperdb-workspaces.d.ts +0 -2
  229. package/dist/examples/rag/rag-hyperdb-workspaces.js +0 -106
  230. package/dist/examples/rag/rag-hyperdb.d.ts +0 -2
  231. package/dist/server/bare/addons/llamacpp/index.d.ts +0 -4
  232. package/dist/server/bare/addons/llamacpp/index.js +0 -3
  233. package/dist/server/bare/rag-hyperdb/rag-manager.d.ts +0 -5
  234. package/dist/server/bare/rag-hyperdb/rag-manager.js +0 -66
  235. package/dist/server/rpc/handlers/load-model.js +0 -111
  236. package/dist/server/utils/hash.d.ts +0 -5
  237. package/dist/server/utils/hash.js +0 -11
  238. package/dist/utils/getProcessSafe.d.ts +0 -7
  239. package/dist/utils/getProcessSafe.js +0 -17
  240. package/dist/utils/runtime.d.ts +0 -30
  241. package/dist/utils/runtime.js +0 -48
  242. /package/dist/server/bare/addons/{llamacpp → llamacpp-completion}/handlers/completion-stream.d.ts +0 -0
  243. /package/dist/server/bare/addons/{llamacpp → llamacpp-embedding}/handlers/embed.d.ts +0 -0
  244. /package/dist/server/bare/addons/{llamacpp → llamacpp-embedding}/handlers/embed.js +0 -0
  245. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/create-model.d.ts +0 -0
  246. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/handlers/translate.d.ts +0 -0
  247. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/index.d.ts +0 -0
  248. /package/dist/server/bare/addons/{translation → nmtcpp-translation}/index.js +0 -0
  249. /package/dist/server/bare/addons/{tts → onnx-tts}/create-model.d.ts +0 -0
  250. /package/dist/server/bare/addons/{tts → onnx-tts}/create-model.js +0 -0
  251. /package/dist/server/bare/addons/{tts → onnx-tts}/handlers/text-to-speech.d.ts +0 -0
  252. /package/dist/server/bare/addons/{tts → onnx-tts}/handlers/text-to-speech.js +0 -0
  253. /package/dist/server/bare/addons/{tts → onnx-tts}/index.d.ts +0 -0
  254. /package/dist/server/bare/addons/{tts → onnx-tts}/index.js +0 -0
  255. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/create-model.d.ts +0 -0
  256. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/handlers/transcribe-stream.d.ts +0 -0
  257. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/handlers/transcribe-stream.js +0 -0
  258. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/index.d.ts +0 -0
  259. /package/dist/server/bare/addons/{whispercpp → whispercpp-transcription}/index.js +0 -0
@@ -0,0 +1,121 @@
1
+ import { ModelType, } from "../../../schemas/index.js";
2
+ import { llmConfigSchema, embedConfigSchema } from "../../../schemas/llamacpp-config.js";
3
+ import { whisperConfigSchema } from "../../../schemas/whispercpp-config.js";
4
+ import { ocrConfigSchema } from "../../../schemas/ocr.js";
5
+ export const CANONICAL_TO_ALIAS = {
6
+ [ModelType.llamacppCompletion]: "llm",
7
+ [ModelType.llamacppEmbedding]: "embeddings",
8
+ [ModelType.whispercppTranscription]: "whisper",
9
+ [ModelType.nmtcppTranslation]: "nmt",
10
+ [ModelType.onnxTts]: "tts",
11
+ [ModelType.onnxOcr]: "ocr",
12
+ };
13
+ export const MODEL_CONFIG_SCHEMAS = {
14
+ [ModelType.llamacppCompletion]: llmConfigSchema,
15
+ [ModelType.llamacppEmbedding]: embedConfigSchema,
16
+ [ModelType.whispercppTranscription]: whisperConfigSchema,
17
+ [ModelType.onnxOcr]: ocrConfigSchema,
18
+ };
19
+ // Ordered general → specific (later patterns override earlier)
20
+ export const BUILTIN_DEVICE_PATTERNS = [
21
+ {
22
+ name: "Android devices (SDK default)",
23
+ match: {
24
+ platform: "android",
25
+ },
26
+ defaults: {
27
+ [ModelType.llamacppEmbedding]: { flashAttention: "off" },
28
+ },
29
+ },
30
+ {
31
+ name: "Pixel devices (SDK default)",
32
+ match: {
33
+ platform: "android",
34
+ deviceBrand: "google",
35
+ deviceModelPrefix: "Pixel",
36
+ },
37
+ defaults: {
38
+ [ModelType.llamacppCompletion]: { device: "cpu" },
39
+ [ModelType.llamacppEmbedding]: { device: "cpu" },
40
+ },
41
+ },
42
+ {
43
+ name: "iPhone 17",
44
+ match: {
45
+ platform: "ios",
46
+ deviceModelPrefix: "iPhone 17",
47
+ },
48
+ defaults: {
49
+ [ModelType.llamacppCompletion]: { device: "cpu" },
50
+ [ModelType.llamacppEmbedding]: { device: "cpu" },
51
+ },
52
+ },
53
+ ];
54
+ export function matchesPattern(ctx, match) {
55
+ if (match.platform !== undefined && ctx.platform !== match.platform) {
56
+ return false;
57
+ }
58
+ if (match.deviceBrand !== undefined &&
59
+ ctx.deviceBrand?.toLowerCase() !== match.deviceBrand.toLowerCase()) {
60
+ return false;
61
+ }
62
+ if (match.deviceModelPrefix !== undefined &&
63
+ !(ctx.deviceModel?.startsWith(match.deviceModelPrefix) ?? false)) {
64
+ return false;
65
+ }
66
+ if (match.deviceModelContains !== undefined &&
67
+ !(ctx.deviceModel?.includes(match.deviceModelContains) ?? false)) {
68
+ return false;
69
+ }
70
+ return true;
71
+ }
72
+ export function findAllMatchingPatterns(ctx, patterns) {
73
+ return patterns.filter((pattern) => matchesPattern(ctx, pattern.match));
74
+ }
75
+ export function getDefaultsFromPattern(modelType, pattern) {
76
+ let defaults = pattern.defaults[modelType];
77
+ if (!defaults) {
78
+ const aliasKey = CANONICAL_TO_ALIAS[modelType];
79
+ if (aliasKey && aliasKey in pattern.defaults) {
80
+ defaults = pattern.defaults[aliasKey];
81
+ }
82
+ }
83
+ return defaults;
84
+ }
85
+ export function resolveModelConfigWithContext(modelType, userInput, ctx, userPatterns, builtinPatterns = BUILTIN_DEVICE_PATTERNS, onLog) {
86
+ // Find ALL matching patterns (general → specific order preserved)
87
+ const matchingBuiltin = findAllMatchingPatterns(ctx, builtinPatterns);
88
+ const matchingUser = findAllMatchingPatterns(ctx, userPatterns);
89
+ // Merge in order: builtin patterns → user patterns → user input
90
+ // Later values override earlier (more specific wins)
91
+ const appliedPatterns = [];
92
+ let mergedDefaults = {};
93
+ for (const pattern of matchingBuiltin) {
94
+ const defaults = getDefaultsFromPattern(modelType, pattern);
95
+ if (defaults) {
96
+ appliedPatterns.push(pattern.name);
97
+ mergedDefaults = { ...mergedDefaults, ...defaults };
98
+ }
99
+ }
100
+ for (const pattern of matchingUser) {
101
+ const defaults = getDefaultsFromPattern(modelType, pattern);
102
+ if (defaults) {
103
+ appliedPatterns.push(pattern.name);
104
+ mergedDefaults = { ...mergedDefaults, ...defaults };
105
+ }
106
+ }
107
+ const merged = {
108
+ ...mergedDefaults,
109
+ ...userInput,
110
+ };
111
+ const schema = MODEL_CONFIG_SCHEMAS[modelType];
112
+ const finalConfig = schema ? schema.parse(merged) : merged;
113
+ if (onLog) {
114
+ onLog({
115
+ appliedPatterns,
116
+ mergedDefaults,
117
+ finalConfig: finalConfig,
118
+ });
119
+ }
120
+ return finalConfig;
121
+ }
@@ -1,36 +1,13 @@
1
- import type EventEmitter from "events";
2
1
  import type FilesystemDL from "@qvac/dl-filesystem";
3
- import type { ModelType } from "../../../schemas/index";
2
+ import type { CanonicalModelType } from "../../../schemas/index";
3
+ import type BaseInference from "@qvac/infer-base";
4
4
  interface AddonInterface {
5
5
  cancel(jobId?: string): Promise<void>;
6
6
  }
7
- export interface AnyModel {
8
- load(...args: unknown[]): Promise<void>;
9
- run(input: unknown): Promise<EventEmitter & {
10
- onUpdate(callback: (data: string) => void): {
11
- await: () => Promise<void>;
12
- };
13
- onUpdate(callback: (data: {
14
- outputArray: Int16Array;
15
- }) => void): {
16
- await: () => Promise<void>;
17
- };
18
- onError(callback: (error: Error) => void): void;
19
- onUpdate(callback: (data: Array<{
20
- text: string;
21
- }>) => void): {
22
- await: () => Promise<void>;
23
- };
24
- cancel(): Promise<void>;
25
- iterate(): AsyncIterableIterator<string | Array<{
26
- text: string;
27
- }>>;
28
- await(): Promise<void>;
29
- }>;
7
+ export type AnyModel = Omit<BaseInference, "addon"> & {
30
8
  reload?(config: unknown): Promise<void>;
31
- unload?(): Promise<void>;
32
9
  addon?: AddonInterface;
33
- }
10
+ };
34
11
  interface DelegateOptions {
35
12
  topic: string;
36
13
  providerPublicKey: string;
@@ -41,7 +18,7 @@ interface LocalOptions {
41
18
  path: string;
42
19
  loadedAt: Date;
43
20
  config: unknown;
44
- modelType: ModelType;
21
+ modelType: CanonicalModelType;
45
22
  name?: string | undefined;
46
23
  loader: FilesystemDL;
47
24
  }
@@ -55,7 +32,7 @@ export declare function registerModel(id: string, options: {
55
32
  model: AnyModel;
56
33
  path: string;
57
34
  config: unknown;
58
- modelType: ModelType;
35
+ modelType: CanonicalModelType;
59
36
  loader: FilesystemDL;
60
37
  name?: string | undefined;
61
38
  } | {
@@ -0,0 +1,7 @@
1
+ import type { RuntimeContext } from "../../../schemas/index";
2
+ export declare function setRuntimeContext(ctx: RuntimeContext): void;
3
+ export declare function getRuntimeContext(): RuntimeContext;
4
+ export declare function isMobile(): boolean;
5
+ export declare function isAndroid(): boolean;
6
+ export declare function isIOS(): boolean;
7
+ //# sourceMappingURL=runtime-context-registry.d.ts.map
@@ -0,0 +1,26 @@
1
+ // ============================================
2
+ // Runtime context state
3
+ // ============================================
4
+ let context = {};
5
+ let isSet = false;
6
+ export function setRuntimeContext(ctx) {
7
+ if (isSet)
8
+ return;
9
+ context = ctx;
10
+ isSet = true;
11
+ }
12
+ export function getRuntimeContext() {
13
+ return context;
14
+ }
15
+ // ============================================
16
+ // Convenience helpers
17
+ // ============================================
18
+ export function isMobile() {
19
+ return context.runtime === "react-native";
20
+ }
21
+ export function isAndroid() {
22
+ return context.platform === "android";
23
+ }
24
+ export function isIOS() {
25
+ return context.platform === "ios";
26
+ }
@@ -0,0 +1,7 @@
1
+ import type FilesystemDL from "@qvac/dl-filesystem";
2
+ /**
3
+ * Adapts FilesystemDL to addon Loader interface by adding download stub.
4
+ * download() is never called when using filesystem loader.
5
+ */
6
+ export declare function asLoader<T>(loader: FilesystemDL): T;
7
+ //# sourceMappingURL=loader-adapter.d.ts.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Adapts FilesystemDL to addon Loader interface by adding download stub.
3
+ * download() is never called when using filesystem loader.
4
+ */
5
+ export function asLoader(loader) {
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access
7
+ loader.download = () => Promise.reject(new Error("download not supported"));
8
+ return loader;
9
+ }
@@ -1,4 +1,6 @@
1
1
  import { createErrorResponse, responseSchema } from "../schemas/index.js";
2
+ import { getServerLogger } from "../logging/index.js";
3
+ const logger = getServerLogger();
2
4
  export function sendErrorResponse(req, error) {
3
5
  try {
4
6
  const errorResponse = createErrorResponse(error);
@@ -6,7 +8,7 @@ export function sendErrorResponse(req, error) {
6
8
  req.reply(responseData, "utf-8");
7
9
  }
8
10
  catch (responseError) {
9
- console.error("Failed to create error response:", responseError);
11
+ logger.error("Failed to create error response:", responseError);
10
12
  const fallbackError = createErrorResponse(new Error("Internal server error"));
11
13
  req.reply(JSON.stringify(fallbackError), "utf-8");
12
14
  }
@@ -19,7 +21,7 @@ export function sendStreamErrorResponse(stream, error) {
19
21
  stream.end();
20
22
  }
21
23
  catch (responseError) {
22
- console.error("Failed to create stream error response:", responseError);
24
+ logger.error("Failed to create stream error response:", responseError);
23
25
  const fallbackError = createErrorResponse(new Error("Internal server error"));
24
26
  stream.write(JSON.stringify(fallbackError) + "\n", "utf-8");
25
27
  stream.end();
@@ -1,11 +1,12 @@
1
1
  import { requestSchema, responseSchema, } from "../../schemas/index.js";
2
2
  import { handleCompletionStream } from "./handlers/completion-stream.js";
3
3
  import { handleDownloadAsset } from "./handlers/download-asset.js";
4
- import { handleLoadModel } from "./handlers/load-model.js";
4
+ import { handleLoadModel } from "./handlers/load-model/index.js";
5
5
  import { handleLoadModelDelegated } from "./handlers/load-model-delegated.js";
6
6
  import { handleCompletionStreamDelegated } from "./handlers/completion-stream-delegated.js";
7
7
  import { getModelEntry } from "../bare/registry/model-registry.js";
8
8
  import { setSDKConfig } from "../bare/registry/config-registry.js";
9
+ import { setRuntimeContext } from "../bare/registry/runtime-context-registry.js";
9
10
  import { handleUnloadModel } from "./handlers/unload-model.js";
10
11
  import { handleTranscribeStream } from "./handlers/transcribe-stream.js";
11
12
  import { handleEmbed } from "./handlers/embed.js";
@@ -18,8 +19,11 @@ import { handleRag } from "./handlers/rag.js";
18
19
  import { handleDeleteCache } from "./handlers/delete-cache.js";
19
20
  import { handleTextToSpeech } from "./handlers/text-to-speech.js";
20
21
  import { handleGetModelInfo } from "./handlers/get-model-info.js";
22
+ import { handleOCRStream } from "./handlers/ocr-stream.js";
21
23
  import { sendErrorResponse, sendStreamErrorResponse, } from "../error-handlers.js";
22
24
  import { NoDataReceivedError, UnknownRequestTypeError, } from "../../utils/errors-client.js";
25
+ import { normalizeModelType } from "../../schemas/index.js";
26
+ import { resolveModelConfig } from "../bare/registry/model-config-registry.js";
23
27
  export async function handleRequest(req) {
24
28
  try {
25
29
  const rawData = req.data?.toString();
@@ -33,8 +37,13 @@ export async function handleRequest(req) {
33
37
  "type" in jsonData &&
34
38
  jsonData.type === "__init_config") {
35
39
  try {
36
- const configData = jsonData;
37
- setSDKConfig(configData.config);
40
+ const initData = jsonData;
41
+ if (initData.config) {
42
+ setSDKConfig(initData.config);
43
+ }
44
+ if (initData.runtimeContext) {
45
+ setRuntimeContext(initData.runtimeContext);
46
+ }
38
47
  req.reply(JSON.stringify({ success: true }), "utf-8");
39
48
  }
40
49
  catch (error) {
@@ -45,7 +54,8 @@ export async function handleRequest(req) {
45
54
  }
46
55
  return;
47
56
  }
48
- const request = requestSchema.parse(jsonData);
57
+ const processedData = applyDeviceDefaultsToRequest(jsonData);
58
+ const request = requestSchema.parse(processedData);
49
59
  switch (request.type) {
50
60
  case "downloadAsset": {
51
61
  if (request.withProgress) {
@@ -235,12 +245,35 @@ export async function handleRequest(req) {
235
245
  break;
236
246
  }
237
247
  case "rag": {
238
- try {
239
- const response = await handleRag(request);
240
- req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
248
+ // Only ingest, saveEmbeddings, and reindex support progress
249
+ const supportsProgress = request.operation === "ingest" ||
250
+ request.operation === "saveEmbeddings" ||
251
+ request.operation === "reindex";
252
+ const withProgress = supportsProgress && request.withProgress;
253
+ if (withProgress) {
254
+ const stream = req.createResponseStream();
255
+ try {
256
+ const response = await handleRag(request, (update) => {
257
+ const data = JSON.stringify(responseSchema.parse(update));
258
+ stream.write(data + "\n", "utf-8");
259
+ });
260
+ // Send final response
261
+ const data = JSON.stringify(responseSchema.parse(response));
262
+ stream.write(data + "\n", "utf-8");
263
+ stream.end();
264
+ }
265
+ catch (error) {
266
+ sendStreamErrorResponse(stream, error);
267
+ }
241
268
  }
242
- catch (error) {
243
- sendErrorResponse(req, error);
269
+ else {
270
+ try {
271
+ const response = await handleRag(request);
272
+ req.reply(JSON.stringify(responseSchema.parse(response)), "utf-8");
273
+ }
274
+ catch (error) {
275
+ sendErrorResponse(req, error);
276
+ }
244
277
  }
245
278
  break;
246
279
  }
@@ -279,6 +312,21 @@ export async function handleRequest(req) {
279
312
  }
280
313
  break;
281
314
  }
315
+ case "ocrStream": {
316
+ const stream = req.createResponseStream();
317
+ try {
318
+ for await (const response of handleOCRStream(request)) {
319
+ const validatedResponse = responseSchema.parse(response);
320
+ const data = JSON.stringify(validatedResponse);
321
+ stream.write(data + "\n", "utf-8");
322
+ }
323
+ stream.end();
324
+ }
325
+ catch (error) {
326
+ sendStreamErrorResponse(stream, error);
327
+ }
328
+ break;
329
+ }
282
330
  default: {
283
331
  throw new UnknownRequestTypeError();
284
332
  }
@@ -288,3 +336,37 @@ export async function handleRequest(req) {
288
336
  sendErrorResponse(req, error);
289
337
  }
290
338
  }
339
+ /**
340
+ * Apply device-specific config defaults to loadModel requests before schema parsing.
341
+ * This ensures device defaults are applied before schema defaults.
342
+ *
343
+ * Priority: User config > Device defaults > Schema defaults
344
+ */
345
+ function applyDeviceDefaultsToRequest(data) {
346
+ if (!data || typeof data !== "object")
347
+ return data;
348
+ const obj = data;
349
+ const requestType = obj["type"];
350
+ // Only process loadModel requests (not reload config which uses modelId)
351
+ if (requestType !== "loadModel" ||
352
+ !obj["modelType"] ||
353
+ !("modelSrc" in obj)) {
354
+ return data;
355
+ }
356
+ // Normalize model type to canonical form
357
+ let canonicalType;
358
+ try {
359
+ canonicalType = normalizeModelType(obj["modelType"]);
360
+ }
361
+ catch {
362
+ // Invalid model type, let schema validation handle it
363
+ return data;
364
+ }
365
+ // Apply device defaults and full schema defaults to modelConfig
366
+ const rawConfig = obj["modelConfig"] ?? {};
367
+ const configWithDefaults = resolveModelConfig(canonicalType, rawConfig);
368
+ return {
369
+ ...obj,
370
+ modelConfig: configWithDefaults,
371
+ };
372
+ }
@@ -1,5 +1,6 @@
1
1
  import { cancel } from "../../bare/addons/index.js";
2
2
  import { createCancelFunction } from "./load-model/download-manager.js";
3
+ import { cancelRagOperation, DEFAULT_WORKSPACE, } from "../../bare/rag-hyperdb/index.js";
3
4
  import { getServerLogger } from "../../../logging/index.js";
4
5
  const logger = getServerLogger();
5
6
  export async function cancelHandler(request) {
@@ -8,10 +9,18 @@ export async function cancelHandler(request) {
8
9
  case "inference":
9
10
  await cancel({ modelId: request.modelId });
10
11
  break;
11
- case "downloadAsset":
12
+ case "downloadAsset": {
12
13
  const cancelDownload = createCancelFunction(request.downloadKey, request.clearCache);
13
14
  cancelDownload();
14
15
  break;
16
+ }
17
+ case "rag": {
18
+ const cancelled = cancelRagOperation(request.workspace);
19
+ if (!cancelled) {
20
+ logger.warn(`No active RAG operation to cancel for workspace: ${request.workspace ?? DEFAULT_WORKSPACE}`);
21
+ }
22
+ break;
23
+ }
15
24
  }
16
25
  return {
17
26
  type: "cancel",
@@ -1,4 +1,4 @@
1
- import { completion } from "../../bare/addons/llamacpp/index.js";
1
+ import { completion } from "../../bare/addons/llamacpp-completion/index.js";
2
2
  export async function* handleCompletionStream(request) {
3
3
  const filteredHistory = request.history.map(({ role, content, attachments }) => ({
4
4
  role,
@@ -1,4 +1,4 @@
1
- import { deleteCache as deleteCacheUtil } from "../../bare/addons/llamacpp/kv-cache-utils.js";
1
+ import { deleteCache as deleteCacheUtil } from "../../bare/addons/llamacpp-completion/index.js";
2
2
  import { getServerLogger } from "../../../logging/index.js";
3
3
  const logger = getServerLogger();
4
4
  export async function handleDeleteCache(request) {
@@ -1,4 +1,4 @@
1
- import { embed } from "../../bare/addons/llamacpp/index.js";
1
+ import { embed } from "../../bare/addons/llamacpp-embedding/index.js";
2
2
  import { getServerLogger } from "../../../logging/index.js";
3
3
  const logger = getServerLogger();
4
4
  export async function handleEmbed(request) {
@@ -1,3 +1,3 @@
1
1
  import type { GetModelInfoRequest, GetModelInfoResponse } from "../../../schemas/index";
2
- export declare const handleGetModelInfo: (request: GetModelInfoRequest) => Promise<GetModelInfoResponse>;
2
+ export declare function handleGetModelInfo(request: GetModelInfoRequest): Promise<GetModelInfoResponse>;
3
3
  //# sourceMappingURL=get-model-info.d.ts.map
@@ -6,7 +6,8 @@ import { promises as fsPromises } from "bare-fs";
6
6
  import path from "bare-path";
7
7
  import { getShardPath } from "../../utils/cache.js";
8
8
  import { ModelNotFoundError } from "../../../utils/errors-server.js";
9
- export const handleGetModelInfo = async (request) => {
9
+ import { normalizeModelType } from "../../../schemas/model-types.js";
10
+ export async function handleGetModelInfo(request) {
10
11
  const { name } = request;
11
12
  const catalogEntry = models.find((m) => m.name === name);
12
13
  if (!catalogEntry) {
@@ -34,6 +35,10 @@ export const handleGetModelInfo = async (request) => {
34
35
  }
35
36
  }
36
37
  const isLoaded = loadedInstances.length > 0;
38
+ // Normalize addon from alias to canonical (vad passes through as-is)
39
+ const normalizedAddon = catalogEntry.addon === "vad"
40
+ ? "vad"
41
+ : normalizeModelType(catalogEntry.addon);
37
42
  const modelInfo = {
38
43
  name: catalogEntry.name,
39
44
  modelId: catalogEntry.modelId,
@@ -41,7 +46,7 @@ export const handleGetModelInfo = async (request) => {
41
46
  hyperbeeKey: catalogEntry.hyperbeeKey,
42
47
  expectedSize: catalogEntry.expectedSize,
43
48
  sha256Checksum: catalogEntry.sha256Checksum,
44
- addon: catalogEntry.addon,
49
+ addon: normalizedAddon,
45
50
  isCached,
46
51
  isLoaded,
47
52
  cacheFiles,
@@ -53,7 +58,7 @@ export const handleGetModelInfo = async (request) => {
53
58
  type: "getModelInfo",
54
59
  modelInfo,
55
60
  };
56
- };
61
+ }
57
62
  async function handleShardedModel(hyperdriveKey, shardMetadata) {
58
63
  const cacheFiles = [];
59
64
  let allShardsCached = true;
@@ -66,13 +71,19 @@ async function handleShardedModel(hyperdriveKey, shardMetadata) {
66
71
  let shardCachedAt;
67
72
  try {
68
73
  const stats = await fsPromises.stat(shardPath);
69
- shardIsCached = stats.isFile();
70
- if (shardIsCached) {
74
+ const fileExists = stats.isFile();
75
+ if (fileExists) {
71
76
  shardActualSize = stats.size;
72
77
  shardCachedAt = stats.mtime;
73
- totalActualSize += stats.size;
74
- if (!latestCachedAt || stats.mtime > latestCachedAt) {
75
- latestCachedAt = stats.mtime;
78
+ shardIsCached = stats.size === shard.expectedSize;
79
+ if (shardIsCached) {
80
+ totalActualSize += stats.size;
81
+ if (!latestCachedAt || stats.mtime > latestCachedAt) {
82
+ latestCachedAt = stats.mtime;
83
+ }
84
+ }
85
+ else {
86
+ allShardsCached = false;
76
87
  }
77
88
  }
78
89
  else {
@@ -114,10 +125,11 @@ async function handleSingleFileModel(hyperdriveKey, modelId, expectedSize, sha25
114
125
  let fileCachedAt;
115
126
  try {
116
127
  const stats = await fsPromises.stat(filePath);
117
- fileIsCached = stats.isFile();
118
- if (fileIsCached) {
128
+ const fileExists = stats.isFile();
129
+ if (fileExists) {
119
130
  fileActualSize = stats.size;
120
131
  fileCachedAt = stats.mtime;
132
+ fileIsCached = stats.size === expectedSize;
121
133
  }
122
134
  }
123
135
  catch {
@@ -12,6 +12,8 @@ import { handleRag } from "./rag";
12
12
  import { cancelHandler } from "./cancelHandler";
13
13
  import { handleDeleteCache } from "./delete-cache";
14
14
  import { handleTextToSpeech } from "./text-to-speech";
15
+ import { handleGetModelInfo } from "./get-model-info";
16
+ import { handleOCRStream } from "./ocr-stream";
15
17
  export declare const handlers: {
16
18
  completionStream: typeof handleCompletionStream;
17
19
  downloadAsset: typeof handleDownloadAsset;
@@ -27,6 +29,7 @@ export declare const handlers: {
27
29
  rag: typeof handleRag;
28
30
  cancel: typeof cancelHandler;
29
31
  textToSpeech: typeof handleTextToSpeech;
30
- getModelInfo: (request: import("../../../schemas").GetModelInfoRequest) => Promise<import("../../../schemas").GetModelInfoResponse>;
32
+ getModelInfo: typeof handleGetModelInfo;
33
+ ocrStream: typeof handleOCRStream;
31
34
  };
32
35
  //# sourceMappingURL=index.d.ts.map
@@ -13,6 +13,7 @@ import { cancelHandler } from "./cancelHandler.js";
13
13
  import { handleDeleteCache } from "./delete-cache.js";
14
14
  import { handleTextToSpeech } from "./text-to-speech.js";
15
15
  import { handleGetModelInfo } from "./get-model-info.js";
16
+ import { handleOCRStream } from "./ocr-stream.js";
16
17
  export const handlers = {
17
18
  completionStream: handleCompletionStream,
18
19
  downloadAsset: handleDownloadAsset,
@@ -29,4 +30,5 @@ export const handlers = {
29
30
  cancel: cancelHandler,
30
31
  textToSpeech: handleTextToSpeech,
31
32
  getModelInfo: handleGetModelInfo,
33
+ ocrStream: handleOCRStream,
32
34
  };
@@ -1,13 +1,13 @@
1
1
  import { type DownloadEntry } from "../../../../schemas/index";
2
- export declare const getActiveDownload: (key: string) => DownloadEntry | undefined;
3
- export declare const registerDownload: (key: string, entry: DownloadEntry) => void;
4
- export declare const unregisterDownload: (key: string) => void;
5
- export declare const createHyperdriveDownloadKey: (hyperdriveKey: string, modelFileName: string) => string;
6
- export declare const createHttpDownloadKey: (url: string) => string;
7
- export declare const setClearCacheFlag: (downloadKey: string, clearCache: boolean) => void;
8
- export declare const shouldClearCache: (downloadKey: string) => boolean;
9
- export declare const clearClearCacheFlag: (downloadKey: string) => void;
10
- export declare const createCancelFunction: (downloadKey: string, clearCache?: boolean) => () => void;
11
- export declare const cancelAllDownloads: () => void;
12
- export declare const cleanupDownloads: () => Promise<void>;
2
+ export declare function getActiveDownload(key: string): DownloadEntry | undefined;
3
+ export declare function registerDownload(key: string, entry: DownloadEntry): void;
4
+ export declare function unregisterDownload(key: string): void;
5
+ export declare function createHyperdriveDownloadKey(hyperdriveKey: string, modelFileName: string): string;
6
+ export declare function createHttpDownloadKey(url: string): string;
7
+ export declare function setClearCacheFlag(downloadKey: string, clearCache: boolean): void;
8
+ export declare function shouldClearCache(downloadKey: string): boolean;
9
+ export declare function clearClearCacheFlag(downloadKey: string): void;
10
+ export declare function createCancelFunction(downloadKey: string, clearCache?: boolean): () => void;
11
+ export declare function cancelAllDownloads(): void;
12
+ export declare function cleanupDownloads(): Promise<void>;
13
13
  //# sourceMappingURL=download-manager.d.ts.map