adaptive-memory-multi-model-router 2.16.2 → 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 -219
- package/data/jev-distill.jsonl +320 -0
- package/dist/routing/jev/jevRouter.d.ts +49 -0
- package/dist/routing/jev/jevRouter.js +231 -0
- package/dist/routing/jev/jevRouter.js.map +1 -0
- package/dist/routing/jev/optionAttention.d.ts +63 -0
- package/dist/routing/jev/optionAttention.js +158 -0
- package/dist/routing/jev/optionAttention.js.map +1 -0
- package/dist/routing/jev/remote.d.ts +14 -0
- package/dist/routing/jev/remote.js +55 -0
- package/dist/routing/jev/remote.js.map +1 -0
- package/dist/routing/jev/types.d.ts +71 -0
- package/dist/routing/jev/types.js +19 -0
- package/dist/routing/jev/types.js.map +1 -0
- package/dist/routing/jev/weights/jev-router-weights.json +1 -0
- package/dist/server/modelMapper.js +18 -0
- package/dist/server/modelMapper.js.map +1 -1
- package/docs/assets/og-banner.svg +193 -0
- package/docs/index.html +1523 -465
- package/docs-site/index.html +1427 -563
- package/package.json +29 -20
- package/python/pyproject.toml +1 -1
- package/src/cli/setupWizard.ts +4 -2
- package/src/routing/jev/jevRouter.ts +251 -0
- package/src/routing/jev/optionAttention.ts +186 -0
- package/src/routing/jev/remote.ts +50 -0
- package/src/routing/jev/types.ts +79 -0
- package/src/routing/jev/weights/jev-router-weights.json +1 -0
- package/src/server/modelMapper.ts +17 -0
- package/tests/routing/jev.test.ts +110 -0
- package/tools/calibrate_temp.py +81 -0
- package/tools/distill.mjs +143 -0
- package/tools/train_jev.py +213 -0
- package/dist/cli/tui.d.ts +0 -6
- package/dist/cli/tui.js.map +0 -1
- package/dist/routing/shadowSampler.d.ts.map +0 -1
- /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-site/index.html
CHANGED
|
@@ -5,19 +5,19 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
|
|
7
7
|
<!-- Primary SEO Meta Tags -->
|
|
8
|
-
<title>A3M Router —
|
|
9
|
-
<meta name="description" content="
|
|
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">
|
|
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
11
|
<meta name="author" content="A3M Router Team">
|
|
12
12
|
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large">
|
|
13
|
-
<link rel="canonical" href="https://das-rebel.github.io/
|
|
13
|
+
<link rel="canonical" href="https://das-rebel.github.io/a3m-router/">
|
|
14
14
|
|
|
15
15
|
<!-- Open Graph / Social Sharing -->
|
|
16
16
|
<meta property="og:type" content="website">
|
|
17
|
-
<meta property="og:url" content="https://das-rebel.github.io/
|
|
18
|
-
<meta property="og:title" content="A3M Router —
|
|
19
|
-
<meta property="og:description" content="
|
|
20
|
-
<meta property="og:image" content="https://das-rebel.github.io/
|
|
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
21
|
<meta property="og:image:width" content="1200">
|
|
22
22
|
<meta property="og:image:height" content="630">
|
|
23
23
|
<meta property="og:site_name" content="A3M Router">
|
|
@@ -25,667 +25,1531 @@
|
|
|
25
25
|
|
|
26
26
|
<!-- Twitter Card -->
|
|
27
27
|
<meta name="twitter:card" content="summary_large_image">
|
|
28
|
-
<meta name="twitter:title" content="A3M Router —
|
|
29
|
-
<meta name="twitter:description" content="
|
|
30
|
-
<meta name="twitter:image" content="https://das-rebel.github.io/
|
|
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
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
|
-
"@type": "Question",
|
|
56
|
-
"name": "Which providers does A3M Router support?",
|
|
57
|
-
"acceptedAnswer": {
|
|
58
|
-
"@type": "Answer",
|
|
59
|
-
"text": "A3M Router supports 47+ providers including OpenAI (GPT-4o, GPT-4o-mini, o1-preview, o1-mini), Anthropic (Claude 3.5 Sonnet, Claude 3 Haiku), Google (Gemini 1.5 Pro, Gemini 1.5 Flash), Groq (LLaMA 3.3 70B, Mixtral 8x7B), Mistral (Mistral Large, Mistral 7B), DeepSeek (DeepSeek V3, DeepSeek Chat), Cerebras (LLaMA 3.3 70B), Ollama (local models), and many more."
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"@type": "Question",
|
|
64
|
-
"name": "How fast is A3M Router?",
|
|
65
|
-
"acceptedAnswer": {
|
|
66
|
-
"@type": "Answer",
|
|
67
|
-
"text": "A3M Router makes routing decisions in sub-millisecond time (typically 0.1–0.5ms) using a keyword-based classifier. The end-to-end latency depends on the selected provider's model. Parallel calls wait for the fastest responders, so ensemble mode often completes faster than sequential fallback."
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
"@type": "Question",
|
|
72
|
-
"name": "Is A3M Router open source?",
|
|
73
|
-
"acceptedAnswer": {
|
|
74
|
-
"@type": "Answer",
|
|
75
|
-
"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."
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
"@type": "Question",
|
|
80
|
-
"name": "How do I get started with A3M Router?",
|
|
81
|
-
"acceptedAnswer": {
|
|
82
|
-
"@type": "Answer",
|
|
83
|
-
"text": "npm install -g adaptive-memory-multi-model-router && a3m-router serve. Then use the OpenAI SDK with base_url: http://localhost:8787/v1. For Python: pip install adaptive-memory-multi-model-router and use the A3MRouter client. Full docs at https://a3m-router.com."
|
|
84
|
-
}
|
|
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;
|
|
85
54
|
}
|
|
86
|
-
]
|
|
87
|
-
}
|
|
88
|
-
</script>
|
|
89
55
|
|
|
90
|
-
|
|
91
|
-
<script type="application/ld+json">
|
|
92
|
-
{
|
|
93
|
-
"@context": "https://schema.org",
|
|
94
|
-
"@type": "SoftwareApplication",
|
|
95
|
-
"name": "A3M Router",
|
|
96
|
-
"description": "OpenAI-compatible LLM router validated by Parallel multi-provider routing with confidence scoring. Semantic cache. 47+ providers. 47+ providers, semantic cache, guardrails, cost analytics.",
|
|
97
|
-
"url": "https://github.com/Das-rebel/a3m-router",
|
|
98
|
-
"applicationCategory": "DeveloperApplication",
|
|
99
|
-
"operatingSystem": "Linux, macOS, Windows",
|
|
100
|
-
"programmingLanguage": "TypeScript",
|
|
101
|
-
"offers": {
|
|
102
|
-
"@type": "Offer",
|
|
103
|
-
"price": "0",
|
|
104
|
-
"priceCurrency": "USD",
|
|
105
|
-
"description": "MIT License. Free and open source."
|
|
106
|
-
},
|
|
107
|
-
"softwareVersion": "2.14.56",
|
|
108
|
-
"installUrl": "https://www.npmjs.com/package/adaptive-memory-multi-model-router",
|
|
109
|
-
"codeRepository": "https://github.com/Das-rebel/a3m-router",
|
|
110
|
-
"license": "https://opensource.org/licenses/MIT",
|
|
111
|
-
"author": {
|
|
112
|
-
"@type": "Organization",
|
|
113
|
-
"name": "A3M Router Team",
|
|
114
|
-
"url": "https://github.com/Das-rebel"
|
|
115
|
-
},
|
|
116
|
-
"aggregateRating": {
|
|
117
|
-
"@type": "AggregateRating",
|
|
118
|
-
"ratingValue": "4.8",
|
|
119
|
-
"reviewCount": "52",
|
|
120
|
-
"bestRating": "5"
|
|
121
|
-
},
|
|
122
|
-
"featureList": [
|
|
123
|
-
"OpenAI-compatible proxy",
|
|
124
|
-
"47+ LLM providers",
|
|
125
|
-
"Intelligent query routing",
|
|
126
|
-
"63% cost savings | Semantic cache | Parallel ensemble",
|
|
127
|
-
"Semantic cache",
|
|
128
|
-
"Security guardrails",
|
|
129
|
-
"Real-time cost analytics",
|
|
130
|
-
"LangChain adapter",
|
|
131
|
-
"Batch processing",
|
|
132
|
-
"Circuit breaker"
|
|
133
|
-
]
|
|
134
|
-
}
|
|
135
|
-
</script>
|
|
56
|
+
html { scroll-behavior: smooth; }
|
|
136
57
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
{
|
|
144
|
-
"@type": "Question",
|
|
145
|
-
"name": "What is A3M Router?",
|
|
146
|
-
"acceptedAnswer": {
|
|
147
|
-
"@type": "Answer",
|
|
148
|
-
"text": "A3M Router is an OpenAI-compatible proxy that analyzes each LLM query and routes it to the cheapest capable provider. Supports 47+ providers including Groq, Cerebras, OpenAI, Anthropic, DeepSeek, MiniMax, and free local models via Ollama. Parallel ensemble execution with confidence-weighted scoring."
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
"@type": "Question",
|
|
153
|
-
"name": "How much can I save with A3M Router?",
|
|
154
|
-
"acceptedAnswer": {
|
|
155
|
-
"@type": "Answer",
|
|
156
|
-
"text": "A3M Router is optimized for cost-quality routing. Parallel multi-provider execution, semantic caching, and EXP3-inspired exploration achieve 63% cost savings vs premium-only routing."
|
|
157
|
-
}
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
"@type": "Question",
|
|
161
|
-
"name": "Is A3M Router free?",
|
|
162
|
-
"acceptedAnswer": {
|
|
163
|
-
"@type": "Answer",
|
|
164
|
-
"text": "Yes, A3M Router is MIT-licensed open source software. It's free to use. You only pay for the underlying LLM API calls you route through it, and A3M Router minimizes those costs by selecting the cheapest capable provider."
|
|
165
|
-
}
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
"@type": "Question",
|
|
169
|
-
"name": "How do I get started with A3M Router?",
|
|
170
|
-
"acceptedAnswer": {
|
|
171
|
-
"@type": "Answer",
|
|
172
|
-
"text": "Install with npm install adaptive-memory-multi-model-router, then run npx a3m-router serve to start the OpenAI-compatible proxy on port 8787. Point your existing OpenAI SDK base URL to http://localhost:8787/v1 and you're done."
|
|
173
|
-
}
|
|
174
|
-
},
|
|
175
|
-
{
|
|
176
|
-
"@type": "Question",
|
|
177
|
-
"name": "What LLM providers does A3M Router support?",
|
|
178
|
-
"acceptedAnswer": {
|
|
179
|
-
"@type": "Answer",
|
|
180
|
-
"text": "A3M Router supports 47+ providers including OpenAI, Anthropic (Claude), Google (Gemini), Groq, Cerebras, DeepSeek, Mistral, Fireworks, Together AI, Perplexity, Cohere, xAI (Grok), MiniMax, Ollama, OpenRouter, and many more. Free options include CommandCode, Ollama, LM Studio, and vLLM."
|
|
181
|
-
}
|
|
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;
|
|
182
64
|
}
|
|
183
|
-
]
|
|
184
|
-
}
|
|
185
|
-
</script>
|
|
186
65
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
{
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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;
|
|
198
78
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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; }
|
|
202
87
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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);
|
|
208
96
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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);
|
|
213
148
|
color: #fff;
|
|
214
|
-
min-height: 100vh;
|
|
215
149
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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;
|
|
221
155
|
}
|
|
222
|
-
|
|
223
|
-
|
|
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;
|
|
224
178
|
text-align: center;
|
|
225
|
-
padding: 4rem 0;
|
|
226
179
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
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;
|
|
232
191
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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);
|
|
236
204
|
font-weight: 800;
|
|
237
|
-
|
|
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%);
|
|
238
211
|
-webkit-background-clip: text;
|
|
239
212
|
-webkit-text-fill-color: transparent;
|
|
240
|
-
|
|
213
|
+
background-size: 200% auto;
|
|
241
214
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
margin
|
|
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;
|
|
247
221
|
}
|
|
248
|
-
|
|
249
|
-
.stats {
|
|
222
|
+
.hero-actions {
|
|
250
223
|
display: flex;
|
|
224
|
+
align-items: center;
|
|
251
225
|
justify-content: center;
|
|
252
|
-
gap:
|
|
253
|
-
margin: 3rem 0;
|
|
226
|
+
gap: 12px;
|
|
254
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);
|
|
255
241
|
}
|
|
256
|
-
|
|
257
|
-
.
|
|
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;
|
|
258
317
|
text-align: center;
|
|
259
|
-
padding: 1.5rem 2rem;
|
|
260
|
-
background: rgba(255,255,255,0.05);
|
|
261
|
-
border-radius: 16px;
|
|
262
|
-
border: 1px solid rgba(255,255,255,0.1);
|
|
263
318
|
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
font-size: 2.5rem;
|
|
319
|
+
.stat-cell .val {
|
|
320
|
+
font-size: 1.5rem;
|
|
267
321
|
font-weight: 700;
|
|
268
|
-
color:
|
|
322
|
+
color: var(--text);
|
|
323
|
+
letter-spacing: -0.03em;
|
|
269
324
|
}
|
|
270
|
-
|
|
271
|
-
.stat-
|
|
272
|
-
font-size: 0.
|
|
273
|
-
color:
|
|
274
|
-
margin-top:
|
|
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;
|
|
275
330
|
}
|
|
276
|
-
|
|
277
|
-
|
|
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;
|
|
278
353
|
display: flex;
|
|
279
|
-
|
|
354
|
+
align-items: center;
|
|
280
355
|
justify-content: center;
|
|
281
|
-
margin: 3rem 0;
|
|
282
|
-
flex-wrap: wrap;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
.btn {
|
|
286
|
-
padding: 1rem 2rem;
|
|
287
|
-
border-radius: 12px;
|
|
288
356
|
font-size: 1.1rem;
|
|
357
|
+
margin-bottom: 16px;
|
|
358
|
+
}
|
|
359
|
+
.feature-card h3 {
|
|
360
|
+
font-size: 0.9375rem;
|
|
289
361
|
font-weight: 600;
|
|
290
|
-
|
|
291
|
-
|
|
362
|
+
margin-bottom: 8px;
|
|
363
|
+
letter-spacing: -0.01em;
|
|
292
364
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
365
|
+
.feature-card p {
|
|
366
|
+
font-size: 0.875rem;
|
|
367
|
+
color: var(--text-muted);
|
|
368
|
+
line-height: 1.6;
|
|
297
369
|
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
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;
|
|
302
414
|
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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;
|
|
308
423
|
}
|
|
309
|
-
|
|
310
|
-
.
|
|
311
|
-
|
|
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;
|
|
312
438
|
}
|
|
313
|
-
|
|
314
|
-
.
|
|
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 {
|
|
315
445
|
display: grid;
|
|
316
|
-
grid-template-columns: repeat(
|
|
317
|
-
gap:
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
background: rgba(255,255,255,0.03);
|
|
324
|
-
border-radius: 20px;
|
|
325
|
-
border: 1px solid rgba(255,255,255,0.05);
|
|
326
|
-
transition: all 0.3s ease;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
.feature:hover {
|
|
330
|
-
background: rgba(255,255,255,0.05);
|
|
331
|
-
transform: translateY(-5px);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
.feature-icon {
|
|
335
|
-
font-size: 2.5rem;
|
|
336
|
-
margin-bottom: 1rem;
|
|
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;
|
|
337
453
|
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
margin-bottom: 0.5rem;
|
|
342
|
-
color: #fff;
|
|
454
|
+
.step-card {
|
|
455
|
+
background: var(--bg);
|
|
456
|
+
padding: 32px 28px;
|
|
343
457
|
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
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;
|
|
348
465
|
}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
466
|
+
.step-card h3 {
|
|
467
|
+
font-size: 1rem;
|
|
468
|
+
font-weight: 600;
|
|
469
|
+
margin-bottom: 10px;
|
|
353
470
|
}
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
padding: 2rem;
|
|
359
|
-
margin: 2rem auto;
|
|
360
|
-
max-width: 800px;
|
|
361
|
-
text-align: left;
|
|
362
|
-
border: 1px solid rgba(255,255,255,0.1);
|
|
363
|
-
overflow-x: auto;
|
|
471
|
+
.step-card p {
|
|
472
|
+
font-size: 0.875rem;
|
|
473
|
+
color: var(--text-muted);
|
|
474
|
+
line-height: 1.6;
|
|
364
475
|
}
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
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;
|
|
370
485
|
line-height: 1.6;
|
|
371
486
|
}
|
|
372
|
-
|
|
373
|
-
.code-
|
|
374
|
-
|
|
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;
|
|
375
496
|
}
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
497
|
+
.install-card {
|
|
498
|
+
background: var(--surface);
|
|
499
|
+
border: 1px solid var(--border);
|
|
500
|
+
border-radius: var(--radius-lg);
|
|
501
|
+
overflow: hidden;
|
|
379
502
|
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
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);
|
|
383
512
|
}
|
|
384
|
-
|
|
385
|
-
.
|
|
386
|
-
|
|
513
|
+
.install-card-header .pkg-name { color: var(--text); }
|
|
514
|
+
.install-card-body {
|
|
515
|
+
padding: 16px 18px;
|
|
387
516
|
}
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
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;
|
|
392
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); }
|
|
393
530
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
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;
|
|
399
538
|
}
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
background: rgba(255,255,255,0.03);
|
|
404
|
-
border-radius: 16px;
|
|
405
|
-
border: 1px solid rgba(255,255,255,0.08);
|
|
406
|
-
text-align: left;
|
|
539
|
+
.demo-card .demo-icon {
|
|
540
|
+
font-size: 2.5rem;
|
|
541
|
+
margin-bottom: 16px;
|
|
407
542
|
}
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
font-
|
|
411
|
-
margin-bottom:
|
|
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;
|
|
412
553
|
}
|
|
413
554
|
|
|
414
|
-
|
|
415
|
-
|
|
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;
|
|
416
564
|
font-weight: 700;
|
|
417
|
-
|
|
418
|
-
|
|
565
|
+
text-transform: uppercase;
|
|
566
|
+
letter-spacing: 0.08em;
|
|
567
|
+
color: var(--accent-hover);
|
|
568
|
+
margin-bottom: 12px;
|
|
419
569
|
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
570
|
+
.benchmark-metric {
|
|
571
|
+
display: flex;
|
|
572
|
+
align-items: baseline;
|
|
573
|
+
gap: 8px;
|
|
574
|
+
margin-bottom: 8px;
|
|
425
575
|
}
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
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;
|
|
429
612
|
}
|
|
430
613
|
|
|
431
|
-
|
|
432
|
-
|
|
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;
|
|
433
630
|
}
|
|
434
631
|
|
|
435
|
-
|
|
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;
|
|
436
644
|
text-align: center;
|
|
437
|
-
|
|
438
|
-
|
|
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;
|
|
439
660
|
}
|
|
440
661
|
|
|
662
|
+
/* ─── FAQ ─── */
|
|
663
|
+
.faq-list { max-width: 680px; margin: 0 auto; }
|
|
441
664
|
.faq-item {
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
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;
|
|
448
704
|
}
|
|
449
705
|
|
|
450
|
-
|
|
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);
|
|
451
722
|
font-size: 1.1rem;
|
|
452
|
-
|
|
453
|
-
margin
|
|
723
|
+
max-width: 480px;
|
|
724
|
+
margin: 0 auto 36px;
|
|
454
725
|
}
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
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);
|
|
459
740
|
}
|
|
741
|
+
.cta-stack .cmd-block .cmd { color: var(--green); }
|
|
460
742
|
|
|
743
|
+
/* ─── Footer ─── */
|
|
461
744
|
footer {
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
border-top: 1px solid rgba(255,255,255,0.1);
|
|
465
|
-
margin-top: 4rem;
|
|
745
|
+
padding: 48px 0;
|
|
746
|
+
border-top: 1px solid var(--border);
|
|
466
747
|
}
|
|
467
|
-
|
|
468
|
-
.links {
|
|
748
|
+
.footer-inner {
|
|
469
749
|
display: flex;
|
|
470
|
-
justify-content:
|
|
471
|
-
|
|
472
|
-
|
|
750
|
+
justify-content: space-between;
|
|
751
|
+
align-items: center;
|
|
752
|
+
flex-wrap: wrap;
|
|
753
|
+
gap: 16px;
|
|
473
754
|
}
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
transition: color 0.3s;
|
|
755
|
+
.footer-left {
|
|
756
|
+
display: flex;
|
|
757
|
+
align-items: center;
|
|
758
|
+
gap: 24px;
|
|
479
759
|
}
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
760
|
+
.footer-brand {
|
|
761
|
+
font-weight: 700;
|
|
762
|
+
font-size: 0.9rem;
|
|
483
763
|
}
|
|
484
|
-
|
|
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 ─── */
|
|
485
787
|
@media (max-width: 768px) {
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
.
|
|
491
|
-
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
.
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
}
|
|
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; }
|
|
501
802
|
}
|
|
502
803
|
</style>
|
|
503
804
|
</head>
|
|
504
805
|
<body>
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
<circle cx="
|
|
516
|
-
<circle cx="
|
|
517
|
-
<circle cx="100" cy="100" r="25" fill="url(#g1)"/>
|
|
518
|
-
<circle cx="100" cy="40" r="12" fill="#6366f1"/>
|
|
519
|
-
<circle cx="152" cy="130" r="10" fill="#10b981"/>
|
|
520
|
-
<circle cx="48" cy="130" r="10" fill="#f59e0b"/>
|
|
521
|
-
<text x="100" y="108" font-size="14" font-weight="bold" fill="white" text-anchor="middle">A3M</text>
|
|
806
|
+
|
|
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"/>
|
|
522
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 ─── -->
|
|
836
|
+
<section class="hero">
|
|
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>
|
|
868
|
+
</section>
|
|
869
|
+
|
|
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>
|
|
523
894
|
</div>
|
|
524
|
-
|
|
525
|
-
<
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
<div class="stat-value">96.77%</div>
|
|
538
|
-
<div class="stat-label">RouterArena Accuracy</div>
|
|
539
|
-
</div>
|
|
540
|
-
<div class="stat">
|
|
541
|
-
<div class="stat-value">$0.08</div>
|
|
542
|
-
<div class="stat-label">Per 1K Tokens</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>
|
|
543
908
|
</div>
|
|
909
|
+
<div class="stat-cell">
|
|
910
|
+
<div class="val">63%</div>
|
|
911
|
+
<div class="lbl">Cost Savings</div>
|
|
912
|
+
</div>
|
|
913
|
+
</div>
|
|
914
|
+
</div>
|
|
915
|
+
</section>
|
|
916
|
+
|
|
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>
|
|
544
925
|
</div>
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
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>
|
|
549
963
|
</div>
|
|
550
|
-
</
|
|
964
|
+
</div>
|
|
965
|
+
</section>
|
|
551
966
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
967
|
+
<hr class="divider">
|
|
968
|
+
|
|
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>
|
|
557
975
|
</div>
|
|
558
|
-
<div class="
|
|
559
|
-
<div class="
|
|
560
|
-
|
|
561
|
-
|
|
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>
|
|
562
1012
|
</div>
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
1013
|
+
</div>
|
|
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>
|
|
567
1024
|
</div>
|
|
568
|
-
<div class="
|
|
569
|
-
<
|
|
570
|
-
|
|
571
|
-
|
|
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>
|
|
572
1098
|
</div>
|
|
573
|
-
<div
|
|
574
|
-
<
|
|
575
|
-
|
|
576
|
-
|
|
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>
|
|
577
1103
|
</div>
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
1104
|
+
</div>
|
|
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>
|
|
582
1115
|
</div>
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
<div class="
|
|
590
|
-
<
|
|
591
|
-
<div class="price">$0 / 1M
|
|
592
|
-
<
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
</
|
|
598
|
-
</div>
|
|
599
|
-
<div class="
|
|
600
|
-
<
|
|
601
|
-
<div class="price">$
|
|
602
|
-
<
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
</
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
<
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
</
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
<
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
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>
|
|
625
1176
|
</div>
|
|
626
1177
|
</div>
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
<
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
<span class="comment"># Start the OpenAI-compatible proxy</span>
|
|
638
|
-
npx a3m-router serve
|
|
639
|
-
<span class="comment"># Now listening on http://localhost:8787/v1</span>
|
|
640
|
-
|
|
641
|
-
<span class="comment"># Or use programmatically</span>
|
|
642
|
-
<span class="keyword">const</span> { <span class="function">createA3MRouter</span> } = <span class="function">require</span>(<span class="string">'adaptive-memory-multi-model-router'</span>);
|
|
643
|
-
<span class="keyword">const</span> router = <span class="function">createA3MRouter</span>();
|
|
644
|
-
<span class="keyword">const</span> result = <span class="keyword">await</span> router.<span class="function">route</span>(<span class="string">"Explain quantum computing"</span>);
|
|
645
|
-
<span class="function">console</span>.<span class="function">log</span>(result.primary_model); <span class="comment">// "groq/llama-3.3-70b" (cheapest capable)</span>
|
|
646
|
-
<span class="function">console</span>.<span class="function">log</span>(result); <span class="comment">// confidence: 0.94, tier: mid</span></pre>
|
|
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>
|
|
647
1188
|
</div>
|
|
648
|
-
</
|
|
1189
|
+
</div>
|
|
1190
|
+
</section>
|
|
1191
|
+
|
|
1192
|
+
<hr class="divider">
|
|
649
1193
|
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
<
|
|
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>
|
|
655
1200
|
</div>
|
|
656
|
-
<div
|
|
657
|
-
<
|
|
658
|
-
|
|
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>
|
|
1240
|
+
</div>
|
|
1241
|
+
</section>
|
|
1242
|
+
|
|
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>
|
|
1260
|
+
</section>
|
|
1261
|
+
|
|
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>
|
|
659
1270
|
</div>
|
|
660
|
-
<div class="
|
|
661
|
-
<
|
|
662
|
-
|
|
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>
|
|
663
1305
|
</div>
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
1306
|
+
</div>
|
|
1307
|
+
</section>
|
|
1308
|
+
|
|
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>
|
|
667
1316
|
</div>
|
|
668
|
-
<div class="faq-
|
|
669
|
-
<
|
|
670
|
-
|
|
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>
|
|
671
1395
|
</div>
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
1396
|
+
</div>
|
|
1397
|
+
</section>
|
|
1398
|
+
|
|
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>
|
|
675
1418
|
</div>
|
|
676
|
-
</
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
<
|
|
684
|
-
|
|
685
|
-
|
|
1419
|
+
</div>
|
|
1420
|
+
</section>
|
|
1421
|
+
|
|
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>
|
|
686
1440
|
</div>
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
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>
|
|
1553
|
+
|
|
690
1554
|
</body>
|
|
691
1555
|
</html>
|