@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.
- package/README.md +32 -7
- package/dist/{ILLMProvider-DNhyOYoK.d.mts → ILLMProvider-Bhk6zJOK.d.mts} +2 -6
- package/dist/{ILLMProvider-DNhyOYoK.d.ts → ILLMProvider-Bhk6zJOK.d.ts} +2 -6
- package/dist/handlers/index.d.mts +2 -2
- package/dist/handlers/index.d.ts +2 -2
- package/dist/handlers/index.js +213 -67
- package/dist/handlers/index.mjs +212 -67
- package/dist/{index-CjQdL0cX.d.ts → index-B9J_XEh0.d.ts} +6 -2
- package/dist/{index-C9v7-tWd.d.mts → index-BJ4cd-t5.d.mts} +6 -2
- package/dist/{index-Hgbwl9X4.d.ts → index-Bu7T6xgr.d.ts} +20 -3
- package/dist/{index-CHL1jdYm.d.mts → index-C3SVtPYg.d.mts} +20 -3
- package/dist/index.css +197 -10
- package/dist/index.d.mts +13 -5
- package/dist/index.d.ts +13 -5
- package/dist/index.js +39 -6
- package/dist/index.mjs +38 -7
- package/dist/server.d.mts +5 -5
- package/dist/server.d.ts +5 -5
- package/dist/server.js +310 -113
- package/dist/server.mjs +307 -112
- package/package.json +2 -4
- package/src/app/constants.tsx +183 -218
- package/src/app/layout.tsx +4 -28
- package/src/app/types.ts +17 -17
- package/src/components/ChatWidget.tsx +3 -1
- package/src/components/ChatWindow.tsx +5 -1
- package/src/components/DocViewer.tsx +71 -5
- package/src/components/Documentation.tsx +74 -11
- package/src/components/constants.tsx +275 -0
- package/src/config/RagConfig.ts +10 -10
- package/src/config/constants.ts +1 -0
- package/src/core/ConfigResolver.ts +24 -25
- package/src/core/Pipeline.ts +2 -1
- package/src/core/ProviderRegistry.ts +5 -5
- package/src/core/Retrivora.ts +46 -6
- package/src/core/VectorPlugin.ts +62 -8
- package/src/exceptions/index.ts +52 -0
- package/src/handlers/index.ts +71 -0
- package/src/hooks/useRagChat.ts +4 -1
- package/src/index.ts +2 -0
- package/src/llm/LLMFactory.ts +6 -5
- package/src/server.ts +16 -13
- package/src/types/chat.ts +2 -0
- 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
|
|
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/
|
|
83
|
-
import {
|
|
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
|
-
//
|
|
87
|
-
|
|
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-
|
|
2
|
-
export { c as createChatHandler, d as createHealthHandler, e as createIngestHandler, f as createStreamHandler,
|
|
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';
|
package/dist/handlers/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import '../ILLMProvider-
|
|
2
|
-
export { c as createChatHandler, d as createHealthHandler, e as createIngestHandler, f as createStreamHandler,
|
|
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';
|
package/dist/handlers/index.js
CHANGED
|
@@ -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
|
|
2353
|
+
throw new Error("[ConfigResolver] projectId is required");
|
|
2404
2354
|
}
|
|
2405
2355
|
if (!config.vectorDb.provider) {
|
|
2406
|
-
throw new
|
|
2356
|
+
throw new Error("[ConfigResolver] vectorDb.provider is required");
|
|
2407
2357
|
}
|
|
2408
2358
|
if (!config.llm.provider) {
|
|
2409
|
-
throw new
|
|
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
|
-
"
|
|
3520
|
-
|
|
3521
|
-
|
|
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
|
|
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
|
-
|
|
7203
|
-
|
|
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
|
-
|
|
7211
|
-
|
|
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
|
-
|
|
7219
|
-
|
|
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
|
-
|
|
7226
|
-
|
|
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,
|