adaptive-memory-multi-model-router 2.16.3 → 2.16.4
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/.github/CODEOWNERS +2 -0
- package/.github/FUNDING.yml +7 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +56 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +41 -0
- package/.github/workflows/pages.yml +1 -1
- package/CHANGELOG.md +15 -8
- package/CONTRIBUTING.md +109 -25
- package/README.md +131 -236
- package/docs/assets/og-banner.svg +193 -0
- package/docs/index.html +1523 -465
- package/docs-site/index.html +1427 -563
- package/package.json +26 -19
- /package/{ARCHITECTURE.md → archive/ARCHITECTURE.md} +0 -0
- /package/{ENTERPRISE_INTEGRATIONS.md → archive/ENTERPRISE_INTEGRATIONS.md} +0 -0
- /package/{MANIFESTO.md → archive/MANIFESTO.md} +0 -0
- /package/{README_ja.md → archive/README_ja.md} +0 -0
- /package/{README_zh.md → archive/README_zh.md} +0 -0
- /package/{SECURITY.md → archive/SECURITY.md} +0 -0
- /package/{TECHNICAL_README.md → archive/TECHNICAL_README.md} +0 -0
- /package/{TODO_BROWSER_AUTOMATION.md → archive/TODO_BROWSER_AUTOMATION.md} +0 -0
- /package/{AGENT_COUNCIL_FINDINGS.md → archive/campaign/AGENT_COUNCIL_FINDINGS.md} +0 -0
- /package/{AUDIT_REPORT.md → archive/campaign/AUDIT_REPORT.md} +0 -0
- /package/{CONTRIBUTORS.md → archive/campaign/CONTRIBUTORS.md} +0 -0
- /package/{IMPROVEMENT_PLAN.md → archive/campaign/IMPROVEMENT_PLAN.md} +0 -0
- /package/{INTEGRATION_PROGRESS.md → archive/campaign/INTEGRATION_PROGRESS.md} +0 -0
- /package/{CAMPAIGN_SUMMARY.md → archive/launch/CAMPAIGN_SUMMARY.md} +0 -0
- /package/{LANDING.md → archive/launch/LANDING.md} +0 -0
- /package/{LAUNCH-PAIN-DRIVEN.md → archive/launch/LAUNCH-PAIN-DRIVEN.md} +0 -0
- /package/{LAUNCH.md → archive/launch/LAUNCH.md} +0 -0
- /package/{LAUNCH_CHECKLIST.md → archive/launch/LAUNCH_CHECKLIST.md} +0 -0
- /package/{LAUNCH_SNAPSHOT.md → archive/launch/LAUNCH_SNAPSHOT.md} +0 -0
- /package/{REDESIGN.md → archive/launch/REDESIGN.md} +0 -0
- /package/{HEALTH_REPORT.md → archive/research/HEALTH_REPORT.md} +0 -0
- /package/{OPPORTUNITIES_100.md → archive/research/OPPORTUNITIES_100.md} +0 -0
- /package/{POPULARITY_BOOSTERS.md → archive/research/POPULARITY_BOOSTERS.md} +0 -0
- /package/{PR_STATUS_REPORT.md → archive/research/PR_STATUS_REPORT.md} +0 -0
- /package/{research-log.md → archive/research/research-log.md} +0 -0
- /package/{RELEASE_v2.16.0.md → archive/submissions/RELEASE_v2.16.0.md} +0 -0
- /package/{RUNKIT.md → archive/submissions/RUNKIT.md} +0 -0
- /package/{SUBMISSIONS.md → archive/submissions/SUBMISSIONS.md} +0 -0
- /package/{a3m-integrations-summary.md → archive/submissions/a3m-integrations-summary.md} +0 -0
- /package/{discoverability-diagnosis.md → archive/submissions/discoverability-diagnosis.md} +0 -0
package/docs/index.html
CHANGED
|
@@ -1,497 +1,1555 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
|
|
7
|
+
<!-- Primary SEO Meta Tags -->
|
|
8
|
+
<title>A3M Router — Intelligent LLM Routing Gateway | OpenRouter Alternative</title>
|
|
9
|
+
<meta name="description" content="A3M Router is an open-source LLM gateway that routes queries to the cheapest capable model across 47+ providers. 96.77% RouterArena accuracy at $0.0768/1K tokens. OpenRouter alternative that actually reduces your LLM bill.">
|
|
10
|
+
<meta name="keywords" content="llm router benchmark, llm routing accuracy, routellm alternative, litellm alternative, llm cost optimization, openai proxy free, llm gateway open source, lightweight llm router, keyword-based llm routing, drop-in openai proxy, llm routing without gpu, how to reduce openai api costs, openrouter alternative, reduce llm costs, llm router open source">
|
|
11
|
+
<meta name="author" content="A3M Router Team">
|
|
12
|
+
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large">
|
|
13
|
+
<link rel="canonical" href="https://das-rebel.github.io/a3m-router/">
|
|
14
|
+
|
|
15
|
+
<!-- Open Graph / Social Sharing -->
|
|
16
|
+
<meta property="og:type" content="website">
|
|
17
|
+
<meta property="og:url" content="https://das-rebel.github.io/a3m-router/">
|
|
18
|
+
<meta property="og:title" content="A3M Router — Intelligent LLM Routing Gateway | OpenRouter Alternative">
|
|
19
|
+
<meta property="og:description" content="Open-source LLM gateway: 47+ providers, 96.77% accuracy, 63% cost savings. Drop-in OpenAI-compatible API.">
|
|
20
|
+
<meta property="og:image" content="https://das-rebel.github.io/a3m-router/assets/og-banner.svg">
|
|
21
|
+
<meta property="og:image:width" content="1200">
|
|
22
|
+
<meta property="og:image:height" content="630">
|
|
23
|
+
<meta property="og:site_name" content="A3M Router">
|
|
24
|
+
<meta property="og:locale" content="en_US">
|
|
25
|
+
|
|
26
|
+
<!-- Twitter Card -->
|
|
27
|
+
<meta name="twitter:card" content="summary_large_image">
|
|
28
|
+
<meta name="twitter:title" content="A3M Router — Intelligent LLM Routing Gateway | OpenRouter Alternative">
|
|
29
|
+
<meta name="twitter:description" content="Open-source LLM gateway: 47+ providers, 96.77% accuracy, 63% cost savings. Drop-in OpenAI-compatible API.">
|
|
30
|
+
<meta name="twitter:image" content="https://das-rebel.github.io/a3m-router/assets/og-banner.svg">
|
|
31
|
+
|
|
32
|
+
<style>
|
|
33
|
+
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
|
|
34
|
+
|
|
35
|
+
:root {
|
|
36
|
+
--bg: #09090b;
|
|
37
|
+
--surface: #18181b;
|
|
38
|
+
--surface2: #27272a;
|
|
39
|
+
--border: #3f3f46;
|
|
40
|
+
--text: #fafafa;
|
|
41
|
+
--text-muted: #a1a1aa;
|
|
42
|
+
--text-dim: #71717a;
|
|
43
|
+
--accent: #6366f1;
|
|
44
|
+
--accent-hover: #818cf8;
|
|
45
|
+
--accent-glow: rgba(99, 102, 241, 0.15);
|
|
46
|
+
--green: #22c55e;
|
|
47
|
+
--green-dim: #166534;
|
|
48
|
+
--amber: #f59e0b;
|
|
49
|
+
--red: #ef4444;
|
|
50
|
+
--font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
51
|
+
--mono: 'SF Mono', 'Fira Code', 'Fira Mono', 'Menlo', 'Monaco', monospace;
|
|
52
|
+
--radius: 10px;
|
|
53
|
+
--radius-lg: 16px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
html { scroll-behavior: smooth; }
|
|
57
|
+
|
|
58
|
+
body {
|
|
59
|
+
font-family: var(--font);
|
|
60
|
+
background: var(--bg);
|
|
61
|
+
color: var(--text);
|
|
62
|
+
line-height: 1.6;
|
|
63
|
+
-webkit-font-smoothing: antialiased;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
a { color: inherit; text-decoration: none; }
|
|
67
|
+
a:hover { color: var(--accent-hover); }
|
|
68
|
+
|
|
69
|
+
/* ─── Layout ─── */
|
|
70
|
+
.container { max-width: 1100px; margin: 0 auto; padding: 0 24px; }
|
|
71
|
+
.section { padding: 96px 0; }
|
|
72
|
+
.section-sm { padding: 64px 0; }
|
|
73
|
+
.section-title {
|
|
74
|
+
font-size: 2rem;
|
|
75
|
+
font-weight: 700;
|
|
76
|
+
letter-spacing: -0.03em;
|
|
77
|
+
margin-bottom: 12px;
|
|
78
|
+
}
|
|
79
|
+
.section-subtitle {
|
|
80
|
+
font-size: 1.125rem;
|
|
81
|
+
color: var(--text-muted);
|
|
82
|
+
max-width: 560px;
|
|
83
|
+
margin-bottom: 48px;
|
|
84
|
+
}
|
|
85
|
+
.section-center { text-align: center; }
|
|
86
|
+
.section-center .section-subtitle { margin: 0 auto 48px; }
|
|
87
|
+
|
|
88
|
+
/* ─── Nav ─── */
|
|
89
|
+
nav {
|
|
90
|
+
position: sticky;
|
|
91
|
+
top: 0;
|
|
92
|
+
z-index: 100;
|
|
93
|
+
background: rgba(9,9,11,0.85);
|
|
94
|
+
backdrop-filter: blur(12px);
|
|
95
|
+
border-bottom: 1px solid rgba(255,255,255,0.05);
|
|
96
|
+
}
|
|
97
|
+
.nav-inner {
|
|
98
|
+
display: flex;
|
|
99
|
+
align-items: center;
|
|
100
|
+
justify-content: space-between;
|
|
101
|
+
height: 60px;
|
|
102
|
+
max-width: 1100px;
|
|
103
|
+
margin: 0 auto;
|
|
104
|
+
padding: 0 24px;
|
|
105
|
+
}
|
|
106
|
+
.nav-logo {
|
|
107
|
+
display: flex;
|
|
108
|
+
align-items: center;
|
|
109
|
+
gap: 10px;
|
|
110
|
+
font-weight: 700;
|
|
111
|
+
font-size: 1.1rem;
|
|
112
|
+
letter-spacing: -0.02em;
|
|
113
|
+
}
|
|
114
|
+
.nav-logo svg { width: 28px; height: 28px; }
|
|
115
|
+
.nav-links {
|
|
116
|
+
display: flex;
|
|
117
|
+
align-items: center;
|
|
118
|
+
gap: 32px;
|
|
119
|
+
}
|
|
120
|
+
.nav-links a {
|
|
121
|
+
font-size: 0.875rem;
|
|
122
|
+
color: var(--text-muted);
|
|
123
|
+
transition: color 0.2s;
|
|
124
|
+
}
|
|
125
|
+
.nav-links a:hover { color: var(--text); }
|
|
126
|
+
.nav-cta {
|
|
127
|
+
display: flex;
|
|
128
|
+
align-items: center;
|
|
129
|
+
gap: 12px;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* ─── Buttons ─── */
|
|
133
|
+
.btn {
|
|
134
|
+
display: inline-flex;
|
|
135
|
+
align-items: center;
|
|
136
|
+
gap: 8px;
|
|
137
|
+
padding: 10px 20px;
|
|
138
|
+
border-radius: var(--radius);
|
|
139
|
+
font-size: 0.875rem;
|
|
140
|
+
font-weight: 600;
|
|
141
|
+
cursor: pointer;
|
|
142
|
+
transition: all 0.2s;
|
|
143
|
+
border: none;
|
|
144
|
+
white-space: nowrap;
|
|
145
|
+
}
|
|
146
|
+
.btn-primary {
|
|
147
|
+
background: var(--accent);
|
|
148
|
+
color: #fff;
|
|
149
|
+
}
|
|
150
|
+
.btn-primary:hover {
|
|
151
|
+
background: var(--accent-hover);
|
|
152
|
+
transform: translateY(-1px);
|
|
153
|
+
box-shadow: 0 4px 24px rgba(99, 102, 241, 0.35);
|
|
154
|
+
color: #fff;
|
|
155
|
+
}
|
|
156
|
+
.btn-outline {
|
|
157
|
+
background: transparent;
|
|
158
|
+
color: var(--text);
|
|
159
|
+
border: 1px solid var(--border);
|
|
160
|
+
}
|
|
161
|
+
.btn-outline:hover {
|
|
162
|
+
background: var(--surface);
|
|
163
|
+
border-color: var(--text-dim);
|
|
164
|
+
color: var(--text);
|
|
165
|
+
}
|
|
166
|
+
.btn-ghost {
|
|
167
|
+
background: transparent;
|
|
168
|
+
color: var(--text-muted);
|
|
169
|
+
padding: 8px 12px;
|
|
170
|
+
}
|
|
171
|
+
.btn-ghost:hover { color: var(--text); background: var(--surface); }
|
|
172
|
+
.btn-sm { padding: 7px 14px; font-size: 0.8125rem; }
|
|
173
|
+
.btn-lg { padding: 14px 28px; font-size: 1rem; }
|
|
174
|
+
|
|
175
|
+
/* ─── Hero ─── */
|
|
176
|
+
.hero {
|
|
177
|
+
padding: 100px 0 80px;
|
|
178
|
+
text-align: center;
|
|
179
|
+
}
|
|
180
|
+
.hero-badge {
|
|
181
|
+
display: inline-flex;
|
|
182
|
+
align-items: center;
|
|
183
|
+
gap: 6px;
|
|
184
|
+
padding: 6px 14px;
|
|
185
|
+
background: var(--accent-glow);
|
|
186
|
+
border: 1px solid rgba(99,102,241,0.3);
|
|
187
|
+
border-radius: 100px;
|
|
188
|
+
font-size: 0.8125rem;
|
|
189
|
+
color: var(--accent-hover);
|
|
190
|
+
margin-bottom: 28px;
|
|
191
|
+
}
|
|
192
|
+
.hero-badge .dot {
|
|
193
|
+
width: 6px; height: 6px;
|
|
194
|
+
background: var(--accent);
|
|
195
|
+
border-radius: 50%;
|
|
196
|
+
animation: pulse 2s infinite;
|
|
197
|
+
}
|
|
198
|
+
@keyframes pulse {
|
|
199
|
+
0%, 100% { opacity: 1; }
|
|
200
|
+
50% { opacity: 0.3; }
|
|
201
|
+
}
|
|
202
|
+
.hero h1 {
|
|
203
|
+
font-size: clamp(2.5rem, 6vw, 4rem);
|
|
204
|
+
font-weight: 800;
|
|
205
|
+
letter-spacing: -0.04em;
|
|
206
|
+
line-height: 1.1;
|
|
207
|
+
margin-bottom: 20px;
|
|
208
|
+
}
|
|
209
|
+
.hero h1 .gradient {
|
|
210
|
+
background: linear-gradient(120deg, #818cf8 0%, #c084fc 50%, #6366f1 100%);
|
|
211
|
+
-webkit-background-clip: text;
|
|
212
|
+
-webkit-text-fill-color: transparent;
|
|
213
|
+
background-size: 200% auto;
|
|
214
|
+
}
|
|
215
|
+
.hero-sub {
|
|
216
|
+
font-size: 1.2rem;
|
|
217
|
+
color: var(--text-muted);
|
|
218
|
+
max-width: 640px;
|
|
219
|
+
margin: 0 auto 40px;
|
|
220
|
+
line-height: 1.7;
|
|
221
|
+
}
|
|
222
|
+
.hero-actions {
|
|
223
|
+
display: flex;
|
|
224
|
+
align-items: center;
|
|
225
|
+
justify-content: center;
|
|
226
|
+
gap: 12px;
|
|
227
|
+
flex-wrap: wrap;
|
|
228
|
+
margin-bottom: 48px;
|
|
229
|
+
}
|
|
230
|
+
.hero-actions .install-cmd {
|
|
231
|
+
display: flex;
|
|
232
|
+
align-items: center;
|
|
233
|
+
gap: 8px;
|
|
234
|
+
background: var(--surface);
|
|
235
|
+
border: 1px solid var(--border);
|
|
236
|
+
border-radius: var(--radius);
|
|
237
|
+
padding: 10px 18px;
|
|
238
|
+
font-family: var(--mono);
|
|
239
|
+
font-size: 0.875rem;
|
|
240
|
+
color: var(--text-muted);
|
|
241
|
+
}
|
|
242
|
+
.hero-actions .install-cmd .prompt { color: var(--green); }
|
|
243
|
+
.hero-actions .install-cmd kbd {
|
|
244
|
+
background: var(--surface2);
|
|
245
|
+
border: 1px solid var(--border);
|
|
246
|
+
border-radius: 4px;
|
|
247
|
+
padding: 1px 5px;
|
|
248
|
+
font-size: 0.75rem;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/* ─── CLI Preview ─── */
|
|
252
|
+
.cli-preview {
|
|
253
|
+
max-width: 720px;
|
|
254
|
+
margin: 0 auto;
|
|
255
|
+
background: #0c0c0f;
|
|
256
|
+
border: 1px solid var(--border);
|
|
257
|
+
border-radius: var(--radius-lg);
|
|
258
|
+
overflow: hidden;
|
|
259
|
+
text-align: left;
|
|
260
|
+
box-shadow: 0 32px 80px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.04);
|
|
261
|
+
}
|
|
262
|
+
.cli-titlebar {
|
|
263
|
+
display: flex;
|
|
264
|
+
align-items: center;
|
|
265
|
+
gap: 6px;
|
|
266
|
+
padding: 12px 16px;
|
|
267
|
+
background: var(--surface);
|
|
268
|
+
border-bottom: 1px solid var(--border);
|
|
269
|
+
}
|
|
270
|
+
.cli-titlebar span {
|
|
271
|
+
width: 12px; height: 12px;
|
|
272
|
+
border-radius: 50%;
|
|
273
|
+
}
|
|
274
|
+
.cli-titlebar span:nth-child(1) { background: #ff5f57; }
|
|
275
|
+
.cli-titlebar span:nth-child(2) { background: #ffbd2e; }
|
|
276
|
+
.cli-titlebar span:nth-child(3) { background: #28c840; }
|
|
277
|
+
.cli-titlebar .title {
|
|
278
|
+
margin-left: 8px;
|
|
279
|
+
font-size: 0.75rem;
|
|
280
|
+
color: var(--text-dim);
|
|
281
|
+
font-family: var(--mono);
|
|
282
|
+
}
|
|
283
|
+
.cli-body {
|
|
284
|
+
padding: 20px 24px;
|
|
285
|
+
font-family: var(--mono);
|
|
286
|
+
font-size: 0.8125rem;
|
|
287
|
+
line-height: 1.7;
|
|
288
|
+
color: #d4d4d4;
|
|
289
|
+
overflow-x: auto;
|
|
290
|
+
}
|
|
291
|
+
.cli-body .line { display: flex; gap: 12px; }
|
|
292
|
+
.cli-body .prompt { color: var(--green); user-select: none; }
|
|
293
|
+
.cli-body .path { color: var(--accent-hover); }
|
|
294
|
+
.cli-body .output { color: var(--text-dim); }
|
|
295
|
+
.cli-body .result { color: #e5e7eb; }
|
|
296
|
+
.cli-body .model { color: #fbbf24; }
|
|
297
|
+
.cli-body .score { color: var(--green); }
|
|
298
|
+
.cli-body .dim { color: var(--text-dim); }
|
|
299
|
+
.cli-body .accent { color: var(--accent-hover); }
|
|
300
|
+
.cli-body .sep { color: var(--border); margin: 4px 0; }
|
|
301
|
+
|
|
302
|
+
/* ─── Stats Bar ─── */
|
|
303
|
+
.stats-bar {
|
|
304
|
+
display: grid;
|
|
305
|
+
grid-template-columns: repeat(4, 1fr);
|
|
306
|
+
gap: 1px;
|
|
307
|
+
background: var(--border);
|
|
308
|
+
border: 1px solid var(--border);
|
|
309
|
+
border-radius: var(--radius-lg);
|
|
310
|
+
overflow: hidden;
|
|
311
|
+
max-width: 720px;
|
|
312
|
+
margin: 40px auto 0;
|
|
313
|
+
}
|
|
314
|
+
.stat-cell {
|
|
315
|
+
background: var(--surface);
|
|
316
|
+
padding: 20px 16px;
|
|
317
|
+
text-align: center;
|
|
318
|
+
}
|
|
319
|
+
.stat-cell .val {
|
|
320
|
+
font-size: 1.5rem;
|
|
321
|
+
font-weight: 700;
|
|
322
|
+
color: var(--text);
|
|
323
|
+
letter-spacing: -0.03em;
|
|
324
|
+
}
|
|
325
|
+
.stat-cell .val.green { color: var(--green); }
|
|
326
|
+
.stat-cell .lbl {
|
|
327
|
+
font-size: 0.75rem;
|
|
328
|
+
color: var(--text-dim);
|
|
329
|
+
margin-top: 4px;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/* ─── Feature Grid ─── */
|
|
333
|
+
.feature-grid {
|
|
334
|
+
display: grid;
|
|
335
|
+
grid-template-columns: repeat(3, 1fr);
|
|
336
|
+
gap: 1px;
|
|
337
|
+
background: var(--border);
|
|
338
|
+
border: 1px solid var(--border);
|
|
339
|
+
border-radius: var(--radius-lg);
|
|
340
|
+
overflow: hidden;
|
|
341
|
+
}
|
|
342
|
+
.feature-card {
|
|
343
|
+
background: var(--bg);
|
|
344
|
+
padding: 28px;
|
|
345
|
+
transition: background 0.2s;
|
|
346
|
+
}
|
|
347
|
+
.feature-card:hover { background: var(--surface); }
|
|
348
|
+
.feature-card .icon {
|
|
349
|
+
width: 40px; height: 40px;
|
|
350
|
+
background: var(--accent-glow);
|
|
351
|
+
border: 1px solid rgba(99,102,241,0.25);
|
|
352
|
+
border-radius: 10px;
|
|
353
|
+
display: flex;
|
|
354
|
+
align-items: center;
|
|
355
|
+
justify-content: center;
|
|
356
|
+
font-size: 1.1rem;
|
|
357
|
+
margin-bottom: 16px;
|
|
358
|
+
}
|
|
359
|
+
.feature-card h3 {
|
|
360
|
+
font-size: 0.9375rem;
|
|
361
|
+
font-weight: 600;
|
|
362
|
+
margin-bottom: 8px;
|
|
363
|
+
letter-spacing: -0.01em;
|
|
364
|
+
}
|
|
365
|
+
.feature-card p {
|
|
366
|
+
font-size: 0.875rem;
|
|
367
|
+
color: var(--text-muted);
|
|
368
|
+
line-height: 1.6;
|
|
369
|
+
}
|
|
370
|
+
.feature-card .tag {
|
|
371
|
+
display: inline-block;
|
|
372
|
+
font-size: 0.6875rem;
|
|
373
|
+
font-weight: 600;
|
|
374
|
+
padding: 3px 8px;
|
|
375
|
+
border-radius: 100px;
|
|
376
|
+
margin-bottom: 10px;
|
|
377
|
+
text-transform: uppercase;
|
|
378
|
+
letter-spacing: 0.04em;
|
|
379
|
+
}
|
|
380
|
+
.tag-green { background: rgba(34,197,94,0.12); color: var(--green); border: 1px solid rgba(34,197,94,0.2); }
|
|
381
|
+
.tag-indigo { background: var(--accent-glow); color: var(--accent-hover); border: 1px solid rgba(99,102,241,0.25); }
|
|
382
|
+
.tag-amber { background: rgba(245,158,11,0.1); color: var(--amber); border: 1px solid rgba(245,158,11,0.2); }
|
|
383
|
+
|
|
384
|
+
/* ─── Comparison Table ─── */
|
|
385
|
+
.comparison-wrap { overflow-x: auto; }
|
|
386
|
+
.comparison-table {
|
|
387
|
+
width: 100%;
|
|
388
|
+
border-collapse: collapse;
|
|
389
|
+
font-size: 0.9rem;
|
|
390
|
+
min-width: 600px;
|
|
391
|
+
}
|
|
392
|
+
.comparison-table th {
|
|
393
|
+
text-align: left;
|
|
394
|
+
padding: 14px 20px;
|
|
395
|
+
font-size: 0.8125rem;
|
|
396
|
+
font-weight: 600;
|
|
397
|
+
color: var(--text-dim);
|
|
398
|
+
border-bottom: 1px solid var(--border);
|
|
399
|
+
white-space: nowrap;
|
|
400
|
+
}
|
|
401
|
+
.comparison-table th:first-child { padding-left: 0; }
|
|
402
|
+
.comparison-table td {
|
|
403
|
+
padding: 16px 20px;
|
|
404
|
+
border-bottom: 1px solid rgba(255,255,255,0.04);
|
|
405
|
+
vertical-align: middle;
|
|
406
|
+
}
|
|
407
|
+
.comparison-table td:first-child { padding-left: 0; }
|
|
408
|
+
.comparison-table tr:last-child td { border-bottom: none; }
|
|
409
|
+
.comparison-table .provider-name {
|
|
410
|
+
display: flex;
|
|
411
|
+
align-items: center;
|
|
412
|
+
gap: 10px;
|
|
413
|
+
font-weight: 600;
|
|
414
|
+
}
|
|
415
|
+
.comparison-table .provider-name .logo-mark {
|
|
416
|
+
width: 28px; height: 28px;
|
|
417
|
+
border-radius: 6px;
|
|
418
|
+
display: flex;
|
|
419
|
+
align-items: center;
|
|
420
|
+
justify-content: center;
|
|
421
|
+
font-size: 0.75rem;
|
|
422
|
+
font-weight: 700;
|
|
423
|
+
}
|
|
424
|
+
.comparison-table .check { color: var(--green); font-size: 1rem; }
|
|
425
|
+
.comparison-table .cross { color: var(--text-dim); font-size: 0.9rem; }
|
|
426
|
+
.comparison-table .partial { color: var(--amber); font-size: 0.85rem; }
|
|
427
|
+
.comparison-table .highlight-row td { background: rgba(99,102,241,0.06); }
|
|
428
|
+
.comparison-table .highlight-row td:first-child { border-radius: var(--radius) 0 0 var(--radius); }
|
|
429
|
+
.comparison-table .highlight-row td:last-child { border-radius: 0 var(--radius) var(--radius) 0; }
|
|
430
|
+
.comparison-table .badge {
|
|
431
|
+
display: inline-block;
|
|
432
|
+
padding: 2px 8px;
|
|
433
|
+
border-radius: 100px;
|
|
434
|
+
font-size: 0.6875rem;
|
|
435
|
+
font-weight: 700;
|
|
436
|
+
text-transform: uppercase;
|
|
437
|
+
letter-spacing: 0.04em;
|
|
438
|
+
}
|
|
439
|
+
.badge-a3m { background: rgba(99,102,241,0.2); color: var(--accent-hover); }
|
|
440
|
+
.badge-openrouter { background: rgba(255,255,255,0.08); color: var(--text-muted); }
|
|
441
|
+
.badge-litellm { background: rgba(255,255,255,0.08); color: var(--text-muted); }
|
|
442
|
+
|
|
443
|
+
/* ─── How It Works ─── */
|
|
444
|
+
.steps-grid {
|
|
445
|
+
display: grid;
|
|
446
|
+
grid-template-columns: repeat(3, 1fr);
|
|
447
|
+
gap: 2px;
|
|
448
|
+
background: var(--border);
|
|
449
|
+
border: 1px solid var(--border);
|
|
450
|
+
border-radius: var(--radius-lg);
|
|
451
|
+
overflow: hidden;
|
|
452
|
+
margin-top: -48px;
|
|
453
|
+
}
|
|
454
|
+
.step-card {
|
|
455
|
+
background: var(--bg);
|
|
456
|
+
padding: 32px 28px;
|
|
457
|
+
}
|
|
458
|
+
.step-num {
|
|
459
|
+
font-size: 0.75rem;
|
|
460
|
+
font-weight: 700;
|
|
461
|
+
color: var(--accent);
|
|
462
|
+
text-transform: uppercase;
|
|
463
|
+
letter-spacing: 0.08em;
|
|
464
|
+
margin-bottom: 16px;
|
|
465
|
+
}
|
|
466
|
+
.step-card h3 {
|
|
467
|
+
font-size: 1rem;
|
|
468
|
+
font-weight: 600;
|
|
469
|
+
margin-bottom: 10px;
|
|
470
|
+
}
|
|
471
|
+
.step-card p {
|
|
472
|
+
font-size: 0.875rem;
|
|
473
|
+
color: var(--text-muted);
|
|
474
|
+
line-height: 1.6;
|
|
475
|
+
}
|
|
476
|
+
.step-card .code-mini {
|
|
477
|
+
background: var(--surface);
|
|
478
|
+
border: 1px solid var(--border);
|
|
479
|
+
border-radius: var(--radius);
|
|
480
|
+
padding: 12px 14px;
|
|
481
|
+
font-family: var(--mono);
|
|
482
|
+
font-size: 0.75rem;
|
|
483
|
+
color: var(--text-muted);
|
|
484
|
+
margin-top: 14px;
|
|
485
|
+
line-height: 1.6;
|
|
486
|
+
}
|
|
487
|
+
.step-card .code-mini .kw { color: #c084fc; }
|
|
488
|
+
.step-card .code-mini .str { color: #86efac; }
|
|
489
|
+
.step-card .code-mini .fn { color: #7dd3fc; }
|
|
490
|
+
|
|
491
|
+
/* ─── Install Commands ─── */
|
|
492
|
+
.install-grid {
|
|
493
|
+
display: grid;
|
|
494
|
+
grid-template-columns: 1fr 1fr;
|
|
495
|
+
gap: 16px;
|
|
496
|
+
}
|
|
497
|
+
.install-card {
|
|
498
|
+
background: var(--surface);
|
|
499
|
+
border: 1px solid var(--border);
|
|
500
|
+
border-radius: var(--radius-lg);
|
|
501
|
+
overflow: hidden;
|
|
502
|
+
}
|
|
503
|
+
.install-card-header {
|
|
504
|
+
display: flex;
|
|
505
|
+
align-items: center;
|
|
506
|
+
gap: 10px;
|
|
507
|
+
padding: 14px 18px;
|
|
508
|
+
border-bottom: 1px solid var(--border);
|
|
509
|
+
font-size: 0.875rem;
|
|
510
|
+
font-weight: 600;
|
|
511
|
+
color: var(--text-muted);
|
|
512
|
+
}
|
|
513
|
+
.install-card-header .pkg-name { color: var(--text); }
|
|
514
|
+
.install-card-body {
|
|
515
|
+
padding: 16px 18px;
|
|
516
|
+
}
|
|
517
|
+
.install-cmd-block {
|
|
518
|
+
background: var(--bg);
|
|
519
|
+
border: 1px solid var(--border);
|
|
520
|
+
border-radius: var(--radius);
|
|
521
|
+
padding: 12px 14px;
|
|
522
|
+
font-family: var(--mono);
|
|
523
|
+
font-size: 0.8125rem;
|
|
524
|
+
color: var(--text-muted);
|
|
525
|
+
line-height: 1.7;
|
|
526
|
+
}
|
|
527
|
+
.install-cmd-block .comment { color: var(--text-dim); }
|
|
528
|
+
.install-cmd-block .cmd { color: var(--green); }
|
|
529
|
+
.install-cmd-block .pkg { color: var(--accent-hover); }
|
|
530
|
+
|
|
531
|
+
/* ─── Live Demo ─── */
|
|
532
|
+
.demo-card {
|
|
533
|
+
background: var(--surface);
|
|
534
|
+
border: 1px solid var(--border);
|
|
535
|
+
border-radius: var(--radius-lg);
|
|
536
|
+
padding: 40px;
|
|
537
|
+
text-align: center;
|
|
538
|
+
}
|
|
539
|
+
.demo-card .demo-icon {
|
|
540
|
+
font-size: 2.5rem;
|
|
541
|
+
margin-bottom: 16px;
|
|
542
|
+
}
|
|
543
|
+
.demo-card h3 {
|
|
544
|
+
font-size: 1.25rem;
|
|
545
|
+
font-weight: 700;
|
|
546
|
+
margin-bottom: 10px;
|
|
547
|
+
}
|
|
548
|
+
.demo-card p {
|
|
549
|
+
color: var(--text-muted);
|
|
550
|
+
max-width: 480px;
|
|
551
|
+
margin: 0 auto 24px;
|
|
552
|
+
font-size: 0.9375rem;
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
/* ─── Benchmark ─── */
|
|
556
|
+
.benchmark-card {
|
|
557
|
+
background: var(--surface);
|
|
558
|
+
border: 1px solid rgba(99,102,241,0.25);
|
|
559
|
+
border-radius: var(--radius-lg);
|
|
560
|
+
padding: 32px;
|
|
561
|
+
}
|
|
562
|
+
.benchmark-label {
|
|
563
|
+
font-size: 0.75rem;
|
|
564
|
+
font-weight: 700;
|
|
565
|
+
text-transform: uppercase;
|
|
566
|
+
letter-spacing: 0.08em;
|
|
567
|
+
color: var(--accent-hover);
|
|
568
|
+
margin-bottom: 12px;
|
|
569
|
+
}
|
|
570
|
+
.benchmark-metric {
|
|
571
|
+
display: flex;
|
|
572
|
+
align-items: baseline;
|
|
573
|
+
gap: 8px;
|
|
574
|
+
margin-bottom: 8px;
|
|
575
|
+
}
|
|
576
|
+
.benchmark-metric .big {
|
|
577
|
+
font-size: 3rem;
|
|
578
|
+
font-weight: 800;
|
|
579
|
+
letter-spacing: -0.04em;
|
|
580
|
+
color: var(--text);
|
|
581
|
+
}
|
|
582
|
+
.benchmark-metric .unit {
|
|
583
|
+
font-size: 1rem;
|
|
584
|
+
color: var(--text-muted);
|
|
585
|
+
}
|
|
586
|
+
.benchmark-bar-wrap {
|
|
587
|
+
margin: 16px 0 8px;
|
|
588
|
+
}
|
|
589
|
+
.benchmark-bar-label {
|
|
590
|
+
display: flex;
|
|
591
|
+
justify-content: space-between;
|
|
592
|
+
font-size: 0.75rem;
|
|
593
|
+
color: var(--text-dim);
|
|
594
|
+
margin-bottom: 6px;
|
|
595
|
+
}
|
|
596
|
+
.benchmark-bar {
|
|
597
|
+
height: 8px;
|
|
598
|
+
background: var(--surface2);
|
|
599
|
+
border-radius: 100px;
|
|
600
|
+
overflow: hidden;
|
|
601
|
+
}
|
|
602
|
+
.benchmark-bar-fill {
|
|
603
|
+
height: 100%;
|
|
604
|
+
border-radius: 100px;
|
|
605
|
+
background: linear-gradient(90deg, var(--accent), #c084fc);
|
|
606
|
+
transition: width 1s ease;
|
|
607
|
+
}
|
|
608
|
+
.benchmark-note {
|
|
609
|
+
font-size: 0.75rem;
|
|
610
|
+
color: var(--text-dim);
|
|
611
|
+
margin-top: 12px;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/* ─── Provider Logos ─── */
|
|
615
|
+
.provider-logos {
|
|
616
|
+
display: flex;
|
|
617
|
+
flex-wrap: wrap;
|
|
618
|
+
gap: 8px;
|
|
619
|
+
justify-content: center;
|
|
620
|
+
margin-top: 32px;
|
|
621
|
+
}
|
|
622
|
+
.provider-chip {
|
|
623
|
+
padding: 6px 14px;
|
|
624
|
+
background: var(--surface);
|
|
625
|
+
border: 1px solid var(--border);
|
|
626
|
+
border-radius: 100px;
|
|
627
|
+
font-size: 0.8125rem;
|
|
628
|
+
color: var(--text-muted);
|
|
629
|
+
font-weight: 500;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/* ─── Providers Grid ─── */
|
|
633
|
+
.provider-grid {
|
|
634
|
+
display: grid;
|
|
635
|
+
grid-template-columns: repeat(4, 1fr);
|
|
636
|
+
gap: 12px;
|
|
637
|
+
margin-top: 32px;
|
|
638
|
+
}
|
|
639
|
+
.provider-cell {
|
|
640
|
+
background: var(--surface);
|
|
641
|
+
border: 1px solid var(--border);
|
|
642
|
+
border-radius: var(--radius);
|
|
643
|
+
padding: 16px;
|
|
644
|
+
text-align: center;
|
|
645
|
+
}
|
|
646
|
+
.provider-cell .name {
|
|
647
|
+
font-weight: 600;
|
|
648
|
+
font-size: 0.875rem;
|
|
649
|
+
margin-bottom: 4px;
|
|
650
|
+
}
|
|
651
|
+
.provider-cell .price {
|
|
652
|
+
font-size: 0.75rem;
|
|
653
|
+
color: var(--green);
|
|
654
|
+
font-weight: 600;
|
|
655
|
+
}
|
|
656
|
+
.provider-cell .models {
|
|
657
|
+
font-size: 0.6875rem;
|
|
658
|
+
color: var(--text-dim);
|
|
659
|
+
margin-top: 4px;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
/* ─── FAQ ─── */
|
|
663
|
+
.faq-list { max-width: 680px; margin: 0 auto; }
|
|
664
|
+
.faq-item {
|
|
665
|
+
border-bottom: 1px solid var(--border);
|
|
666
|
+
}
|
|
667
|
+
.faq-item:last-child { border-bottom: none; }
|
|
668
|
+
.faq-question {
|
|
669
|
+
display: flex;
|
|
670
|
+
justify-content: space-between;
|
|
671
|
+
align-items: center;
|
|
672
|
+
padding: 20px 0;
|
|
673
|
+
font-weight: 600;
|
|
674
|
+
font-size: 1rem;
|
|
675
|
+
cursor: pointer;
|
|
676
|
+
gap: 16px;
|
|
677
|
+
}
|
|
678
|
+
.faq-question:hover { color: var(--accent-hover); }
|
|
679
|
+
.faq-question .icon {
|
|
680
|
+
font-size: 1.25rem;
|
|
681
|
+
color: var(--text-dim);
|
|
682
|
+
transition: transform 0.3s;
|
|
683
|
+
flex-shrink: 0;
|
|
684
|
+
}
|
|
685
|
+
.faq-item.open .faq-question .icon { transform: rotate(45deg); }
|
|
686
|
+
.faq-answer {
|
|
687
|
+
max-height: 0;
|
|
688
|
+
overflow: hidden;
|
|
689
|
+
transition: max-height 0.3s ease, padding 0.3s ease;
|
|
690
|
+
}
|
|
691
|
+
.faq-item.open .faq-answer { max-height: 400px; }
|
|
692
|
+
.faq-answer-inner {
|
|
693
|
+
padding-bottom: 20px;
|
|
694
|
+
font-size: 0.9375rem;
|
|
695
|
+
color: var(--text-muted);
|
|
696
|
+
line-height: 1.7;
|
|
697
|
+
}
|
|
698
|
+
.faq-answer-inner code {
|
|
699
|
+
background: var(--surface2);
|
|
700
|
+
padding: 2px 6px;
|
|
701
|
+
border-radius: 4px;
|
|
702
|
+
font-family: var(--mono);
|
|
703
|
+
font-size: 0.85em;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/* ─── CTA Section ─── */
|
|
707
|
+
.cta-section {
|
|
708
|
+
background: linear-gradient(180deg, var(--bg) 0%, rgba(99,102,241,0.05) 100%);
|
|
709
|
+
border-top: 1px solid var(--border);
|
|
710
|
+
border-bottom: 1px solid var(--border);
|
|
711
|
+
text-align: center;
|
|
712
|
+
padding: 96px 0;
|
|
713
|
+
}
|
|
714
|
+
.cta-section h2 {
|
|
715
|
+
font-size: 2.5rem;
|
|
716
|
+
font-weight: 800;
|
|
717
|
+
letter-spacing: -0.04em;
|
|
718
|
+
margin-bottom: 16px;
|
|
719
|
+
}
|
|
720
|
+
.cta-section p {
|
|
721
|
+
color: var(--text-muted);
|
|
722
|
+
font-size: 1.1rem;
|
|
723
|
+
max-width: 480px;
|
|
724
|
+
margin: 0 auto 36px;
|
|
725
|
+
}
|
|
726
|
+
.cta-section .cta-stack {
|
|
727
|
+
display: flex;
|
|
728
|
+
flex-direction: column;
|
|
729
|
+
align-items: center;
|
|
730
|
+
gap: 16px;
|
|
731
|
+
}
|
|
732
|
+
.cta-stack .cmd-block {
|
|
733
|
+
background: var(--surface);
|
|
734
|
+
border: 1px solid var(--border);
|
|
735
|
+
border-radius: var(--radius);
|
|
736
|
+
padding: 14px 24px;
|
|
737
|
+
font-family: var(--mono);
|
|
738
|
+
font-size: 0.9rem;
|
|
739
|
+
color: var(--text-muted);
|
|
740
|
+
}
|
|
741
|
+
.cta-stack .cmd-block .cmd { color: var(--green); }
|
|
742
|
+
|
|
743
|
+
/* ─── Footer ─── */
|
|
744
|
+
footer {
|
|
745
|
+
padding: 48px 0;
|
|
746
|
+
border-top: 1px solid var(--border);
|
|
747
|
+
}
|
|
748
|
+
.footer-inner {
|
|
749
|
+
display: flex;
|
|
750
|
+
justify-content: space-between;
|
|
751
|
+
align-items: center;
|
|
752
|
+
flex-wrap: wrap;
|
|
753
|
+
gap: 16px;
|
|
754
|
+
}
|
|
755
|
+
.footer-left {
|
|
756
|
+
display: flex;
|
|
757
|
+
align-items: center;
|
|
758
|
+
gap: 24px;
|
|
759
|
+
}
|
|
760
|
+
.footer-brand {
|
|
761
|
+
font-weight: 700;
|
|
762
|
+
font-size: 0.9rem;
|
|
763
|
+
}
|
|
764
|
+
.footer-links {
|
|
765
|
+
display: flex;
|
|
766
|
+
gap: 20px;
|
|
767
|
+
flex-wrap: wrap;
|
|
768
|
+
}
|
|
769
|
+
.footer-links a {
|
|
770
|
+
font-size: 0.8125rem;
|
|
771
|
+
color: var(--text-dim);
|
|
772
|
+
}
|
|
773
|
+
.footer-links a:hover { color: var(--text-muted); }
|
|
774
|
+
.footer-right {
|
|
775
|
+
font-size: 0.75rem;
|
|
776
|
+
color: var(--text-dim);
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
/* ─── Divider ─── */
|
|
780
|
+
.divider {
|
|
781
|
+
border: none;
|
|
782
|
+
border-top: 1px solid var(--border);
|
|
783
|
+
margin: 0;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
/* ─── Responsive ─── */
|
|
787
|
+
@media (max-width: 768px) {
|
|
788
|
+
.section { padding: 64px 0; }
|
|
789
|
+
.nav-links { display: none; }
|
|
790
|
+
.feature-grid { grid-template-columns: 1fr; }
|
|
791
|
+
.steps-grid { grid-template-columns: 1fr; }
|
|
792
|
+
.install-grid { grid-template-columns: 1fr; }
|
|
793
|
+
.stats-bar { grid-template-columns: repeat(2, 1fr); }
|
|
794
|
+
.provider-grid { grid-template-columns: repeat(2, 1fr); }
|
|
795
|
+
.footer-inner { flex-direction: column; text-align: center; }
|
|
796
|
+
.footer-left { flex-direction: column; }
|
|
797
|
+
.hero h1 { font-size: 2.2rem; }
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
@media (max-width: 480px) {
|
|
801
|
+
.stats-bar { grid-template-columns: 1fr 1fr; }
|
|
802
|
+
}
|
|
803
|
+
</style>
|
|
135
804
|
</head>
|
|
136
805
|
<body>
|
|
137
806
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
</
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
807
|
+
<!-- ─── NAV ─── -->
|
|
808
|
+
<nav>
|
|
809
|
+
<div class="nav-inner">
|
|
810
|
+
<a href="/" class="nav-logo">
|
|
811
|
+
<svg viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
812
|
+
<circle cx="14" cy="14" r="13" stroke="#6366f1" stroke-width="1.5" opacity="0.4"/>
|
|
813
|
+
<circle cx="14" cy="14" r="8" fill="#6366f1" opacity="0.2"/>
|
|
814
|
+
<circle cx="14" cy="14" r="4" fill="#6366f1"/>
|
|
815
|
+
<circle cx="14" cy="5" r="2" fill="#818cf8"/>
|
|
816
|
+
<circle cx="22" cy="19" r="1.5" fill="#22c55e"/>
|
|
817
|
+
<circle cx="6" cy="19" r="1.5" fill="#f59e0b"/>
|
|
818
|
+
</svg>
|
|
819
|
+
A3M Router
|
|
820
|
+
</a>
|
|
821
|
+
<div class="nav-links">
|
|
822
|
+
<a href="#features">Features</a>
|
|
823
|
+
<a href="#comparison">Comparison</a>
|
|
824
|
+
<a href="#providers">Providers</a>
|
|
825
|
+
<a href="#benchmark">Benchmark</a>
|
|
826
|
+
<a href="#faq">FAQ</a>
|
|
827
|
+
</div>
|
|
828
|
+
<div class="nav-cta">
|
|
829
|
+
<a href="https://github.com/Das-rebel/a3m-router" class="btn btn-ghost btn-sm">GitHub</a>
|
|
830
|
+
<a href="https://www.npmjs.com/package/adaptive-memory-multi-model-router" class="btn btn-primary btn-sm">npm install</a>
|
|
831
|
+
</div>
|
|
832
|
+
</div>
|
|
833
|
+
</nav>
|
|
834
|
+
|
|
835
|
+
<!-- ─── HERO ─── -->
|
|
162
836
|
<section class="hero">
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
<
|
|
837
|
+
<div class="container">
|
|
838
|
+
<div class="hero-badge">
|
|
839
|
+
<span class="dot"></span>
|
|
840
|
+
Open source · Apache 2.0 · 47+ providers
|
|
841
|
+
</div>
|
|
842
|
+
<h1>
|
|
843
|
+
The LLM gateway that<br>
|
|
844
|
+
<span class="gradient">cuts your API bill in half</span>
|
|
845
|
+
</h1>
|
|
846
|
+
<p class="hero-sub">
|
|
847
|
+
A3M Router is an open-source LLM proxy that analyzes every query and routes it to the cheapest capable model — without you changing a line of code. 96.77% accuracy on RouterArena at $0.08 per 1K tokens.
|
|
848
|
+
</p>
|
|
849
|
+
<div class="hero-actions">
|
|
850
|
+
<a href="https://www.npmjs.com/package/adaptive-memory-multi-model-router" class="btn btn-primary btn-lg">
|
|
851
|
+
npm install adaptive-memory-multi-model-router
|
|
852
|
+
</a>
|
|
853
|
+
<div class="install-cmd">
|
|
854
|
+
<span class="prompt">$</span>
|
|
855
|
+
<span>pip install adaptive-memory-multi-model-router</span>
|
|
856
|
+
<kbd>Enter</kbd>
|
|
857
|
+
</div>
|
|
858
|
+
</div>
|
|
859
|
+
<div class="hero-actions" style="margin-top: -8px;">
|
|
860
|
+
<a href="https://huggingface.co/spaces/Das-rebel/a3m-router-demo" class="btn btn-outline btn-sm" target="_blank">
|
|
861
|
+
View Live Demo
|
|
862
|
+
</a>
|
|
863
|
+
<a href="https://github.com/Das-rebel/a3m-router" class="btn btn-ghost btn-sm">
|
|
864
|
+
Star on GitHub
|
|
865
|
+
</a>
|
|
866
|
+
</div>
|
|
867
|
+
</div>
|
|
187
868
|
</section>
|
|
188
869
|
|
|
189
|
-
<!--
|
|
190
|
-
<section>
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
870
|
+
<!-- ─── CLI Preview ─── -->
|
|
871
|
+
<section class="section-sm">
|
|
872
|
+
<div class="container">
|
|
873
|
+
<div class="cli-preview">
|
|
874
|
+
<div class="cli-titlebar">
|
|
875
|
+
<span></span><span></span><span></span>
|
|
876
|
+
<span class="title">zsh — a3m-router</span>
|
|
877
|
+
</div>
|
|
878
|
+
<div class="cli-body">
|
|
879
|
+
<div class="line"><span class="prompt">$</span> <span class="path">npx a3m-router serve</span></div>
|
|
880
|
+
<div class="line"><span class="output dim"> A3M Router v2.14 — listening on http://localhost:8787/v1</span></div>
|
|
881
|
+
<div class="line output dim"> Providers: 47 active | Cache: enabled | Guardrails: on</div>
|
|
882
|
+
<div class="sep">────────────────────────────────────────────</div>
|
|
883
|
+
<div class="line"><span class="prompt">$</span> <span class="path">curl http://localhost:8787/v1/chat/completions</span></div>
|
|
884
|
+
<div class="line"><span class="dim"> -d '{"messages":[{"role":"user","content":"Write a Python quicksort"}]}'</span></div>
|
|
885
|
+
<div class="sep">────────────────────────────────────────────</div>
|
|
886
|
+
<div class="line"><span class="output"> Routing query to: </span><span class="model">groq/llama-3.3-70b-versatile</span></div>
|
|
887
|
+
<div class="line"><span class="dim"> Confidence: 0.94 | Tier: budget | Est. cost: $0.00012</span></div>
|
|
888
|
+
<div class="line"><span class="dim"> Cache hit: false | Latency: 847ms</span></div>
|
|
889
|
+
<div class="sep">────────────────────────────────────────────</div>
|
|
890
|
+
<div class="line"><span class="result"> 200 OK — routed in 0.3ms — provider: groq</span></div>
|
|
891
|
+
<div class="line"><span class="score"> Score: 96.77% accuracy on RouterArena</span></div>
|
|
892
|
+
<div class="line"><span class="accent"> Cost: $0.0768 / 1K tokens (avg) — savings vs GPT-4o: 94%</span></div>
|
|
893
|
+
</div>
|
|
894
|
+
</div>
|
|
895
|
+
|
|
896
|
+
<div class="stats-bar">
|
|
897
|
+
<div class="stat-cell">
|
|
898
|
+
<div class="val green">96.77%</div>
|
|
899
|
+
<div class="lbl">RouterArena Accuracy</div>
|
|
900
|
+
</div>
|
|
901
|
+
<div class="stat-cell">
|
|
902
|
+
<div class="val">47+</div>
|
|
903
|
+
<div class="lbl">LLM Providers</div>
|
|
904
|
+
</div>
|
|
905
|
+
<div class="stat-cell">
|
|
906
|
+
<div class="val green">$0.08</div>
|
|
907
|
+
<div class="lbl">Per 1K Tokens (avg)</div>
|
|
908
|
+
</div>
|
|
909
|
+
<div class="stat-cell">
|
|
910
|
+
<div class="val">63%</div>
|
|
911
|
+
<div class="lbl">Cost Savings</div>
|
|
912
|
+
</div>
|
|
913
|
+
</div>
|
|
214
914
|
</div>
|
|
215
|
-
</div>
|
|
216
915
|
</section>
|
|
217
916
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
<
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
917
|
+
<hr class="divider">
|
|
918
|
+
|
|
919
|
+
<!-- ─── FEATURES ─── -->
|
|
920
|
+
<section class="section" id="features">
|
|
921
|
+
<div class="container">
|
|
922
|
+
<div class="section-center">
|
|
923
|
+
<div class="section-title">Everything you need to route LLMs at scale</div>
|
|
924
|
+
<div class="section-subtitle">Built for production from day one. Intelligent routing, caching, security, and analytics — all in one drop-in gateway.</div>
|
|
925
|
+
</div>
|
|
926
|
+
<div class="feature-grid">
|
|
927
|
+
<div class="feature-card">
|
|
928
|
+
<div class="icon">⚡</div>
|
|
929
|
+
<span class="tag tag-green">Core</span>
|
|
930
|
+
<h3>Intelligent Query Routing</h3>
|
|
931
|
+
<p>Analyzes query complexity using keyword-based classification and routes to the cheapest capable provider. Code queries go to code models. Trivial queries use free models. Premium only when needed.</p>
|
|
932
|
+
</div>
|
|
933
|
+
<div class="feature-card">
|
|
934
|
+
<div class="icon">💰</div>
|
|
935
|
+
<span class="tag tag-green">Core</span>
|
|
936
|
+
<h3>Parallel Ensemble Mode</h3>
|
|
937
|
+
<p>Call multiple providers simultaneously and score every response with weighted signals: domain match, specificity, structure alignment, verb matching, and cost tier. Cheapest that fully satisfies wins.</p>
|
|
938
|
+
</div>
|
|
939
|
+
<div class="feature-card">
|
|
940
|
+
<div class="icon">🔒</div>
|
|
941
|
+
<span class="tag tag-indigo">Caching</span>
|
|
942
|
+
<h3>Semantic Cache</h3>
|
|
943
|
+
<p>Trigram Jaccard similarity cache eliminates redundant API calls. Exact duplicates return instantly for free. Near-duplicates use fuzzy matching to maximize cache hit rate.</p>
|
|
944
|
+
</div>
|
|
945
|
+
<div class="feature-card">
|
|
946
|
+
<div class="icon">🛡</div>
|
|
947
|
+
<span class="tag tag-indigo">Security</span>
|
|
948
|
+
<h3>Security Guardrails</h3>
|
|
949
|
+
<p>Built-in prompt injection detection, PII redaction, content filtering, and rate limiting. Optional NeMo Guardrails integration for jailbreak detection and hallucination prevention.</p>
|
|
950
|
+
</div>
|
|
951
|
+
<div class="feature-card">
|
|
952
|
+
<div class="icon">📊</div>
|
|
953
|
+
<span class="tag tag-amber">Analytics</span>
|
|
954
|
+
<h3>Real-time Cost Analytics</h3>
|
|
955
|
+
<p>Monitor spend, latency, cache hits, and provider health in real-time. Set per-provider budgets and get alerts when thresholds are exceeded.</p>
|
|
956
|
+
</div>
|
|
957
|
+
<div class="feature-card">
|
|
958
|
+
<div class="icon">🔄</div>
|
|
959
|
+
<span class="tag tag-amber">Resilience</span>
|
|
960
|
+
<h3>Circuit Breaker & Retry</h3>
|
|
961
|
+
<p>Automatic failover when providers degrade or fail. Circuit breaker pattern keeps your app resilient. Exponential backoff with jitter for transient failures.</p>
|
|
962
|
+
</div>
|
|
963
|
+
</div>
|
|
964
|
+
</div>
|
|
253
965
|
</section>
|
|
254
966
|
|
|
255
|
-
|
|
256
|
-
<section>
|
|
257
|
-
<h2>✨ Features</h2>
|
|
967
|
+
<hr class="divider">
|
|
258
968
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
969
|
+
<!-- ─── HOW IT WORKS ─── -->
|
|
970
|
+
<section class="section" id="how">
|
|
971
|
+
<div class="container">
|
|
972
|
+
<div class="section-center">
|
|
973
|
+
<div class="section-title">Drop-in replacement for api.openai.com</div>
|
|
974
|
+
<div class="section-subtitle">No code changes needed. Point your existing OpenAI SDK to localhost and A3M handles the rest.</div>
|
|
975
|
+
</div>
|
|
976
|
+
<div class="steps-grid">
|
|
977
|
+
<div class="step-card">
|
|
978
|
+
<div class="step-num">Step 1 — Install</div>
|
|
979
|
+
<h3>One command, anywhere</h3>
|
|
980
|
+
<p>Works on macOS, Linux, and Windows. No Docker required. Runs locally or on a server.</p>
|
|
981
|
+
<div class="code-mini">
|
|
982
|
+
<span class="kw">npm</span> install -g<br>
|
|
983
|
+
adaptive-memory-multi-model-router<br>
|
|
984
|
+
<span class="comment"># or</span><br>
|
|
985
|
+
<span class="kw">pip</span> install<br>
|
|
986
|
+
adaptive-memory-multi-model-router
|
|
987
|
+
</div>
|
|
988
|
+
</div>
|
|
989
|
+
<div class="step-card">
|
|
990
|
+
<div class="step-num">Step 2 — Start</div>
|
|
991
|
+
<h3>One command to serve</h3>
|
|
992
|
+
<p>A3M starts an OpenAI-compatible proxy on port 8787. Set your API key once and forget it.</p>
|
|
993
|
+
<div class="code-mini">
|
|
994
|
+
<span class="kw">export</span> OPENROUTER_API_KEY=...<br>
|
|
995
|
+
<span class="kw">npx</span> a3m-router serve<br><br>
|
|
996
|
+
<span class="comment"># Listens at</span><br>
|
|
997
|
+
<span class="fn">http://localhost:8787/v1</span>
|
|
998
|
+
</div>
|
|
999
|
+
</div>
|
|
1000
|
+
<div class="step-card">
|
|
1001
|
+
<div class="step-num">Step 3 — Use</div>
|
|
1002
|
+
<h3>Change one line of code</h3>
|
|
1003
|
+
<p>Point your OpenAI SDK base URL to A3M's proxy. Everything else works automatically.</p>
|
|
1004
|
+
<div class="code-mini">
|
|
1005
|
+
<span class="kw">openai</span>.<span class="fn">OpenAI</span>({<br>
|
|
1006
|
+
<span class="str">base_url</span>: <span class="str">'http://localhost:8787/v1'</span><br>
|
|
1007
|
+
})<br>
|
|
1008
|
+
<span class="comment"># That's it. 47+ providers,</span><br>
|
|
1009
|
+
<span class="comment"># intelligent routing, caching.</span>
|
|
1010
|
+
</div>
|
|
1011
|
+
</div>
|
|
1012
|
+
</div>
|
|
269
1013
|
</div>
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
1014
|
+
</section>
|
|
1015
|
+
|
|
1016
|
+
<hr class="divider">
|
|
1017
|
+
|
|
1018
|
+
<!-- ─── COMPARISON ─── -->
|
|
1019
|
+
<section class="section" id="comparison">
|
|
1020
|
+
<div class="container">
|
|
1021
|
+
<div class="section-center">
|
|
1022
|
+
<div class="section-title">A3M vs OpenRouter vs LiteLLM</div>
|
|
1023
|
+
<div class="section-subtitle">How does A3M stack up against the alternatives? Here's a feature-by-feature breakdown.</div>
|
|
1024
|
+
</div>
|
|
1025
|
+
<div class="comparison-wrap">
|
|
1026
|
+
<table class="comparison-table">
|
|
1027
|
+
<thead>
|
|
1028
|
+
<tr>
|
|
1029
|
+
<th>Feature</th>
|
|
1030
|
+
<th><span class="badge badge-a3m">A3M Router</span></th>
|
|
1031
|
+
<th><span class="badge badge-openrouter">OpenRouter</span></th>
|
|
1032
|
+
<th><span class="badge badge-litellm">LiteLLM</span></th>
|
|
1033
|
+
</tr>
|
|
1034
|
+
</thead>
|
|
1035
|
+
<tbody>
|
|
1036
|
+
<tr class="highlight-row">
|
|
1037
|
+
<td><div class="provider-name"><span class="check">✓</span> Open-source (Apache 2.0)</div></td>
|
|
1038
|
+
<td><span class="check">✓</span></td>
|
|
1039
|
+
<td><span class="cross">✗ Closed</span></td>
|
|
1040
|
+
<td><span class="check">✓</span></td>
|
|
1041
|
+
</tr>
|
|
1042
|
+
<tr>
|
|
1043
|
+
<td><div class="provider-name"><span class="check">✓</span> Intelligent cost-based routing</div></td>
|
|
1044
|
+
<td><span class="check">✓</span> Keyword classifier</td>
|
|
1045
|
+
<td><span class="partial">~ Latent routing</span></td>
|
|
1046
|
+
<td><span class="partial">~ Configurable fallbacks</span></td>
|
|
1047
|
+
</tr>
|
|
1048
|
+
<tr class="highlight-row">
|
|
1049
|
+
<td><div class="provider-name"><span class="check">✓</span> Parallel ensemble execution</div></td>
|
|
1050
|
+
<td><span class="check">✓</span> Multi-provider scoring</td>
|
|
1051
|
+
<td><span class="cross">✗</span></td>
|
|
1052
|
+
<td><span class="cross">✗</span></td>
|
|
1053
|
+
</tr>
|
|
1054
|
+
<tr>
|
|
1055
|
+
<td><div class="provider-name"><span class="check">✓</span> Semantic cache (Jaccard trigram)</div></td>
|
|
1056
|
+
<td><span class="check">✓</span> Built-in</td>
|
|
1057
|
+
<td><span class="cross">✗</span></td>
|
|
1058
|
+
<td><span class="partial">~ Redis external</span></td>
|
|
1059
|
+
</tr>
|
|
1060
|
+
<tr class="highlight-row">
|
|
1061
|
+
<td><div class="provider-name"><span class="check">✓</span> Security guardrails & PII redaction</div></td>
|
|
1062
|
+
<td><span class="check">✓</span> Built-in + NeMo</td>
|
|
1063
|
+
<td><span class="cross">✗</span></td>
|
|
1064
|
+
<td><span class="partial">~ Virtual keys only</span></td>
|
|
1065
|
+
</tr>
|
|
1066
|
+
<tr>
|
|
1067
|
+
<td><div class="provider-name"><span class="check">✓</span> Real-time cost analytics</div></td>
|
|
1068
|
+
<td><span class="check">✓</span> Built-in dashboard</td>
|
|
1069
|
+
<td><span class="partial">~ Usage tracking only</span></td>
|
|
1070
|
+
<td><span class="partial">~ LangSmith hook</span></td>
|
|
1071
|
+
</tr>
|
|
1072
|
+
<tr class="highlight-row">
|
|
1073
|
+
<td><div class="provider-name"><span class="check">✓</span> RouterArena benchmark</div></td>
|
|
1074
|
+
<td><span class="check">✓</span> <strong style="color:var(--green)">96.77%</strong></td>
|
|
1075
|
+
<td><span class="cross">✗</span></td>
|
|
1076
|
+
<td><span class="cross">✗</span></td>
|
|
1077
|
+
</tr>
|
|
1078
|
+
<tr>
|
|
1079
|
+
<td><div class="provider-name"><span class="check">✓</span> Zero-config drop-in OpenAI proxy</div></td>
|
|
1080
|
+
<td><span class="check">✓</span></td>
|
|
1081
|
+
<td><span class="check">✓</span></td>
|
|
1082
|
+
<td><span class="check">✓</span></td>
|
|
1083
|
+
</tr>
|
|
1084
|
+
<tr class="highlight-row">
|
|
1085
|
+
<td><div class="provider-name"><span class="check">✓</span> Self-hosted / local models</div></td>
|
|
1086
|
+
<td><span class="check">✓</span> Ollama, LM Studio, vLLM</td>
|
|
1087
|
+
<td><span class="partial">~ OpenRouter only</span></td>
|
|
1088
|
+
<td><span class="check">✓</span></td>
|
|
1089
|
+
</tr>
|
|
1090
|
+
<tr>
|
|
1091
|
+
<td><div class="provider-name"><span class="check">✓</span> Circuit breaker & retry logic</div></td>
|
|
1092
|
+
<td><span class="check">✓</span> Built-in</td>
|
|
1093
|
+
<td><span class="cross">✗</span></td>
|
|
1094
|
+
<td><span class="check">✓</span></td>
|
|
1095
|
+
</tr>
|
|
1096
|
+
</tbody>
|
|
1097
|
+
</table>
|
|
1098
|
+
</div>
|
|
1099
|
+
<div style="text-align:center; margin-top: 24px;">
|
|
1100
|
+
<a href="https://github.com/Das-rebel/a3m-router" class="btn btn-primary">
|
|
1101
|
+
View on GitHub
|
|
1102
|
+
</a>
|
|
1103
|
+
</div>
|
|
289
1104
|
</div>
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
1105
|
+
</section>
|
|
1106
|
+
|
|
1107
|
+
<hr class="divider">
|
|
1108
|
+
|
|
1109
|
+
<!-- ─── PROVIDERS ─── -->
|
|
1110
|
+
<section class="section" id="providers">
|
|
1111
|
+
<div class="container">
|
|
1112
|
+
<div class="section-center">
|
|
1113
|
+
<div class="section-title">47+ providers, one endpoint</div>
|
|
1114
|
+
<div class="section-subtitle">From free local models to the latest GPT-4o and Gemini 2.0. A3M routes to the right one automatically.</div>
|
|
1115
|
+
</div>
|
|
1116
|
+
<div class="provider-grid">
|
|
1117
|
+
<div class="provider-cell">
|
|
1118
|
+
<div class="name">Groq</div>
|
|
1119
|
+
<div class="price">$0.59 / 1M</div>
|
|
1120
|
+
<div class="models">Llama 3.3 70B</div>
|
|
1121
|
+
</div>
|
|
1122
|
+
<div class="provider-cell">
|
|
1123
|
+
<div class="name">Cerebras</div>
|
|
1124
|
+
<div class="price">$0.60 / 1M</div>
|
|
1125
|
+
<div class="models">Llama 3.3 70B</div>
|
|
1126
|
+
</div>
|
|
1127
|
+
<div class="provider-cell">
|
|
1128
|
+
<div class="name">DeepSeek</div>
|
|
1129
|
+
<div class="price">$1.50 / 1M</div>
|
|
1130
|
+
<div class="models">V3, Chat, Coder</div>
|
|
1131
|
+
</div>
|
|
1132
|
+
<div class="provider-cell">
|
|
1133
|
+
<div class="name">Mistral</div>
|
|
1134
|
+
<div class="price">$2.00 / 1M</div>
|
|
1135
|
+
<div class="models">Large, Small</div>
|
|
1136
|
+
</div>
|
|
1137
|
+
<div class="provider-cell">
|
|
1138
|
+
<div class="name">OpenAI</div>
|
|
1139
|
+
<div class="price">$15 / 1M</div>
|
|
1140
|
+
<div class="models">GPT-4o, o1, o3</div>
|
|
1141
|
+
</div>
|
|
1142
|
+
<div class="provider-cell">
|
|
1143
|
+
<div class="name">Anthropic</div>
|
|
1144
|
+
<div class="price">$18 / 1M</div>
|
|
1145
|
+
<div class="models">Claude 3.5, 3 Opus</div>
|
|
1146
|
+
</div>
|
|
1147
|
+
<div class="provider-cell">
|
|
1148
|
+
<div class="name">Google</div>
|
|
1149
|
+
<div class="price">$10 / 1M</div>
|
|
1150
|
+
<div class="models">Gemini 2.0, 1.5</div>
|
|
1151
|
+
</div>
|
|
1152
|
+
<div class="provider-cell">
|
|
1153
|
+
<div class="name">xAI</div>
|
|
1154
|
+
<div class="price">$5 / 1M</div>
|
|
1155
|
+
<div class="models">Grok 2, Grok Beta</div>
|
|
1156
|
+
</div>
|
|
1157
|
+
<div class="provider-cell">
|
|
1158
|
+
<div class="name">Ollama</div>
|
|
1159
|
+
<div class="price">Free</div>
|
|
1160
|
+
<div class="models">Local models</div>
|
|
1161
|
+
</div>
|
|
1162
|
+
<div class="provider-cell">
|
|
1163
|
+
<div class="name">Command R</div>
|
|
1164
|
+
<div class="price">Free</div>
|
|
1165
|
+
<div class="models">CommandCode, R+</div>
|
|
1166
|
+
</div>
|
|
1167
|
+
<div class="provider-cell">
|
|
1168
|
+
<div class="name">Together AI</div>
|
|
1169
|
+
<div class="price">$0.50 / 1M</div>
|
|
1170
|
+
<div class="models">DeepSeek V3, Qwen</div>
|
|
1171
|
+
</div>
|
|
1172
|
+
<div class="provider-cell">
|
|
1173
|
+
<div class="name">MiniMax</div>
|
|
1174
|
+
<div class="price">$0.50 / 1M</div>
|
|
1175
|
+
<div class="models">MiniMax-Text-01</div>
|
|
1176
|
+
</div>
|
|
1177
|
+
</div>
|
|
1178
|
+
<div class="provider-logos">
|
|
1179
|
+
<span class="provider-chip">Fireworks</span>
|
|
1180
|
+
<span class="provider-chip">Cohere</span>
|
|
1181
|
+
<span class="provider-chip">Perplexity</span>
|
|
1182
|
+
<span class="provider-chip">Qwen</span>
|
|
1183
|
+
<span class="provider-chip">GLM-4</span>
|
|
1184
|
+
<span class="provider-chip">LM Studio</span>
|
|
1185
|
+
<span class="provider-chip">vLLM</span>
|
|
1186
|
+
<span class="provider-chip">OpenRouter</span>
|
|
1187
|
+
<span class="provider-chip">+ 35 more</span>
|
|
1188
|
+
</div>
|
|
294
1189
|
</div>
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
1190
|
+
</section>
|
|
1191
|
+
|
|
1192
|
+
<hr class="divider">
|
|
1193
|
+
|
|
1194
|
+
<!-- ─── BENCHMARK ─── -->
|
|
1195
|
+
<section class="section" id="benchmark">
|
|
1196
|
+
<div class="container">
|
|
1197
|
+
<div class="section-center">
|
|
1198
|
+
<div class="section-title">Benchmark-proven accuracy</div>
|
|
1199
|
+
<div class="section-subtitle">A3M scores 96.77% on RouterArena — the independent LLM routing benchmark.</div>
|
|
1200
|
+
</div>
|
|
1201
|
+
<div style="display:grid; grid-template-columns: 1fr 1fr; gap: 24px; margin-top: 40px;">
|
|
1202
|
+
<div class="benchmark-card">
|
|
1203
|
+
<div class="benchmark-label">RouterArena Score</div>
|
|
1204
|
+
<div class="benchmark-metric">
|
|
1205
|
+
<span class="big">0.9404</span>
|
|
1206
|
+
<span class="unit">/ 1.0</span>
|
|
1207
|
+
</div>
|
|
1208
|
+
<div class="benchmark-bar-wrap">
|
|
1209
|
+
<div class="benchmark-bar-label"><span>A3M Router</span><span>96.77%</span></div>
|
|
1210
|
+
<div class="benchmark-bar"><div class="benchmark-bar-fill" style="width:96.77%"></div></div>
|
|
1211
|
+
</div>
|
|
1212
|
+
<div class="benchmark-bar-wrap">
|
|
1213
|
+
<div class="benchmark-bar-label"><span>Avg. Baseline</span><span>87.32%</span></div>
|
|
1214
|
+
<div class="benchmark-bar"><div class="benchmark-bar-fill" style="width:87.32%; background:var(--surface2);"></div></div>
|
|
1215
|
+
</div>
|
|
1216
|
+
<div class="benchmark-note">Higher is better. Source: RouterArena official evaluation, 8,400 queries.</div>
|
|
1217
|
+
</div>
|
|
1218
|
+
<div class="benchmark-card">
|
|
1219
|
+
<div class="benchmark-label">Cost per 1K Tokens</div>
|
|
1220
|
+
<div class="benchmark-metric">
|
|
1221
|
+
<span class="big">$0.08</span>
|
|
1222
|
+
<span class="unit">avg</span>
|
|
1223
|
+
</div>
|
|
1224
|
+
<div class="benchmark-bar-wrap">
|
|
1225
|
+
<div class="benchmark-bar-label"><span>A3M (routed)</span><span>$0.0768</span></div>
|
|
1226
|
+
<div class="benchmark-bar"><div class="benchmark-bar-fill" style="width:10%"></div></div>
|
|
1227
|
+
</div>
|
|
1228
|
+
<div class="benchmark-bar-wrap">
|
|
1229
|
+
<div class="benchmark-bar-label"><span>GPT-4o only</span><span>$15.00</span></div>
|
|
1230
|
+
<div class="benchmark-bar"><div class="benchmark-bar-fill" style="width:100%; background:var(--surface2);"></div></div>
|
|
1231
|
+
</div>
|
|
1232
|
+
<div class="benchmark-note">94% cost reduction vs GPT-4o-only baseline. Routed on 8,400 RouterArena queries.</div>
|
|
1233
|
+
</div>
|
|
1234
|
+
</div>
|
|
1235
|
+
<div style="text-align:center; margin-top:32px;">
|
|
1236
|
+
<a href="https://github.com/RouteWorks/RouterArena" class="btn btn-outline" target="_blank">
|
|
1237
|
+
View RouterArena on GitHub
|
|
1238
|
+
</a>
|
|
1239
|
+
</div>
|
|
299
1240
|
</div>
|
|
300
|
-
</div>
|
|
301
1241
|
</section>
|
|
302
1242
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
</
|
|
320
|
-
</table>
|
|
321
|
-
</div>
|
|
322
|
-
|
|
323
|
-
<pre><code>complexity 0.00 ── 0.19 ── 0.44 ── 1.00
|
|
324
|
-
free cheap mid premium
|
|
325
|
-
</code></pre>
|
|
326
|
-
|
|
327
|
-
<h3>Real-World Examples</h3>
|
|
328
|
-
<div class="table-wrapper">
|
|
329
|
-
<table>
|
|
330
|
-
<thead>
|
|
331
|
-
<tr><th>Query</th><th>Score</th><th>Tier</th><th>Routes To</th></tr>
|
|
332
|
-
</thead>
|
|
333
|
-
<tbody>
|
|
334
|
-
<tr><td><code>"What is 2+2?"</code></td><td>0.10</td><td>free</td><td>taste-1 ($0)</td></tr>
|
|
335
|
-
<tr><td><code>"Write a Python sort"</code></td><td>0.33</td><td>cheap</td><td>llama-3.3-70b ($0.20/M)</td></tr>
|
|
336
|
-
<tr><td><code>"Review contract liability"</code></td><td>0.87</td><td>premium</td><td>claude-3.5-sonnet ($1.50/M)</td></tr>
|
|
337
|
-
<tr><td><code>"Design oncology trial"</code></td><td>1.00</td><td>premium</td><td>gpt-4o ($2.50/M)</td></tr>
|
|
338
|
-
</tbody>
|
|
339
|
-
</table>
|
|
340
|
-
</div>
|
|
1243
|
+
<hr class="divider">
|
|
1244
|
+
|
|
1245
|
+
<!-- ─── LIVE DEMO ─── -->
|
|
1246
|
+
<section class="section" id="demo">
|
|
1247
|
+
<div class="container">
|
|
1248
|
+
<div class="demo-card">
|
|
1249
|
+
<div class="demo-icon">🎯</div>
|
|
1250
|
+
<h3>Try it right now — no install required</h3>
|
|
1251
|
+
<p>The live demo runs in your browser. Enter any prompt and watch A3M route it to the optimal provider in real time. See the confidence score, routing decision, and response.</p>
|
|
1252
|
+
<a href="https://huggingface.co/spaces/Das-rebel/a3m-router-demo" class="btn btn-primary btn-lg" target="_blank">
|
|
1253
|
+
Open Live Demo on HuggingFace
|
|
1254
|
+
</a>
|
|
1255
|
+
<p style="margin-top:16px; font-size:0.8125rem; color:var(--text-dim);">
|
|
1256
|
+
Free to use. No API key required for the demo.
|
|
1257
|
+
</p>
|
|
1258
|
+
</div>
|
|
1259
|
+
</div>
|
|
341
1260
|
</section>
|
|
342
1261
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
<
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
<img src="assets/chart-accuracy-by-tier.svg" alt="Routing Accuracy by Tier" style="max-width: 100%; border-radius: 8px;">
|
|
389
|
-
<img src="assets/chart-confusion-matrix.svg" alt="Confusion Matrix" style="max-width: 100%; border-radius: 8px;">
|
|
390
|
-
</div>
|
|
391
|
-
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin: 1.5rem 0;">
|
|
392
|
-
<img src="assets/chart-cost-comparison.svg" alt="Cost Comparison" style="max-width: 100%; border-radius: 8px;">
|
|
393
|
-
<img src="assets/chart-latency-overhead.svg" alt="Latency Overhead" style="max-width: 100%; border-radius: 8px;">
|
|
394
|
-
</div>
|
|
1262
|
+
<hr class="divider">
|
|
1263
|
+
|
|
1264
|
+
<!-- ─── INSTALL ─── -->
|
|
1265
|
+
<section class="section-sm" id="install">
|
|
1266
|
+
<div class="container">
|
|
1267
|
+
<div class="section-center">
|
|
1268
|
+
<div class="section-title">Install in 30 seconds</div>
|
|
1269
|
+
<div class="section-subtitle">Works anywhere Node.js or Python runs. Linux, macOS, Windows.</div>
|
|
1270
|
+
</div>
|
|
1271
|
+
<div class="install-grid" style="max-width:800px; margin:0 auto;">
|
|
1272
|
+
<div class="install-card">
|
|
1273
|
+
<div class="install-card-header">
|
|
1274
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect width="16" height="16" rx="4" fill="#CB3837"/><path d="M8 1h4.5a3.5 3.5 0 010 7H8V1zM8 8h5a3.5 3.5 0 010 7H8V8z" fill="white"/></svg>
|
|
1275
|
+
<span class="pkg-name">npm</span>
|
|
1276
|
+
</div>
|
|
1277
|
+
<div class="install-card-body">
|
|
1278
|
+
<div class="install-cmd-block">
|
|
1279
|
+
<span class="comment"># Install globally</span><br>
|
|
1280
|
+
<span class="cmd">npm</span> install -g \<br>
|
|
1281
|
+
adaptive-memory-multi-model-router<br><br>
|
|
1282
|
+
<span class="comment"># Or use via npx (no install)</span><br>
|
|
1283
|
+
<span class="cmd">npx</span> a3m-router serve<br><br>
|
|
1284
|
+
<span class="comment"># Start routing on port 8787</span>
|
|
1285
|
+
</div>
|
|
1286
|
+
</div>
|
|
1287
|
+
</div>
|
|
1288
|
+
<div class="install-card">
|
|
1289
|
+
<div class="install-card-header">
|
|
1290
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M8 0C3.58 0 0 3.58 0 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8zm3.88 11.12L8 7.24l-3.88 3.88A.75.75 0 015 10.5V5.5c0-.69.56-1.25 1.25-1.25h3.5c.69 0 1.25.56 1.25 1.25v5a.75.75 0 01-1.12.62z" fill="#0069A5"/></svg>
|
|
1291
|
+
<span class="pkg-name">pip</span>
|
|
1292
|
+
</div>
|
|
1293
|
+
<div class="install-card-body">
|
|
1294
|
+
<div class="install-cmd-block">
|
|
1295
|
+
<span class="comment"># Install from PyPI</span><br>
|
|
1296
|
+
<span class="cmd">pip</span> install \<br>
|
|
1297
|
+
adaptive-memory-multi-model-router<br><br>
|
|
1298
|
+
<span class="comment"># Use the Python client</span><br>
|
|
1299
|
+
<span class="kw">from</span> a3m_router <span class="kw">import</span> A3MRouter<br>
|
|
1300
|
+
router = <span class="fn">A3MRouter</span>()<br>
|
|
1301
|
+
result = router.<span class="fn">route</span>(<span class="str">"..."</span>)
|
|
1302
|
+
</div>
|
|
1303
|
+
</div>
|
|
1304
|
+
</div>
|
|
1305
|
+
</div>
|
|
1306
|
+
</div>
|
|
395
1307
|
</section>
|
|
396
1308
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
<
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
1309
|
+
<hr class="divider">
|
|
1310
|
+
|
|
1311
|
+
<!-- ─── FAQ ─── -->
|
|
1312
|
+
<section class="section" id="faq">
|
|
1313
|
+
<div class="container">
|
|
1314
|
+
<div class="section-center">
|
|
1315
|
+
<div class="section-title">Frequently Asked Questions</div>
|
|
1316
|
+
</div>
|
|
1317
|
+
<div class="faq-list">
|
|
1318
|
+
<div class="faq-item open">
|
|
1319
|
+
<div class="faq-question" onclick="toggleFaq(this)">
|
|
1320
|
+
What is an LLM router?
|
|
1321
|
+
<span class="icon">+</span>
|
|
1322
|
+
</div>
|
|
1323
|
+
<div class="faq-answer">
|
|
1324
|
+
<div class="faq-answer-inner">
|
|
1325
|
+
An LLM router is a gateway that intelligently directs each query to the optimal language model provider based on query characteristics, cost, availability, and capability requirements — instead of hardcoding a single provider. This enables cost optimization, automatic failover, and quality maximization on a per-query basis. A3M Router uses a keyword-based classifier to make routing decisions in under a millisecond.
|
|
1326
|
+
</div>
|
|
1327
|
+
</div>
|
|
1328
|
+
</div>
|
|
1329
|
+
<div class="faq-item">
|
|
1330
|
+
<div class="faq-question" onclick="toggleFaq(this)">
|
|
1331
|
+
How does A3M compare to OpenRouter?
|
|
1332
|
+
<span class="icon">+</span>
|
|
1333
|
+
</div>
|
|
1334
|
+
<div class="faq-answer">
|
|
1335
|
+
<div class="faq-answer-inner">
|
|
1336
|
+
OpenRouter is a paid proxy service with a closed-source routing layer. A3M Router is fully open source (Apache 2.0) — you can self-host it, audit the routing logic, and contribute. A3M uses parallel multi-provider ensemble execution with confidence-weighted scoring, while OpenRouter uses sequential routing. A3M also includes built-in semantic caching, security guardrails, and real-time cost analytics at no extra cost.
|
|
1337
|
+
</div>
|
|
1338
|
+
</div>
|
|
1339
|
+
</div>
|
|
1340
|
+
<div class="faq-item">
|
|
1341
|
+
<div class="faq-question" onclick="toggleFaq(this)">
|
|
1342
|
+
How does parallel ensemble routing work?
|
|
1343
|
+
<span class="icon">+</span>
|
|
1344
|
+
</div>
|
|
1345
|
+
<div class="faq-answer">
|
|
1346
|
+
<div class="faq-answer-inner">
|
|
1347
|
+
A3M sends the same query to multiple providers simultaneously (e.g., Groq, DeepSeek, and Mistral). Each response is scored using weighted signals: domain match to provider specialties, query specificity, structure alignment, verb matching, and cost tier. The cheapest provider with a score above the confidence threshold wins. This means a provider that responds first isn't guaranteed to win — quality and cost are factored in.
|
|
1348
|
+
</div>
|
|
1349
|
+
</div>
|
|
1350
|
+
</div>
|
|
1351
|
+
<div class="faq-item">
|
|
1352
|
+
<div class="faq-question" onclick="toggleFaq(this)">
|
|
1353
|
+
How much can I save?
|
|
1354
|
+
<span class="icon">+</span>
|
|
1355
|
+
</div>
|
|
1356
|
+
<div class="faq-answer">
|
|
1357
|
+
<div class="faq-answer-inner">
|
|
1358
|
+
On the RouterArena benchmark (8,400 real queries), A3M achieves 96.77% accuracy at an average cost of <strong>$0.0768 per 1K tokens</strong> — compared to GPT-4o at $15/1M. That's a <strong>94% cost reduction</strong> with better accuracy than the baseline. Combined with semantic caching (which eliminates repeat queries), real-world savings are even higher.
|
|
1359
|
+
</div>
|
|
1360
|
+
</div>
|
|
1361
|
+
</div>
|
|
1362
|
+
<div class="faq-item">
|
|
1363
|
+
<div class="faq-question" onclick="toggleFaq(this)">
|
|
1364
|
+
Can I use local models (Ollama, LM Studio)?
|
|
1365
|
+
<span class="icon">+</span>
|
|
1366
|
+
</div>
|
|
1367
|
+
<div class="faq-answer">
|
|
1368
|
+
<div class="faq-answer-inner">
|
|
1369
|
+
Yes. A3M supports <code>Ollama</code>, <code>LM Studio</code>, and <code>vLLM</code> as free local providers. A3M will route simple or repetitive queries to your local models, reserving paid APIs for complex tasks. This gives you a free tier that costs nothing to run.
|
|
1370
|
+
</div>
|
|
1371
|
+
</div>
|
|
1372
|
+
</div>
|
|
1373
|
+
<div class="faq-item">
|
|
1374
|
+
<div class="faq-question" onclick="toggleFaq(this)">
|
|
1375
|
+
Does this work with LangChain, LlamaIndex, or CrewAI?
|
|
1376
|
+
<span class="icon">+</span>
|
|
1377
|
+
</div>
|
|
1378
|
+
<div class="faq-answer">
|
|
1379
|
+
<div class="faq-answer-inner">
|
|
1380
|
+
Yes. Because A3M is an OpenAI-compatible proxy, any framework that supports custom base URLs works out of the box. This includes LangChain, LlamaIndex, AutoGen, and CrewAI. A3M also provides a first-class Python client with a cleaner API for those who prefer it over the OpenAI SDK.
|
|
1381
|
+
</div>
|
|
1382
|
+
</div>
|
|
1383
|
+
</div>
|
|
1384
|
+
<div class="faq-item">
|
|
1385
|
+
<div class="faq-question" onclick="toggleFaq(this)">
|
|
1386
|
+
How fast is the routing decision?
|
|
1387
|
+
<span class="icon">+</span>
|
|
1388
|
+
</div>
|
|
1389
|
+
<div class="faq-answer">
|
|
1390
|
+
<div class="faq-answer-inner">
|
|
1391
|
+
Routing decisions take <strong>0.1–0.5ms</strong> using A3M's keyword-based classifier — negligible compared to LLM inference time. The end-to-end latency is dominated by the selected provider's model speed. In parallel ensemble mode, A3M waits for the fastest responders, so the overall latency is often faster than waiting for a single premium model.
|
|
1392
|
+
</div>
|
|
1393
|
+
</div>
|
|
1394
|
+
</div>
|
|
1395
|
+
</div>
|
|
1396
|
+
</div>
|
|
426
1397
|
</section>
|
|
427
1398
|
|
|
428
|
-
<!--
|
|
429
|
-
<section>
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
<
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
<
|
|
441
|
-
<
|
|
442
|
-
<span
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
<span class="hljs-keyword">from</span> a3m <span class="hljs-keyword">import</span> A3MRouter
|
|
450
|
-
|
|
451
|
-
<span class="hljs-keyword">async with</span> A3MRouter() <span class="hljs-keyword">as</span> router:
|
|
452
|
-
decision = <span class="hljs-keyword">await</span> router.route(<span class="hljs-string">"Write a Python function to sort an array"</span>)
|
|
453
|
-
<span class="hljs-built_in">print</span>(decision.model, decision.tier, decision.cost)
|
|
454
|
-
<span class="hljs-comment"># → groq/llama-3.3-70b cheap 0.0004</span></code></pre>
|
|
455
|
-
|
|
456
|
-
<h3>OpenAI-Compatible Proxy</h3>
|
|
457
|
-
<pre><code><span class="hljs-comment"># Start the proxy</span>
|
|
458
|
-
npx a3m-router serve
|
|
459
|
-
<span class="hljs-comment"># → Proxy running at http://localhost:8787</span>
|
|
460
|
-
|
|
461
|
-
<span class="hljs-comment"># Works with ANY OpenAI SDK</span>
|
|
462
|
-
<span class="hljs-keyword">from</span> openai <span class="hljs-keyword">import</span> OpenAI
|
|
463
|
-
client = OpenAI(base_url=<span class="hljs-string">"http://localhost:8787/v1"</span>, api_key=<span class="hljs-string">"not-needed"</span>)
|
|
464
|
-
response = client.chat.completions.create(
|
|
465
|
-
model=<span class="hljs-string">"auto"</span>,
|
|
466
|
-
messages=[{<span class="hljs-string">"role"</span>: <span class="hljs-string">"user"</span>, <span class="hljs-string">"content"</span>: <span class="hljs-string">"Hello!"</span>}]
|
|
467
|
-
)</code></pre>
|
|
468
|
-
|
|
469
|
-
<p class="cta-buttons" style="margin-top: 24px;">
|
|
470
|
-
<a href="quick-start" class="btn btn-primary">📖 Full Quick Start Guide</a>
|
|
471
|
-
</p>
|
|
1399
|
+
<!-- ─── CTA ─── -->
|
|
1400
|
+
<section class="cta-section">
|
|
1401
|
+
<div class="container">
|
|
1402
|
+
<h2>Start reducing your LLM costs today</h2>
|
|
1403
|
+
<p>Open source, self-hostable, and works with your existing code in minutes.</p>
|
|
1404
|
+
<div class="cta-stack">
|
|
1405
|
+
<div class="cmd-block">
|
|
1406
|
+
<span class="cmd">npm install -g adaptive-memory-multi-model-router</span>
|
|
1407
|
+
</div>
|
|
1408
|
+
<a href="https://github.com/Das-rebel/a3m-router" class="btn btn-primary btn-lg" target="_blank">
|
|
1409
|
+
View on GitHub
|
|
1410
|
+
</a>
|
|
1411
|
+
<div style="display:flex; gap:12px; justify-content:center; margin-top:8px;">
|
|
1412
|
+
<a href="https://www.npmjs.com/package/adaptive-memory-multi-model-router" class="btn btn-ghost btn-sm">NPM</a>
|
|
1413
|
+
<span style="color:var(--text-dim);">|</span>
|
|
1414
|
+
<a href="https://pypi.org/project/adaptive-memory-multi-model-router/" class="btn btn-ghost btn-sm">PyPI</a>
|
|
1415
|
+
<span style="color:var(--text-dim);">|</span>
|
|
1416
|
+
<a href="https://huggingface.co/spaces/Das-rebel/a3m-router-demo" class="btn btn-ghost btn-sm" target="_blank">Live Demo</a>
|
|
1417
|
+
</div>
|
|
1418
|
+
</div>
|
|
1419
|
+
</div>
|
|
472
1420
|
</section>
|
|
473
1421
|
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
<
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
</footer>
|
|
1422
|
+
<!-- ─── FOOTER ─── -->
|
|
1423
|
+
<footer>
|
|
1424
|
+
<div class="container">
|
|
1425
|
+
<div class="footer-inner">
|
|
1426
|
+
<div class="footer-left">
|
|
1427
|
+
<span class="footer-brand">A3M Router</span>
|
|
1428
|
+
<div class="footer-links">
|
|
1429
|
+
<a href="https://github.com/Das-rebel/a3m-router">GitHub</a>
|
|
1430
|
+
<a href="https://www.npmjs.com/package/adaptive-memory-multi-model-router">npm</a>
|
|
1431
|
+
<a href="https://pypi.org/project/adaptive-memory-multi-model-router/">PyPI</a>
|
|
1432
|
+
<a href="https://huggingface.co/spaces/Das-rebel/a3m-router-demo" target="_blank">Demo</a>
|
|
1433
|
+
<a href="https://github.com/Das-rebel/a3m-router/blob/main/docs/API.md">API Docs</a>
|
|
1434
|
+
<a href="https://github.com/Das-rebel/a3m-router/issues">Issues</a>
|
|
1435
|
+
</div>
|
|
1436
|
+
</div>
|
|
1437
|
+
<div class="footer-right">
|
|
1438
|
+
Apache 2.0 © 2026 — MIT-licensed routing intelligence
|
|
1439
|
+
</div>
|
|
1440
|
+
</div>
|
|
1441
|
+
</div>
|
|
1442
|
+
</footer>
|
|
1443
|
+
|
|
1444
|
+
<script>
|
|
1445
|
+
function toggleFaq(el) {
|
|
1446
|
+
const item = el.parentElement;
|
|
1447
|
+
const isOpen = item.classList.contains('open');
|
|
1448
|
+
// Close all
|
|
1449
|
+
document.querySelectorAll('.faq-item').forEach(f => f.classList.remove('open'));
|
|
1450
|
+
// Open clicked if it was closed
|
|
1451
|
+
if (!isOpen) item.classList.add('open');
|
|
1452
|
+
}
|
|
1453
|
+
</script>
|
|
1454
|
+
|
|
1455
|
+
<!-- JSON-LD: FAQPage -->
|
|
1456
|
+
<script type="application/ld+json">
|
|
1457
|
+
{
|
|
1458
|
+
"@context": "https://schema.org",
|
|
1459
|
+
"@type": "FAQPage",
|
|
1460
|
+
"mainEntity": [
|
|
1461
|
+
{
|
|
1462
|
+
"@type": "Question",
|
|
1463
|
+
"name": "What is an LLM router?",
|
|
1464
|
+
"acceptedAnswer": {
|
|
1465
|
+
"@type": "Answer",
|
|
1466
|
+
"text": "An LLM router is a gateway that intelligently directs queries to the optimal language model provider based on query characteristics, cost, availability, and capability requirements — rather than hardcoding a single provider. This enables cost optimization, automatic failover, and quality maximization on a per-query basis."
|
|
1467
|
+
}
|
|
1468
|
+
},
|
|
1469
|
+
{
|
|
1470
|
+
"@type": "Question",
|
|
1471
|
+
"name": "How does A3M Router differ from OpenRouter?",
|
|
1472
|
+
"acceptedAnswer": {
|
|
1473
|
+
"@type": "Answer",
|
|
1474
|
+
"text": "OpenRouter is a paid proxy service with closed-source routing. A3M Router is fully open source (Apache 2.0) with parallel multi-provider ensemble execution, built-in semantic caching, security guardrails, and real-time cost analytics. A3M routes queries in parallel and scores every response using weighted signals — the cheapest provider that fully satisfies the query wins."
|
|
1475
|
+
}
|
|
1476
|
+
},
|
|
1477
|
+
{
|
|
1478
|
+
"@type": "Question",
|
|
1479
|
+
"name": "How much can I save with A3M Router?",
|
|
1480
|
+
"acceptedAnswer": {
|
|
1481
|
+
"@type": "Answer",
|
|
1482
|
+
"text": "On the RouterArena benchmark (8,400 queries), A3M achieves 96.77% accuracy at $0.0768 per 1K tokens — a 94% cost reduction vs GPT-4o-only routing. Combined with semantic caching, real-world savings are even higher."
|
|
1483
|
+
}
|
|
1484
|
+
},
|
|
1485
|
+
{
|
|
1486
|
+
"@type": "Question",
|
|
1487
|
+
"name": "Is A3M Router open source?",
|
|
1488
|
+
"acceptedAnswer": {
|
|
1489
|
+
"@type": "Answer",
|
|
1490
|
+
"text": "Yes. A3M Router is Apache 2.0 licensed and fully open source. The core routing engine, MCP server, Python SDK, and TypeScript/Node.js packages are all available on GitHub at github.com/Das-rebel/a3m-router."
|
|
1491
|
+
}
|
|
1492
|
+
},
|
|
1493
|
+
{
|
|
1494
|
+
"@type": "Question",
|
|
1495
|
+
"name": "How do I get started with A3M Router?",
|
|
1496
|
+
"acceptedAnswer": {
|
|
1497
|
+
"@type": "Answer",
|
|
1498
|
+
"text": "npm install -g adaptive-memory-multi-model-router && npx a3m-router serve. Then point your OpenAI SDK base URL to http://localhost:8787/v1. For Python: pip install adaptive-memory-multi-model-router and use the A3MRouter client."
|
|
1499
|
+
}
|
|
1500
|
+
},
|
|
1501
|
+
{
|
|
1502
|
+
"@type": "Question",
|
|
1503
|
+
"name": "Which providers does A3M Router support?",
|
|
1504
|
+
"acceptedAnswer": {
|
|
1505
|
+
"@type": "Answer",
|
|
1506
|
+
"text": "A3M Router supports 47+ providers including OpenAI (GPT-4o, o1, o3), Anthropic (Claude 3.5), Google (Gemini 2.0), Groq (Llama 3.3 70B at $0.59/1M), Cerebras, DeepSeek V3, Mistral, xAI (Grok), Ollama (local, free), CommandCode (free), and many more."
|
|
1507
|
+
}
|
|
1508
|
+
}
|
|
1509
|
+
]
|
|
1510
|
+
}
|
|
1511
|
+
</script>
|
|
1512
|
+
|
|
1513
|
+
<!-- JSON-LD: SoftwareApplication -->
|
|
1514
|
+
<script type="application/ld+json">
|
|
1515
|
+
{
|
|
1516
|
+
"@context": "https://schema.org",
|
|
1517
|
+
"@type": "SoftwareApplication",
|
|
1518
|
+
"name": "A3M Router",
|
|
1519
|
+
"description": "Open-source LLM routing gateway with parallel multi-provider execution, semantic cache, security guardrails, and real-time cost analytics. 47+ providers. 96.77% RouterArena accuracy.",
|
|
1520
|
+
"url": "https://github.com/Das-rebel/a3m-router",
|
|
1521
|
+
"applicationCategory": "DeveloperApplication",
|
|
1522
|
+
"operatingSystem": "Linux, macOS, Windows",
|
|
1523
|
+
"programmingLanguage": "TypeScript",
|
|
1524
|
+
"offers": {
|
|
1525
|
+
"@type": "Offer",
|
|
1526
|
+
"price": "0",
|
|
1527
|
+
"priceCurrency": "USD",
|
|
1528
|
+
"description": "Apache 2.0 License. Free and open source."
|
|
1529
|
+
},
|
|
1530
|
+
"softwareVersion": "2.14",
|
|
1531
|
+
"installUrl": "https://www.npmjs.com/package/adaptive-memory-multi-model-router",
|
|
1532
|
+
"codeRepository": "https://github.com/Das-rebel/a3m-router",
|
|
1533
|
+
"license": "https://opensource.org/licenses/Apache-2.0",
|
|
1534
|
+
"author": {
|
|
1535
|
+
"@type": "Organization",
|
|
1536
|
+
"name": "A3M Router Team",
|
|
1537
|
+
"url": "https://github.com/Das-rebel"
|
|
1538
|
+
},
|
|
1539
|
+
"featureList": [
|
|
1540
|
+
"OpenAI-compatible proxy",
|
|
1541
|
+
"47+ LLM providers",
|
|
1542
|
+
"Intelligent query routing",
|
|
1543
|
+
"Parallel ensemble execution",
|
|
1544
|
+
"Semantic cache (Jaccard trigram)",
|
|
1545
|
+
"Security guardrails and PII redaction",
|
|
1546
|
+
"Real-time cost analytics",
|
|
1547
|
+
"Circuit breaker and retry logic",
|
|
1548
|
+
"LangChain adapter",
|
|
1549
|
+
"Batch processing"
|
|
1550
|
+
]
|
|
1551
|
+
}
|
|
1552
|
+
</script>
|
|
495
1553
|
|
|
496
1554
|
</body>
|
|
497
1555
|
</html>
|