@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
@@ -1,5 +1,70 @@
1
1
  import { z } from "zod";
2
2
  import { logLevelSchema } from "./logging-stream.js";
3
+ import { ModelType } from "./model-types.js";
4
+ import { llmConfigBaseSchema, embedConfigBaseSchema } from "./llamacpp-config.js";
5
+ import { whisperConfigSchema } from "./whispercpp-config.js";
6
+ import { ocrConfigSchema } from "./ocr.js";
7
+ import { runtimeContextSchema } from "./runtime-context.js";
8
+ // Alias keys for user convenience (maps to canonical types)
9
+ const AliasKeys = {
10
+ llm: "llm",
11
+ whisper: "whisper",
12
+ embeddings: "embeddings",
13
+ nmt: "nmt",
14
+ tts: "tts",
15
+ ocr: "ocr",
16
+ };
17
+ /**
18
+ * Device match criteria for device-specific config defaults.
19
+ * All specified criteria must match (AND logic).
20
+ */
21
+ export const deviceMatchSchema = z.object({
22
+ /** Platform to match: "android" or "ios" */
23
+ platform: runtimeContextSchema.shape.platform,
24
+ /** Device brand to match (case-insensitive exact match, e.g., "google", "samsung") */
25
+ deviceBrand: z.string().optional(),
26
+ /** Device model prefix to match (e.g., "Pixel 10" matches "Pixel 10 Pro") */
27
+ deviceModelPrefix: z.string().optional(),
28
+ /** Device model substring to match (e.g., "Galaxy" matches "Samsung Galaxy S25") */
29
+ deviceModelContains: z.string().optional(),
30
+ });
31
+ /**
32
+ * Device-specific model config defaults.
33
+ * Accepts both canonical keys (e.g., "llamacpp-completion") and alias keys (e.g., "llm").
34
+ * NMT and TTS use passthrough since they don't have device-relevant config.
35
+ */
36
+ export const deviceConfigDefaultsSchema = z
37
+ .object({
38
+ // Canonical keys
39
+ [ModelType.llamacppCompletion]: llmConfigBaseSchema.optional(),
40
+ [ModelType.llamacppEmbedding]: embedConfigBaseSchema.optional(),
41
+ [ModelType.whispercppTranscription]: whisperConfigSchema
42
+ .partial()
43
+ .optional(),
44
+ [ModelType.nmtcppTranslation]: z.record(z.string(), z.unknown()).optional(),
45
+ [ModelType.onnxTts]: z.record(z.string(), z.unknown()).optional(),
46
+ [ModelType.onnxOcr]: ocrConfigSchema.partial().optional(),
47
+ // Alias keys (user-friendly)
48
+ [AliasKeys.llm]: llmConfigBaseSchema.optional(),
49
+ [AliasKeys.embeddings]: embedConfigBaseSchema.optional(),
50
+ [AliasKeys.whisper]: whisperConfigSchema.partial().optional(),
51
+ [AliasKeys.nmt]: z.record(z.string(), z.unknown()).optional(),
52
+ [AliasKeys.tts]: z.record(z.string(), z.unknown()).optional(),
53
+ [AliasKeys.ocr]: ocrConfigSchema.partial().optional(),
54
+ })
55
+ .partial();
56
+ /**
57
+ * A device pattern rule for applying config defaults.
58
+ */
59
+ export const devicePatternSchema = z.object({
60
+ /** Human-readable name for this pattern (used in logs) */
61
+ name: z.string(),
62
+ /** Match criteria - all specified fields must match */
63
+ match: deviceMatchSchema,
64
+ /** Config defaults to apply when matched */
65
+ defaults: deviceConfigDefaultsSchema,
66
+ });
67
+ const directoryPath = z.string().transform((s) => s.replace(/\/+$/, ""));
3
68
  /**
4
69
  * QVAC SDK Configuration Schema
5
70
  *
@@ -12,7 +77,7 @@ export const qvacConfigSchema = z.object({
12
77
  * Absolute path to the directory where models and other cached assets are stored.
13
78
  * If not specified, defaults to ~/.qvac/models
14
79
  */
15
- cacheDirectory: z.string().optional(),
80
+ cacheDirectory: directoryPath.optional(),
16
81
  /**
17
82
  * Array of Hyperswarm relay public keys (hex strings) for improved P2P connectivity.
18
83
  * Blind relays help with NAT traversal and firewall bypassing.
@@ -30,4 +95,37 @@ export const qvacConfigSchema = z.object({
30
95
  * Defaults to true.
31
96
  */
32
97
  loggerConsoleOutput: z.boolean().optional(),
98
+ /**
99
+ * Maximum number of concurrent HTTP downloads for sharded models.
100
+ * Higher values may improve download speed but increase memory usage.
101
+ * Defaults to 3.
102
+ */
103
+ httpDownloadConcurrency: z.number().int().positive().optional(),
104
+ /**
105
+ * Timeout in milliseconds for HTTP connection establishment.
106
+ * This applies to HEAD and GET requests.
107
+ * If the connection is not established within this time, the request fails.
108
+ * Defaults to 10000 (10 seconds).
109
+ */
110
+ httpConnectionTimeoutMs: z.number().int().positive().optional(),
111
+ /**
112
+ * Device-specific config defaults.
113
+ * Use this to override model config defaults for specific devices.
114
+ * User-defined patterns are checked before SDK built-in patterns.
115
+ * First matching pattern wins.
116
+ *
117
+ * @example
118
+ * ```json
119
+ * {
120
+ * "deviceDefaults": [
121
+ * {
122
+ * "name": "Custom Samsung",
123
+ * "match": { "platform": "android", "deviceBrand": "samsung" },
124
+ * "defaults": { "llm": { "device": "cpu" } }
125
+ * }
126
+ * ]
127
+ * }
128
+ * ```
129
+ */
130
+ deviceDefaults: z.array(devicePatternSchema).optional(),
33
131
  });
@@ -7,6 +7,7 @@ export declare const SDK_CLIENT_ERROR_CODES: {
7
7
  readonly INVALID_AUDIO_CHUNK_TYPE: 50005;
8
8
  readonly INVALID_TOOLS_ARRAY: 50006;
9
9
  readonly INVALID_TOOL_SCHEMA: 50007;
10
+ readonly OCR_FAILED: 50008;
10
11
  readonly RPC_NO_HANDLER: 50200;
11
12
  readonly RPC_REQUEST_NOT_SENT: 50201;
12
13
  readonly RPC_RESPONSE_STREAM_NOT_CREATED: 50202;
@@ -9,6 +9,7 @@ export const SDK_CLIENT_ERROR_CODES = {
9
9
  INVALID_AUDIO_CHUNK_TYPE: 50005,
10
10
  INVALID_TOOLS_ARRAY: 50006,
11
11
  INVALID_TOOL_SCHEMA: 50007,
12
+ OCR_FAILED: 50008,
12
13
  // RPC Communication Errors (50,200-50,399)
13
14
  RPC_NO_HANDLER: 50200,
14
15
  RPC_REQUEST_NOT_SENT: 50201,
@@ -59,6 +60,10 @@ const clientErrorDefinitions = {
59
60
  name: "INVALID_TOOL_SCHEMA",
60
61
  message: (details) => `Invalid tool schema: ${details}`,
61
62
  },
63
+ [SDK_CLIENT_ERROR_CODES.OCR_FAILED]: {
64
+ name: "OCR_FAILED",
65
+ message: (details) => `OCR operation failed${details ? `: ${details}` : ""}`,
66
+ },
62
67
  // RPC Communication Errors (50,200-50,399)
63
68
  [SDK_CLIENT_ERROR_CODES.RPC_NO_HANDLER]: {
64
69
  name: "RPC_NO_HANDLER",
@@ -25,12 +25,21 @@ export declare const SDK_SERVER_ERROR_CODES: {
25
25
  readonly TEXT_TO_SPEECH_FAILED: 52409;
26
26
  readonly CONFIG_RELOAD_NOT_SUPPORTED: 52410;
27
27
  readonly MODEL_TYPE_MISMATCH: 52411;
28
+ readonly OCR_FAILED: 52412;
29
+ readonly IMAGE_FILE_NOT_FOUND: 52413;
30
+ readonly INVALID_IMAGE_INPUT: 52414;
28
31
  readonly RAG_SAVE_FAILED: 52800;
29
32
  readonly RAG_SEARCH_FAILED: 52801;
30
33
  readonly RAG_DELETE_FAILED: 52802;
31
34
  readonly RAG_UNKNOWN_OPERATION: 52803;
32
35
  readonly RAG_HYPERDB_FAILED: 52804;
33
36
  readonly RAG_WORKSPACE_MODEL_MISMATCH: 52805;
37
+ readonly RAG_WORKSPACE_NOT_FOUND: 52806;
38
+ readonly RAG_WORKSPACE_IN_USE: 52807;
39
+ readonly RAG_WORKSPACE_CLOSE_FAILED: 52808;
40
+ readonly RAG_LIST_WORKSPACES_FAILED: 52809;
41
+ readonly RAG_CHUNK_FAILED: 52810;
42
+ readonly RAG_WORKSPACE_NOT_OPEN: 52811;
34
43
  readonly FILE_NOT_FOUND: 53000;
35
44
  readonly DOWNLOAD_CANCELLED: 53001;
36
45
  readonly CHECKSUM_VALIDATION_FAILED: 53002;
@@ -41,6 +50,11 @@ export declare const SDK_SERVER_ERROR_CODES: {
41
50
  readonly DOWNLOAD_ASSET_FAILED: 53007;
42
51
  readonly SEEDING_NOT_SUPPORTED: 53008;
43
52
  readonly HYPERDRIVE_DOWNLOAD_FAILED: 53009;
53
+ readonly INVALID_SHARD_URL_PATTERN: 53010;
54
+ readonly ARCHIVE_EXTRACTION_FAILED: 53011;
55
+ readonly ARCHIVE_UNSUPPORTED_TYPE: 53012;
56
+ readonly ARCHIVE_MISSING_SHARDS: 53013;
57
+ readonly PARTIAL_DOWNLOAD_OFFLINE: 53014;
44
58
  readonly DELETE_CACHE_FAILED: 53200;
45
59
  readonly INVALID_DELETE_CACHE_PARAMS: 53201;
46
60
  readonly CACHE_DIR_NOT_ABSOLUTE: 53202;
@@ -29,6 +29,9 @@ export const SDK_SERVER_ERROR_CODES = {
29
29
  TEXT_TO_SPEECH_FAILED: 52409,
30
30
  CONFIG_RELOAD_NOT_SUPPORTED: 52410,
31
31
  MODEL_TYPE_MISMATCH: 52411,
32
+ OCR_FAILED: 52412,
33
+ IMAGE_FILE_NOT_FOUND: 52413,
34
+ INVALID_IMAGE_INPUT: 52414,
32
35
  // RAG Operations (52,800-52,999)
33
36
  RAG_SAVE_FAILED: 52800,
34
37
  RAG_SEARCH_FAILED: 52801,
@@ -36,6 +39,12 @@ export const SDK_SERVER_ERROR_CODES = {
36
39
  RAG_UNKNOWN_OPERATION: 52803,
37
40
  RAG_HYPERDB_FAILED: 52804,
38
41
  RAG_WORKSPACE_MODEL_MISMATCH: 52805,
42
+ RAG_WORKSPACE_NOT_FOUND: 52806,
43
+ RAG_WORKSPACE_IN_USE: 52807,
44
+ RAG_WORKSPACE_CLOSE_FAILED: 52808,
45
+ RAG_LIST_WORKSPACES_FAILED: 52809,
46
+ RAG_CHUNK_FAILED: 52810,
47
+ RAG_WORKSPACE_NOT_OPEN: 52811,
39
48
  // Download/Resource Errors (53,000-53,199)
40
49
  FILE_NOT_FOUND: 53000,
41
50
  DOWNLOAD_CANCELLED: 53001,
@@ -47,6 +56,11 @@ export const SDK_SERVER_ERROR_CODES = {
47
56
  DOWNLOAD_ASSET_FAILED: 53007,
48
57
  SEEDING_NOT_SUPPORTED: 53008,
49
58
  HYPERDRIVE_DOWNLOAD_FAILED: 53009,
59
+ INVALID_SHARD_URL_PATTERN: 53010,
60
+ ARCHIVE_EXTRACTION_FAILED: 53011,
61
+ ARCHIVE_UNSUPPORTED_TYPE: 53012,
62
+ ARCHIVE_MISSING_SHARDS: 53013,
63
+ PARTIAL_DOWNLOAD_OFFLINE: 53014,
50
64
  // Cache Operations (53,200-53,349)
51
65
  DELETE_CACHE_FAILED: 53200,
52
66
  INVALID_DELETE_CACHE_PARAMS: 53201,
@@ -167,6 +181,18 @@ const serverErrorDefinitions = {
167
181
  name: "MODEL_TYPE_MISMATCH",
168
182
  message: (expectedType, providedType) => `Model type mismatch: expected "${expectedType}", got "${providedType}"`,
169
183
  },
184
+ [SDK_SERVER_ERROR_CODES.OCR_FAILED]: {
185
+ name: "OCR_FAILED",
186
+ message: (details) => `OCR operation failed${details ? `: ${details}` : ""}`,
187
+ },
188
+ [SDK_SERVER_ERROR_CODES.IMAGE_FILE_NOT_FOUND]: {
189
+ name: "IMAGE_FILE_NOT_FOUND",
190
+ message: (filePath) => `Image file not found or not accessible: ${filePath}`,
191
+ },
192
+ [SDK_SERVER_ERROR_CODES.INVALID_IMAGE_INPUT]: {
193
+ name: "INVALID_IMAGE_INPUT",
194
+ message: "Invalid image input type provided",
195
+ },
170
196
  // RAG Operations (52,800-52,999)
171
197
  [SDK_SERVER_ERROR_CODES.RAG_SAVE_FAILED]: {
172
198
  name: "RAG_SAVE_FAILED",
@@ -192,6 +218,30 @@ const serverErrorDefinitions = {
192
218
  name: "RAG_WORKSPACE_MODEL_MISMATCH",
193
219
  message: (workspace, existingModelId, newModelId) => `Workspace "${workspace}" is configured for model "${existingModelId}", but you're trying to use model "${newModelId}". Use a different workspace or the same model`,
194
220
  },
221
+ [SDK_SERVER_ERROR_CODES.RAG_WORKSPACE_NOT_FOUND]: {
222
+ name: "RAG_WORKSPACE_NOT_FOUND",
223
+ message: (workspace) => `RAG workspace not found: ${workspace}`,
224
+ },
225
+ [SDK_SERVER_ERROR_CODES.RAG_WORKSPACE_IN_USE]: {
226
+ name: "RAG_WORKSPACE_IN_USE",
227
+ message: (workspace) => `RAG workspace '${workspace}' is currently in use. Close it first.`,
228
+ },
229
+ [SDK_SERVER_ERROR_CODES.RAG_WORKSPACE_CLOSE_FAILED]: {
230
+ name: "RAG_WORKSPACE_CLOSE_FAILED",
231
+ message: (details) => `Failed to close RAG workspace${details ? `: ${details}` : ""}`,
232
+ },
233
+ [SDK_SERVER_ERROR_CODES.RAG_LIST_WORKSPACES_FAILED]: {
234
+ name: "RAG_LIST_WORKSPACES_FAILED",
235
+ message: (details) => `Failed to list RAG workspaces${details ? `: ${details}` : ""}`,
236
+ },
237
+ [SDK_SERVER_ERROR_CODES.RAG_CHUNK_FAILED]: {
238
+ name: "RAG_CHUNK_FAILED",
239
+ message: (details) => `Failed to chunk documents${details ? `: ${details}` : ""}`,
240
+ },
241
+ [SDK_SERVER_ERROR_CODES.RAG_WORKSPACE_NOT_OPEN]: {
242
+ name: "RAG_WORKSPACE_NOT_OPEN",
243
+ message: (workspace) => `RAG workspace '${workspace}' is not open`,
244
+ },
195
245
  // Download/Resource Errors (53,000-53,199)
196
246
  [SDK_SERVER_ERROR_CODES.FILE_NOT_FOUND]: {
197
247
  name: "FILE_NOT_FOUND",
@@ -233,6 +283,26 @@ const serverErrorDefinitions = {
233
283
  name: "HYPERDRIVE_DOWNLOAD_FAILED",
234
284
  message: (details) => `Hyperdrive download failed: ${details}`,
235
285
  },
286
+ [SDK_SERVER_ERROR_CODES.INVALID_SHARD_URL_PATTERN]: {
287
+ name: "INVALID_SHARD_URL_PATTERN",
288
+ message: (url) => `URL does not contain a valid sharded model pattern: ${url}`,
289
+ },
290
+ [SDK_SERVER_ERROR_CODES.ARCHIVE_EXTRACTION_FAILED]: {
291
+ name: "ARCHIVE_EXTRACTION_FAILED",
292
+ message: (archivePath) => `Failed to extract archive: ${archivePath}`,
293
+ },
294
+ [SDK_SERVER_ERROR_CODES.ARCHIVE_UNSUPPORTED_TYPE]: {
295
+ name: "ARCHIVE_UNSUPPORTED_TYPE",
296
+ message: (archivePath) => `Unsupported archive type: ${archivePath}`,
297
+ },
298
+ [SDK_SERVER_ERROR_CODES.ARCHIVE_MISSING_SHARDS]: {
299
+ name: "ARCHIVE_MISSING_SHARDS",
300
+ message: (missingFile) => `Archive is missing required shard file: ${missingFile}`,
301
+ },
302
+ [SDK_SERVER_ERROR_CODES.PARTIAL_DOWNLOAD_OFFLINE]: {
303
+ name: "PARTIAL_DOWNLOAD_OFFLINE",
304
+ message: (url, downloadedBytes) => `Cannot resume partial download (${downloadedBytes} bytes downloaded) - unable to connect. URL: ${url}`,
305
+ },
236
306
  // Cache Operations (53,200-53,349)
237
307
  [SDK_SERVER_ERROR_CODES.DELETE_CACHE_FAILED]: {
238
308
  name: "DELETE_CACHE_FAILED",
@@ -0,0 +1,21 @@
1
+ import { z } from "zod";
2
+ export declare const shardFileMetadataSchema: z.ZodObject<{
3
+ filename: z.ZodString;
4
+ expectedSize: z.ZodNumber;
5
+ sha256Checksum: z.ZodString;
6
+ }, z.core.$strip>;
7
+ export declare const shardUrlSchema: z.ZodObject<{
8
+ url: z.ZodURL;
9
+ filename: z.ZodString;
10
+ }, z.core.$strip>;
11
+ export declare const shardPatternInfoSchema: z.ZodObject<{
12
+ isSharded: z.ZodBoolean;
13
+ currentShard: z.ZodOptional<z.ZodNumber>;
14
+ totalShards: z.ZodOptional<z.ZodNumber>;
15
+ baseFilename: z.ZodOptional<z.ZodString>;
16
+ extension: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strip>;
18
+ export type ShardFileMetadata = z.infer<typeof shardFileMetadataSchema>;
19
+ export type ShardUrl = z.infer<typeof shardUrlSchema>;
20
+ export type ShardPatternInfo = z.infer<typeof shardPatternInfoSchema>;
21
+ //# sourceMappingURL=shard.d.ts.map
@@ -0,0 +1,17 @@
1
+ import { z } from "zod";
2
+ export const shardFileMetadataSchema = z.object({
3
+ filename: z.string(),
4
+ expectedSize: z.number(),
5
+ sha256Checksum: z.string(),
6
+ });
7
+ export const shardUrlSchema = z.object({
8
+ url: z.url(),
9
+ filename: z.string(),
10
+ });
11
+ export const shardPatternInfoSchema = z.object({
12
+ isSharded: z.boolean(),
13
+ currentShard: z.number().optional(),
14
+ totalShards: z.number().optional(),
15
+ baseFilename: z.string().optional(),
16
+ extension: z.string().optional(),
17
+ });
@@ -1,58 +1,98 @@
1
1
  import { z } from "zod";
2
2
  import type { NmtLanguage } from "./translation-config";
3
- declare const translateParamsBaseSchema: z.ZodObject<{
3
+ import { type NmtModelTypeInput, type LlmModelTypeInput } from "./model-types";
4
+ declare const translateParamsSchema: z.ZodUnion<readonly [z.ZodObject<{
4
5
  modelId: z.ZodString;
5
- text: z.ZodString;
6
- stream: z.ZodBoolean;
7
- }, z.core.$strip>;
8
- declare const translateParamsSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
9
- modelId: z.ZodString;
10
- text: z.ZodString;
6
+ text: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
11
7
  stream: z.ZodBoolean;
12
- modelType: z.ZodLiteral<"nmt">;
8
+ modelType: z.ZodEnum<{
9
+ "nmtcpp-translation": "nmtcpp-translation";
10
+ nmt: "nmt";
11
+ }>;
13
12
  }, z.core.$strip>, z.ZodObject<{
14
13
  modelId: z.ZodString;
15
14
  text: z.ZodString;
16
15
  stream: z.ZodBoolean;
17
- modelType: z.ZodLiteral<"llm">;
16
+ modelType: z.ZodEnum<{
17
+ "llamacpp-completion": "llamacpp-completion";
18
+ llm: "llm";
19
+ }>;
18
20
  from: z.ZodOptional<z.ZodString>;
19
21
  to: z.ZodString;
20
22
  context: z.ZodOptional<z.ZodString>;
21
- }, z.core.$strip>], "modelType">;
23
+ }, z.core.$strip>]>;
22
24
  export declare const translationStatsSchema: z.ZodObject<{
23
25
  processedTokens: z.ZodNumber;
24
26
  processingTime: z.ZodNumber;
25
27
  }, z.core.$strip>;
26
28
  export declare const translateRequestSchema: z.ZodUnion<readonly [z.ZodObject<{
27
29
  modelId: z.ZodString;
28
- text: z.ZodString;
30
+ text: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
29
31
  stream: z.ZodBoolean;
30
- modelType: z.ZodLiteral<"nmt">;
32
+ modelType: z.ZodEnum<{
33
+ "nmtcpp-translation": "nmtcpp-translation";
34
+ nmt: "nmt";
35
+ }>;
31
36
  type: z.ZodLiteral<"translate">;
32
37
  }, z.core.$strip>, z.ZodObject<{
33
38
  modelId: z.ZodString;
34
39
  text: z.ZodString;
35
40
  stream: z.ZodBoolean;
36
- modelType: z.ZodLiteral<"llm">;
41
+ modelType: z.ZodEnum<{
42
+ "llamacpp-completion": "llamacpp-completion";
43
+ llm: "llm";
44
+ }>;
37
45
  from: z.ZodOptional<z.ZodString>;
38
46
  to: z.ZodString;
39
47
  context: z.ZodOptional<z.ZodString>;
40
48
  type: z.ZodLiteral<"translate">;
41
49
  }, z.core.$strip>]>;
42
- export declare const translateServerParamsSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
50
+ export declare const translateServerParamsSchema: z.ZodPipe<z.ZodUnion<readonly [z.ZodObject<{
43
51
  modelId: z.ZodString;
44
- text: z.ZodString;
52
+ text: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
45
53
  stream: z.ZodBoolean;
46
- modelType: z.ZodLiteral<"nmt">;
54
+ modelType: z.ZodEnum<{
55
+ "nmtcpp-translation": "nmtcpp-translation";
56
+ nmt: "nmt";
57
+ }>;
47
58
  }, z.core.$strip>, z.ZodObject<{
48
59
  modelId: z.ZodString;
49
60
  text: z.ZodString;
50
61
  stream: z.ZodBoolean;
51
- modelType: z.ZodLiteral<"llm">;
62
+ modelType: z.ZodEnum<{
63
+ "llamacpp-completion": "llamacpp-completion";
64
+ llm: "llm";
65
+ }>;
52
66
  from: z.ZodOptional<z.ZodString>;
53
67
  to: z.ZodString;
54
68
  context: z.ZodOptional<z.ZodString>;
55
- }, z.core.$strip>], "modelType">;
69
+ }, z.core.$strip>]>, z.ZodTransform<{
70
+ modelType: import("./model-types").CanonicalModelType;
71
+ modelId: string;
72
+ text: string | string[];
73
+ stream: boolean;
74
+ } | {
75
+ modelType: import("./model-types").CanonicalModelType;
76
+ modelId: string;
77
+ text: string;
78
+ stream: boolean;
79
+ to: string;
80
+ from?: string | undefined;
81
+ context?: string | undefined;
82
+ }, {
83
+ modelId: string;
84
+ text: string | string[];
85
+ stream: boolean;
86
+ modelType: "nmtcpp-translation" | "nmt";
87
+ } | {
88
+ modelId: string;
89
+ text: string;
90
+ stream: boolean;
91
+ modelType: "llamacpp-completion" | "llm";
92
+ to: string;
93
+ from?: string | undefined;
94
+ context?: string | undefined;
95
+ }>>;
56
96
  export declare const translateResponseSchema: z.ZodObject<{
57
97
  type: z.ZodLiteral<"translate">;
58
98
  token: z.ZodString;
@@ -67,12 +107,17 @@ export type TranslateParams = z.infer<typeof translateParamsSchema>;
67
107
  export type TranslateRequest = z.infer<typeof translateRequestSchema>;
68
108
  export type TranslateResponse = z.infer<typeof translateResponseSchema>;
69
109
  export type TranslationStats = z.infer<typeof translationStatsSchema>;
70
- type TranslateParamsBase = z.input<typeof translateParamsBaseSchema>;
71
- type TranslateParamsNmt = TranslateParamsBase & {
72
- modelType: "nmt";
110
+ type TranslateParamsNmt = {
111
+ modelId: string;
112
+ text: string | string[];
113
+ stream: boolean;
114
+ modelType: NmtModelTypeInput;
73
115
  };
74
- type TranslateParamsLlm = TranslateParamsBase & {
75
- modelType: "llm";
116
+ type TranslateParamsLlm = {
117
+ modelId: string;
118
+ text: string;
119
+ stream: boolean;
120
+ modelType: LlmModelTypeInput;
76
121
  from?: NmtLanguage | (string & {});
77
122
  to: NmtLanguage | (string & {});
78
123
  context?: string;
@@ -1,19 +1,27 @@
1
1
  import { z } from "zod";
2
- const translateParamsBaseSchema = z.object({
2
+ import { nmtModelTypeSchema, llmModelTypeSchema, normalizeModelType, } from "./model-types.js";
3
+ const translateParamsNmtSchema = z.object({
3
4
  modelId: z.string(),
4
- text: z.string().min(1, "Text cannot be empty"),
5
+ text: z.union([
6
+ z.string().min(1, "Text cannot be empty"),
7
+ z
8
+ .array(z.string().min(1, "Text cannot be empty"))
9
+ .min(1, "Array cannot be empty"),
10
+ ]),
5
11
  stream: z.boolean(),
12
+ modelType: nmtModelTypeSchema,
6
13
  });
7
- const translateParamsNmtSchema = translateParamsBaseSchema.extend({
8
- modelType: z.literal("nmt"),
9
- });
10
- const translateParamsLlmSchema = translateParamsBaseSchema.extend({
11
- modelType: z.literal("llm"),
14
+ const translateParamsLlmSchema = z.object({
15
+ modelId: z.string(),
16
+ text: z.string().min(1, "Text cannot be empty"),
17
+ stream: z.boolean(),
18
+ modelType: llmModelTypeSchema,
12
19
  from: z.string().optional(),
13
20
  to: z.string(),
14
21
  context: z.string().optional(),
15
22
  });
16
- const translateParamsSchema = z.discriminatedUnion("modelType", [
23
+ // Using z.union since each modelType accepts multiple values
24
+ const translateParamsSchema = z.union([
17
25
  translateParamsNmtSchema,
18
26
  translateParamsLlmSchema,
19
27
  ]);
@@ -25,14 +33,32 @@ export const translateRequestSchema = z.union([
25
33
  translateParamsNmtSchema.extend({ type: z.literal("translate") }),
26
34
  translateParamsLlmSchema.extend({ type: z.literal("translate") }),
27
35
  ]);
36
+ // Valid model types for translation (aliases and canonical)
37
+ const validTranslationModelTypes = [
38
+ "nmt",
39
+ "nmtcpp-translation",
40
+ "llm",
41
+ "llamacpp-completion",
42
+ ];
43
+ const llmModelTypes = ["llm", "llamacpp-completion"];
28
44
  // Validates the translate server args and returns the model info
29
45
  export const translateServerParamsSchema = translateParamsSchema
30
- .refine((data) => data.modelType && ["nmt", "llm"].includes(data.modelType), {
46
+ .refine((data) => data.modelType && validTranslationModelTypes.includes(data.modelType), {
31
47
  message: "Model type is not compatible with translation. Only LLM and NMT models are supported.",
32
48
  })
33
- .refine((data) => !(data.modelType === "llm" && (!data.from || !data.to)), {
49
+ .refine((data) => {
50
+ if (!llmModelTypes.includes(data.modelType))
51
+ return true;
52
+ // For LLM, check from/to exist
53
+ const llmData = data;
54
+ return llmData.from && llmData.to;
55
+ }, {
34
56
  message: "Both 'from' and 'to' languages are required for LLM translation models",
35
- });
57
+ })
58
+ .transform((data) => ({
59
+ ...data,
60
+ modelType: normalizeModelType(data.modelType),
61
+ }));
36
62
  export const translateResponseSchema = z.object({
37
63
  type: z.literal("translate"),
38
64
  token: z.string(),