@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.
- package/dist/{QdrantProvider-YNUNEOZH.mjs → QdrantProvider-NGFXVDCF.mjs} +1 -1
- package/dist/{chunk-3GKA3PJF.mjs → chunk-7S2SRQGL.mjs} +1 -1
- package/dist/{chunk-3DSHW676.mjs → chunk-NT5VP7MT.mjs} +20 -5
- package/dist/handlers/index.js +20 -5
- package/dist/handlers/index.mjs +1 -1
- package/dist/server.js +20 -5
- package/dist/server.mjs +2 -2
- package/package.json +1 -1
- package/src/providers/vectordb/QdrantProvider.ts +32 -5
|
@@ -1106,7 +1106,7 @@ var ProviderRegistry = class {
|
|
|
1106
1106
|
return MilvusProvider;
|
|
1107
1107
|
}
|
|
1108
1108
|
case "qdrant": {
|
|
1109
|
-
const { QdrantProvider } = await import("./QdrantProvider-
|
|
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:
|
|
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
|
-
|
|
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) {
|
package/dist/handlers/index.js
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
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) {
|
package/dist/handlers/index.mjs
CHANGED
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:
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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.
|
|
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:
|
|
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
|
-
|
|
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`, {
|