@retrivora-ai/rag-engine 1.8.1 → 1.8.3
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/{ILLMProvider-BfRgI1Xh.d.mts → ILLMProvider-BOJFz3Na.d.mts} +47 -1
- package/dist/{ILLMProvider-BfRgI1Xh.d.ts → ILLMProvider-BOJFz3Na.d.ts} +47 -1
- package/dist/handlers/index.d.mts +2 -2
- package/dist/handlers/index.d.ts +2 -2
- package/dist/handlers/index.js +509 -162
- package/dist/handlers/index.mjs +5849 -15
- package/dist/{index-1Z4GuYBi.d.ts → index-BwpcaziY.d.ts} +4 -2
- package/dist/{index-BV0z5mb6.d.mts → index-D3V9Et2M.d.mts} +4 -2
- package/dist/index.d.mts +30 -16
- package/dist/index.d.ts +30 -16
- package/dist/index.js +1999 -1210
- package/dist/index.mjs +2041 -1205
- package/dist/server.d.mts +21 -25
- package/dist/server.d.ts +21 -25
- package/dist/server.js +536 -163
- package/dist/server.mjs +5923 -67
- package/package.json +9 -7
- package/src/app/api/upload/route.ts +4 -0
- package/src/app/constants.tsx +2 -2
- package/src/app/globals.css +35 -11
- package/src/app/page.tsx +12 -321
- package/src/components/AmbientBackground.tsx +29 -0
- package/src/components/ArchitectureCard.tsx +17 -0
- package/src/components/ArchitectureCardsSection.tsx +15 -0
- package/src/components/ChatWidget.tsx +0 -1
- 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 +143 -0
- package/src/components/MessageBubble.tsx +91 -1012
- package/src/components/Navbar.tsx +55 -0
- package/src/components/ObservabilityPanel.tsx +374 -0
- package/src/components/ProductCard.tsx +3 -1
- package/src/components/UIDispatcher.tsx +341 -0
- package/src/components/VisualizationRenderer.tsx +48 -26
- package/src/config/ConfigBuilder.ts +38 -1
- package/src/core/LangChainAgent.ts +1 -4
- package/src/core/Pipeline.ts +209 -86
- package/src/core/QueryProcessor.ts +65 -0
- package/src/handlers/index.ts +72 -12
- package/src/hooks/useRagChat.ts +19 -9
- package/src/index.ts +9 -1
- package/src/providers/vectordb/MultiTablePostgresProvider.ts +150 -64
- package/src/rag/Reranker.ts +99 -6
- package/src/types/chat.ts +2 -0
- package/src/types/index.ts +52 -0
- package/src/types/props.ts +9 -1
- package/src/utils/ProductExtractor.ts +347 -0
- package/src/utils/UITransformer.ts +4 -53
- package/src/utils/synonyms.ts +78 -0
- package/dist/ChromaDBProvider-MIDOR4FW.mjs +0 -8
- package/dist/MilvusProvider-U7SKC27V.mjs +0 -8
- package/dist/MongoDBProvider-YNKC7EJ6.mjs +0 -8
- package/dist/MultiTablePostgresProvider-YY7LPNJK.mjs +0 -8
- package/dist/PineconeProvider-QZNRKTN2.mjs +0 -8
- package/dist/QdrantProvider-RLJTNGPY.mjs +0 -8
- package/dist/RedisProvider-SR65SCKV.mjs +0 -8
- package/dist/SimpleGraphProvider-SLOXO4M7.mjs +0 -62
- package/dist/UniversalVectorProvider-IN67OS56.mjs +0 -9
- package/dist/WeaviateProvider-5FWDFITI.mjs +0 -8
- package/dist/chunk-5AJ4XHLW.mjs +0 -201
- package/dist/chunk-5YGUXK7Z.mjs +0 -80
- package/dist/chunk-BFYLQYQU.mjs +0 -3985
- package/dist/chunk-CFVEZTBJ.mjs +0 -102
- package/dist/chunk-IMP6FUCY.mjs +0 -30
- package/dist/chunk-LR3VMDVK.mjs +0 -157
- package/dist/chunk-M6JSPGAR.mjs +0 -117
- package/dist/chunk-PSFPZXHX.mjs +0 -245
- package/dist/chunk-R3RGUMHE.mjs +0 -218
- package/dist/chunk-U55XRW3U.mjs +0 -96
- package/dist/chunk-VUQJVIJT.mjs +0 -148
- package/dist/chunk-X4TOT24V.mjs +0 -89
- package/dist/chunk-YLTMFW4M.mjs +0 -49
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@retrivora-ai/rag-engine",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.3",
|
|
4
4
|
"description": "Retrivora AI is a plug-and-play AI engine for RAG chat experiences — generic vector DB + LLM provider, embeddable or standalone.",
|
|
5
5
|
"author": "Abhinav Alkuchi",
|
|
6
6
|
"license": "MIT",
|
|
@@ -73,29 +73,30 @@
|
|
|
73
73
|
"scripts": {
|
|
74
74
|
"dev": "next dev",
|
|
75
75
|
"build": "next build",
|
|
76
|
-
"build:pkg": "tsup src/index.ts src/handlers/index.ts src/server.ts --format cjs,esm --dts --clean --tsconfig tsconfig.build.json --external react,react-dom,next,mongodb,pg,openai,@anthropic-ai/sdk,@pinecone-database/pinecone,axios,lucide-react,mammoth,pdf-parse,react-markdown,remark-gfm,next-themes,langchain,@langchain/core,@langchain/openai,llamaindex",
|
|
76
|
+
"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
77
|
"start": "next start",
|
|
78
78
|
"lint": "eslint",
|
|
79
79
|
"prepublishOnly": "npm run build:pkg"
|
|
80
80
|
},
|
|
81
81
|
"peerDependencies": {
|
|
82
|
-
"next": ">=14.0.0",
|
|
83
82
|
"react": ">=18.0.0",
|
|
84
83
|
"react-dom": ">=18.0.0"
|
|
85
84
|
},
|
|
86
85
|
"dependencies": {
|
|
87
|
-
"@anthropic-ai/sdk": "^0.
|
|
86
|
+
"@anthropic-ai/sdk": "^0.95.1",
|
|
87
|
+
"@google/genai": "^0.8.0",
|
|
88
88
|
"@google/generative-ai": "^0.24.1",
|
|
89
89
|
"@pinecone-database/pinecone": "^7.2.0",
|
|
90
|
+
"@types/papaparse": "^5.5.2",
|
|
90
91
|
"axios": "^1.15.0",
|
|
91
92
|
"lucide-react": "^1.8.0",
|
|
92
|
-
"next": "
|
|
93
|
+
"next": "^16.2.6",
|
|
93
94
|
"next-themes": "^0.4.6",
|
|
94
95
|
"openai": "^6.34.0",
|
|
96
|
+
"papaparse": "^5.5.3",
|
|
95
97
|
"react": ">=18.0.0",
|
|
96
98
|
"react-dom": ">=18.0.0",
|
|
97
99
|
"react-is": "^18.3.1",
|
|
98
|
-
"@google/genai": "^0.8.0",
|
|
99
100
|
"react-markdown": "^10.1.0",
|
|
100
101
|
"recharts": "^3.8.1",
|
|
101
102
|
"remark-gfm": "^4.0.1"
|
|
@@ -104,7 +105,7 @@
|
|
|
104
105
|
"@langchain/core": "^1.1.42",
|
|
105
106
|
"@langchain/openai": "^1.4.5",
|
|
106
107
|
"langchain": "^1.3.5",
|
|
107
|
-
"llamaindex": "^0.
|
|
108
|
+
"llamaindex": "^0.11.9",
|
|
108
109
|
"mammoth": "^1.8.0",
|
|
109
110
|
"mongodb": "^7.1.1",
|
|
110
111
|
"pdf-parse": "^1.1.1",
|
|
@@ -112,6 +113,7 @@
|
|
|
112
113
|
},
|
|
113
114
|
"devDependencies": {
|
|
114
115
|
"@tailwindcss/postcss": "^4",
|
|
116
|
+
"@types/estree": "^1.0.9",
|
|
115
117
|
"@types/node": "^20",
|
|
116
118
|
"@types/pdf-parse": "^1.1.5",
|
|
117
119
|
"@types/pg": "^8.20.0",
|
package/src/app/constants.tsx
CHANGED
|
@@ -112,12 +112,12 @@ const { reply, sources } = await pipeline.ask('How does Retrivora work?');`,
|
|
|
112
112
|
title: 'Route Handlers',
|
|
113
113
|
language: 'typescript',
|
|
114
114
|
description: 'Deploy production-ready API endpoints in seconds using pre-built factories.',
|
|
115
|
-
code: `import {
|
|
115
|
+
code: `import { createChatStreamHandler, createUploadHandler, getRagConfig } from '@retrivora-ai/rag-engine/server';
|
|
116
116
|
|
|
117
117
|
const config = getRagConfig();
|
|
118
118
|
|
|
119
119
|
// src/app/api/chat/route.ts
|
|
120
|
-
export const POST =
|
|
120
|
+
export const POST = createChatStreamHandler(config);
|
|
121
121
|
|
|
122
122
|
// src/app/api/upload/route.ts
|
|
123
123
|
export const POST = createUploadHandler(config);`,
|
package/src/app/globals.css
CHANGED
|
@@ -7,15 +7,20 @@
|
|
|
7
7
|
/* ─── Design Tokens ─────────────────────────────────────────── */
|
|
8
8
|
:root {
|
|
9
9
|
--font-inter: 'Inter', sans-serif;
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
/* Light Mode (Default) */
|
|
12
|
-
--bg-base: #f8fafc;
|
|
12
|
+
--bg-base: #f8fafc;
|
|
13
|
+
/* slate-50 */
|
|
13
14
|
--bg-surface: #ffffff;
|
|
14
|
-
--bg-elevated: #f1f5f9;
|
|
15
|
+
--bg-elevated: #f1f5f9;
|
|
16
|
+
/* slate-100 */
|
|
15
17
|
--border: rgba(0, 0, 0, 0.08);
|
|
16
|
-
--text-primary: #0f172a;
|
|
17
|
-
|
|
18
|
-
--text-
|
|
18
|
+
--text-primary: #0f172a;
|
|
19
|
+
/* slate-900 */
|
|
20
|
+
--text-secondary: #475569;
|
|
21
|
+
/* slate-600 */
|
|
22
|
+
--text-muted: #94a3b8;
|
|
23
|
+
/* slate-400 */
|
|
19
24
|
}
|
|
20
25
|
|
|
21
26
|
.dark {
|
|
@@ -54,13 +59,16 @@ body {
|
|
|
54
59
|
width: 4px;
|
|
55
60
|
height: 4px;
|
|
56
61
|
}
|
|
62
|
+
|
|
57
63
|
::-webkit-scrollbar-track {
|
|
58
64
|
background: transparent;
|
|
59
65
|
}
|
|
66
|
+
|
|
60
67
|
::-webkit-scrollbar-thumb {
|
|
61
68
|
background: rgba(255, 255, 255, 0.12);
|
|
62
69
|
border-radius: 999px;
|
|
63
70
|
}
|
|
71
|
+
|
|
64
72
|
::-webkit-scrollbar-thumb:hover {
|
|
65
73
|
background: rgba(255, 255, 255, 0.2);
|
|
66
74
|
}
|
|
@@ -93,13 +101,21 @@ body {
|
|
|
93
101
|
margin: 0.5em 0;
|
|
94
102
|
}
|
|
95
103
|
|
|
96
|
-
.prose ul,
|
|
104
|
+
.prose ul,
|
|
105
|
+
.prose ol {
|
|
97
106
|
padding-left: 1.5em;
|
|
98
107
|
margin: 0.5em 0;
|
|
99
108
|
}
|
|
100
109
|
|
|
101
110
|
.prose li {
|
|
102
111
|
margin: 0.25em 0;
|
|
112
|
+
list-style-type: none;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.prose li::before {
|
|
116
|
+
content: "\27A4";
|
|
117
|
+
/* Unicode for a right-pointing arrow */
|
|
118
|
+
padding-right: 8px;
|
|
103
119
|
}
|
|
104
120
|
|
|
105
121
|
.prose table {
|
|
@@ -109,7 +125,8 @@ body {
|
|
|
109
125
|
font-size: 0.8rem;
|
|
110
126
|
}
|
|
111
127
|
|
|
112
|
-
.prose th,
|
|
128
|
+
.prose th,
|
|
129
|
+
.prose td {
|
|
113
130
|
border: 1px solid var(--border);
|
|
114
131
|
padding: 0.5rem;
|
|
115
132
|
text-align: left;
|
|
@@ -175,6 +192,7 @@ body {
|
|
|
175
192
|
opacity: 0;
|
|
176
193
|
transform: translateY(8px);
|
|
177
194
|
}
|
|
195
|
+
|
|
178
196
|
to {
|
|
179
197
|
opacity: 1;
|
|
180
198
|
transform: translateY(0);
|
|
@@ -186,6 +204,7 @@ body {
|
|
|
186
204
|
opacity: 0;
|
|
187
205
|
transform: translateY(16px) scale(0.98);
|
|
188
206
|
}
|
|
207
|
+
|
|
189
208
|
to {
|
|
190
209
|
opacity: 1;
|
|
191
210
|
transform: translateY(0) scale(1);
|
|
@@ -193,8 +212,13 @@ body {
|
|
|
193
212
|
}
|
|
194
213
|
|
|
195
214
|
@keyframes shimmer {
|
|
196
|
-
0% {
|
|
197
|
-
|
|
215
|
+
0% {
|
|
216
|
+
background-position: -200% 0;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
100% {
|
|
220
|
+
background-position: 200% 0;
|
|
221
|
+
}
|
|
198
222
|
}
|
|
199
223
|
|
|
200
224
|
.animate-fade-in-up {
|
|
@@ -218,4 +242,4 @@ body {
|
|
|
218
242
|
-webkit-background-clip: text;
|
|
219
243
|
-webkit-text-fill-color: transparent;
|
|
220
244
|
background-clip: text;
|
|
221
|
-
}
|
|
245
|
+
}
|
package/src/app/page.tsx
CHANGED
|
@@ -1,334 +1,25 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import React from 'react';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Package,
|
|
11
|
-
Check,
|
|
12
|
-
Copy,
|
|
13
|
-
} from 'lucide-react';
|
|
14
|
-
import { ChatWindow } from '@/components/ChatWindow';
|
|
4
|
+
import { AmbientBackground } from '@/components/AmbientBackground';
|
|
5
|
+
import { Navbar } from '@/components/Navbar';
|
|
6
|
+
import { Hero } from '@/components/Hero';
|
|
7
|
+
import { Lifecycle } from '@/components/Lifecycle';
|
|
8
|
+
import { ArchitectureCardsSection } from '@/components/ArchitectureCardsSection';
|
|
9
|
+
import { Documentation } from '@/components/Documentation';
|
|
15
10
|
import { ChatWidget } from '@/components/ChatWidget';
|
|
16
|
-
import { useConfig } from '@/components/ConfigProvider';
|
|
17
|
-
import { ThemeToggle } from '@/components/ThemeToggle';
|
|
18
|
-
import { Snippet, ArchitectureCardProps } from './types';
|
|
19
|
-
import {
|
|
20
|
-
LANDING_PAGE_CONTENT,
|
|
21
|
-
VECTOR_DATABASES,
|
|
22
|
-
AI_MODELS,
|
|
23
|
-
PIPELINE_STEPS,
|
|
24
|
-
SNIPPETS,
|
|
25
|
-
ARCHITECTURE_CARDS,
|
|
26
|
-
QUICK_START_STEPS,
|
|
27
|
-
API_ENDPOINTS,
|
|
28
|
-
} from './constants';
|
|
29
|
-
|
|
30
|
-
// ── Components ──────────────────────────────────────────────────────────────
|
|
31
|
-
|
|
32
|
-
function ArchitectureCard({ icon, title, description, badge, badgeColor }: ArchitectureCardProps) {
|
|
33
|
-
return (
|
|
34
|
-
<div className="group rounded-2xl border border-slate-200 dark:border-white/10 bg-white dark:bg-white/5 p-6 shadow-sm transition-all duration-300 hover:border-indigo-500/50 dark:hover:border-indigo-500/30 hover:shadow-xl hover:shadow-indigo-500/5">
|
|
35
|
-
<div className="mb-4 flex items-center justify-between">
|
|
36
|
-
<div className="text-3xl transition-transform duration-300 group-hover:scale-110">{icon}</div>
|
|
37
|
-
<span className={`rounded-full border px-3 py-0.5 text-[10px] font-bold uppercase tracking-wider ${badgeColor}`}>
|
|
38
|
-
{badge}
|
|
39
|
-
</span>
|
|
40
|
-
</div>
|
|
41
|
-
<h3 className="mb-2 font-bold text-slate-900 dark:text-white">{title}</h3>
|
|
42
|
-
<p className="text-xs text-slate-500 dark:text-white/40 leading-relaxed font-medium">{description}</p>
|
|
43
|
-
</div>
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function CodeViewer({ snippet }: { snippet: Snippet }) {
|
|
48
|
-
const [copied, setCopied] = React.useState(false);
|
|
49
|
-
|
|
50
|
-
const handleCopy = () => {
|
|
51
|
-
navigator.clipboard.writeText(snippet.code);
|
|
52
|
-
setCopied(true);
|
|
53
|
-
setTimeout(() => setCopied(false), 2000);
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
return (
|
|
57
|
-
<div className="flex flex-col h-full rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-slate-900/50 shadow-lg overflow-hidden min-h-[440px]">
|
|
58
|
-
<div className="flex items-center justify-between px-5 py-3 border-b border-slate-200 dark:border-white/10 bg-white dark:bg-slate-900">
|
|
59
|
-
<div className="flex items-center gap-3">
|
|
60
|
-
<div className="flex gap-1.5">
|
|
61
|
-
<div className="w-2.5 h-2.5 rounded-full bg-red-500" />
|
|
62
|
-
<div className="w-2.5 h-2.5 rounded-full bg-yellow-500" />
|
|
63
|
-
<div className="w-2.5 h-2.5 rounded-full bg-green-500" />
|
|
64
|
-
</div>
|
|
65
|
-
<span className="text-[10px] font-mono text-slate-400 dark:text-white/30 uppercase tracking-widest ml-2">{snippet.language}</span>
|
|
66
|
-
</div>
|
|
67
|
-
<button
|
|
68
|
-
onClick={handleCopy}
|
|
69
|
-
className="flex items-center gap-2 text-[10px] font-bold text-slate-500 dark:text-white/40 hover:text-indigo-600 dark:hover:text-indigo-400 transition-all active:scale-95"
|
|
70
|
-
>
|
|
71
|
-
{copied ? (
|
|
72
|
-
<>
|
|
73
|
-
<Check size={14} className="text-emerald-500" />
|
|
74
|
-
<span className="text-emerald-500">Copied!</span>
|
|
75
|
-
</>
|
|
76
|
-
) : (
|
|
77
|
-
<>
|
|
78
|
-
<Copy size={14} />
|
|
79
|
-
<span>Copy Code</span>
|
|
80
|
-
</>
|
|
81
|
-
)}
|
|
82
|
-
</button>
|
|
83
|
-
</div>
|
|
84
|
-
<div className="p-8 font-mono text-[12px] leading-relaxed overflow-auto custom-scrollbar flex-grow bg-[#0f172a] text-indigo-50">
|
|
85
|
-
<pre className="whitespace-pre">
|
|
86
|
-
<code>{snippet.code}</code>
|
|
87
|
-
</pre>
|
|
88
|
-
</div>
|
|
89
|
-
</div>
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
// Data moved to constants.tsx
|
|
96
|
-
|
|
97
|
-
// ── Page ────────────────────────────────────────────────────────────────────
|
|
98
|
-
|
|
99
|
-
function DocViewer({ activeSnippet, setActiveSnippet }: { activeSnippet: Snippet, setActiveSnippet: (s: Snippet) => void }) {
|
|
100
|
-
return (
|
|
101
|
-
<>
|
|
102
|
-
<div className="mb-6 flex flex-wrap gap-2 border-b border-slate-100 dark:border-white/5 pb-6">
|
|
103
|
-
{SNIPPETS.map((snippet) => (
|
|
104
|
-
<button
|
|
105
|
-
key={snippet.id}
|
|
106
|
-
onClick={() => setActiveSnippet(snippet)}
|
|
107
|
-
className={`px-5 py-2 rounded-xl text-[10px] font-bold uppercase tracking-wider transition-all border ${activeSnippet.id === snippet.id
|
|
108
|
-
? 'bg-indigo-600 text-white border-indigo-600 shadow-lg shadow-indigo-200 dark:shadow-indigo-500/20 scale-105'
|
|
109
|
-
: 'bg-white dark:bg-white/5 border-slate-200 dark:border-white/10 text-slate-500 dark:text-white/40 hover:text-indigo-600 dark:hover:text-indigo-400 hover:border-indigo-300 dark:hover:border-white/20'
|
|
110
|
-
}`}
|
|
111
|
-
>
|
|
112
|
-
{snippet.title}
|
|
113
|
-
</button>
|
|
114
|
-
))}
|
|
115
|
-
</div>
|
|
116
|
-
|
|
117
|
-
<div className="flex-grow flex flex-col gap-6 animate-in fade-in slide-in-from-bottom-2 duration-500">
|
|
118
|
-
<div className="max-w-2xl">
|
|
119
|
-
<h3 className="text-xl font-bold text-slate-900 dark:text-white mb-2">{activeSnippet.title}</h3>
|
|
120
|
-
<p className="text-sm text-slate-500 dark:text-white/40 leading-relaxed font-medium italic">
|
|
121
|
-
{activeSnippet.description}
|
|
122
|
-
</p>
|
|
123
|
-
</div>
|
|
124
|
-
<CodeViewer snippet={activeSnippet} />
|
|
125
|
-
</div>
|
|
126
|
-
</>
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
11
|
|
|
130
12
|
export default function HomePage() {
|
|
131
|
-
const { ui } = useConfig();
|
|
132
|
-
const [activeSnippet, setActiveSnippet] = React.useState<Snippet>(SNIPPETS[0]);
|
|
133
|
-
|
|
134
13
|
return (
|
|
135
14
|
<main className="min-h-screen bg-slate-50 dark:bg-[#080811] relative transition-colors duration-300">
|
|
136
|
-
|
|
137
|
-
<
|
|
138
|
-
<div
|
|
139
|
-
className="absolute -top-40 -left-40 w-[600px] h-[600px] rounded-full opacity-20 blur-3xl"
|
|
140
|
-
style={{ background: ui.primaryColor }}
|
|
141
|
-
/>
|
|
142
|
-
<div
|
|
143
|
-
className="absolute -bottom-40 -right-40 w-[600px] h-[600px] rounded-full opacity-15 blur-3xl"
|
|
144
|
-
style={{ background: ui.accentColor }}
|
|
145
|
-
/>
|
|
146
|
-
<div
|
|
147
|
-
className="absolute inset-0 opacity-[0.05] dark:opacity-[0.03]"
|
|
148
|
-
style={{
|
|
149
|
-
backgroundImage:
|
|
150
|
-
'linear-gradient(currentColor 1px, transparent 1px), linear-gradient(90deg, currentColor 1px, transparent 1px)',
|
|
151
|
-
backgroundSize: '48px 48px',
|
|
152
|
-
}}
|
|
153
|
-
/>
|
|
154
|
-
</div>
|
|
155
|
-
|
|
156
|
-
{/* ── Navbar ── */}
|
|
157
|
-
<nav className="sticky top-0 z-50 flex items-center justify-between px-8 py-5 border-b border-slate-200 dark:border-white/5 bg-white/80 dark:bg-[#080811]/80 backdrop-blur-md">
|
|
158
|
-
<div className="flex items-center gap-3 group cursor-default">
|
|
159
|
-
<div className="relative">
|
|
160
|
-
<div
|
|
161
|
-
className="w-10 h-10 rounded-xl flex items-center justify-center shadow-lg relative z-10 overflow-hidden transition-transform group-hover:scale-110 duration-500"
|
|
162
|
-
style={{ background: `linear-gradient(135deg, ${ui.primaryColor}, ${ui.accentColor})` }}
|
|
163
|
-
>
|
|
164
|
-
<Zap className="w-5 h-5 text-white animate-pulse" />
|
|
165
|
-
<div className="absolute inset-0 bg-white/20 opacity-0 group-hover:opacity-100 transition-opacity" />
|
|
166
|
-
</div>
|
|
167
|
-
<div
|
|
168
|
-
className="absolute inset-0 blur-lg opacity-40 group-hover:opacity-80 transition-opacity"
|
|
169
|
-
style={{ background: ui.primaryColor }}
|
|
170
|
-
/>
|
|
171
|
-
</div>
|
|
172
|
-
<div className="flex flex-col -gap-0.5">
|
|
173
|
-
<span className="font-black text-transparent bg-clip-text text-xl tracking-tight leading-none"
|
|
174
|
-
style={{ backgroundImage: `linear-gradient(to right, ${ui.primaryColor}, ${ui.accentColor})` }}
|
|
175
|
-
>
|
|
176
|
-
Retrivora AI
|
|
177
|
-
</span>
|
|
178
|
-
<div className="flex items-center gap-1.5">
|
|
179
|
-
<span className="font-bold text-slate-900 dark:text-white text-[10px] tracking-[0.15em] uppercase opacity-70">Accelerator</span>
|
|
180
|
-
<span className="text-[9px] px-1.5 py-0.5 rounded-full bg-slate-100 dark:bg-white/5 text-slate-500 dark:text-white/40 font-mono border border-slate-200/50 dark:border-white/10">v1.8.0</span>
|
|
181
|
-
</div>
|
|
182
|
-
</div>
|
|
183
|
-
</div>
|
|
184
|
-
|
|
185
|
-
<div className="flex items-center gap-3">
|
|
186
|
-
<ThemeToggle />
|
|
187
|
-
<a href="https://www.npmjs.com/package/@retrivora-ai/rag-engine" target="_blank" rel="noreferrer" className="text-slate-500 hover:text-[#CB3837] dark:text-white/40 dark:hover:text-[#CB3837] text-sm transition-colors flex items-center gap-1.5">
|
|
188
|
-
<Package className="w-4 h-4" /> NPM
|
|
189
|
-
</a>
|
|
190
|
-
<a href="https://github.com/abhinav1201/ai-accelerator" target="_blank" rel="noreferrer" className="text-slate-500 hover:text-slate-900 dark:text-white/40 dark:hover:text-white/70 text-sm transition-colors flex items-center gap-1.5">
|
|
191
|
-
<GitBranch className="w-4 h-4" /> GitHub
|
|
192
|
-
</a>
|
|
193
|
-
<a href="/api/health" target="_blank" rel="noreferrer" className="px-3 py-1.5 rounded-lg text-xs border border-slate-200 dark:border-white/10 text-slate-600 dark:text-white/50 hover:text-slate-900 dark:hover:text-white/80 hover:bg-slate-100 dark:hover:bg-white/5 transition-all flex items-center gap-1.5">
|
|
194
|
-
<HeartPulse className="w-3.5 h-3.5" /> Health
|
|
195
|
-
</a>
|
|
196
|
-
</div>
|
|
197
|
-
</nav>
|
|
198
|
-
|
|
199
|
-
{/* ── Hero + Chat ── */}
|
|
15
|
+
<AmbientBackground />
|
|
16
|
+
<Navbar />
|
|
200
17
|
<div className="relative z-10 container mx-auto px-6 py-12">
|
|
201
|
-
<
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
style={{ borderColor: `${ui.primaryColor}40`, color: ui.primaryColor, background: `${ui.primaryColor}10` }}
|
|
206
|
-
>
|
|
207
|
-
<span className="w-1.5 h-1.5 rounded-full animate-pulse" style={{ background: ui.primaryColor }} />
|
|
208
|
-
{LANDING_PAGE_CONTENT.hero.badge}
|
|
209
|
-
</div>
|
|
210
|
-
<h1 className="text-5xl md:text-7xl font-black text-slate-900 dark:text-white mb-6 tracking-tight">
|
|
211
|
-
{LANDING_PAGE_CONTENT.hero.title.split('for')[0]} <br />
|
|
212
|
-
<span className="text-transparent bg-clip-text" style={{ backgroundImage: `linear-gradient(to right, ${ui.primaryColor}, ${ui.accentColor})` }}>
|
|
213
|
-
for {LANDING_PAGE_CONTENT.hero.title.split('for')[1]}
|
|
214
|
-
</span>
|
|
215
|
-
</h1>
|
|
216
|
-
<p className="text-lg md:text-xl text-slate-600 dark:text-white/40 max-w-2xl leading-relaxed">
|
|
217
|
-
{LANDING_PAGE_CONTENT.hero.subtitle}
|
|
218
|
-
</p>
|
|
219
|
-
<div className="flex flex-col gap-4 mt-4">
|
|
220
|
-
<div className="flex flex-col gap-2">
|
|
221
|
-
<span className="text-[10px] font-black text-slate-400 dark:text-white/30 uppercase tracking-[0.2em] ml-1">Vector Ecosystem</span>
|
|
222
|
-
<div className="flex flex-wrap gap-2">
|
|
223
|
-
{VECTOR_DATABASES.map(({ Icon, label }) => (
|
|
224
|
-
<span key={label} className="flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 text-slate-600 dark:text-white/60 text-[11px] font-semibold hover:bg-slate-50 dark:hover:bg-white/8 transition-all shadow-sm group">
|
|
225
|
-
<Icon className="w-3 h-3 transition-transform group-hover:scale-110" style={{ color: ui.primaryColor }} /> {label}
|
|
226
|
-
</span>
|
|
227
|
-
))}
|
|
228
|
-
</div>
|
|
229
|
-
</div>
|
|
230
|
-
|
|
231
|
-
<div className="flex flex-col gap-2">
|
|
232
|
-
<span className="text-[10px] font-black text-slate-400 dark:text-white/30 uppercase tracking-[0.2em] ml-1">AI Model Garden</span>
|
|
233
|
-
<div className="flex flex-wrap gap-2">
|
|
234
|
-
{AI_MODELS.map(({ Icon, label }) => (
|
|
235
|
-
<span key={label} className="flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-white dark:bg-white/5 border border-slate-200 dark:border-white/10 text-slate-600 dark:text-white/60 text-[11px] font-semibold hover:bg-slate-50 dark:hover:bg-white/8 transition-all shadow-sm group">
|
|
236
|
-
<Icon className="w-3 h-3 transition-transform group-hover:scale-110" style={{ color: ui.accentColor }} /> {label}
|
|
237
|
-
</span>
|
|
238
|
-
))}
|
|
239
|
-
</div>
|
|
240
|
-
</div>
|
|
241
|
-
</div>
|
|
242
|
-
</div>
|
|
243
|
-
<div className="lg:sticky lg:top-6">
|
|
244
|
-
<ChatWindow className="w-full" style={{ height: '620px' } as React.CSSProperties} />
|
|
245
|
-
</div>
|
|
246
|
-
</div>
|
|
247
|
-
|
|
248
|
-
{/* ── Lifecycle ── */}
|
|
249
|
-
<div className="mt-24 mb-12">
|
|
250
|
-
<h2 className="text-2xl font-bold text-slate-900 dark:text-white text-center mb-2">{LANDING_PAGE_CONTENT.lifecycle.title}</h2>
|
|
251
|
-
<div className="relative max-w-5xl mx-auto py-12">
|
|
252
|
-
<div className="absolute left-1/2 top-0 bottom-0 w-0.5 bg-slate-200 dark:bg-white/10 -translate-x-1/2 hidden md:block" />
|
|
253
|
-
<div className="space-y-12 md:space-y-0">
|
|
254
|
-
{PIPELINE_STEPS.map(({ step, Icon, title, desc, colors }, index) => {
|
|
255
|
-
const isLeft = index % 2 === 0;
|
|
256
|
-
return (
|
|
257
|
-
<div key={step} className={`relative flex flex-col md:flex-row items-center gap-8 ${isLeft ? 'md:flex-row' : 'md:flex-row-reverse'}`}>
|
|
258
|
-
<div className={`w-full md:w-1/2 relative flex ${isLeft ? 'justify-end' : 'justify-start'}`}>
|
|
259
|
-
<div className="relative p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-white dark:bg-white/3 max-w-md text-left overflow-hidden group">
|
|
260
|
-
<div className="absolute -right-2 -bottom-4 text-7xl font-bold opacity-[0.1] italic" style={{ color: colors.from }}>{step}</div>
|
|
261
|
-
<h3 className="font-semibold text-slate-900 dark:text-white mb-2 text-lg flex items-center gap-2">
|
|
262
|
-
<Icon className="w-5 h-5" style={{ color: colors.from }} /> {title}
|
|
263
|
-
</h3>
|
|
264
|
-
<p className="text-slate-600 dark:text-white/40 text-sm leading-relaxed">{desc}</p>
|
|
265
|
-
</div>
|
|
266
|
-
</div>
|
|
267
|
-
<div className="relative z-10 w-12 h-12 rounded-2xl flex items-center justify-center shadow-xl border-4 border-slate-50 dark:border-[#080811]" style={{ background: `linear-gradient(135deg, ${colors.from}, ${colors.to})` }}>
|
|
268
|
-
<Icon className="w-6 h-6 text-white" />
|
|
269
|
-
</div>
|
|
270
|
-
<div className="hidden md:block md:w-1/2" />
|
|
271
|
-
</div>
|
|
272
|
-
);
|
|
273
|
-
})}
|
|
274
|
-
</div>
|
|
275
|
-
</div>
|
|
276
|
-
</div>
|
|
277
|
-
|
|
278
|
-
{/* ── Architecture Cards ── */}
|
|
279
|
-
<div className="relative z-10 mt-24 mb-32 grid gap-6 sm:grid-cols-3 max-w-5xl mx-auto">
|
|
280
|
-
{ARCHITECTURE_CARDS.map((card, i) => (
|
|
281
|
-
<ArchitectureCard key={i} {...card} />
|
|
282
|
-
))}
|
|
283
|
-
</div>
|
|
284
|
-
|
|
285
|
-
{/* ── Documentation ── */}
|
|
286
|
-
<div className="mt-32 max-w-6xl mx-auto mb-24 relative">
|
|
287
|
-
<div className="text-center mb-16">
|
|
288
|
-
<h2 className="text-3xl font-bold text-slate-900 dark:text-white mb-4">{LANDING_PAGE_CONTENT.guide.title}</h2>
|
|
289
|
-
<p className="text-slate-600 dark:text-white/40 max-w-2xl mx-auto">{LANDING_PAGE_CONTENT.guide.subtitle}</p>
|
|
290
|
-
</div>
|
|
291
|
-
<div className="relative z-10 w-full grid gap-16 lg:grid-cols-[280px_1fr] items-start">
|
|
292
|
-
<aside className="flex flex-col gap-10">
|
|
293
|
-
<section>
|
|
294
|
-
<h2 className="mb-6 text-[10px] font-black text-slate-400 dark:text-white/30 uppercase tracking-[0.3em] flex items-center gap-3">
|
|
295
|
-
<FileText size={14} className="text-indigo-500" /> Quick Start
|
|
296
|
-
</h2>
|
|
297
|
-
<ol className="space-y-6">
|
|
298
|
-
{QUICK_START_STEPS.map((step, i) => (
|
|
299
|
-
<li key={i} className="group flex items-start gap-4">
|
|
300
|
-
<span className="flex h-6 w-6 shrink-0 items-center justify-center rounded-lg bg-white dark:bg-white/5 text-slate-600 dark:text-white/40 font-mono text-[10px] border border-slate-200 dark:border-white/10 shadow-sm">{i + 1}</span>
|
|
301
|
-
<span className="text-xs text-slate-500 dark:text-white/50 font-medium leading-relaxed pt-1">{step}</span>
|
|
302
|
-
</li>
|
|
303
|
-
))}
|
|
304
|
-
</ol>
|
|
305
|
-
</section>
|
|
306
|
-
<section className="rounded-2xl border border-slate-200 dark:border-white/10 bg-white dark:bg-white/3 p-6 shadow-sm">
|
|
307
|
-
<h2 className="mb-6 text-[10px] font-black text-slate-400 dark:text-white/30 uppercase tracking-[0.3em] flex items-center gap-3">
|
|
308
|
-
<Zap size={14} className="text-indigo-500" /> API Endpoints
|
|
309
|
-
</h2>
|
|
310
|
-
<div className="grid gap-2.5">
|
|
311
|
-
{API_ENDPOINTS.map((slug) => (
|
|
312
|
-
<div key={slug} className="group flex items-center justify-between p-2 rounded-lg bg-slate-50 dark:bg-white/5 border border-slate-100 dark:border-white/5 hover:border-indigo-200 dark:hover:border-indigo-500/30">
|
|
313
|
-
<span className="text-[10px] font-mono text-slate-500 dark:text-white/30 group-hover:text-indigo-600">/api/{slug}</span>
|
|
314
|
-
<span className="text-[8px] font-bold text-indigo-600 dark:text-indigo-400 bg-indigo-50 dark:bg-indigo-500/10 px-1.5 py-0.5 rounded border border-indigo-100 dark:border-indigo-500/20">POST</span>
|
|
315
|
-
</div>
|
|
316
|
-
))}
|
|
317
|
-
</div>
|
|
318
|
-
</section>
|
|
319
|
-
</aside>
|
|
320
|
-
<section className="flex flex-col h-full min-h-[560px]">
|
|
321
|
-
<DocViewer activeSnippet={activeSnippet} setActiveSnippet={setActiveSnippet} />
|
|
322
|
-
</section>
|
|
323
|
-
</div>
|
|
324
|
-
<div className="mt-16 text-center">
|
|
325
|
-
<a href="https://www.npmjs.com/package/@retrivora-ai/rag-engine" className="inline-flex items-center gap-3 px-8 py-4 rounded-2xl bg-slate-900 dark:bg-white text-white dark:text-slate-900 font-bold shadow-xl shadow-indigo-500/20">
|
|
326
|
-
<Package className="w-5 h-5" /> Get Started on NPM <ExternalLink className="w-4 h-4" />
|
|
327
|
-
</a>
|
|
328
|
-
</div>
|
|
329
|
-
</div>
|
|
18
|
+
<Hero />
|
|
19
|
+
<Lifecycle />
|
|
20
|
+
<ArchitectureCardsSection />
|
|
21
|
+
<Documentation />
|
|
330
22
|
</div>
|
|
331
|
-
|
|
332
23
|
<ChatWidget position="bottom-right" />
|
|
333
24
|
</main>
|
|
334
25
|
);
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { useConfig } from '@/components/ConfigProvider';
|
|
5
|
+
|
|
6
|
+
export function AmbientBackground() {
|
|
7
|
+
const { ui } = useConfig();
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className="absolute inset-0 overflow-hidden pointer-events-none">
|
|
11
|
+
<div
|
|
12
|
+
className="absolute -top-40 -left-40 w-[600px] h-[600px] rounded-full opacity-20 blur-3xl"
|
|
13
|
+
style={{ background: ui.primaryColor }}
|
|
14
|
+
/>
|
|
15
|
+
<div
|
|
16
|
+
className="absolute -bottom-40 -right-40 w-[600px] h-[600px] rounded-full opacity-15 blur-3xl"
|
|
17
|
+
style={{ background: ui.accentColor }}
|
|
18
|
+
/>
|
|
19
|
+
<div
|
|
20
|
+
className="absolute inset-0 opacity-[0.05] dark:opacity-[0.03]"
|
|
21
|
+
style={{
|
|
22
|
+
backgroundImage:
|
|
23
|
+
'linear-gradient(currentColor 1px, transparent 1px), linear-gradient(90deg, currentColor 1px, transparent 1px)',
|
|
24
|
+
backgroundSize: '48px 48px',
|
|
25
|
+
}}
|
|
26
|
+
/>
|
|
27
|
+
</div>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ArchitectureCardProps } from '@/app/types';
|
|
3
|
+
|
|
4
|
+
export function ArchitectureCard({ icon, title, description, badge, badgeColor }: ArchitectureCardProps) {
|
|
5
|
+
return (
|
|
6
|
+
<div className="group rounded-2xl border border-slate-200 dark:border-white/10 bg-white dark:bg-white/5 p-6 shadow-sm transition-all duration-300 hover:border-indigo-500/50 dark:hover:border-indigo-500/30 hover:shadow-xl hover:shadow-indigo-500/5">
|
|
7
|
+
<div className="mb-4 flex items-center justify-between">
|
|
8
|
+
<div className="text-3xl transition-transform duration-300 group-hover:scale-110">{icon}</div>
|
|
9
|
+
<span className={`rounded-full border px-3 py-0.5 text-[10px] font-bold uppercase tracking-wider ${badgeColor}`}>
|
|
10
|
+
{badge}
|
|
11
|
+
</span>
|
|
12
|
+
</div>
|
|
13
|
+
<h3 className="mb-2 font-bold text-slate-900 dark:text-white">{title}</h3>
|
|
14
|
+
<p className="text-xs text-slate-500 dark:text-white/40 leading-relaxed font-medium">{description}</p>
|
|
15
|
+
</div>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { ArchitectureCard } from '@/components/ArchitectureCard';
|
|
5
|
+
import { ARCHITECTURE_CARDS } from '@/app/constants';
|
|
6
|
+
|
|
7
|
+
export function ArchitectureCardsSection() {
|
|
8
|
+
return (
|
|
9
|
+
<div className="relative z-10 mt-24 mb-32 grid gap-6 sm:grid-cols-3 max-w-5xl mx-auto">
|
|
10
|
+
{ARCHITECTURE_CARDS.map((card, i) => (
|
|
11
|
+
<ArchitectureCard key={i} {...card} />
|
|
12
|
+
))}
|
|
13
|
+
</div>
|
|
14
|
+
);
|
|
15
|
+
}
|