@veewo/claw-core 0.1.67 → 0.1.69
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/dist/src/context.d.ts +3 -3
- package/dist/src/context.js +25 -67
- package/dist/src/context.js.map +1 -1
- package/dist/src/embedding-daemon-protocol.d.ts +48 -0
- package/dist/src/embedding-daemon-protocol.js +198 -0
- package/dist/src/embedding-daemon-protocol.js.map +1 -0
- package/dist/src/embedding-daemon.d.ts +1 -0
- package/dist/src/embedding-daemon.js +256 -0
- package/dist/src/embedding-daemon.js.map +1 -0
- package/dist/src/embedding-local-runtime.d.ts +8 -0
- package/dist/src/embedding-local-runtime.js +134 -0
- package/dist/src/embedding-local-runtime.js.map +1 -0
- package/dist/src/embedding-local.d.ts +8 -0
- package/dist/src/embedding-local.js +75 -38
- package/dist/src/embedding-local.js.map +1 -1
- package/dist/src/embedding-worker.js +29 -75
- package/dist/src/embedding-worker.js.map +1 -1
- package/dist/src/errors.d.ts +1 -1
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/init.js +3 -0
- package/dist/src/init.js.map +1 -1
- package/dist/src/memory.js +181 -22
- package/dist/src/memory.js.map +1 -1
- package/dist/src/plan-events.d.ts +7 -2
- package/dist/src/plan-events.js +3 -0
- package/dist/src/plan-events.js.map +1 -1
- package/dist/src/plan-templates.js +4 -1
- package/dist/src/plan-templates.js.map +1 -1
- package/dist/src/plan.js +94 -38
- package/dist/src/plan.js.map +1 -1
- package/dist/src/project-check.js +5 -2
- package/dist/src/project-check.js.map +1 -1
- package/dist/src/session-bindings.d.ts +5 -0
- package/dist/src/session-bindings.js +85 -0
- package/dist/src/session-bindings.js.map +1 -0
- package/dist/src/switch-task.js +11 -34
- package/dist/src/switch-task.js.map +1 -1
- package/dist/src/task-layout-migration.d.ts +8 -0
- package/dist/src/task-layout-migration.js +210 -0
- package/dist/src/task-layout-migration.js.map +1 -0
- package/dist/src/task-retention.d.ts +2 -1
- package/dist/src/task-retention.js +60 -27
- package/dist/src/task-retention.js.map +1 -1
- package/dist/src/types.d.ts +16 -6
- package/dist/src/workflow-guidance.config.json +8 -4
- package/dist/src/workflow-guidance.d.ts +1 -1
- package/dist/src/workflow-guidance.js +36 -18
- package/dist/src/workflow-guidance.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import net from "node:net";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { EMBEDDING_DAEMON_MAX_MESSAGE_BYTES, EMBEDDING_DAEMON_PROTOCOL_VERSION, createEmbeddingDaemonToken, removeStateIfOwned, writeEmbeddingDaemonState, } from "./embedding-daemon-protocol.js";
|
|
6
|
+
import { createConfiguredLocalEmbeddingSession, resolveConfiguredLocalEmbeddingFingerprint, resolveEmbeddingDimensions, } from "./embedding-local-runtime.js";
|
|
7
|
+
const DEFAULT_IDLE_TTL_MS = 120000;
|
|
8
|
+
const DEFAULT_SESSION_LIMIT = 1;
|
|
9
|
+
const runtimeDir = resolveRuntimeDirFromArgs(process.argv.slice(2));
|
|
10
|
+
const instanceId = randomBytes(16).toString("hex");
|
|
11
|
+
const token = createEmbeddingDaemonToken();
|
|
12
|
+
const idleTtlMs = readPositiveInteger(process.env.CLAW_EMBEDDING_DAEMON_IDLE_TTL_MS, DEFAULT_IDLE_TTL_MS);
|
|
13
|
+
const sessionLimit = readPositiveInteger(process.env.CLAW_EMBEDDING_DAEMON_SESSION_LIMIT, DEFAULT_SESSION_LIMIT);
|
|
14
|
+
const sessions = new Map();
|
|
15
|
+
let activeRequests = 0;
|
|
16
|
+
let idleTimer = null;
|
|
17
|
+
let shuttingDown = false;
|
|
18
|
+
fs.mkdirSync(runtimeDir, { recursive: true, mode: 0o700 });
|
|
19
|
+
const server = net.createServer((socket) => {
|
|
20
|
+
resetIdleTimer();
|
|
21
|
+
socket.setEncoding("utf-8");
|
|
22
|
+
let payload = "";
|
|
23
|
+
let handled = false;
|
|
24
|
+
socket.on("data", (chunk) => {
|
|
25
|
+
if (handled) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
payload += chunk;
|
|
29
|
+
if (Buffer.byteLength(payload, "utf-8") > EMBEDDING_DAEMON_MAX_MESSAGE_BYTES) {
|
|
30
|
+
handled = true;
|
|
31
|
+
writeResponse(socket, protocolError("", "Embedding daemon request exceeded the size limit."));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const newlineIndex = payload.indexOf("\n");
|
|
35
|
+
if (newlineIndex < 0) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
handled = true;
|
|
39
|
+
const raw = payload.slice(0, newlineIndex).trim();
|
|
40
|
+
void handleRawRequest(raw).then((response) => writeResponse(socket, response));
|
|
41
|
+
});
|
|
42
|
+
socket.on("error", () => {
|
|
43
|
+
// Client transport failures are isolated to the request.
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
server.on("error", async (error) => {
|
|
47
|
+
appendEvent("daemon.error", { message: error.message });
|
|
48
|
+
await shutdown(1);
|
|
49
|
+
});
|
|
50
|
+
server.listen(0, "127.0.0.1", () => {
|
|
51
|
+
const address = server.address();
|
|
52
|
+
if (!address || typeof address === "string") {
|
|
53
|
+
void shutdown(1);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
writeEmbeddingDaemonState(runtimeDir, {
|
|
57
|
+
protocolVersion: EMBEDDING_DAEMON_PROTOCOL_VERSION,
|
|
58
|
+
instanceId,
|
|
59
|
+
pid: process.pid,
|
|
60
|
+
port: address.port,
|
|
61
|
+
token,
|
|
62
|
+
startedAt: new Date().toISOString(),
|
|
63
|
+
});
|
|
64
|
+
appendEvent("daemon.started", { port: address.port });
|
|
65
|
+
resetIdleTimer();
|
|
66
|
+
});
|
|
67
|
+
process.on("SIGTERM", () => void shutdown(0));
|
|
68
|
+
process.on("SIGINT", () => void shutdown(0));
|
|
69
|
+
async function handleRawRequest(raw) {
|
|
70
|
+
let request;
|
|
71
|
+
try {
|
|
72
|
+
request = JSON.parse(raw);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return protocolError("", "Embedding daemon request is not valid JSON.");
|
|
76
|
+
}
|
|
77
|
+
if (request.protocolVersion !== EMBEDDING_DAEMON_PROTOCOL_VERSION) {
|
|
78
|
+
return protocolError(request.requestId, "Embedding daemon protocol version mismatch.");
|
|
79
|
+
}
|
|
80
|
+
if (request.token !== token) {
|
|
81
|
+
return protocolError(request.requestId, "Embedding daemon authentication failed.");
|
|
82
|
+
}
|
|
83
|
+
if (request.embedding?.provider !== "local" || !Array.isArray(request.texts) || !request.projectCwd) {
|
|
84
|
+
return protocolError(request.requestId, "Embedding daemon request shape is invalid.");
|
|
85
|
+
}
|
|
86
|
+
activeRequests += 1;
|
|
87
|
+
resetIdleTimer();
|
|
88
|
+
try {
|
|
89
|
+
const output = await runRequest(request);
|
|
90
|
+
appendEvent("request.completed", {
|
|
91
|
+
requestId: request.requestId,
|
|
92
|
+
textCount: request.texts.length,
|
|
93
|
+
});
|
|
94
|
+
return { ok: true, requestId: request.requestId, output };
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
const message = error instanceof Error ? error.message : "Unknown local embedding failure.";
|
|
98
|
+
appendEvent("request.failed", { requestId: request.requestId, message });
|
|
99
|
+
return {
|
|
100
|
+
ok: false,
|
|
101
|
+
requestId: request.requestId,
|
|
102
|
+
error: { kind: "model", message },
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
activeRequests -= 1;
|
|
107
|
+
resetIdleTimer();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function runRequest(request) {
|
|
111
|
+
const fingerprint = process.env.CLAW_EMBEDDING_DAEMON_TEST_MOCK === "1"
|
|
112
|
+
? createHash("sha256").update(JSON.stringify({ request: request.embedding, requestCwd: request.projectCwd })).digest("hex")
|
|
113
|
+
: resolveConfiguredLocalEmbeddingFingerprint(request.embedding, request.projectCwd);
|
|
114
|
+
let entry = sessions.get(fingerprint);
|
|
115
|
+
if (!entry) {
|
|
116
|
+
const session = process.env.CLAW_EMBEDDING_DAEMON_TEST_MOCK === "1"
|
|
117
|
+
? Promise.resolve(createMockSession(request.embedding))
|
|
118
|
+
: createConfiguredLocalEmbeddingSession(request.embedding, request.projectCwd);
|
|
119
|
+
entry = {
|
|
120
|
+
fingerprint,
|
|
121
|
+
session,
|
|
122
|
+
queue: Promise.resolve(),
|
|
123
|
+
lastUsedAt: Date.now(),
|
|
124
|
+
};
|
|
125
|
+
sessions.set(fingerprint, entry);
|
|
126
|
+
appendEvent("session.created", { fingerprint });
|
|
127
|
+
await evictSessions(fingerprint);
|
|
128
|
+
}
|
|
129
|
+
entry.lastUsedAt = Date.now();
|
|
130
|
+
let release;
|
|
131
|
+
const previous = entry.queue;
|
|
132
|
+
entry.queue = new Promise((resolve) => {
|
|
133
|
+
release = resolve;
|
|
134
|
+
});
|
|
135
|
+
await previous;
|
|
136
|
+
try {
|
|
137
|
+
const session = await entry.session;
|
|
138
|
+
const result = await session.run(request.texts);
|
|
139
|
+
return { dimensions: result.dimensions, vectors: result.vectors };
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
release();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async function evictSessions(activeFingerprint) {
|
|
146
|
+
if (sessions.size <= sessionLimit) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const candidates = Array.from(sessions.values())
|
|
150
|
+
.filter((entry) => entry.fingerprint !== activeFingerprint)
|
|
151
|
+
.sort((left, right) => left.lastUsedAt - right.lastUsedAt);
|
|
152
|
+
while (sessions.size > sessionLimit && candidates.length > 0) {
|
|
153
|
+
const entry = candidates.shift();
|
|
154
|
+
if (!entry) {
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
sessions.delete(entry.fingerprint);
|
|
158
|
+
const session = await entry.session;
|
|
159
|
+
await entry.queue;
|
|
160
|
+
await session.dispose();
|
|
161
|
+
appendEvent("session.evicted", { fingerprint: entry.fingerprint });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function createMockSession(embedding) {
|
|
165
|
+
const dimensions = resolveEmbeddingDimensions(embedding, 768);
|
|
166
|
+
let disposed = false;
|
|
167
|
+
return {
|
|
168
|
+
dimensions,
|
|
169
|
+
device: "cpu",
|
|
170
|
+
run: async (texts) => {
|
|
171
|
+
if (disposed) {
|
|
172
|
+
throw new Error("Mock embedding session has been disposed.");
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
dimensions,
|
|
176
|
+
device: "cpu",
|
|
177
|
+
vectors: texts.map((text, textIndex) => buildMockVector(text, dimensions, textIndex)),
|
|
178
|
+
};
|
|
179
|
+
},
|
|
180
|
+
dispose: async () => {
|
|
181
|
+
disposed = true;
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
function buildMockVector(text, dimensions, textIndex) {
|
|
186
|
+
let seed = textIndex + 1;
|
|
187
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
188
|
+
seed = (seed * 31 + text.charCodeAt(index)) % 104729;
|
|
189
|
+
}
|
|
190
|
+
return Array.from({ length: dimensions }, (_, index) => ((seed + index * 17) % 1000) / 1000);
|
|
191
|
+
}
|
|
192
|
+
function protocolError(requestId, message) {
|
|
193
|
+
return { ok: false, requestId, error: { kind: "protocol", message } };
|
|
194
|
+
}
|
|
195
|
+
function writeResponse(socket, response) {
|
|
196
|
+
if (!socket.destroyed) {
|
|
197
|
+
socket.end(`${JSON.stringify(response)}\n`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function resetIdleTimer() {
|
|
201
|
+
if (idleTimer) {
|
|
202
|
+
clearTimeout(idleTimer);
|
|
203
|
+
}
|
|
204
|
+
idleTimer = setTimeout(() => {
|
|
205
|
+
if (activeRequests === 0) {
|
|
206
|
+
void shutdown(0);
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
resetIdleTimer();
|
|
210
|
+
}
|
|
211
|
+
}, idleTtlMs);
|
|
212
|
+
idleTimer.unref();
|
|
213
|
+
}
|
|
214
|
+
async function shutdown(exitCode) {
|
|
215
|
+
if (shuttingDown) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
shuttingDown = true;
|
|
219
|
+
if (idleTimer) {
|
|
220
|
+
clearTimeout(idleTimer);
|
|
221
|
+
}
|
|
222
|
+
await new Promise((resolve) => server.close(() => resolve()));
|
|
223
|
+
for (const entry of sessions.values()) {
|
|
224
|
+
try {
|
|
225
|
+
await entry.queue;
|
|
226
|
+
await (await entry.session).dispose();
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// Best-effort shutdown.
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
removeStateIfOwned(runtimeDir, instanceId);
|
|
233
|
+
appendEvent("daemon.stopped", { exitCode });
|
|
234
|
+
process.exitCode = exitCode;
|
|
235
|
+
}
|
|
236
|
+
function appendEvent(event, details) {
|
|
237
|
+
const target = process.env.CLAW_EMBEDDING_DAEMON_EVENT_LOG?.trim();
|
|
238
|
+
if (!target) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
242
|
+
fs.appendFileSync(target, `${JSON.stringify({ event, pid: process.pid, instanceId, at: Date.now(), ...details })}\n`, "utf-8");
|
|
243
|
+
}
|
|
244
|
+
function resolveRuntimeDirFromArgs(args) {
|
|
245
|
+
const index = args.indexOf("--runtime-dir");
|
|
246
|
+
const value = index >= 0 ? args[index + 1] : null;
|
|
247
|
+
if (!value) {
|
|
248
|
+
throw new Error("Missing --runtime-dir for embedding daemon.");
|
|
249
|
+
}
|
|
250
|
+
return path.resolve(value);
|
|
251
|
+
}
|
|
252
|
+
function readPositiveInteger(value, fallback) {
|
|
253
|
+
const parsed = Number.parseInt(value ?? "", 10);
|
|
254
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=embedding-daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-daemon.js","sourceRoot":"","sources":["../../src/embedding-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type LocalEmbeddingSession } from "./embedding-local.js";
|
|
2
|
+
import type { MemoryEmbeddingConfig } from "./types.js";
|
|
3
|
+
export type ConfiguredLocalEmbeddingSession = LocalEmbeddingSession & {
|
|
4
|
+
fingerprint: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function createConfiguredLocalEmbeddingSession(embedding: MemoryEmbeddingConfig, projectCwd: string): Promise<ConfiguredLocalEmbeddingSession>;
|
|
7
|
+
export declare function resolveConfiguredLocalEmbeddingFingerprint(embedding: MemoryEmbeddingConfig, projectCwd: string): string;
|
|
8
|
+
export declare function resolveEmbeddingDimensions(embedding: MemoryEmbeddingConfig, fallback: number): number;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { DEFAULT_LOCAL_EMBEDDING_DIMENSIONS, resolveDefaultLocalEmbeddingDimensions, resolveLocalEmbeddingCacheDir, } from "./embedding-defaults.js";
|
|
7
|
+
import { createLocalEmbeddingSession, resolveLocalExecutionDevice, resolveLocalTokenizerMaxLength, } from "./embedding-local.js";
|
|
8
|
+
import { resolveTransformersModule } from "./embedding-transformers.js";
|
|
9
|
+
const DEFAULT_EMBEDDING_MAX_TOKENS = 2048;
|
|
10
|
+
export async function createConfiguredLocalEmbeddingSession(embedding, projectCwd) {
|
|
11
|
+
if (!process.env.ORT_LOG_LEVEL) {
|
|
12
|
+
process.env.ORT_LOG_LEVEL = "3";
|
|
13
|
+
}
|
|
14
|
+
const projectRequire = createRequire(path.join(projectCwd, "package.json"));
|
|
15
|
+
const workerRequire = createRequire(import.meta.url);
|
|
16
|
+
const resolvedModulePath = resolveTransformersModulePath(projectRequire, workerRequire);
|
|
17
|
+
const { pipeline, env } = resolveTransformersModule(projectRequire, workerRequire);
|
|
18
|
+
env.allowLocalModels = false;
|
|
19
|
+
const modelId = embedding.local?.modelPath?.trim() || embedding.model;
|
|
20
|
+
const cacheDir = resolveLocalEmbeddingCacheDir(modelId, embedding.local?.modelCacheDir, { cwd: projectCwd });
|
|
21
|
+
env.cacheDir = cacheDir;
|
|
22
|
+
const requestedDevice = resolveLocalExecutionDevice(embedding, { cudaAvailable: isCudaAvailable() });
|
|
23
|
+
const dimensions = resolveEmbeddingDimensions(embedding, DEFAULT_LOCAL_EMBEDDING_DIMENSIONS);
|
|
24
|
+
const fingerprint = createHash("sha256")
|
|
25
|
+
.update(JSON.stringify({
|
|
26
|
+
version: 1,
|
|
27
|
+
projectCwd: path.resolve(projectCwd),
|
|
28
|
+
resolvedModulePath,
|
|
29
|
+
modelId,
|
|
30
|
+
modelSignature: resolveModelSignature(embedding.local?.modelPath),
|
|
31
|
+
cacheDir,
|
|
32
|
+
dimensions,
|
|
33
|
+
requestedDevice,
|
|
34
|
+
dtype: "fp32",
|
|
35
|
+
pooling: "mean",
|
|
36
|
+
normalize: true,
|
|
37
|
+
tokenizerMaxLength: DEFAULT_EMBEDDING_MAX_TOKENS,
|
|
38
|
+
}))
|
|
39
|
+
.digest("hex");
|
|
40
|
+
const session = await createLocalEmbeddingSession({
|
|
41
|
+
dimensions,
|
|
42
|
+
requestedDevice,
|
|
43
|
+
createExtractor: async (device) => {
|
|
44
|
+
const extractor = await pipeline("feature-extraction", modelId, {
|
|
45
|
+
device,
|
|
46
|
+
dtype: "fp32",
|
|
47
|
+
session_options: { logSeverityLevel: 3 },
|
|
48
|
+
});
|
|
49
|
+
const safeTokenizerMaxLength = resolveLocalTokenizerMaxLength(extractor.tokenizer?.model_max_length, extractor.model?.config?.max_position_embeddings, DEFAULT_EMBEDDING_MAX_TOKENS);
|
|
50
|
+
if (safeTokenizerMaxLength !== null && extractor.tokenizer) {
|
|
51
|
+
extractor.tokenizer.model_max_length = safeTokenizerMaxLength;
|
|
52
|
+
}
|
|
53
|
+
return extractor;
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
return Object.assign(session, { fingerprint });
|
|
57
|
+
}
|
|
58
|
+
export function resolveConfiguredLocalEmbeddingFingerprint(embedding, projectCwd) {
|
|
59
|
+
const projectRequire = createRequire(path.join(projectCwd, "package.json"));
|
|
60
|
+
const workerRequire = createRequire(import.meta.url);
|
|
61
|
+
const modelId = embedding.local?.modelPath?.trim() || embedding.model;
|
|
62
|
+
const cacheDir = resolveLocalEmbeddingCacheDir(modelId, embedding.local?.modelCacheDir, { cwd: projectCwd });
|
|
63
|
+
return createHash("sha256")
|
|
64
|
+
.update(JSON.stringify({
|
|
65
|
+
version: 1,
|
|
66
|
+
projectCwd: path.resolve(projectCwd),
|
|
67
|
+
resolvedModulePath: resolveTransformersModulePath(projectRequire, workerRequire),
|
|
68
|
+
modelId,
|
|
69
|
+
modelSignature: resolveModelSignature(embedding.local?.modelPath),
|
|
70
|
+
cacheDir,
|
|
71
|
+
dimensions: resolveEmbeddingDimensions(embedding, DEFAULT_LOCAL_EMBEDDING_DIMENSIONS),
|
|
72
|
+
requestedDevice: resolveLocalExecutionDevice(embedding, { cudaAvailable: isCudaAvailable() }),
|
|
73
|
+
dtype: "fp32",
|
|
74
|
+
pooling: "mean",
|
|
75
|
+
normalize: true,
|
|
76
|
+
tokenizerMaxLength: DEFAULT_EMBEDDING_MAX_TOKENS,
|
|
77
|
+
}))
|
|
78
|
+
.digest("hex");
|
|
79
|
+
}
|
|
80
|
+
export function resolveEmbeddingDimensions(embedding, fallback) {
|
|
81
|
+
if (typeof embedding.outputDimensionality === "number" && embedding.outputDimensionality > 0) {
|
|
82
|
+
return embedding.outputDimensionality;
|
|
83
|
+
}
|
|
84
|
+
if (embedding.provider === "local") {
|
|
85
|
+
return resolveDefaultLocalEmbeddingDimensions(embedding.model);
|
|
86
|
+
}
|
|
87
|
+
return fallback > 0 ? fallback : 1536;
|
|
88
|
+
}
|
|
89
|
+
function resolveTransformersModulePath(projectRequire, workerRequire) {
|
|
90
|
+
try {
|
|
91
|
+
return projectRequire.resolve("@huggingface/transformers");
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return workerRequire.resolve("@huggingface/transformers");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function resolveModelSignature(modelPath) {
|
|
98
|
+
if (!modelPath?.trim()) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const stats = fs.statSync(modelPath);
|
|
103
|
+
return `${stats.size}:${stats.mtimeMs}`;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return "missing";
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function isCudaAvailable() {
|
|
110
|
+
try {
|
|
111
|
+
const out = execFileSync("ldconfig", ["-p"], { timeout: 3000, encoding: "utf-8" });
|
|
112
|
+
if (out.includes("libcublasLt.so.12")) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Ignore.
|
|
118
|
+
}
|
|
119
|
+
for (const envVar of ["CUDA_PATH", "LD_LIBRARY_PATH"]) {
|
|
120
|
+
const value = process.env[envVar];
|
|
121
|
+
if (!value) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
for (const candidate of value.split(path.delimiter).filter(Boolean)) {
|
|
125
|
+
if (fs.existsSync(path.join(candidate, "lib64", "libcublasLt.so.12"))
|
|
126
|
+
|| fs.existsSync(path.join(candidate, "lib", "libcublasLt.so.12"))
|
|
127
|
+
|| fs.existsSync(path.join(candidate, "libcublasLt.so.12"))) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=embedding-local-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedding-local-runtime.js","sourceRoot":"","sources":["../../src/embedding-local-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,9 +25,17 @@ type RunLocalEmbeddingOptions = {
|
|
|
25
25
|
requestedDevice: LocalExecutionDevice;
|
|
26
26
|
createExtractor: (device: LocalExecutionDevice) => Promise<LocalExtractor>;
|
|
27
27
|
};
|
|
28
|
+
export type LocalEmbeddingSession = {
|
|
29
|
+
readonly dimensions: number;
|
|
30
|
+
readonly device: LocalExecutionDevice;
|
|
31
|
+
run: (texts: string[]) => Promise<LocalEmbeddingResult>;
|
|
32
|
+
dispose: () => Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
type CreateLocalEmbeddingSessionOptions = Omit<RunLocalEmbeddingOptions, "texts">;
|
|
28
35
|
export declare function resolveLocalTokenizerMaxLength(tokenizerMaxLength: unknown, modelMaxPositionEmbeddings: unknown, requestedMaxLength?: unknown): number | null;
|
|
29
36
|
export declare function parseLocalExecutionDevice(value: string | null | undefined): LocalExecutionDevice | null;
|
|
30
37
|
export declare function resolveLocalExecutionDevice(embedding: MemoryEmbeddingConfig, options?: ResolveLocalDeviceOptions): LocalExecutionDevice;
|
|
31
38
|
export declare function buildLocalDeviceAttemptOrder(requestedDevice: LocalExecutionDevice): LocalExecutionDevice[];
|
|
32
39
|
export declare function runLocalEmbeddingWithFallback(options: RunLocalEmbeddingOptions): Promise<LocalEmbeddingResult>;
|
|
40
|
+
export declare function createLocalEmbeddingSession(options: CreateLocalEmbeddingSessionOptions): Promise<LocalEmbeddingSession>;
|
|
33
41
|
export {};
|
|
@@ -48,47 +48,84 @@ export function buildLocalDeviceAttemptOrder(requestedDevice) {
|
|
|
48
48
|
: [requestedDevice];
|
|
49
49
|
}
|
|
50
50
|
export async function runLocalEmbeddingWithFallback(options) {
|
|
51
|
+
const session = await createLocalEmbeddingSession(options);
|
|
52
|
+
try {
|
|
53
|
+
return await session.run(options.texts);
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
await session.dispose();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export async function createLocalEmbeddingSession(options) {
|
|
51
60
|
const devicesToTry = buildLocalDeviceAttemptOrder(options.requestedDevice);
|
|
52
|
-
let
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
pooling: "mean",
|
|
62
|
-
normalize: true,
|
|
63
|
-
});
|
|
64
|
-
const rawData = Array.from(result.data);
|
|
65
|
-
const inferredDimensions = batch.length > 0 ? Math.floor(rawData.length / batch.length) : 0;
|
|
66
|
-
const dimensions = options.dimensions > 0 ? options.dimensions : inferredDimensions;
|
|
67
|
-
vectors.push(...batch.map((_, textIndex) => {
|
|
68
|
-
const start = textIndex * inferredDimensions;
|
|
69
|
-
const end = start + Math.min(dimensions, inferredDimensions);
|
|
70
|
-
const vector = rawData.slice(start, end);
|
|
71
|
-
if (vector.length < dimensions) {
|
|
72
|
-
vector.push(...Array.from({ length: dimensions - vector.length }, () => 0));
|
|
73
|
-
}
|
|
74
|
-
return vector;
|
|
75
|
-
}));
|
|
76
|
-
}
|
|
77
|
-
return {
|
|
78
|
-
dimensions: options.dimensions,
|
|
79
|
-
vectors,
|
|
80
|
-
device,
|
|
81
|
-
};
|
|
61
|
+
let deviceIndex = 0;
|
|
62
|
+
let activeDevice = devicesToTry[0] ?? options.requestedDevice;
|
|
63
|
+
let extractor = null;
|
|
64
|
+
let disposed = false;
|
|
65
|
+
const disposeExtractor = async () => {
|
|
66
|
+
const current = extractor;
|
|
67
|
+
extractor = null;
|
|
68
|
+
if (current?.dispose) {
|
|
69
|
+
await current.dispose();
|
|
82
70
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
71
|
+
};
|
|
72
|
+
const run = async (texts) => {
|
|
73
|
+
let lastError = null;
|
|
74
|
+
while (deviceIndex < devicesToTry.length) {
|
|
75
|
+
const device = devicesToTry[deviceIndex] ?? options.requestedDevice;
|
|
76
|
+
try {
|
|
77
|
+
if (disposed) {
|
|
78
|
+
throw new Error("Local embedding session has been disposed.");
|
|
79
|
+
}
|
|
80
|
+
extractor ??= await options.createExtractor(device);
|
|
81
|
+
activeDevice = device;
|
|
82
|
+
const vectors = [];
|
|
83
|
+
for (let index = 0; index < texts.length; index += DEFAULT_LOCAL_EMBEDDING_BATCH_SIZE) {
|
|
84
|
+
const batch = texts.slice(index, index + DEFAULT_LOCAL_EMBEDDING_BATCH_SIZE);
|
|
85
|
+
const result = await extractor(batch, {
|
|
86
|
+
pooling: "mean",
|
|
87
|
+
normalize: true,
|
|
88
|
+
});
|
|
89
|
+
const rawData = Array.from(result.data);
|
|
90
|
+
const inferredDimensions = batch.length > 0 ? Math.floor(rawData.length / batch.length) : 0;
|
|
91
|
+
const dimensions = options.dimensions > 0 ? options.dimensions : inferredDimensions;
|
|
92
|
+
vectors.push(...batch.map((_, textIndex) => {
|
|
93
|
+
const start = textIndex * inferredDimensions;
|
|
94
|
+
const end = start + Math.min(dimensions, inferredDimensions);
|
|
95
|
+
const vector = rawData.slice(start, end);
|
|
96
|
+
if (vector.length < dimensions) {
|
|
97
|
+
vector.push(...Array.from({ length: dimensions - vector.length }, () => 0));
|
|
98
|
+
}
|
|
99
|
+
return vector;
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
dimensions: options.dimensions,
|
|
104
|
+
vectors,
|
|
105
|
+
device,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
lastError = error;
|
|
110
|
+
await disposeExtractor();
|
|
111
|
+
deviceIndex += 1;
|
|
89
112
|
}
|
|
90
113
|
}
|
|
91
|
-
|
|
92
|
-
|
|
114
|
+
throw lastError instanceof Error ? lastError : new Error("Unable to initialize local embedding model.");
|
|
115
|
+
};
|
|
116
|
+
return {
|
|
117
|
+
dimensions: options.dimensions,
|
|
118
|
+
get device() {
|
|
119
|
+
return activeDevice;
|
|
120
|
+
},
|
|
121
|
+
run,
|
|
122
|
+
dispose: async () => {
|
|
123
|
+
if (disposed) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
disposed = true;
|
|
127
|
+
await disposeExtractor();
|
|
128
|
+
},
|
|
129
|
+
};
|
|
93
130
|
}
|
|
94
131
|
//# sourceMappingURL=embedding-local.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-local.js","sourceRoot":"","sources":["../../src/embedding-local.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"embedding-local.js","sourceRoot":"","sources":["../../src/embedding-local.ts"],"names":[],"mappings":"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"}
|