@retrivora-ai/rag-engine 0.3.3 → 0.3.5
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/{ChromaDBProvider-T7TK3ONZ.mjs → ChromaDBProvider-6JWXHZAE.mjs} +2 -2
- package/dist/{MilvusProvider-Y5FV5EAE.mjs → MilvusProvider-MJQVHU4B.mjs} +2 -2
- package/dist/{MongoDBProvider-KGO6N23T.mjs → MongoDBProvider-XS3QR47H.mjs} +2 -2
- package/dist/{PineconeProvider-A47MRRYJ.mjs → PineconeProvider-QZTC7QAP.mjs} +2 -2
- package/dist/{PostgreSQLProvider-ILWADFAP.mjs → PostgreSQLProvider-CNO72UP6.mjs} +2 -2
- package/dist/{QdrantProvider-OLPJK7CY.mjs → QdrantProvider-6OBJKUIP.mjs} +2 -2
- package/dist/{RedisProvider-ANEJ3BHR.mjs → RedisProvider-FF5BNQPB.mjs} +2 -2
- package/dist/{UniversalVectorProvider-QJIV2AJJ.mjs → UniversalVectorProvider-CAVX5VSQ.mjs} +2 -2
- package/dist/{WeaviateProvider-WIK2QN23.mjs → WeaviateProvider-DIYYBTEF.mjs} +2 -2
- package/dist/{chunk-RUKZC3ON.mjs → chunk-7XL3QSQ7.mjs} +1 -1
- package/dist/{chunk-VEJNRS4B.mjs → chunk-ENEUABSO.mjs} +1 -1
- package/dist/{chunk-IFPISZ2S.mjs → chunk-KGW2YHV2.mjs} +2 -8
- package/dist/{chunk-6GSARSCP.mjs → chunk-L54WODRW.mjs} +2 -8
- package/dist/{chunk-BMHJTWSU.mjs → chunk-M3AZTD7F.mjs} +3 -2
- package/dist/{chunk-HOMXEE3M.mjs → chunk-N2L5CFGM.mjs} +1 -1
- package/dist/{chunk-VKE5ZW7Y.mjs → chunk-Q2QDQ5SQ.mjs} +1 -1
- package/dist/{chunk-VV2ML6TM.mjs → chunk-R3GPRETL.mjs} +3 -2
- package/dist/{chunk-SNPFZBDK.mjs → chunk-TOKEXP3M.mjs} +42 -20
- package/dist/{chunk-W2PQR3UK.mjs → chunk-ULX4EF74.mjs} +1 -1
- package/dist/chunk-YVTGOFNV.mjs +23 -0
- package/dist/handlers/index.js +51 -27
- package/dist/handlers/index.mjs +1 -1
- package/dist/server.d.mts +5 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.js +51 -27
- package/dist/server.mjs +11 -11
- package/package.json +1 -1
- package/src/llm/providers/GeminiProvider.ts +34 -6
- package/src/providers/vectordb/BaseVectorProvider.ts +13 -0
- package/src/providers/vectordb/MongoDBProvider.ts +1 -9
- package/src/providers/vectordb/PineconeProvider.ts +2 -1
- package/src/providers/vectordb/PostgreSQLProvider.ts +1 -9
- package/src/providers/vectordb/UniversalVectorProvider.ts +2 -1
- package/dist/chunk-VOIWNO5O.mjs +0 -11
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
UniversalVectorProvider
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-R3GPRETL.mjs";
|
|
4
4
|
import "./chunk-EDLTMSNY.mjs";
|
|
5
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-YVTGOFNV.mjs";
|
|
6
6
|
import "./chunk-FWCSY2DS.mjs";
|
|
7
7
|
export {
|
|
8
8
|
UniversalVectorProvider
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseVectorProvider
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YVTGOFNV.mjs";
|
|
4
4
|
import {
|
|
5
5
|
__spreadValues
|
|
6
6
|
} from "./chunk-FWCSY2DS.mjs";
|
|
7
7
|
|
|
8
8
|
// src/providers/vectordb/MongoDBProvider.ts
|
|
9
9
|
import { MongoClient } from "mongodb";
|
|
10
|
-
function stripInternalFilterKeys(filter) {
|
|
11
|
-
if (!filter) return {};
|
|
12
|
-
return Object.fromEntries(
|
|
13
|
-
Object.entries(filter).filter(([key]) => !key.startsWith("__"))
|
|
14
|
-
);
|
|
15
|
-
}
|
|
16
10
|
var MongoDBProvider = class extends BaseVectorProvider {
|
|
17
11
|
constructor(config) {
|
|
18
12
|
super(config);
|
|
@@ -58,7 +52,7 @@ var MongoDBProvider = class extends BaseVectorProvider {
|
|
|
58
52
|
await this.collection.bulkWrite(operations);
|
|
59
53
|
}
|
|
60
54
|
async query(vector, topK, namespace, filter) {
|
|
61
|
-
const publicFilter =
|
|
55
|
+
const publicFilter = this.sanitizeFilter(filter);
|
|
62
56
|
const pipeline = [
|
|
63
57
|
{
|
|
64
58
|
$vectorSearch: __spreadValues({
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseVectorProvider
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YVTGOFNV.mjs";
|
|
4
4
|
|
|
5
5
|
// src/providers/vectordb/PostgreSQLProvider.ts
|
|
6
6
|
import { Pool } from "pg";
|
|
7
|
-
function stripInternalFilterKeys(filter) {
|
|
8
|
-
if (!filter) return {};
|
|
9
|
-
return Object.fromEntries(
|
|
10
|
-
Object.entries(filter).filter(([key]) => !key.startsWith("__"))
|
|
11
|
-
);
|
|
12
|
-
}
|
|
13
7
|
var PostgreSQLProvider = class extends BaseVectorProvider {
|
|
14
8
|
constructor(config) {
|
|
15
9
|
var _a;
|
|
@@ -96,7 +90,7 @@ var PostgreSQLProvider = class extends BaseVectorProvider {
|
|
|
96
90
|
let whereClause = namespace ? `WHERE namespace = $3` : "";
|
|
97
91
|
const params = [vectorLiteral, topK];
|
|
98
92
|
if (namespace) params.push(namespace);
|
|
99
|
-
const publicFilter =
|
|
93
|
+
const publicFilter = this.sanitizeFilter(filter);
|
|
100
94
|
if (Object.keys(publicFilter).length > 0) {
|
|
101
95
|
const filterConditions = Object.entries(publicFilter).map(([key, val]) => {
|
|
102
96
|
const paramIdx = params.length + 1;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
BaseVectorProvider
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YVTGOFNV.mjs";
|
|
4
4
|
import {
|
|
5
5
|
__spreadValues
|
|
6
6
|
} from "./chunk-FWCSY2DS.mjs";
|
|
@@ -55,11 +55,12 @@ var PineconeProvider = class extends BaseVectorProvider {
|
|
|
55
55
|
}
|
|
56
56
|
async query(vector, topK, namespace, filter) {
|
|
57
57
|
var _a;
|
|
58
|
+
const pineconeFilter = this.sanitizeFilter(filter);
|
|
58
59
|
const result = await this.index(namespace).query(__spreadValues({
|
|
59
60
|
vector,
|
|
60
61
|
topK,
|
|
61
62
|
includeMetadata: true
|
|
62
|
-
},
|
|
63
|
+
}, Object.keys(pineconeFilter).length > 0 ? { filter: pineconeFilter } : {}));
|
|
63
64
|
return ((_a = result.matches) != null ? _a : []).map((m) => {
|
|
64
65
|
var _a2, _b;
|
|
65
66
|
return {
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-EDLTMSNY.mjs";
|
|
5
5
|
import {
|
|
6
6
|
BaseVectorProvider
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-YVTGOFNV.mjs";
|
|
8
8
|
import {
|
|
9
9
|
__spreadValues
|
|
10
10
|
} from "./chunk-FWCSY2DS.mjs";
|
|
@@ -75,11 +75,12 @@ var UniversalVectorProvider = class extends BaseVectorProvider {
|
|
|
75
75
|
namespace: "{{namespace}}",
|
|
76
76
|
filter: "{{filter}}"
|
|
77
77
|
});
|
|
78
|
+
const sanitizedFilter = this.sanitizeFilter(filter);
|
|
78
79
|
const payload = buildPayload(template, {
|
|
79
80
|
vector,
|
|
80
81
|
topK,
|
|
81
82
|
namespace: namespace != null ? namespace : this.indexName,
|
|
82
|
-
filter:
|
|
83
|
+
filter: sanitizedFilter
|
|
83
84
|
});
|
|
84
85
|
try {
|
|
85
86
|
const response = await this.http.post(endpoint, payload);
|
|
@@ -1009,8 +1009,18 @@ var GeminiProvider = class {
|
|
|
1009
1009
|
constructor(llmConfig, embeddingConfig) {
|
|
1010
1010
|
if (!llmConfig.apiKey) throw new Error("[GeminiProvider] llmConfig.apiKey is required");
|
|
1011
1011
|
this.client = new GoogleGenAI({ apiKey: llmConfig.apiKey });
|
|
1012
|
-
this.llmConfig = llmConfig
|
|
1013
|
-
|
|
1012
|
+
this.llmConfig = __spreadProps(__spreadValues({}, llmConfig), {
|
|
1013
|
+
model: this.sanitizeModel(llmConfig.model)
|
|
1014
|
+
});
|
|
1015
|
+
if (embeddingConfig) {
|
|
1016
|
+
this.embeddingConfig = __spreadProps(__spreadValues({}, embeddingConfig), {
|
|
1017
|
+
model: this.sanitizeModel(embeddingConfig.model)
|
|
1018
|
+
});
|
|
1019
|
+
}
|
|
1020
|
+
}
|
|
1021
|
+
sanitizeModel(model) {
|
|
1022
|
+
if (!model) return model;
|
|
1023
|
+
return model.split(":")[0];
|
|
1014
1024
|
}
|
|
1015
1025
|
async chat(messages, context, options) {
|
|
1016
1026
|
var _a, _b, _c, _d, _e, _f;
|
|
@@ -1039,8 +1049,10 @@ ${context}`;
|
|
|
1039
1049
|
return (_f = response.text) != null ? _f : "";
|
|
1040
1050
|
}
|
|
1041
1051
|
async embed(text, options) {
|
|
1042
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
1043
|
-
const model =
|
|
1052
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
1053
|
+
const model = this.sanitizeModel(
|
|
1054
|
+
(_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004"
|
|
1055
|
+
);
|
|
1044
1056
|
const apiKey = (_e = (_d = this.embeddingConfig) == null ? void 0 : _d.apiKey) != null ? _e : this.llmConfig.apiKey;
|
|
1045
1057
|
const client = apiKey !== this.llmConfig.apiKey ? new GoogleGenAI({ apiKey }) : this.client;
|
|
1046
1058
|
let content = text;
|
|
@@ -1057,14 +1069,20 @@ ${context}`;
|
|
|
1057
1069
|
}
|
|
1058
1070
|
const response = await client.models.embedContent({
|
|
1059
1071
|
model,
|
|
1060
|
-
contents: content
|
|
1072
|
+
contents: content,
|
|
1073
|
+
config: ((_h = this.embeddingConfig) == null ? void 0 : _h.dimensions) ? { outputDimensionality: this.embeddingConfig.dimensions } : void 0
|
|
1074
|
+
}).catch((err) => {
|
|
1075
|
+
console.error(`[GeminiProvider] Embedding failed for model "${model}":`, err.message);
|
|
1076
|
+
throw err;
|
|
1061
1077
|
});
|
|
1062
|
-
return (
|
|
1078
|
+
return (_k = (_j = (_i = response.embeddings) == null ? void 0 : _i[0]) == null ? void 0 : _j.values) != null ? _k : [];
|
|
1063
1079
|
}
|
|
1064
1080
|
async batchEmbed(texts, options) {
|
|
1065
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
1081
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
1066
1082
|
const vectors = [];
|
|
1067
|
-
const model =
|
|
1083
|
+
const model = this.sanitizeModel(
|
|
1084
|
+
(_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004"
|
|
1085
|
+
);
|
|
1068
1086
|
const apiKey = (_e = (_d = this.embeddingConfig) == null ? void 0 : _d.apiKey) != null ? _e : this.llmConfig.apiKey;
|
|
1069
1087
|
const client = apiKey !== this.llmConfig.apiKey ? new GoogleGenAI({ apiKey }) : this.client;
|
|
1070
1088
|
let contents = texts;
|
|
@@ -1077,12 +1095,16 @@ ${context}`;
|
|
|
1077
1095
|
}
|
|
1078
1096
|
const response = await client.models.embedContent({
|
|
1079
1097
|
model,
|
|
1080
|
-
contents
|
|
1098
|
+
contents,
|
|
1099
|
+
config: ((_h = this.embeddingConfig) == null ? void 0 : _h.dimensions) ? { outputDimensionality: this.embeddingConfig.dimensions } : void 0
|
|
1100
|
+
}).catch((err) => {
|
|
1101
|
+
console.error(`[GeminiProvider] Batch embedding failed for model "${model}":`, err.message);
|
|
1102
|
+
throw err;
|
|
1081
1103
|
});
|
|
1082
|
-
return (
|
|
1104
|
+
return (_j = (_i = response.embeddings) == null ? void 0 : _i.map((e) => {
|
|
1083
1105
|
var _a2;
|
|
1084
1106
|
return (_a2 = e.values) != null ? _a2 : [];
|
|
1085
|
-
})) != null ?
|
|
1107
|
+
})) != null ? _j : [];
|
|
1086
1108
|
}
|
|
1087
1109
|
async ping() {
|
|
1088
1110
|
try {
|
|
@@ -1348,41 +1370,41 @@ var ProviderRegistry = class {
|
|
|
1348
1370
|
}
|
|
1349
1371
|
switch (provider) {
|
|
1350
1372
|
case "pinecone": {
|
|
1351
|
-
const { PineconeProvider } = await import("./PineconeProvider-
|
|
1373
|
+
const { PineconeProvider } = await import("./PineconeProvider-QZTC7QAP.mjs");
|
|
1352
1374
|
return new PineconeProvider(config);
|
|
1353
1375
|
}
|
|
1354
1376
|
case "pgvector":
|
|
1355
1377
|
case "postgresql": {
|
|
1356
|
-
const { PostgreSQLProvider } = await import("./PostgreSQLProvider-
|
|
1378
|
+
const { PostgreSQLProvider } = await import("./PostgreSQLProvider-CNO72UP6.mjs");
|
|
1357
1379
|
return new PostgreSQLProvider(config);
|
|
1358
1380
|
}
|
|
1359
1381
|
case "mongodb": {
|
|
1360
|
-
const { MongoDBProvider } = await import("./MongoDBProvider-
|
|
1382
|
+
const { MongoDBProvider } = await import("./MongoDBProvider-XS3QR47H.mjs");
|
|
1361
1383
|
return new MongoDBProvider(config);
|
|
1362
1384
|
}
|
|
1363
1385
|
case "milvus": {
|
|
1364
|
-
const { MilvusProvider } = await import("./MilvusProvider-
|
|
1386
|
+
const { MilvusProvider } = await import("./MilvusProvider-MJQVHU4B.mjs");
|
|
1365
1387
|
return new MilvusProvider(config);
|
|
1366
1388
|
}
|
|
1367
1389
|
case "qdrant": {
|
|
1368
|
-
const { QdrantProvider } = await import("./QdrantProvider-
|
|
1390
|
+
const { QdrantProvider } = await import("./QdrantProvider-6OBJKUIP.mjs");
|
|
1369
1391
|
return new QdrantProvider(config);
|
|
1370
1392
|
}
|
|
1371
1393
|
case "chromadb": {
|
|
1372
|
-
const { ChromaDBProvider } = await import("./ChromaDBProvider-
|
|
1394
|
+
const { ChromaDBProvider } = await import("./ChromaDBProvider-6JWXHZAE.mjs");
|
|
1373
1395
|
return new ChromaDBProvider(config);
|
|
1374
1396
|
}
|
|
1375
1397
|
case "redis": {
|
|
1376
|
-
const { RedisProvider } = await import("./RedisProvider-
|
|
1398
|
+
const { RedisProvider } = await import("./RedisProvider-FF5BNQPB.mjs");
|
|
1377
1399
|
return new RedisProvider(config);
|
|
1378
1400
|
}
|
|
1379
1401
|
case "weaviate": {
|
|
1380
|
-
const { WeaviateProvider } = await import("./WeaviateProvider-
|
|
1402
|
+
const { WeaviateProvider } = await import("./WeaviateProvider-DIYYBTEF.mjs");
|
|
1381
1403
|
return new WeaviateProvider(config);
|
|
1382
1404
|
}
|
|
1383
1405
|
case "universal_rest":
|
|
1384
1406
|
case "rest": {
|
|
1385
|
-
const { UniversalVectorProvider } = await import("./UniversalVectorProvider-
|
|
1407
|
+
const { UniversalVectorProvider } = await import("./UniversalVectorProvider-CAVX5VSQ.mjs");
|
|
1386
1408
|
return new UniversalVectorProvider(config);
|
|
1387
1409
|
}
|
|
1388
1410
|
default:
|
|
@@ -0,0 +1,23 @@
|
|
|
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
|
+
return Object.fromEntries(
|
|
14
|
+
Object.entries(filter).filter(
|
|
15
|
+
([key]) => !key.startsWith("__") && key !== "queryText"
|
|
16
|
+
)
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export {
|
|
22
|
+
BaseVectorProvider
|
|
23
|
+
};
|
package/dist/handlers/index.js
CHANGED
|
@@ -102,6 +102,18 @@ var init_BaseVectorProvider = __esm({
|
|
|
102
102
|
this.config = config;
|
|
103
103
|
this.indexName = config.indexName || "default";
|
|
104
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Remove internal keys (starting with __) and queryText from a filter object
|
|
107
|
+
* before passing it to an external provider that might not support them.
|
|
108
|
+
*/
|
|
109
|
+
sanitizeFilter(filter) {
|
|
110
|
+
if (!filter) return {};
|
|
111
|
+
return Object.fromEntries(
|
|
112
|
+
Object.entries(filter).filter(
|
|
113
|
+
([key]) => !key.startsWith("__") && key !== "queryText"
|
|
114
|
+
)
|
|
115
|
+
);
|
|
116
|
+
}
|
|
105
117
|
};
|
|
106
118
|
}
|
|
107
119
|
});
|
|
@@ -165,11 +177,12 @@ var init_PineconeProvider = __esm({
|
|
|
165
177
|
}
|
|
166
178
|
async query(vector, topK, namespace, filter) {
|
|
167
179
|
var _a;
|
|
180
|
+
const pineconeFilter = this.sanitizeFilter(filter);
|
|
168
181
|
const result = await this.index(namespace).query(__spreadValues({
|
|
169
182
|
vector,
|
|
170
183
|
topK,
|
|
171
184
|
includeMetadata: true
|
|
172
|
-
},
|
|
185
|
+
}, Object.keys(pineconeFilter).length > 0 ? { filter: pineconeFilter } : {}));
|
|
173
186
|
return ((_a = result.matches) != null ? _a : []).map((m) => {
|
|
174
187
|
var _a2, _b;
|
|
175
188
|
return {
|
|
@@ -205,12 +218,6 @@ var PostgreSQLProvider_exports = {};
|
|
|
205
218
|
__export(PostgreSQLProvider_exports, {
|
|
206
219
|
PostgreSQLProvider: () => PostgreSQLProvider
|
|
207
220
|
});
|
|
208
|
-
function stripInternalFilterKeys(filter) {
|
|
209
|
-
if (!filter) return {};
|
|
210
|
-
return Object.fromEntries(
|
|
211
|
-
Object.entries(filter).filter(([key]) => !key.startsWith("__"))
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
221
|
var import_pg, PostgreSQLProvider;
|
|
215
222
|
var init_PostgreSQLProvider = __esm({
|
|
216
223
|
"src/providers/vectordb/PostgreSQLProvider.ts"() {
|
|
@@ -303,7 +310,7 @@ var init_PostgreSQLProvider = __esm({
|
|
|
303
310
|
let whereClause = namespace ? `WHERE namespace = $3` : "";
|
|
304
311
|
const params = [vectorLiteral, topK];
|
|
305
312
|
if (namespace) params.push(namespace);
|
|
306
|
-
const publicFilter =
|
|
313
|
+
const publicFilter = this.sanitizeFilter(filter);
|
|
307
314
|
if (Object.keys(publicFilter).length > 0) {
|
|
308
315
|
const filterConditions = Object.entries(publicFilter).map(([key, val]) => {
|
|
309
316
|
const paramIdx = params.length + 1;
|
|
@@ -355,12 +362,6 @@ var MongoDBProvider_exports = {};
|
|
|
355
362
|
__export(MongoDBProvider_exports, {
|
|
356
363
|
MongoDBProvider: () => MongoDBProvider
|
|
357
364
|
});
|
|
358
|
-
function stripInternalFilterKeys2(filter) {
|
|
359
|
-
if (!filter) return {};
|
|
360
|
-
return Object.fromEntries(
|
|
361
|
-
Object.entries(filter).filter(([key]) => !key.startsWith("__"))
|
|
362
|
-
);
|
|
363
|
-
}
|
|
364
365
|
var import_mongodb, MongoDBProvider;
|
|
365
366
|
var init_MongoDBProvider = __esm({
|
|
366
367
|
"src/providers/vectordb/MongoDBProvider.ts"() {
|
|
@@ -412,7 +413,7 @@ var init_MongoDBProvider = __esm({
|
|
|
412
413
|
await this.collection.bulkWrite(operations);
|
|
413
414
|
}
|
|
414
415
|
async query(vector, topK, namespace, filter) {
|
|
415
|
-
const publicFilter =
|
|
416
|
+
const publicFilter = this.sanitizeFilter(filter);
|
|
416
417
|
const pipeline = [
|
|
417
418
|
{
|
|
418
419
|
$vectorSearch: __spreadValues({
|
|
@@ -1087,11 +1088,12 @@ var init_UniversalVectorProvider = __esm({
|
|
|
1087
1088
|
namespace: "{{namespace}}",
|
|
1088
1089
|
filter: "{{filter}}"
|
|
1089
1090
|
});
|
|
1091
|
+
const sanitizedFilter = this.sanitizeFilter(filter);
|
|
1090
1092
|
const payload = buildPayload(template, {
|
|
1091
1093
|
vector,
|
|
1092
1094
|
topK,
|
|
1093
1095
|
namespace: namespace != null ? namespace : this.indexName,
|
|
1094
|
-
filter:
|
|
1096
|
+
filter: sanitizedFilter
|
|
1095
1097
|
});
|
|
1096
1098
|
try {
|
|
1097
1099
|
const response = await this.http.post(endpoint, payload);
|
|
@@ -2177,8 +2179,18 @@ var GeminiProvider = class {
|
|
|
2177
2179
|
constructor(llmConfig, embeddingConfig) {
|
|
2178
2180
|
if (!llmConfig.apiKey) throw new Error("[GeminiProvider] llmConfig.apiKey is required");
|
|
2179
2181
|
this.client = new import_genai.GoogleGenAI({ apiKey: llmConfig.apiKey });
|
|
2180
|
-
this.llmConfig = llmConfig
|
|
2181
|
-
|
|
2182
|
+
this.llmConfig = __spreadProps(__spreadValues({}, llmConfig), {
|
|
2183
|
+
model: this.sanitizeModel(llmConfig.model)
|
|
2184
|
+
});
|
|
2185
|
+
if (embeddingConfig) {
|
|
2186
|
+
this.embeddingConfig = __spreadProps(__spreadValues({}, embeddingConfig), {
|
|
2187
|
+
model: this.sanitizeModel(embeddingConfig.model)
|
|
2188
|
+
});
|
|
2189
|
+
}
|
|
2190
|
+
}
|
|
2191
|
+
sanitizeModel(model) {
|
|
2192
|
+
if (!model) return model;
|
|
2193
|
+
return model.split(":")[0];
|
|
2182
2194
|
}
|
|
2183
2195
|
async chat(messages, context, options) {
|
|
2184
2196
|
var _a, _b, _c, _d, _e, _f;
|
|
@@ -2207,8 +2219,10 @@ ${context}`;
|
|
|
2207
2219
|
return (_f = response.text) != null ? _f : "";
|
|
2208
2220
|
}
|
|
2209
2221
|
async embed(text, options) {
|
|
2210
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
2211
|
-
const model =
|
|
2222
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
2223
|
+
const model = this.sanitizeModel(
|
|
2224
|
+
(_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004"
|
|
2225
|
+
);
|
|
2212
2226
|
const apiKey = (_e = (_d = this.embeddingConfig) == null ? void 0 : _d.apiKey) != null ? _e : this.llmConfig.apiKey;
|
|
2213
2227
|
const client = apiKey !== this.llmConfig.apiKey ? new import_genai.GoogleGenAI({ apiKey }) : this.client;
|
|
2214
2228
|
let content = text;
|
|
@@ -2225,14 +2239,20 @@ ${context}`;
|
|
|
2225
2239
|
}
|
|
2226
2240
|
const response = await client.models.embedContent({
|
|
2227
2241
|
model,
|
|
2228
|
-
contents: content
|
|
2242
|
+
contents: content,
|
|
2243
|
+
config: ((_h = this.embeddingConfig) == null ? void 0 : _h.dimensions) ? { outputDimensionality: this.embeddingConfig.dimensions } : void 0
|
|
2244
|
+
}).catch((err) => {
|
|
2245
|
+
console.error(`[GeminiProvider] Embedding failed for model "${model}":`, err.message);
|
|
2246
|
+
throw err;
|
|
2229
2247
|
});
|
|
2230
|
-
return (
|
|
2248
|
+
return (_k = (_j = (_i = response.embeddings) == null ? void 0 : _i[0]) == null ? void 0 : _j.values) != null ? _k : [];
|
|
2231
2249
|
}
|
|
2232
2250
|
async batchEmbed(texts, options) {
|
|
2233
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
2251
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
2234
2252
|
const vectors = [];
|
|
2235
|
-
const model =
|
|
2253
|
+
const model = this.sanitizeModel(
|
|
2254
|
+
(_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004"
|
|
2255
|
+
);
|
|
2236
2256
|
const apiKey = (_e = (_d = this.embeddingConfig) == null ? void 0 : _d.apiKey) != null ? _e : this.llmConfig.apiKey;
|
|
2237
2257
|
const client = apiKey !== this.llmConfig.apiKey ? new import_genai.GoogleGenAI({ apiKey }) : this.client;
|
|
2238
2258
|
let contents = texts;
|
|
@@ -2245,12 +2265,16 @@ ${context}`;
|
|
|
2245
2265
|
}
|
|
2246
2266
|
const response = await client.models.embedContent({
|
|
2247
2267
|
model,
|
|
2248
|
-
contents
|
|
2268
|
+
contents,
|
|
2269
|
+
config: ((_h = this.embeddingConfig) == null ? void 0 : _h.dimensions) ? { outputDimensionality: this.embeddingConfig.dimensions } : void 0
|
|
2270
|
+
}).catch((err) => {
|
|
2271
|
+
console.error(`[GeminiProvider] Batch embedding failed for model "${model}":`, err.message);
|
|
2272
|
+
throw err;
|
|
2249
2273
|
});
|
|
2250
|
-
return (
|
|
2274
|
+
return (_j = (_i = response.embeddings) == null ? void 0 : _i.map((e) => {
|
|
2251
2275
|
var _a2;
|
|
2252
2276
|
return (_a2 = e.values) != null ? _a2 : [];
|
|
2253
|
-
})) != null ?
|
|
2277
|
+
})) != null ? _j : [];
|
|
2254
2278
|
}
|
|
2255
2279
|
async ping() {
|
|
2256
2280
|
try {
|
package/dist/handlers/index.mjs
CHANGED
package/dist/server.d.mts
CHANGED
|
@@ -307,6 +307,11 @@ declare abstract class BaseVectorProvider {
|
|
|
307
307
|
* Gracefully close the connection.
|
|
308
308
|
*/
|
|
309
309
|
abstract disconnect(): Promise<void>;
|
|
310
|
+
/**
|
|
311
|
+
* Remove internal keys (starting with __) and queryText from a filter object
|
|
312
|
+
* before passing it to an external provider that might not support them.
|
|
313
|
+
*/
|
|
314
|
+
protected sanitizeFilter(filter?: Record<string, unknown>): Record<string, unknown>;
|
|
310
315
|
}
|
|
311
316
|
|
|
312
317
|
/**
|
package/dist/server.d.ts
CHANGED
|
@@ -307,6 +307,11 @@ declare abstract class BaseVectorProvider {
|
|
|
307
307
|
* Gracefully close the connection.
|
|
308
308
|
*/
|
|
309
309
|
abstract disconnect(): Promise<void>;
|
|
310
|
+
/**
|
|
311
|
+
* Remove internal keys (starting with __) and queryText from a filter object
|
|
312
|
+
* before passing it to an external provider that might not support them.
|
|
313
|
+
*/
|
|
314
|
+
protected sanitizeFilter(filter?: Record<string, unknown>): Record<string, unknown>;
|
|
310
315
|
}
|
|
311
316
|
|
|
312
317
|
/**
|
package/dist/server.js
CHANGED
|
@@ -114,6 +114,18 @@ var init_BaseVectorProvider = __esm({
|
|
|
114
114
|
this.config = config;
|
|
115
115
|
this.indexName = config.indexName || "default";
|
|
116
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Remove internal keys (starting with __) and queryText from a filter object
|
|
119
|
+
* before passing it to an external provider that might not support them.
|
|
120
|
+
*/
|
|
121
|
+
sanitizeFilter(filter) {
|
|
122
|
+
if (!filter) return {};
|
|
123
|
+
return Object.fromEntries(
|
|
124
|
+
Object.entries(filter).filter(
|
|
125
|
+
([key]) => !key.startsWith("__") && key !== "queryText"
|
|
126
|
+
)
|
|
127
|
+
);
|
|
128
|
+
}
|
|
117
129
|
};
|
|
118
130
|
}
|
|
119
131
|
});
|
|
@@ -177,11 +189,12 @@ var init_PineconeProvider = __esm({
|
|
|
177
189
|
}
|
|
178
190
|
async query(vector, topK, namespace, filter) {
|
|
179
191
|
var _a;
|
|
192
|
+
const pineconeFilter = this.sanitizeFilter(filter);
|
|
180
193
|
const result = await this.index(namespace).query(__spreadValues({
|
|
181
194
|
vector,
|
|
182
195
|
topK,
|
|
183
196
|
includeMetadata: true
|
|
184
|
-
},
|
|
197
|
+
}, Object.keys(pineconeFilter).length > 0 ? { filter: pineconeFilter } : {}));
|
|
185
198
|
return ((_a = result.matches) != null ? _a : []).map((m) => {
|
|
186
199
|
var _a2, _b;
|
|
187
200
|
return {
|
|
@@ -217,12 +230,6 @@ var PostgreSQLProvider_exports = {};
|
|
|
217
230
|
__export(PostgreSQLProvider_exports, {
|
|
218
231
|
PostgreSQLProvider: () => PostgreSQLProvider
|
|
219
232
|
});
|
|
220
|
-
function stripInternalFilterKeys(filter) {
|
|
221
|
-
if (!filter) return {};
|
|
222
|
-
return Object.fromEntries(
|
|
223
|
-
Object.entries(filter).filter(([key]) => !key.startsWith("__"))
|
|
224
|
-
);
|
|
225
|
-
}
|
|
226
233
|
var import_pg, PostgreSQLProvider;
|
|
227
234
|
var init_PostgreSQLProvider = __esm({
|
|
228
235
|
"src/providers/vectordb/PostgreSQLProvider.ts"() {
|
|
@@ -315,7 +322,7 @@ var init_PostgreSQLProvider = __esm({
|
|
|
315
322
|
let whereClause = namespace ? `WHERE namespace = $3` : "";
|
|
316
323
|
const params = [vectorLiteral, topK];
|
|
317
324
|
if (namespace) params.push(namespace);
|
|
318
|
-
const publicFilter =
|
|
325
|
+
const publicFilter = this.sanitizeFilter(filter);
|
|
319
326
|
if (Object.keys(publicFilter).length > 0) {
|
|
320
327
|
const filterConditions = Object.entries(publicFilter).map(([key, val]) => {
|
|
321
328
|
const paramIdx = params.length + 1;
|
|
@@ -367,12 +374,6 @@ var MongoDBProvider_exports = {};
|
|
|
367
374
|
__export(MongoDBProvider_exports, {
|
|
368
375
|
MongoDBProvider: () => MongoDBProvider
|
|
369
376
|
});
|
|
370
|
-
function stripInternalFilterKeys2(filter) {
|
|
371
|
-
if (!filter) return {};
|
|
372
|
-
return Object.fromEntries(
|
|
373
|
-
Object.entries(filter).filter(([key]) => !key.startsWith("__"))
|
|
374
|
-
);
|
|
375
|
-
}
|
|
376
377
|
var import_mongodb, MongoDBProvider;
|
|
377
378
|
var init_MongoDBProvider = __esm({
|
|
378
379
|
"src/providers/vectordb/MongoDBProvider.ts"() {
|
|
@@ -424,7 +425,7 @@ var init_MongoDBProvider = __esm({
|
|
|
424
425
|
await this.collection.bulkWrite(operations);
|
|
425
426
|
}
|
|
426
427
|
async query(vector, topK, namespace, filter) {
|
|
427
|
-
const publicFilter =
|
|
428
|
+
const publicFilter = this.sanitizeFilter(filter);
|
|
428
429
|
const pipeline = [
|
|
429
430
|
{
|
|
430
431
|
$vectorSearch: __spreadValues({
|
|
@@ -1099,11 +1100,12 @@ var init_UniversalVectorProvider = __esm({
|
|
|
1099
1100
|
namespace: "{{namespace}}",
|
|
1100
1101
|
filter: "{{filter}}"
|
|
1101
1102
|
});
|
|
1103
|
+
const sanitizedFilter = this.sanitizeFilter(filter);
|
|
1102
1104
|
const payload = buildPayload(template, {
|
|
1103
1105
|
vector,
|
|
1104
1106
|
topK,
|
|
1105
1107
|
namespace: namespace != null ? namespace : this.indexName,
|
|
1106
|
-
filter:
|
|
1108
|
+
filter: sanitizedFilter
|
|
1107
1109
|
});
|
|
1108
1110
|
try {
|
|
1109
1111
|
const response = await this.http.post(endpoint, payload);
|
|
@@ -2221,8 +2223,18 @@ var GeminiProvider = class {
|
|
|
2221
2223
|
constructor(llmConfig, embeddingConfig) {
|
|
2222
2224
|
if (!llmConfig.apiKey) throw new Error("[GeminiProvider] llmConfig.apiKey is required");
|
|
2223
2225
|
this.client = new import_genai.GoogleGenAI({ apiKey: llmConfig.apiKey });
|
|
2224
|
-
this.llmConfig = llmConfig
|
|
2225
|
-
|
|
2226
|
+
this.llmConfig = __spreadProps(__spreadValues({}, llmConfig), {
|
|
2227
|
+
model: this.sanitizeModel(llmConfig.model)
|
|
2228
|
+
});
|
|
2229
|
+
if (embeddingConfig) {
|
|
2230
|
+
this.embeddingConfig = __spreadProps(__spreadValues({}, embeddingConfig), {
|
|
2231
|
+
model: this.sanitizeModel(embeddingConfig.model)
|
|
2232
|
+
});
|
|
2233
|
+
}
|
|
2234
|
+
}
|
|
2235
|
+
sanitizeModel(model) {
|
|
2236
|
+
if (!model) return model;
|
|
2237
|
+
return model.split(":")[0];
|
|
2226
2238
|
}
|
|
2227
2239
|
async chat(messages, context, options) {
|
|
2228
2240
|
var _a, _b, _c, _d, _e, _f;
|
|
@@ -2251,8 +2263,10 @@ ${context}`;
|
|
|
2251
2263
|
return (_f = response.text) != null ? _f : "";
|
|
2252
2264
|
}
|
|
2253
2265
|
async embed(text, options) {
|
|
2254
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
2255
|
-
const model =
|
|
2266
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
2267
|
+
const model = this.sanitizeModel(
|
|
2268
|
+
(_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004"
|
|
2269
|
+
);
|
|
2256
2270
|
const apiKey = (_e = (_d = this.embeddingConfig) == null ? void 0 : _d.apiKey) != null ? _e : this.llmConfig.apiKey;
|
|
2257
2271
|
const client = apiKey !== this.llmConfig.apiKey ? new import_genai.GoogleGenAI({ apiKey }) : this.client;
|
|
2258
2272
|
let content = text;
|
|
@@ -2269,14 +2283,20 @@ ${context}`;
|
|
|
2269
2283
|
}
|
|
2270
2284
|
const response = await client.models.embedContent({
|
|
2271
2285
|
model,
|
|
2272
|
-
contents: content
|
|
2286
|
+
contents: content,
|
|
2287
|
+
config: ((_h = this.embeddingConfig) == null ? void 0 : _h.dimensions) ? { outputDimensionality: this.embeddingConfig.dimensions } : void 0
|
|
2288
|
+
}).catch((err) => {
|
|
2289
|
+
console.error(`[GeminiProvider] Embedding failed for model "${model}":`, err.message);
|
|
2290
|
+
throw err;
|
|
2273
2291
|
});
|
|
2274
|
-
return (
|
|
2292
|
+
return (_k = (_j = (_i = response.embeddings) == null ? void 0 : _i[0]) == null ? void 0 : _j.values) != null ? _k : [];
|
|
2275
2293
|
}
|
|
2276
2294
|
async batchEmbed(texts, options) {
|
|
2277
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
2295
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
2278
2296
|
const vectors = [];
|
|
2279
|
-
const model =
|
|
2297
|
+
const model = this.sanitizeModel(
|
|
2298
|
+
(_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004"
|
|
2299
|
+
);
|
|
2280
2300
|
const apiKey = (_e = (_d = this.embeddingConfig) == null ? void 0 : _d.apiKey) != null ? _e : this.llmConfig.apiKey;
|
|
2281
2301
|
const client = apiKey !== this.llmConfig.apiKey ? new import_genai.GoogleGenAI({ apiKey }) : this.client;
|
|
2282
2302
|
let contents = texts;
|
|
@@ -2289,12 +2309,16 @@ ${context}`;
|
|
|
2289
2309
|
}
|
|
2290
2310
|
const response = await client.models.embedContent({
|
|
2291
2311
|
model,
|
|
2292
|
-
contents
|
|
2312
|
+
contents,
|
|
2313
|
+
config: ((_h = this.embeddingConfig) == null ? void 0 : _h.dimensions) ? { outputDimensionality: this.embeddingConfig.dimensions } : void 0
|
|
2314
|
+
}).catch((err) => {
|
|
2315
|
+
console.error(`[GeminiProvider] Batch embedding failed for model "${model}":`, err.message);
|
|
2316
|
+
throw err;
|
|
2293
2317
|
});
|
|
2294
|
-
return (
|
|
2318
|
+
return (_j = (_i = response.embeddings) == null ? void 0 : _i.map((e) => {
|
|
2295
2319
|
var _a2;
|
|
2296
2320
|
return (_a2 = e.values) != null ? _a2 : [];
|
|
2297
|
-
})) != null ?
|
|
2321
|
+
})) != null ? _j : [];
|
|
2298
2322
|
}
|
|
2299
2323
|
async ping() {
|
|
2300
2324
|
try {
|
package/dist/server.mjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ChromaDBProvider
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Q2QDQ5SQ.mjs";
|
|
4
4
|
import {
|
|
5
5
|
RedisProvider
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-N2L5CFGM.mjs";
|
|
7
7
|
import {
|
|
8
8
|
WeaviateProvider
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-7XL3QSQ7.mjs";
|
|
10
10
|
import {
|
|
11
11
|
UniversalVectorProvider
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-R3GPRETL.mjs";
|
|
13
13
|
import {
|
|
14
14
|
AnthropicProvider,
|
|
15
15
|
BatchProcessor,
|
|
@@ -34,26 +34,26 @@ import {
|
|
|
34
34
|
createIngestHandler,
|
|
35
35
|
createUploadHandler,
|
|
36
36
|
getRagConfig
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-TOKEXP3M.mjs";
|
|
38
38
|
import "./chunk-EDLTMSNY.mjs";
|
|
39
39
|
import {
|
|
40
40
|
PineconeProvider
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-M3AZTD7F.mjs";
|
|
42
42
|
import {
|
|
43
43
|
PostgreSQLProvider
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-L54WODRW.mjs";
|
|
45
45
|
import {
|
|
46
46
|
MongoDBProvider
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-KGW2YHV2.mjs";
|
|
48
48
|
import {
|
|
49
49
|
MilvusProvider
|
|
50
|
-
} from "./chunk-
|
|
50
|
+
} from "./chunk-ENEUABSO.mjs";
|
|
51
51
|
import {
|
|
52
52
|
QdrantProvider
|
|
53
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-ULX4EF74.mjs";
|
|
54
54
|
import {
|
|
55
55
|
BaseVectorProvider
|
|
56
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-YVTGOFNV.mjs";
|
|
57
57
|
import {
|
|
58
58
|
__objRest,
|
|
59
59
|
__spreadProps,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@retrivora-ai/rag-engine",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
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",
|
|
@@ -26,10 +26,28 @@ export class GeminiProvider implements ILLMProvider {
|
|
|
26
26
|
constructor(llmConfig: LLMConfig, embeddingConfig?: EmbeddingConfig) {
|
|
27
27
|
if (!llmConfig.apiKey) throw new Error('[GeminiProvider] llmConfig.apiKey is required');
|
|
28
28
|
this.client = new GoogleGenAI({ apiKey: llmConfig.apiKey });
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
|
|
30
|
+
// Sanitize model names (e.g. remove ':latest' suffix used by Ollama)
|
|
31
|
+
this.llmConfig = {
|
|
32
|
+
...llmConfig,
|
|
33
|
+
model: this.sanitizeModel(llmConfig.model)
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
if (embeddingConfig) {
|
|
37
|
+
this.embeddingConfig = {
|
|
38
|
+
...embeddingConfig,
|
|
39
|
+
model: this.sanitizeModel(embeddingConfig.model)
|
|
40
|
+
};
|
|
41
|
+
}
|
|
31
42
|
}
|
|
32
43
|
|
|
44
|
+
private sanitizeModel(model: string): string {
|
|
45
|
+
if (!model) return model;
|
|
46
|
+
// Strip :latest suffix common in Ollama but invalid in Google SDK
|
|
47
|
+
return model.split(':')[0];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
33
51
|
async chat(messages: ChatMessage[], context: string, options?: ChatOptions): Promise<string> {
|
|
34
52
|
const systemPrompt =
|
|
35
53
|
this.llmConfig.systemPrompt ??
|
|
@@ -62,10 +80,11 @@ export class GeminiProvider implements ILLMProvider {
|
|
|
62
80
|
}
|
|
63
81
|
|
|
64
82
|
async embed(text: string, options?: EmbedOptions): Promise<number[]> {
|
|
65
|
-
const model =
|
|
83
|
+
const model = this.sanitizeModel(
|
|
66
84
|
options?.model ??
|
|
67
85
|
this.embeddingConfig?.model ??
|
|
68
|
-
'text-embedding-004'
|
|
86
|
+
'text-embedding-004'
|
|
87
|
+
);
|
|
69
88
|
|
|
70
89
|
const apiKey = this.embeddingConfig?.apiKey ?? this.llmConfig.apiKey;
|
|
71
90
|
const client = apiKey !== this.llmConfig.apiKey
|
|
@@ -91,6 +110,10 @@ export class GeminiProvider implements ILLMProvider {
|
|
|
91
110
|
const response = await client.models.embedContent({
|
|
92
111
|
model,
|
|
93
112
|
contents: content,
|
|
113
|
+
config: this.embeddingConfig?.dimensions ? { outputDimensionality: this.embeddingConfig.dimensions } : undefined
|
|
114
|
+
}).catch(err => {
|
|
115
|
+
console.error(`[GeminiProvider] Embedding failed for model "${model}":`, err.message);
|
|
116
|
+
throw err;
|
|
94
117
|
});
|
|
95
118
|
|
|
96
119
|
return response.embeddings?.[0]?.values ?? [];
|
|
@@ -101,10 +124,11 @@ export class GeminiProvider implements ILLMProvider {
|
|
|
101
124
|
// Sequential fallback for Gemini (API doesn't have a direct batch endpoint in the same way, though you can pass multiple contents.
|
|
102
125
|
// For simplicity and to match the other providers' structure, we'll iterate or pass array.
|
|
103
126
|
// The new SDK supports an array of contents.
|
|
104
|
-
const model =
|
|
127
|
+
const model = this.sanitizeModel(
|
|
105
128
|
options?.model ??
|
|
106
129
|
this.embeddingConfig?.model ??
|
|
107
|
-
'text-embedding-004'
|
|
130
|
+
'text-embedding-004'
|
|
131
|
+
);
|
|
108
132
|
|
|
109
133
|
const apiKey = this.embeddingConfig?.apiKey ?? this.llmConfig.apiKey;
|
|
110
134
|
const client = apiKey !== this.llmConfig.apiKey
|
|
@@ -126,6 +150,10 @@ export class GeminiProvider implements ILLMProvider {
|
|
|
126
150
|
const response = await client.models.embedContent({
|
|
127
151
|
model,
|
|
128
152
|
contents,
|
|
153
|
+
config: this.embeddingConfig?.dimensions ? { outputDimensionality: this.embeddingConfig.dimensions } : undefined
|
|
154
|
+
}).catch(err => {
|
|
155
|
+
console.error(`[GeminiProvider] Batch embedding failed for model "${model}":`, err.message);
|
|
156
|
+
throw err;
|
|
129
157
|
});
|
|
130
158
|
|
|
131
159
|
return response.embeddings?.map(e => e.values ?? []) ?? [];
|
|
@@ -58,4 +58,17 @@ export abstract class BaseVectorProvider {
|
|
|
58
58
|
* Gracefully close the connection.
|
|
59
59
|
*/
|
|
60
60
|
abstract disconnect(): Promise<void>;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Remove internal keys (starting with __) and queryText from a filter object
|
|
64
|
+
* before passing it to an external provider that might not support them.
|
|
65
|
+
*/
|
|
66
|
+
protected sanitizeFilter(filter?: Record<string, unknown>): Record<string, unknown> {
|
|
67
|
+
if (!filter) return {};
|
|
68
|
+
return Object.fromEntries(
|
|
69
|
+
Object.entries(filter).filter(
|
|
70
|
+
([key]) => !key.startsWith('__') && key !== 'queryText'
|
|
71
|
+
)
|
|
72
|
+
);
|
|
73
|
+
}
|
|
61
74
|
}
|
|
@@ -3,14 +3,6 @@ import { VectorDBConfig } from '../../config/RagConfig';
|
|
|
3
3
|
import { BaseVectorProvider } from './BaseVectorProvider';
|
|
4
4
|
import { VectorMatch, UpsertDocument } from '../../types';
|
|
5
5
|
|
|
6
|
-
function stripInternalFilterKeys(filter?: Record<string, unknown>): Record<string, unknown> {
|
|
7
|
-
if (!filter) return {};
|
|
8
|
-
|
|
9
|
-
return Object.fromEntries(
|
|
10
|
-
Object.entries(filter).filter(([key]) => !key.startsWith('__'))
|
|
11
|
-
);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
6
|
/**
|
|
15
7
|
* MongoDBProvider — MongoDB Atlas Vector Search implementation.
|
|
16
8
|
*/
|
|
@@ -75,7 +67,7 @@ export class MongoDBProvider extends BaseVectorProvider {
|
|
|
75
67
|
}
|
|
76
68
|
|
|
77
69
|
async query(vector: number[], topK: number, namespace?: string, filter?: Record<string, unknown>): Promise<VectorMatch[]> {
|
|
78
|
-
const publicFilter =
|
|
70
|
+
const publicFilter = this.sanitizeFilter(filter);
|
|
79
71
|
const pipeline: Record<string, unknown>[] = [
|
|
80
72
|
{
|
|
81
73
|
$vectorSearch: {
|
|
@@ -66,11 +66,12 @@ export class PineconeProvider extends BaseVectorProvider {
|
|
|
66
66
|
namespace?: string,
|
|
67
67
|
filter?: Record<string, unknown>
|
|
68
68
|
): Promise<VectorMatch[]> {
|
|
69
|
+
const pineconeFilter = this.sanitizeFilter(filter);
|
|
69
70
|
const result = await this.index(namespace).query({
|
|
70
71
|
vector,
|
|
71
72
|
topK,
|
|
72
73
|
includeMetadata: true,
|
|
73
|
-
...(
|
|
74
|
+
...(Object.keys(pineconeFilter).length > 0 ? { filter: pineconeFilter as any } : {}),
|
|
74
75
|
});
|
|
75
76
|
return (result.matches ?? []).map((m) => ({
|
|
76
77
|
id: m.id,
|
|
@@ -3,14 +3,6 @@ import { VectorDBConfig } from '../../config/RagConfig';
|
|
|
3
3
|
import { BaseVectorProvider } from './BaseVectorProvider';
|
|
4
4
|
import { VectorMatch, UpsertDocument } from '../../types';
|
|
5
5
|
|
|
6
|
-
function stripInternalFilterKeys(filter?: Record<string, unknown>): Record<string, unknown> {
|
|
7
|
-
if (!filter) return {};
|
|
8
|
-
|
|
9
|
-
return Object.fromEntries(
|
|
10
|
-
Object.entries(filter).filter(([key]) => !key.startsWith('__'))
|
|
11
|
-
);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
6
|
/**
|
|
15
7
|
* PostgreSQLProvider — PostgreSQL implementation using the pgvector extension.
|
|
16
8
|
*/
|
|
@@ -111,7 +103,7 @@ export class PostgreSQLProvider extends BaseVectorProvider {
|
|
|
111
103
|
const params: unknown[] = [vectorLiteral, topK];
|
|
112
104
|
if (namespace) params.push(namespace);
|
|
113
105
|
|
|
114
|
-
const publicFilter =
|
|
106
|
+
const publicFilter = this.sanitizeFilter(filter);
|
|
115
107
|
if (Object.keys(publicFilter).length > 0) {
|
|
116
108
|
const filterConditions = Object.entries(publicFilter)
|
|
117
109
|
.map(([key, val]) => {
|
|
@@ -132,11 +132,12 @@ export class UniversalVectorProvider extends BaseVectorProvider {
|
|
|
132
132
|
filter: '{{filter}}',
|
|
133
133
|
});
|
|
134
134
|
|
|
135
|
+
const sanitizedFilter = this.sanitizeFilter(filter);
|
|
135
136
|
const payload = buildPayload(template, {
|
|
136
137
|
vector,
|
|
137
138
|
topK,
|
|
138
139
|
namespace: namespace ?? this.indexName,
|
|
139
|
-
filter:
|
|
140
|
+
filter: sanitizedFilter,
|
|
140
141
|
});
|
|
141
142
|
|
|
142
143
|
try {
|
package/dist/chunk-VOIWNO5O.mjs
DELETED