@retrivora-ai/rag-engine 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DocumentChunker-Dh9TvmGG.d.mts +45 -0
- package/dist/DocumentChunker-Dh9TvmGG.d.ts +45 -0
- package/dist/{index-DPsQodME.d.mts → ILLMProvider-BOJFz3Na.d.mts} +104 -1
- package/dist/{index-DPsQodME.d.ts → ILLMProvider-BOJFz3Na.d.ts} +104 -1
- package/dist/MultiTablePostgresProvider-ZLGSKTJR.mjs +8 -0
- package/dist/chunk-ICKRMZQK.mjs +76 -0
- package/dist/{chunk-PV3MFHWU.mjs → chunk-LZVVLSDN.mjs} +977 -516
- package/dist/chunk-OZFBG4BA.mjs +291 -0
- package/dist/handlers/index.d.mts +2 -2
- package/dist/handlers/index.d.ts +2 -2
- package/dist/handlers/index.js +1269 -656
- package/dist/handlers/index.mjs +4 -1
- package/dist/{index-Bb2yEopi.d.mts → index-BwpcaziY.d.ts} +10 -2
- package/dist/{index-CkbTzj9J.d.ts → index-D3V9Et2M.d.mts} +10 -2
- package/dist/index.d.mts +24 -4
- package/dist/index.d.ts +24 -4
- package/dist/index.js +1354 -826
- package/dist/index.mjs +1284 -795
- package/dist/server.d.mts +47 -27
- package/dist/server.d.ts +47 -27
- package/dist/server.js +1417 -829
- package/dist/server.mjs +164 -176
- package/package.json +6 -2
- package/src/app/api/upload/route.ts +4 -0
- package/src/app/constants.tsx +2 -2
- package/src/app/page.tsx +12 -322
- package/src/components/AmbientBackground.tsx +29 -0
- package/src/components/ArchitectureCard.tsx +17 -0
- package/src/components/ArchitectureCardsSection.tsx +15 -0
- package/src/components/ChatWindow.tsx +32 -0
- package/src/components/CodeViewer.tsx +51 -0
- package/src/components/ConfigProvider.tsx +1 -0
- package/src/components/DocViewer.tsx +37 -0
- package/src/components/DocumentUpload.tsx +44 -1
- package/src/components/Documentation.tsx +58 -0
- package/src/components/DynamicChart.tsx +27 -2
- package/src/components/Hero.tsx +59 -0
- package/src/components/HourglassLoader.tsx +87 -0
- package/src/components/Lifecycle.tsx +37 -0
- package/src/components/MarkdownComponents.tsx +140 -0
- package/src/components/MessageBubble.tsx +124 -904
- package/src/components/Navbar.tsx +55 -0
- package/src/components/ObservabilityPanel.tsx +374 -0
- package/src/components/ProductCard.tsx +5 -3
- package/src/components/UIDispatcher.tsx +344 -0
- package/src/components/VisualizationRenderer.tsx +372 -250
- package/src/config/RagConfig.ts +5 -0
- package/src/config/serverConfig.ts +3 -1
- package/src/core/Pipeline.ts +240 -271
- package/src/core/ProviderRegistry.ts +2 -2
- package/src/core/VectorPlugin.ts +9 -0
- package/src/handlers/index.ts +91 -15
- package/src/hooks/useRagChat.ts +21 -11
- package/src/index.ts +9 -1
- package/src/llm/LLMFactory.ts +54 -2
- package/src/llm/providers/AnthropicProvider.ts +12 -8
- package/src/llm/providers/GeminiProvider.ts +188 -143
- package/src/llm/providers/OllamaProvider.ts +7 -3
- package/src/llm/providers/OpenAIProvider.ts +12 -8
- package/src/providers/vectordb/MultiTablePostgresProvider.ts +150 -64
- package/src/types/chat.ts +8 -0
- package/src/types/index.ts +132 -0
- package/src/types/props.ts +9 -1
- package/src/utils/ProductExtractor.ts +347 -0
- package/src/utils/SchemaMapper.ts +129 -0
- package/src/utils/UITransformer.ts +470 -209
- package/src/utils/synonyms.ts +78 -0
- package/dist/DocumentChunker-C1GEEosY.d.ts +0 -93
- package/dist/DocumentChunker-CFEiRopR.d.mts +0 -93
- package/dist/PostgreSQLProvider-BMOETDZA.mjs +0 -8
- package/dist/chunk-FLOSGE6A.mjs +0 -202
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BaseVectorProvider
|
|
3
|
+
} from "./chunk-IMP6FUCY.mjs";
|
|
4
|
+
import {
|
|
5
|
+
__objRest,
|
|
6
|
+
__spreadProps,
|
|
7
|
+
__spreadValues
|
|
8
|
+
} from "./chunk-X4TOT24V.mjs";
|
|
9
|
+
|
|
10
|
+
// src/providers/vectordb/MultiTablePostgresProvider.ts
|
|
11
|
+
import { Pool } from "pg";
|
|
12
|
+
var MultiTablePostgresProvider = class extends BaseVectorProvider {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
var _a, _b, _c;
|
|
15
|
+
super(config);
|
|
16
|
+
const opts = config.options || {};
|
|
17
|
+
if (!opts.connectionString) {
|
|
18
|
+
throw new Error("[MultiTablePostgresProvider] options.connectionString is required");
|
|
19
|
+
}
|
|
20
|
+
this.connectionString = opts.connectionString;
|
|
21
|
+
this.dimensions = (_a = opts.dimensions) != null ? _a : 768;
|
|
22
|
+
this.tables = [];
|
|
23
|
+
const rawSearchFields = (_c = (_b = opts.searchFields) != null ? _b : process.env.VECTOR_DB_SEARCH_FIELDS) != null ? _c : ["name", "product_name", "productname", "title"];
|
|
24
|
+
this.searchFields = typeof rawSearchFields === "string" ? rawSearchFields.split(",").map((f) => f.trim()).filter(Boolean) : rawSearchFields;
|
|
25
|
+
this.uploadTable = opts.uploadTable || "document_chunks";
|
|
26
|
+
}
|
|
27
|
+
async initialize() {
|
|
28
|
+
this.pool = new Pool({ connectionString: this.connectionString });
|
|
29
|
+
const client = await this.pool.connect();
|
|
30
|
+
try {
|
|
31
|
+
await client.query("CREATE EXTENSION IF NOT EXISTS vector");
|
|
32
|
+
await client.query(`
|
|
33
|
+
CREATE TABLE IF NOT EXISTS ${this.uploadTable} (
|
|
34
|
+
id TEXT PRIMARY KEY,
|
|
35
|
+
namespace TEXT NOT NULL DEFAULT '',
|
|
36
|
+
content TEXT NOT NULL,
|
|
37
|
+
metadata JSONB,
|
|
38
|
+
embedding VECTOR(${this.dimensions})
|
|
39
|
+
)
|
|
40
|
+
`);
|
|
41
|
+
await client.query(`
|
|
42
|
+
CREATE INDEX IF NOT EXISTS ${this.uploadTable}_embedding_idx
|
|
43
|
+
ON ${this.uploadTable}
|
|
44
|
+
USING hnsw (embedding vector_cosine_ops)
|
|
45
|
+
`);
|
|
46
|
+
const res = await client.query(`
|
|
47
|
+
SELECT table_name
|
|
48
|
+
FROM information_schema.columns
|
|
49
|
+
WHERE column_name = 'embedding'
|
|
50
|
+
AND table_schema = 'public'
|
|
51
|
+
`);
|
|
52
|
+
this.tables = res.rows.map((r) => r.table_name);
|
|
53
|
+
if (this.tables.length === 0) {
|
|
54
|
+
console.warn('[MultiTablePostgresProvider] No tables with "embedding" columns found in the database.');
|
|
55
|
+
} else {
|
|
56
|
+
console.log(
|
|
57
|
+
`[MultiTablePostgresProvider] Connected. Searching across ${this.tables.length} table(s): ${this.tables.join(", ")}`
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
} finally {
|
|
61
|
+
client.release();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Upsert a document by dynamically provisioning a table and columns.
|
|
66
|
+
*/
|
|
67
|
+
async upsert(doc, namespace = "") {
|
|
68
|
+
await this.batchUpsert([doc], namespace);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Batch upsert documents by dynamically provisioning tables and columns based on CSV headers.
|
|
72
|
+
*/
|
|
73
|
+
async batchUpsert(docs, namespace = "") {
|
|
74
|
+
var _a;
|
|
75
|
+
if (docs.length === 0) return;
|
|
76
|
+
const docsByFile = {};
|
|
77
|
+
for (const doc of docs) {
|
|
78
|
+
const fileName = ((_a = doc.metadata) == null ? void 0 : _a.fileName) || this.uploadTable;
|
|
79
|
+
if (!docsByFile[fileName]) docsByFile[fileName] = [];
|
|
80
|
+
docsByFile[fileName].push(doc);
|
|
81
|
+
}
|
|
82
|
+
const client = await this.pool.connect();
|
|
83
|
+
try {
|
|
84
|
+
await client.query("BEGIN");
|
|
85
|
+
for (const [fileName, fileDocs] of Object.entries(docsByFile)) {
|
|
86
|
+
let tableName = fileName;
|
|
87
|
+
if (tableName.toLowerCase().endsWith(".csv")) {
|
|
88
|
+
tableName = tableName.slice(0, -4);
|
|
89
|
+
}
|
|
90
|
+
tableName = tableName.replace(/[^a-z0-9_]/gi, "_").toLowerCase() || this.uploadTable;
|
|
91
|
+
const firstMeta = fileDocs[0].metadata || {};
|
|
92
|
+
const systemKeys = ["fileName", "fileSize", "fileType", "uploadedAt", "dimension", "chunkIndex", "id", "namespace", "content", "metadata", "embedding"];
|
|
93
|
+
const csvHeaders = Object.keys(firstMeta).filter((k) => !systemKeys.includes(k) && !systemKeys.includes(k.toLowerCase()));
|
|
94
|
+
const columnDefs = csvHeaders.map((h) => `"${h}" TEXT`).join(",\n ");
|
|
95
|
+
const createTableSql = `
|
|
96
|
+
CREATE TABLE IF NOT EXISTS "${tableName}" (
|
|
97
|
+
id TEXT PRIMARY KEY,
|
|
98
|
+
${columnDefs ? columnDefs + "," : ""}
|
|
99
|
+
namespace TEXT NOT NULL DEFAULT '',
|
|
100
|
+
content TEXT NOT NULL,
|
|
101
|
+
metadata JSONB,
|
|
102
|
+
embedding VECTOR(${this.dimensions})
|
|
103
|
+
)
|
|
104
|
+
`;
|
|
105
|
+
await client.query(createTableSql);
|
|
106
|
+
await client.query(`
|
|
107
|
+
CREATE INDEX IF NOT EXISTS "${tableName}_embedding_idx"
|
|
108
|
+
ON "${tableName}"
|
|
109
|
+
USING hnsw (embedding vector_cosine_ops)
|
|
110
|
+
`);
|
|
111
|
+
if (!this.tables.includes(tableName)) {
|
|
112
|
+
this.tables.push(tableName);
|
|
113
|
+
}
|
|
114
|
+
const BATCH_SIZE = 50;
|
|
115
|
+
for (let i = 0; i < fileDocs.length; i += BATCH_SIZE) {
|
|
116
|
+
const batch = fileDocs.slice(i, i + BATCH_SIZE);
|
|
117
|
+
const values = [];
|
|
118
|
+
const headerColumns = csvHeaders.map((h) => `"${h}"`).join(", ");
|
|
119
|
+
const allColumns = `id, ${headerColumns ? headerColumns + ", " : ""}namespace, content, metadata, embedding`;
|
|
120
|
+
const valuePlaceholders = batch.map((doc, idx) => {
|
|
121
|
+
var _a2, _b;
|
|
122
|
+
const offset = idx * (5 + csvHeaders.length);
|
|
123
|
+
values.push(doc.id);
|
|
124
|
+
for (const h of csvHeaders) {
|
|
125
|
+
values.push(String(((_a2 = doc.metadata) == null ? void 0 : _a2[h]) || ""));
|
|
126
|
+
}
|
|
127
|
+
values.push(namespace, doc.content, JSON.stringify((_b = doc.metadata) != null ? _b : {}), `[${doc.vector.join(",")}]`);
|
|
128
|
+
const docPlaceholders = [];
|
|
129
|
+
for (let j = 1; j <= 5 + csvHeaders.length; j++) {
|
|
130
|
+
if (j === 5 + csvHeaders.length) {
|
|
131
|
+
docPlaceholders.push(`$${offset + j}::vector`);
|
|
132
|
+
} else {
|
|
133
|
+
docPlaceholders.push(`$${offset + j}`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return `(${docPlaceholders.join(", ")})`;
|
|
137
|
+
}).join(", ");
|
|
138
|
+
const conflictUpdates = csvHeaders.map((h) => `"${h}" = EXCLUDED."${h}"`).join(",\n ");
|
|
139
|
+
const query = `
|
|
140
|
+
INSERT INTO "${tableName}" (${allColumns})
|
|
141
|
+
VALUES ${valuePlaceholders}
|
|
142
|
+
ON CONFLICT (id) DO UPDATE
|
|
143
|
+
SET ${conflictUpdates ? conflictUpdates + "," : ""}
|
|
144
|
+
namespace = EXCLUDED.namespace,
|
|
145
|
+
content = EXCLUDED.content,
|
|
146
|
+
metadata = EXCLUDED.metadata,
|
|
147
|
+
embedding = EXCLUDED.embedding
|
|
148
|
+
`;
|
|
149
|
+
await client.query(query, values);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
await client.query("COMMIT");
|
|
153
|
+
} catch (error) {
|
|
154
|
+
await client.query("ROLLBACK");
|
|
155
|
+
throw error;
|
|
156
|
+
} finally {
|
|
157
|
+
client.release();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Query all configured tables and merge results, sorted by cosine similarity score.
|
|
162
|
+
*/
|
|
163
|
+
async query(vector, topK, _namespace, _filter) {
|
|
164
|
+
var _a;
|
|
165
|
+
if (!this.pool) {
|
|
166
|
+
throw new Error("[MultiTablePostgresProvider] Provider not initialized. Call initialize() first.");
|
|
167
|
+
}
|
|
168
|
+
const vectorLiteral = `[${vector.join(",")}]`;
|
|
169
|
+
const allResults = [];
|
|
170
|
+
console.log(`[MultiTablePostgresProvider] --- Starting Multi-Table Search ---`);
|
|
171
|
+
const queryText = _filter == null ? void 0 : _filter.queryText;
|
|
172
|
+
const entityHints = Array.isArray(_filter == null ? void 0 : _filter.__entityHints) ? _filter.__entityHints.filter(
|
|
173
|
+
(hint) => typeof hint === "object" && hint !== null && typeof hint.value === "string"
|
|
174
|
+
).map((hint) => hint.value.trim().toLowerCase()).filter(Boolean) : [];
|
|
175
|
+
console.log(`[MultiTablePostgresProvider] queryText: "${queryText}"`);
|
|
176
|
+
console.log(`[MultiTablePostgresProvider] entityHints: [${entityHints.join(", ")}]`);
|
|
177
|
+
const getDynamicKeywordQuery = () => {
|
|
178
|
+
if (entityHints.length > 0) {
|
|
179
|
+
return entityHints.map((h) => h.includes(" ") ? `"${h}"` : h).join(" & ");
|
|
180
|
+
}
|
|
181
|
+
if (queryText) {
|
|
182
|
+
return queryText.toLowerCase().replace(/\b(show|me|the|product[s]?|item[s]?|card[s]?|of|category|find|list|browse|what|are|display|all|under|for|in|with|about)\b/g, "").trim().replace(/\s+/g, " & ");
|
|
183
|
+
}
|
|
184
|
+
return "";
|
|
185
|
+
};
|
|
186
|
+
const dynamicKeywordQuery = getDynamicKeywordQuery();
|
|
187
|
+
const queryPromises = this.tables.map(async (table) => {
|
|
188
|
+
try {
|
|
189
|
+
let sqlQuery = "";
|
|
190
|
+
let params = [];
|
|
191
|
+
if (queryText) {
|
|
192
|
+
const hasEntityHints = entityHints.length > 0;
|
|
193
|
+
const exactNameScoreExpr = hasEntityHints ? `+ (
|
|
194
|
+
SELECT COALESCE(MAX(
|
|
195
|
+
CASE WHEN LOWER(val) IN (${entityHints.map((h) => `'${h.replace(/'/g, "''")}'`).join(", ")})
|
|
196
|
+
THEN 1.0 ELSE 0.0 END
|
|
197
|
+
), 0)
|
|
198
|
+
FROM jsonb_each_text(to_jsonb(t)) AS kv(key, val)
|
|
199
|
+
WHERE key IN (${this.searchFields.map((f) => `'${f}'`).join(", ")})
|
|
200
|
+
) * 3.0` : "";
|
|
201
|
+
sqlQuery = `
|
|
202
|
+
SELECT *,
|
|
203
|
+
(1 - (embedding <=> $1::vector)) AS vector_score,
|
|
204
|
+
COALESCE(ts_rank(to_tsvector('english', (to_jsonb(t) - 'embedding')::text), to_tsquery('english', $2)), 0) AS keyword_score,
|
|
205
|
+
((1 - (embedding <=> $1::vector)) + (COALESCE(ts_rank(to_tsvector('english', (to_jsonb(t) - 'embedding')::text), to_tsquery('english', $2)), 0) * 2.0) ${exactNameScoreExpr}) AS hybrid_score
|
|
206
|
+
FROM "${table}" t
|
|
207
|
+
ORDER BY hybrid_score DESC
|
|
208
|
+
LIMIT 50
|
|
209
|
+
`;
|
|
210
|
+
params = [vectorLiteral, dynamicKeywordQuery];
|
|
211
|
+
} else {
|
|
212
|
+
sqlQuery = `
|
|
213
|
+
SELECT *,
|
|
214
|
+
(1 - (embedding <=> $1::vector)) AS hybrid_score
|
|
215
|
+
FROM "${table}" t
|
|
216
|
+
ORDER BY hybrid_score DESC
|
|
217
|
+
LIMIT 50
|
|
218
|
+
`;
|
|
219
|
+
params = [vectorLiteral];
|
|
220
|
+
}
|
|
221
|
+
const result = await this.pool.query(sqlQuery, params);
|
|
222
|
+
if (result.rowCount && result.rowCount > 0) {
|
|
223
|
+
console.log(` \u2705 Table "${table}": Found ${result.rowCount} potential matches. Top score: ${result.rows[0].hybrid_score.toFixed(4)}`);
|
|
224
|
+
} else {
|
|
225
|
+
console.log(` \u26AA Table "${table}": No relevant matches found.`);
|
|
226
|
+
}
|
|
227
|
+
const tableResults = [];
|
|
228
|
+
for (const row of result.rows) {
|
|
229
|
+
const _a2 = row, { hybrid_score, id } = _a2, rest = __objRest(_a2, ["hybrid_score", "id"]);
|
|
230
|
+
delete rest.embedding;
|
|
231
|
+
delete rest.vector_score;
|
|
232
|
+
delete rest.keyword_score;
|
|
233
|
+
delete rest.exact_name_score;
|
|
234
|
+
const content = `[TYPE: ${table.replace(/s$/, "").toUpperCase()}]
|
|
235
|
+
` + Object.entries(rest).filter(([k, v]) => v !== null && typeof v !== "object" && k !== "id").map(([k, v]) => `${k}: ${v}`).join("\n");
|
|
236
|
+
tableResults.push({
|
|
237
|
+
id: `${table}-${id}`,
|
|
238
|
+
score: parseFloat(String(hybrid_score)),
|
|
239
|
+
content,
|
|
240
|
+
metadata: __spreadProps(__spreadValues({}, rest), { source_table: table })
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
return tableResults;
|
|
244
|
+
} catch (err) {
|
|
245
|
+
console.error(
|
|
246
|
+
`[MultiTablePostgresProvider] Error querying table "${table}":`,
|
|
247
|
+
err.message
|
|
248
|
+
);
|
|
249
|
+
return [];
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
const resultsArray = await Promise.all(queryPromises);
|
|
253
|
+
for (const tableResults of resultsArray) {
|
|
254
|
+
allResults.push(...tableResults);
|
|
255
|
+
}
|
|
256
|
+
allResults.sort((a, b) => b.score - a.score);
|
|
257
|
+
if (allResults.length === 0) return [];
|
|
258
|
+
const bestMatchTable = (_a = allResults[0].metadata) == null ? void 0 : _a.source_table;
|
|
259
|
+
const finalSorted = allResults.filter((res) => {
|
|
260
|
+
var _a2;
|
|
261
|
+
return ((_a2 = res.metadata) == null ? void 0 : _a2.source_table) === bestMatchTable;
|
|
262
|
+
});
|
|
263
|
+
console.log(`[MultiTablePostgresProvider] --- Search Complete ---`);
|
|
264
|
+
console.log(`[MultiTablePostgresProvider] Final top match from "${bestMatchTable}" with score ${finalSorted[0].score.toFixed(4)}`);
|
|
265
|
+
console.log(`[MultiTablePostgresProvider] Restricting recommendations strictly to table: "${bestMatchTable}"`);
|
|
266
|
+
return finalSorted.slice(0, Math.max(topK, 15));
|
|
267
|
+
}
|
|
268
|
+
async delete(_id, _namespace) {
|
|
269
|
+
console.warn("[MultiTablePostgresProvider] delete() is a no-op for multi-table mode.");
|
|
270
|
+
}
|
|
271
|
+
async deleteNamespace(_namespace) {
|
|
272
|
+
console.warn("[MultiTablePostgresProvider] deleteNamespace() is a no-op for multi-table mode.");
|
|
273
|
+
}
|
|
274
|
+
async ping() {
|
|
275
|
+
try {
|
|
276
|
+
await this.pool.query("SELECT 1");
|
|
277
|
+
return true;
|
|
278
|
+
} catch (e) {
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
async disconnect() {
|
|
283
|
+
if (this.pool) {
|
|
284
|
+
await this.pool.end();
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
export {
|
|
290
|
+
MultiTablePostgresProvider
|
|
291
|
+
};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import '../
|
|
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, j as sseTextFrame,
|
|
1
|
+
import '../ILLMProvider-BOJFz3Na.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-D3V9Et2M.mjs';
|
|
3
3
|
import 'next/server';
|
package/dist/handlers/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import '../
|
|
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, j as sseTextFrame,
|
|
1
|
+
import '../ILLMProvider-BOJFz3Na.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-BwpcaziY.js';
|
|
3
3
|
import 'next/server';
|