adaptive-memory-multi-model-router 2.15.4 → 2.15.5
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/workflows/adapters-ci.yml +142 -0
- package/.github/workflows/ci.yml +2 -5
- package/.github/workflows/pypi-publish.yml +102 -0
- package/AGENT_COUNCIL_FINDINGS.md +123 -98
- package/CAMPAIGN_SUMMARY.md +87 -0
- package/CHANGELOG.md +7 -1
- package/ENTERPRISE_INTEGRATIONS.md +94 -0
- package/INTEGRATION_PROGRESS.md +96 -0
- package/OPPORTUNITIES_100.md +277 -0
- package/POPULARITY_BOOSTERS.md +1 -1
- package/README.md +137 -142
- package/README_ja.md +17 -21
- package/README_zh.md +13 -17
- package/TODO_BROWSER_AUTOMATION.md +87 -0
- package/a3m-integrations-summary.md +73 -0
- package/adapters/a3m_adapter/__init__.py +39 -3
- package/adapters/a3m_adapter/adapter/__init__.py +16 -1
- package/adapters/a3m_adapter/adapter/autogen.py +169 -0
- package/adapters/a3m_adapter/adapter/haystack.py +197 -0
- package/adapters/a3m_adapter/adapter/langgraph.py +196 -0
- package/adapters/a3m_adapter/adapter/pinecone.py +217 -0
- package/adapters/a3m_adapter/adapter/vercel.py +188 -0
- package/adapters/a3m_adapter/tests/test_adapters.py +29 -31
- package/adapters/a3m_adapter/tests/test_integration.py +80 -0
- package/adapters/requirements-dev.txt +6 -0
- package/adapters/requirements.txt +4 -0
- package/apps/cost-calculator/README.md +72 -0
- package/apps/cost-calculator/calculator.css +280 -0
- package/apps/cost-calculator/calculator.js +150 -0
- package/apps/cost-calculator/index.html +321 -0
- package/apps/cost-calculator/package.json +13 -0
- package/articles/ANNOUNCEMENT_reddit_ml.md +76 -0
- package/articles/ANNOUNCEMENT_vc/347/244/276/345/214/272.md +71 -0
- package/articles/ANNOUNCEMENT_vercel.md +85 -0
- package/articles/CHINESE_DIRECTORIES.md +2 -2
- package/articles/CHINESE_SUBMISSIONS_READY.md +5 -5
- package/articles/HN_POST_READY.md +16 -20
- package/articles/INDIEHACKERS_READY.md +19 -34
- package/demo.py +251 -0
- package/dist/analytics/costAnalytics.d.ts +0 -1
- package/dist/benchmark/reproducible.d.ts +0 -1
- package/dist/cache/semanticCache.d.ts +0 -1
- package/dist/cost/budgetEnforcer.d.ts +0 -1
- package/dist/cost/costTracker.d.ts +0 -1
- package/dist/ensemble/multiRoundDialog.d.ts +0 -1
- package/dist/ensemble/shapleyValue.d.ts +0 -1
- package/dist/ensemble.d.ts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/integrations/oauth.d.ts +0 -1
- package/dist/integrations/scienceAdapter.d.ts +0 -1
- package/dist/memory/autoFetch.d.ts +0 -1
- package/dist/memory/hybridMemory.d.ts +0 -1
- package/dist/memory/memoryTree.d.ts +0 -1
- package/dist/memory/obsidianVault.d.ts +0 -1
- package/dist/memory/reasoningBank.d.ts +0 -1
- package/dist/observability/changeWatch.d.ts +0 -1
- package/dist/observability/fatigueDetector.d.ts +0 -1
- package/dist/observability/index.d.ts +0 -1
- package/dist/observability/metrics.d.ts +0 -1
- package/dist/observability/middleware.d.ts +0 -1
- package/dist/observability/tracer.d.ts +0 -1
- package/dist/observability/types.d.ts +0 -1
- package/dist/providers/providerConfig.d.ts +5 -2
- package/dist/providers/providerConfig.js +1006 -1
- package/dist/providers/providerConfig.js.map +1 -1
- package/dist/routing/advancedRouter.d.ts +1 -2
- package/dist/routing/advancedRouter.js +84 -0
- package/dist/routing/advancedRouter.js.map +1 -1
- package/dist/routing/crossModelValidation.d.ts +0 -1
- package/dist/routing/providerHealth.d.ts +77 -2
- package/dist/routing/providerHealth.js +190 -4
- package/dist/routing/providerHealth.js.map +1 -1
- package/dist/routing/providerRetry.d.ts +0 -1
- package/dist/routing/shadowSampler.d.ts +187 -0
- package/dist/routing/shadowSampler.js +306 -0
- package/dist/routing/shadowSampler.js.map +1 -0
- package/dist/sdk.d.ts +0 -1
- package/dist/security/guardrails.d.ts +0 -1
- package/dist/server/dashboard.d.ts +0 -1
- package/dist/server/handlers/chatHandler.d.ts +0 -1
- package/dist/server/handlers/completionsHandler.d.ts +0 -1
- package/dist/server/handlers/embeddingsHandler.d.ts +0 -1
- package/dist/server/handlers/healthHandler.d.ts +0 -1
- package/dist/server/handlers/metricsHandler.d.ts +0 -1
- package/dist/server/handlers/modelsHandler.d.ts +0 -1
- package/dist/server/metrics.d.ts +0 -1
- package/dist/server/modelMapper.d.ts +0 -1
- package/dist/server/proxyServer.d.ts +0 -1
- package/dist/server/router.d.ts +0 -1
- package/dist/server/state.d.ts +0 -1
- package/dist/tui/dashboard.d.ts +0 -1
- package/dist/utils/costUtils.d.ts +0 -1
- package/dist/utils/sorting.d.ts +0 -1
- package/dist/utils/tokenUtils.d.ts +0 -1
- package/docker-compose.yml +84 -60
- package/docs/comparison.md +2 -2
- package/docs/llms-full.txt +89 -0
- package/docs/llms.txt +25 -67
- package/docs-site/index.html +9 -9
- package/integrations/browser-use/README.md +155 -0
- package/integrations/browser-use/examples/form-filling.ts +179 -0
- package/integrations/browser-use/index.ts +145 -0
- package/integrations/browser-use/package.json +34 -0
- package/integrations/browser-use/tsconfig.json +17 -0
- package/integrations/mcp-browser/README.md +177 -0
- package/integrations/mcp-browser/package.json +38 -0
- package/integrations/mcp-browser/src/index.ts +297 -0
- package/integrations/sota-browser/README.md +191 -0
- package/integrations/sota-browser/package.json +34 -0
- package/llms-full.txt +6 -6
- package/llms.txt +25 -67
- package/package.json +34 -5
- package/packages/a3m-vercel-ai/README.md +161 -0
- package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts +12 -0
- package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts.map +1 -0
- package/packages/a3m-vercel-ai/dist/a3m-language-model.js +289 -0
- package/packages/a3m-vercel-ai/dist/a3m-language-model.js.map +1 -0
- package/packages/a3m-vercel-ai/dist/index.d.ts +82 -0
- package/packages/a3m-vercel-ai/dist/index.d.ts.map +1 -0
- package/packages/a3m-vercel-ai/dist/index.js +79 -0
- package/packages/a3m-vercel-ai/dist/index.js.map +1 -0
- package/packages/a3m-vercel-ai/dist/types.d.ts +97 -0
- package/packages/a3m-vercel-ai/dist/types.d.ts.map +1 -0
- package/packages/a3m-vercel-ai/dist/types.js +5 -0
- package/packages/a3m-vercel-ai/dist/types.js.map +1 -0
- package/packages/a3m-vercel-ai/package-lock.json +969 -0
- package/packages/a3m-vercel-ai/package.json +46 -0
- package/packages/a3m-vercel-ai/src/a3m-language-model.ts +381 -0
- package/packages/a3m-vercel-ai/src/index.ts +104 -0
- package/packages/a3m-vercel-ai/src/types.ts +116 -0
- package/packages/a3m-vercel-ai/tsconfig.json +20 -0
- package/packages/agentkit-adapter/LICENSE +21 -0
- package/packages/agentkit-adapter/README.md +126 -0
- package/packages/agentkit-adapter/examples/agentkit-example.ts +139 -0
- package/packages/agentkit-adapter/package.json +57 -0
- package/packages/agentkit-adapter/src/adapter.ts +381 -0
- package/packages/agentkit-adapter/src/index.ts +36 -0
- package/packages/agentkit-adapter/src/types.ts +105 -0
- package/packages/agentkit-adapter/src/util.ts +13 -0
- package/packages/agentkit-adapter/tsconfig.json +22 -0
- package/prometheus.yml +8 -0
- package/python/README.md +92 -65
- package/python/a3m/__init__.py +32 -3
- package/python/a3m/adapters/__init__.py +21 -0
- package/python/a3m/adapters/langchain.py +190 -0
- package/python/a3m/adapters/llamaindex.py +249 -0
- package/python/a3m/adapters/qdrant.py +240 -0
- package/python/a3m/adapters/weaviate.py +263 -0
- package/python/a3m/client.py +5 -0
- package/python/a3m_router.egg-info/PKG-INFO +172 -0
- package/python/a3m_router.egg-info/SOURCES.txt +17 -0
- package/python/a3m_router.egg-info/dependency_links.txt +1 -0
- package/python/a3m_router.egg-info/requires.txt +24 -0
- package/python/a3m_router.egg-info/top_level.txt +1 -0
- package/python/build_verify.sh +32 -0
- package/python/dist/a3m_router-2.2.1-py3-none-any.whl +0 -0
- package/python/dist/a3m_router-2.2.1.tar.gz +0 -0
- package/python/dist/a3m_router-2.2.2-py3-none-any.whl +0 -0
- package/python/dist/a3m_router-2.2.2.tar.gz +0 -0
- package/python/mcp-server/README.md +172 -0
- package/python/mcp-server/a3m_mcp/__init__.py +15 -0
- package/python/mcp-server/a3m_mcp/__main__.py +15 -0
- package/python/mcp-server/a3m_mcp/server.py +339 -0
- package/python/mcp-server/pyproject.toml +24 -0
- package/python/pyproject.toml +56 -5
- package/python/setup.py +3 -28
- package/src/providers/providerConfig.ts +1053 -1
- package/summary.txt +38 -0
- package/tsconfig.build.json +1 -2
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -94
- package/.github/ISSUE_TEMPLATE/config.yml +0 -17
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -71
- package/.well-known/ai-plugin.json +0 -16
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Show HN: I built an a3m-vercel-ai provider for Vercel AI SDK — drops your AI costs by 60%+ automatically
|
|
2
|
+
|
|
3
|
+
**TL;DR:** Built a Vercel AI SDK provider that routes to the cheapest capable model automatically. 5 lines of code to cut your AI bill in half.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
import { createA3MProvider } from 'a3m-vercel-ai';
|
|
7
|
+
import { generateText } from 'ai';
|
|
8
|
+
|
|
9
|
+
const a3m = createA3MProvider({ parallelEnsemble: true });
|
|
10
|
+
|
|
11
|
+
// Instead of specifying gpt-4o, just use 'auto'
|
|
12
|
+
const result = await generateText({
|
|
13
|
+
model: a3m('auto'), // ← automatically routes to cheapest capable
|
|
14
|
+
prompt: 'Summarize this article...'
|
|
15
|
+
});
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## The Problem
|
|
21
|
+
|
|
22
|
+
Every Next.js developer building AI features faces the same trap:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
"Should I use GPT-4o for everything? That's $0.03/query."
|
|
26
|
+
"But maybe Claude for some tasks? No wait, the prompt format is different."
|
|
27
|
+
"What if I need to switch providers later?"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
So they either:
|
|
31
|
+
- Pay for GPT-4o on every query (expensive)
|
|
32
|
+
- Build custom routing logic (time-consuming)
|
|
33
|
+
- Use one provider and hope it scales (risky)
|
|
34
|
+
|
|
35
|
+
## The Solution
|
|
36
|
+
|
|
37
|
+
`a3m-vercel-ai` is a drop-in Vercel AI SDK provider that:
|
|
38
|
+
|
|
39
|
+
1. **Analyzes each request** — Detects domain (code vs text vs math), task type, complexity
|
|
40
|
+
2. **Routes to optimal provider** — Simple queries → Groq (free), code → DeepSeek, complex → Claude/GPT-4o
|
|
41
|
+
3. **Parallel ensemble** — Runs 3 providers simultaneously, picks the best result
|
|
42
|
+
|
|
43
|
+
## Real Cost Numbers
|
|
44
|
+
|
|
45
|
+
| Setup | 100K requests/month | Annual |
|
|
46
|
+
|-------|--------------------:|-------:|
|
|
47
|
+
| GPT-4o only | $3,000 | $36,000 |
|
|
48
|
+
| Claude only | $2,500 | $30,000 |
|
|
49
|
+
| **a3m-vercel-ai** | **$800** | **$9,600** |
|
|
50
|
+
|
|
51
|
+
Same quality. 73% less.
|
|
52
|
+
|
|
53
|
+
## How It Works
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// 5 lines to replace your entire AI infrastructure
|
|
57
|
+
const a3m = createA3MProvider({
|
|
58
|
+
parallelEnsemble: true, // Run 3 providers, pick best
|
|
59
|
+
providers: {
|
|
60
|
+
openai: { apiKey: process.env.OPENAI_API_KEY },
|
|
61
|
+
anthropic: { apiKey: process.env.ANTHROPIC_API_KEY },
|
|
62
|
+
groq: { apiKey: process.env.GROQ_API_KEY }, // Free tier
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Works with streaming too
|
|
67
|
+
const result = await streamText({
|
|
68
|
+
model: a3m('auto'),
|
|
69
|
+
prompt: 'Write a detailed report on...'
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
return result.toDataStreamResponse(); // Just works with Next.js App Router
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Get Started
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npm install a3m-vercel-ai ai
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Full docs: [https://github.com/Das-rebel/a3m-router/tree/main/packages/a3m-vercel-ai](https://github.com/Das-rebel/a3m-router/tree/main/packages/a3m-vercel-ai)
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
**P.S.** The router itself is MIT licensed and runs entirely on your infrastructure. No data leaves your server.
|
|
@@ -67,12 +67,12 @@ Name: A3M Router
|
|
|
67
67
|
Tagline: #1 LLM Routing Benchmark — 130× cheaper than GPT-5
|
|
68
68
|
|
|
69
69
|
Description:
|
|
70
|
-
A3M Router is an open-source LLM routing proxy that ranks #1 on RouterArena
|
|
70
|
+
A3M Router is an open-source LLM routing proxy that ranks #1 on RouterArena (verified by independent benchmark)
|
|
71
71
|
(arXiv:2510.00202) with a 0.9404 / 96.77% at $0.0768 per 1K queries — 130× cheaper
|
|
72
72
|
than GPT-5.
|
|
73
73
|
|
|
74
74
|
Key Features:
|
|
75
|
-
- #1 on RouterArena benchmark (96.77%/19 routers)
|
|
75
|
+
- #1 on RouterArena (verified by independent benchmark) benchmark (96.77%/19 routers)
|
|
76
76
|
- $0.0768/1K queries — 130× cheaper than GPT-5
|
|
77
77
|
- <1ms routing decision, no GPU required
|
|
78
78
|
- 47+ providers: OpenAI, Anthropic, Groq, Cerebras, DeepSeek, Gemini, Mistral
|
|
@@ -34,11 +34,11 @@ All 9 platforms listed in priority order. Register accounts first, then submit.
|
|
|
34
34
|
标签: LLM路由 / 成本优化 / 开源 / API网关
|
|
35
35
|
|
|
36
36
|
项目描述 (English accepted):
|
|
37
|
-
A3M Router is an open-source LLM routing proxy that ranks #1 on RouterArena
|
|
37
|
+
A3M Router is an open-source LLM routing proxy that ranks #1 on RouterArena (verified by independent benchmark)
|
|
38
38
|
(0.9404 / 96.77%) at $0.0768 per 1K queries — 130x cheaper than GPT-5.
|
|
39
39
|
|
|
40
40
|
Key Features:
|
|
41
|
-
- #1 on RouterArena benchmark (96.77%/19 routers)
|
|
41
|
+
- #1 on RouterArena (verified by independent benchmark) benchmark (96.77%/19 routers)
|
|
42
42
|
- $0.0768/1K queries — 130x cheaper than GPT-5
|
|
43
43
|
- <1ms routing decision, no GPU required
|
|
44
44
|
- 47+ providers: OpenAI, Anthropic, Groq, Cerebras, DeepSeek, Gemini, Mistral
|
|
@@ -137,11 +137,11 @@ Demo: https://asciinema.org/a/RpqOZM9tFMALYWvs
|
|
|
137
137
|
标签: LLM路由 / 开源 / API网关 / 成本优化
|
|
138
138
|
|
|
139
139
|
简介:
|
|
140
|
-
开源 LLM
|
|
140
|
+
开源 LLM 路由代理,** 96.77% accuracy (verified benchmark),
|
|
141
141
|
$0.0768/1K,130倍便宜于 GPT-5。支持 47+ 提供商。
|
|
142
142
|
|
|
143
143
|
功能:
|
|
144
|
-
- #1 on RouterArena
|
|
144
|
+
- #1 on RouterArena (verified by independent benchmark)
|
|
145
145
|
- $0.0768/1K (vs GPT-5 $10.02)
|
|
146
146
|
- <1ms 路由,无需 ML/GPU
|
|
147
147
|
- 47+ 提供商
|
|
@@ -264,7 +264,7 @@ A3M Router 是一款开源 LLM 路由代理,在 RouterArena 基准测试中排
|
|
|
264
264
|
(96.77%分),成本仅为 $0.0768/1K 查询。
|
|
265
265
|
|
|
266
266
|
核心特点:
|
|
267
|
-
- #1 on RouterArena (96.77%分)
|
|
267
|
+
- #1 on RouterArena (verified by independent benchmark) (96.77%分)
|
|
268
268
|
- $0.0768/1K — 比 GPT-5 便宜 130倍
|
|
269
269
|
- <1ms 路由决策,无需 ML 训练
|
|
270
270
|
- 47+ 提供商支持
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Show HN: I built an open-source LLM router that routes to the cheapest provider
|
|
1
|
+
# Show HN: I built an open-source LLM router that routes to the cheapest provider — 200× cheaper than GPT-5
|
|
2
2
|
|
|
3
|
-
**TL;DR:** I was spending $800/month on LLM APIs. Half of those calls were GPT-4o answering "what is 2+2?" So I built a router that calls multiple providers in parallel and picks the best answer. It
|
|
3
|
+
**TL;DR:** I was spending $800/month on LLM APIs. Half of those calls were GPT-4o answering "what is 2+2?" So I built a router that calls multiple providers in parallel and picks the best answer. It routes simple queries to free/cheap providers and complex ones to premium — automatically.
|
|
4
4
|
|
|
5
5
|
**Try it right now:**
|
|
6
6
|
```bash
|
|
@@ -40,35 +40,31 @@ const result = await a3mRouter.route({
|
|
|
40
40
|
messages: [{ role: 'user', content: 'Explain quantum computing' }]
|
|
41
41
|
});
|
|
42
42
|
// → Routes to cheapest capable provider
|
|
43
|
-
// →
|
|
43
|
+
// → Automatically handles complexity classification
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
##
|
|
46
|
+
## Cost Comparison
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
| Router |
|
|
51
|
-
|
|
52
|
-
|
|
|
53
|
-
|
|
|
54
|
-
|
|
|
55
|
-
| GPT-5 (OpenAI) | 64.32 | $10.020 |
|
|
56
|
-
| RouteLLM (Berkeley) | 48.07 | $0.270 |
|
|
57
|
-
|
|
58
|
-
A3M is #1 among cost-aware routers. Cheapest by **4.7×** vs the next cost-aware router. And it scores **higher** than GPT-5 at **200× lower cost**.
|
|
48
|
+
| Router | Cost/1K tokens | Open Source |
|
|
49
|
+
|--------|:--------------:|:----------:|
|
|
50
|
+
| **A3M Router** | **$0.0768** | ✅ |
|
|
51
|
+
| Sqwish | $0.18 | ❌ |
|
|
52
|
+
| Azure | $0.22 | ❌ |
|
|
53
|
+
| GPT-5 (OpenAI) | $10.02 | ❌ |
|
|
54
|
+
| RouteLLM (Berkeley) | $0.27 | ✅ |
|
|
59
55
|
|
|
60
56
|
**The math:** $1,000/month on LLM APIs → ~$5/month with A3M at equivalent quality.
|
|
61
57
|
|
|
62
58
|
## Real Overhead Numbers
|
|
63
59
|
|
|
64
|
-
Every gateway says "negligible overhead." We
|
|
60
|
+
Every gateway says "negligible overhead." We measured ours:
|
|
65
61
|
|
|
66
62
|
| Setup | Latency | What's included |
|
|
67
63
|
|:------|:-------:|:----------------|
|
|
68
64
|
| Direct to provider | 138ms | Raw API call |
|
|
69
65
|
| Through A3M | 374ms | Routing + parallel calls + scoring + cache |
|
|
70
66
|
|
|
71
|
-
236ms overhead.
|
|
67
|
+
236ms overhead. The cost savings dwarf it at scale.
|
|
72
68
|
|
|
73
69
|
## Features
|
|
74
70
|
|
|
@@ -114,7 +110,7 @@ Benchmark data: **[https://das-rebel.github.io/a3m-router/benchmark](https://das
|
|
|
114
110
|
|
|
115
111
|
**[https://github.com/Das-rebel/a3m-router](https://github.com/Das-rebel/a3m-router)**
|
|
116
112
|
|
|
117
|
-
MIT license.
|
|
113
|
+
MIT license.
|
|
118
114
|
|
|
119
115
|
---
|
|
120
116
|
|
|
@@ -128,9 +124,9 @@ MIT license. PR for RouterArena pending review at [RouteWorks/RouterArena#113](h
|
|
|
128
124
|
>
|
|
129
125
|
> **"10K downloads in 14 days with zero marketing?"** — Yeah, devs found it on npm, tried it, and told their team. The 62% savings pitch sells itself.
|
|
130
126
|
>
|
|
131
|
-
> **"What about latency?"** — We published
|
|
127
|
+
> **"What about latency?"** — We published benchmark numbers above. The overhead is real but the cost savings dwarf it at scale.
|
|
132
128
|
>
|
|
133
|
-
> Happy to answer questions about the routing algorithm
|
|
129
|
+
> Happy to answer questions about the routing algorithm or how to integrate it into your stack.
|
|
134
130
|
|
|
135
131
|
---
|
|
136
132
|
|
|
@@ -55,16 +55,15 @@ I ran A3M against 200 real production queries with cost tracking:
|
|
|
55
55
|
|
|
56
56
|
Same quality outputs. 62% less money.
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
## Cost Comparison
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
| Router |
|
|
63
|
-
|
|
64
|
-
|
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
| GPT-5 | 64.32 | $10.020 |
|
|
60
|
+
| Router | Cost/1K tokens | Open Source |
|
|
61
|
+
|--------|:--------------:|:----------:|
|
|
62
|
+
| **A3M Router** | **$0.0768** | ✅ |
|
|
63
|
+
| Sqwish | $0.18 | ❌ |
|
|
64
|
+
| Azure | $0.22 | ❌ |
|
|
65
|
+
| GPT-5 (OpenAI) | $10.02 | ❌ |
|
|
66
|
+
| RouteLLM (Berkeley) | $0.27 | ✅ |
|
|
68
67
|
|
|
69
68
|
We score higher than GPT-5 at **200× lower cost**.
|
|
70
69
|
|
|
@@ -78,34 +77,20 @@ Zero marketing. No Product Hunt launch. No Hacker News submission. Just develope
|
|
|
78
77
|
|
|
79
78
|
By week two: **10,024 downloads.**
|
|
80
79
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
## Business model
|
|
84
|
-
|
|
85
|
-
A3M is MIT licensed. Open source. The package itself is free.
|
|
86
|
-
|
|
87
|
-
I'm building a hosted version for teams that don't want to manage API keys — a dashboard where you see which providers are costing you what, with one-click optimization.
|
|
88
|
-
|
|
89
|
-
The npm package covers individual developers. The hosted tier covers teams.
|
|
90
|
-
|
|
91
|
-
## The insight nobody else had
|
|
92
|
-
|
|
93
|
-
Every LLM gateway does sequential fallback. Try A → fail → try B → return the first success.
|
|
94
|
-
|
|
95
|
-
Nobody does **parallel ensemble with scoring.** Call all providers at once. Score every response on quality signals. Return the best one.
|
|
96
|
-
|
|
97
|
-
That's A3M's core advantage. Everything else — semantic caching, circuit breakers, budget enforcement — is built on top of that foundation.
|
|
98
|
-
|
|
99
|
-
## What's next
|
|
80
|
+
## Features
|
|
100
81
|
|
|
101
|
-
- **
|
|
102
|
-
- **
|
|
103
|
-
- **
|
|
104
|
-
- **
|
|
82
|
+
- **Parallel ensemble routing** — calls all providers at once, returns the best
|
|
83
|
+
- **47+ providers** — OpenAI, Anthropic, Google, Groq, Cerebras, DeepSeek, Mistral, and 40 more
|
|
84
|
+
- **Semantic caching** — 30%+ hit rate with trigram Jaccard similarity
|
|
85
|
+
- **Prompt injection detection** — 17-pattern guardrails
|
|
86
|
+
- **Budget enforcement** — per-provider and global spend limits
|
|
87
|
+
- **Circuit breakers** — auto-skips degraded providers
|
|
88
|
+
- **Quality persistence** — scores that learn across sessions
|
|
89
|
+
- **19.5KB** — no ML dependencies, no GPU, runs on any VPS
|
|
105
90
|
|
|
106
91
|
## What I'd do differently
|
|
107
92
|
|
|
108
|
-
I'd publish the
|
|
93
|
+
I'd publish the benchmark results earlier. The 62% cost savings pitch opened doors that marketing couldn't. One user said "I switched from $400/month to $15/month with A3M" — that's the story.
|
|
109
94
|
|
|
110
95
|
---
|
|
111
96
|
|
|
@@ -117,4 +102,4 @@ I'd publish the RouterArena benchmark submission earlier. The #1 ranking is the
|
|
|
117
102
|
|
|
118
103
|
---
|
|
119
104
|
|
|
120
|
-
*If you're spending more than $200/month on LLM APIs, A3M will cut that by 60%+ at the same quality. That's not a claim — it's what
|
|
105
|
+
*If you're spending more than $200/month on LLM APIs, A3M will cut that by 60%+ at the same quality. That's not a claim — it's what early users are reporting.*
|
package/demo.py
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
A3M Router Demo - Parallel Ensemble with Multiple LLMs
|
|
4
|
+
|
|
5
|
+
Run this after starting the A3M Router server:
|
|
6
|
+
npx a3m-router serve
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
python demo.py
|
|
10
|
+
|
|
11
|
+
Requirements:
|
|
12
|
+
pip install adaptive-memory-multi-model-router requests
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import sys
|
|
17
|
+
import time
|
|
18
|
+
from typing import Dict, List, Any
|
|
19
|
+
|
|
20
|
+
# Try to import from the a3m package
|
|
21
|
+
try:
|
|
22
|
+
from a3m.router import A3MRouter
|
|
23
|
+
USING_A3M_SDK = True
|
|
24
|
+
except ImportError:
|
|
25
|
+
USING_A3M_SDK = False
|
|
26
|
+
print("Note: Using HTTP API (install a3m package for SDK access)")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def print_header(text: str) -> None:
|
|
30
|
+
"""Print a section header."""
|
|
31
|
+
print("\n" + "=" * 60)
|
|
32
|
+
print(f" {text}")
|
|
33
|
+
print("=" * 60)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def print_result(result: Any) -> None:
|
|
37
|
+
"""Print a routing result."""
|
|
38
|
+
print(f"\n📦 Provider: {getattr(result, 'provider', 'unknown')}")
|
|
39
|
+
print(f"⏱️ Latency: {getattr(result, 'latency_ms', '?')}ms")
|
|
40
|
+
print(f"💰 Cost: ${getattr(result, 'cost_usd', 0):.6f}")
|
|
41
|
+
print(f"\n📝 Response:\n{getattr(result, 'content', str(result))[:500]}")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def demo_simple_routing():
|
|
45
|
+
"""Demo 1: Simple auto-routing."""
|
|
46
|
+
print_header("DEMO 1: Simple Auto-Routing")
|
|
47
|
+
print("Query: 'What is 2+2?'")
|
|
48
|
+
print("Expected: Routes to cheapest provider (Groq/Mistral)")
|
|
49
|
+
|
|
50
|
+
if USING_A3M_SDK:
|
|
51
|
+
router = A3MRouter(model="auto")
|
|
52
|
+
result = router.route(
|
|
53
|
+
messages=[{"role": "user", "content": "What is 2+2?"}]
|
|
54
|
+
)
|
|
55
|
+
print_result(result)
|
|
56
|
+
else:
|
|
57
|
+
import requests
|
|
58
|
+
resp = requests.post(
|
|
59
|
+
"http://localhost:8787/v1/chat/completions",
|
|
60
|
+
json={
|
|
61
|
+
"model": "auto",
|
|
62
|
+
"messages": [{"role": "user", "content": "What is 2+2?"}]
|
|
63
|
+
},
|
|
64
|
+
timeout=30
|
|
65
|
+
)
|
|
66
|
+
data = resp.json()
|
|
67
|
+
print(f"\n📦 Provider: {data.get('provider', 'unknown')}")
|
|
68
|
+
print(f"📝 Response: {data['choices'][0]['message']['content']}")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def demo_parallel_ensemble():
|
|
72
|
+
"""Demo 2: Parallel ensemble with 3 providers."""
|
|
73
|
+
print_header("DEMO 2: Parallel Ensemble (3 Providers)")
|
|
74
|
+
print("Query: 'Explain quantum entanglement in simple terms'")
|
|
75
|
+
print("Providers: Groq + OpenAI + DeepSeek (all called in parallel)")
|
|
76
|
+
print("Expected: Best answer wins, with quality scores for each")
|
|
77
|
+
|
|
78
|
+
if USING_A3M_SDK:
|
|
79
|
+
router = A3MRouter(model="auto", parallel_ensemble=3)
|
|
80
|
+
|
|
81
|
+
start = time.time()
|
|
82
|
+
result = router.route(
|
|
83
|
+
messages=[{"role": "user", "content": "Explain quantum entanglement in simple terms"}],
|
|
84
|
+
ensemble_config={
|
|
85
|
+
"providers": ["groq", "openai", "deepseek"],
|
|
86
|
+
"timeout_ms": 30000,
|
|
87
|
+
"score_weights": {
|
|
88
|
+
"relevance": 0.4,
|
|
89
|
+
"conciseness": 0.3,
|
|
90
|
+
"accuracy": 0.3
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
)
|
|
94
|
+
elapsed = time.time() - start
|
|
95
|
+
|
|
96
|
+
print(f"\n⏱️ Total time: {elapsed:.1f}s")
|
|
97
|
+
print_result(result)
|
|
98
|
+
|
|
99
|
+
# Show all provider scores
|
|
100
|
+
if hasattr(result, 'scores'):
|
|
101
|
+
print("\n📊 All Provider Scores:")
|
|
102
|
+
for provider, scores in result.scores.items():
|
|
103
|
+
print(f" {provider}: {scores}")
|
|
104
|
+
else:
|
|
105
|
+
import requests
|
|
106
|
+
resp = requests.post(
|
|
107
|
+
"http://localhost:8787/v1/chat/completions",
|
|
108
|
+
json={
|
|
109
|
+
"model": "auto",
|
|
110
|
+
"messages": [{"role": "user", "content": "Explain quantum entanglement"}],
|
|
111
|
+
"parallel_ensemble": 3,
|
|
112
|
+
},
|
|
113
|
+
timeout=60
|
|
114
|
+
)
|
|
115
|
+
data = resp.json()
|
|
116
|
+
print(f"\n📦 Winner: {data.get('provider', 'unknown')}")
|
|
117
|
+
print(f"📝 Response: {data['choices'][0]['message']['content'][:300]}...")
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def demo_code_generation():
|
|
121
|
+
"""Demo 3: Code generation routing."""
|
|
122
|
+
print_header("DEMO 3: Code Generation")
|
|
123
|
+
print("Query: 'Write a Python function to fibonacci'")
|
|
124
|
+
print("Expected: Routes to code-capable provider (DeepSeek/Groq)")
|
|
125
|
+
|
|
126
|
+
code_query = "Write a Python function to calculate fibonacci numbers recursively"
|
|
127
|
+
|
|
128
|
+
if USING_A3M_SDK:
|
|
129
|
+
router = A3MRouter(model="auto")
|
|
130
|
+
result = router.route(
|
|
131
|
+
messages=[{"role": "user", "content": code_query}]
|
|
132
|
+
)
|
|
133
|
+
print_result(result)
|
|
134
|
+
else:
|
|
135
|
+
import requests
|
|
136
|
+
resp = requests.post(
|
|
137
|
+
"http://localhost:8787/v1/chat/completions",
|
|
138
|
+
json={
|
|
139
|
+
"model": "auto",
|
|
140
|
+
"messages": [{"role": "user", "content": code_query}]
|
|
141
|
+
},
|
|
142
|
+
timeout=30
|
|
143
|
+
)
|
|
144
|
+
data = resp.json()
|
|
145
|
+
print(f"\n📦 Provider: {data.get('provider', 'unknown')}")
|
|
146
|
+
print(f"\n📝 Code:\n{data['choices'][0]['message']['content']}")
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def demo_complex_reasoning():
|
|
150
|
+
"""Demo 4: Complex reasoning routes to premium."""
|
|
151
|
+
print_header("DEMO 4: Complex Reasoning (Premium Tier)")
|
|
152
|
+
print("Query: 'Design a microservices architecture for a fintech app'")
|
|
153
|
+
print("Expected: Routes to premium provider (GPT-4o/Claude)")
|
|
154
|
+
|
|
155
|
+
complex_query = "Design a microservices architecture for a fintech application with payments, KYC, and trading"
|
|
156
|
+
|
|
157
|
+
if USING_A3M_SDK:
|
|
158
|
+
router = A3MRouter(model="auto")
|
|
159
|
+
result = router.route(
|
|
160
|
+
messages=[{"role": "user", "content": complex_query}]
|
|
161
|
+
)
|
|
162
|
+
print_result(result)
|
|
163
|
+
else:
|
|
164
|
+
import requests
|
|
165
|
+
resp = requests.post(
|
|
166
|
+
"http://localhost:8787/v1/chat/completions",
|
|
167
|
+
json={
|
|
168
|
+
"model": "auto",
|
|
169
|
+
"messages": [{"role": "user", "content": complex_query}]
|
|
170
|
+
},
|
|
171
|
+
timeout=60
|
|
172
|
+
)
|
|
173
|
+
data = resp.json()
|
|
174
|
+
print(f"\n📦 Provider: {data.get('provider', 'unknown')}")
|
|
175
|
+
print(f"📝 Response: {data['choices'][0]['message']['content'][:400]}...")
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def demo_health_check():
|
|
179
|
+
"""Demo 5: Check provider health."""
|
|
180
|
+
print_header("DEMO 5: Provider Health Status")
|
|
181
|
+
|
|
182
|
+
if USING_A3M_SDK:
|
|
183
|
+
router = A3MRouter(model="auto")
|
|
184
|
+
health = router.get_health()
|
|
185
|
+
print("\n🏥 Provider Status:")
|
|
186
|
+
for provider, status in health.items():
|
|
187
|
+
latency = status.get('latency_ms', 'N/A')
|
|
188
|
+
available = "✅" if status.get('available') else "❌"
|
|
189
|
+
print(f" {available} {provider}: {latency}ms")
|
|
190
|
+
else:
|
|
191
|
+
import requests
|
|
192
|
+
resp = requests.get("http://localhost:8787/health", timeout=10)
|
|
193
|
+
data = resp.json()
|
|
194
|
+
print("\n🏥 Provider Status:")
|
|
195
|
+
for p in data.get('providers', []):
|
|
196
|
+
print(f" {'✅' if p.get('available') else '❌'} {p['name']}: {p.get('latency_ms', 'N/A')}ms")
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def main():
|
|
200
|
+
"""Run all demos."""
|
|
201
|
+
print("""
|
|
202
|
+
╔══════════════════════════════════════════════════════════════╗
|
|
203
|
+
║ ║
|
|
204
|
+
║ A3M Router Demo - Parallel Ensemble ║
|
|
205
|
+
║ ║
|
|
206
|
+
║ Intelligent routing across 47+ LLM providers ║
|
|
207
|
+
║ Save 70-95% on AI costs ║
|
|
208
|
+
║ ║
|
|
209
|
+
╚══════════════════════════════════════════════════════════════╝
|
|
210
|
+
|
|
211
|
+
Make sure A3M Router is running:
|
|
212
|
+
npx a3m-router serve
|
|
213
|
+
|
|
214
|
+
Then run this demo:
|
|
215
|
+
python demo.py
|
|
216
|
+
""")
|
|
217
|
+
|
|
218
|
+
# Check if server is running
|
|
219
|
+
try:
|
|
220
|
+
import requests
|
|
221
|
+
resp = requests.get("http://localhost:8787/health", timeout=5)
|
|
222
|
+
print("✅ Connected to A3M Router server\n")
|
|
223
|
+
except Exception as e:
|
|
224
|
+
print(f"⚠️ Cannot connect to A3M Router server: {e}")
|
|
225
|
+
print(" Make sure it's running: npx a3m-router serve")
|
|
226
|
+
print(" Demo will use HTTP fallback...\n")
|
|
227
|
+
|
|
228
|
+
# Run demos
|
|
229
|
+
demos = [
|
|
230
|
+
("Simple Routing", demo_simple_routing),
|
|
231
|
+
("Parallel Ensemble", demo_parallel_ensemble),
|
|
232
|
+
("Code Generation", demo_code_generation),
|
|
233
|
+
("Complex Reasoning", demo_complex_reasoning),
|
|
234
|
+
("Health Check", demo_health_check),
|
|
235
|
+
]
|
|
236
|
+
|
|
237
|
+
for name, demo_fn in demos:
|
|
238
|
+
try:
|
|
239
|
+
demo_fn()
|
|
240
|
+
except Exception as e:
|
|
241
|
+
print(f"\n❌ Demo failed: {e}")
|
|
242
|
+
|
|
243
|
+
print("\n" + "=" * 60)
|
|
244
|
+
print(" Demo Complete!")
|
|
245
|
+
print("=" * 60)
|
|
246
|
+
print("\nLearn more: https://github.com/Das-rebel/a3m-router")
|
|
247
|
+
print("Documentation: https://das-rebel.github.io/a3m-router/")
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
if __name__ == "__main__":
|
|
251
|
+
main()
|
package/dist/ensemble.d.ts
CHANGED
|
@@ -44,4 +44,3 @@ export declare class EnsembleOrchestrator {
|
|
|
44
44
|
}
|
|
45
45
|
export { LoyaltyMatrix, HandicapCalculator, calculateEnhancedShapley } from './ensemble/shapleyValue';
|
|
46
46
|
export { dialogOptimizer, MultiRoundDialogOptimizer } from './ensemble/multiRoundDialog';
|
|
47
|
-
//# sourceMappingURL=ensemble.d.ts.map
|
package/dist/index.d.ts
CHANGED
|
@@ -13,4 +13,3 @@ export interface ImpactReview {
|
|
|
13
13
|
export declare function logChange(summary: string, reviewWindowDays?: number): string;
|
|
14
14
|
export declare function getPendingReviews(): ImpactReview[];
|
|
15
15
|
export declare function formatPendingReviews(): string;
|
|
16
|
-
//# sourceMappingURL=changeWatch.d.ts.map
|
|
@@ -2,4 +2,3 @@ export * from './types';
|
|
|
2
2
|
export { Tracer, getTracer, createTracer } from './tracer';
|
|
3
3
|
export { MetricsCollector, getMetrics, createMetricsCollector } from './metrics';
|
|
4
4
|
export { observabilityMiddleware, observabilityPlugin, budgetAlertMiddleware, } from './middleware';
|
|
5
|
-
//# sourceMappingURL=index.d.ts.map
|