@mrc2204/agent-smart-memo 4.0.8 → 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,18 +33,24 @@ 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
+ }
32
54
  normalizeInput(input) {
33
55
  if (Array.isArray(input)) {
34
56
  return input
@@ -41,89 +63,241 @@ export class EmbeddingClient {
41
63
  }
42
64
  return [];
43
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
+ }
44
115
  /**
45
- * Get embedding vector for text
46
- * Fallback to hash-based embedding if API unavailable
116
+ * Backward-compatible method
47
117
  */
48
118
  async embed(text) {
119
+ const result = await this.embedDetailed(text);
120
+ return result.vector;
121
+ }
122
+ /**
123
+ * New method with chunking + metadata
124
+ */
125
+ async embedDetailed(text) {
49
126
  const normalizedInput = this.normalizeInput(text);
50
- // Validate/filter empty input BEFORE calling embedding API
51
127
  if (normalizedInput.length === 0) {
52
128
  this.logger.warn("[Embedding] Skip API call: empty input after trim/filter");
53
- return this.embedFromHash("");
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
+ };
54
140
  }
55
- // Try API first
56
- try {
57
- return await this.embedFromApi(normalizedInput);
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
+ }
58
188
  }
59
- catch (error) {
60
- // Fallback to deterministic hash-based embedding
61
- return this.embedFromHash(normalizedInput[0]);
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
+ }
62
254
  }
255
+ throw lastError || new Error("Embedding API error: no endpoint succeeded");
63
256
  }
64
- /**
65
- * Get embedding from API
66
- */
67
- async embedFromApi(input) {
68
- this.logger.debug?.(`[Embedding] Calling API with inputCount=${input.length} firstItemLength=${input[0]?.length || 0} preview=${JSON.stringify((input[0] || "").slice(0, 80))}`);
257
+ async embedBatch(url, useOpenAiFormat, chunks) {
69
258
  const controller = new AbortController();
70
259
  const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
71
260
  try {
72
- const endpoints = this.resolveEmbeddingEndpoints(this.config.embeddingApiUrl);
73
- let lastError = null;
74
- for (const url of endpoints) {
75
- const useOpenAiFormat = this.isOpenAIEmbeddingEndpoint(url);
261
+ // 429 retry/backoff
262
+ const max429Retries = 4;
263
+ for (let attempt = 0; attempt <= max429Retries; attempt++) {
76
264
  const response = await fetch(url, {
77
265
  method: "POST",
78
- headers: {
79
- "Content-Type": "application/json",
80
- },
266
+ headers: { "Content-Type": "application/json" },
81
267
  body: JSON.stringify(useOpenAiFormat
82
- ? {
83
- model: this.config.model,
84
- input,
85
- }
86
- : {
87
- model: this.config.model,
88
- prompt: input[0],
89
- }),
268
+ ? { model: this.config.model, input: chunks }
269
+ : { model: this.config.model, prompt: chunks[0] }),
90
270
  signal: controller.signal,
91
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
+ }
92
278
  if (!response.ok) {
93
279
  const errorText = await response.text().catch(() => "Unknown error");
94
- this.logger.error(`[Embedding] HTTP ${response.status} @ ${url}: ${errorText.substring(0, 200)}`);
95
- if (response.status === 400) {
96
- this.logger.error(`[Embedding] 400 schema debug @ ${url}: ${JSON.stringify({
97
- model: this.config.model,
98
- inputType: Array.isArray(input) ? "array" : typeof input,
99
- inputLength: Array.isArray(input) ? input.length : 0,
100
- firstItemLength: input[0]?.length || 0,
101
- })}`);
102
- }
103
- // If this endpoint not found and we still have fallback endpoint, continue.
104
- if (response.status === 404 && endpoints.length > 1 && url !== endpoints[endpoints.length - 1]) {
105
- continue;
106
- }
107
- lastError = new Error(`Embedding API error: ${response.status}`);
108
- 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);
109
283
  }
110
284
  const data = await response.json();
111
- // Ollama API format: { embedding: [...] }
112
- if (data.embedding && Array.isArray(data.embedding)) {
113
- clearTimeout(timeoutId);
114
- 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");
115
290
  }
116
- // OpenAI-compatible format: { data: [{ embedding: [...] }] }
117
- if (Array.isArray(data.data) && data.data[0]?.embedding && Array.isArray(data.data[0].embedding)) {
118
- clearTimeout(timeoutId);
119
- 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;
120
297
  }
121
- this.logger.error(`[Embedding] Unexpected response format: ${JSON.stringify(data).substring(0, 200)}`);
122
- lastError = new Error("Invalid embedding response format");
123
- break;
298
+ throw new Error("Invalid OpenAI embedding response format");
124
299
  }
125
- clearTimeout(timeoutId);
126
- throw lastError || new Error("Embedding API error: no endpoint succeeded");
300
+ throw new Error("Embedding API 429 retries exhausted");
127
301
  }
128
302
  catch (error) {
129
303
  if (error.name === "AbortError") {
@@ -131,12 +305,21 @@ export class EmbeddingClient {
131
305
  }
132
306
  throw error;
133
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];
134
317
  }
135
318
  /**
136
319
  * Fallback: Generate embedding from text hash (deterministic)
137
320
  */
138
321
  embedFromHash(text) {
139
- const hash = text.split('').reduce((a, b) => {
322
+ const hash = text.split("").reduce((a, b) => {
140
323
  a = ((a << 5) - a) + b.charCodeAt(0);
141
324
  return a & a;
142
325
  }, 0);
@@ -144,7 +327,7 @@ export class EmbeddingClient {
144
327
  for (let i = 0; i < this.dimensions; i++) {
145
328
  embedding.push(Math.sin(hash + i) * 0.1);
146
329
  }
147
- return embedding;
330
+ return this.l2Normalize(embedding);
148
331
  }
149
332
  /**
150
333
  * Calculate cosine similarity
@@ -1 +1 @@
1
- {"version":3,"file":"embedding.js","sourceRoot":"","sources":["../../src/services/embedding.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,MAAM,CAAwE;IAC9E,MAAM,CAAM;IACZ,UAAU,CAAS;IAE3B,YAAY,MAA2F,EAAE,MAAY;QACnH,IAAI,CAAC,MAAM,GAAG;YACZ,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,wBAAwB;YACnE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;YAChC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,sBAAsB;SAC9C,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC;IAC9C,CAAC;IAEO,yBAAyB,CAAC,UAAkB;QAClD,MAAM,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,CAAC,IAAI,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAE9E,mDAAmD;QACnD,IAAI,2CAA2C,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACrE,OAAO,CAAC,cAAc,CAAC,CAAC;QAC1B,CAAC;QAED,oCAAoC;QACpC,iFAAiF;QACjF,qEAAqE;QACrE,OAAO,CAAC,GAAG,cAAc,gBAAgB,EAAE,GAAG,cAAc,iBAAiB,CAAC,CAAC;IACjF,CAAC;IAEO,yBAAyB,CAAC,GAAW;QAC3C,OAAO,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAEO,cAAc,CAAC,KAAwB;QAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK;iBACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;iBACnD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,IAAuB;QACjC,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAElD,2DAA2D;QAC3D,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;YAC7E,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iDAAiD;YACjD,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,KAAe;QACxC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,2CAA2C,KAAK,CAAC,MAAM,oBAAoB,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAEjL,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE5E,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAC9E,IAAI,SAAS,GAAiB,IAAI,CAAC;YAEnC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;gBAE5D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;oBAChC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;qBACnC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,eAAe;wBACb,CAAC,CAAC;4BACE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;4BACxB,KAAK;yBACN;wBACH,CAAC,CAAC;4BACE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;4BACxB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;yBACjB,CACN;oBACD,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;oBACrE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,MAAM,GAAG,KAAK,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;oBAElG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;wBAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,kCAAkC,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC;4BACvD,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;4BACxB,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,KAAK;4BACxD,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;4BACpD,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC;yBACvC,CAAC,EAAE,CACL,CAAC;oBACJ,CAAC;oBAED,4EAA4E;oBAC5E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,KAAK,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;wBAC/F,SAAS;oBACX,CAAC;oBAED,SAAS,GAAG,IAAI,KAAK,CAAC,wBAAwB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;oBACjE,MAAM;gBACR,CAAC;gBAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAEnC,0CAA0C;gBAC1C,IAAI,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBACpD,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,OAAO,IAAI,CAAC,SAAS,CAAC;gBACxB,CAAC;gBAED,6DAA6D;gBAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;oBACjG,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAChC,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvG,SAAS,GAAG,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBAC3D,MAAM;YACR,CAAC;YAED,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAE7E,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACjD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,IAAY;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC1C,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,EAAE,CAAC,CAAC,CAAC;QAEN,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,CAAW,EAAE,CAAW;QACvC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;CACF"}
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",