@retrivora-ai/rag-engine 1.1.0 → 1.1.2

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.
@@ -13,6 +13,7 @@ export class QdrantProvider extends BaseVectorProvider {
13
13
  private contentField: string;
14
14
  private metadataField: string;
15
15
  private isFlatPayload: boolean;
16
+ private schemaDiscovered = false;
16
17
 
17
18
  constructor(config: VectorDBConfig) {
18
19
  super(config);
@@ -26,6 +27,7 @@ export class QdrantProvider extends BaseVectorProvider {
26
27
 
27
28
  this.http = axios.create({
28
29
  baseURL: baseUrl,
30
+ timeout: 15000, // 15s timeout for vector DB operations
29
31
  headers: {
30
32
  'Content-Type': 'application/json',
31
33
  ...(opts.apiKey ? { 'api-key': opts.apiKey as string } : {}),
@@ -34,6 +36,8 @@ export class QdrantProvider extends BaseVectorProvider {
34
36
  }
35
37
 
36
38
  async initialize(): Promise<void> {
39
+ if (this.schemaDiscovered) return;
40
+
37
41
  await this.ping();
38
42
  await this.ensureCollection();
39
43
 
@@ -49,13 +53,18 @@ export class QdrantProvider extends BaseVectorProvider {
49
53
 
50
54
  if (allFields.length > 0) {
51
55
  console.log(`[QdrantProvider] 🛠 Ensuring indexes for ${allFields.length} discovered fields...`);
52
- for (const fieldInfo of allFields) {
53
- const [fieldName, schemaType] = fieldInfo.split(':');
54
- await this.ensureIndex(fieldName, (schemaType as any) || 'keyword');
55
- }
56
+ // Parallelize index creation for much faster startup
57
+ await Promise.all(
58
+ allFields.map(async (fieldInfo) => {
59
+ const [fieldName, schemaType] = fieldInfo.split(':');
60
+ return this.ensureIndex(fieldName, (schemaType as string) || 'keyword');
61
+ })
62
+ );
56
63
  } else {
57
64
  console.log(`[QdrantProvider] ℹ️ No fields discovered for indexing.`);
58
65
  }
66
+
67
+ this.schemaDiscovered = true;
59
68
  }
60
69
 
61
70
  /**
@@ -155,7 +164,7 @@ export class QdrantProvider extends BaseVectorProvider {
155
164
  async batchUpsert(docs: UpsertDocument[], namespace?: string): Promise<void> {
156
165
  const payload = {
157
166
  points: docs.map(doc => {
158
- const pointPayload: Record<string, any> = {
167
+ const pointPayload: Record<string, unknown> = {
159
168
  [this.contentField]: doc.content,
160
169
  ...(namespace ? { namespace } : {}),
161
170
  };
@@ -177,7 +186,7 @@ export class QdrantProvider extends BaseVectorProvider {
177
186
  }
178
187
 
179
188
  async query(vector: number[], topK: number, namespace?: string, _filter?: Record<string, unknown>): Promise<VectorMatch[]> {
180
- const must: any[] = [];
189
+ const must: Record<string, unknown>[] = [];
181
190
 
182
191
  if (namespace) {
183
192
  must.push({ key: 'namespace', match: { value: namespace } });
@@ -210,13 +219,13 @@ export class QdrantProvider extends BaseVectorProvider {
210
219
 
211
220
  const { data } = await this.http.post(`/collections/${this.indexName}/points/search`, payload);
212
221
 
213
- const results = (data.result || []).map((res: Record<string, any>) => {
214
- const p = res.payload || {};
222
+ const results = (data.result || []).map((res: Record<string, unknown>) => {
223
+ const p = (res.payload as Record<string, unknown>) || {};
215
224
  let content = p[this.contentField] || '';
216
225
 
217
226
  if (!content) {
218
227
  const stringFields = Object.entries(p)
219
- .filter(([_, v]) => typeof v === 'string')
228
+ .filter(([, v]) => typeof v === 'string')
220
229
  .map(([k, v]) => ({ key: k, val: v as string }));
221
230
 
222
231
  if (stringFields.length > 0) {
@@ -227,13 +236,13 @@ export class QdrantProvider extends BaseVectorProvider {
227
236
  }
228
237
  }
229
238
 
230
- let metadata: Record<string, any> = {};
239
+ let metadata: Record<string, unknown> = {};
231
240
  if (this.isFlatPayload) {
232
241
  metadata = { ...p };
233
242
  delete metadata[this.contentField];
234
243
  delete metadata['namespace'];
235
244
  } else {
236
- metadata = p[this.metadataField] || p;
245
+ metadata = (p[this.metadataField] as Record<string, unknown>) || p;
237
246
  }
238
247
 
239
248
  return {
@@ -247,7 +256,7 @@ export class QdrantProvider extends BaseVectorProvider {
247
256
  return results;
248
257
  }
249
258
 
250
- async delete(id: string | number, _namespace?: string): Promise<void> {
259
+ async delete(id: string | number): Promise<void> {
251
260
  await this.http.post(`/collections/${this.indexName}/points/delete`, {
252
261
  points: [this.normalizeId(id)],
253
262
  });