@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/dist/server.mjs
CHANGED
|
@@ -6,9 +6,6 @@ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
|
6
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
7
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
8
|
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
|
|
9
|
-
var __typeError = (msg) => {
|
|
10
|
-
throw TypeError(msg);
|
|
11
|
-
};
|
|
12
9
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
13
10
|
var __spreadValues = (a, b) => {
|
|
14
11
|
for (var prop in b || (b = {}))
|
|
@@ -56,34 +53,6 @@ var __asyncGenerator = (__this, __arguments, generator) => {
|
|
|
56
53
|
}, 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 = {};
|
|
57
54
|
return generator = generator.apply(__this, __arguments), it[__knownSymbol("asyncIterator")] = () => it, method("next"), method("throw"), method("return"), it;
|
|
58
55
|
};
|
|
59
|
-
var __yieldStar = (value) => {
|
|
60
|
-
var obj = value[__knownSymbol("asyncIterator")], isAwait = false, method, it = {};
|
|
61
|
-
if (obj == null) {
|
|
62
|
-
obj = value[__knownSymbol("iterator")]();
|
|
63
|
-
method = (k) => it[k] = (x) => obj[k](x);
|
|
64
|
-
} else {
|
|
65
|
-
obj = obj.call(value);
|
|
66
|
-
method = (k) => it[k] = (v) => {
|
|
67
|
-
if (isAwait) {
|
|
68
|
-
isAwait = false;
|
|
69
|
-
if (k === "throw") throw v;
|
|
70
|
-
return v;
|
|
71
|
-
}
|
|
72
|
-
isAwait = true;
|
|
73
|
-
return {
|
|
74
|
-
done: false,
|
|
75
|
-
value: new __await(new Promise((resolve) => {
|
|
76
|
-
var x = obj[k](v);
|
|
77
|
-
if (!(x instanceof Object)) __typeError("Object expected");
|
|
78
|
-
resolve(x);
|
|
79
|
-
}), 1)
|
|
80
|
-
};
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
return it[__knownSymbol("iterator")] = () => it, method("next"), "throw" in obj ? method("throw") : it.throw = (x) => {
|
|
84
|
-
throw x;
|
|
85
|
-
}, "return" in obj && method("return"), it;
|
|
86
|
-
};
|
|
87
56
|
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);
|
|
88
57
|
|
|
89
58
|
// src/utils/templateUtils.ts
|
|
@@ -2298,46 +2267,6 @@ function getEnvConfig(env = process.env, base) {
|
|
|
2298
2267
|
} : {});
|
|
2299
2268
|
}
|
|
2300
2269
|
|
|
2301
|
-
// src/exceptions/index.ts
|
|
2302
|
-
var RetrivoraError = class extends Error {
|
|
2303
|
-
constructor(message, code, details) {
|
|
2304
|
-
super(message);
|
|
2305
|
-
this.name = new.target.name;
|
|
2306
|
-
this.code = code;
|
|
2307
|
-
this.details = details;
|
|
2308
|
-
}
|
|
2309
|
-
};
|
|
2310
|
-
var ProviderNotFoundException = class extends RetrivoraError {
|
|
2311
|
-
constructor(providerType, provider, details) {
|
|
2312
|
-
super(`Unsupported ${providerType} provider: ${provider}`, "PROVIDER_NOT_FOUND", details);
|
|
2313
|
-
}
|
|
2314
|
-
};
|
|
2315
|
-
var EmbeddingFailedException = class extends RetrivoraError {
|
|
2316
|
-
constructor(message = "Embedding generation failed", details) {
|
|
2317
|
-
super(message, "EMBEDDING_FAILED", details);
|
|
2318
|
-
}
|
|
2319
|
-
};
|
|
2320
|
-
var RetrievalException = class extends RetrivoraError {
|
|
2321
|
-
constructor(message = "Retrieval failed", details) {
|
|
2322
|
-
super(message, "RETRIEVAL_FAILED", details);
|
|
2323
|
-
}
|
|
2324
|
-
};
|
|
2325
|
-
var RateLimitException = class extends RetrivoraError {
|
|
2326
|
-
constructor(message = "Provider rate limit exceeded", details) {
|
|
2327
|
-
super(message, "RATE_LIMITED", details);
|
|
2328
|
-
}
|
|
2329
|
-
};
|
|
2330
|
-
var ConfigurationException = class extends RetrivoraError {
|
|
2331
|
-
constructor(message, details) {
|
|
2332
|
-
super(message, "CONFIGURATION_ERROR", details);
|
|
2333
|
-
}
|
|
2334
|
-
};
|
|
2335
|
-
var AuthenticationException = class extends RetrivoraError {
|
|
2336
|
-
constructor(message = "Provider authentication failed", details) {
|
|
2337
|
-
super(message, "AUTHENTICATION_ERROR", details);
|
|
2338
|
-
}
|
|
2339
|
-
};
|
|
2340
|
-
|
|
2341
2270
|
// src/core/ConfigResolver.ts
|
|
2342
2271
|
var ConfigResolver = class {
|
|
2343
2272
|
/**
|
|
@@ -2383,13 +2312,13 @@ var ConfigResolver = class {
|
|
|
2383
2312
|
*/
|
|
2384
2313
|
static validate(config) {
|
|
2385
2314
|
if (!config.projectId) {
|
|
2386
|
-
throw new
|
|
2315
|
+
throw new Error("[ConfigResolver] projectId is required");
|
|
2387
2316
|
}
|
|
2388
2317
|
if (!config.vectorDb.provider) {
|
|
2389
|
-
throw new
|
|
2318
|
+
throw new Error("[ConfigResolver] vectorDb.provider is required");
|
|
2390
2319
|
}
|
|
2391
2320
|
if (!config.llm.provider) {
|
|
2392
|
-
throw new
|
|
2321
|
+
throw new Error("[ConfigResolver] llm.provider is required");
|
|
2393
2322
|
}
|
|
2394
2323
|
}
|
|
2395
2324
|
static mergeRetrievalWorkflow(rag, retrieval, workflow) {
|
|
@@ -3469,6 +3398,78 @@ ${context != null ? context : "None"}` },
|
|
|
3469
3398
|
}
|
|
3470
3399
|
};
|
|
3471
3400
|
|
|
3401
|
+
// src/exceptions/index.ts
|
|
3402
|
+
var RetrivoraError = class extends Error {
|
|
3403
|
+
constructor(message, code, details) {
|
|
3404
|
+
super(message);
|
|
3405
|
+
this.name = new.target.name;
|
|
3406
|
+
this.code = code;
|
|
3407
|
+
this.details = details;
|
|
3408
|
+
}
|
|
3409
|
+
};
|
|
3410
|
+
var ProviderNotFoundException = class extends RetrivoraError {
|
|
3411
|
+
constructor(providerType, provider, details) {
|
|
3412
|
+
super(`Unsupported ${providerType} provider: ${provider}`, "PROVIDER_NOT_FOUND", details);
|
|
3413
|
+
}
|
|
3414
|
+
};
|
|
3415
|
+
var EmbeddingFailedException = class extends RetrivoraError {
|
|
3416
|
+
constructor(message = "Embedding generation failed", details) {
|
|
3417
|
+
super(message, "EMBEDDING_FAILED", details);
|
|
3418
|
+
}
|
|
3419
|
+
};
|
|
3420
|
+
var RetrievalException = class extends RetrivoraError {
|
|
3421
|
+
constructor(message = "Retrieval failed", details) {
|
|
3422
|
+
super(message, "RETRIEVAL_FAILED", details);
|
|
3423
|
+
}
|
|
3424
|
+
};
|
|
3425
|
+
var RateLimitException = class extends RetrivoraError {
|
|
3426
|
+
constructor(message = "Provider rate limit exceeded", details) {
|
|
3427
|
+
super(message, "RATE_LIMITED", details);
|
|
3428
|
+
}
|
|
3429
|
+
};
|
|
3430
|
+
var ConfigurationException = class extends RetrivoraError {
|
|
3431
|
+
constructor(message, details) {
|
|
3432
|
+
super(message, "CONFIGURATION_ERROR", details);
|
|
3433
|
+
}
|
|
3434
|
+
};
|
|
3435
|
+
var AuthenticationException = class extends RetrivoraError {
|
|
3436
|
+
constructor(message = "Provider authentication failed", details) {
|
|
3437
|
+
super(message, "AUTHENTICATION_ERROR", details);
|
|
3438
|
+
}
|
|
3439
|
+
};
|
|
3440
|
+
function wrapError(err, defaultCode, defaultMessage) {
|
|
3441
|
+
var _a;
|
|
3442
|
+
if (err instanceof RetrivoraError) {
|
|
3443
|
+
return err;
|
|
3444
|
+
}
|
|
3445
|
+
const error = err;
|
|
3446
|
+
const message = (error == null ? void 0 : error.message) || defaultMessage || String(err);
|
|
3447
|
+
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);
|
|
3448
|
+
const code = error == null ? void 0 : error.code;
|
|
3449
|
+
if (status === 429 || /rate[- ]?limit/i.test(message) || code === "RATE_LIMIT_EXCEEDED") {
|
|
3450
|
+
return new RateLimitException(message, err);
|
|
3451
|
+
}
|
|
3452
|
+
if (status === 401 || status === 403 || /unauthorized|auth|api[- ]?key/i.test(message) || code === "INVALID_API_KEY") {
|
|
3453
|
+
return new AuthenticationException(message, err);
|
|
3454
|
+
}
|
|
3455
|
+
switch (defaultCode) {
|
|
3456
|
+
case "PROVIDER_NOT_FOUND":
|
|
3457
|
+
return new ProviderNotFoundException("provider", message, err);
|
|
3458
|
+
case "EMBEDDING_FAILED":
|
|
3459
|
+
return new EmbeddingFailedException(message, err);
|
|
3460
|
+
case "RETRIEVAL_FAILED":
|
|
3461
|
+
return new RetrievalException(message, err);
|
|
3462
|
+
case "RATE_LIMITED":
|
|
3463
|
+
return new RateLimitException(message, err);
|
|
3464
|
+
case "CONFIGURATION_ERROR":
|
|
3465
|
+
return new ConfigurationException(message, err);
|
|
3466
|
+
case "AUTHENTICATION_ERROR":
|
|
3467
|
+
return new AuthenticationException(message, err);
|
|
3468
|
+
default:
|
|
3469
|
+
return new RetrivoraError(message, defaultCode, err);
|
|
3470
|
+
}
|
|
3471
|
+
}
|
|
3472
|
+
|
|
3472
3473
|
// src/llm/LLMFactory.ts
|
|
3473
3474
|
var customProviders = /* @__PURE__ */ new Map();
|
|
3474
3475
|
var LLMFactory = class _LLMFactory {
|
|
@@ -3514,7 +3515,7 @@ var LLMFactory = class _LLMFactory {
|
|
|
3514
3515
|
];
|
|
3515
3516
|
}
|
|
3516
3517
|
static create(llmConfig, embeddingConfig) {
|
|
3517
|
-
var _a, _b;
|
|
3518
|
+
var _a, _b, _c;
|
|
3518
3519
|
switch (llmConfig.provider) {
|
|
3519
3520
|
case "openai":
|
|
3520
3521
|
return new OpenAIProvider(llmConfig, embeddingConfig);
|
|
@@ -3538,9 +3539,12 @@ var LLMFactory = class _LLMFactory {
|
|
|
3538
3539
|
return new UniversalLLMAdapter(llmConfig);
|
|
3539
3540
|
}
|
|
3540
3541
|
throw new ProviderNotFoundException(
|
|
3541
|
-
"
|
|
3542
|
-
|
|
3543
|
-
|
|
3542
|
+
"llm",
|
|
3543
|
+
(_c = llmConfig.provider) != null ? _c : "undefined",
|
|
3544
|
+
{
|
|
3545
|
+
message: `Unknown provider "${llmConfig.provider}". Register a custom provider with LLMFactory.register().`,
|
|
3546
|
+
available: _LLMFactory.listProviders()
|
|
3547
|
+
}
|
|
3544
3548
|
);
|
|
3545
3549
|
}
|
|
3546
3550
|
}
|
|
@@ -6475,7 +6479,7 @@ var Pipeline = class {
|
|
|
6475
6479
|
embedBatchOptions
|
|
6476
6480
|
);
|
|
6477
6481
|
if (vectors.length !== chunks.length) {
|
|
6478
|
-
throw new
|
|
6482
|
+
throw new EmbeddingFailedException(
|
|
6479
6483
|
`[Pipeline] Embedding mismatch: got ${vectors.length} vectors for ${chunks.length} chunks. Check embedding provider logs for individual chunk failures.`
|
|
6480
6484
|
);
|
|
6481
6485
|
}
|
|
@@ -7086,6 +7090,82 @@ Suggestions:`;
|
|
|
7086
7090
|
}
|
|
7087
7091
|
};
|
|
7088
7092
|
|
|
7093
|
+
// src/core/Retrivora.ts
|
|
7094
|
+
var Retrivora = class {
|
|
7095
|
+
constructor(config) {
|
|
7096
|
+
this.config = ConfigResolver.resolveUniversal(config);
|
|
7097
|
+
this.pipeline = new Pipeline(this.config);
|
|
7098
|
+
}
|
|
7099
|
+
async initialize() {
|
|
7100
|
+
try {
|
|
7101
|
+
await ConfigValidator.validateAndThrow(this.config);
|
|
7102
|
+
} catch (err) {
|
|
7103
|
+
throw wrapError(err, "CONFIGURATION_ERROR");
|
|
7104
|
+
}
|
|
7105
|
+
try {
|
|
7106
|
+
await this.pipeline.initialize();
|
|
7107
|
+
} catch (err) {
|
|
7108
|
+
throw wrapError(err, "AUTHENTICATION_ERROR");
|
|
7109
|
+
}
|
|
7110
|
+
}
|
|
7111
|
+
async ingest(documents, namespace) {
|
|
7112
|
+
try {
|
|
7113
|
+
return await this.pipeline.ingest(documents, namespace);
|
|
7114
|
+
} catch (err) {
|
|
7115
|
+
const msg = String(err);
|
|
7116
|
+
let defaultCode = "RETRIEVAL_FAILED";
|
|
7117
|
+
if (msg.includes("Embed") || msg.includes("embed")) {
|
|
7118
|
+
defaultCode = "EMBEDDING_FAILED";
|
|
7119
|
+
}
|
|
7120
|
+
throw wrapError(err, defaultCode);
|
|
7121
|
+
}
|
|
7122
|
+
}
|
|
7123
|
+
async ask(question, history = [], namespace) {
|
|
7124
|
+
try {
|
|
7125
|
+
return await this.pipeline.ask(question, history, namespace);
|
|
7126
|
+
} catch (err) {
|
|
7127
|
+
const msg = String(err);
|
|
7128
|
+
let defaultCode = "RETRIEVAL_FAILED";
|
|
7129
|
+
if (msg.includes("Embed") || msg.includes("embed")) {
|
|
7130
|
+
defaultCode = "EMBEDDING_FAILED";
|
|
7131
|
+
}
|
|
7132
|
+
throw wrapError(err, defaultCode);
|
|
7133
|
+
}
|
|
7134
|
+
}
|
|
7135
|
+
askStream(_0) {
|
|
7136
|
+
return __asyncGenerator(this, arguments, function* (question, history = [], namespace) {
|
|
7137
|
+
try {
|
|
7138
|
+
const stream = this.pipeline.askStream(question, history, namespace);
|
|
7139
|
+
try {
|
|
7140
|
+
for (var iter = __forAwait(stream), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
|
|
7141
|
+
const chunk = temp.value;
|
|
7142
|
+
yield chunk;
|
|
7143
|
+
}
|
|
7144
|
+
} catch (temp) {
|
|
7145
|
+
error = [temp];
|
|
7146
|
+
} finally {
|
|
7147
|
+
try {
|
|
7148
|
+
more && (temp = iter.return) && (yield new __await(temp.call(iter)));
|
|
7149
|
+
} finally {
|
|
7150
|
+
if (error)
|
|
7151
|
+
throw error[0];
|
|
7152
|
+
}
|
|
7153
|
+
}
|
|
7154
|
+
} catch (err) {
|
|
7155
|
+
const msg = String(err);
|
|
7156
|
+
let defaultCode = "RETRIEVAL_FAILED";
|
|
7157
|
+
if (msg.includes("Embed") || msg.includes("embed")) {
|
|
7158
|
+
defaultCode = "EMBEDDING_FAILED";
|
|
7159
|
+
}
|
|
7160
|
+
throw wrapError(err, defaultCode);
|
|
7161
|
+
}
|
|
7162
|
+
});
|
|
7163
|
+
}
|
|
7164
|
+
getPipeline() {
|
|
7165
|
+
return this.pipeline;
|
|
7166
|
+
}
|
|
7167
|
+
};
|
|
7168
|
+
|
|
7089
7169
|
// src/core/ProviderHealthCheck.ts
|
|
7090
7170
|
var ProviderHealthCheck = class {
|
|
7091
7171
|
/**
|
|
@@ -7194,6 +7274,8 @@ var VectorPlugin = class {
|
|
|
7194
7274
|
constructor(hostConfig) {
|
|
7195
7275
|
this.config = ConfigResolver.resolve(hostConfig);
|
|
7196
7276
|
this.validationPromise = ConfigValidator.validateAndThrow(this.config);
|
|
7277
|
+
this.validationPromise.catch(() => {
|
|
7278
|
+
});
|
|
7197
7279
|
this.pipeline = new Pipeline(this.config);
|
|
7198
7280
|
}
|
|
7199
7281
|
/**
|
|
@@ -7227,55 +7309,93 @@ var VectorPlugin = class {
|
|
|
7227
7309
|
* Run a chat query.
|
|
7228
7310
|
*/
|
|
7229
7311
|
async chat(message, history = [], namespace) {
|
|
7230
|
-
|
|
7231
|
-
|
|
7312
|
+
try {
|
|
7313
|
+
await this.validationPromise;
|
|
7314
|
+
} catch (err) {
|
|
7315
|
+
throw wrapError(err, "CONFIGURATION_ERROR");
|
|
7316
|
+
}
|
|
7317
|
+
try {
|
|
7318
|
+
return await this.pipeline.ask(message, history, namespace);
|
|
7319
|
+
} catch (err) {
|
|
7320
|
+
const msg = String(err);
|
|
7321
|
+
let defaultCode = "RETRIEVAL_FAILED";
|
|
7322
|
+
if (msg.includes("Embed") || msg.includes("embed")) {
|
|
7323
|
+
defaultCode = "EMBEDDING_FAILED";
|
|
7324
|
+
}
|
|
7325
|
+
throw wrapError(err, defaultCode);
|
|
7326
|
+
}
|
|
7232
7327
|
}
|
|
7233
7328
|
/**
|
|
7234
7329
|
* Run a streaming chat query.
|
|
7235
7330
|
*/
|
|
7236
7331
|
chatStream(_0) {
|
|
7237
7332
|
return __asyncGenerator(this, arguments, function* (message, history = [], namespace) {
|
|
7238
|
-
|
|
7239
|
-
|
|
7333
|
+
try {
|
|
7334
|
+
yield new __await(this.validationPromise);
|
|
7335
|
+
} catch (err) {
|
|
7336
|
+
throw wrapError(err, "CONFIGURATION_ERROR");
|
|
7337
|
+
}
|
|
7338
|
+
try {
|
|
7339
|
+
const stream = this.pipeline.askStream(message, history, namespace);
|
|
7340
|
+
try {
|
|
7341
|
+
for (var iter = __forAwait(stream), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
|
|
7342
|
+
const chunk = temp.value;
|
|
7343
|
+
yield chunk;
|
|
7344
|
+
}
|
|
7345
|
+
} catch (temp) {
|
|
7346
|
+
error = [temp];
|
|
7347
|
+
} finally {
|
|
7348
|
+
try {
|
|
7349
|
+
more && (temp = iter.return) && (yield new __await(temp.call(iter)));
|
|
7350
|
+
} finally {
|
|
7351
|
+
if (error)
|
|
7352
|
+
throw error[0];
|
|
7353
|
+
}
|
|
7354
|
+
}
|
|
7355
|
+
} catch (err) {
|
|
7356
|
+
const msg = String(err);
|
|
7357
|
+
let defaultCode = "RETRIEVAL_FAILED";
|
|
7358
|
+
if (msg.includes("Embed") || msg.includes("embed")) {
|
|
7359
|
+
defaultCode = "EMBEDDING_FAILED";
|
|
7360
|
+
}
|
|
7361
|
+
throw wrapError(err, defaultCode);
|
|
7362
|
+
}
|
|
7240
7363
|
});
|
|
7241
7364
|
}
|
|
7242
7365
|
/**
|
|
7243
7366
|
* Ingest documents into the vector database.
|
|
7244
7367
|
*/
|
|
7245
7368
|
async ingest(documents, namespace) {
|
|
7246
|
-
|
|
7247
|
-
|
|
7369
|
+
try {
|
|
7370
|
+
await this.validationPromise;
|
|
7371
|
+
} catch (err) {
|
|
7372
|
+
throw wrapError(err, "CONFIGURATION_ERROR");
|
|
7373
|
+
}
|
|
7374
|
+
try {
|
|
7375
|
+
return await this.pipeline.ingest(documents, namespace);
|
|
7376
|
+
} catch (err) {
|
|
7377
|
+
const msg = String(err);
|
|
7378
|
+
let defaultCode = "RETRIEVAL_FAILED";
|
|
7379
|
+
if (msg.includes("Embed") || msg.includes("embed")) {
|
|
7380
|
+
defaultCode = "EMBEDDING_FAILED";
|
|
7381
|
+
}
|
|
7382
|
+
throw wrapError(err, defaultCode);
|
|
7383
|
+
}
|
|
7248
7384
|
}
|
|
7249
7385
|
/**
|
|
7250
7386
|
* Get auto-suggestions based on a query prefix.
|
|
7251
7387
|
*/
|
|
7252
7388
|
async getSuggestions(query, namespace) {
|
|
7253
|
-
|
|
7254
|
-
|
|
7255
|
-
|
|
7256
|
-
|
|
7257
|
-
|
|
7258
|
-
|
|
7259
|
-
|
|
7260
|
-
|
|
7261
|
-
|
|
7262
|
-
|
|
7263
|
-
}
|
|
7264
|
-
async initialize() {
|
|
7265
|
-
await ConfigValidator.validateAndThrow(this.config);
|
|
7266
|
-
await this.pipeline.initialize();
|
|
7267
|
-
}
|
|
7268
|
-
async ingest(documents, namespace) {
|
|
7269
|
-
return this.pipeline.ingest(documents, namespace);
|
|
7270
|
-
}
|
|
7271
|
-
async ask(question, history = [], namespace) {
|
|
7272
|
-
return this.pipeline.ask(question, history, namespace);
|
|
7273
|
-
}
|
|
7274
|
-
askStream(question, history = [], namespace) {
|
|
7275
|
-
return this.pipeline.askStream(question, history, namespace);
|
|
7276
|
-
}
|
|
7277
|
-
getPipeline() {
|
|
7278
|
-
return this.pipeline;
|
|
7389
|
+
try {
|
|
7390
|
+
await this.validationPromise;
|
|
7391
|
+
} catch (err) {
|
|
7392
|
+
throw wrapError(err, "CONFIGURATION_ERROR");
|
|
7393
|
+
}
|
|
7394
|
+
try {
|
|
7395
|
+
return await this.pipeline.getSuggestions(query, namespace);
|
|
7396
|
+
} catch (err) {
|
|
7397
|
+
throw wrapError(err, "RETRIEVAL_FAILED");
|
|
7398
|
+
}
|
|
7279
7399
|
}
|
|
7280
7400
|
};
|
|
7281
7401
|
|
|
@@ -7822,6 +7942,79 @@ function createUploadHandler(configOrPlugin) {
|
|
|
7822
7942
|
}
|
|
7823
7943
|
};
|
|
7824
7944
|
}
|
|
7945
|
+
function createSuggestionsHandler(configOrPlugin) {
|
|
7946
|
+
const plugin = configOrPlugin instanceof VectorPlugin ? configOrPlugin : new VectorPlugin(configOrPlugin);
|
|
7947
|
+
return async function POST(req) {
|
|
7948
|
+
try {
|
|
7949
|
+
const body = await req.json();
|
|
7950
|
+
const { query, namespace } = body;
|
|
7951
|
+
if (typeof query !== "string") {
|
|
7952
|
+
return NextResponse.json({ error: "query is required" }, { status: 400 });
|
|
7953
|
+
}
|
|
7954
|
+
const suggestions = await plugin.getSuggestions(query, namespace);
|
|
7955
|
+
return NextResponse.json({ suggestions });
|
|
7956
|
+
} catch (err) {
|
|
7957
|
+
const message = err instanceof Error ? err.message : "Internal server error";
|
|
7958
|
+
return NextResponse.json({ error: message }, { status: 500 });
|
|
7959
|
+
}
|
|
7960
|
+
};
|
|
7961
|
+
}
|
|
7962
|
+
function createRagHandler(configOrPlugin) {
|
|
7963
|
+
const plugin = configOrPlugin instanceof VectorPlugin ? configOrPlugin : new VectorPlugin(configOrPlugin);
|
|
7964
|
+
const chatHandler = createChatHandler(plugin);
|
|
7965
|
+
const streamHandler = createStreamHandler(plugin);
|
|
7966
|
+
const uploadHandler = createUploadHandler(plugin);
|
|
7967
|
+
const healthHandler = createHealthHandler(plugin);
|
|
7968
|
+
const suggestionsHandler = createSuggestionsHandler(plugin);
|
|
7969
|
+
async function routePostRequest(req, segment) {
|
|
7970
|
+
switch (segment) {
|
|
7971
|
+
case "chat":
|
|
7972
|
+
return streamHandler(req);
|
|
7973
|
+
case "chat-sync":
|
|
7974
|
+
return chatHandler(req);
|
|
7975
|
+
case "upload":
|
|
7976
|
+
return uploadHandler(req);
|
|
7977
|
+
case "suggestions":
|
|
7978
|
+
return suggestionsHandler(req);
|
|
7979
|
+
case "health":
|
|
7980
|
+
return healthHandler();
|
|
7981
|
+
default:
|
|
7982
|
+
return NextResponse.json({ error: `Not Found: POST segment "${segment}" not supported.` }, { status: 404 });
|
|
7983
|
+
}
|
|
7984
|
+
}
|
|
7985
|
+
async function routeGetRequest(req, segment) {
|
|
7986
|
+
if (segment === "health") {
|
|
7987
|
+
return healthHandler();
|
|
7988
|
+
}
|
|
7989
|
+
return NextResponse.json({ error: `Method Not Allowed: GET is only supported for "health" segment.` }, { status: 405 });
|
|
7990
|
+
}
|
|
7991
|
+
async function getSegment(context) {
|
|
7992
|
+
var _a;
|
|
7993
|
+
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;
|
|
7994
|
+
const segments = (resolvedParams == null ? void 0 : resolvedParams.retrivora) || [];
|
|
7995
|
+
return segments[0] || "chat";
|
|
7996
|
+
}
|
|
7997
|
+
return {
|
|
7998
|
+
GET: async (req, context) => {
|
|
7999
|
+
try {
|
|
8000
|
+
const segment = await getSegment(context);
|
|
8001
|
+
return await routeGetRequest(req, segment);
|
|
8002
|
+
} catch (err) {
|
|
8003
|
+
const msg = err instanceof Error ? err.message : "GET Routing failed";
|
|
8004
|
+
return NextResponse.json({ error: msg }, { status: 500 });
|
|
8005
|
+
}
|
|
8006
|
+
},
|
|
8007
|
+
POST: async (req, context) => {
|
|
8008
|
+
try {
|
|
8009
|
+
const segment = await getSegment(context);
|
|
8010
|
+
return await routePostRequest(req, segment);
|
|
8011
|
+
} catch (err) {
|
|
8012
|
+
const msg = err instanceof Error ? err.message : "POST Routing failed";
|
|
8013
|
+
return NextResponse.json({ error: msg }, { status: 500 });
|
|
8014
|
+
}
|
|
8015
|
+
}
|
|
8016
|
+
};
|
|
8017
|
+
}
|
|
7825
8018
|
export {
|
|
7826
8019
|
AnthropicProvider,
|
|
7827
8020
|
AuthenticationException,
|
|
@@ -7866,11 +8059,13 @@ export {
|
|
|
7866
8059
|
createFromPreset,
|
|
7867
8060
|
createHealthHandler,
|
|
7868
8061
|
createIngestHandler,
|
|
8062
|
+
createRagHandler,
|
|
7869
8063
|
createStreamHandler,
|
|
7870
8064
|
createUploadHandler,
|
|
7871
8065
|
getRagConfig,
|
|
7872
8066
|
sseErrorFrame,
|
|
7873
8067
|
sseFrame,
|
|
7874
8068
|
sseMetaFrame,
|
|
7875
|
-
sseTextFrame
|
|
8069
|
+
sseTextFrame,
|
|
8070
|
+
wrapError
|
|
7876
8071
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@retrivora-ai/rag-engine",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.7",
|
|
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",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"scripts": {
|
|
75
75
|
"dev": "next dev",
|
|
76
76
|
"build": "next build",
|
|
77
|
-
"build:pkg": "tsup src/index.ts src/handlers/index.ts src/server.ts --format cjs,esm --dts --clean --no-splitting --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
|
+
"build:pkg": "npx @tailwindcss/cli -i src/tailwind.css -o src/index.css && tsup src/index.ts src/handlers/index.ts src/server.ts --format cjs,esm --dts --clean --no-splitting --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 --inject-style && npx @tailwindcss/cli -i src/tailwind.css -o dist/index.css && rm src/index.css",
|
|
78
78
|
"start": "next start",
|
|
79
79
|
"lint": "eslint",
|
|
80
80
|
"prepublishOnly": "npm run build:pkg"
|
|
@@ -95,8 +95,6 @@
|
|
|
95
95
|
"next-themes": "^0.4.6",
|
|
96
96
|
"openai": "^6.34.0",
|
|
97
97
|
"papaparse": "^5.5.3",
|
|
98
|
-
"react": ">=18.0.0",
|
|
99
|
-
"react-dom": ">=18.0.0",
|
|
100
98
|
"react-is": "^18.3.1",
|
|
101
99
|
"react-markdown": "^10.1.0",
|
|
102
100
|
"recharts": "^3.8.1",
|