@retrivora-ai/rag-engine 1.8.1 → 1.8.3
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/{ILLMProvider-BfRgI1Xh.d.mts → ILLMProvider-BOJFz3Na.d.mts} +47 -1
- package/dist/{ILLMProvider-BfRgI1Xh.d.ts → ILLMProvider-BOJFz3Na.d.ts} +47 -1
- package/dist/handlers/index.d.mts +2 -2
- package/dist/handlers/index.d.ts +2 -2
- package/dist/handlers/index.js +509 -162
- package/dist/handlers/index.mjs +5849 -15
- package/dist/{index-1Z4GuYBi.d.ts → index-BwpcaziY.d.ts} +4 -2
- package/dist/{index-BV0z5mb6.d.mts → index-D3V9Et2M.d.mts} +4 -2
- package/dist/index.d.mts +30 -16
- package/dist/index.d.ts +30 -16
- package/dist/index.js +1999 -1210
- package/dist/index.mjs +2041 -1205
- package/dist/server.d.mts +21 -25
- package/dist/server.d.ts +21 -25
- package/dist/server.js +536 -163
- package/dist/server.mjs +5923 -67
- package/package.json +9 -7
- package/src/app/api/upload/route.ts +4 -0
- package/src/app/constants.tsx +2 -2
- package/src/app/globals.css +35 -11
- package/src/app/page.tsx +12 -321
- package/src/components/AmbientBackground.tsx +29 -0
- package/src/components/ArchitectureCard.tsx +17 -0
- package/src/components/ArchitectureCardsSection.tsx +15 -0
- package/src/components/ChatWidget.tsx +0 -1
- package/src/components/ChatWindow.tsx +32 -0
- package/src/components/CodeViewer.tsx +51 -0
- package/src/components/ConfigProvider.tsx +1 -0
- package/src/components/DocViewer.tsx +37 -0
- package/src/components/DocumentUpload.tsx +44 -1
- package/src/components/Documentation.tsx +58 -0
- package/src/components/DynamicChart.tsx +27 -2
- package/src/components/Hero.tsx +59 -0
- package/src/components/HourglassLoader.tsx +87 -0
- package/src/components/Lifecycle.tsx +37 -0
- package/src/components/MarkdownComponents.tsx +143 -0
- package/src/components/MessageBubble.tsx +91 -1012
- package/src/components/Navbar.tsx +55 -0
- package/src/components/ObservabilityPanel.tsx +374 -0
- package/src/components/ProductCard.tsx +3 -1
- package/src/components/UIDispatcher.tsx +341 -0
- package/src/components/VisualizationRenderer.tsx +48 -26
- package/src/config/ConfigBuilder.ts +38 -1
- package/src/core/LangChainAgent.ts +1 -4
- package/src/core/Pipeline.ts +209 -86
- package/src/core/QueryProcessor.ts +65 -0
- package/src/handlers/index.ts +72 -12
- package/src/hooks/useRagChat.ts +19 -9
- package/src/index.ts +9 -1
- package/src/providers/vectordb/MultiTablePostgresProvider.ts +150 -64
- package/src/rag/Reranker.ts +99 -6
- package/src/types/chat.ts +2 -0
- package/src/types/index.ts +52 -0
- package/src/types/props.ts +9 -1
- package/src/utils/ProductExtractor.ts +347 -0
- package/src/utils/UITransformer.ts +4 -53
- package/src/utils/synonyms.ts +78 -0
- package/dist/ChromaDBProvider-MIDOR4FW.mjs +0 -8
- package/dist/MilvusProvider-U7SKC27V.mjs +0 -8
- package/dist/MongoDBProvider-YNKC7EJ6.mjs +0 -8
- package/dist/MultiTablePostgresProvider-YY7LPNJK.mjs +0 -8
- package/dist/PineconeProvider-QZNRKTN2.mjs +0 -8
- package/dist/QdrantProvider-RLJTNGPY.mjs +0 -8
- package/dist/RedisProvider-SR65SCKV.mjs +0 -8
- package/dist/SimpleGraphProvider-SLOXO4M7.mjs +0 -62
- package/dist/UniversalVectorProvider-IN67OS56.mjs +0 -9
- package/dist/WeaviateProvider-5FWDFITI.mjs +0 -8
- package/dist/chunk-5AJ4XHLW.mjs +0 -201
- package/dist/chunk-5YGUXK7Z.mjs +0 -80
- package/dist/chunk-BFYLQYQU.mjs +0 -3985
- package/dist/chunk-CFVEZTBJ.mjs +0 -102
- package/dist/chunk-IMP6FUCY.mjs +0 -30
- package/dist/chunk-LR3VMDVK.mjs +0 -157
- package/dist/chunk-M6JSPGAR.mjs +0 -117
- package/dist/chunk-PSFPZXHX.mjs +0 -245
- package/dist/chunk-R3RGUMHE.mjs +0 -218
- package/dist/chunk-U55XRW3U.mjs +0 -96
- package/dist/chunk-VUQJVIJT.mjs +0 -148
- package/dist/chunk-X4TOT24V.mjs +0 -89
- package/dist/chunk-YLTMFW4M.mjs +0 -49
package/dist/chunk-CFVEZTBJ.mjs
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
BaseVectorProvider
|
|
3
|
-
} from "./chunk-IMP6FUCY.mjs";
|
|
4
|
-
import {
|
|
5
|
-
__spreadValues
|
|
6
|
-
} from "./chunk-X4TOT24V.mjs";
|
|
7
|
-
|
|
8
|
-
// src/providers/vectordb/ChromaDBProvider.ts
|
|
9
|
-
import axios from "axios";
|
|
10
|
-
var ChromaDBProvider = class extends BaseVectorProvider {
|
|
11
|
-
constructor(config) {
|
|
12
|
-
super(config);
|
|
13
|
-
this.collectionId = "";
|
|
14
|
-
const opts = config.options;
|
|
15
|
-
const baseUrl = opts.baseUrl || (opts.host ? `http://${opts.host}:${opts.port || 8e3}` : void 0);
|
|
16
|
-
if (!baseUrl) throw new Error("[ChromaDBProvider] options.baseUrl is required");
|
|
17
|
-
this.http = axios.create({
|
|
18
|
-
baseURL: baseUrl,
|
|
19
|
-
headers: { "Content-Type": "application/json" }
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Get or create the ChromaDB collection.
|
|
24
|
-
*/
|
|
25
|
-
async initialize() {
|
|
26
|
-
var _a;
|
|
27
|
-
try {
|
|
28
|
-
const { data } = await this.http.get(`/api/v1/collections/${this.indexName}`);
|
|
29
|
-
this.collectionId = data.id;
|
|
30
|
-
console.log(`[ChromaDBProvider] \u2705 Collection "${this.indexName}" found (id: ${this.collectionId})`);
|
|
31
|
-
} catch (err) {
|
|
32
|
-
if (axios.isAxiosError(err) && ((_a = err.response) == null ? void 0 : _a.status) === 404) {
|
|
33
|
-
console.log(`[ChromaDBProvider] \u23F3 Collection "${this.indexName}" not found. Creating...`);
|
|
34
|
-
const { data } = await this.http.post("/api/v1/collections", {
|
|
35
|
-
name: this.indexName
|
|
36
|
-
});
|
|
37
|
-
this.collectionId = data.id;
|
|
38
|
-
console.log(`[ChromaDBProvider] \u2705 Created collection "${this.indexName}" (id: ${this.collectionId})`);
|
|
39
|
-
} else {
|
|
40
|
-
throw err;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
async upsert(doc, namespace) {
|
|
45
|
-
await this.batchUpsert([doc], namespace);
|
|
46
|
-
}
|
|
47
|
-
async batchUpsert(docs, namespace) {
|
|
48
|
-
const payload = {
|
|
49
|
-
ids: docs.map((d) => String(d.id)),
|
|
50
|
-
embeddings: docs.map((d) => d.vector),
|
|
51
|
-
documents: docs.map((d) => d.content),
|
|
52
|
-
metadatas: docs.map((d) => __spreadValues(__spreadValues({}, d.metadata || {}), namespace ? { namespace } : {}))
|
|
53
|
-
};
|
|
54
|
-
await this.http.post(`/api/v1/collections/${this.collectionId}/add`, payload);
|
|
55
|
-
}
|
|
56
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
57
|
-
async query(vector, topK, namespace, _filter) {
|
|
58
|
-
const payload = {
|
|
59
|
-
query_embeddings: [vector],
|
|
60
|
-
n_results: topK,
|
|
61
|
-
where: namespace ? { namespace: { $eq: namespace } } : void 0
|
|
62
|
-
};
|
|
63
|
-
const { data } = await this.http.post(`/api/v1/collections/${this.collectionId}/query`, payload);
|
|
64
|
-
const matches = [];
|
|
65
|
-
if (data.ids && data.ids[0]) {
|
|
66
|
-
for (let i = 0; i < data.ids[0].length; i++) {
|
|
67
|
-
matches.push({
|
|
68
|
-
id: data.ids[0][i],
|
|
69
|
-
score: data.distances ? 1 - data.distances[0][i] : 0,
|
|
70
|
-
content: data.documents ? data.documents[0][i] : "",
|
|
71
|
-
metadata: data.metadatas ? data.metadatas[0][i] : {}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return matches;
|
|
76
|
-
}
|
|
77
|
-
async delete(id, namespace) {
|
|
78
|
-
await this.http.post(`/api/v1/collections/${this.collectionId}/delete`, {
|
|
79
|
-
ids: [id],
|
|
80
|
-
where: namespace ? { namespace: { $eq: namespace } } : void 0
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
async deleteNamespace(namespace) {
|
|
84
|
-
await this.http.post(`/api/v1/collections/${this.collectionId}/delete`, {
|
|
85
|
-
where: { namespace: { $eq: namespace } }
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
async ping() {
|
|
89
|
-
try {
|
|
90
|
-
await this.http.get("/api/v1/heartbeat");
|
|
91
|
-
return true;
|
|
92
|
-
} catch (e) {
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
async disconnect() {
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
export {
|
|
101
|
-
ChromaDBProvider
|
|
102
|
-
};
|
package/dist/chunk-IMP6FUCY.mjs
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
// src/providers/vectordb/BaseVectorProvider.ts
|
|
2
|
-
var BaseVectorProvider = class {
|
|
3
|
-
constructor(config) {
|
|
4
|
-
this.config = config;
|
|
5
|
-
this.indexName = config.indexName || "default";
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Remove internal keys (starting with __) and queryText from a filter object
|
|
9
|
-
* before passing it to an external provider that might not support them.
|
|
10
|
-
*/
|
|
11
|
-
sanitizeFilter(filter) {
|
|
12
|
-
if (!filter) return {};
|
|
13
|
-
const result = {};
|
|
14
|
-
for (const [key, value] of Object.entries(filter)) {
|
|
15
|
-
if (key.startsWith("__") || key === "queryText" || key === "keywords") {
|
|
16
|
-
continue;
|
|
17
|
-
}
|
|
18
|
-
if (key === "metadata" && typeof value === "object" && value !== null) {
|
|
19
|
-
Object.assign(result, value);
|
|
20
|
-
} else {
|
|
21
|
-
result[key] = value;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return result;
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
export {
|
|
29
|
-
BaseVectorProvider
|
|
30
|
-
};
|
package/dist/chunk-LR3VMDVK.mjs
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
buildPayload,
|
|
3
|
-
resolvePath
|
|
4
|
-
} from "./chunk-YLTMFW4M.mjs";
|
|
5
|
-
import {
|
|
6
|
-
BaseVectorProvider
|
|
7
|
-
} from "./chunk-IMP6FUCY.mjs";
|
|
8
|
-
import {
|
|
9
|
-
__spreadValues
|
|
10
|
-
} from "./chunk-X4TOT24V.mjs";
|
|
11
|
-
|
|
12
|
-
// src/providers/vectordb/UniversalVectorProvider.ts
|
|
13
|
-
import axios from "axios";
|
|
14
|
-
var UniversalVectorProvider = class extends BaseVectorProvider {
|
|
15
|
-
constructor(config) {
|
|
16
|
-
super(config);
|
|
17
|
-
this.opts = config.options;
|
|
18
|
-
if (!this.opts.baseUrl) {
|
|
19
|
-
throw new Error("[UniversalVectorProvider] options.baseUrl is required");
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
async initialize() {
|
|
23
|
-
var _a;
|
|
24
|
-
this.http = axios.create({
|
|
25
|
-
baseURL: this.opts.baseUrl,
|
|
26
|
-
headers: __spreadValues({
|
|
27
|
-
"Content-Type": "application/json"
|
|
28
|
-
}, this.opts.headers),
|
|
29
|
-
timeout: (_a = this.opts.timeout) != null ? _a : 3e4
|
|
30
|
-
});
|
|
31
|
-
if (!await this.ping()) {
|
|
32
|
-
throw new Error(`[UniversalVectorProvider] Failed to connect to ${this.opts.baseUrl}`);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
async upsert(doc, namespace) {
|
|
36
|
-
var _a, _b, _c;
|
|
37
|
-
const endpoint = (_a = this.opts.upsertEndpoint) != null ? _a : "/upsert";
|
|
38
|
-
const template = (_b = this.opts.upsertTemplate) != null ? _b : JSON.stringify({
|
|
39
|
-
id: "{{id}}",
|
|
40
|
-
vector: "{{vector}}",
|
|
41
|
-
content: "{{content}}",
|
|
42
|
-
namespace: "{{namespace}}",
|
|
43
|
-
metadata: "{{metadata}}"
|
|
44
|
-
});
|
|
45
|
-
const payload = buildPayload(template, {
|
|
46
|
-
id: doc.id,
|
|
47
|
-
vector: doc.vector,
|
|
48
|
-
content: doc.content,
|
|
49
|
-
namespace: namespace != null ? namespace : this.indexName,
|
|
50
|
-
metadata: (_c = doc.metadata) != null ? _c : {}
|
|
51
|
-
});
|
|
52
|
-
try {
|
|
53
|
-
await this.http.post(endpoint, payload);
|
|
54
|
-
} catch (error) {
|
|
55
|
-
throw new Error(
|
|
56
|
-
`[UniversalVectorProvider] Upsert failed: ${error instanceof Error ? error.message : String(error)}`
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
async batchUpsert(docs, namespace) {
|
|
61
|
-
const batchSize = 50;
|
|
62
|
-
for (let i = 0; i < docs.length; i += batchSize) {
|
|
63
|
-
const batch = docs.slice(i, i + batchSize);
|
|
64
|
-
await Promise.all(
|
|
65
|
-
batch.map((doc) => this.upsert(doc, namespace))
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
async query(vector, topK, namespace, filter) {
|
|
70
|
-
var _a, _b;
|
|
71
|
-
const endpoint = (_a = this.opts.queryEndpoint) != null ? _a : "/query";
|
|
72
|
-
const template = (_b = this.opts.queryTemplate) != null ? _b : JSON.stringify({
|
|
73
|
-
vector: "{{vector}}",
|
|
74
|
-
limit: "{{topK}}",
|
|
75
|
-
namespace: "{{namespace}}",
|
|
76
|
-
filter: "{{filter}}"
|
|
77
|
-
});
|
|
78
|
-
const sanitizedFilter = this.sanitizeFilter(filter);
|
|
79
|
-
const payload = buildPayload(template, {
|
|
80
|
-
vector,
|
|
81
|
-
topK,
|
|
82
|
-
namespace: namespace != null ? namespace : this.indexName,
|
|
83
|
-
filter: sanitizedFilter
|
|
84
|
-
});
|
|
85
|
-
try {
|
|
86
|
-
const response = await this.http.post(endpoint, payload);
|
|
87
|
-
let results = response.data;
|
|
88
|
-
if (this.opts.queryResponsePath) {
|
|
89
|
-
results = resolvePath(response.data, this.opts.queryResponsePath);
|
|
90
|
-
}
|
|
91
|
-
if (!Array.isArray(results)) {
|
|
92
|
-
throw new Error(
|
|
93
|
-
`[UniversalVectorProvider] Expected array response at "${this.opts.queryResponsePath}", got ${typeof results}`
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
return results.map((item) => {
|
|
97
|
-
var _a2, _b2, _c, _d, _e, _f, _g;
|
|
98
|
-
return {
|
|
99
|
-
id: item[(_a2 = this.opts.queryIdField) != null ? _a2 : "id"],
|
|
100
|
-
score: (_c = item[(_b2 = this.opts.queryScoreField) != null ? _b2 : "score"]) != null ? _c : 0,
|
|
101
|
-
content: (_e = item[(_d = this.opts.queryContentField) != null ? _d : "content"]) != null ? _e : "",
|
|
102
|
-
metadata: (_g = item[(_f = this.opts.queryMetadataField) != null ? _f : "metadata"]) != null ? _g : {}
|
|
103
|
-
};
|
|
104
|
-
});
|
|
105
|
-
} catch (error) {
|
|
106
|
-
throw new Error(
|
|
107
|
-
`[UniversalVectorProvider] Query failed: ${error instanceof Error ? error.message : String(error)}`
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
async delete(id, namespace) {
|
|
112
|
-
var _a, _b;
|
|
113
|
-
const endpoint = (_a = this.opts.deleteEndpoint) != null ? _a : "/delete";
|
|
114
|
-
const template = (_b = this.opts.deleteTemplate) != null ? _b : JSON.stringify({
|
|
115
|
-
id: "{{id}}",
|
|
116
|
-
namespace: "{{namespace}}"
|
|
117
|
-
});
|
|
118
|
-
const payload = buildPayload(template, {
|
|
119
|
-
id,
|
|
120
|
-
namespace: namespace != null ? namespace : this.indexName
|
|
121
|
-
});
|
|
122
|
-
try {
|
|
123
|
-
await this.http.post(endpoint, payload);
|
|
124
|
-
} catch (error) {
|
|
125
|
-
throw new Error(
|
|
126
|
-
`[UniversalVectorProvider] Delete failed: ${error instanceof Error ? error.message : String(error)}`
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
async deleteNamespace(namespace) {
|
|
131
|
-
var _a;
|
|
132
|
-
const endpoint = (_a = this.opts.deleteNamespaceEndpoint) != null ? _a : "/delete-namespace";
|
|
133
|
-
try {
|
|
134
|
-
await this.http.post(endpoint, { namespace });
|
|
135
|
-
} catch (error) {
|
|
136
|
-
throw new Error(
|
|
137
|
-
`[UniversalVectorProvider] DeleteNamespace failed: ${error instanceof Error ? error.message : String(error)}`
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
async ping() {
|
|
142
|
-
var _a;
|
|
143
|
-
try {
|
|
144
|
-
const endpoint = (_a = this.opts.pingEndpoint) != null ? _a : "/health";
|
|
145
|
-
const response = await this.http.get(endpoint, { timeout: 5e3 });
|
|
146
|
-
return response.status >= 200 && response.status < 300;
|
|
147
|
-
} catch (e) {
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
async disconnect() {
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
export {
|
|
156
|
-
UniversalVectorProvider
|
|
157
|
-
};
|
package/dist/chunk-M6JSPGAR.mjs
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
BaseVectorProvider
|
|
3
|
-
} from "./chunk-IMP6FUCY.mjs";
|
|
4
|
-
import {
|
|
5
|
-
__spreadValues
|
|
6
|
-
} from "./chunk-X4TOT24V.mjs";
|
|
7
|
-
|
|
8
|
-
// src/providers/vectordb/WeaviateProvider.ts
|
|
9
|
-
import axios from "axios";
|
|
10
|
-
var WeaviateProvider = class extends BaseVectorProvider {
|
|
11
|
-
constructor(config) {
|
|
12
|
-
super(config);
|
|
13
|
-
const opts = config.options;
|
|
14
|
-
const baseUrl = opts.baseUrl || opts.url;
|
|
15
|
-
if (!baseUrl) throw new Error("[WeaviateProvider] options.baseUrl is required");
|
|
16
|
-
this.http = axios.create({
|
|
17
|
-
baseURL: baseUrl,
|
|
18
|
-
headers: __spreadValues({
|
|
19
|
-
"Content-Type": "application/json"
|
|
20
|
-
}, opts.apiKey ? {
|
|
21
|
-
"X-OpenAI-Api-Key": opts.apiKey,
|
|
22
|
-
"Authorization": `Bearer ${opts.apiKey}`
|
|
23
|
-
} : {})
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
async initialize() {
|
|
27
|
-
await this.ping();
|
|
28
|
-
}
|
|
29
|
-
async upsert(doc, namespace) {
|
|
30
|
-
const payload = {
|
|
31
|
-
class: this.indexName,
|
|
32
|
-
id: doc.id,
|
|
33
|
-
vector: doc.vector,
|
|
34
|
-
properties: {
|
|
35
|
-
content: doc.content,
|
|
36
|
-
metadata: JSON.stringify(doc.metadata || {}),
|
|
37
|
-
namespace: namespace || ""
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
await this.http.post("/v1/objects", payload);
|
|
41
|
-
}
|
|
42
|
-
async batchUpsert(docs, namespace) {
|
|
43
|
-
const payload = {
|
|
44
|
-
objects: docs.map((doc) => ({
|
|
45
|
-
class: this.indexName,
|
|
46
|
-
id: doc.id,
|
|
47
|
-
vector: doc.vector,
|
|
48
|
-
properties: {
|
|
49
|
-
content: doc.content,
|
|
50
|
-
metadata: JSON.stringify(doc.metadata || {}),
|
|
51
|
-
namespace: namespace || ""
|
|
52
|
-
}
|
|
53
|
-
}))
|
|
54
|
-
};
|
|
55
|
-
await this.http.post("/v1/batch/objects", payload);
|
|
56
|
-
}
|
|
57
|
-
async query(vector, topK, namespace, _filter) {
|
|
58
|
-
var _a, _b;
|
|
59
|
-
const sanitizedFilter = this.sanitizeFilter(_filter);
|
|
60
|
-
const queryText = sanitizedFilter.queryText;
|
|
61
|
-
const searchParams = queryText ? `hybrid: { query: ${JSON.stringify(queryText)}, alpha: 0.5 }` : `nearVector: { vector: ${JSON.stringify(vector)} }`;
|
|
62
|
-
const graphqlQuery = {
|
|
63
|
-
query: `
|
|
64
|
-
{
|
|
65
|
-
Get {
|
|
66
|
-
${this.indexName}(
|
|
67
|
-
${searchParams}
|
|
68
|
-
limit: ${topK}
|
|
69
|
-
${namespace ? `where: { path: ["namespace"], operator: Equal, valueString: "${namespace}" }` : ""}
|
|
70
|
-
) {
|
|
71
|
-
content
|
|
72
|
-
metadata
|
|
73
|
-
_additional {
|
|
74
|
-
id
|
|
75
|
-
distance
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
`
|
|
81
|
-
};
|
|
82
|
-
const { data } = await this.http.post("/v1/graphql", graphqlQuery);
|
|
83
|
-
const results = ((_b = (_a = data.data) == null ? void 0 : _a.Get) == null ? void 0 : _b[this.indexName]) || [];
|
|
84
|
-
return results.map((res) => ({
|
|
85
|
-
id: res["_additional"].id,
|
|
86
|
-
score: 1 - res["_additional"].distance,
|
|
87
|
-
content: res["content"],
|
|
88
|
-
metadata: res["metadata"] ? JSON.parse(res["metadata"]) : {}
|
|
89
|
-
}));
|
|
90
|
-
}
|
|
91
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
92
|
-
async delete(id, _namespace) {
|
|
93
|
-
await this.http.delete(`/v1/objects/${this.indexName}/${id}`);
|
|
94
|
-
}
|
|
95
|
-
async deleteNamespace(namespace) {
|
|
96
|
-
await this.http.post("/v1/batch/objects", {
|
|
97
|
-
match: {
|
|
98
|
-
class: this.indexName,
|
|
99
|
-
where: { path: ["namespace"], operator: "Equal", valueString: namespace }
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
async ping() {
|
|
104
|
-
try {
|
|
105
|
-
await this.http.get("/v1/.well-known/live");
|
|
106
|
-
return true;
|
|
107
|
-
} catch (e) {
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
async disconnect() {
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
export {
|
|
116
|
-
WeaviateProvider
|
|
117
|
-
};
|
package/dist/chunk-PSFPZXHX.mjs
DELETED
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
BaseVectorProvider
|
|
3
|
-
} from "./chunk-IMP6FUCY.mjs";
|
|
4
|
-
import {
|
|
5
|
-
__spreadValues
|
|
6
|
-
} from "./chunk-X4TOT24V.mjs";
|
|
7
|
-
|
|
8
|
-
// src/providers/vectordb/QdrantProvider.ts
|
|
9
|
-
import axios from "axios";
|
|
10
|
-
import crypto from "crypto";
|
|
11
|
-
var QdrantProvider = class extends BaseVectorProvider {
|
|
12
|
-
constructor(config) {
|
|
13
|
-
super(config);
|
|
14
|
-
this.schemaDiscovered = false;
|
|
15
|
-
const opts = config.options;
|
|
16
|
-
const baseUrl = opts.baseUrl;
|
|
17
|
-
if (!baseUrl) throw new Error("[QdrantProvider] baseUrl is required");
|
|
18
|
-
this.contentField = opts.contentField || "content";
|
|
19
|
-
this.metadataField = opts.metadataField || "metadata";
|
|
20
|
-
this.isFlatPayload = !!opts.flatPayload;
|
|
21
|
-
this.http = axios.create({
|
|
22
|
-
baseURL: baseUrl,
|
|
23
|
-
timeout: 15e3,
|
|
24
|
-
// 15s timeout for vector DB operations
|
|
25
|
-
headers: __spreadValues({
|
|
26
|
-
"Content-Type": "application/json"
|
|
27
|
-
}, opts.apiKey ? { "api-key": opts.apiKey } : {})
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
async initialize() {
|
|
31
|
-
if (this.schemaDiscovered) return;
|
|
32
|
-
await this.ping();
|
|
33
|
-
await this.ensureCollection();
|
|
34
|
-
console.log(`[QdrantProvider] \u{1F50D} Discovering schema for collection "${this.indexName}"...`);
|
|
35
|
-
const discoveredFields = await this.discoverSchema();
|
|
36
|
-
const opts = this.config.options;
|
|
37
|
-
const configFields = opts.filterableFields || [];
|
|
38
|
-
const allFields = [.../* @__PURE__ */ new Set([...discoveredFields, ...configFields])];
|
|
39
|
-
if (allFields.length > 0) {
|
|
40
|
-
console.log(`[QdrantProvider] \u{1F6E0} Ensuring indexes for ${allFields.length} discovered fields...`);
|
|
41
|
-
await Promise.all(
|
|
42
|
-
allFields.map(async (fieldInfo) => {
|
|
43
|
-
const [fieldName, schemaType] = fieldInfo.split(":");
|
|
44
|
-
return this.ensureIndex(fieldName, schemaType || "keyword");
|
|
45
|
-
})
|
|
46
|
-
);
|
|
47
|
-
} else {
|
|
48
|
-
console.log(`[QdrantProvider] \u2139\uFE0F No fields discovered for indexing.`);
|
|
49
|
-
}
|
|
50
|
-
this.schemaDiscovered = true;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Samples points from the collection to discover available payload fields.
|
|
54
|
-
*/
|
|
55
|
-
async discoverSchema() {
|
|
56
|
-
var _a;
|
|
57
|
-
try {
|
|
58
|
-
const { data } = await this.http.post(`/collections/${this.indexName}/points/scroll`, {
|
|
59
|
-
limit: 20,
|
|
60
|
-
with_payload: true,
|
|
61
|
-
with_vector: false
|
|
62
|
-
});
|
|
63
|
-
const points = ((_a = data.result) == null ? void 0 : _a.points) || [];
|
|
64
|
-
const keys = /* @__PURE__ */ new Set();
|
|
65
|
-
for (const point of points) {
|
|
66
|
-
const payload = point.payload || {};
|
|
67
|
-
Object.keys(payload).forEach((k) => {
|
|
68
|
-
if (k !== "namespace" && k !== this.contentField && k !== this.metadataField) {
|
|
69
|
-
keys.add(k);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
if (!this.isFlatPayload && payload[this.metadataField]) {
|
|
73
|
-
const meta = payload[this.metadataField];
|
|
74
|
-
if (typeof meta === "object" && meta !== null) {
|
|
75
|
-
Object.keys(meta).forEach((k) => keys.add(k));
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return Array.from(keys);
|
|
80
|
-
} catch (err) {
|
|
81
|
-
console.warn(`[QdrantProvider] \u26A0\uFE0F Schema discovery failed:`, err instanceof Error ? err.message : String(err));
|
|
82
|
-
return [];
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Ensures the collection exists. Creates it if missing.
|
|
87
|
-
*/
|
|
88
|
-
async ensureCollection() {
|
|
89
|
-
var _a;
|
|
90
|
-
try {
|
|
91
|
-
await this.http.get(`/collections/${this.indexName}`);
|
|
92
|
-
console.log(`[QdrantProvider] \u2705 Collection "${this.indexName}" already exists.`);
|
|
93
|
-
} catch (err) {
|
|
94
|
-
if (axios.isAxiosError(err) && ((_a = err.response) == null ? void 0 : _a.status) === 404) {
|
|
95
|
-
const opts = this.config.options;
|
|
96
|
-
const dimensionsForCreate = opts.dimensions || 1536;
|
|
97
|
-
console.log(`[QdrantProvider] \u23F3 Creating collection "${this.indexName}" (dimensions: ${dimensionsForCreate})...`);
|
|
98
|
-
await this.http.put(`/collections/${this.indexName}`, {
|
|
99
|
-
vectors: {
|
|
100
|
-
size: dimensionsForCreate,
|
|
101
|
-
distance: "Cosine"
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
console.log(`[QdrantProvider] \u2705 Created collection "${this.indexName}"`);
|
|
105
|
-
} else {
|
|
106
|
-
throw err;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Ensures that a payload field has an index.
|
|
112
|
-
*/
|
|
113
|
-
async ensureIndex(fieldName, schema = "keyword") {
|
|
114
|
-
var _a;
|
|
115
|
-
let fullPath = fieldName;
|
|
116
|
-
if (!this.isFlatPayload && !fieldName.includes(".") && fieldName !== "namespace" && fieldName !== this.contentField) {
|
|
117
|
-
fullPath = `${this.metadataField}.${fieldName}`;
|
|
118
|
-
}
|
|
119
|
-
try {
|
|
120
|
-
await this.http.put(`/collections/${this.indexName}/index`, {
|
|
121
|
-
field_name: fullPath,
|
|
122
|
-
field_schema: schema
|
|
123
|
-
});
|
|
124
|
-
console.log(`[QdrantProvider] \u2705 Ensured ${schema} index for "${fullPath}"`);
|
|
125
|
-
} catch (err) {
|
|
126
|
-
let status;
|
|
127
|
-
if (axios.isAxiosError(err)) status = (_a = err.response) == null ? void 0 : _a.status;
|
|
128
|
-
if (status === 409) return;
|
|
129
|
-
console.warn(`[QdrantProvider] \u26A0\uFE0F Could not ensure index for "${fullPath}":`, err instanceof Error ? err.message : String(err));
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
async upsert(doc, namespace) {
|
|
133
|
-
await this.batchUpsert([doc], namespace);
|
|
134
|
-
}
|
|
135
|
-
async batchUpsert(docs, namespace) {
|
|
136
|
-
const payload = {
|
|
137
|
-
points: docs.map((doc) => {
|
|
138
|
-
const pointPayload = __spreadValues({
|
|
139
|
-
[this.contentField]: doc.content
|
|
140
|
-
}, namespace ? { namespace } : {});
|
|
141
|
-
if (this.isFlatPayload) {
|
|
142
|
-
Object.assign(pointPayload, doc.metadata || {});
|
|
143
|
-
} else {
|
|
144
|
-
pointPayload[this.metadataField] = doc.metadata || {};
|
|
145
|
-
}
|
|
146
|
-
return {
|
|
147
|
-
id: this.normalizeId(doc.id),
|
|
148
|
-
vector: doc.vector,
|
|
149
|
-
payload: pointPayload
|
|
150
|
-
};
|
|
151
|
-
})
|
|
152
|
-
};
|
|
153
|
-
await this.http.put(`/collections/${this.indexName}/points`, payload);
|
|
154
|
-
}
|
|
155
|
-
async query(vector, topK, namespace, _filter) {
|
|
156
|
-
const must = [];
|
|
157
|
-
if (namespace) {
|
|
158
|
-
must.push({ key: "namespace", match: { value: namespace } });
|
|
159
|
-
}
|
|
160
|
-
const sanitizedFilter = this.sanitizeFilter(_filter);
|
|
161
|
-
for (const [key, value] of Object.entries(sanitizedFilter)) {
|
|
162
|
-
let filterKey = key;
|
|
163
|
-
if (!this.isFlatPayload && !key.includes(".") && key !== "namespace" && key !== this.contentField) {
|
|
164
|
-
filterKey = `${this.metadataField}.${key}`;
|
|
165
|
-
}
|
|
166
|
-
if (Array.isArray(value)) {
|
|
167
|
-
must.push({ key: filterKey, match: { any: value } });
|
|
168
|
-
} else {
|
|
169
|
-
must.push({ key: filterKey, match: { value } });
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
const payload = {
|
|
173
|
-
vector,
|
|
174
|
-
limit: topK,
|
|
175
|
-
with_payload: true,
|
|
176
|
-
params: {
|
|
177
|
-
hnsw_ef: this.config.options.efSearch || Math.max(topK * 20, 128),
|
|
178
|
-
exact: false
|
|
179
|
-
},
|
|
180
|
-
filter: must.length > 0 ? { must } : void 0
|
|
181
|
-
};
|
|
182
|
-
const { data } = await this.http.post(`/collections/${this.indexName}/points/search`, payload);
|
|
183
|
-
const results = (data.result || []).map((res) => {
|
|
184
|
-
const p = res.payload || {};
|
|
185
|
-
let content = p[this.contentField] || "";
|
|
186
|
-
if (!content) {
|
|
187
|
-
const stringFields = Object.entries(p).filter(([, v]) => typeof v === "string").map(([k, v]) => ({ key: k, val: v }));
|
|
188
|
-
if (stringFields.length > 0) {
|
|
189
|
-
const bestMatch = stringFields.sort((a, b) => b.val.length - a.val.length)[0];
|
|
190
|
-
content = bestMatch.val;
|
|
191
|
-
} else {
|
|
192
|
-
content = JSON.stringify(p);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
let metadata = {};
|
|
196
|
-
if (this.isFlatPayload) {
|
|
197
|
-
metadata = __spreadValues({}, p);
|
|
198
|
-
delete metadata[this.contentField];
|
|
199
|
-
delete metadata["namespace"];
|
|
200
|
-
} else {
|
|
201
|
-
metadata = p[this.metadataField] || p;
|
|
202
|
-
}
|
|
203
|
-
return {
|
|
204
|
-
id: res.id,
|
|
205
|
-
score: res.score,
|
|
206
|
-
content,
|
|
207
|
-
metadata
|
|
208
|
-
};
|
|
209
|
-
});
|
|
210
|
-
return results;
|
|
211
|
-
}
|
|
212
|
-
async delete(id) {
|
|
213
|
-
await this.http.post(`/collections/${this.indexName}/points/delete`, {
|
|
214
|
-
points: [this.normalizeId(id)]
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
async deleteNamespace(_namespace) {
|
|
218
|
-
await this.http.post(`/collections/${this.indexName}/points/delete`, {
|
|
219
|
-
filter: {
|
|
220
|
-
must: [{ key: "namespace", match: { value: _namespace } }]
|
|
221
|
-
}
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
async ping() {
|
|
225
|
-
try {
|
|
226
|
-
await this.http.get("/healthz");
|
|
227
|
-
return true;
|
|
228
|
-
} catch (e) {
|
|
229
|
-
return false;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
normalizeId(id) {
|
|
233
|
-
if (typeof id === "number") return id;
|
|
234
|
-
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
235
|
-
if (uuidRegex.test(id)) return id.toLowerCase();
|
|
236
|
-
const hash = crypto.createHash("md5").update(id).digest("hex");
|
|
237
|
-
return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-${hash.slice(12, 16)}-${hash.slice(16, 20)}-${hash.slice(20, 32)}`;
|
|
238
|
-
}
|
|
239
|
-
async disconnect() {
|
|
240
|
-
}
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
export {
|
|
244
|
-
QdrantProvider
|
|
245
|
-
};
|