@retrivora-ai/rag-engine 1.0.4 → 1.0.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 (39) hide show
  1. package/dist/DocumentChunker-Dh9TvmGG.d.mts +45 -0
  2. package/dist/DocumentChunker-Dh9TvmGG.d.ts +45 -0
  3. package/dist/{RagConfig-DRJO4hGU.d.mts → RagConfig-BEmz4hVP.d.mts} +58 -1
  4. package/dist/{RagConfig-DRJO4hGU.d.ts → RagConfig-BEmz4hVP.d.ts} +58 -1
  5. package/dist/{chunk-6MLZHQZT.mjs → chunk-MWL4AGQI.mjs} +189 -98
  6. package/dist/handlers/index.d.mts +2 -2
  7. package/dist/handlers/index.d.ts +2 -2
  8. package/dist/handlers/index.js +191 -100
  9. package/dist/handlers/index.mjs +11 -3
  10. package/dist/index-CSfaCeux.d.ts +206 -0
  11. package/dist/index-DFSy0CG6.d.mts +206 -0
  12. package/dist/index.d.mts +3 -4
  13. package/dist/index.d.ts +3 -4
  14. package/dist/index.js +103 -89
  15. package/dist/index.mjs +91 -95
  16. package/dist/server.d.mts +45 -97
  17. package/dist/server.d.ts +45 -97
  18. package/dist/server.js +271 -215
  19. package/dist/server.mjs +78 -167
  20. package/package.json +12 -10
  21. package/src/components/ChatWindow.tsx +2 -2
  22. package/src/components/ConfigProvider.tsx +2 -2
  23. package/src/components/MessageBubble.tsx +2 -2
  24. package/src/components/SourceCard.tsx +1 -1
  25. package/src/components/ThemeToggle.tsx +1 -1
  26. package/src/config/ConfigBuilder.ts +86 -211
  27. package/src/config/uiConstants.ts +23 -0
  28. package/src/core/ConfigResolver.ts +57 -29
  29. package/src/core/LangChainAgent.ts +73 -40
  30. package/src/core/Pipeline.ts +63 -7
  31. package/src/core/ProviderRegistry.ts +2 -2
  32. package/src/core/QueryProcessor.ts +9 -8
  33. package/src/handlers/index.ts +138 -49
  34. package/src/hooks/useRagChat.ts +71 -32
  35. package/src/server.ts +12 -2
  36. package/dist/DocumentChunker-C-sCZPhi.d.mts +0 -102
  37. package/dist/DocumentChunker-C-sCZPhi.d.ts +0 -102
  38. package/dist/index-B2mutkgp.d.ts +0 -116
  39. package/dist/index-Bjy0es5a.d.mts +0 -116
package/dist/server.mjs CHANGED
@@ -32,9 +32,15 @@ import {
32
32
  createChatHandler,
33
33
  createHealthHandler,
34
34
  createIngestHandler,
35
+ createStreamHandler,
35
36
  createUploadHandler,
36
- getRagConfig
37
- } from "./chunk-6MLZHQZT.mjs";
37
+ getRagConfig,
38
+ resetConfigCache,
39
+ sseErrorFrame,
40
+ sseFrame,
41
+ sseMetaFrame,
42
+ sseTextFrame
43
+ } from "./chunk-MWL4AGQI.mjs";
38
44
  import "./chunk-YLTMFW4M.mjs";
39
45
  import {
40
46
  PineconeProvider
@@ -62,21 +68,11 @@ import {
62
68
 
63
69
  // src/config/ConfigBuilder.ts
64
70
  var ConfigBuilder = class {
65
- constructor() {
66
- this.config = {
67
- projectId: "default-project",
68
- rag: {
69
- chunkSize: 1e3,
70
- chunkOverlap: 200,
71
- topK: 5
72
- }
73
- };
74
- }
75
71
  /**
76
72
  * Set the project/application ID for namespacing
77
73
  */
78
74
  projectId(id) {
79
- this.config.projectId = id;
75
+ this._projectId = id;
80
76
  return this;
81
77
  }
82
78
  /**
@@ -85,9 +81,9 @@ var ConfigBuilder = class {
85
81
  vectorDb(provider, options) {
86
82
  var _a;
87
83
  if (provider === "auto") {
88
- this.config.vectorDb = this.autoDetectVectorDb();
84
+ this._vectorDb = this._autoDetectVectorDb();
89
85
  } else {
90
- this.config.vectorDb = {
86
+ this._vectorDb = {
91
87
  provider,
92
88
  indexName: (_a = options == null ? void 0 : options.indexName) != null ? _a : "default",
93
89
  options: __spreadValues({}, options)
@@ -101,9 +97,9 @@ var ConfigBuilder = class {
101
97
  llm(provider, model, apiKey, options) {
102
98
  var _a, _b;
103
99
  if (provider === "auto") {
104
- this.config.llm = this.autoDetectLLM();
100
+ this._llm = this._autoDetectLLM();
105
101
  } else {
106
- this.config.llm = {
102
+ this._llm = {
107
103
  provider,
108
104
  model: model != null ? model : "default-model",
109
105
  apiKey,
@@ -121,9 +117,9 @@ var ConfigBuilder = class {
121
117
  */
122
118
  embedding(provider, model, apiKey, options) {
123
119
  if (provider === "auto") {
124
- this.config.embedding = this.autoDetectEmbedding();
120
+ this._embedding = this._autoDetectEmbedding();
125
121
  } else {
126
- this.config.embedding = {
122
+ this._embedding = {
127
123
  provider,
128
124
  model: model != null ? model : "default-embedding",
129
125
  apiKey,
@@ -134,26 +130,46 @@ var ConfigBuilder = class {
134
130
  return this;
135
131
  }
136
132
  /**
137
- * Set RAG-specific parameters
133
+ * Set RAG-specific pipeline parameters
138
134
  */
139
135
  rag(options) {
140
136
  var _a;
141
- this.config.rag = __spreadValues(__spreadValues({}, (_a = this.config.rag) != null ? _a : {}), options);
137
+ this._rag = __spreadValues(__spreadValues({}, (_a = this._rag) != null ? _a : {}), options);
142
138
  return this;
143
139
  }
144
140
  /**
145
- * Set UI/UX parameters
141
+ * Set UI branding and appearance options.
142
+ * Accepts the full UIConfig interface.
146
143
  */
147
144
  ui(options) {
148
- this.config.ui = options;
145
+ this._ui = options;
149
146
  return this;
150
147
  }
151
148
  /**
152
- * Build and return the configuration
149
+ * Build and return the final RagConfig.
150
+ * Throws if required fields (projectId, vectorDb, llm, embedding) are not set.
153
151
  */
154
152
  build() {
155
- const finalConfig = this.config;
156
- return finalConfig;
153
+ var _a;
154
+ const missing = [];
155
+ if (!this._projectId) missing.push('projectId (call .projectId("my-app"))');
156
+ if (!this._vectorDb) missing.push('vectorDb (call .vectorDb("pinecone", { ... }))');
157
+ if (!this._llm) missing.push('llm (call .llm("openai", "gpt-4o", apiKey))');
158
+ if (!this._embedding) missing.push('embedding (call .embedding("openai", "text-embedding-3-small"))');
159
+ if (missing.length > 0) {
160
+ throw new Error(
161
+ `[ConfigBuilder] Cannot build \u2014 required fields are missing:
162
+ ${missing.join("\n ")}`
163
+ );
164
+ }
165
+ return __spreadValues({
166
+ projectId: this._projectId,
167
+ vectorDb: this._vectorDb,
168
+ llm: this._llm,
169
+ embedding: this._embedding,
170
+ ui: this._rag ? this._ui : void 0,
171
+ rag: (_a = this._rag) != null ? _a : { chunkSize: 1e3, chunkOverlap: 200, topK: 5 }
172
+ }, this._ui ? { ui: this._ui } : {});
157
173
  }
158
174
  /**
159
175
  * Build and return as JSON for serialization
@@ -164,169 +180,58 @@ var ConfigBuilder = class {
164
180
  // ============================================================================
165
181
  // Private helper methods for auto-detection
166
182
  // ============================================================================
167
- autoDetectVectorDb() {
183
+ _autoDetectVectorDb() {
168
184
  if (process.env.PINECONE_API_KEY && process.env.PINECONE_INDEX) {
169
- return {
170
- provider: "pinecone",
171
- indexName: process.env.PINECONE_INDEX,
172
- options: { apiKey: process.env.PINECONE_API_KEY }
173
- };
185
+ return { provider: "pinecone", indexName: process.env.PINECONE_INDEX, options: { apiKey: process.env.PINECONE_API_KEY } };
174
186
  }
175
187
  if (process.env.QDRANT_URL) {
176
- return {
177
- provider: "qdrant",
178
- indexName: process.env.QDRANT_COLLECTION || "documents",
179
- options: {
180
- url: process.env.QDRANT_URL,
181
- apiKey: process.env.QDRANT_API_KEY
182
- }
183
- };
188
+ return { provider: "qdrant", indexName: process.env.QDRANT_COLLECTION || "documents", options: { url: process.env.QDRANT_URL, apiKey: process.env.QDRANT_API_KEY } };
184
189
  }
185
190
  if (process.env.DATABASE_URL) {
186
- return {
187
- provider: "postgresql",
188
- indexName: process.env.PG_TABLE || "documents",
189
- options: {
190
- connectionString: process.env.DATABASE_URL
191
- }
192
- };
191
+ return { provider: "postgresql", indexName: process.env.PG_TABLE || "documents", options: { connectionString: process.env.DATABASE_URL } };
193
192
  }
194
193
  if (process.env.MONGODB_URI) {
195
- return {
196
- provider: "mongodb",
197
- indexName: process.env.MONGODB_COLLECTION || "documents",
198
- options: {
199
- uri: process.env.MONGODB_URI,
200
- database: process.env.MONGODB_DB || "ai_db",
201
- collection: process.env.MONGODB_COLLECTION || "documents"
202
- }
203
- };
194
+ return { provider: "mongodb", indexName: process.env.MONGODB_COLLECTION || "documents", options: { uri: process.env.MONGODB_URI, database: process.env.MONGODB_DB || "ai_db", collection: process.env.MONGODB_COLLECTION || "documents" } };
204
195
  }
205
196
  if (process.env.REDIS_URL) {
206
- return {
207
- provider: "redis",
208
- indexName: process.env.REDIS_INDEX || "documents",
209
- options: {
210
- url: process.env.REDIS_URL
211
- }
212
- };
197
+ return { provider: "redis", indexName: process.env.REDIS_INDEX || "documents", options: { url: process.env.REDIS_URL } };
213
198
  }
214
- return {
215
- provider: "qdrant",
216
- indexName: "documents",
217
- options: {
218
- url: process.env.QDRANT_URL || "http://localhost:6333"
219
- }
220
- };
199
+ return { provider: "qdrant", indexName: "documents", options: { url: process.env.QDRANT_URL || "http://localhost:6333" } };
221
200
  }
222
- autoDetectLLM() {
201
+ _autoDetectLLM() {
223
202
  if (process.env.OPENAI_API_KEY) {
224
- return {
225
- provider: "openai",
226
- model: process.env.OPENAI_MODEL || "gpt-4o-mini",
227
- apiKey: process.env.OPENAI_API_KEY,
228
- maxTokens: parseInt(process.env.OPENAI_MAX_TOKENS || "1024"),
229
- temperature: parseFloat(process.env.OPENAI_TEMPERATURE || "0.7")
230
- };
203
+ return { provider: "openai", model: process.env.OPENAI_MODEL || "gpt-4o-mini", apiKey: process.env.OPENAI_API_KEY, maxTokens: parseInt(process.env.OPENAI_MAX_TOKENS || "1024"), temperature: parseFloat(process.env.OPENAI_TEMPERATURE || "0.7") };
231
204
  }
232
205
  if (process.env.ANTHROPIC_API_KEY) {
233
- return {
234
- provider: "anthropic",
235
- model: process.env.ANTHROPIC_MODEL || "claude-3-haiku-20240307",
236
- apiKey: process.env.ANTHROPIC_API_KEY,
237
- maxTokens: parseInt(process.env.ANTHROPIC_MAX_TOKENS || "1024"),
238
- temperature: parseFloat(process.env.ANTHROPIC_TEMPERATURE || "0.7")
239
- };
206
+ return { provider: "anthropic", model: process.env.ANTHROPIC_MODEL || "claude-3-haiku-20240307", apiKey: process.env.ANTHROPIC_API_KEY, maxTokens: parseInt(process.env.ANTHROPIC_MAX_TOKENS || "1024"), temperature: parseFloat(process.env.ANTHROPIC_TEMPERATURE || "0.7") };
240
207
  }
241
208
  if (process.env.OLLAMA_BASE_URL) {
242
- return {
243
- provider: "ollama",
244
- model: process.env.OLLAMA_MODEL || "mistral",
245
- baseUrl: process.env.OLLAMA_BASE_URL,
246
- maxTokens: parseInt(process.env.OLLAMA_MAX_TOKENS || "1024"),
247
- temperature: parseFloat(process.env.OLLAMA_TEMPERATURE || "0.7")
248
- };
209
+ return { provider: "ollama", model: process.env.OLLAMA_MODEL || "mistral", baseUrl: process.env.OLLAMA_BASE_URL, maxTokens: parseInt(process.env.OLLAMA_MAX_TOKENS || "1024"), temperature: parseFloat(process.env.OLLAMA_TEMPERATURE || "0.7") };
249
210
  }
250
- return {
251
- provider: "openai",
252
- model: "gpt-4o-mini",
253
- apiKey: process.env.OPENAI_API_KEY
254
- };
211
+ return { provider: "openai", model: "gpt-4o-mini", apiKey: process.env.OPENAI_API_KEY };
255
212
  }
256
- autoDetectEmbedding() {
213
+ _autoDetectEmbedding() {
257
214
  if (process.env.EMBEDDING_PROVIDER) {
258
- const provider = process.env.EMBEDDING_PROVIDER;
259
- return {
260
- provider,
261
- model: process.env.EMBEDDING_MODEL || "default",
262
- apiKey: process.env.EMBEDDING_API_KEY,
263
- baseUrl: process.env.EMBEDDING_BASE_URL
264
- };
215
+ return { provider: process.env.EMBEDDING_PROVIDER, model: process.env.EMBEDDING_MODEL || "default", apiKey: process.env.EMBEDDING_API_KEY, baseUrl: process.env.EMBEDDING_BASE_URL };
265
216
  }
266
- return {
267
- provider: "openai",
268
- model: "text-embedding-3-small",
269
- apiKey: process.env.OPENAI_API_KEY
270
- };
217
+ return { provider: "openai", model: "text-embedding-3-small", apiKey: process.env.OPENAI_API_KEY };
271
218
  }
272
219
  };
273
220
  var PRESETS = {
274
- /**
275
- * OpenAI + Pinecone: Production-ready cloud setup
276
- */
277
- "openai-pinecone": {
278
- vectorDb: "pinecone",
279
- llm: "openai",
280
- embedding: "openai"
281
- },
282
- /**
283
- * Claude + Qdrant: Open-source vector DB + proprietary LLM
284
- */
285
- "claude-qdrant": {
286
- vectorDb: "qdrant",
287
- llm: "anthropic",
288
- embedding: "openai"
289
- },
290
- /**
291
- * Local development: Ollama + local Qdrant
292
- */
293
- "local-dev": {
294
- vectorDb: "qdrant",
295
- llm: "ollama",
296
- embedding: "ollama"
297
- },
298
- /**
299
- * Fully open-source: Ollama LLM + Qdrant vector DB + Ollama embeddings
300
- */
301
- "fully-open-source": {
302
- vectorDb: "qdrant",
303
- llm: "ollama",
304
- embedding: "ollama"
305
- },
306
- /**
307
- * PostgreSQL stack: pgvector + OpenAI
308
- */
309
- "postgres-openai": {
310
- vectorDb: "postgresql",
311
- llm: "openai",
312
- embedding: "openai"
313
- },
314
- /**
315
- * Enterprise MongoDB: MongoDB Atlas with OpenAI
316
- */
317
- "mongodb-openai": {
318
- vectorDb: "mongodb",
319
- llm: "openai",
320
- embedding: "openai"
321
- },
322
- /**
323
- * Redis stack for caching + search
324
- */
325
- "redis-openai": {
326
- vectorDb: "redis",
327
- llm: "openai",
328
- embedding: "openai"
329
- }
221
+ /** OpenAI + Pinecone: Production-ready cloud setup */
222
+ "openai-pinecone": { vectorDb: "pinecone", llm: "openai", embedding: "openai" },
223
+ /** Claude + Qdrant: Open-source vector DB + proprietary LLM */
224
+ "claude-qdrant": { vectorDb: "qdrant", llm: "anthropic", embedding: "openai" },
225
+ /** Local development: Ollama + local Qdrant */
226
+ "local-dev": { vectorDb: "qdrant", llm: "ollama", embedding: "ollama" },
227
+ /** Fully open-source: Ollama LLM + Qdrant + Ollama embeddings */
228
+ "fully-open-source": { vectorDb: "qdrant", llm: "ollama", embedding: "ollama" },
229
+ /** PostgreSQL stack: pgvector + OpenAI */
230
+ "postgres-openai": { vectorDb: "postgresql", llm: "openai", embedding: "openai" },
231
+ /** Enterprise MongoDB: MongoDB Atlas with OpenAI */
232
+ "mongodb-openai": { vectorDb: "mongodb", llm: "openai", embedding: "openai" },
233
+ /** Redis stack for caching + search */
234
+ "redis-openai": { vectorDb: "redis", llm: "openai", embedding: "openai" }
330
235
  };
331
236
  function createFromPreset(presetName) {
332
237
  const preset = PRESETS[presetName];
@@ -564,6 +469,12 @@ export {
564
469
  createFromPreset,
565
470
  createHealthHandler,
566
471
  createIngestHandler,
472
+ createStreamHandler,
567
473
  createUploadHandler,
568
- getRagConfig
474
+ getRagConfig,
475
+ resetConfigCache,
476
+ sseErrorFrame,
477
+ sseFrame,
478
+ sseMetaFrame,
479
+ sseTextFrame
569
480
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retrivora-ai/rag-engine",
3
- "version": "1.0.4",
3
+ "version": "1.0.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",
@@ -73,7 +73,7 @@
73
73
  "scripts": {
74
74
  "dev": "next dev",
75
75
  "build": "next build",
76
- "build:pkg": "tsup src/index.ts src/handlers/index.ts src/server.ts --format cjs,esm --dts --clean --tsconfig tsconfig.build.json --external react,react-dom,next,mongodb,pg,openai,@anthropic-ai/sdk,@pinecone-database/pinecone,axios,lucide-react,mammoth,pdf-parse,react-markdown,remark-gfm,next-themes",
76
+ "build:pkg": "tsup src/index.ts src/handlers/index.ts src/server.ts --format cjs,esm --dts --clean --tsconfig tsconfig.build.json --external react,react-dom,next,mongodb,pg,openai,@anthropic-ai/sdk,@pinecone-database/pinecone,axios,lucide-react,mammoth,pdf-parse,react-markdown,remark-gfm,next-themes,langchain,@langchain/core,@langchain/openai,llamaindex",
77
77
  "start": "next start",
78
78
  "lint": "eslint",
79
79
  "prepublishOnly": "npm run build:pkg"
@@ -86,25 +86,27 @@
86
86
  "dependencies": {
87
87
  "@anthropic-ai/sdk": "^0.90.0",
88
88
  "@google/genai": "^1.50.1",
89
- "@langchain/core": "^1.1.42",
90
- "@langchain/openai": "^1.4.5",
91
89
  "@pinecone-database/pinecone": "^7.2.0",
92
90
  "axios": "^1.15.0",
93
- "langchain": "^1.3.5",
94
- "llamaindex": "^0.12.1",
95
91
  "lucide-react": "^1.8.0",
96
- "mammoth": "^1.8.0",
97
- "mongodb": "^7.1.1",
98
92
  "next": ">=14.0.0",
99
93
  "next-themes": "^0.4.6",
100
94
  "openai": "^6.34.0",
101
- "pdf-parse": "^1.1.1",
102
- "pg": "^8.20.0",
103
95
  "react": ">=18.0.0",
104
96
  "react-dom": ">=18.0.0",
105
97
  "react-markdown": "^10.1.0",
106
98
  "remark-gfm": "^4.0.1"
107
99
  },
100
+ "optionalDependencies": {
101
+ "@langchain/core": "^1.1.42",
102
+ "@langchain/openai": "^1.4.5",
103
+ "langchain": "^1.3.5",
104
+ "llamaindex": "^0.12.1",
105
+ "mammoth": "^1.8.0",
106
+ "mongodb": "^7.1.1",
107
+ "pdf-parse": "^1.1.1",
108
+ "pg": "^8.20.0"
109
+ },
108
110
  "devDependencies": {
109
111
  "@tailwindcss/postcss": "^4",
110
112
  "@types/node": "^20",
@@ -11,8 +11,8 @@ import {
11
11
  } from 'lucide-react';
12
12
  import { MessageBubble } from './MessageBubble';
13
13
  import { useConfig } from './ConfigProvider';
14
- import { useRagChat } from '@/hooks/useRagChat';
15
- import { BORDER_RADIUS_MAP, CHAT_SUGGESTIONS } from '@/app/constants';
14
+ import { useRagChat } from '../hooks/useRagChat';
15
+ import { BORDER_RADIUS_MAP, CHAT_SUGGESTIONS } from '../config/uiConstants';
16
16
 
17
17
  interface ChatWindowProps {
18
18
  /** Additional className for the wrapper div */
@@ -8,8 +8,8 @@
8
8
  */
9
9
 
10
10
  import React, { createContext, useContext, ReactNode } from 'react';
11
- import { UIConfig } from '@/config/RagConfig';
12
- import { mergeDefined } from '@/utils/templateUtils';
11
+ import { UIConfig } from '../config/RagConfig';
12
+ import { mergeDefined } from '../utils/templateUtils';
13
13
 
14
14
  export interface ClientConfig {
15
15
  projectId: string;
@@ -4,8 +4,8 @@ import React from 'react';
4
4
  import { Bot, User, ChevronDown, ChevronRight } from 'lucide-react';
5
5
  import ReactMarkdown from 'react-markdown';
6
6
  import remarkGfm from 'remark-gfm';
7
- import { ChatMessage } from '@/llm/ILLMProvider';
8
- import { VectorMatch } from '@/types';
7
+ import { ChatMessage } from '../llm/ILLMProvider';
8
+ import { VectorMatch } from '../types';
9
9
  import { SourceCard } from './SourceCard';
10
10
 
11
11
  interface MessageBubbleProps {
@@ -2,7 +2,7 @@
2
2
 
3
3
  import React from 'react';
4
4
  import { ChevronDown, ChevronUp } from 'lucide-react';
5
- import { VectorMatch } from '@/types';
5
+ import { VectorMatch } from '../types';
6
6
 
7
7
  interface SourceCardProps {
8
8
  source: VectorMatch;
@@ -3,7 +3,7 @@
3
3
  import * as React from 'react';
4
4
  import { Moon, Sun } from 'lucide-react';
5
5
  import { useTheme } from 'next-themes';
6
- import { useHydrated } from '@/hooks/useHydrated';
6
+ import { useHydrated } from '../hooks/useHydrated';
7
7
 
8
8
  export function ThemeToggle() {
9
9
  const { theme, setTheme } = useTheme();