@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
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { loadModel, completion, unloadModel, loggingStream, SDK_LOG_ID, LLAMA_3_2_1B_INST_Q4_0, GTE_LARGE_FP16, VERBOSITY, embed, } from "@qvac/sdk";
|
|
2
|
+
try {
|
|
3
|
+
console.log("🚀 Starting log streaming demo...\n");
|
|
4
|
+
// Note: To configure logging (level and console output), use config file:
|
|
5
|
+
// { "loggerLevel": "debug", "loggerConsoleOutput": false } in qvac.config.json/js/ts
|
|
6
|
+
// Subscribe to SDK server logs in background
|
|
7
|
+
console.log("📡 Starting SDK server log stream...\n");
|
|
8
|
+
(async () => {
|
|
9
|
+
for await (const log of loggingStream({ id: SDK_LOG_ID })) {
|
|
10
|
+
console.log(`[SDK] [${log.level.toUpperCase()}] [${log.namespace}] ${log.message}`);
|
|
11
|
+
}
|
|
12
|
+
})().catch(() => {
|
|
13
|
+
// Stream terminated - normal on shutdown
|
|
14
|
+
});
|
|
15
|
+
// Load models
|
|
16
|
+
console.log("📥 Loading models (watch SDK logs above)...\n");
|
|
17
|
+
const llmModelId = await loadModel({
|
|
18
|
+
modelSrc: LLAMA_3_2_1B_INST_Q4_0,
|
|
19
|
+
modelType: "llm",
|
|
20
|
+
modelConfig: {
|
|
21
|
+
ctx_size: 2048,
|
|
22
|
+
temp: 0.7,
|
|
23
|
+
verbosity: VERBOSITY.ERROR, // Only log errors, remaining logs are captured by loggingStream
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
const embedModelId = await loadModel({
|
|
27
|
+
modelSrc: GTE_LARGE_FP16,
|
|
28
|
+
modelType: "embeddings",
|
|
29
|
+
});
|
|
30
|
+
console.log("📡 Starting model-specific log streams...\n");
|
|
31
|
+
(async () => {
|
|
32
|
+
for await (const log of loggingStream({ id: llmModelId })) {
|
|
33
|
+
const timestamp = new Date(log.timestamp).toISOString();
|
|
34
|
+
console.log(`[LLM] [${timestamp}] [${log.level.toUpperCase()}] ${log.namespace}: ${log.message}`);
|
|
35
|
+
}
|
|
36
|
+
})().catch(() => {
|
|
37
|
+
// Stream terminated - this is normal when model unloads
|
|
38
|
+
});
|
|
39
|
+
(async () => {
|
|
40
|
+
for await (const log of loggingStream({ id: embedModelId })) {
|
|
41
|
+
const timestamp = new Date(log.timestamp).toISOString();
|
|
42
|
+
console.log(`[EMBED] [${timestamp}] [${log.level.toUpperCase()}] ${log.namespace}: ${log.message}`);
|
|
43
|
+
}
|
|
44
|
+
})().catch(() => {
|
|
45
|
+
// Stream terminated - this is normal when model unloads
|
|
46
|
+
});
|
|
47
|
+
const messages = [
|
|
48
|
+
{ role: "user", content: "Count from 1 to 5 and explain each number." },
|
|
49
|
+
];
|
|
50
|
+
const result = completion({
|
|
51
|
+
modelId: llmModelId,
|
|
52
|
+
history: messages,
|
|
53
|
+
stream: true,
|
|
54
|
+
});
|
|
55
|
+
const embedding = await embed({
|
|
56
|
+
modelId: embedModelId,
|
|
57
|
+
text: messages[0]?.content ?? "Hello, world!",
|
|
58
|
+
});
|
|
59
|
+
console.log("📝 Response:\n");
|
|
60
|
+
for await (const token of result.tokenStream) {
|
|
61
|
+
process.stdout.write(token);
|
|
62
|
+
}
|
|
63
|
+
console.log("Embedding (first 20 elements)", embedding.slice(0, 20));
|
|
64
|
+
console.log("Embeddings length", embedding.length);
|
|
65
|
+
console.log("\n💡 Notice three log streams running:\n" +
|
|
66
|
+
" - [SDK] = SDK server operations\n" +
|
|
67
|
+
" - [LLM] = LLM model inference logs\n" +
|
|
68
|
+
" - [EMBED] = Embedding model logs\n");
|
|
69
|
+
await unloadModel({ modelId: llmModelId, clearStorage: false });
|
|
70
|
+
await unloadModel({ modelId: embedModelId, clearStorage: false });
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error("❌ Error:", error);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP DuckDuckGo Search Example
|
|
3
|
+
*
|
|
4
|
+
* A web search example using DuckDuckGo - no API key required!
|
|
5
|
+
* The server provides tools to search the web and get answers.
|
|
6
|
+
*
|
|
7
|
+
* Prerequisites:
|
|
8
|
+
* - Install MCP SDK: bun add @modelcontextprotocol/sdk
|
|
9
|
+
*
|
|
10
|
+
* Run with: bun run examples/mcp-websearch.ts
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=mcp-websearch.d.ts.map
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP DuckDuckGo Search Example
|
|
3
|
+
*
|
|
4
|
+
* A web search example using DuckDuckGo - no API key required!
|
|
5
|
+
* The server provides tools to search the web and get answers.
|
|
6
|
+
*
|
|
7
|
+
* Prerequisites:
|
|
8
|
+
* - Install MCP SDK: bun add @modelcontextprotocol/sdk
|
|
9
|
+
*
|
|
10
|
+
* Run with: bun run examples/mcp-websearch.ts
|
|
11
|
+
*/
|
|
12
|
+
import { completion, loadModel, unloadModel, QWEN_3_1_7B_INST_Q4, } from "../index.js";
|
|
13
|
+
// MCP SDK is a user-installed optional dependency
|
|
14
|
+
// Install with: bun add @modelcontextprotocol/sdk
|
|
15
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
16
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
17
|
+
function parseSearchResults(mcpResult) {
|
|
18
|
+
try {
|
|
19
|
+
const result = mcpResult;
|
|
20
|
+
// Extract text content from MCP response
|
|
21
|
+
const textContent = result.content?.find((c) => c.type === "text");
|
|
22
|
+
if (!textContent?.text) {
|
|
23
|
+
return JSON.stringify(mcpResult);
|
|
24
|
+
}
|
|
25
|
+
// Parse the JSON array of search results
|
|
26
|
+
const rawResults = JSON.parse(textContent.text);
|
|
27
|
+
// Extract just the useful fields (title, url, snippet)
|
|
28
|
+
const cleanResults = rawResults.slice(0, 5).map((r) => ({
|
|
29
|
+
title: r.title ?? "Unknown",
|
|
30
|
+
url: r.url ?? "",
|
|
31
|
+
snippet: r.snippet ?? "",
|
|
32
|
+
}));
|
|
33
|
+
// Format as concise text for LLM
|
|
34
|
+
return cleanResults
|
|
35
|
+
.map((r, i) => `[${i + 1}] ${r.title}\n URL: ${r.url}\n ${r.snippet}`)
|
|
36
|
+
.join("\n\n");
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// If parsing fails, return a truncated version
|
|
40
|
+
const str = typeof mcpResult === "string" ? mcpResult : JSON.stringify(mcpResult);
|
|
41
|
+
return str.slice(0, 2000);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let mcpClient = null;
|
|
45
|
+
try {
|
|
46
|
+
console.log("🦆 MCP DuckDuckGo Search Example\n");
|
|
47
|
+
// ============================================================
|
|
48
|
+
// STEP 1: Connect to DuckDuckGo MCP server
|
|
49
|
+
// ============================================================
|
|
50
|
+
console.log("1️⃣ Starting DuckDuckGo MCP server...");
|
|
51
|
+
mcpClient = new Client({
|
|
52
|
+
name: "qvac-ddg-example",
|
|
53
|
+
version: "1.0.0",
|
|
54
|
+
});
|
|
55
|
+
const transport = new StdioClientTransport({
|
|
56
|
+
command: "npx",
|
|
57
|
+
args: ["-y", "@oevortex/ddg_search"],
|
|
58
|
+
});
|
|
59
|
+
await mcpClient.connect(transport);
|
|
60
|
+
console.log(" ✓ MCP server connected\n");
|
|
61
|
+
// ============================================================
|
|
62
|
+
// STEP 2: Load model
|
|
63
|
+
// ============================================================
|
|
64
|
+
console.log("2️⃣ Loading model...");
|
|
65
|
+
const modelId = await loadModel({
|
|
66
|
+
modelSrc: QWEN_3_1_7B_INST_Q4,
|
|
67
|
+
modelType: "llm",
|
|
68
|
+
modelConfig: {
|
|
69
|
+
ctx_size: 4096,
|
|
70
|
+
tools: true,
|
|
71
|
+
},
|
|
72
|
+
onProgress: (progress) => process.stdout.write(`\r Loading: ${progress.percentage.toFixed(1)}%`),
|
|
73
|
+
});
|
|
74
|
+
console.log(`\n ✓ Model loaded\n`);
|
|
75
|
+
// ============================================================
|
|
76
|
+
// STEP 3: Ask AI to search the web (with MCP client)
|
|
77
|
+
// ============================================================
|
|
78
|
+
const history = [
|
|
79
|
+
{
|
|
80
|
+
role: "system",
|
|
81
|
+
content: `You are a helpful assistant with access to web search.
|
|
82
|
+
Use the search tool when you need current information.
|
|
83
|
+
Always cite your sources with the URL.`,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
role: "user",
|
|
87
|
+
content: "What is the current weather in New York City?",
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
console.log("3️⃣ Asking AI to search the web...\n");
|
|
91
|
+
console.log("🤖 AI Response:");
|
|
92
|
+
// Pass MCP client directly to completion - tools are adapted internally!
|
|
93
|
+
const result = completion({
|
|
94
|
+
modelId,
|
|
95
|
+
history,
|
|
96
|
+
stream: true,
|
|
97
|
+
mcp: [{ client: mcpClient, includeResources: false }],
|
|
98
|
+
});
|
|
99
|
+
for await (const token of result.tokenStream) {
|
|
100
|
+
process.stdout.write(token);
|
|
101
|
+
}
|
|
102
|
+
const toolCalls = await result.toolCalls;
|
|
103
|
+
console.log("\n");
|
|
104
|
+
// ============================================================
|
|
105
|
+
// STEP 4: Execute tool calls using call() - automatic MCP routing!
|
|
106
|
+
// ============================================================
|
|
107
|
+
if (toolCalls.length > 0) {
|
|
108
|
+
console.log("4️⃣ Executing search...\n");
|
|
109
|
+
const toolResults = [];
|
|
110
|
+
for (const toolCall of toolCalls) {
|
|
111
|
+
console.log(`🔍 ${toolCall.name}(${JSON.stringify(toolCall.arguments)})`);
|
|
112
|
+
if (!toolCall.invoke) {
|
|
113
|
+
console.log(` ⚠️ No handler found for tool "${toolCall.name}"`);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
// Use invoke() - automatically routes to the correct MCP client!
|
|
117
|
+
const mcpResult = await toolCall.invoke();
|
|
118
|
+
// Parse and clean up the search results
|
|
119
|
+
const cleanResult = parseSearchResults(mcpResult);
|
|
120
|
+
console.log(` ✓ Got search results:`);
|
|
121
|
+
console.log(cleanResult
|
|
122
|
+
.split("\n")
|
|
123
|
+
.map((l) => ` ${l}`)
|
|
124
|
+
.join("\n"));
|
|
125
|
+
console.log();
|
|
126
|
+
toolResults.push({ id: toolCall.id, result: cleanResult });
|
|
127
|
+
}
|
|
128
|
+
// ============================================================
|
|
129
|
+
// STEP 5: Continue with search results
|
|
130
|
+
// ============================================================
|
|
131
|
+
console.log("5️⃣ Getting AI response with search results...\n");
|
|
132
|
+
history.push({
|
|
133
|
+
role: "assistant",
|
|
134
|
+
content: await result.text,
|
|
135
|
+
});
|
|
136
|
+
for (const tr of toolResults) {
|
|
137
|
+
history.push({
|
|
138
|
+
role: "tool",
|
|
139
|
+
content: tr.result,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
console.log("🤖 Final Response:");
|
|
143
|
+
const finalResult = completion({
|
|
144
|
+
modelId,
|
|
145
|
+
history,
|
|
146
|
+
stream: true,
|
|
147
|
+
mcp: [{ client: mcpClient, includeResources: false }],
|
|
148
|
+
});
|
|
149
|
+
for await (const token of finalResult.tokenStream) {
|
|
150
|
+
process.stdout.write(token);
|
|
151
|
+
}
|
|
152
|
+
console.log("\n");
|
|
153
|
+
}
|
|
154
|
+
// ============================================================
|
|
155
|
+
// Cleanup
|
|
156
|
+
// ============================================================
|
|
157
|
+
console.log("6️⃣ Cleaning up...");
|
|
158
|
+
await unloadModel({ modelId, clearStorage: false });
|
|
159
|
+
console.log(" ✓ Done\n");
|
|
160
|
+
console.log("🎉 Example completed!");
|
|
161
|
+
process.exit(0);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
console.error("❌ Error:", error);
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
if (mcpClient) {
|
|
169
|
+
try {
|
|
170
|
+
await mcpClient.close();
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Ignore close errors
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { completion, deleteCache, loadModel, downloadAsset, ping, startQVACProvider, stopQVACProvider, unloadModel, transcribe, transcribeStream, embed, translate, cancel, ragSaveEmbeddings, ragSearch, ragDeleteEmbeddings, textToSpeech,
|
|
1
|
+
export { completion, deleteCache, loadModel, downloadAsset, ping, startQVACProvider, stopQVACProvider, unloadModel, transcribe, transcribeStream, embed, translate, cancel, ragSaveEmbeddings, ragSearch, ragDeleteEmbeddings, textToSpeech, getModelInfo, loggingStream, } from "./client/api/index";
|
|
2
2
|
export { close } from "./client/index";
|
|
3
|
-
export { type ModelProgressUpdate, type LoadModelOptions, type DownloadAssetOptions, type Tool, type ToolCall, type ToolCallError, type ToolCallEvent, type CompletionStats, VERBOSITY, type Attachment, type CompletionParams, type RagSearchResult, type RagSaveEmbeddingsResult, SDK_CLIENT_ERROR_CODES, SDK_SERVER_ERROR_CODES, type
|
|
4
|
-
export { type ToolInput } from "./utils/tool-helpers";
|
|
3
|
+
export { type ModelProgressUpdate, type LoadModelOptions, type DownloadAssetOptions, type Tool, type ToolCall, type ToolCallWithCall, type ToolCallError, type ToolCallEvent, type CompletionStats, VERBOSITY, type Attachment, type CompletionParams, type RagSearchResult, type RagSaveEmbeddingsResult, SDK_CLIENT_ERROR_CODES, SDK_SERVER_ERROR_CODES, type QvacConfig, type ModelInfo, type GetModelInfoParams, type LoadedInstance, type CacheFileInfo, toolSchema, type McpClient, type McpClientInput, } from "./schemas/index";
|
|
4
|
+
export { type ToolInput, type ToolHandler } from "./utils/tool-helpers";
|
|
5
5
|
export * from "./models/hyperdrive/index";
|
|
6
6
|
export { SUPPORTED_AUDIO_FORMATS } from "./constants/audio";
|
|
7
|
-
export { getLogger,
|
|
7
|
+
export { getLogger, SDK_LOG_ID } from "./logging/index";
|
|
8
8
|
export type { Logger, LogTransport, LoggerOptions } from "./logging/index";
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Public API exports only
|
|
2
|
-
export { completion, deleteCache, loadModel, downloadAsset, ping, startQVACProvider, stopQVACProvider, unloadModel, transcribe, transcribeStream, embed, translate, cancel, ragSaveEmbeddings, ragSearch, ragDeleteEmbeddings, textToSpeech,
|
|
2
|
+
export { completion, deleteCache, loadModel, downloadAsset, ping, startQVACProvider, stopQVACProvider, unloadModel, transcribe, transcribeStream, embed, translate, cancel, ragSaveEmbeddings, ragSearch, ragDeleteEmbeddings, textToSpeech, getModelInfo, loggingStream, } from "./client/api/index.js";
|
|
3
3
|
export { close } from "./client/index.js";
|
|
4
4
|
export { VERBOSITY, SDK_CLIENT_ERROR_CODES, SDK_SERVER_ERROR_CODES, toolSchema, } from "./schemas/index.js";
|
|
5
5
|
export {} from "./utils/tool-helpers.js";
|
|
@@ -7,4 +7,4 @@ export {} from "./utils/tool-helpers.js";
|
|
|
7
7
|
export * from "./models/hyperdrive/index.js";
|
|
8
8
|
export { SUPPORTED_AUDIO_FORMATS } from "./constants/audio.js";
|
|
9
9
|
// Logging exports
|
|
10
|
-
export { getLogger,
|
|
10
|
+
export { getLogger, SDK_LOG_ID } from "./logging/index.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Logger } from "./index";
|
|
2
|
+
export declare function registerAddonLogger(modelId: string, namespace: string, logger: Logger): void;
|
|
3
|
+
export declare function unregisterAddonLogger(modelId: string): void;
|
|
4
|
+
export declare function createAddonLoggerCallback(namespace: string): (priority: number, message: string) => void;
|
|
5
|
+
export declare function clearAllAddonLoggers(): void;
|
|
6
|
+
//# sourceMappingURL=addon.d.ts.map
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { unregisterLogger } from "./registry.js";
|
|
2
|
+
// Map C++ addon priority (0-4) to SDK LogLevel
|
|
3
|
+
const PRIORITY_TO_LEVEL = {
|
|
4
|
+
0: "error",
|
|
5
|
+
1: "warn",
|
|
6
|
+
2: "info",
|
|
7
|
+
3: "debug",
|
|
8
|
+
4: "debug",
|
|
9
|
+
};
|
|
10
|
+
// Track ALL loggers per namespace: Map<namespace, Set<Logger>>
|
|
11
|
+
const addonLoggers = new Map();
|
|
12
|
+
// Track modelId → { namespace, logger } for cleanup on unload
|
|
13
|
+
const modelLoggers = new Map();
|
|
14
|
+
export function registerAddonLogger(modelId, namespace, logger) {
|
|
15
|
+
if (!addonLoggers.has(namespace)) {
|
|
16
|
+
addonLoggers.set(namespace, new Set());
|
|
17
|
+
}
|
|
18
|
+
addonLoggers.get(namespace).add(logger);
|
|
19
|
+
modelLoggers.set(modelId, { namespace, logger });
|
|
20
|
+
}
|
|
21
|
+
export function unregisterAddonLogger(modelId) {
|
|
22
|
+
const entry = modelLoggers.get(modelId);
|
|
23
|
+
if (entry) {
|
|
24
|
+
addonLoggers.get(entry.namespace)?.delete(entry.logger);
|
|
25
|
+
unregisterLogger(entry.logger);
|
|
26
|
+
modelLoggers.delete(modelId);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function routeLog(logger, level, message) {
|
|
30
|
+
switch (level) {
|
|
31
|
+
case "error":
|
|
32
|
+
logger.error(message);
|
|
33
|
+
break;
|
|
34
|
+
case "warn":
|
|
35
|
+
logger.warn(message);
|
|
36
|
+
break;
|
|
37
|
+
case "info":
|
|
38
|
+
logger.info(message);
|
|
39
|
+
break;
|
|
40
|
+
case "debug":
|
|
41
|
+
logger.debug(message);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function createAddonLoggerCallback(namespace) {
|
|
46
|
+
return (priority, message) => {
|
|
47
|
+
const loggers = addonLoggers.get(namespace);
|
|
48
|
+
if (!loggers || loggers.size === 0)
|
|
49
|
+
return;
|
|
50
|
+
const level = PRIORITY_TO_LEVEL[priority] ?? "debug";
|
|
51
|
+
for (const logger of loggers) {
|
|
52
|
+
routeLog(logger, level, message);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function clearAllAddonLoggers() {
|
|
57
|
+
addonLoggers.clear();
|
|
58
|
+
modelLoggers.clear();
|
|
59
|
+
}
|
|
@@ -1,29 +1,34 @@
|
|
|
1
1
|
import QvacLogger, {} from "@qvac/logging";
|
|
2
2
|
import { LOG_LEVELS } from "@qvac/logging/constants.js";
|
|
3
3
|
import { isLevelEnabled, formatArg } from "./utils.js";
|
|
4
|
+
import { registerLogger } from "./registry.js";
|
|
4
5
|
export function createBaseLogger(namespace, options, extensions) {
|
|
5
6
|
const qvacLogger = new QvacLogger(console);
|
|
6
7
|
const initialLevel = options?.level ?? LOG_LEVELS.INFO;
|
|
7
8
|
qvacLogger.setLevel(initialLevel);
|
|
8
9
|
const transports = options?.transports || [];
|
|
10
|
+
let consoleEnabled = options?.enableConsole !== false;
|
|
9
11
|
const log = (level, ...args) => {
|
|
10
12
|
if (!isLevelEnabled(level, qvacLogger.getLevel())) {
|
|
11
13
|
return;
|
|
12
14
|
}
|
|
13
15
|
const message = args.map(formatArg).join(" ");
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
16
|
+
// Log to console if enabled
|
|
17
|
+
if (consoleEnabled) {
|
|
18
|
+
switch (level) {
|
|
19
|
+
case LOG_LEVELS.ERROR:
|
|
20
|
+
qvacLogger.error(`[${namespace}]`, ...args);
|
|
21
|
+
break;
|
|
22
|
+
case LOG_LEVELS.WARN:
|
|
23
|
+
qvacLogger.warn(`[${namespace}]`, ...args);
|
|
24
|
+
break;
|
|
25
|
+
case LOG_LEVELS.INFO:
|
|
26
|
+
qvacLogger.info(`[${namespace}]`, ...args);
|
|
27
|
+
break;
|
|
28
|
+
case LOG_LEVELS.DEBUG:
|
|
29
|
+
qvacLogger.debug(`[${namespace}]`, ...args);
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
27
32
|
}
|
|
28
33
|
extensions?.onLog?.(level, namespace, message);
|
|
29
34
|
for (const transport of transports) {
|
|
@@ -40,7 +45,7 @@ export function createBaseLogger(namespace, options, extensions) {
|
|
|
40
45
|
}
|
|
41
46
|
}
|
|
42
47
|
};
|
|
43
|
-
|
|
48
|
+
const logger = {
|
|
44
49
|
error: (...args) => log(LOG_LEVELS.ERROR, ...args),
|
|
45
50
|
warn: (...args) => log(LOG_LEVELS.WARN, ...args),
|
|
46
51
|
info: (...args) => log(LOG_LEVELS.INFO, ...args),
|
|
@@ -51,5 +56,10 @@ export function createBaseLogger(namespace, options, extensions) {
|
|
|
51
56
|
addTransport: (transport) => {
|
|
52
57
|
transports.push(transport);
|
|
53
58
|
},
|
|
59
|
+
setConsoleOutput: (enabled) => {
|
|
60
|
+
consoleEnabled = enabled;
|
|
61
|
+
},
|
|
54
62
|
};
|
|
63
|
+
registerLogger(logger);
|
|
64
|
+
return logger;
|
|
55
65
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { getLogger } from "./logger.js";
|
|
2
|
+
const CLIENT_NAMESPACE = "sdk:client";
|
|
3
|
+
let cachedLogger = null;
|
|
4
|
+
export function getClientLogger(options) {
|
|
5
|
+
if (!options && cachedLogger) {
|
|
6
|
+
return cachedLogger;
|
|
7
|
+
}
|
|
8
|
+
const logger = getLogger(CLIENT_NAMESPACE, options);
|
|
9
|
+
if (!options) {
|
|
10
|
+
cachedLogger = logger;
|
|
11
|
+
}
|
|
12
|
+
return logger;
|
|
13
|
+
}
|
package/dist/logging/index.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
export { getLogger
|
|
1
|
+
export { getLogger } from "./logger";
|
|
2
|
+
export { setGlobalLogLevel, setGlobalConsoleOutput, registerLogger, unregisterLogger, } from "./registry";
|
|
2
3
|
export { createStreamLogger } from "./stream-logger";
|
|
4
|
+
export { getServerLogger } from "./server-logger";
|
|
5
|
+
export { getClientLogger } from "./client-logger";
|
|
3
6
|
export type { Logger, LoggerOptions, LogTransport } from "./types";
|
|
7
|
+
export { ADDON_NAMESPACES, SDK_LOG_ID, SDK_SERVER_NAMESPACE, type AddonNamespace, } from "./namespaces";
|
|
8
|
+
export { registerAddonLogger, unregisterAddonLogger, createAddonLoggerCallback, clearAllAddonLoggers, } from "./addon";
|
|
4
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/logging/index.js
CHANGED
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
export { getLogger
|
|
1
|
+
export { getLogger } from "./logger.js";
|
|
2
|
+
export { setGlobalLogLevel, setGlobalConsoleOutput, registerLogger, unregisterLogger, } from "./registry.js";
|
|
2
3
|
export { createStreamLogger } from "./stream-logger.js";
|
|
4
|
+
export { getServerLogger } from "./server-logger.js";
|
|
5
|
+
export { getClientLogger } from "./client-logger.js";
|
|
6
|
+
export { ADDON_NAMESPACES, SDK_LOG_ID, SDK_SERVER_NAMESPACE, } from "./namespaces.js";
|
|
7
|
+
export { registerAddonLogger, unregisterAddonLogger, createAddonLoggerCallback, clearAllAddonLoggers, } from "./addon.js";
|
package/dist/logging/logger.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import type { LogLevel } from "@qvac/logging";
|
|
2
1
|
import type { Logger, LoggerOptions } from "./types";
|
|
3
2
|
export declare function getLogger(namespace: string, options?: LoggerOptions): Logger;
|
|
4
|
-
export declare function setGlobalLogLevel(level: LogLevel): void;
|
|
5
3
|
//# sourceMappingURL=logger.d.ts.map
|
package/dist/logging/logger.js
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const ADDON_NAMESPACES: {
|
|
2
|
+
readonly LLAMACPP_LLM: "llamacpp:llm";
|
|
3
|
+
readonly LLAMACPP_EMBED: "llamacpp:embed";
|
|
4
|
+
readonly WHISPERCPP: "whispercpp";
|
|
5
|
+
readonly TTS: "tts";
|
|
6
|
+
readonly NMTCPP: "nmtcpp";
|
|
7
|
+
};
|
|
8
|
+
export type AddonNamespace = (typeof ADDON_NAMESPACES)[keyof typeof ADDON_NAMESPACES];
|
|
9
|
+
export declare const SDK_LOG_ID = "__sdk__";
|
|
10
|
+
export declare const SDK_SERVER_NAMESPACE = "sdk:server";
|
|
11
|
+
//# sourceMappingURL=namespaces.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const ADDON_NAMESPACES = {
|
|
2
|
+
LLAMACPP_LLM: "llamacpp:llm",
|
|
3
|
+
LLAMACPP_EMBED: "llamacpp:embed",
|
|
4
|
+
WHISPERCPP: "whispercpp",
|
|
5
|
+
TTS: "tts",
|
|
6
|
+
NMTCPP: "nmtcpp",
|
|
7
|
+
};
|
|
8
|
+
// Reserved ID for SDK server logs
|
|
9
|
+
export const SDK_LOG_ID = "__sdk__";
|
|
10
|
+
// Namespace for all SDK server logs
|
|
11
|
+
export const SDK_SERVER_NAMESPACE = "sdk:server";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger Instance Registry (Per-Process)
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of all Logger instances in the CURRENT PROCESS.
|
|
5
|
+
* Client and server run as separate processes, each with their own registry instance.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Tracks all Logger objects in this process (getLogger, createStreamLogger, etc.)
|
|
9
|
+
* - Enables process-wide log level control via setGlobalLogLevel()
|
|
10
|
+
* - Enables process-wide console output control via setGlobalConsoleOutput()
|
|
11
|
+
* - Ensures proper cleanup when loggers are no longer needed
|
|
12
|
+
*
|
|
13
|
+
* Config Integration:
|
|
14
|
+
* - loggerLevel and loggerConsoleOutput from config file apply to both processes
|
|
15
|
+
* - Client applies settings after loading config, server applies during __init_config
|
|
16
|
+
*
|
|
17
|
+
* NOTE: This is separate from server/bare/registry/logging-stream-registry.ts
|
|
18
|
+
* which manages RPC subscriptions for streaming logs to connected clients.
|
|
19
|
+
*/
|
|
20
|
+
import type { LogLevel } from "@qvac/logging";
|
|
21
|
+
import type { Logger } from "./types";
|
|
22
|
+
export declare function registerLogger(logger: Logger): void;
|
|
23
|
+
export declare function unregisterLogger(logger: Logger): void;
|
|
24
|
+
export declare function setGlobalLogLevel(level: LogLevel): void;
|
|
25
|
+
export declare function setGlobalConsoleOutput(enabled: boolean): void;
|
|
26
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger Instance Registry (Per-Process)
|
|
3
|
+
*
|
|
4
|
+
* Manages the lifecycle of all Logger instances in the CURRENT PROCESS.
|
|
5
|
+
* Client and server run as separate processes, each with their own registry instance.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Tracks all Logger objects in this process (getLogger, createStreamLogger, etc.)
|
|
9
|
+
* - Enables process-wide log level control via setGlobalLogLevel()
|
|
10
|
+
* - Enables process-wide console output control via setGlobalConsoleOutput()
|
|
11
|
+
* - Ensures proper cleanup when loggers are no longer needed
|
|
12
|
+
*
|
|
13
|
+
* Config Integration:
|
|
14
|
+
* - loggerLevel and loggerConsoleOutput from config file apply to both processes
|
|
15
|
+
* - Client applies settings after loading config, server applies during __init_config
|
|
16
|
+
*
|
|
17
|
+
* NOTE: This is separate from server/bare/registry/logging-stream-registry.ts
|
|
18
|
+
* which manages RPC subscriptions for streaming logs to connected clients.
|
|
19
|
+
*/
|
|
20
|
+
const allLoggers = new Set();
|
|
21
|
+
export function registerLogger(logger) {
|
|
22
|
+
allLoggers.add(logger);
|
|
23
|
+
}
|
|
24
|
+
export function unregisterLogger(logger) {
|
|
25
|
+
allLoggers.delete(logger);
|
|
26
|
+
}
|
|
27
|
+
export function setGlobalLogLevel(level) {
|
|
28
|
+
for (const logger of allLoggers) {
|
|
29
|
+
logger.setLevel(level);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function setGlobalConsoleOutput(enabled) {
|
|
33
|
+
for (const logger of allLoggers) {
|
|
34
|
+
logger.setConsoleOutput(enabled);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createStreamLogger } from "./stream-logger.js";
|
|
2
|
+
import { SDK_LOG_ID, SDK_SERVER_NAMESPACE } from "./namespaces.js";
|
|
3
|
+
let cachedLogger = null;
|
|
4
|
+
export function getServerLogger(options) {
|
|
5
|
+
if (!options && cachedLogger) {
|
|
6
|
+
return cachedLogger;
|
|
7
|
+
}
|
|
8
|
+
const logger = createStreamLogger(SDK_LOG_ID, SDK_SERVER_NAMESPACE, {
|
|
9
|
+
enableConsole: true, // SDK logs should still print to console
|
|
10
|
+
...options,
|
|
11
|
+
});
|
|
12
|
+
if (!options) {
|
|
13
|
+
cachedLogger = logger;
|
|
14
|
+
}
|
|
15
|
+
return logger;
|
|
16
|
+
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { Logger, LoggerOptions } from "./types";
|
|
2
|
-
export declare function createStreamLogger(
|
|
2
|
+
export declare function createStreamLogger(id: string, namespace: string, options?: LoggerOptions): Logger;
|
|
3
3
|
//# sourceMappingURL=stream-logger.d.ts.map
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { sendLogToStreams } from "../server/bare/registry/logging-stream-registry.js";
|
|
2
2
|
import { createBaseLogger } from "./base-logger.js";
|
|
3
|
-
export function createStreamLogger(
|
|
4
|
-
return createBaseLogger(namespace,
|
|
3
|
+
export function createStreamLogger(id, namespace, options) {
|
|
4
|
+
return createBaseLogger(namespace, {
|
|
5
|
+
enableConsole: false, // Default to disable console output for stream loggers
|
|
6
|
+
...options,
|
|
7
|
+
}, {
|
|
5
8
|
onLog: (level, namespace, message) => {
|
|
6
|
-
sendLogToStreams(
|
|
9
|
+
sendLogToStreams(id, level, namespace, message);
|
|
7
10
|
},
|
|
8
11
|
});
|
|
9
12
|
}
|
package/dist/logging/types.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export interface LoggerOptions {
|
|
|
4
4
|
level?: LogLevel;
|
|
5
5
|
namespace?: string;
|
|
6
6
|
transports?: LogTransport[];
|
|
7
|
+
enableConsole?: boolean;
|
|
7
8
|
}
|
|
8
9
|
export interface Logger {
|
|
9
10
|
error: (...args: unknown[]) => void;
|
|
@@ -14,5 +15,6 @@ export interface Logger {
|
|
|
14
15
|
setLevel: (level: LogLevel) => void;
|
|
15
16
|
getLevel: () => LogLevel;
|
|
16
17
|
addTransport: (transport: LogTransport) => void;
|
|
18
|
+
setConsoleOutput: (enabled: boolean) => void;
|
|
17
19
|
}
|
|
18
20
|
//# sourceMappingURL=types.d.ts.map
|