@qvac/sdk 0.4.1 → 0.5.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 (179) hide show
  1. package/README.md +328 -200
  2. package/dist/client/api/completion-stream.d.ts +15 -5
  3. package/dist/client/api/completion-stream.js +50 -14
  4. package/dist/client/api/embed.d.ts +17 -3
  5. package/dist/client/api/embed.js +0 -8
  6. package/dist/client/api/get-model-info.d.ts +1 -1
  7. package/dist/client/api/index.d.ts +0 -1
  8. package/dist/client/api/index.js +0 -1
  9. package/dist/client/api/load-model.d.ts +37 -11
  10. package/dist/client/api/load-model.js +29 -117
  11. package/dist/client/api/logging-stream.d.ts +6 -3
  12. package/dist/client/api/logging-stream.js +6 -3
  13. package/dist/client/api/unload-model.js +5 -2
  14. package/dist/client/config-loader/config-utils.d.ts +5 -0
  15. package/dist/client/config-loader/config-utils.js +20 -0
  16. package/dist/client/config-loader/resolve-config.bare.d.ts +9 -0
  17. package/dist/client/config-loader/resolve-config.bare.js +87 -0
  18. package/dist/client/config-loader/resolve-config.expo.d.ts +11 -0
  19. package/dist/client/config-loader/resolve-config.expo.js +62 -0
  20. package/dist/client/config-loader/resolve-config.node.d.ts +9 -0
  21. package/dist/client/config-loader/resolve-config.node.js +118 -0
  22. package/dist/client/init-hooks.d.ts +17 -3
  23. package/dist/client/init-hooks.js +37 -18
  24. package/dist/client/logging-stream-registry.d.ts +1 -1
  25. package/dist/client/logging-stream-registry.js +14 -13
  26. package/dist/client/rpc/bare-client.d.ts +10 -14
  27. package/dist/client/rpc/bare-client.js +28 -2
  28. package/dist/client/rpc/bare-rpc-client.d.ts +1 -1
  29. package/dist/client/rpc/bare-rpc-client.js +16 -13
  30. package/dist/client/rpc/expo-rpc-client.d.ts +2 -2
  31. package/dist/client/rpc/expo-rpc-client.js +15 -12
  32. package/dist/client/rpc/node-rpc-client.d.ts +1 -1
  33. package/dist/client/rpc/node-rpc-client.js +10 -7
  34. package/dist/client/rpc/rpc-client.js +16 -15
  35. package/dist/examples/config/config-path.d.ts +8 -0
  36. package/dist/examples/config/config-path.js +13 -0
  37. package/dist/examples/config-reload.d.ts +2 -0
  38. package/dist/examples/config-reload.js +49 -0
  39. package/dist/examples/download-with-blind-relays.js +20 -20
  40. package/dist/examples/embed-hyperdrive.js +35 -3
  41. package/dist/examples/kv-cache-cleanup.js +1 -1
  42. package/dist/examples/kv-cache-custom-key.js +1 -1
  43. package/dist/examples/kv-cache-example.js +1 -1
  44. package/dist/examples/llamacpp-hyperdrive.js +1 -1
  45. package/dist/examples/llamacpp-sharded.js +1 -1
  46. package/dist/examples/logging-file-transport.d.ts +2 -0
  47. package/dist/examples/{llamacpp-file-logging.js → logging-file-transport.js} +3 -7
  48. package/dist/examples/logging-streaming.d.ts +2 -0
  49. package/dist/examples/logging-streaming.js +75 -0
  50. package/dist/examples/mcp-websearch.d.ts +13 -0
  51. package/dist/examples/mcp-websearch.js +176 -0
  52. package/dist/index.d.ts +4 -4
  53. package/dist/index.js +2 -2
  54. package/dist/logging/addon.d.ts +6 -0
  55. package/dist/logging/addon.js +59 -0
  56. package/dist/logging/base-logger.js +24 -14
  57. package/dist/logging/client-logger.d.ts +3 -0
  58. package/dist/logging/client-logger.js +13 -0
  59. package/dist/logging/index.d.ts +6 -1
  60. package/dist/logging/index.js +6 -1
  61. package/dist/logging/logger.d.ts +0 -2
  62. package/dist/logging/logger.js +0 -3
  63. package/dist/logging/namespaces.d.ts +11 -0
  64. package/dist/logging/namespaces.js +11 -0
  65. package/dist/logging/registry.d.ts +26 -0
  66. package/dist/logging/registry.js +36 -0
  67. package/dist/logging/server-logger.d.ts +3 -0
  68. package/dist/logging/server-logger.js +16 -0
  69. package/dist/logging/stream-logger.d.ts +1 -1
  70. package/dist/logging/stream-logger.js +6 -3
  71. package/dist/logging/types.d.ts +2 -0
  72. package/dist/models/hyperdrive/models.d.ts +789 -51
  73. package/dist/models/hyperdrive/models.js +979 -200
  74. package/dist/schemas/common.d.ts +86 -23
  75. package/dist/schemas/common.js +0 -3
  76. package/dist/schemas/download-asset.d.ts +5 -5
  77. package/dist/schemas/embed.d.ts +3 -3
  78. package/dist/schemas/embed.js +9 -2
  79. package/dist/schemas/get-model-info.d.ts +2 -2
  80. package/dist/schemas/index.d.ts +5 -1
  81. package/dist/schemas/index.js +5 -1
  82. package/dist/schemas/json-schema.d.ts +16 -0
  83. package/dist/schemas/json-schema.js +2 -0
  84. package/dist/schemas/llamacpp-config.d.ts +5 -4
  85. package/dist/schemas/llamacpp-config.js +7 -5
  86. package/dist/schemas/load-model.d.ts +931 -211
  87. package/dist/schemas/load-model.js +7 -1
  88. package/dist/schemas/logging-stream.d.ts +10 -3
  89. package/dist/schemas/logging-stream.js +4 -3
  90. package/dist/schemas/mcp-adapter.d.ts +47 -0
  91. package/dist/schemas/mcp-adapter.js +1 -0
  92. package/dist/schemas/model-src-utils.d.ts +8 -6
  93. package/dist/schemas/model-src-utils.js +8 -3
  94. package/dist/schemas/reload-config.d.ts +344 -0
  95. package/dist/schemas/reload-config.js +42 -0
  96. package/dist/schemas/sdk-config.d.ts +22 -0
  97. package/dist/schemas/sdk-config.js +33 -0
  98. package/dist/schemas/sdk-errors-client.d.ts +4 -0
  99. package/dist/schemas/sdk-errors-client.js +20 -0
  100. package/dist/schemas/sdk-errors-server.d.ts +3 -0
  101. package/dist/schemas/sdk-errors-server.js +15 -0
  102. package/dist/schemas/tools.d.ts +3 -0
  103. package/dist/schemas/translation-config.d.ts +81 -0
  104. package/dist/schemas/translation-config.js +3 -4
  105. package/dist/schemas/whispercpp-config.d.ts +9 -1
  106. package/dist/schemas/whispercpp-config.js +2 -1
  107. package/dist/server/bare/addons/llamacpp/create-model.js +13 -4
  108. package/dist/server/bare/addons/llamacpp/handlers/embed.d.ts +9 -1
  109. package/dist/server/bare/addons/llamacpp/handlers/embed.js +18 -4
  110. package/dist/server/bare/addons/llamacpp/kv-cache-utils.js +6 -4
  111. package/dist/server/bare/addons/load-model.js +10 -4
  112. package/dist/server/bare/addons/unload-model.js +6 -3
  113. package/dist/server/bare/addons/whispercpp/handlers/transcribe-stream.js +56 -37
  114. package/dist/server/bare/delegate-rpc-client.js +12 -10
  115. package/dist/server/bare/hyperswarm.js +7 -5
  116. package/dist/server/bare/rag-hyperdb/rag-manager.js +3 -1
  117. package/dist/server/bare/registry/config-registry.d.ts +13 -4
  118. package/dist/server/bare/registry/config-registry.js +42 -10
  119. package/dist/server/bare/registry/logging-stream-registry.d.ts +24 -7
  120. package/dist/server/bare/registry/logging-stream-registry.js +99 -20
  121. package/dist/server/bare/registry/model-registry.d.ts +3 -0
  122. package/dist/server/bare/registry/model-registry.js +9 -6
  123. package/dist/server/rpc/create-server.js +5 -3
  124. package/dist/server/rpc/handle-request.js +30 -16
  125. package/dist/server/rpc/handlers/cancelHandler.js +3 -1
  126. package/dist/server/rpc/handlers/completion-stream-delegated.js +4 -2
  127. package/dist/server/rpc/handlers/delete-cache.js +3 -1
  128. package/dist/server/rpc/handlers/download-asset.js +3 -1
  129. package/dist/server/rpc/handlers/embed.js +3 -1
  130. package/dist/server/rpc/handlers/index.d.ts +0 -1
  131. package/dist/server/rpc/handlers/index.js +0 -2
  132. package/dist/server/rpc/handlers/load-model/download-manager.js +4 -2
  133. package/dist/server/rpc/handlers/load-model/http.js +20 -18
  134. package/dist/server/rpc/handlers/load-model/hyperdrive.js +21 -19
  135. package/dist/server/rpc/handlers/load-model/resolve.js +7 -5
  136. package/dist/server/rpc/handlers/load-model-delegated.d.ts +2 -2
  137. package/dist/server/rpc/handlers/load-model-delegated.js +10 -8
  138. package/dist/server/rpc/handlers/load-model.js +55 -3
  139. package/dist/server/rpc/handlers/logging-stream.js +4 -4
  140. package/dist/server/rpc/handlers/provideHandler/connection.js +12 -10
  141. package/dist/server/rpc/handlers/provideHandler/handler.js +18 -16
  142. package/dist/server/rpc/handlers/provideHandler/proxy.js +8 -6
  143. package/dist/server/rpc/handlers/rag.js +3 -1
  144. package/dist/server/rpc/handlers/stopProvideHandler.js +3 -1
  145. package/dist/server/rpc/handlers/transcribe-stream.js +3 -1
  146. package/dist/server/rpc/handlers/translate.js +3 -1
  147. package/dist/server/rpc/handlers/unload-model.js +4 -2
  148. package/dist/server/utils/audio/decoder.d.ts +2 -1
  149. package/dist/server/utils/audio/decoder.js +48 -11
  150. package/dist/server/utils/cache.js +7 -5
  151. package/dist/server/utils/config-transform.d.ts +3 -0
  152. package/dist/server/utils/config-transform.js +21 -0
  153. package/dist/server/utils/index.d.ts +1 -0
  154. package/dist/server/utils/index.js +1 -0
  155. package/dist/server/worker.js +41 -16
  156. package/dist/utils/errors-client.d.ts +12 -0
  157. package/dist/utils/errors-client.js +20 -0
  158. package/dist/utils/errors-server.d.ts +9 -0
  159. package/dist/utils/errors-server.js +16 -0
  160. package/dist/utils/getProcessSafe.d.ts +7 -0
  161. package/dist/utils/getProcessSafe.js +17 -0
  162. package/dist/utils/mcp-adapter.d.ts +12 -0
  163. package/dist/utils/mcp-adapter.js +103 -0
  164. package/dist/utils/object.d.ts +2 -0
  165. package/dist/utils/object.js +3 -0
  166. package/dist/utils/runtime.d.ts +30 -0
  167. package/dist/utils/runtime.js +48 -0
  168. package/dist/utils/tool-helpers.d.ts +10 -2
  169. package/dist/utils/tool-helpers.js +24 -11
  170. package/package.json +46 -33
  171. package/dist/client/api/set-config.d.ts +0 -7
  172. package/dist/client/api/set-config.js +0 -20
  173. package/dist/client/config-manager.d.ts +0 -4
  174. package/dist/client/config-manager.js +0 -8
  175. package/dist/examples/llamacpp-file-logging.d.ts +0 -2
  176. package/dist/schemas/set-config.d.ts +0 -21
  177. package/dist/schemas/set-config.js +0 -14
  178. package/dist/server/rpc/handlers/set-config.d.ts +0 -3
  179. package/dist/server/rpc/handlers/set-config.js +0 -18
@@ -24,6 +24,10 @@ export const SDK_CLIENT_ERROR_CODES = {
24
24
  // Build/Bundle Errors (50,600-50,799)
25
25
  SDK_NOT_FOUND_IN_NODE_MODULES: 50600,
26
26
  WORKER_FILE_NOT_FOUND: 50601,
27
+ CONFIG_FILE_NOT_FOUND: 50602,
28
+ CONFIG_FILE_INVALID: 50603,
29
+ CONFIG_FILE_PARSE_FAILED: 50604,
30
+ CONFIG_VALIDATION_FAILED: 50605,
27
31
  };
28
32
  const clientErrorDefinitions = {
29
33
  // Response Validation Errors (50,001-50,199)
@@ -106,6 +110,22 @@ const clientErrorDefinitions = {
106
110
  name: "WORKER_FILE_NOT_FOUND",
107
111
  message: (workerPath) => `Worker file not found at ${workerPath}`,
108
112
  },
113
+ [SDK_CLIENT_ERROR_CODES.CONFIG_FILE_NOT_FOUND]: {
114
+ name: "CONFIG_FILE_NOT_FOUND",
115
+ message: (searchPaths) => `Config file not found. Searched: ${searchPaths}. Create qvac.config.json, qvac.config.js, or qvac.config.ts in your project root.`,
116
+ },
117
+ [SDK_CLIENT_ERROR_CODES.CONFIG_FILE_INVALID]: {
118
+ name: "CONFIG_FILE_INVALID",
119
+ message: (filePath, reason) => `Config file at ${filePath} is invalid: ${reason}`,
120
+ },
121
+ [SDK_CLIENT_ERROR_CODES.CONFIG_FILE_PARSE_FAILED]: {
122
+ name: "CONFIG_FILE_PARSE_FAILED",
123
+ message: (filePath, error) => `Failed to parse config file at ${filePath}: ${error}`,
124
+ },
125
+ [SDK_CLIENT_ERROR_CODES.CONFIG_VALIDATION_FAILED]: {
126
+ name: "CONFIG_VALIDATION_FAILED",
127
+ message: (errors) => `Config validation failed: ${errors}`,
128
+ },
109
129
  };
110
130
  addCodes(clientErrorDefinitions, { name: "qvac-sdk-client", version: "1.1.0" });
111
131
  export { clientErrorDefinitions as SDK_CLIENT_ERROR_DEFINITIONS };
@@ -23,6 +23,8 @@ export declare const SDK_SERVER_ERROR_CODES: {
23
23
  readonly ATTACHMENT_NOT_FOUND: 52407;
24
24
  readonly CANCEL_FAILED: 52408;
25
25
  readonly TEXT_TO_SPEECH_FAILED: 52409;
26
+ readonly CONFIG_RELOAD_NOT_SUPPORTED: 52410;
27
+ readonly MODEL_TYPE_MISMATCH: 52411;
26
28
  readonly RAG_SAVE_FAILED: 52800;
27
29
  readonly RAG_SEARCH_FAILED: 52801;
28
30
  readonly RAG_DELETE_FAILED: 52802;
@@ -44,6 +46,7 @@ export declare const SDK_SERVER_ERROR_CODES: {
44
46
  readonly CACHE_DIR_NOT_ABSOLUTE: 53202;
45
47
  readonly CACHE_DIR_NOT_WRITABLE: 53203;
46
48
  readonly SET_CONFIG_FAILED: 53350;
49
+ readonly CONFIG_ALREADY_SET: 53351;
47
50
  readonly FFMPEG_NOT_AVAILABLE: 53500;
48
51
  readonly AUDIO_PLAYER_FAILED: 53501;
49
52
  readonly INVALID_AUDIO_CHUNK_TYPE: 53502;
@@ -27,6 +27,8 @@ export const SDK_SERVER_ERROR_CODES = {
27
27
  ATTACHMENT_NOT_FOUND: 52407,
28
28
  CANCEL_FAILED: 52408,
29
29
  TEXT_TO_SPEECH_FAILED: 52409,
30
+ CONFIG_RELOAD_NOT_SUPPORTED: 52410,
31
+ MODEL_TYPE_MISMATCH: 52411,
30
32
  // RAG Operations (52,800-52,999)
31
33
  RAG_SAVE_FAILED: 52800,
32
34
  RAG_SEARCH_FAILED: 52801,
@@ -52,6 +54,7 @@ export const SDK_SERVER_ERROR_CODES = {
52
54
  CACHE_DIR_NOT_WRITABLE: 53203,
53
55
  // Config Operations (53,350-53,499)
54
56
  SET_CONFIG_FAILED: 53350,
57
+ CONFIG_ALREADY_SET: 53351,
55
58
  // System/Runtime (53,500-53,699)
56
59
  FFMPEG_NOT_AVAILABLE: 53500,
57
60
  AUDIO_PLAYER_FAILED: 53501,
@@ -156,6 +159,14 @@ const serverErrorDefinitions = {
156
159
  name: "TEXT_TO_SPEECH_FAILED",
157
160
  message: (details) => `Text-to-speech operation failed${details ? `: ${details}` : ""}`,
158
161
  },
162
+ [SDK_SERVER_ERROR_CODES.CONFIG_RELOAD_NOT_SUPPORTED]: {
163
+ name: "CONFIG_RELOAD_NOT_SUPPORTED",
164
+ message: (modelId) => `Model "${modelId}" does not support hot config reload`,
165
+ },
166
+ [SDK_SERVER_ERROR_CODES.MODEL_TYPE_MISMATCH]: {
167
+ name: "MODEL_TYPE_MISMATCH",
168
+ message: (expectedType, providedType) => `Model type mismatch: expected "${expectedType}", got "${providedType}"`,
169
+ },
159
170
  // RAG Operations (52,800-52,999)
160
171
  [SDK_SERVER_ERROR_CODES.RAG_SAVE_FAILED]: {
161
172
  name: "RAG_SAVE_FAILED",
@@ -244,6 +255,10 @@ const serverErrorDefinitions = {
244
255
  name: "SET_CONFIG_FAILED",
245
256
  message: (details) => `Failed to set config${details ? `: ${details}` : ""}`,
246
257
  },
258
+ [SDK_SERVER_ERROR_CODES.CONFIG_ALREADY_SET]: {
259
+ name: "CONFIG_ALREADY_SET",
260
+ message: "Config has already been set and is immutable. Config can only be set once during SDK initialization.",
261
+ },
247
262
  // System/Runtime (53,500-53,699)
248
263
  [SDK_SERVER_ERROR_CODES.FFMPEG_NOT_AVAILABLE]: {
249
264
  name: "FFMPEG_NOT_AVAILABLE",
@@ -59,4 +59,7 @@ export type Tool = z.infer<typeof toolSchema>;
59
59
  export type ToolCall = z.infer<typeof toolCallSchema>;
60
60
  export type ToolCallError = z.infer<typeof toolCallErrorSchema>;
61
61
  export type ToolCallEvent = z.infer<typeof toolCallEventSchema>;
62
+ export type ToolCallWithCall = ToolCall & {
63
+ invoke?: () => Promise<unknown>;
64
+ };
62
65
  //# sourceMappingURL=tools.d.ts.map
@@ -1,6 +1,87 @@
1
1
  import { z } from "zod";
2
2
  export declare const INDICTRANS_LANGUAGES: readonly ["asm_Beng", "ben_Beng", "brx_Deva", "doi_Deva", "eng_Latn", "gom_Deva", "guj_Gujr", "hin_Deva", "kan_Knda", "kas_Arab", "kas_Deva", "mai_Deva", "mal_Mlym", "mar_Deva", "mni_Beng", "mni_Mtei", "npi_Deva", "ory_Orya", "pan_Guru", "san_Deva", "sat_Olck", "snd_Arab", "snd_Deva", "tam_Taml", "tel_Telu", "urd_Arab"];
3
3
  export declare const NMT_LANGUAGES: readonly ["en", "de", "es", "it", "ru", "ja", "asm_Beng", "ben_Beng", "brx_Deva", "doi_Deva", "eng_Latn", "gom_Deva", "guj_Gujr", "hin_Deva", "kan_Knda", "kas_Arab", "kas_Deva", "mai_Deva", "mal_Mlym", "mar_Deva", "mni_Beng", "mni_Mtei", "npi_Deva", "ory_Orya", "pan_Guru", "san_Deva", "sat_Olck", "snd_Arab", "snd_Deva", "tam_Taml", "tel_Telu", "urd_Arab"];
4
+ export declare const nmtConfigBaseSchema: z.ZodObject<{
5
+ mode: z.ZodOptional<z.ZodEnum<{
6
+ full: "full";
7
+ }>>;
8
+ from: z.ZodEnum<{
9
+ en: "en";
10
+ de: "de";
11
+ es: "es";
12
+ it: "it";
13
+ ru: "ru";
14
+ ja: "ja";
15
+ asm_Beng: "asm_Beng";
16
+ ben_Beng: "ben_Beng";
17
+ brx_Deva: "brx_Deva";
18
+ doi_Deva: "doi_Deva";
19
+ eng_Latn: "eng_Latn";
20
+ gom_Deva: "gom_Deva";
21
+ guj_Gujr: "guj_Gujr";
22
+ hin_Deva: "hin_Deva";
23
+ kan_Knda: "kan_Knda";
24
+ kas_Arab: "kas_Arab";
25
+ kas_Deva: "kas_Deva";
26
+ mai_Deva: "mai_Deva";
27
+ mal_Mlym: "mal_Mlym";
28
+ mar_Deva: "mar_Deva";
29
+ mni_Beng: "mni_Beng";
30
+ mni_Mtei: "mni_Mtei";
31
+ npi_Deva: "npi_Deva";
32
+ ory_Orya: "ory_Orya";
33
+ pan_Guru: "pan_Guru";
34
+ san_Deva: "san_Deva";
35
+ sat_Olck: "sat_Olck";
36
+ snd_Arab: "snd_Arab";
37
+ snd_Deva: "snd_Deva";
38
+ tam_Taml: "tam_Taml";
39
+ tel_Telu: "tel_Telu";
40
+ urd_Arab: "urd_Arab";
41
+ }>;
42
+ to: z.ZodEnum<{
43
+ en: "en";
44
+ de: "de";
45
+ es: "es";
46
+ it: "it";
47
+ ru: "ru";
48
+ ja: "ja";
49
+ asm_Beng: "asm_Beng";
50
+ ben_Beng: "ben_Beng";
51
+ brx_Deva: "brx_Deva";
52
+ doi_Deva: "doi_Deva";
53
+ eng_Latn: "eng_Latn";
54
+ gom_Deva: "gom_Deva";
55
+ guj_Gujr: "guj_Gujr";
56
+ hin_Deva: "hin_Deva";
57
+ kan_Knda: "kan_Knda";
58
+ kas_Arab: "kas_Arab";
59
+ kas_Deva: "kas_Deva";
60
+ mai_Deva: "mai_Deva";
61
+ mal_Mlym: "mal_Mlym";
62
+ mar_Deva: "mar_Deva";
63
+ mni_Beng: "mni_Beng";
64
+ mni_Mtei: "mni_Mtei";
65
+ npi_Deva: "npi_Deva";
66
+ ory_Orya: "ory_Orya";
67
+ pan_Guru: "pan_Guru";
68
+ san_Deva: "san_Deva";
69
+ sat_Olck: "sat_Olck";
70
+ snd_Arab: "snd_Arab";
71
+ snd_Deva: "snd_Deva";
72
+ tam_Taml: "tam_Taml";
73
+ tel_Telu: "tel_Telu";
74
+ urd_Arab: "urd_Arab";
75
+ }>;
76
+ beamsize: z.ZodOptional<z.ZodNumber>;
77
+ lengthpenalty: z.ZodOptional<z.ZodNumber>;
78
+ maxlength: z.ZodOptional<z.ZodNumber>;
79
+ repetitionpenalty: z.ZodOptional<z.ZodNumber>;
80
+ norepeatngramsize: z.ZodOptional<z.ZodNumber>;
81
+ temperature: z.ZodOptional<z.ZodNumber>;
82
+ topk: z.ZodOptional<z.ZodNumber>;
83
+ topp: z.ZodOptional<z.ZodNumber>;
84
+ }, z.core.$strip>;
4
85
  export declare const nmtConfigSchema: z.ZodPipe<z.ZodObject<{
5
86
  mode: z.ZodOptional<z.ZodEnum<{
6
87
  full: "full";
@@ -34,8 +34,7 @@ export const NMT_LANGUAGES = [
34
34
  ...MARIAN_LANGUAGES,
35
35
  ...INDICTRANS_LANGUAGES,
36
36
  ];
37
- export const nmtConfigSchema = z
38
- .object({
37
+ export const nmtConfigBaseSchema = z.object({
39
38
  mode: z.enum(["full"]).optional(),
40
39
  from: z.enum(NMT_LANGUAGES),
41
40
  to: z.enum(NMT_LANGUAGES),
@@ -48,8 +47,8 @@ export const nmtConfigSchema = z
48
47
  temperature: z.number().optional(),
49
48
  topk: z.number().optional(),
50
49
  topp: z.number().optional(),
51
- })
52
- .transform((data) => ({
50
+ });
51
+ export const nmtConfigSchema = nmtConfigBaseSchema.transform((data) => ({
53
52
  ...data,
54
53
  mode: data.mode ?? "full",
55
54
  beamsize: data.beamsize ?? 4,
@@ -1,4 +1,9 @@
1
1
  import { z } from "zod";
2
+ export declare const audioFormatSchema: z.ZodEnum<{
3
+ f32le: "f32le";
4
+ s16le: "s16le";
5
+ }>;
6
+ export type AudioFormat = z.infer<typeof audioFormatSchema>;
2
7
  export declare const whisperConfigSchema: z.ZodObject<{
3
8
  strategy: z.ZodOptional<z.ZodEnum<{
4
9
  greedy: "greedy";
@@ -47,7 +52,10 @@ export declare const whisperConfigSchema: z.ZodObject<{
47
52
  speech_pad_ms: z.ZodOptional<z.ZodNumber>;
48
53
  samples_overlap: z.ZodOptional<z.ZodNumber>;
49
54
  }, z.core.$strip>>;
50
- audio_format: z.ZodOptional<z.ZodString>;
55
+ audio_format: z.ZodOptional<z.ZodEnum<{
56
+ f32le: "f32le";
57
+ s16le: "s16le";
58
+ }>>;
51
59
  contextParams: z.ZodOptional<z.ZodObject<{
52
60
  model: z.ZodOptional<z.ZodString>;
53
61
  use_gpu: z.ZodOptional<z.ZodBoolean>;
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ export const audioFormatSchema = z.enum(["f32le", "s16le"]);
2
3
  const vadParamsSchema = z
3
4
  .object({
4
5
  threshold: z.number().optional(),
@@ -60,7 +61,7 @@ export const whisperConfigSchema = z.object({
60
61
  beam_search_beam_size: z.number().int().optional(),
61
62
  vad_model_path: z.string().optional(),
62
63
  vad_params: vadParamsSchema,
63
- audio_format: z.string().optional(),
64
+ audio_format: audioFormatSchema.optional(),
64
65
  contextParams: contextParamsSchema,
65
66
  miscConfig: miscConfigSchema,
66
67
  });
@@ -1,6 +1,7 @@
1
1
  import LlmLlamacpp from "@qvac/llm-llamacpp";
2
2
  import EmbedLlamacpp from "@qvac/embed-llamacpp";
3
- import { createStreamLogger } from "../../../../logging/index.js";
3
+ import os from "bare-os";
4
+ import { ADDON_NAMESPACES, registerAddonLogger, createStreamLogger, } from "../../../../logging/index.js";
4
5
  import { parseModelPath } from "../../../utils/index.js";
5
6
  import FilesystemDL from "@qvac/dl-filesystem";
6
7
  function transformLlmConfig(llmConfig) {
@@ -23,7 +24,8 @@ function transformLlmConfig(llmConfig) {
23
24
  export function createLlmModel(modelId, modelPath, llmConfig, projectionModelPath) {
24
25
  const { dirPath, basePath } = parseModelPath(modelPath);
25
26
  const loader = new FilesystemDL({ dirPath });
26
- const logger = createStreamLogger(modelId, "llamacpp:llm");
27
+ const logger = createStreamLogger(modelId, ADDON_NAMESPACES.LLAMACPP_LLM);
28
+ registerAddonLogger(modelId, ADDON_NAMESPACES.LLAMACPP_LLM, logger);
27
29
  const llmConfigStrings = transformLlmConfig(llmConfig);
28
30
  const args = {
29
31
  loader,
@@ -43,7 +45,14 @@ export function createLlmModel(modelId, modelPath, llmConfig, projectionModelPat
43
45
  export function createEmbeddingsModel(modelId, modelPath, embedConfig) {
44
46
  const { dirPath, basePath } = parseModelPath(modelPath);
45
47
  const loader = new FilesystemDL({ dirPath });
46
- const logger = createStreamLogger(modelId, "llamacpp:embed");
48
+ const logger = createStreamLogger(modelId, ADDON_NAMESPACES.LLAMACPP_EMBED);
49
+ registerAddonLogger(modelId, ADDON_NAMESPACES.LLAMACPP_EMBED, logger);
50
+ let config = embedConfig.config;
51
+ const platform = os.platform();
52
+ if (platform === "android") {
53
+ // On Android, disable flash attention to prevent crashes
54
+ config = `${config}\n-fa\toff`;
55
+ }
47
56
  const args = {
48
57
  loader,
49
58
  opts: { stats: true },
@@ -52,6 +61,6 @@ export function createEmbeddingsModel(modelId, modelPath, embedConfig) {
52
61
  modelName: basePath,
53
62
  modelPath,
54
63
  };
55
- const model = new EmbedLlamacpp(args, embedConfig.config);
64
+ const model = new EmbedLlamacpp(args, config);
56
65
  return { model, loader };
57
66
  }
@@ -1,4 +1,12 @@
1
1
  import { type EmbedParams } from "../../../../../schemas/index";
2
- export declare function embed(params: EmbedParams): Promise<number[]>;
2
+ export declare function embed(params: {
3
+ modelId: string;
4
+ text: string;
5
+ }): Promise<number[]>;
6
+ export declare function embed(params: {
7
+ modelId: string;
8
+ text: string[];
9
+ }): Promise<number[][]>;
10
+ export declare function embed(params: EmbedParams): Promise<number[] | number[][]>;
3
11
  export declare function normalizeVector(vector: Float32Array): number[];
4
12
  //# sourceMappingURL=embed.d.ts.map
@@ -6,11 +6,25 @@ export async function embed(params) {
6
6
  const model = getModel(modelId);
7
7
  const response = await model.run(text);
8
8
  const rawEmbeddings = (await response.await());
9
- const embeddingVector = rawEmbeddings?.[0]?.[0];
10
- if (!embeddingVector || embeddingVector.length === 0) {
11
- throw new EmbedNoEmbeddingsError();
9
+ const embeddingsArray = rawEmbeddings[0];
10
+ if (Array.isArray(text)) {
11
+ if (!embeddingsArray || embeddingsArray.length === 0) {
12
+ throw new EmbedNoEmbeddingsError();
13
+ }
14
+ return embeddingsArray.map((embeddingVector) => {
15
+ if (!embeddingVector || embeddingVector.length === 0) {
16
+ throw new EmbedNoEmbeddingsError();
17
+ }
18
+ return normalizeVector(embeddingVector);
19
+ });
20
+ }
21
+ else {
22
+ const embeddingVector = embeddingsArray?.[0];
23
+ if (!embeddingVector || embeddingVector.length === 0) {
24
+ throw new EmbedNoEmbeddingsError();
25
+ }
26
+ return normalizeVector(embeddingVector);
12
27
  }
13
- return normalizeVector(embeddingVector);
14
28
  }
15
29
  export function normalizeVector(vector) {
16
30
  let sumOfSquares = 0;
@@ -2,6 +2,8 @@ import crypto from "bare-crypto";
2
2
  import { promises as fsPromises } from "bare-fs";
3
3
  import path from "bare-path";
4
4
  import { getKVCacheDir } from "../../../utils/index.js";
5
+ import { getServerLogger } from "../../../../logging/index.js";
6
+ const logger = getServerLogger();
5
7
  export function extractSystemPrompt(messages) {
6
8
  const systemMessage = messages.find((msg) => msg.role === "system");
7
9
  return systemMessage ? systemMessage.content : null;
@@ -66,7 +68,7 @@ export async function renameCacheFile(oldPath, newPath) {
66
68
  await fsPromises.rename(oldPath, newPath);
67
69
  }
68
70
  catch (error) {
69
- console.error("Error renaming cache file:", error instanceof Error ? error.message : String(error));
71
+ logger.error("Error renaming cache file:", error instanceof Error ? error.message : String(error));
70
72
  }
71
73
  }
72
74
  export async function customCacheExists(modelId, configHash, cacheKey) {
@@ -87,7 +89,7 @@ export async function deleteCache(options) {
87
89
  await fsPromises.mkdir(cacheDir, { recursive: true });
88
90
  }
89
91
  catch (error) {
90
- console.error("Error deleting all caches:", error instanceof Error ? error.message : String(error));
92
+ logger.error("Error deleting all caches:", error instanceof Error ? error.message : String(error));
91
93
  }
92
94
  }
93
95
  else if ("kvCacheKey" in options) {
@@ -98,7 +100,7 @@ export async function deleteCache(options) {
98
100
  await fsPromises.rm(modelCacheDir, { recursive: true });
99
101
  }
100
102
  catch (error) {
101
- console.error(`Error deleting model cache ${options.kvCacheKey}/${options.modelId}:`, error instanceof Error ? error.message : String(error));
103
+ logger.error(`Error deleting model cache ${options.kvCacheKey}/${options.modelId}:`, error instanceof Error ? error.message : String(error));
102
104
  }
103
105
  }
104
106
  else {
@@ -106,7 +108,7 @@ export async function deleteCache(options) {
106
108
  await fsPromises.rm(kvCacheDir, { recursive: true });
107
109
  }
108
110
  catch (error) {
109
- console.error(`Error deleting cache ${options.kvCacheKey}:`, error instanceof Error ? error.message : String(error));
111
+ logger.error(`Error deleting cache ${options.kvCacheKey}:`, error instanceof Error ? error.message : String(error));
110
112
  }
111
113
  }
112
114
  }
@@ -4,16 +4,19 @@ import { createNmtModel } from "./translation/index.js";
4
4
  import { createTtsModel } from "./tts/index.js";
5
5
  import { createWhisperModel } from "./whispercpp/index.js";
6
6
  import { isModelLoaded, registerModel, } from "../registry/model-registry.js";
7
+ import { startLogBuffering, stopLogBufferingWithTimeout, } from "../registry/logging-stream-registry.js";
7
8
  import { detectShardedModel, generateShardFilenames } from "../../utils/index.js";
8
9
  import { ESpeakDataPathRequiredError, UnknownModelTypeError, ModelFileNotFoundError, ModelFileNotFoundInDirError, ModelFileLocateFailedError, } from "../../../utils/errors-server.js";
9
10
  import { promises as fsPromises } from "bare-fs";
10
11
  import path from "bare-path";
12
+ import { getServerLogger } from "../../../logging/index.js";
13
+ const logger = getServerLogger();
11
14
  export async function loadModel(params) {
12
15
  const { modelId, modelPath, options, projectionModelPath, vadModelPath, ttsConfigModelPath, eSpeakDataPath, modelName, } = loadModelServerParamsSchema.parse(params);
13
16
  const { modelConfig, modelType } = options;
14
17
  // Check if model is already loaded
15
18
  if (isModelLoaded(modelId)) {
16
- console.log(`${modelType} model ${modelId} is already loaded`);
19
+ logger.info(`${modelType} model ${modelId} is already loaded`);
17
20
  return;
18
21
  }
19
22
  // Detect if sharded model
@@ -45,7 +48,7 @@ export async function loadModel(params) {
45
48
  }
46
49
  }
47
50
  catch (error) {
48
- console.error(`Error reading ${modelType} model directory:`, error instanceof Error ? error.message : String(error));
51
+ logger.error(`Error reading ${modelType} model directory:`, error instanceof Error ? error.message : String(error));
49
52
  throw new ModelFileLocateFailedError(modelType, modelPath, error);
50
53
  }
51
54
  }
@@ -73,13 +76,16 @@ export async function loadModel(params) {
73
76
  // Should never happen
74
77
  throw new UnknownModelTypeError(modelType);
75
78
  }
76
- console.log(`${modelType}: Loading model ${modelId}...`);
79
+ logger.info(`${modelType}: Loading model ${modelId}...`);
80
+ startLogBuffering(modelId);
77
81
  await result.model.load(false);
78
- console.log(`${modelType} model ${modelId} loaded`);
82
+ logger.info(`${modelType} model ${modelId} loaded`);
83
+ stopLogBufferingWithTimeout(modelId);
79
84
  registerModel(modelId, {
80
85
  model: result.model,
81
86
  path: modelPath,
82
87
  config: modelConfig,
88
+ modelType,
83
89
  name: modelName,
84
90
  loader: result.loader,
85
91
  });
@@ -2,9 +2,11 @@ import { promises as fsPromises } from "bare-fs";
2
2
  import path from "bare-path";
3
3
  import { unregisterModel } from "../registry/model-registry.js";
4
4
  import { unregisterAllLoggingStreams } from "../registry/logging-stream-registry.js";
5
+ import { unregisterAddonLogger, getServerLogger } from "../../../logging/index.js";
5
6
  import { unloadModelParamsSchema } from "../../../schemas/index.js";
6
7
  import { ModelNotLoadedError } from "../../../utils/errors-server.js";
7
8
  import { detectShardedModel } from "../../utils/index.js";
9
+ const logger = getServerLogger();
8
10
  export async function unloadModel(params) {
9
11
  const { modelId, clearStorage } = unloadModelParamsSchema.parse(params);
10
12
  const entry = unregisterModel(modelId);
@@ -25,14 +27,15 @@ export async function unloadModel(params) {
25
27
  // Delete entire shard directory
26
28
  const shardDir = path.dirname(modelPath);
27
29
  await fsPromises.rm(shardDir, { recursive: true, force: true });
28
- console.log(`Sharded model storage cleared: ${shardDir}`);
30
+ logger.info(`Sharded model storage cleared: ${shardDir}`);
29
31
  }
30
32
  else {
31
33
  // Delete single file
32
34
  await fsPromises.rm(modelPath, { recursive: true, force: true });
33
- console.log(`Model storage cleared: ${modelPath}`);
35
+ logger.info(`Model storage cleared: ${modelPath}`);
34
36
  }
35
37
  }
38
+ unregisterAddonLogger(modelId);
36
39
  unregisterAllLoggingStreams(modelId);
37
- console.log(`Model ${modelId} unloaded`);
40
+ logger.info(`Model ${modelId} unloaded`);
38
41
  }
@@ -1,15 +1,20 @@
1
- import { getModel, getModelConfig, updateModelConfig, } from "../../../registry/model-registry.js";
1
+ import { getModel, getModelConfig, } from "../../../registry/model-registry.js";
2
2
  import { Readable } from "bare-stream";
3
3
  import fs from "bare-fs";
4
4
  import { needsDecoding, decodeAudioToStream } from "../../../../utils/index.js";
5
5
  import {} from "../../../../../schemas/index.js";
6
6
  import { AudioFileNotFoundError, InvalidAudioChunkError, } from "../../../../../utils/errors-server.js";
7
+ import { getServerLogger } from "../../../../../logging/index.js";
8
+ const logger = getServerLogger();
7
9
  export async function* transcribe(params) {
8
10
  const model = getModel(params.modelId);
11
+ const modelConfig = getModelConfig(params.modelId);
12
+ let originalConfig = null;
13
+ const audioFormat = modelConfig.audio_format || "s16le";
9
14
  if (params.prompt && typeof model.reload === "function") {
10
- const existingConfig = getModelConfig(params.modelId);
15
+ originalConfig = modelConfig;
11
16
  const updatedConfig = {
12
- ...existingConfig,
17
+ ...originalConfig,
13
18
  initial_prompt: params.prompt,
14
19
  };
15
20
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -18,46 +23,60 @@ export async function* transcribe(params) {
18
23
  whisperConfig: whisperParams,
19
24
  ...(miscConfig && { miscConfig }),
20
25
  });
21
- updateModelConfig(params.modelId, updatedConfig);
22
26
  }
23
- let audioStream;
24
- const audioChunk = params.audioChunk;
25
- switch (audioChunk.type) {
26
- case "base64": {
27
- const audioBuffer = Buffer.from(audioChunk.value, "base64");
28
- audioStream = Readable.from([audioBuffer]);
29
- break;
30
- }
31
- case "filePath": {
32
- const filePath = audioChunk.value;
33
- try {
34
- fs.accessSync(filePath);
35
- }
36
- catch (error) {
37
- throw new AudioFileNotFoundError(filePath, error);
27
+ try {
28
+ let audioStream;
29
+ const audioChunk = params.audioChunk;
30
+ switch (audioChunk.type) {
31
+ case "base64": {
32
+ const audioBuffer = Buffer.from(audioChunk.value, "base64");
33
+ audioStream = Readable.from([audioBuffer]);
34
+ break;
38
35
  }
39
- if (needsDecoding(filePath)) {
40
- audioStream = await decodeAudioToStream(filePath);
36
+ case "filePath": {
37
+ const filePath = audioChunk.value;
38
+ try {
39
+ fs.accessSync(filePath);
40
+ }
41
+ catch (error) {
42
+ throw new AudioFileNotFoundError(filePath, error);
43
+ }
44
+ if (needsDecoding(filePath)) {
45
+ audioStream = await decodeAudioToStream(filePath, audioFormat);
46
+ }
47
+ else {
48
+ audioStream = fs.createReadStream(filePath);
49
+ }
50
+ break;
41
51
  }
42
- else {
43
- audioStream = fs.createReadStream(filePath);
52
+ default:
53
+ throw new InvalidAudioChunkError();
54
+ }
55
+ // Run transcription with streaming enabled
56
+ const response = await model.run(audioStream);
57
+ for await (const output of response.iterate()) {
58
+ logger.debug("Streaming Transcription Update:", output);
59
+ // Filter out blank audio chunks and process the text
60
+ const text = output
61
+ .filter((chunk) => !chunk.text.includes("[BLANK_AUDIO]"))
62
+ .map((chunk) => chunk.text)
63
+ .join("");
64
+ if (text.trim()) {
65
+ yield text;
44
66
  }
45
- break;
46
67
  }
47
- default:
48
- throw new InvalidAudioChunkError();
49
68
  }
50
- // Run transcription with streaming enabled
51
- const response = await model.run(audioStream);
52
- for await (const output of response.iterate()) {
53
- console.log("Streaming Transcription Update:", output);
54
- // Filter out blank audio chunks and process the text
55
- const text = output
56
- .filter((chunk) => !chunk.text.includes("[BLANK_AUDIO]"))
57
- .map((chunk) => chunk.text)
58
- .join("");
59
- if (text.trim()) {
60
- yield text;
69
+ finally {
70
+ if (originalConfig && typeof model.reload === "function") {
71
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
72
+ const { contextParams: _, miscConfig, ...whisperParams } = originalConfig;
73
+ await model.reload({
74
+ whisperConfig: {
75
+ ...whisperParams,
76
+ initial_prompt: "",
77
+ },
78
+ ...(miscConfig && { miscConfig }),
79
+ });
61
80
  }
62
81
  }
63
82
  }
@@ -2,6 +2,8 @@ import { getSwarm } from "./hyperswarm.js";
2
2
  import RPC from "bare-rpc";
3
3
  import { withTimeout } from "../../utils/withTimeout.js";
4
4
  import { DelegateConnectionFailedError } from "../../utils/errors-server.js";
5
+ import { getServerLogger } from "../../logging/index.js";
6
+ const logger = getServerLogger();
5
7
  // Map of active RPC instances by public key
6
8
  const activeRPCs = new Map();
7
9
  // Establish RPC connection to a peer if not already connected
@@ -12,7 +14,7 @@ async function ensureRPCConnection(topic, publicKey, timeout) {
12
14
  if (!rpc) {
13
15
  // Need to establish connection first
14
16
  try {
15
- console.log(`🔗 Establishing RPC connection to topic: ${topic}, peer: ${publicKey}, timeout: ${timeout}ms`);
17
+ logger.info(`🔗 Establishing RPC connection to topic: ${topic}, peer: ${publicKey}, timeout: ${timeout}ms`);
16
18
  const connectionPromise = (async () => {
17
19
  const topicBuffer = Buffer.from(topic, "hex");
18
20
  // const discovery =
@@ -21,23 +23,23 @@ async function ensureRPCConnection(topic, publicKey, timeout) {
21
23
  client: true,
22
24
  });
23
25
  await swarm.flush();
24
- console.log(`✅ Connected to topic: ${topic}`);
25
- console.log(`📊 Active RPC connections: ${activeRPCs.size}`);
26
+ logger.info(`✅ Connected to topic: ${topic}`);
27
+ logger.debug(`📊 Active RPC connections: ${activeRPCs.size}`);
26
28
  // Check again if we now have an RPC instance for the target peer
27
29
  rpc = activeRPCs.get(publicKey);
28
30
  if (!rpc) {
29
- console.error(`❌ No RPC instance found for peer ${publicKey}`);
30
- console.log(`📊 Available RPC connections:`, Array.from(activeRPCs.keys()));
31
+ logger.error(`❌ No RPC instance found for peer ${publicKey}`);
32
+ logger.debug(`📊 Available RPC connections:`, Array.from(activeRPCs.keys()));
31
33
  throw new DelegateConnectionFailedError(`Could not establish RPC connection to peer ${publicKey} on topic ${topic}`);
32
34
  }
33
35
  else {
34
- console.log(`✅ RPC instance found for peer ${publicKey}`);
36
+ logger.debug(`✅ RPC instance found for peer ${publicKey}`);
35
37
  }
36
38
  })();
37
39
  await withTimeout(connectionPromise, timeout);
38
40
  }
39
41
  catch (error) {
40
- console.error("Failed to establish RPC connection:", error);
42
+ logger.error("Failed to establish RPC connection:", error);
41
43
  throw new DelegateConnectionFailedError(`RPC connection failed: ${error instanceof Error ? error.message : String(error)}`, error);
42
44
  }
43
45
  }
@@ -51,7 +53,7 @@ export async function getRPC(topic, publicKey, options = {}) {
51
53
  const peerPubkey = conn.remotePublicKey?.toString("hex");
52
54
  if (!peerPubkey)
53
55
  return;
54
- console.log(`🍺 New peer connection established: ${peerPubkey}`);
56
+ logger.debug(`🍺 New peer connection established: ${peerPubkey}`);
55
57
  // Create RPC instance for this connection (as client)
56
58
  const rpc = new RPC(conn, () => {
57
59
  // No-op handler since we're only sending requests, not receiving them
@@ -59,11 +61,11 @@ export async function getRPC(topic, publicKey, options = {}) {
59
61
  // Store RPC instance by peer ID for lookup
60
62
  activeRPCs.set(peerPubkey, rpc);
61
63
  conn.on("close", () => {
62
- console.log(`Connection closed for peer: ${peerPubkey}`);
64
+ logger.debug(`Connection closed for peer: ${peerPubkey}`);
63
65
  activeRPCs.delete(peerPubkey);
64
66
  });
65
67
  conn.on("error", (err) => {
66
- console.error(`Connection error for peer ${peerPubkey}:`, err);
68
+ logger.error(`Connection error for peer ${peerPubkey}:`, err);
67
69
  activeRPCs.delete(peerPubkey);
68
70
  });
69
71
  });