@mrc2204/agent-smart-memo 4.0.7 → 4.0.9
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/hooks/auto-capture.d.ts.map +1 -1
- package/dist/hooks/auto-capture.js +43 -4
- package/dist/hooks/auto-capture.js.map +1 -1
- package/dist/scripts/reembed-collection.d.ts +2 -0
- package/dist/scripts/reembed-collection.d.ts.map +1 -0
- package/dist/scripts/reembed-collection.js +165 -0
- package/dist/scripts/reembed-collection.js.map +1 -0
- package/dist/services/embedding.d.ts +28 -6
- package/dist/services/embedding.d.ts.map +1 -1
- package/dist/services/embedding.js +264 -54
- package/dist/services/embedding.js.map +1 -1
- package/dist/services/qdrant.d.ts +19 -18
- package/dist/services/qdrant.d.ts.map +1 -1
- package/dist/services/qdrant.js +82 -21
- package/dist/services/qdrant.js.map +1 -1
- package/dist/tools/memory_store.d.ts.map +1 -1
- package/dist/tools/memory_store.js +25 -4
- package/dist/tools/memory_store.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,10 +1,26 @@
|
|
|
1
|
+
class EmbeddingHttpError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
bodyPreview;
|
|
4
|
+
constructor(status, bodyPreview, message) {
|
|
5
|
+
super(message || `Embedding API error: ${status}`);
|
|
6
|
+
this.name = "EmbeddingHttpError";
|
|
7
|
+
this.status = status;
|
|
8
|
+
this.bodyPreview = bodyPreview;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
1
11
|
/**
|
|
2
|
-
* Embedding service client
|
|
12
|
+
* Embedding service client
|
|
3
13
|
*/
|
|
4
14
|
export class EmbeddingClient {
|
|
5
15
|
config;
|
|
6
16
|
logger;
|
|
7
17
|
dimensions;
|
|
18
|
+
// conservative model context windows
|
|
19
|
+
modelMaxTokens = {
|
|
20
|
+
"text-embedding-3-small": 8192,
|
|
21
|
+
"text-embedding-3-large": 8192,
|
|
22
|
+
"qwen3-embedding:0.6b": 8192,
|
|
23
|
+
};
|
|
8
24
|
constructor(config, logger) {
|
|
9
25
|
this.config = {
|
|
10
26
|
embeddingApiUrl: config.embeddingApiUrl || "http://localhost:11434",
|
|
@@ -17,86 +33,271 @@ export class EmbeddingClient {
|
|
|
17
33
|
resolveEmbeddingEndpoints(rawBaseUrl) {
|
|
18
34
|
const base = (rawBaseUrl || "").trim();
|
|
19
35
|
const normalizedBase = (base || "http://localhost:11434").replace(/\/+$/, "");
|
|
20
|
-
// If already a full embeddings path, use directly.
|
|
21
36
|
if (/(\/v1\/embeddings|\/api\/embeddings)\/?$/i.test(normalizedBase)) {
|
|
22
37
|
return [normalizedBase];
|
|
23
38
|
}
|
|
24
|
-
// Smart handling for base URL only:
|
|
25
|
-
// 1) Prefer OpenAI-compatible /v1/embeddings (for proxypal/openai-like services)
|
|
26
|
-
// 2) Fallback to Ollama /api/embeddings (for backward compatibility)
|
|
27
39
|
return [`${normalizedBase}/v1/embeddings`, `${normalizedBase}/api/embeddings`];
|
|
28
40
|
}
|
|
29
41
|
isOpenAIEmbeddingEndpoint(url) {
|
|
30
42
|
return /\/v1\/embeddings\/?$/i.test(url);
|
|
31
43
|
}
|
|
44
|
+
getModelMaxTokens() {
|
|
45
|
+
return this.modelMaxTokens[this.config.model] || 4096;
|
|
46
|
+
}
|
|
47
|
+
getSafeChunkTokens(maxTokens) {
|
|
48
|
+
return Math.max(256, Math.floor(maxTokens * 0.95));
|
|
49
|
+
}
|
|
50
|
+
// Approximation: ~4 chars/token for multilingual text (safe-enough fallback)
|
|
51
|
+
estimateTokens(text) {
|
|
52
|
+
return Math.max(1, Math.ceil(text.length / 4));
|
|
53
|
+
}
|
|
54
|
+
normalizeInput(input) {
|
|
55
|
+
if (Array.isArray(input)) {
|
|
56
|
+
return input
|
|
57
|
+
.map((v) => (typeof v === "string" ? v.trim() : ""))
|
|
58
|
+
.filter((v) => v.length > 0);
|
|
59
|
+
}
|
|
60
|
+
if (typeof input === "string") {
|
|
61
|
+
const trimmed = input.trim();
|
|
62
|
+
return trimmed ? [trimmed] : [];
|
|
63
|
+
}
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
chunkTextBySafeTokens(text, safeChunkTokens) {
|
|
67
|
+
const maxChars = Math.max(1, safeChunkTokens * 4);
|
|
68
|
+
if (text.length <= maxChars)
|
|
69
|
+
return [text];
|
|
70
|
+
const chunks = [];
|
|
71
|
+
let cursor = 0;
|
|
72
|
+
while (cursor < text.length) {
|
|
73
|
+
const remaining = text.length - cursor;
|
|
74
|
+
if (remaining <= maxChars) {
|
|
75
|
+
chunks.push(text.slice(cursor).trim());
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
let end = cursor + maxChars;
|
|
79
|
+
const window = text.slice(cursor, end);
|
|
80
|
+
const lastBreak = Math.max(window.lastIndexOf("\n"), window.lastIndexOf(" "));
|
|
81
|
+
if (lastBreak > Math.floor(maxChars * 0.5)) {
|
|
82
|
+
end = cursor + lastBreak;
|
|
83
|
+
}
|
|
84
|
+
const chunk = text.slice(cursor, end).trim();
|
|
85
|
+
if (chunk.length > 0)
|
|
86
|
+
chunks.push(chunk);
|
|
87
|
+
cursor = Math.max(end, cursor + 1);
|
|
88
|
+
}
|
|
89
|
+
return chunks.filter((c) => c.length > 0);
|
|
90
|
+
}
|
|
91
|
+
l2Normalize(vector) {
|
|
92
|
+
const norm = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));
|
|
93
|
+
if (!Number.isFinite(norm) || norm === 0)
|
|
94
|
+
return vector;
|
|
95
|
+
return vector.map((v) => v / norm);
|
|
96
|
+
}
|
|
97
|
+
weightedAverage(vectors, weights) {
|
|
98
|
+
if (vectors.length === 0)
|
|
99
|
+
return [];
|
|
100
|
+
const dim = vectors[0].length;
|
|
101
|
+
const out = new Array(dim).fill(0);
|
|
102
|
+
const weightSum = weights.reduce((a, b) => a + b, 0) || 1;
|
|
103
|
+
for (let i = 0; i < vectors.length; i++) {
|
|
104
|
+
const vec = vectors[i];
|
|
105
|
+
const w = weights[i] || 1;
|
|
106
|
+
for (let d = 0; d < dim; d++) {
|
|
107
|
+
out[d] += vec[d] * w;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
for (let d = 0; d < dim; d++) {
|
|
111
|
+
out[d] /= weightSum;
|
|
112
|
+
}
|
|
113
|
+
return this.l2Normalize(out);
|
|
114
|
+
}
|
|
32
115
|
/**
|
|
33
|
-
*
|
|
34
|
-
* Fallback to hash-based embedding if API unavailable
|
|
116
|
+
* Backward-compatible method
|
|
35
117
|
*/
|
|
36
118
|
async embed(text) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return await this.embedFromApi(text);
|
|
40
|
-
}
|
|
41
|
-
catch (error) {
|
|
42
|
-
// Fallback to deterministic hash-based embedding
|
|
43
|
-
return this.embedFromHash(text);
|
|
44
|
-
}
|
|
119
|
+
const result = await this.embedDetailed(text);
|
|
120
|
+
return result.vector;
|
|
45
121
|
}
|
|
46
122
|
/**
|
|
47
|
-
*
|
|
123
|
+
* New method with chunking + metadata
|
|
48
124
|
*/
|
|
49
|
-
async
|
|
125
|
+
async embedDetailed(text) {
|
|
126
|
+
const normalizedInput = this.normalizeInput(text);
|
|
127
|
+
if (normalizedInput.length === 0) {
|
|
128
|
+
this.logger.warn("[Embedding] Skip API call: empty input after trim/filter");
|
|
129
|
+
return {
|
|
130
|
+
vector: this.embedFromHash(""),
|
|
131
|
+
metadata: {
|
|
132
|
+
embedding_chunked: false,
|
|
133
|
+
embedding_chunks_count: 0,
|
|
134
|
+
embedding_chunking_strategy: "array_batch_weighted_avg",
|
|
135
|
+
embedding_model: this.config.model,
|
|
136
|
+
embedding_max_tokens: this.getModelMaxTokens(),
|
|
137
|
+
embedding_safe_chunk_tokens: this.getSafeChunkTokens(this.getModelMaxTokens()),
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
const mergedText = normalizedInput.join("\n\n");
|
|
142
|
+
const maxTokens = this.getModelMaxTokens();
|
|
143
|
+
// Retry by shrinking chunk size for 400 context-length failures
|
|
144
|
+
const safetyMultipliers = [0.95, 0.85, 0.75, 0.6];
|
|
145
|
+
for (const mul of safetyMultipliers) {
|
|
146
|
+
const safeChunkTokens = Math.max(256, Math.floor(maxTokens * mul));
|
|
147
|
+
const chunks = this.chunkTextBySafeTokens(mergedText, safeChunkTokens);
|
|
148
|
+
const chunkWeights = chunks.map((c) => this.estimateTokens(c));
|
|
149
|
+
try {
|
|
150
|
+
const vectors = await this.embedChunksFromApi(chunks);
|
|
151
|
+
const vector = vectors.length === 1
|
|
152
|
+
? this.l2Normalize(vectors[0])
|
|
153
|
+
: this.weightedAverage(vectors, chunkWeights);
|
|
154
|
+
return {
|
|
155
|
+
vector,
|
|
156
|
+
metadata: {
|
|
157
|
+
embedding_chunked: chunks.length > 1,
|
|
158
|
+
embedding_chunks_count: chunks.length,
|
|
159
|
+
embedding_chunking_strategy: "array_batch_weighted_avg",
|
|
160
|
+
embedding_model: this.config.model,
|
|
161
|
+
embedding_max_tokens: maxTokens,
|
|
162
|
+
embedding_safe_chunk_tokens: safeChunkTokens,
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
const isContextLength400 = error instanceof EmbeddingHttpError &&
|
|
168
|
+
error.status === 400 &&
|
|
169
|
+
/context length|maximum context|too many tokens|exceed/i.test(error.bodyPreview || "");
|
|
170
|
+
if (isContextLength400) {
|
|
171
|
+
this.logger.warn(`[Embedding] 400 context-length detected. Retry with smaller chunk size (safeChunkTokens=${safeChunkTokens})`);
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
// non context-length error -> fallback hash immediately
|
|
175
|
+
this.logger.warn(`[Embedding] API failed, fallback to hash embedding: ${error.message}`);
|
|
176
|
+
return {
|
|
177
|
+
vector: this.embedFromHash(mergedText),
|
|
178
|
+
metadata: {
|
|
179
|
+
embedding_chunked: chunks.length > 1,
|
|
180
|
+
embedding_chunks_count: chunks.length,
|
|
181
|
+
embedding_chunking_strategy: "array_batch_weighted_avg",
|
|
182
|
+
embedding_model: this.config.model,
|
|
183
|
+
embedding_max_tokens: maxTokens,
|
|
184
|
+
embedding_safe_chunk_tokens: safeChunkTokens,
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Exhausted shrink retries -> fallback hash
|
|
190
|
+
this.logger.warn("[Embedding] Exhausted context-length retries, fallback to hash embedding");
|
|
191
|
+
return {
|
|
192
|
+
vector: this.embedFromHash(mergedText),
|
|
193
|
+
metadata: {
|
|
194
|
+
embedding_chunked: true,
|
|
195
|
+
embedding_chunks_count: Math.max(1, this.chunkTextBySafeTokens(mergedText, this.getSafeChunkTokens(maxTokens)).length),
|
|
196
|
+
embedding_chunking_strategy: "array_batch_weighted_avg",
|
|
197
|
+
embedding_model: this.config.model,
|
|
198
|
+
embedding_max_tokens: maxTokens,
|
|
199
|
+
embedding_safe_chunk_tokens: this.getSafeChunkTokens(maxTokens),
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
async embedChunksFromApi(chunks) {
|
|
204
|
+
if (chunks.length === 0) {
|
|
205
|
+
throw new Error("No chunks to embed");
|
|
206
|
+
}
|
|
207
|
+
const endpoints = this.resolveEmbeddingEndpoints(this.config.embeddingApiUrl);
|
|
208
|
+
let lastError = null;
|
|
209
|
+
for (const url of endpoints) {
|
|
210
|
+
const useOpenAiFormat = this.isOpenAIEmbeddingEndpoint(url);
|
|
211
|
+
try {
|
|
212
|
+
if (process.env.EMBEDDING_DEBUG === "1") {
|
|
213
|
+
this.logger.debug?.(`[Embedding] API request schema: ${JSON.stringify({
|
|
214
|
+
endpoint: url,
|
|
215
|
+
model: this.config.model,
|
|
216
|
+
chunksCount: chunks.length,
|
|
217
|
+
firstChunkChars: chunks[0]?.length || 0,
|
|
218
|
+
firstChunkTokensEst: this.estimateTokens(chunks[0] || ""),
|
|
219
|
+
format: useOpenAiFormat ? "openai" : "ollama",
|
|
220
|
+
})}`);
|
|
221
|
+
}
|
|
222
|
+
if (!useOpenAiFormat && chunks.length > 1) {
|
|
223
|
+
// Ollama /api/embeddings: no array batch support in one call (do sequential fallback)
|
|
224
|
+
const vectors = [];
|
|
225
|
+
for (const c of chunks) {
|
|
226
|
+
vectors.push(await this.embedSingle(url, false, c));
|
|
227
|
+
}
|
|
228
|
+
return vectors;
|
|
229
|
+
}
|
|
230
|
+
const vectors = await this.embedBatch(url, useOpenAiFormat, chunks);
|
|
231
|
+
if (vectors.length !== chunks.length) {
|
|
232
|
+
throw new Error(`Embedding vector count mismatch: expected=${chunks.length}, got=${vectors.length}`);
|
|
233
|
+
}
|
|
234
|
+
return vectors;
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
lastError = error;
|
|
238
|
+
if (error instanceof EmbeddingHttpError &&
|
|
239
|
+
error.status === 404 &&
|
|
240
|
+
endpoints.length > 1 &&
|
|
241
|
+
url !== endpoints[endpoints.length - 1]) {
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (error instanceof EmbeddingHttpError &&
|
|
245
|
+
error.status === 429) {
|
|
246
|
+
// endpoint is rate-limited; try next endpoint if any
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
// for other errors we still may try next endpoint
|
|
250
|
+
if (url !== endpoints[endpoints.length - 1]) {
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
throw lastError || new Error("Embedding API error: no endpoint succeeded");
|
|
256
|
+
}
|
|
257
|
+
async embedBatch(url, useOpenAiFormat, chunks) {
|
|
50
258
|
const controller = new AbortController();
|
|
51
259
|
const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
|
|
52
260
|
try {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
for (
|
|
56
|
-
const useOpenAiFormat = this.isOpenAIEmbeddingEndpoint(url);
|
|
261
|
+
// 429 retry/backoff
|
|
262
|
+
const max429Retries = 4;
|
|
263
|
+
for (let attempt = 0; attempt <= max429Retries; attempt++) {
|
|
57
264
|
const response = await fetch(url, {
|
|
58
265
|
method: "POST",
|
|
59
|
-
headers: {
|
|
60
|
-
"Content-Type": "application/json",
|
|
61
|
-
},
|
|
266
|
+
headers: { "Content-Type": "application/json" },
|
|
62
267
|
body: JSON.stringify(useOpenAiFormat
|
|
63
|
-
? {
|
|
64
|
-
|
|
65
|
-
input: text,
|
|
66
|
-
}
|
|
67
|
-
: {
|
|
68
|
-
model: this.config.model,
|
|
69
|
-
prompt: text,
|
|
70
|
-
}),
|
|
268
|
+
? { model: this.config.model, input: chunks }
|
|
269
|
+
: { model: this.config.model, prompt: chunks[0] }),
|
|
71
270
|
signal: controller.signal,
|
|
72
271
|
});
|
|
272
|
+
if (response.status === 429 && attempt < max429Retries) {
|
|
273
|
+
const backoffMs = Math.min(8000, 500 * Math.pow(2, attempt));
|
|
274
|
+
this.logger.warn(`[Embedding] 429 rate limit. Retry in ${backoffMs}ms (attempt ${attempt + 1}/${max429Retries})`);
|
|
275
|
+
await new Promise((r) => setTimeout(r, backoffMs));
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
73
278
|
if (!response.ok) {
|
|
74
279
|
const errorText = await response.text().catch(() => "Unknown error");
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
lastError = new Error(`Embedding API error: ${response.status}`);
|
|
81
|
-
break;
|
|
280
|
+
const preview = errorText.substring(0, 300);
|
|
281
|
+
this.logger.error(`[Embedding] HTTP ${response.status} @ ${url}: ${preview}`);
|
|
282
|
+
throw new EmbeddingHttpError(response.status, preview);
|
|
82
283
|
}
|
|
83
284
|
const data = await response.json();
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
285
|
+
if (!useOpenAiFormat) {
|
|
286
|
+
if (data.embedding && Array.isArray(data.embedding)) {
|
|
287
|
+
return [data.embedding];
|
|
288
|
+
}
|
|
289
|
+
throw new Error("Invalid Ollama embedding response format");
|
|
88
290
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
291
|
+
if (Array.isArray(data.data)) {
|
|
292
|
+
const vectors = data.data
|
|
293
|
+
.map((d) => d?.embedding)
|
|
294
|
+
.filter((v) => Array.isArray(v));
|
|
295
|
+
if (vectors.length > 0)
|
|
296
|
+
return vectors;
|
|
93
297
|
}
|
|
94
|
-
|
|
95
|
-
lastError = new Error("Invalid embedding response format");
|
|
96
|
-
break;
|
|
298
|
+
throw new Error("Invalid OpenAI embedding response format");
|
|
97
299
|
}
|
|
98
|
-
|
|
99
|
-
throw lastError || new Error("Embedding API error: no endpoint succeeded");
|
|
300
|
+
throw new Error("Embedding API 429 retries exhausted");
|
|
100
301
|
}
|
|
101
302
|
catch (error) {
|
|
102
303
|
if (error.name === "AbortError") {
|
|
@@ -104,12 +305,21 @@ export class EmbeddingClient {
|
|
|
104
305
|
}
|
|
105
306
|
throw error;
|
|
106
307
|
}
|
|
308
|
+
finally {
|
|
309
|
+
clearTimeout(timeoutId);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
async embedSingle(url, useOpenAiFormat, chunk) {
|
|
313
|
+
const vectors = await this.embedBatch(url, useOpenAiFormat, [chunk]);
|
|
314
|
+
if (!vectors[0])
|
|
315
|
+
throw new Error("No embedding vector returned");
|
|
316
|
+
return vectors[0];
|
|
107
317
|
}
|
|
108
318
|
/**
|
|
109
319
|
* Fallback: Generate embedding from text hash (deterministic)
|
|
110
320
|
*/
|
|
111
321
|
embedFromHash(text) {
|
|
112
|
-
const hash = text.split(
|
|
322
|
+
const hash = text.split("").reduce((a, b) => {
|
|
113
323
|
a = ((a << 5) - a) + b.charCodeAt(0);
|
|
114
324
|
return a & a;
|
|
115
325
|
}, 0);
|
|
@@ -117,7 +327,7 @@ export class EmbeddingClient {
|
|
|
117
327
|
for (let i = 0; i < this.dimensions; i++) {
|
|
118
328
|
embedding.push(Math.sin(hash + i) * 0.1);
|
|
119
329
|
}
|
|
120
|
-
return embedding;
|
|
330
|
+
return this.l2Normalize(embedding);
|
|
121
331
|
}
|
|
122
332
|
/**
|
|
123
333
|
* Calculate cosine similarity
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/services/embedding.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/services/embedding.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,35 +15,36 @@ export declare class QdrantClient {
|
|
|
15
15
|
private config;
|
|
16
16
|
private logger;
|
|
17
17
|
constructor(config: QdrantConfig, logger?: any);
|
|
18
|
+
getCollectionName(): string;
|
|
18
19
|
private sleep;
|
|
19
20
|
/**
|
|
20
21
|
* Make request with retry
|
|
21
22
|
*/
|
|
22
23
|
private request;
|
|
23
24
|
private isRetryableError;
|
|
24
|
-
/**
|
|
25
|
-
* Check if collection exists
|
|
26
|
-
*/
|
|
27
25
|
collectionExists(): Promise<boolean>;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
*/
|
|
26
|
+
getCollectionInfo(): Promise<any>;
|
|
27
|
+
countPoints(exact?: boolean): Promise<number>;
|
|
31
28
|
createCollection(): Promise<void>;
|
|
32
|
-
/**
|
|
33
|
-
* Create payload index for efficient filtering
|
|
34
|
-
*/
|
|
35
29
|
createPayloadIndex(fieldName: string, fieldType: "keyword" | "integer" | "float" | "bool"): Promise<void>;
|
|
36
|
-
/**
|
|
37
|
-
* Upsert points
|
|
38
|
-
*/
|
|
39
30
|
upsert(points: Point[]): Promise<void>;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
31
|
+
updateVectors(points: Array<{
|
|
32
|
+
id: any;
|
|
33
|
+
vector: number[];
|
|
34
|
+
}>): Promise<void>;
|
|
35
|
+
setPayload(payloadById: Array<{
|
|
36
|
+
id: string;
|
|
37
|
+
payload: Record<string, any>;
|
|
38
|
+
}>): Promise<void>;
|
|
39
|
+
scroll(limit: number, offset?: any, withVector?: boolean): Promise<{
|
|
40
|
+
points: Array<{
|
|
41
|
+
id: string;
|
|
42
|
+
payload: Record<string, any>;
|
|
43
|
+
vector?: number[];
|
|
44
|
+
}>;
|
|
45
|
+
nextOffset?: any;
|
|
46
|
+
}>;
|
|
43
47
|
search(vector: number[], limit?: number, filter?: Record<string, any>): Promise<ScoredPoint[]>;
|
|
44
|
-
/**
|
|
45
|
-
* Delete points by filter
|
|
46
|
-
*/
|
|
47
48
|
deleteByFilter(filter: Record<string, any>): Promise<void>;
|
|
48
49
|
}
|
|
49
50
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qdrant.d.ts","sourceRoot":"","sources":["../../src/services/qdrant.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"qdrant.d.ts","sourceRoot":"","sources":["../../src/services/qdrant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,WAAW,EAAE,MAAM,aAAa,CAAC;AAEjE,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAWD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,GAAG;IAa9C,iBAAiB,IAAI,MAAM;IAI3B,OAAO,CAAC,KAAK;IAIb;;OAEG;YACW,OAAO;IAwCrB,OAAO,CAAC,gBAAgB;IAOlB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAYpC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC;IAIjC,WAAW,CAAC,KAAK,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAS1C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BjC,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,GAAG,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1E,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB3F,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;QAAC,UAAU,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAwCtK,MAAM,CACV,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,GAAE,MAAU,EACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,OAAO,CAAC,WAAW,EAAE,CAAC;IAwBnB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAOjE"}
|
package/dist/services/qdrant.js
CHANGED
|
@@ -16,6 +16,9 @@ export class QdrantClient {
|
|
|
16
16
|
};
|
|
17
17
|
this.logger = logger || console;
|
|
18
18
|
}
|
|
19
|
+
getCollectionName() {
|
|
20
|
+
return this.config.collection;
|
|
21
|
+
}
|
|
19
22
|
sleep(ms) {
|
|
20
23
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
21
24
|
}
|
|
@@ -36,7 +39,6 @@ export class QdrantClient {
|
|
|
36
39
|
const text = await response.text().catch(() => "Unknown error");
|
|
37
40
|
throw new Error(`HTTP ${response.status}: ${text}`);
|
|
38
41
|
}
|
|
39
|
-
// Some endpoints return empty body
|
|
40
42
|
const contentType = response.headers.get("content-type");
|
|
41
43
|
if (contentType?.includes("application/json")) {
|
|
42
44
|
return await response.json();
|
|
@@ -59,9 +61,6 @@ export class QdrantClient {
|
|
|
59
61
|
error.message.includes("ECONNREFUSED") ||
|
|
60
62
|
error.name === "AbortError";
|
|
61
63
|
}
|
|
62
|
-
/**
|
|
63
|
-
* Check if collection exists
|
|
64
|
-
*/
|
|
65
64
|
async collectionExists() {
|
|
66
65
|
try {
|
|
67
66
|
await this.request(`/collections/${this.config.collection}`, { method: "GET" });
|
|
@@ -74,9 +73,17 @@ export class QdrantClient {
|
|
|
74
73
|
throw error;
|
|
75
74
|
}
|
|
76
75
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
async getCollectionInfo() {
|
|
77
|
+
return this.request(`/collections/${this.config.collection}`, { method: "GET" });
|
|
78
|
+
}
|
|
79
|
+
async countPoints(exact = true) {
|
|
80
|
+
const res = await this.request(`/collections/${this.config.collection}/points/count`, {
|
|
81
|
+
method: "POST",
|
|
82
|
+
headers: { "Content-Type": "application/json" },
|
|
83
|
+
body: JSON.stringify({ exact }),
|
|
84
|
+
});
|
|
85
|
+
return Number(res?.result?.count || 0);
|
|
86
|
+
}
|
|
80
87
|
async createCollection() {
|
|
81
88
|
const exists = await this.collectionExists();
|
|
82
89
|
if (exists) {
|
|
@@ -98,15 +105,11 @@ export class QdrantClient {
|
|
|
98
105
|
}),
|
|
99
106
|
});
|
|
100
107
|
this.logger.info(`[Qdrant] Collection created successfully`);
|
|
101
|
-
// Create payload indexes for memory isolation
|
|
102
108
|
await this.createPayloadIndex("namespace", "keyword");
|
|
103
109
|
await this.createPayloadIndex("source_agent", "keyword");
|
|
104
110
|
await this.createPayloadIndex("source_type", "keyword");
|
|
105
111
|
await this.createPayloadIndex("userId", "keyword");
|
|
106
112
|
}
|
|
107
|
-
/**
|
|
108
|
-
* Create payload index for efficient filtering
|
|
109
|
-
*/
|
|
110
113
|
async createPayloadIndex(fieldName, fieldType) {
|
|
111
114
|
try {
|
|
112
115
|
await this.request(`/collections/${this.config.collection}/index`, {
|
|
@@ -120,13 +123,9 @@ export class QdrantClient {
|
|
|
120
123
|
this.logger.info(`[Qdrant] Created payload index: ${fieldName}`);
|
|
121
124
|
}
|
|
122
125
|
catch (error) {
|
|
123
|
-
// Index may already exist, log but don't fail
|
|
124
126
|
this.logger.warn(`[Qdrant] Failed to create index ${fieldName}: ${error.message}`);
|
|
125
127
|
}
|
|
126
128
|
}
|
|
127
|
-
/**
|
|
128
|
-
* Upsert points
|
|
129
|
-
*/
|
|
130
129
|
async upsert(points) {
|
|
131
130
|
await this.request(`/collections/${this.config.collection}/points`, {
|
|
132
131
|
method: "PUT",
|
|
@@ -134,9 +133,74 @@ export class QdrantClient {
|
|
|
134
133
|
body: JSON.stringify({ points }),
|
|
135
134
|
});
|
|
136
135
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
136
|
+
async updateVectors(points) {
|
|
137
|
+
if (points.length === 0)
|
|
138
|
+
return;
|
|
139
|
+
try {
|
|
140
|
+
// Preferred endpoint
|
|
141
|
+
await this.request(`/collections/${this.config.collection}/points/vectors`, {
|
|
142
|
+
method: "PUT",
|
|
143
|
+
headers: { "Content-Type": "application/json" },
|
|
144
|
+
body: JSON.stringify({ points }),
|
|
145
|
+
});
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
this.logger.warn(`[Qdrant] updateVectors endpoint failed, fallback to upsert /points: ${error.message}`);
|
|
150
|
+
}
|
|
151
|
+
// Fallback (payload must be preserved by caller using upsert payload)
|
|
152
|
+
throw new Error("updateVectors endpoint unsupported");
|
|
153
|
+
}
|
|
154
|
+
async setPayload(payloadById) {
|
|
155
|
+
if (payloadById.length === 0)
|
|
156
|
+
return;
|
|
157
|
+
// set_payload can set same payload for selected points; here we do per-point via upsert fallback pattern in caller.
|
|
158
|
+
// Keep method for future expansion.
|
|
159
|
+
for (const row of payloadById) {
|
|
160
|
+
await this.request(`/collections/${this.config.collection}/points/payload`, {
|
|
161
|
+
method: "POST",
|
|
162
|
+
headers: { "Content-Type": "application/json" },
|
|
163
|
+
body: JSON.stringify({
|
|
164
|
+
payload: row.payload,
|
|
165
|
+
points: [row.id],
|
|
166
|
+
}),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async scroll(limit, offset, withVector = false) {
|
|
171
|
+
const body = {
|
|
172
|
+
limit,
|
|
173
|
+
with_payload: true,
|
|
174
|
+
with_vector: withVector,
|
|
175
|
+
};
|
|
176
|
+
if (offset !== undefined && offset !== null) {
|
|
177
|
+
body.offset = offset;
|
|
178
|
+
}
|
|
179
|
+
const response = await this.request(`/collections/${this.config.collection}/points/scroll`, {
|
|
180
|
+
method: "POST",
|
|
181
|
+
headers: { "Content-Type": "application/json" },
|
|
182
|
+
body: JSON.stringify(body),
|
|
183
|
+
});
|
|
184
|
+
const points = (response?.result?.points || []).map((p) => {
|
|
185
|
+
let vector;
|
|
186
|
+
if (Array.isArray(p.vector))
|
|
187
|
+
vector = p.vector;
|
|
188
|
+
else if (p.vector && typeof p.vector === "object") {
|
|
189
|
+
const values = Object.values(p.vector);
|
|
190
|
+
if (Array.isArray(values[0]))
|
|
191
|
+
vector = values[0];
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
id: p.id,
|
|
195
|
+
payload: p.payload || {},
|
|
196
|
+
vector,
|
|
197
|
+
};
|
|
198
|
+
});
|
|
199
|
+
return {
|
|
200
|
+
points,
|
|
201
|
+
nextOffset: response?.result?.next_page_offset,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
140
204
|
async search(vector, limit = 5, filter) {
|
|
141
205
|
const body = {
|
|
142
206
|
vector,
|
|
@@ -154,9 +218,6 @@ export class QdrantClient {
|
|
|
154
218
|
});
|
|
155
219
|
return response.result || [];
|
|
156
220
|
}
|
|
157
|
-
/**
|
|
158
|
-
* Delete points by filter
|
|
159
|
-
*/
|
|
160
221
|
async deleteByFilter(filter) {
|
|
161
222
|
await this.request(`/collections/${this.config.collection}/points/delete`, {
|
|
162
223
|
method: "POST",
|