@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.
@@ -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 - Ollama compatible
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
- * Get embedding vector for text
34
- * Fallback to hash-based embedding if API unavailable
116
+ * Backward-compatible method
35
117
  */
36
118
  async embed(text) {
37
- // Try API first
38
- try {
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
- * Get embedding from API
123
+ * New method with chunking + metadata
48
124
  */
49
- async embedFromApi(text) {
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
- const endpoints = this.resolveEmbeddingEndpoints(this.config.embeddingApiUrl);
54
- let lastError = null;
55
- for (const url of endpoints) {
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
- model: this.config.model,
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
- this.logger.error(`[Embedding] HTTP ${response.status} @ ${url}: ${errorText.substring(0, 200)}`);
76
- // If this endpoint not found and we still have fallback endpoint, continue.
77
- if (response.status === 404 && endpoints.length > 1 && url !== endpoints[endpoints.length - 1]) {
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
- // Ollama API format: { embedding: [...] }
85
- if (data.embedding && Array.isArray(data.embedding)) {
86
- clearTimeout(timeoutId);
87
- return data.embedding;
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
- // OpenAI-compatible format: { data: [{ embedding: [...] }] }
90
- if (Array.isArray(data.data) && data.data[0]?.embedding && Array.isArray(data.data[0].embedding)) {
91
- clearTimeout(timeoutId);
92
- return data.data[0].embedding;
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
- this.logger.error(`[Embedding] Unexpected response format: ${JSON.stringify(data).substring(0, 200)}`);
95
- lastError = new Error("Invalid embedding response format");
96
- break;
298
+ throw new Error("Invalid OpenAI embedding response format");
97
299
  }
98
- clearTimeout(timeoutId);
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('').reduce((a, b) => {
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
- * Create collection if not exists
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
- * Search similar vectors
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,EAAgB,KAAK,EAAkB,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/E,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;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,GAAG;IAa9C,OAAO,CAAC,KAAK;IAIb;;OAEG;YACW,OAAO;IAyCrB,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IAY1C;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgCvC;;OAEG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/G;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C;;OAEG;IACG,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;IAwBzB;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAOjE"}
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"}
@@ -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
- * Create collection if not exists
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
- * Search similar vectors
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",