@retrivora-ai/rag-engine 1.0.8 → 1.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,6 +1,6 @@
1
1
  import {
2
2
  QdrantProvider
3
- } from "./chunk-3DSHW676.mjs";
3
+ } from "./chunk-NT5VP7MT.mjs";
4
4
  import "./chunk-IMP6FUCY.mjs";
5
5
  import "./chunk-X4TOT24V.mjs";
6
6
  export {
@@ -1106,7 +1106,7 @@ var ProviderRegistry = class {
1106
1106
  return MilvusProvider;
1107
1107
  }
1108
1108
  case "qdrant": {
1109
- const { QdrantProvider } = await import("./QdrantProvider-YNUNEOZH.mjs");
1109
+ const { QdrantProvider } = await import("./QdrantProvider-NGFXVDCF.mjs");
1110
1110
  return QdrantProvider;
1111
1111
  }
1112
1112
  case "chromadb": {
@@ -93,8 +93,15 @@ var QdrantProvider = class extends BaseVectorProvider {
93
93
  };
94
94
  await this.http.put(`/collections/${this.indexName}/points`, payload);
95
95
  }
96
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
97
96
  async query(vector, topK, namespace, _filter) {
97
+ const must = [];
98
+ if (namespace) {
99
+ must.push({ key: "namespace", match: { value: namespace } });
100
+ }
101
+ const sanitizedFilter = this.sanitizeFilter(_filter);
102
+ for (const [key, value] of Object.entries(sanitizedFilter)) {
103
+ must.push({ key: `metadata.${key}`, match: { value } });
104
+ }
98
105
  const payload = {
99
106
  vector,
100
107
  limit: topK,
@@ -103,12 +110,14 @@ var QdrantProvider = class extends BaseVectorProvider {
103
110
  hnsw_ef: this.config.options.efSearch || Math.max(topK * 20, 128),
104
111
  exact: false
105
112
  },
106
- filter: namespace ? {
107
- must: [{ key: "namespace", match: { value: namespace } }]
108
- } : void 0
113
+ filter: must.length > 0 ? { must } : void 0
109
114
  };
115
+ console.log(`[QdrantProvider] \u{1F50D} Searching "${this.indexName}" | Namespace: ${namespace || "default"} | TopK: ${topK}`);
116
+ if (must.length > (namespace ? 1 : 0)) {
117
+ console.log(`[QdrantProvider] \u{1F6E0} Filters:`, JSON.stringify(must.filter((m) => m.key !== "namespace")));
118
+ }
110
119
  const { data } = await this.http.post(`/collections/${this.indexName}/points/search`, payload);
111
- return (data.result || []).map((res) => {
120
+ const results = (data.result || []).map((res) => {
112
121
  var _a, _b;
113
122
  return {
114
123
  id: res["id"],
@@ -117,6 +126,12 @@ var QdrantProvider = class extends BaseVectorProvider {
117
126
  metadata: ((_b = res["payload"]) == null ? void 0 : _b.metadata) || {}
118
127
  };
119
128
  });
129
+ if (results.length === 0) {
130
+ console.warn(`[QdrantProvider] \u26A0\uFE0F Retrieval returned 0 results. Check if data exists in namespace "${namespace}"`);
131
+ } else {
132
+ console.log(`[QdrantProvider] \u2705 Found ${results.length} results (best score: ${results[0].score.toFixed(4)})`);
133
+ }
134
+ return results;
120
135
  }
121
136
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
122
137
  async delete(id, _namespace) {
@@ -924,8 +924,15 @@ var init_QdrantProvider = __esm({
924
924
  };
925
925
  await this.http.put(`/collections/${this.indexName}/points`, payload);
926
926
  }
927
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
928
927
  async query(vector, topK, namespace, _filter) {
928
+ const must = [];
929
+ if (namespace) {
930
+ must.push({ key: "namespace", match: { value: namespace } });
931
+ }
932
+ const sanitizedFilter = this.sanitizeFilter(_filter);
933
+ for (const [key, value] of Object.entries(sanitizedFilter)) {
934
+ must.push({ key: `metadata.${key}`, match: { value } });
935
+ }
929
936
  const payload = {
930
937
  vector,
931
938
  limit: topK,
@@ -934,12 +941,14 @@ var init_QdrantProvider = __esm({
934
941
  hnsw_ef: this.config.options.efSearch || Math.max(topK * 20, 128),
935
942
  exact: false
936
943
  },
937
- filter: namespace ? {
938
- must: [{ key: "namespace", match: { value: namespace } }]
939
- } : void 0
944
+ filter: must.length > 0 ? { must } : void 0
940
945
  };
946
+ console.log(`[QdrantProvider] \u{1F50D} Searching "${this.indexName}" | Namespace: ${namespace || "default"} | TopK: ${topK}`);
947
+ if (must.length > (namespace ? 1 : 0)) {
948
+ console.log(`[QdrantProvider] \u{1F6E0} Filters:`, JSON.stringify(must.filter((m) => m.key !== "namespace")));
949
+ }
941
950
  const { data } = await this.http.post(`/collections/${this.indexName}/points/search`, payload);
942
- return (data.result || []).map((res) => {
951
+ const results = (data.result || []).map((res) => {
943
952
  var _a, _b;
944
953
  return {
945
954
  id: res["id"],
@@ -948,6 +957,12 @@ var init_QdrantProvider = __esm({
948
957
  metadata: ((_b = res["payload"]) == null ? void 0 : _b.metadata) || {}
949
958
  };
950
959
  });
960
+ if (results.length === 0) {
961
+ console.warn(`[QdrantProvider] \u26A0\uFE0F Retrieval returned 0 results. Check if data exists in namespace "${namespace}"`);
962
+ } else {
963
+ console.log(`[QdrantProvider] \u2705 Found ${results.length} results (best score: ${results[0].score.toFixed(4)})`);
964
+ }
965
+ return results;
951
966
  }
952
967
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
953
968
  async delete(id, _namespace) {
@@ -8,7 +8,7 @@ import {
8
8
  sseFrame,
9
9
  sseMetaFrame,
10
10
  sseTextFrame
11
- } from "../chunk-3GKA3PJF.mjs";
11
+ } from "../chunk-7S2SRQGL.mjs";
12
12
  import "../chunk-YLTMFW4M.mjs";
13
13
  import "../chunk-X4TOT24V.mjs";
14
14
  export {
package/dist/server.js CHANGED
@@ -936,8 +936,15 @@ var init_QdrantProvider = __esm({
936
936
  };
937
937
  await this.http.put(`/collections/${this.indexName}/points`, payload);
938
938
  }
939
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
940
939
  async query(vector, topK, namespace, _filter) {
940
+ const must = [];
941
+ if (namespace) {
942
+ must.push({ key: "namespace", match: { value: namespace } });
943
+ }
944
+ const sanitizedFilter = this.sanitizeFilter(_filter);
945
+ for (const [key, value] of Object.entries(sanitizedFilter)) {
946
+ must.push({ key: `metadata.${key}`, match: { value } });
947
+ }
941
948
  const payload = {
942
949
  vector,
943
950
  limit: topK,
@@ -946,12 +953,14 @@ var init_QdrantProvider = __esm({
946
953
  hnsw_ef: this.config.options.efSearch || Math.max(topK * 20, 128),
947
954
  exact: false
948
955
  },
949
- filter: namespace ? {
950
- must: [{ key: "namespace", match: { value: namespace } }]
951
- } : void 0
956
+ filter: must.length > 0 ? { must } : void 0
952
957
  };
958
+ console.log(`[QdrantProvider] \u{1F50D} Searching "${this.indexName}" | Namespace: ${namespace || "default"} | TopK: ${topK}`);
959
+ if (must.length > (namespace ? 1 : 0)) {
960
+ console.log(`[QdrantProvider] \u{1F6E0} Filters:`, JSON.stringify(must.filter((m) => m.key !== "namespace")));
961
+ }
953
962
  const { data } = await this.http.post(`/collections/${this.indexName}/points/search`, payload);
954
- return (data.result || []).map((res) => {
963
+ const results = (data.result || []).map((res) => {
955
964
  var _a, _b;
956
965
  return {
957
966
  id: res["id"],
@@ -960,6 +969,12 @@ var init_QdrantProvider = __esm({
960
969
  metadata: ((_b = res["payload"]) == null ? void 0 : _b.metadata) || {}
961
970
  };
962
971
  });
972
+ if (results.length === 0) {
973
+ console.warn(`[QdrantProvider] \u26A0\uFE0F Retrieval returned 0 results. Check if data exists in namespace "${namespace}"`);
974
+ } else {
975
+ console.log(`[QdrantProvider] \u2705 Found ${results.length} results (best score: ${results[0].score.toFixed(4)})`);
976
+ }
977
+ return results;
963
978
  }
964
979
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
965
980
  async delete(id, _namespace) {
package/dist/server.mjs CHANGED
@@ -40,7 +40,7 @@ import {
40
40
  sseFrame,
41
41
  sseMetaFrame,
42
42
  sseTextFrame
43
- } from "./chunk-3GKA3PJF.mjs";
43
+ } from "./chunk-7S2SRQGL.mjs";
44
44
  import "./chunk-YLTMFW4M.mjs";
45
45
  import {
46
46
  PineconeProvider
@@ -56,7 +56,7 @@ import {
56
56
  } from "./chunk-U55XRW3U.mjs";
57
57
  import {
58
58
  QdrantProvider
59
- } from "./chunk-3DSHW676.mjs";
59
+ } from "./chunk-NT5VP7MT.mjs";
60
60
  import {
61
61
  BaseVectorProvider
62
62
  } from "./chunk-IMP6FUCY.mjs";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retrivora-ai/rag-engine",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "description": "Retrivora AI is a plug-and-play AI engine for RAG chat experiences — generic vector DB + LLM provider, embeddable or standalone.",
5
5
  "author": "Abhinav Alkuchi",
6
6
  "license": "MIT",
@@ -106,8 +106,21 @@ export class QdrantProvider extends BaseVectorProvider {
106
106
  await this.http.put(`/collections/${this.indexName}/points`, payload);
107
107
  }
108
108
 
109
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
110
109
  async query(vector: number[], topK: number, namespace?: string, _filter?: Record<string, unknown>): Promise<VectorMatch[]> {
110
+ const must: any[] = [];
111
+
112
+ if (namespace) {
113
+ must.push({ key: 'namespace', match: { value: namespace } });
114
+ }
115
+
116
+ // 1. Apply metadata filters
117
+ const sanitizedFilter = this.sanitizeFilter(_filter);
118
+ for (const [key, value] of Object.entries(sanitizedFilter)) {
119
+ // Qdrant uses dot notation for nested payload fields.
120
+ // Our payload structure is { content, metadata: { ... }, namespace }
121
+ must.push({ key: `metadata.${key}`, match: { value: value } });
122
+ }
123
+
111
124
  const payload = {
112
125
  vector: vector,
113
126
  limit: topK,
@@ -116,19 +129,33 @@ export class QdrantProvider extends BaseVectorProvider {
116
129
  hnsw_ef: (this.config.options.efSearch as number) || Math.max(topK * 20, 128),
117
130
  exact: false
118
131
  },
119
- filter: namespace ? {
120
- must: [{ key: 'namespace', match: { value: namespace } }]
121
- } : undefined,
132
+ filter: must.length > 0 ? { must } : undefined,
122
133
  };
134
+
135
+ console.log(`[QdrantProvider] 🔍 Searching "${this.indexName}" | Namespace: ${namespace || 'default'} | TopK: ${topK}`);
136
+ if (must.length > (namespace ? 1 : 0)) {
137
+ console.log(`[QdrantProvider] 🛠 Filters:`, JSON.stringify(must.filter(m => m.key !== 'namespace')));
138
+ }
139
+
123
140
  const { data } = await this.http.post(`/collections/${this.indexName}/points/search`, payload);
124
- return (data.result || []).map((res: Record<string, unknown>) => ({
141
+
142
+ const results = (data.result || []).map((res: Record<string, unknown>) => ({
125
143
  id: res['id'] as string,
126
144
  score: res['score'] as number,
127
145
  content: (res['payload'] as Record<string, unknown>)?.content as string || '',
128
146
  metadata: (res['payload'] as Record<string, unknown>)?.metadata as Record<string, unknown> || {},
129
147
  }));
148
+
149
+ if (results.length === 0) {
150
+ console.warn(`[QdrantProvider] ⚠️ Retrieval returned 0 results. Check if data exists in namespace "${namespace}"`);
151
+ } else {
152
+ console.log(`[QdrantProvider] ✅ Found ${results.length} results (best score: ${results[0].score.toFixed(4)})`);
153
+ }
154
+
155
+ return results;
130
156
  }
131
157
 
158
+
132
159
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
133
160
  async delete(id: string | number, _namespace?: string): Promise<void> {
134
161
  await this.http.post(`/collections/${this.indexName}/points/delete`, {