@retrivora-ai/rag-engine 1.8.0 → 1.8.2

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 (71) hide show
  1. package/dist/DocumentChunker-Dh9TvmGG.d.mts +45 -0
  2. package/dist/DocumentChunker-Dh9TvmGG.d.ts +45 -0
  3. package/dist/{index-DPsQodME.d.mts → ILLMProvider-BOJFz3Na.d.mts} +104 -1
  4. package/dist/{index-DPsQodME.d.ts → ILLMProvider-BOJFz3Na.d.ts} +104 -1
  5. package/dist/MultiTablePostgresProvider-ZLGSKTJR.mjs +8 -0
  6. package/dist/chunk-ICKRMZQK.mjs +76 -0
  7. package/dist/{chunk-PV3MFHWU.mjs → chunk-LZVVLSDN.mjs} +977 -516
  8. package/dist/chunk-OZFBG4BA.mjs +291 -0
  9. package/dist/handlers/index.d.mts +2 -2
  10. package/dist/handlers/index.d.ts +2 -2
  11. package/dist/handlers/index.js +1269 -656
  12. package/dist/handlers/index.mjs +4 -1
  13. package/dist/{index-Bb2yEopi.d.mts → index-BwpcaziY.d.ts} +10 -2
  14. package/dist/{index-CkbTzj9J.d.ts → index-D3V9Et2M.d.mts} +10 -2
  15. package/dist/index.d.mts +24 -4
  16. package/dist/index.d.ts +24 -4
  17. package/dist/index.js +1354 -826
  18. package/dist/index.mjs +1284 -795
  19. package/dist/server.d.mts +47 -27
  20. package/dist/server.d.ts +47 -27
  21. package/dist/server.js +1417 -829
  22. package/dist/server.mjs +164 -176
  23. package/package.json +6 -2
  24. package/src/app/api/upload/route.ts +4 -0
  25. package/src/app/constants.tsx +2 -2
  26. package/src/app/page.tsx +12 -322
  27. package/src/components/AmbientBackground.tsx +29 -0
  28. package/src/components/ArchitectureCard.tsx +17 -0
  29. package/src/components/ArchitectureCardsSection.tsx +15 -0
  30. package/src/components/ChatWindow.tsx +32 -0
  31. package/src/components/CodeViewer.tsx +51 -0
  32. package/src/components/ConfigProvider.tsx +1 -0
  33. package/src/components/DocViewer.tsx +37 -0
  34. package/src/components/DocumentUpload.tsx +44 -1
  35. package/src/components/Documentation.tsx +58 -0
  36. package/src/components/DynamicChart.tsx +27 -2
  37. package/src/components/Hero.tsx +59 -0
  38. package/src/components/HourglassLoader.tsx +87 -0
  39. package/src/components/Lifecycle.tsx +37 -0
  40. package/src/components/MarkdownComponents.tsx +140 -0
  41. package/src/components/MessageBubble.tsx +124 -904
  42. package/src/components/Navbar.tsx +55 -0
  43. package/src/components/ObservabilityPanel.tsx +374 -0
  44. package/src/components/ProductCard.tsx +5 -3
  45. package/src/components/UIDispatcher.tsx +344 -0
  46. package/src/components/VisualizationRenderer.tsx +372 -250
  47. package/src/config/RagConfig.ts +5 -0
  48. package/src/config/serverConfig.ts +3 -1
  49. package/src/core/Pipeline.ts +240 -271
  50. package/src/core/ProviderRegistry.ts +2 -2
  51. package/src/core/VectorPlugin.ts +9 -0
  52. package/src/handlers/index.ts +91 -15
  53. package/src/hooks/useRagChat.ts +21 -11
  54. package/src/index.ts +9 -1
  55. package/src/llm/LLMFactory.ts +54 -2
  56. package/src/llm/providers/AnthropicProvider.ts +12 -8
  57. package/src/llm/providers/GeminiProvider.ts +188 -143
  58. package/src/llm/providers/OllamaProvider.ts +7 -3
  59. package/src/llm/providers/OpenAIProvider.ts +12 -8
  60. package/src/providers/vectordb/MultiTablePostgresProvider.ts +150 -64
  61. package/src/types/chat.ts +8 -0
  62. package/src/types/index.ts +132 -0
  63. package/src/types/props.ts +9 -1
  64. package/src/utils/ProductExtractor.ts +347 -0
  65. package/src/utils/SchemaMapper.ts +129 -0
  66. package/src/utils/UITransformer.ts +470 -209
  67. package/src/utils/synonyms.ts +78 -0
  68. package/dist/DocumentChunker-C1GEEosY.d.ts +0 -93
  69. package/dist/DocumentChunker-CFEiRopR.d.mts +0 -93
  70. package/dist/PostgreSQLProvider-BMOETDZA.mjs +0 -8
  71. package/dist/chunk-FLOSGE6A.mjs +0 -202
package/dist/server.mjs CHANGED
@@ -39,14 +39,15 @@ import {
39
39
  sseFrame,
40
40
  sseMetaFrame,
41
41
  sseTextFrame
42
- } from "./chunk-PV3MFHWU.mjs";
42
+ } from "./chunk-LZVVLSDN.mjs";
43
+ import "./chunk-ICKRMZQK.mjs";
43
44
  import "./chunk-YLTMFW4M.mjs";
44
45
  import {
45
46
  PineconeProvider
46
47
  } from "./chunk-VUQJVIJT.mjs";
47
48
  import {
48
- PostgreSQLProvider
49
- } from "./chunk-FLOSGE6A.mjs";
49
+ MultiTablePostgresProvider
50
+ } from "./chunk-OZFBG4BA.mjs";
50
51
  import {
51
52
  MongoDBProvider
52
53
  } from "./chunk-5AJ4XHLW.mjs";
@@ -60,8 +61,6 @@ import {
60
61
  BaseVectorProvider
61
62
  } from "./chunk-IMP6FUCY.mjs";
62
63
  import {
63
- __objRest,
64
- __spreadProps,
65
64
  __spreadValues
66
65
  } from "./chunk-X4TOT24V.mjs";
67
66
 
@@ -237,196 +236,187 @@ function createFromPreset(presetName) {
237
236
  return new ConfigBuilder().vectorDb(preset.vectorDb, { apiKey: process.env[`${preset.vectorDb.toUpperCase()}_API_KEY`] }).llm(preset.llm, void 0, process.env[`${preset.llm.toUpperCase()}_API_KEY`]).embedding(preset.embedding, void 0, process.env[`${preset.embedding.toUpperCase()}_API_KEY`]);
238
237
  }
239
238
 
240
- // src/providers/vectordb/MultiTablePostgresProvider.ts
239
+ // src/providers/vectordb/PostgreSQLProvider.ts
241
240
  import { Pool } from "pg";
242
- var MultiTablePostgresProvider = class extends BaseVectorProvider {
241
+ var PostgreSQLProvider = class extends BaseVectorProvider {
243
242
  constructor(config) {
244
- var _a, _b, _c, _d, _e;
243
+ var _a;
245
244
  super(config);
246
- const opts = config.options || {};
247
- if (!opts.connectionString) {
248
- throw new Error("[MultiTablePostgresProvider] options.connectionString is required");
249
- }
245
+ this.tableName = this.indexName.replace(/[^a-z0-9_]/gi, "_");
246
+ const opts = config.options;
247
+ if (!opts.connectionString) throw new Error("[PostgreSQLProvider] options.connectionString is required");
250
248
  this.connectionString = opts.connectionString;
251
- this.dimensions = (_a = opts.dimensions) != null ? _a : 768;
252
- const rawTables = (_c = (_b = opts.tables) != null ? _b : process.env.VECTOR_DB_TABLES) != null ? _c : "";
253
- this.tables = typeof rawTables === "string" ? rawTables.split(",").map((t) => t.trim()).filter(Boolean) : rawTables;
254
- if (this.tables.length === 0) {
255
- console.warn(
256
- "[MultiTablePostgresProvider] No tables configured. Set VECTOR_DB_TABLES as a comma-separated list of table names or pass options.tables."
257
- );
258
- }
259
- const rawSearchFields = (_e = (_d = opts.searchFields) != null ? _d : process.env.VECTOR_DB_SEARCH_FIELDS) != null ? _e : ["name", "product_name", "productname", "title"];
260
- this.searchFields = typeof rawSearchFields === "string" ? rawSearchFields.split(",").map((f) => f.trim()).filter(Boolean) : rawSearchFields;
249
+ this.dimensions = (_a = opts.dimensions) != null ? _a : 1536;
250
+ }
251
+ static getValidator() {
252
+ return {
253
+ validate(config) {
254
+ const errors = [];
255
+ const opts = config.options || {};
256
+ if (!opts.connectionString) {
257
+ errors.push({
258
+ field: "vectorDb.options.connectionString",
259
+ message: "PostgreSQL connection string is required",
260
+ suggestion: "Set PGVECTOR_CONNECTION_STRING environment variable",
261
+ severity: "error"
262
+ });
263
+ }
264
+ if (opts.tables && typeof opts.tables !== "string" && !Array.isArray(opts.tables)) {
265
+ errors.push({
266
+ field: "vectorDb.options.tables",
267
+ message: "PostgreSQL tables must be a string or a string array",
268
+ severity: "error"
269
+ });
270
+ }
271
+ return errors;
272
+ }
273
+ };
274
+ }
275
+ static getHealthChecker() {
276
+ return {
277
+ async check(config) {
278
+ const opts = config.options || {};
279
+ const timestamp = Date.now();
280
+ try {
281
+ const { Client } = await import("pg");
282
+ const client = new Client({ connectionString: opts.connectionString });
283
+ await client.connect();
284
+ const result = await client.query(`
285
+ SELECT EXISTS(SELECT 1 FROM pg_extension WHERE extname = 'vector');
286
+ `);
287
+ const hasVector = result.rows[0].exists;
288
+ await client.end();
289
+ return {
290
+ healthy: true,
291
+ provider: "postgresql",
292
+ capabilities: { pgvectorInstalled: hasVector },
293
+ timestamp
294
+ };
295
+ } catch (error) {
296
+ return {
297
+ healthy: false,
298
+ provider: "postgresql",
299
+ error: `Connection failed: ${error instanceof Error ? error.message : String(error)}`,
300
+ timestamp
301
+ };
302
+ }
303
+ }
304
+ };
261
305
  }
262
306
  async initialize() {
263
307
  this.pool = new Pool({ connectionString: this.connectionString });
264
308
  const client = await this.pool.connect();
265
309
  try {
266
- const res = await client.query(`
267
- SELECT table_name
268
- FROM information_schema.columns
269
- WHERE column_name = 'embedding'
270
- AND table_schema = 'public'
310
+ await client.query("CREATE EXTENSION IF NOT EXISTS vector");
311
+ await client.query(`
312
+ CREATE TABLE IF NOT EXISTS ${this.tableName} (
313
+ id TEXT PRIMARY KEY,
314
+ namespace TEXT NOT NULL DEFAULT '',
315
+ content TEXT NOT NULL,
316
+ metadata JSONB,
317
+ embedding VECTOR(${this.dimensions})
318
+ )
319
+ `);
320
+ await client.query(`
321
+ CREATE INDEX IF NOT EXISTS ${this.tableName}_embedding_idx
322
+ ON ${this.tableName}
323
+ USING hnsw (embedding vector_cosine_ops)
271
324
  `);
272
- const discoveredTables = res.rows.map((r) => r.table_name);
273
- if (this.tables.length === 0) {
274
- this.tables = discoveredTables;
275
- } else {
276
- const staticTables = [...this.tables];
277
- this.tables = staticTables.filter((t) => discoveredTables.includes(t));
278
- if (this.tables.length < staticTables.length) {
279
- const missing = staticTables.filter((t) => !discoveredTables.includes(t));
280
- console.warn(`[MultiTablePostgresProvider] Some configured tables were skipped (missing 'embedding' column): ${missing.join(", ")}`);
281
- }
282
- }
283
- if (this.tables.length === 0) {
284
- console.warn('[MultiTablePostgresProvider] No tables with "embedding" columns found in the database.');
285
- } else {
286
- console.log(
287
- `[MultiTablePostgresProvider] Connected. Searching across ${this.tables.length} table(s): ${this.tables.join(", ")}`
288
- );
289
- }
290
325
  } finally {
291
326
  client.release();
292
327
  }
293
328
  }
294
- /**
295
- * Upsert is not supported for MultiTablePostgresProvider as it's designed for
296
- * searching across pre-existing tables with varying schemas.
297
- */
298
- async upsert(_doc, _namespace) {
299
- throw new Error(
300
- "[MultiTablePostgresProvider] upsert() is not supported in multi-table mode. Please use the standard PostgreSQLProvider for single-table managed indices."
301
- );
302
- }
303
- /**
304
- * Batch upsert is not supported for MultiTablePostgresProvider.
305
- */
306
- async batchUpsert(_docs, _namespace) {
307
- throw new Error(
308
- "[MultiTablePostgresProvider] batchUpsert() is not supported in multi-table mode."
329
+ async upsert(doc, namespace = "") {
330
+ var _a;
331
+ const vectorLiteral = `[${doc.vector.join(",")}]`;
332
+ await this.pool.query(
333
+ `INSERT INTO ${this.tableName} (id, namespace, content, metadata, embedding)
334
+ VALUES ($1, $2, $3, $4, $5::vector)
335
+ ON CONFLICT (id) DO UPDATE
336
+ SET namespace = EXCLUDED.namespace,
337
+ content = EXCLUDED.content,
338
+ metadata = EXCLUDED.metadata,
339
+ embedding = EXCLUDED.embedding`,
340
+ [doc.id, namespace, doc.content, JSON.stringify((_a = doc.metadata) != null ? _a : {}), vectorLiteral]
309
341
  );
310
342
  }
311
- /**
312
- * Query all configured tables and merge results, sorted by cosine similarity score.
313
- */
314
- async query(vector, topK, _namespace, _filter) {
315
- var _a, _b, _c;
316
- if (!this.pool) {
317
- throw new Error("[MultiTablePostgresProvider] Provider not initialized. Call initialize() first.");
318
- }
319
- const vectorLiteral = `[${vector.join(",")}]`;
320
- const allResults = [];
321
- console.log(`[MultiTablePostgresProvider] --- Starting Multi-Table Search ---`);
322
- const queryText = _filter == null ? void 0 : _filter.queryText;
323
- const entityHints = Array.isArray(_filter == null ? void 0 : _filter.__entityHints) ? _filter.__entityHints.filter(
324
- (hint) => typeof hint === "object" && hint !== null && typeof hint.value === "string"
325
- ).map((hint) => hint.value.trim().toLowerCase()).filter(Boolean) : [];
326
- console.log(`[MultiTablePostgresProvider] queryText: "${queryText}"`);
327
- console.log(`[MultiTablePostgresProvider] entityHints: [${entityHints.join(", ")}]`);
328
- const getDynamicKeywordQuery = () => {
329
- if (entityHints.length > 0) {
330
- return entityHints.map((h) => h.includes(" ") ? `"${h}"` : h).join(" & ");
331
- }
332
- if (queryText) {
333
- return queryText.toLowerCase().replace(/\b(show|me|the|product[s]?|item[s]?|card[s]?|of|category|find|list|browse|what|are|display|all|under|for|in|with|about)\b/g, "").trim().replace(/\s+/g, " & ");
334
- }
335
- return "";
336
- };
337
- const dynamicKeywordQuery = getDynamicKeywordQuery();
338
- const queryPromises = this.tables.map(async (table) => {
339
- try {
340
- let sqlQuery = "";
341
- let params = [];
342
- if (queryText) {
343
- const hasEntityHints = entityHints.length > 0;
344
- const exactNameScoreExpr = hasEntityHints ? `+ (
345
- SELECT COALESCE(MAX(
346
- CASE WHEN LOWER(val) IN (${entityHints.map((h) => `'${h.replace(/'/g, "''")}'`).join(", ")})
347
- THEN 1.0 ELSE 0.0 END
348
- ), 0)
349
- FROM jsonb_each_text(to_jsonb(t)) AS kv(key, val)
350
- WHERE key IN (${this.searchFields.map((f) => `'${f}'`).join(", ")})
351
- ) * 3.0` : "";
352
- sqlQuery = `
353
- SELECT *,
354
- (1 - (embedding <=> $1::vector)) AS vector_score,
355
- COALESCE(ts_rank(to_tsvector('english', (to_jsonb(t) - 'embedding')::text), to_tsquery('english', $2)), 0) AS keyword_score,
356
- ((1 - (embedding <=> $1::vector)) + (COALESCE(ts_rank(to_tsvector('english', (to_jsonb(t) - 'embedding')::text), to_tsquery('english', $2)), 0) * 2.0) ${exactNameScoreExpr}) AS hybrid_score
357
- FROM "${table}" t
358
- ORDER BY hybrid_score DESC
359
- LIMIT 50
360
- `;
361
- params = [vectorLiteral, dynamicKeywordQuery];
362
- } else {
363
- sqlQuery = `
364
- SELECT *,
365
- (1 - (embedding <=> $1::vector)) AS hybrid_score
366
- FROM "${table}" t
367
- ORDER BY hybrid_score DESC
368
- LIMIT 50
369
- `;
370
- params = [vectorLiteral];
371
- }
372
- const result = await this.pool.query(sqlQuery, params);
373
- if (result.rowCount && result.rowCount > 0) {
374
- console.log(` \u2705 Table "${table}": Found ${result.rowCount} potential matches. Top score: ${result.rows[0].hybrid_score.toFixed(4)}`);
375
- } else {
376
- console.log(` \u26AA Table "${table}": No relevant matches found.`);
377
- }
378
- const tableResults = [];
379
- for (const row of result.rows) {
380
- const _a2 = row, { hybrid_score, id } = _a2, rest = __objRest(_a2, ["hybrid_score", "id"]);
381
- delete rest.embedding;
382
- delete rest.vector_score;
383
- delete rest.keyword_score;
384
- delete rest.exact_name_score;
385
- const content = `[TYPE: ${table.replace(/s$/, "").toUpperCase()}]
386
- ` + Object.entries(rest).filter(([k, v]) => v !== null && typeof v !== "object" && k !== "id").map(([k, v]) => `${k}: ${v}`).join("\n");
387
- tableResults.push({
388
- id: `${table}-${id}`,
389
- score: parseFloat(String(hybrid_score)),
390
- content,
391
- metadata: __spreadProps(__spreadValues({}, rest), { source_table: table })
392
- });
393
- }
394
- return tableResults;
395
- } catch (err) {
396
- console.error(
397
- `[MultiTablePostgresProvider] Error querying table "${table}":`,
398
- err.message
399
- );
400
- return [];
343
+ async batchUpsert(docs, namespace = "") {
344
+ if (docs.length === 0) return;
345
+ const client = await this.pool.connect();
346
+ try {
347
+ await client.query("BEGIN");
348
+ const BATCH_SIZE = 50;
349
+ for (let i = 0; i < docs.length; i += BATCH_SIZE) {
350
+ const batch = docs.slice(i, i + BATCH_SIZE);
351
+ const values = [];
352
+ const valuePlaceholders = batch.map((doc, idx) => {
353
+ var _a;
354
+ const offset = idx * 5;
355
+ values.push(doc.id, namespace, doc.content, JSON.stringify((_a = doc.metadata) != null ? _a : {}), `[${doc.vector.join(",")}]`);
356
+ return `($${offset + 1}, $${offset + 2}, $${offset + 3}, $${offset + 4}, $${offset + 5}::vector)`;
357
+ }).join(", ");
358
+ const query = `
359
+ INSERT INTO ${this.tableName} (id, namespace, content, metadata, embedding)
360
+ VALUES ${valuePlaceholders}
361
+ ON CONFLICT (id) DO UPDATE
362
+ SET namespace = EXCLUDED.namespace,
363
+ content = EXCLUDED.content,
364
+ metadata = EXCLUDED.metadata,
365
+ embedding = EXCLUDED.embedding
366
+ `;
367
+ await client.query(query, values);
401
368
  }
402
- });
403
- const resultsArray = await Promise.all(queryPromises);
404
- for (const tableResults of resultsArray) {
405
- allResults.push(...tableResults);
406
- }
407
- const resultsByTable = {};
408
- for (const res of allResults) {
409
- const table = (_a = res.metadata) == null ? void 0 : _a.source_table;
410
- if (!resultsByTable[table]) resultsByTable[table] = [];
411
- resultsByTable[table].push(res);
369
+ await client.query("COMMIT");
370
+ } catch (error) {
371
+ await client.query("ROLLBACK");
372
+ throw error;
373
+ } finally {
374
+ client.release();
412
375
  }
413
- const balancedResults = [];
414
- const tables = Object.keys(resultsByTable);
415
- for (const table of tables) {
416
- balancedResults.push(...resultsByTable[table].slice(0, 3));
376
+ }
377
+ async query(vector, topK, namespace, filter) {
378
+ const vectorLiteral = `[${vector.join(",")}]`;
379
+ let whereClause = namespace ? `WHERE namespace = $3` : "";
380
+ const params = [vectorLiteral, topK];
381
+ if (namespace) params.push(namespace);
382
+ const publicFilter = this.sanitizeFilter(filter);
383
+ if (Object.keys(publicFilter).length > 0) {
384
+ const filterConditions = Object.entries(publicFilter).map(([key, val]) => {
385
+ const paramIdx = params.length + 1;
386
+ params.push(JSON.stringify(val));
387
+ return `metadata->>'${key}' = $${paramIdx}`;
388
+ }).join(" AND ");
389
+ whereClause = whereClause ? `${whereClause} AND ${filterConditions}` : `WHERE ${filterConditions}`;
417
390
  }
418
- const finalSorted = balancedResults.sort((a, b) => b.score - a.score);
419
- if (finalSorted.length > 0) {
420
- console.log(`[MultiTablePostgresProvider] --- Search Complete ---`);
421
- console.log(`[MultiTablePostgresProvider] Final top match from "${(_c = (_b = finalSorted[0].metadata) == null ? void 0 : _b.source_table) != null ? _c : "unknown"}" with score ${finalSorted[0].score.toFixed(4)}`);
391
+ const client = await this.pool.connect();
392
+ try {
393
+ const efSearch = this.config.options.efSearch || Math.max(topK * 10, 40);
394
+ await client.query(`SET LOCAL hnsw.ef_search = ${efSearch}`);
395
+ const result = await client.query(
396
+ `SELECT id, content, metadata, 1 - (embedding <=> $1::vector) AS score
397
+ FROM ${this.tableName}
398
+ ${whereClause}
399
+ ORDER BY embedding <=> $1::vector
400
+ LIMIT $2`,
401
+ params
402
+ );
403
+ return result.rows.map((row) => ({
404
+ id: String(row["id"]),
405
+ score: parseFloat(String(row["score"])),
406
+ content: String(row["content"]),
407
+ metadata: row["metadata"]
408
+ }));
409
+ } finally {
410
+ client.release();
422
411
  }
423
- return finalSorted.slice(0, Math.max(topK, 15));
424
412
  }
425
- async delete(_id, _namespace) {
426
- console.warn("[MultiTablePostgresProvider] delete() is a no-op for multi-table mode.");
413
+ async delete(id, namespace) {
414
+ const where = namespace ? "WHERE id = $1 AND namespace = $2" : "WHERE id = $1";
415
+ const params = namespace ? [id, namespace] : [id];
416
+ await this.pool.query(`DELETE FROM ${this.tableName} ${where}`, params);
427
417
  }
428
- async deleteNamespace(_namespace) {
429
- console.warn("[MultiTablePostgresProvider] deleteNamespace() is a no-op for multi-table mode.");
418
+ async deleteNamespace(namespace) {
419
+ await this.pool.query(`DELETE FROM ${this.tableName} WHERE namespace = $1`, [namespace]);
430
420
  }
431
421
  async ping() {
432
422
  try {
@@ -437,9 +427,7 @@ var MultiTablePostgresProvider = class extends BaseVectorProvider {
437
427
  }
438
428
  }
439
429
  async disconnect() {
440
- if (this.pool) {
441
- await this.pool.end();
442
- }
430
+ await this.pool.end();
443
431
  }
444
432
  };
445
433
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retrivora-ai/rag-engine",
3
- "version": "1.8.0",
3
+ "version": "1.8.2",
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",
@@ -85,15 +85,19 @@
85
85
  },
86
86
  "dependencies": {
87
87
  "@anthropic-ai/sdk": "^0.90.0",
88
- "@google/genai": "^1.50.1",
88
+ "@google/genai": "^0.8.0",
89
+ "@google/generative-ai": "^0.24.1",
89
90
  "@pinecone-database/pinecone": "^7.2.0",
91
+ "@types/papaparse": "^5.5.2",
90
92
  "axios": "^1.15.0",
91
93
  "lucide-react": "^1.8.0",
92
94
  "next": ">=14.0.0",
93
95
  "next-themes": "^0.4.6",
94
96
  "openai": "^6.34.0",
97
+ "papaparse": "^5.5.3",
95
98
  "react": ">=18.0.0",
96
99
  "react-dom": ">=18.0.0",
100
+ "react-is": "^18.3.1",
97
101
  "react-markdown": "^10.1.0",
98
102
  "recharts": "^3.8.1",
99
103
  "remark-gfm": "^4.0.1"
@@ -0,0 +1,4 @@
1
+ import { createUploadHandler } from '@/handlers';
2
+ import { getRagConfig } from '@/config/serverConfig';
3
+
4
+ export const POST = createUploadHandler(getRagConfig());
@@ -112,12 +112,12 @@ const { reply, sources } = await pipeline.ask('How does Retrivora work?');`,
112
112
  title: 'Route Handlers',
113
113
  language: 'typescript',
114
114
  description: 'Deploy production-ready API endpoints in seconds using pre-built factories.',
115
- code: `import { createChatHandler, createUploadHandler, getRagConfig } from '@retrivora-ai/rag-engine/server';
115
+ code: `import { createChatStreamHandler, createUploadHandler, getRagConfig } from '@retrivora-ai/rag-engine/server';
116
116
 
117
117
  const config = getRagConfig();
118
118
 
119
119
  // src/app/api/chat/route.ts
120
- export const POST = createChatHandler(config);
120
+ export const POST = createChatStreamHandler(config);
121
121
 
122
122
  // src/app/api/upload/route.ts
123
123
  export const POST = createUploadHandler(config);`,