@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.
Files changed (34) hide show
  1. package/dist/{ChromaDBProvider-T7TK3ONZ.mjs → ChromaDBProvider-6JWXHZAE.mjs} +2 -2
  2. package/dist/{MilvusProvider-Y5FV5EAE.mjs → MilvusProvider-MJQVHU4B.mjs} +2 -2
  3. package/dist/{MongoDBProvider-KGO6N23T.mjs → MongoDBProvider-XS3QR47H.mjs} +2 -2
  4. package/dist/{PineconeProvider-A47MRRYJ.mjs → PineconeProvider-QZTC7QAP.mjs} +2 -2
  5. package/dist/{PostgreSQLProvider-ILWADFAP.mjs → PostgreSQLProvider-CNO72UP6.mjs} +2 -2
  6. package/dist/{QdrantProvider-OLPJK7CY.mjs → QdrantProvider-6OBJKUIP.mjs} +2 -2
  7. package/dist/{RedisProvider-ANEJ3BHR.mjs → RedisProvider-FF5BNQPB.mjs} +2 -2
  8. package/dist/{UniversalVectorProvider-QJIV2AJJ.mjs → UniversalVectorProvider-CAVX5VSQ.mjs} +2 -2
  9. package/dist/{WeaviateProvider-WIK2QN23.mjs → WeaviateProvider-DIYYBTEF.mjs} +2 -2
  10. package/dist/{chunk-RUKZC3ON.mjs → chunk-7XL3QSQ7.mjs} +1 -1
  11. package/dist/{chunk-VEJNRS4B.mjs → chunk-ENEUABSO.mjs} +1 -1
  12. package/dist/{chunk-IFPISZ2S.mjs → chunk-KGW2YHV2.mjs} +2 -8
  13. package/dist/{chunk-6GSARSCP.mjs → chunk-L54WODRW.mjs} +2 -8
  14. package/dist/{chunk-BMHJTWSU.mjs → chunk-M3AZTD7F.mjs} +3 -2
  15. package/dist/{chunk-HOMXEE3M.mjs → chunk-N2L5CFGM.mjs} +1 -1
  16. package/dist/{chunk-VKE5ZW7Y.mjs → chunk-Q2QDQ5SQ.mjs} +1 -1
  17. package/dist/{chunk-VV2ML6TM.mjs → chunk-R3GPRETL.mjs} +3 -2
  18. package/dist/{chunk-SNPFZBDK.mjs → chunk-TOKEXP3M.mjs} +42 -20
  19. package/dist/{chunk-W2PQR3UK.mjs → chunk-ULX4EF74.mjs} +1 -1
  20. package/dist/chunk-YVTGOFNV.mjs +23 -0
  21. package/dist/handlers/index.js +51 -27
  22. package/dist/handlers/index.mjs +1 -1
  23. package/dist/server.d.mts +5 -0
  24. package/dist/server.d.ts +5 -0
  25. package/dist/server.js +51 -27
  26. package/dist/server.mjs +11 -11
  27. package/package.json +1 -1
  28. package/src/llm/providers/GeminiProvider.ts +34 -6
  29. package/src/providers/vectordb/BaseVectorProvider.ts +13 -0
  30. package/src/providers/vectordb/MongoDBProvider.ts +1 -9
  31. package/src/providers/vectordb/PineconeProvider.ts +2 -1
  32. package/src/providers/vectordb/PostgreSQLProvider.ts +1 -9
  33. package/src/providers/vectordb/UniversalVectorProvider.ts +2 -1
  34. package/dist/chunk-VOIWNO5O.mjs +0 -11
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ChromaDBProvider
3
- } from "./chunk-VKE5ZW7Y.mjs";
4
- import "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-Q2QDQ5SQ.mjs";
4
+ import "./chunk-YVTGOFNV.mjs";
5
5
  import "./chunk-FWCSY2DS.mjs";
6
6
  export {
7
7
  ChromaDBProvider
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  MilvusProvider
3
- } from "./chunk-VEJNRS4B.mjs";
4
- import "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-ENEUABSO.mjs";
4
+ import "./chunk-YVTGOFNV.mjs";
5
5
  import "./chunk-FWCSY2DS.mjs";
6
6
  export {
7
7
  MilvusProvider
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  MongoDBProvider
3
- } from "./chunk-IFPISZ2S.mjs";
4
- import "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-KGW2YHV2.mjs";
4
+ import "./chunk-YVTGOFNV.mjs";
5
5
  import "./chunk-FWCSY2DS.mjs";
6
6
  export {
7
7
  MongoDBProvider
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  PineconeProvider
3
- } from "./chunk-BMHJTWSU.mjs";
4
- import "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-M3AZTD7F.mjs";
4
+ import "./chunk-YVTGOFNV.mjs";
5
5
  import "./chunk-FWCSY2DS.mjs";
6
6
  export {
7
7
  PineconeProvider
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  PostgreSQLProvider
3
- } from "./chunk-6GSARSCP.mjs";
4
- import "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-L54WODRW.mjs";
4
+ import "./chunk-YVTGOFNV.mjs";
5
5
  import "./chunk-FWCSY2DS.mjs";
6
6
  export {
7
7
  PostgreSQLProvider
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  QdrantProvider
3
- } from "./chunk-W2PQR3UK.mjs";
4
- import "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-ULX4EF74.mjs";
4
+ import "./chunk-YVTGOFNV.mjs";
5
5
  import "./chunk-FWCSY2DS.mjs";
6
6
  export {
7
7
  QdrantProvider
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  RedisProvider
3
- } from "./chunk-HOMXEE3M.mjs";
4
- import "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-N2L5CFGM.mjs";
4
+ import "./chunk-YVTGOFNV.mjs";
5
5
  import "./chunk-FWCSY2DS.mjs";
6
6
  export {
7
7
  RedisProvider
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  UniversalVectorProvider
3
- } from "./chunk-VV2ML6TM.mjs";
3
+ } from "./chunk-R3GPRETL.mjs";
4
4
  import "./chunk-EDLTMSNY.mjs";
5
- import "./chunk-VOIWNO5O.mjs";
5
+ import "./chunk-YVTGOFNV.mjs";
6
6
  import "./chunk-FWCSY2DS.mjs";
7
7
  export {
8
8
  UniversalVectorProvider
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  WeaviateProvider
3
- } from "./chunk-RUKZC3ON.mjs";
4
- import "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-7XL3QSQ7.mjs";
4
+ import "./chunk-YVTGOFNV.mjs";
5
5
  import "./chunk-FWCSY2DS.mjs";
6
6
  export {
7
7
  WeaviateProvider
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseVectorProvider
3
- } from "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-YVTGOFNV.mjs";
4
4
  import {
5
5
  __spreadValues
6
6
  } from "./chunk-FWCSY2DS.mjs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseVectorProvider
3
- } from "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-YVTGOFNV.mjs";
4
4
  import {
5
5
  __spreadValues
6
6
  } from "./chunk-FWCSY2DS.mjs";
@@ -1,18 +1,12 @@
1
1
  import {
2
2
  BaseVectorProvider
3
- } from "./chunk-VOIWNO5O.mjs";
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 = stripInternalFilterKeys(filter);
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-VOIWNO5O.mjs";
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 = stripInternalFilterKeys(filter);
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-VOIWNO5O.mjs";
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
- }, filter ? { filter } : {}));
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 {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseVectorProvider
3
- } from "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-YVTGOFNV.mjs";
4
4
  import {
5
5
  __spreadValues
6
6
  } from "./chunk-FWCSY2DS.mjs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseVectorProvider
3
- } from "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-YVTGOFNV.mjs";
4
4
  import {
5
5
  __spreadValues
6
6
  } from "./chunk-FWCSY2DS.mjs";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-EDLTMSNY.mjs";
5
5
  import {
6
6
  BaseVectorProvider
7
- } from "./chunk-VOIWNO5O.mjs";
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: filter != null ? 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
- this.embeddingConfig = embeddingConfig;
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 = (_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004";
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 (_j = (_i = (_h = response.embeddings) == null ? void 0 : _h[0]) == null ? void 0 : _i.values) != null ? _j : [];
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 = (_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004";
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 (_i = (_h = response.embeddings) == null ? void 0 : _h.map((e) => {
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 ? _i : [];
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-A47MRRYJ.mjs");
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-ILWADFAP.mjs");
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-KGO6N23T.mjs");
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-Y5FV5EAE.mjs");
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-OLPJK7CY.mjs");
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-T7TK3ONZ.mjs");
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-ANEJ3BHR.mjs");
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-WIK2QN23.mjs");
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-QJIV2AJJ.mjs");
1407
+ const { UniversalVectorProvider } = await import("./UniversalVectorProvider-CAVX5VSQ.mjs");
1386
1408
  return new UniversalVectorProvider(config);
1387
1409
  }
1388
1410
  default:
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  BaseVectorProvider
3
- } from "./chunk-VOIWNO5O.mjs";
3
+ } from "./chunk-YVTGOFNV.mjs";
4
4
  import {
5
5
  __spreadValues
6
6
  } from "./chunk-FWCSY2DS.mjs";
@@ -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
+ };
@@ -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
- }, filter ? { filter } : {}));
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 = stripInternalFilterKeys(filter);
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 = stripInternalFilterKeys2(filter);
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: filter != null ? 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
- this.embeddingConfig = embeddingConfig;
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 = (_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004";
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 (_j = (_i = (_h = response.embeddings) == null ? void 0 : _h[0]) == null ? void 0 : _i.values) != null ? _j : [];
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 = (_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004";
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 (_i = (_h = response.embeddings) == null ? void 0 : _h.map((e) => {
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 ? _i : [];
2277
+ })) != null ? _j : [];
2254
2278
  }
2255
2279
  async ping() {
2256
2280
  try {
@@ -3,7 +3,7 @@ import {
3
3
  createHealthHandler,
4
4
  createIngestHandler,
5
5
  createUploadHandler
6
- } from "../chunk-SNPFZBDK.mjs";
6
+ } from "../chunk-TOKEXP3M.mjs";
7
7
  import "../chunk-EDLTMSNY.mjs";
8
8
  import "../chunk-FWCSY2DS.mjs";
9
9
  export {
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
- }, filter ? { filter } : {}));
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 = stripInternalFilterKeys(filter);
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 = stripInternalFilterKeys2(filter);
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: filter != null ? 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
- this.embeddingConfig = embeddingConfig;
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 = (_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004";
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 (_j = (_i = (_h = response.embeddings) == null ? void 0 : _h[0]) == null ? void 0 : _i.values) != null ? _j : [];
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 = (_c = (_b = options == null ? void 0 : options.model) != null ? _b : (_a = this.embeddingConfig) == null ? void 0 : _a.model) != null ? _c : "text-embedding-004";
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 (_i = (_h = response.embeddings) == null ? void 0 : _h.map((e) => {
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 ? _i : [];
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-VKE5ZW7Y.mjs";
3
+ } from "./chunk-Q2QDQ5SQ.mjs";
4
4
  import {
5
5
  RedisProvider
6
- } from "./chunk-HOMXEE3M.mjs";
6
+ } from "./chunk-N2L5CFGM.mjs";
7
7
  import {
8
8
  WeaviateProvider
9
- } from "./chunk-RUKZC3ON.mjs";
9
+ } from "./chunk-7XL3QSQ7.mjs";
10
10
  import {
11
11
  UniversalVectorProvider
12
- } from "./chunk-VV2ML6TM.mjs";
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-SNPFZBDK.mjs";
37
+ } from "./chunk-TOKEXP3M.mjs";
38
38
  import "./chunk-EDLTMSNY.mjs";
39
39
  import {
40
40
  PineconeProvider
41
- } from "./chunk-BMHJTWSU.mjs";
41
+ } from "./chunk-M3AZTD7F.mjs";
42
42
  import {
43
43
  PostgreSQLProvider
44
- } from "./chunk-6GSARSCP.mjs";
44
+ } from "./chunk-L54WODRW.mjs";
45
45
  import {
46
46
  MongoDBProvider
47
- } from "./chunk-IFPISZ2S.mjs";
47
+ } from "./chunk-KGW2YHV2.mjs";
48
48
  import {
49
49
  MilvusProvider
50
- } from "./chunk-VEJNRS4B.mjs";
50
+ } from "./chunk-ENEUABSO.mjs";
51
51
  import {
52
52
  QdrantProvider
53
- } from "./chunk-W2PQR3UK.mjs";
53
+ } from "./chunk-ULX4EF74.mjs";
54
54
  import {
55
55
  BaseVectorProvider
56
- } from "./chunk-VOIWNO5O.mjs";
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",
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
- this.llmConfig = llmConfig;
30
- this.embeddingConfig = embeddingConfig;
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 = stripInternalFilterKeys(filter);
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
- ...(filter ? { filter } : {}),
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 = stripInternalFilterKeys(filter);
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: filter ?? {},
140
+ filter: sanitizedFilter,
140
141
  });
141
142
 
142
143
  try {
@@ -1,11 +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
-
9
- export {
10
- BaseVectorProvider
11
- };