@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.
Files changed (80) hide show
  1. package/dist/{ILLMProvider-BfRgI1Xh.d.mts → ILLMProvider-BOJFz3Na.d.mts} +47 -1
  2. package/dist/{ILLMProvider-BfRgI1Xh.d.ts → ILLMProvider-BOJFz3Na.d.ts} +47 -1
  3. package/dist/handlers/index.d.mts +2 -2
  4. package/dist/handlers/index.d.ts +2 -2
  5. package/dist/handlers/index.js +509 -162
  6. package/dist/handlers/index.mjs +5849 -15
  7. package/dist/{index-1Z4GuYBi.d.ts → index-BwpcaziY.d.ts} +4 -2
  8. package/dist/{index-BV0z5mb6.d.mts → index-D3V9Et2M.d.mts} +4 -2
  9. package/dist/index.d.mts +30 -16
  10. package/dist/index.d.ts +30 -16
  11. package/dist/index.js +1999 -1210
  12. package/dist/index.mjs +2041 -1205
  13. package/dist/server.d.mts +21 -25
  14. package/dist/server.d.ts +21 -25
  15. package/dist/server.js +536 -163
  16. package/dist/server.mjs +5923 -67
  17. package/package.json +9 -7
  18. package/src/app/api/upload/route.ts +4 -0
  19. package/src/app/constants.tsx +2 -2
  20. package/src/app/globals.css +35 -11
  21. package/src/app/page.tsx +12 -321
  22. package/src/components/AmbientBackground.tsx +29 -0
  23. package/src/components/ArchitectureCard.tsx +17 -0
  24. package/src/components/ArchitectureCardsSection.tsx +15 -0
  25. package/src/components/ChatWidget.tsx +0 -1
  26. package/src/components/ChatWindow.tsx +32 -0
  27. package/src/components/CodeViewer.tsx +51 -0
  28. package/src/components/ConfigProvider.tsx +1 -0
  29. package/src/components/DocViewer.tsx +37 -0
  30. package/src/components/DocumentUpload.tsx +44 -1
  31. package/src/components/Documentation.tsx +58 -0
  32. package/src/components/DynamicChart.tsx +27 -2
  33. package/src/components/Hero.tsx +59 -0
  34. package/src/components/HourglassLoader.tsx +87 -0
  35. package/src/components/Lifecycle.tsx +37 -0
  36. package/src/components/MarkdownComponents.tsx +143 -0
  37. package/src/components/MessageBubble.tsx +91 -1012
  38. package/src/components/Navbar.tsx +55 -0
  39. package/src/components/ObservabilityPanel.tsx +374 -0
  40. package/src/components/ProductCard.tsx +3 -1
  41. package/src/components/UIDispatcher.tsx +341 -0
  42. package/src/components/VisualizationRenderer.tsx +48 -26
  43. package/src/config/ConfigBuilder.ts +38 -1
  44. package/src/core/LangChainAgent.ts +1 -4
  45. package/src/core/Pipeline.ts +209 -86
  46. package/src/core/QueryProcessor.ts +65 -0
  47. package/src/handlers/index.ts +72 -12
  48. package/src/hooks/useRagChat.ts +19 -9
  49. package/src/index.ts +9 -1
  50. package/src/providers/vectordb/MultiTablePostgresProvider.ts +150 -64
  51. package/src/rag/Reranker.ts +99 -6
  52. package/src/types/chat.ts +2 -0
  53. package/src/types/index.ts +52 -0
  54. package/src/types/props.ts +9 -1
  55. package/src/utils/ProductExtractor.ts +347 -0
  56. package/src/utils/UITransformer.ts +4 -53
  57. package/src/utils/synonyms.ts +78 -0
  58. package/dist/ChromaDBProvider-MIDOR4FW.mjs +0 -8
  59. package/dist/MilvusProvider-U7SKC27V.mjs +0 -8
  60. package/dist/MongoDBProvider-YNKC7EJ6.mjs +0 -8
  61. package/dist/MultiTablePostgresProvider-YY7LPNJK.mjs +0 -8
  62. package/dist/PineconeProvider-QZNRKTN2.mjs +0 -8
  63. package/dist/QdrantProvider-RLJTNGPY.mjs +0 -8
  64. package/dist/RedisProvider-SR65SCKV.mjs +0 -8
  65. package/dist/SimpleGraphProvider-SLOXO4M7.mjs +0 -62
  66. package/dist/UniversalVectorProvider-IN67OS56.mjs +0 -9
  67. package/dist/WeaviateProvider-5FWDFITI.mjs +0 -8
  68. package/dist/chunk-5AJ4XHLW.mjs +0 -201
  69. package/dist/chunk-5YGUXK7Z.mjs +0 -80
  70. package/dist/chunk-BFYLQYQU.mjs +0 -3985
  71. package/dist/chunk-CFVEZTBJ.mjs +0 -102
  72. package/dist/chunk-IMP6FUCY.mjs +0 -30
  73. package/dist/chunk-LR3VMDVK.mjs +0 -157
  74. package/dist/chunk-M6JSPGAR.mjs +0 -117
  75. package/dist/chunk-PSFPZXHX.mjs +0 -245
  76. package/dist/chunk-R3RGUMHE.mjs +0 -218
  77. package/dist/chunk-U55XRW3U.mjs +0 -96
  78. package/dist/chunk-VUQJVIJT.mjs +0 -148
  79. package/dist/chunk-X4TOT24V.mjs +0 -89
  80. package/dist/chunk-YLTMFW4M.mjs +0 -49
@@ -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
- };
@@ -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
- };
@@ -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
- };
@@ -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
- };
@@ -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
- };