@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.
- package/README.md +328 -200
- package/dist/client/api/completion-stream.d.ts +15 -5
- package/dist/client/api/completion-stream.js +50 -14
- package/dist/client/api/embed.d.ts +17 -3
- package/dist/client/api/embed.js +0 -8
- package/dist/client/api/get-model-info.d.ts +1 -1
- package/dist/client/api/index.d.ts +0 -1
- package/dist/client/api/index.js +0 -1
- package/dist/client/api/load-model.d.ts +37 -11
- package/dist/client/api/load-model.js +29 -117
- package/dist/client/api/logging-stream.d.ts +6 -3
- package/dist/client/api/logging-stream.js +6 -3
- package/dist/client/api/unload-model.js +5 -2
- package/dist/client/config-loader/config-utils.d.ts +5 -0
- package/dist/client/config-loader/config-utils.js +20 -0
- package/dist/client/config-loader/resolve-config.bare.d.ts +9 -0
- package/dist/client/config-loader/resolve-config.bare.js +87 -0
- package/dist/client/config-loader/resolve-config.expo.d.ts +11 -0
- package/dist/client/config-loader/resolve-config.expo.js +62 -0
- package/dist/client/config-loader/resolve-config.node.d.ts +9 -0
- package/dist/client/config-loader/resolve-config.node.js +118 -0
- package/dist/client/init-hooks.d.ts +17 -3
- package/dist/client/init-hooks.js +37 -18
- package/dist/client/logging-stream-registry.d.ts +1 -1
- package/dist/client/logging-stream-registry.js +14 -13
- package/dist/client/rpc/bare-client.d.ts +10 -14
- package/dist/client/rpc/bare-client.js +28 -2
- package/dist/client/rpc/bare-rpc-client.d.ts +1 -1
- package/dist/client/rpc/bare-rpc-client.js +16 -13
- package/dist/client/rpc/expo-rpc-client.d.ts +2 -2
- package/dist/client/rpc/expo-rpc-client.js +15 -12
- package/dist/client/rpc/node-rpc-client.d.ts +1 -1
- package/dist/client/rpc/node-rpc-client.js +10 -7
- package/dist/client/rpc/rpc-client.js +16 -15
- package/dist/examples/config/config-path.d.ts +8 -0
- package/dist/examples/config/config-path.js +13 -0
- package/dist/examples/config-reload.d.ts +2 -0
- package/dist/examples/config-reload.js +49 -0
- package/dist/examples/download-with-blind-relays.js +20 -20
- package/dist/examples/embed-hyperdrive.js +35 -3
- package/dist/examples/kv-cache-cleanup.js +1 -1
- package/dist/examples/kv-cache-custom-key.js +1 -1
- package/dist/examples/kv-cache-example.js +1 -1
- package/dist/examples/llamacpp-hyperdrive.js +1 -1
- package/dist/examples/llamacpp-sharded.js +1 -1
- package/dist/examples/logging-file-transport.d.ts +2 -0
- package/dist/examples/{llamacpp-file-logging.js → logging-file-transport.js} +3 -7
- package/dist/examples/logging-streaming.d.ts +2 -0
- package/dist/examples/logging-streaming.js +75 -0
- package/dist/examples/mcp-websearch.d.ts +13 -0
- package/dist/examples/mcp-websearch.js +176 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/logging/addon.d.ts +6 -0
- package/dist/logging/addon.js +59 -0
- package/dist/logging/base-logger.js +24 -14
- package/dist/logging/client-logger.d.ts +3 -0
- package/dist/logging/client-logger.js +13 -0
- package/dist/logging/index.d.ts +6 -1
- package/dist/logging/index.js +6 -1
- package/dist/logging/logger.d.ts +0 -2
- package/dist/logging/logger.js +0 -3
- package/dist/logging/namespaces.d.ts +11 -0
- package/dist/logging/namespaces.js +11 -0
- package/dist/logging/registry.d.ts +26 -0
- package/dist/logging/registry.js +36 -0
- package/dist/logging/server-logger.d.ts +3 -0
- package/dist/logging/server-logger.js +16 -0
- package/dist/logging/stream-logger.d.ts +1 -1
- package/dist/logging/stream-logger.js +6 -3
- package/dist/logging/types.d.ts +2 -0
- package/dist/models/hyperdrive/models.d.ts +789 -51
- package/dist/models/hyperdrive/models.js +979 -200
- package/dist/schemas/common.d.ts +86 -23
- package/dist/schemas/common.js +0 -3
- package/dist/schemas/download-asset.d.ts +5 -5
- package/dist/schemas/embed.d.ts +3 -3
- package/dist/schemas/embed.js +9 -2
- package/dist/schemas/get-model-info.d.ts +2 -2
- package/dist/schemas/index.d.ts +5 -1
- package/dist/schemas/index.js +5 -1
- package/dist/schemas/json-schema.d.ts +16 -0
- package/dist/schemas/json-schema.js +2 -0
- package/dist/schemas/llamacpp-config.d.ts +5 -4
- package/dist/schemas/llamacpp-config.js +7 -5
- package/dist/schemas/load-model.d.ts +931 -211
- package/dist/schemas/load-model.js +7 -1
- package/dist/schemas/logging-stream.d.ts +10 -3
- package/dist/schemas/logging-stream.js +4 -3
- package/dist/schemas/mcp-adapter.d.ts +47 -0
- package/dist/schemas/mcp-adapter.js +1 -0
- package/dist/schemas/model-src-utils.d.ts +8 -6
- package/dist/schemas/model-src-utils.js +8 -3
- package/dist/schemas/reload-config.d.ts +344 -0
- package/dist/schemas/reload-config.js +42 -0
- package/dist/schemas/sdk-config.d.ts +22 -0
- package/dist/schemas/sdk-config.js +33 -0
- package/dist/schemas/sdk-errors-client.d.ts +4 -0
- package/dist/schemas/sdk-errors-client.js +20 -0
- package/dist/schemas/sdk-errors-server.d.ts +3 -0
- package/dist/schemas/sdk-errors-server.js +15 -0
- package/dist/schemas/tools.d.ts +3 -0
- package/dist/schemas/translation-config.d.ts +81 -0
- package/dist/schemas/translation-config.js +3 -4
- package/dist/schemas/whispercpp-config.d.ts +9 -1
- package/dist/schemas/whispercpp-config.js +2 -1
- package/dist/server/bare/addons/llamacpp/create-model.js +13 -4
- package/dist/server/bare/addons/llamacpp/handlers/embed.d.ts +9 -1
- package/dist/server/bare/addons/llamacpp/handlers/embed.js +18 -4
- package/dist/server/bare/addons/llamacpp/kv-cache-utils.js +6 -4
- package/dist/server/bare/addons/load-model.js +10 -4
- package/dist/server/bare/addons/unload-model.js +6 -3
- package/dist/server/bare/addons/whispercpp/handlers/transcribe-stream.js +56 -37
- package/dist/server/bare/delegate-rpc-client.js +12 -10
- package/dist/server/bare/hyperswarm.js +7 -5
- package/dist/server/bare/rag-hyperdb/rag-manager.js +3 -1
- package/dist/server/bare/registry/config-registry.d.ts +13 -4
- package/dist/server/bare/registry/config-registry.js +42 -10
- package/dist/server/bare/registry/logging-stream-registry.d.ts +24 -7
- package/dist/server/bare/registry/logging-stream-registry.js +99 -20
- package/dist/server/bare/registry/model-registry.d.ts +3 -0
- package/dist/server/bare/registry/model-registry.js +9 -6
- package/dist/server/rpc/create-server.js +5 -3
- package/dist/server/rpc/handle-request.js +30 -16
- package/dist/server/rpc/handlers/cancelHandler.js +3 -1
- package/dist/server/rpc/handlers/completion-stream-delegated.js +4 -2
- package/dist/server/rpc/handlers/delete-cache.js +3 -1
- package/dist/server/rpc/handlers/download-asset.js +3 -1
- package/dist/server/rpc/handlers/embed.js +3 -1
- package/dist/server/rpc/handlers/index.d.ts +0 -1
- package/dist/server/rpc/handlers/index.js +0 -2
- package/dist/server/rpc/handlers/load-model/download-manager.js +4 -2
- package/dist/server/rpc/handlers/load-model/http.js +20 -18
- package/dist/server/rpc/handlers/load-model/hyperdrive.js +21 -19
- package/dist/server/rpc/handlers/load-model/resolve.js +7 -5
- package/dist/server/rpc/handlers/load-model-delegated.d.ts +2 -2
- package/dist/server/rpc/handlers/load-model-delegated.js +10 -8
- package/dist/server/rpc/handlers/load-model.js +55 -3
- package/dist/server/rpc/handlers/logging-stream.js +4 -4
- package/dist/server/rpc/handlers/provideHandler/connection.js +12 -10
- package/dist/server/rpc/handlers/provideHandler/handler.js +18 -16
- package/dist/server/rpc/handlers/provideHandler/proxy.js +8 -6
- package/dist/server/rpc/handlers/rag.js +3 -1
- package/dist/server/rpc/handlers/stopProvideHandler.js +3 -1
- package/dist/server/rpc/handlers/transcribe-stream.js +3 -1
- package/dist/server/rpc/handlers/translate.js +3 -1
- package/dist/server/rpc/handlers/unload-model.js +4 -2
- package/dist/server/utils/audio/decoder.d.ts +2 -1
- package/dist/server/utils/audio/decoder.js +48 -11
- package/dist/server/utils/cache.js +7 -5
- package/dist/server/utils/config-transform.d.ts +3 -0
- package/dist/server/utils/config-transform.js +21 -0
- package/dist/server/utils/index.d.ts +1 -0
- package/dist/server/utils/index.js +1 -0
- package/dist/server/worker.js +41 -16
- package/dist/utils/errors-client.d.ts +12 -0
- package/dist/utils/errors-client.js +20 -0
- package/dist/utils/errors-server.d.ts +9 -0
- package/dist/utils/errors-server.js +16 -0
- package/dist/utils/getProcessSafe.d.ts +7 -0
- package/dist/utils/getProcessSafe.js +17 -0
- package/dist/utils/mcp-adapter.d.ts +12 -0
- package/dist/utils/mcp-adapter.js +103 -0
- package/dist/utils/object.d.ts +2 -0
- package/dist/utils/object.js +3 -0
- package/dist/utils/runtime.d.ts +30 -0
- package/dist/utils/runtime.js +48 -0
- package/dist/utils/tool-helpers.d.ts +10 -2
- package/dist/utils/tool-helpers.js +24 -11
- package/package.json +46 -33
- package/dist/client/api/set-config.d.ts +0 -7
- package/dist/client/api/set-config.js +0 -20
- package/dist/client/config-manager.d.ts +0 -4
- package/dist/client/config-manager.js +0 -8
- package/dist/examples/llamacpp-file-logging.d.ts +0 -2
- package/dist/schemas/set-config.d.ts +0 -21
- package/dist/schemas/set-config.js +0 -14
- package/dist/server/rpc/handlers/set-config.d.ts +0 -3
- 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",
|
package/dist/schemas/tools.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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.
|
|
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:
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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:
|
|
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
|
|
10
|
-
if (
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
79
|
+
logger.info(`${modelType}: Loading model ${modelId}...`);
|
|
80
|
+
startLogBuffering(modelId);
|
|
77
81
|
await result.model.load(false);
|
|
78
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
+
logger.info(`Model storage cleared: ${modelPath}`);
|
|
34
36
|
}
|
|
35
37
|
}
|
|
38
|
+
unregisterAddonLogger(modelId);
|
|
36
39
|
unregisterAllLoggingStreams(modelId);
|
|
37
|
-
|
|
40
|
+
logger.info(`Model ${modelId} unloaded`);
|
|
38
41
|
}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
|
-
import { getModel, getModelConfig,
|
|
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
|
-
|
|
15
|
+
originalConfig = modelConfig;
|
|
11
16
|
const updatedConfig = {
|
|
12
|
-
...
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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
|
-
|
|
25
|
-
|
|
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
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
64
|
+
logger.debug(`Connection closed for peer: ${peerPubkey}`);
|
|
63
65
|
activeRPCs.delete(peerPubkey);
|
|
64
66
|
});
|
|
65
67
|
conn.on("error", (err) => {
|
|
66
|
-
|
|
68
|
+
logger.error(`Connection error for peer ${peerPubkey}:`, err);
|
|
67
69
|
activeRPCs.delete(peerPubkey);
|
|
68
70
|
});
|
|
69
71
|
});
|