@retrivora-ai/rag-engine 1.9.6 → 1.9.7

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 (44) hide show
  1. package/README.md +32 -7
  2. package/dist/{ILLMProvider-DNhyOYoK.d.mts → ILLMProvider-Bhk6zJOK.d.mts} +2 -6
  3. package/dist/{ILLMProvider-DNhyOYoK.d.ts → ILLMProvider-Bhk6zJOK.d.ts} +2 -6
  4. package/dist/handlers/index.d.mts +2 -2
  5. package/dist/handlers/index.d.ts +2 -2
  6. package/dist/handlers/index.js +213 -67
  7. package/dist/handlers/index.mjs +212 -67
  8. package/dist/{index-CjQdL0cX.d.ts → index-B9J_XEh0.d.ts} +6 -2
  9. package/dist/{index-C9v7-tWd.d.mts → index-BJ4cd-t5.d.mts} +6 -2
  10. package/dist/{index-Hgbwl9X4.d.ts → index-Bu7T6xgr.d.ts} +20 -3
  11. package/dist/{index-CHL1jdYm.d.mts → index-C3SVtPYg.d.mts} +20 -3
  12. package/dist/index.css +197 -10
  13. package/dist/index.d.mts +13 -5
  14. package/dist/index.d.ts +13 -5
  15. package/dist/index.js +39 -6
  16. package/dist/index.mjs +38 -7
  17. package/dist/server.d.mts +5 -5
  18. package/dist/server.d.ts +5 -5
  19. package/dist/server.js +310 -113
  20. package/dist/server.mjs +307 -112
  21. package/package.json +2 -4
  22. package/src/app/constants.tsx +183 -218
  23. package/src/app/layout.tsx +4 -28
  24. package/src/app/types.ts +17 -17
  25. package/src/components/ChatWidget.tsx +3 -1
  26. package/src/components/ChatWindow.tsx +5 -1
  27. package/src/components/DocViewer.tsx +71 -5
  28. package/src/components/Documentation.tsx +74 -11
  29. package/src/components/constants.tsx +275 -0
  30. package/src/config/RagConfig.ts +10 -10
  31. package/src/config/constants.ts +1 -0
  32. package/src/core/ConfigResolver.ts +24 -25
  33. package/src/core/Pipeline.ts +2 -1
  34. package/src/core/ProviderRegistry.ts +5 -5
  35. package/src/core/Retrivora.ts +46 -6
  36. package/src/core/VectorPlugin.ts +62 -8
  37. package/src/exceptions/index.ts +52 -0
  38. package/src/handlers/index.ts +71 -0
  39. package/src/hooks/useRagChat.ts +4 -1
  40. package/src/index.ts +2 -0
  41. package/src/llm/LLMFactory.ts +6 -5
  42. package/src/server.ts +16 -13
  43. package/src/types/chat.ts +2 -0
  44. package/src/types/props.ts +38 -1
package/README.md CHANGED
@@ -33,10 +33,24 @@ Retrivora AI acts as a universal bridge between your data and your users. It nor
33
33
 
34
34
  ### 📦 Installation
35
35
 
36
+ Install the core package using npm:
37
+
36
38
  ```bash
37
39
  npm install @retrivora-ai/rag-engine
38
40
  ```
39
41
 
42
+ #### 🎨 Auto-Injected Styles
43
+ To render the built-in UI components (like `ChatWidget`, `ChatWindow`, `DocumentUpload`) correctly, stylesheet rules are **auto-injected directly into the document `<head>` on load**. No manual CSS imports are required in your application layout!
44
+
45
+ *(Note: The raw stylesheet remains exported at `@retrivora-ai/rag-engine/style.css` if your custom bundler or setup requires manual stylesheet referencing).*
46
+
47
+ #### 🔌 Peer & Optional Dependencies
48
+ Depending on the specific database providers or features you use, you may need to install additional peer dependencies:
49
+ * **PostgreSQL / PGVector**: `npm install pg @types/pg`
50
+ * **MongoDB Atlas**: `npm install mongodb`
51
+ * **Word/PDF parsing capabilities**: `npm install mammoth pdf-parse`
52
+ * **Agentic/Semantic Chunking**: `npm install langchain llamaindex`
53
+
40
54
  ---
41
55
 
42
56
  ## 🛠️ Pluggable Architecture
@@ -51,8 +65,19 @@ This decoupling allows you to add custom providers without modifying the core en
51
65
 
52
66
  ## NPM Package Usage
53
67
 
68
+ The package exports are split between **client-side** and **server-side** entry points to keep server secrets/native packages safe from your React browser bundle.
69
+
70
+ | Import Path | Context | Exports |
71
+ |---|---|---|
72
+ | `@retrivora-ai/rag-engine` | **Client/Browser** | `ChatWidget`, `ChatWindow`, `ConfigProvider`, `useRagChat` |
73
+ | `@retrivora-ai/rag-engine/server` | **Server Only** | `Retrivora` (SDK facade), `Pipeline`, `ConfigBuilder`, custom exceptions |
74
+ | `@retrivora-ai/rag-engine/handlers` | **Server Only** | Next.js API Route Handler factories (e.g. `createRagHandler`, `createChatHandler`) |
75
+ | `@retrivora-ai/rag-engine/style.css` | **Universal** | Required CSS styles for custom bundler setups (auto-injected by default) |
76
+
54
77
  ### 1. Embed the ChatWidget
55
78
 
79
+ Drop the widget inside your application layout:
80
+
56
81
  ```tsx
57
82
  import { ConfigProvider, ChatWidget } from '@retrivora-ai/rag-engine';
58
83
 
@@ -76,16 +101,16 @@ export default function Layout({ children }) {
76
101
  }
77
102
  ```
78
103
 
79
- ### 2. Mount the API routes
104
+ ### 2. Mount Catch-All API Handler
105
+
106
+ Create a single dynamic catch-all route file to handle chat streaming, document upload, and suggestions automatically:
80
107
 
81
108
  ```ts
82
- // src/app/api/chat/route.ts
83
- import { createChatHandler, getRagConfig } from '@retrivora-ai/rag-engine/server';
84
- export const POST = createChatHandler(getRagConfig());
109
+ // src/app/api/retrivora/[[...retrivora]]/route.ts
110
+ import { createRagHandler } from '@retrivora-ai/rag-engine/handlers';
85
111
 
86
- // src/app/api/upload/route.ts
87
- import { createUploadHandler, getRagConfig } from '@retrivora-ai/rag-engine/server';
88
- export const POST = createUploadHandler(getRagConfig());
112
+ // Handles GET /api/retrivora/health and POST /api/retrivora/chat, upload, suggestions
113
+ export const { GET, POST } = createRagHandler();
89
114
  ```
90
115
 
91
116
  ### 3. Use Pipeline programmatically
@@ -43,6 +43,8 @@ interface UseRagChatOptions {
43
43
  onReply?: (message: RagMessage) => void;
44
44
  /** Called on error */
45
45
  onError?: (error: string) => void;
46
+ /** Optional custom headers to send with the chat request */
47
+ headers?: Record<string, string>;
46
48
  }
47
49
  interface UseRagChatReturn {
48
50
  /** All messages in the current conversation */
@@ -63,12 +65,6 @@ interface UseRagChatReturn {
63
65
  stop: () => void;
64
66
  }
65
67
 
66
- /**
67
- * constants.ts — Centralized definitions of acceptable configuration values.
68
- *
69
- * This file serves as the single source of truth for all statically supported
70
- * providers and stylistic options in the Retrivora AI RAG Engine.
71
- */
72
68
  declare const VECTOR_DB_PROVIDERS: readonly ["pinecone", "pgvector", "postgresql", "mongodb", "qdrant", "milvus", "chromadb", "redis", "weaviate", "rest", "universal_rest", "custom"];
73
69
  declare const LLM_PROVIDERS: readonly ["openai", "anthropic", "ollama", "gemini", "rest", "universal_rest", "custom"];
74
70
  declare const EMBEDDING_PROVIDERS: readonly ["openai", "ollama", "gemini", "rest", "universal_rest", "custom"];
@@ -43,6 +43,8 @@ interface UseRagChatOptions {
43
43
  onReply?: (message: RagMessage) => void;
44
44
  /** Called on error */
45
45
  onError?: (error: string) => void;
46
+ /** Optional custom headers to send with the chat request */
47
+ headers?: Record<string, string>;
46
48
  }
47
49
  interface UseRagChatReturn {
48
50
  /** All messages in the current conversation */
@@ -63,12 +65,6 @@ interface UseRagChatReturn {
63
65
  stop: () => void;
64
66
  }
65
67
 
66
- /**
67
- * constants.ts — Centralized definitions of acceptable configuration values.
68
- *
69
- * This file serves as the single source of truth for all statically supported
70
- * providers and stylistic options in the Retrivora AI RAG Engine.
71
- */
72
68
  declare const VECTOR_DB_PROVIDERS: readonly ["pinecone", "pgvector", "postgresql", "mongodb", "qdrant", "milvus", "chromadb", "redis", "weaviate", "rest", "universal_rest", "custom"];
73
69
  declare const LLM_PROVIDERS: readonly ["openai", "anthropic", "ollama", "gemini", "rest", "universal_rest", "custom"];
74
70
  declare const EMBEDDING_PROVIDERS: readonly ["openai", "ollama", "gemini", "rest", "universal_rest", "custom"];
@@ -1,3 +1,3 @@
1
- import '../ILLMProvider-DNhyOYoK.mjs';
2
- export { c as createChatHandler, d as createHealthHandler, e as createIngestHandler, f as createStreamHandler, k as createSuggestionsHandler, g as createUploadHandler, s as sseErrorFrame, h as sseFrame, i as sseMetaFrame, l as sseObservabilityFrame, j as sseTextFrame, m as sseUIFrame } from '../index-CHL1jdYm.mjs';
1
+ import '../ILLMProvider-Bhk6zJOK.mjs';
2
+ export { c as createChatHandler, d as createHealthHandler, e as createIngestHandler, f as createRagHandler, g as createStreamHandler, l as createSuggestionsHandler, h as createUploadHandler, s as sseErrorFrame, i as sseFrame, j as sseMetaFrame, m as sseObservabilityFrame, k as sseTextFrame, n as sseUIFrame } from '../index-C3SVtPYg.mjs';
3
3
  import 'next/server';
@@ -1,3 +1,3 @@
1
- import '../ILLMProvider-DNhyOYoK.js';
2
- export { c as createChatHandler, d as createHealthHandler, e as createIngestHandler, f as createStreamHandler, k as createSuggestionsHandler, g as createUploadHandler, s as sseErrorFrame, h as sseFrame, i as sseMetaFrame, l as sseObservabilityFrame, j as sseTextFrame, m as sseUIFrame } from '../index-Hgbwl9X4.js';
1
+ import '../ILLMProvider-Bhk6zJOK.js';
2
+ export { c as createChatHandler, d as createHealthHandler, e as createIngestHandler, f as createRagHandler, g as createStreamHandler, l as createSuggestionsHandler, h as createUploadHandler, s as sseErrorFrame, i as sseFrame, j as sseMetaFrame, m as sseObservabilityFrame, k as sseTextFrame, n as sseUIFrame } from '../index-Bu7T6xgr.js';
3
3
  import 'next/server';
@@ -10,9 +10,6 @@ var __getProtoOf = Object.getPrototypeOf;
10
10
  var __hasOwnProp = Object.prototype.hasOwnProperty;
11
11
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
12
  var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
13
- var __typeError = (msg) => {
14
- throw TypeError(msg);
15
- };
16
13
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
17
14
  var __spreadValues = (a, b) => {
18
15
  for (var prop in b || (b = {}))
@@ -77,34 +74,6 @@ var __asyncGenerator = (__this, __arguments, generator) => {
77
74
  }, method = (k, call, wait, clear) => it[k] = (x) => (call = new Promise((yes, no, run) => (run = () => resume(k, x, yes, no), q ? q.then(run) : run())), clear = () => q === wait && (q = 0), q = wait = call.then(clear, clear), call), q, it = {};
78
75
  return generator = generator.apply(__this, __arguments), it[__knownSymbol("asyncIterator")] = () => it, method("next"), method("throw"), method("return"), it;
79
76
  };
80
- var __yieldStar = (value) => {
81
- var obj = value[__knownSymbol("asyncIterator")], isAwait = false, method, it = {};
82
- if (obj == null) {
83
- obj = value[__knownSymbol("iterator")]();
84
- method = (k) => it[k] = (x) => obj[k](x);
85
- } else {
86
- obj = obj.call(value);
87
- method = (k) => it[k] = (v) => {
88
- if (isAwait) {
89
- isAwait = false;
90
- if (k === "throw") throw v;
91
- return v;
92
- }
93
- isAwait = true;
94
- return {
95
- done: false,
96
- value: new __await(new Promise((resolve) => {
97
- var x = obj[k](v);
98
- if (!(x instanceof Object)) __typeError("Object expected");
99
- resolve(x);
100
- }), 1)
101
- };
102
- };
103
- }
104
- return it[__knownSymbol("iterator")] = () => it, method("next"), "throw" in obj ? method("throw") : it.throw = (x) => {
105
- throw x;
106
- }, "return" in obj && method("return"), it;
107
- };
108
77
  var __forAwait = (obj, it, method) => (it = obj[__knownSymbol("asyncIterator")]) ? it.call(obj) : (obj = obj[__knownSymbol("iterator")](), it = {}, method = (key, fn) => (fn = obj[key]) && (it[key] = (arg) => new Promise((yes, no, done) => (arg = fn.call(obj, arg), done = arg.done, Promise.resolve(arg.value).then((value) => yes({ value, done }), no)))), method("next"), method("return"), it);
109
78
 
110
79
  // src/utils/templateUtils.ts
@@ -2104,6 +2073,7 @@ __export(handlers_exports, {
2104
2073
  createChatHandler: () => createChatHandler,
2105
2074
  createHealthHandler: () => createHealthHandler,
2106
2075
  createIngestHandler: () => createIngestHandler,
2076
+ createRagHandler: () => createRagHandler,
2107
2077
  createStreamHandler: () => createStreamHandler,
2108
2078
  createSuggestionsHandler: () => createSuggestionsHandler,
2109
2079
  createUploadHandler: () => createUploadHandler,
@@ -2335,26 +2305,6 @@ function getEnvConfig(env = process.env, base) {
2335
2305
  } : {});
2336
2306
  }
2337
2307
 
2338
- // src/exceptions/index.ts
2339
- var RetrivoraError = class extends Error {
2340
- constructor(message, code, details) {
2341
- super(message);
2342
- this.name = new.target.name;
2343
- this.code = code;
2344
- this.details = details;
2345
- }
2346
- };
2347
- var ProviderNotFoundException = class extends RetrivoraError {
2348
- constructor(providerType, provider, details) {
2349
- super(`Unsupported ${providerType} provider: ${provider}`, "PROVIDER_NOT_FOUND", details);
2350
- }
2351
- };
2352
- var ConfigurationException = class extends RetrivoraError {
2353
- constructor(message, details) {
2354
- super(message, "CONFIGURATION_ERROR", details);
2355
- }
2356
- };
2357
-
2358
2308
  // src/core/ConfigResolver.ts
2359
2309
  var ConfigResolver = class {
2360
2310
  /**
@@ -2400,13 +2350,13 @@ var ConfigResolver = class {
2400
2350
  */
2401
2351
  static validate(config) {
2402
2352
  if (!config.projectId) {
2403
- throw new ConfigurationException("[ConfigResolver] projectId is required");
2353
+ throw new Error("[ConfigResolver] projectId is required");
2404
2354
  }
2405
2355
  if (!config.vectorDb.provider) {
2406
- throw new ConfigurationException("[ConfigResolver] vectorDb.provider is required");
2356
+ throw new Error("[ConfigResolver] vectorDb.provider is required");
2407
2357
  }
2408
2358
  if (!config.llm.provider) {
2409
- throw new ConfigurationException("[ConfigResolver] llm.provider is required");
2359
+ throw new Error("[ConfigResolver] llm.provider is required");
2410
2360
  }
2411
2361
  }
2412
2362
  static mergeRetrievalWorkflow(rag, retrieval, workflow) {
@@ -3447,6 +3397,78 @@ ${context != null ? context : "None"}` },
3447
3397
  }
3448
3398
  };
3449
3399
 
3400
+ // src/exceptions/index.ts
3401
+ var RetrivoraError = class extends Error {
3402
+ constructor(message, code, details) {
3403
+ super(message);
3404
+ this.name = new.target.name;
3405
+ this.code = code;
3406
+ this.details = details;
3407
+ }
3408
+ };
3409
+ var ProviderNotFoundException = class extends RetrivoraError {
3410
+ constructor(providerType, provider, details) {
3411
+ super(`Unsupported ${providerType} provider: ${provider}`, "PROVIDER_NOT_FOUND", details);
3412
+ }
3413
+ };
3414
+ var EmbeddingFailedException = class extends RetrivoraError {
3415
+ constructor(message = "Embedding generation failed", details) {
3416
+ super(message, "EMBEDDING_FAILED", details);
3417
+ }
3418
+ };
3419
+ var RetrievalException = class extends RetrivoraError {
3420
+ constructor(message = "Retrieval failed", details) {
3421
+ super(message, "RETRIEVAL_FAILED", details);
3422
+ }
3423
+ };
3424
+ var RateLimitException = class extends RetrivoraError {
3425
+ constructor(message = "Provider rate limit exceeded", details) {
3426
+ super(message, "RATE_LIMITED", details);
3427
+ }
3428
+ };
3429
+ var ConfigurationException = class extends RetrivoraError {
3430
+ constructor(message, details) {
3431
+ super(message, "CONFIGURATION_ERROR", details);
3432
+ }
3433
+ };
3434
+ var AuthenticationException = class extends RetrivoraError {
3435
+ constructor(message = "Provider authentication failed", details) {
3436
+ super(message, "AUTHENTICATION_ERROR", details);
3437
+ }
3438
+ };
3439
+ function wrapError(err, defaultCode, defaultMessage) {
3440
+ var _a;
3441
+ if (err instanceof RetrivoraError) {
3442
+ return err;
3443
+ }
3444
+ const error = err;
3445
+ const message = (error == null ? void 0 : error.message) || defaultMessage || String(err);
3446
+ const status = (error == null ? void 0 : error.status) || (error == null ? void 0 : error.statusCode) || ((_a = error == null ? void 0 : error.response) == null ? void 0 : _a.status);
3447
+ const code = error == null ? void 0 : error.code;
3448
+ if (status === 429 || /rate[- ]?limit/i.test(message) || code === "RATE_LIMIT_EXCEEDED") {
3449
+ return new RateLimitException(message, err);
3450
+ }
3451
+ if (status === 401 || status === 403 || /unauthorized|auth|api[- ]?key/i.test(message) || code === "INVALID_API_KEY") {
3452
+ return new AuthenticationException(message, err);
3453
+ }
3454
+ switch (defaultCode) {
3455
+ case "PROVIDER_NOT_FOUND":
3456
+ return new ProviderNotFoundException("provider", message, err);
3457
+ case "EMBEDDING_FAILED":
3458
+ return new EmbeddingFailedException(message, err);
3459
+ case "RETRIEVAL_FAILED":
3460
+ return new RetrievalException(message, err);
3461
+ case "RATE_LIMITED":
3462
+ return new RateLimitException(message, err);
3463
+ case "CONFIGURATION_ERROR":
3464
+ return new ConfigurationException(message, err);
3465
+ case "AUTHENTICATION_ERROR":
3466
+ return new AuthenticationException(message, err);
3467
+ default:
3468
+ return new RetrivoraError(message, defaultCode, err);
3469
+ }
3470
+ }
3471
+
3450
3472
  // src/llm/LLMFactory.ts
3451
3473
  var customProviders = /* @__PURE__ */ new Map();
3452
3474
  var LLMFactory = class _LLMFactory {
@@ -3492,7 +3514,7 @@ var LLMFactory = class _LLMFactory {
3492
3514
  ];
3493
3515
  }
3494
3516
  static create(llmConfig, embeddingConfig) {
3495
- var _a, _b;
3517
+ var _a, _b, _c;
3496
3518
  switch (llmConfig.provider) {
3497
3519
  case "openai":
3498
3520
  return new OpenAIProvider(llmConfig, embeddingConfig);
@@ -3516,9 +3538,12 @@ var LLMFactory = class _LLMFactory {
3516
3538
  return new UniversalLLMAdapter(llmConfig);
3517
3539
  }
3518
3540
  throw new ProviderNotFoundException(
3519
- "LLM",
3520
- String(llmConfig.provider),
3521
- `[LLMFactory] Unknown provider "${llmConfig.provider}". Built-in providers: ${_LLMFactory.listProviders().join(", ")}. Register a custom provider with LLMFactory.register().`
3541
+ "llm",
3542
+ (_c = llmConfig.provider) != null ? _c : "undefined",
3543
+ {
3544
+ message: `Unknown provider "${llmConfig.provider}". Register a custom provider with LLMFactory.register().`,
3545
+ available: _LLMFactory.listProviders()
3546
+ }
3522
3547
  );
3523
3548
  }
3524
3549
  }
@@ -6447,7 +6472,7 @@ var Pipeline = class {
6447
6472
  embedBatchOptions
6448
6473
  );
6449
6474
  if (vectors.length !== chunks.length) {
6450
- throw new Error(
6475
+ throw new EmbeddingFailedException(
6451
6476
  `[Pipeline] Embedding mismatch: got ${vectors.length} vectors for ${chunks.length} chunks. Check embedding provider logs for individual chunk failures.`
6452
6477
  );
6453
6478
  }
@@ -7166,6 +7191,8 @@ var VectorPlugin = class {
7166
7191
  constructor(hostConfig) {
7167
7192
  this.config = ConfigResolver.resolve(hostConfig);
7168
7193
  this.validationPromise = ConfigValidator.validateAndThrow(this.config);
7194
+ this.validationPromise.catch(() => {
7195
+ });
7169
7196
  this.pipeline = new Pipeline(this.config);
7170
7197
  }
7171
7198
  /**
@@ -7199,31 +7226,93 @@ var VectorPlugin = class {
7199
7226
  * Run a chat query.
7200
7227
  */
7201
7228
  async chat(message, history = [], namespace) {
7202
- await this.validationPromise;
7203
- return this.pipeline.ask(message, history, namespace);
7229
+ try {
7230
+ await this.validationPromise;
7231
+ } catch (err) {
7232
+ throw wrapError(err, "CONFIGURATION_ERROR");
7233
+ }
7234
+ try {
7235
+ return await this.pipeline.ask(message, history, namespace);
7236
+ } catch (err) {
7237
+ const msg = String(err);
7238
+ let defaultCode = "RETRIEVAL_FAILED";
7239
+ if (msg.includes("Embed") || msg.includes("embed")) {
7240
+ defaultCode = "EMBEDDING_FAILED";
7241
+ }
7242
+ throw wrapError(err, defaultCode);
7243
+ }
7204
7244
  }
7205
7245
  /**
7206
7246
  * Run a streaming chat query.
7207
7247
  */
7208
7248
  chatStream(_0) {
7209
7249
  return __asyncGenerator(this, arguments, function* (message, history = [], namespace) {
7210
- yield new __await(this.validationPromise);
7211
- yield* __yieldStar(this.pipeline.askStream(message, history, namespace));
7250
+ try {
7251
+ yield new __await(this.validationPromise);
7252
+ } catch (err) {
7253
+ throw wrapError(err, "CONFIGURATION_ERROR");
7254
+ }
7255
+ try {
7256
+ const stream = this.pipeline.askStream(message, history, namespace);
7257
+ try {
7258
+ for (var iter = __forAwait(stream), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
7259
+ const chunk = temp.value;
7260
+ yield chunk;
7261
+ }
7262
+ } catch (temp) {
7263
+ error = [temp];
7264
+ } finally {
7265
+ try {
7266
+ more && (temp = iter.return) && (yield new __await(temp.call(iter)));
7267
+ } finally {
7268
+ if (error)
7269
+ throw error[0];
7270
+ }
7271
+ }
7272
+ } catch (err) {
7273
+ const msg = String(err);
7274
+ let defaultCode = "RETRIEVAL_FAILED";
7275
+ if (msg.includes("Embed") || msg.includes("embed")) {
7276
+ defaultCode = "EMBEDDING_FAILED";
7277
+ }
7278
+ throw wrapError(err, defaultCode);
7279
+ }
7212
7280
  });
7213
7281
  }
7214
7282
  /**
7215
7283
  * Ingest documents into the vector database.
7216
7284
  */
7217
7285
  async ingest(documents, namespace) {
7218
- await this.validationPromise;
7219
- return this.pipeline.ingest(documents, namespace);
7286
+ try {
7287
+ await this.validationPromise;
7288
+ } catch (err) {
7289
+ throw wrapError(err, "CONFIGURATION_ERROR");
7290
+ }
7291
+ try {
7292
+ return await this.pipeline.ingest(documents, namespace);
7293
+ } catch (err) {
7294
+ const msg = String(err);
7295
+ let defaultCode = "RETRIEVAL_FAILED";
7296
+ if (msg.includes("Embed") || msg.includes("embed")) {
7297
+ defaultCode = "EMBEDDING_FAILED";
7298
+ }
7299
+ throw wrapError(err, defaultCode);
7300
+ }
7220
7301
  }
7221
7302
  /**
7222
7303
  * Get auto-suggestions based on a query prefix.
7223
7304
  */
7224
7305
  async getSuggestions(query, namespace) {
7225
- await this.validationPromise;
7226
- return this.pipeline.getSuggestions(query, namespace);
7306
+ try {
7307
+ await this.validationPromise;
7308
+ } catch (err) {
7309
+ throw wrapError(err, "CONFIGURATION_ERROR");
7310
+ }
7311
+ try {
7312
+ return await this.pipeline.getSuggestions(query, namespace);
7313
+ } catch (err) {
7314
+ throw wrapError(err, "RETRIEVAL_FAILED");
7315
+ }
7227
7316
  }
7228
7317
  };
7229
7318
 
@@ -7573,11 +7662,68 @@ function createSuggestionsHandler(configOrPlugin) {
7573
7662
  }
7574
7663
  };
7575
7664
  }
7665
+ function createRagHandler(configOrPlugin) {
7666
+ const plugin = configOrPlugin instanceof VectorPlugin ? configOrPlugin : new VectorPlugin(configOrPlugin);
7667
+ const chatHandler = createChatHandler(plugin);
7668
+ const streamHandler = createStreamHandler(plugin);
7669
+ const uploadHandler = createUploadHandler(plugin);
7670
+ const healthHandler = createHealthHandler(plugin);
7671
+ const suggestionsHandler = createSuggestionsHandler(plugin);
7672
+ async function routePostRequest(req, segment) {
7673
+ switch (segment) {
7674
+ case "chat":
7675
+ return streamHandler(req);
7676
+ case "chat-sync":
7677
+ return chatHandler(req);
7678
+ case "upload":
7679
+ return uploadHandler(req);
7680
+ case "suggestions":
7681
+ return suggestionsHandler(req);
7682
+ case "health":
7683
+ return healthHandler();
7684
+ default:
7685
+ return import_server.NextResponse.json({ error: `Not Found: POST segment "${segment}" not supported.` }, { status: 404 });
7686
+ }
7687
+ }
7688
+ async function routeGetRequest(req, segment) {
7689
+ if (segment === "health") {
7690
+ return healthHandler();
7691
+ }
7692
+ return import_server.NextResponse.json({ error: `Method Not Allowed: GET is only supported for "health" segment.` }, { status: 405 });
7693
+ }
7694
+ async function getSegment(context) {
7695
+ var _a;
7696
+ const resolvedParams = typeof ((_a = context == null ? void 0 : context.params) == null ? void 0 : _a.then) === "function" ? await context.params : context == null ? void 0 : context.params;
7697
+ const segments = (resolvedParams == null ? void 0 : resolvedParams.retrivora) || [];
7698
+ return segments[0] || "chat";
7699
+ }
7700
+ return {
7701
+ GET: async (req, context) => {
7702
+ try {
7703
+ const segment = await getSegment(context);
7704
+ return await routeGetRequest(req, segment);
7705
+ } catch (err) {
7706
+ const msg = err instanceof Error ? err.message : "GET Routing failed";
7707
+ return import_server.NextResponse.json({ error: msg }, { status: 500 });
7708
+ }
7709
+ },
7710
+ POST: async (req, context) => {
7711
+ try {
7712
+ const segment = await getSegment(context);
7713
+ return await routePostRequest(req, segment);
7714
+ } catch (err) {
7715
+ const msg = err instanceof Error ? err.message : "POST Routing failed";
7716
+ return import_server.NextResponse.json({ error: msg }, { status: 500 });
7717
+ }
7718
+ }
7719
+ };
7720
+ }
7576
7721
  // Annotate the CommonJS export names for ESM import in node:
7577
7722
  0 && (module.exports = {
7578
7723
  createChatHandler,
7579
7724
  createHealthHandler,
7580
7725
  createIngestHandler,
7726
+ createRagHandler,
7581
7727
  createStreamHandler,
7582
7728
  createSuggestionsHandler,
7583
7729
  createUploadHandler,