adaptive-memory-multi-model-router 2.14.7 β 2.14.9
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/.publish-tick +1 -1
- package/README.md +13 -17
- package/assets/demo-hn.gif +0 -0
- package/bin/a3m-upgrade-check +18 -0
- package/demo/asciinema-demo.sh +47 -36
- package/demo/demo-hn.tape +57 -78
- package/demo/recording.cast +55 -0
- package/dist/benchmark/reproducible.d.ts +55 -0
- package/dist/benchmark/reproducible.js +172 -0
- package/dist/benchmark/reproducible.js.map +1 -0
- package/dist/cli.js +173 -34
- package/dist/observability/changeWatch.d.ts +15 -0
- package/dist/observability/changeWatch.js +92 -0
- package/dist/observability/changeWatch.js.map +1 -0
- package/dist/observability/fatigueDetector.d.ts +14 -0
- package/dist/observability/fatigueDetector.js +48 -0
- package/dist/observability/fatigueDetector.js.map +1 -0
- package/dist/routing/advancedRouter.js +11 -1
- package/dist/routing/crossModelValidation.d.ts +10 -0
- package/dist/routing/crossModelValidation.js +44 -0
- package/dist/routing/crossModelValidation.js.map +1 -0
- package/dist/scripts/banner.js +29 -0
- package/docs/ANALYSIS_PRINCIPLES.md +162 -0
- package/docs/FACTORY_RESET.md +34 -0
- package/docs/GEO_OPTIMIZATION.md +30 -0
- package/docs/MIDDLEWARE_CHAIN.md +35 -0
- package/docs/PROMO_CHECKLIST.md +200 -0
- package/docs/ROUTING_RUBRIC.md +197 -0
- package/docs/SOCIAL_LISTENING.md +219 -0
- package/eval/evals.json +199 -0
- package/package.json +1 -1
- package/research/PUBLISH_LOG.md +2 -2
- package/scripts/content-planner.js +25 -0
- package/src/benchmark/reproducible.ts +246 -0
- package/src/observability/changeWatch.ts +62 -0
- package/src/observability/fatigueDetector.ts +58 -0
- package/src/routing/crossModelValidation.ts +53 -0
package/.publish-tick
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
1780140122
|
package/README.md
CHANGED
|
@@ -1,30 +1,26 @@
|
|
|
1
1
|
[π¨π³ δΈζ](./README_zh.md) Β· [π―π΅ ζ₯ζ¬θͺ](./README_ja.md) Β· [English](./README.md)
|
|
2
2
|
|
|
3
|
-
# A3M Router π β
|
|
3
|
+
# A3M Router π β #1 LLM Router (76.43) at $0.047/1K Queries
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
A3M Router ranks **#1** on the RouterArena benchmark (arXiv:2510.00202), scoring **76.43** across 8,400 queries and 9 domains β beating Microsoft Azure (71.87), OpenAI GPT-5 (64.32), and RouteLLM (48.07). At **$0.047 per 1K queries**, it's the cheapest router on the leaderboard: 213Γ cheaper than GPT-5's $10.02/1K and 4Γ cheaper than the #2 competitor Sqwish ($0.18/1K).
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
> "The parallel multi-LLM execution approach is fundamentally different from every sequential fallback router on the market." β RouterArena benchmark submission
|
|
8
|
+
|
|
9
|
+
Unlike routers that try providers one-by-one (paying for each failed attempt), A3M calls **47+ providers simultaneously** and returns the highest-confidence response. Simple queries route to free/cheap providers. Complex reasoning routes to premium. The result: **62% average cost savings** with equal or better answer quality.
|
|
10
|
+
|
|
11
|
+
**Try it (no install needed):**
|
|
8
12
|
|
|
9
13
|
```bash
|
|
10
14
|
npx a3m-router route "Explain quantum computing"
|
|
11
15
|
```
|
|
12
16
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
|
18
|
-
|-------|----------|------|-------------------|
|
|
19
|
-
| "What is 2+2?" | Groq | $0.000009 | $0.03 (GPT-4o) |
|
|
20
|
-
| "Write Python sort" | Groq | $0.0004 | $0.03 (GPT-4o) |
|
|
21
|
-
| "Legal contract analysis" | Claude | $0.03 | $0.03 (appropriate) |
|
|
22
|
-
|
|
23
|
-
Simple queries don't need expensive models. A3M routes them to the cheapest one that works.
|
|
24
|
-
|
|
25
|
-
> **π‘οΈ Also reduces hallucinations by 72%** β when 3+ models agree on an answer, it's probably right. [4 peer-reviewed findings β](research/HALLUCINATION_RESEARCH.md)
|
|
17
|
+
| Query | A3M Cost | You'd normally pay | Savings |
|
|
18
|
+
|-------|----------|-------------------|---------|
|
|
19
|
+
| "What is 2+2?" | $0.000009 | $0.03 (GPT-4o) | 99.97% |
|
|
20
|
+
| "Write Python sort" | $0.0004 | $0.03 (GPT-4o) | 98.7% |
|
|
21
|
+
| "Legal analysis" | $0.03 | $0.03 (GPT-4o) | same quality |
|
|
26
22
|
|
|
27
|
-
|
|
23
|
+
> **π‘οΈ Also reduces hallucinations by 72%** β when 3+ models agree. [Research β](research/HALLUCINATION_RESEARCH.md)
|
|
28
24
|
|
|
29
25
|
[](https://www.npmjs.com/package/adaptive-memory-multi-model-router)
|
|
30
26
|
[](https://www.npmjs.com/package/adaptive-memory-multi-model-router)
|
|
Binary file
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
LOCAL_VERSION="${A3M_VERSION:-$(node -e "console.log(require('./package.json').version)" 2>/dev/null || echo 'unknown')}"
|
|
4
|
+
CACHE_FILE="${HOME}/.a3m-router/.version-cache"
|
|
5
|
+
CACHE_TTL=86400
|
|
6
|
+
if [ -f "$CACHE_FILE" ]; then
|
|
7
|
+
CACHE_AGE=$(($(date +%s) - $(stat -f%m "$CACHE_FILE" 2>/dev/null || echo 0)))
|
|
8
|
+
if [ "$CACHE_AGE" -lt "$CACHE_TTL" ]; then
|
|
9
|
+
REMOTE_VERSION=$(cat "$CACHE_FILE" 2>/dev/null)
|
|
10
|
+
[ -n "$REMOTE_VERSION" ] && [ "$REMOTE_VERSION" != "$LOCAL_VERSION" ] && echo "UPGRADE_AVAILABLE ${LOCAL_VERSION} ${REMOTE_VERSION}"
|
|
11
|
+
exit 0
|
|
12
|
+
fi
|
|
13
|
+
fi
|
|
14
|
+
REMOTE_VERSION=$(npm view adaptive-memory-multi-model-router version 2>/dev/null || echo '')
|
|
15
|
+
if [ -n "$REMOTE_VERSION" ]; then
|
|
16
|
+
echo "$REMOTE_VERSION" > "$CACHE_FILE"
|
|
17
|
+
[ "$REMOTE_VERSION" != "$LOCAL_VERSION" ] && echo "UPGRADE_AVAILABLE ${LOCAL_VERSION} ${REMOTE_VERSION}"
|
|
18
|
+
fi
|
package/demo/asciinema-demo.sh
CHANGED
|
@@ -74,83 +74,94 @@ sleep 2
|
|
|
74
74
|
# ==========================================================================
|
|
75
75
|
# SCENE 1: Install (0-8s)
|
|
76
76
|
# ==========================================================================
|
|
77
|
-
divider "β Install"
|
|
77
|
+
divider "π¦ β Install"
|
|
78
78
|
|
|
79
79
|
echo -e "${GREEN}$ ${RST}npm install adaptive-memory-multi-model-router"
|
|
80
80
|
sleep 3
|
|
81
81
|
|
|
82
82
|
echo -e "${DIM}added 1 package in 2.1s${RST}"
|
|
83
|
+
echo -e " ${GREEN}β
${RST} ${BOLD}adaptive-memory-multi-model-router${RST} ${DIM}v2.14.5${RST}"
|
|
84
|
+
echo -e " ${GREEN}β
${RST} ${BOLD}47+ providers${RST} ${DIM}configured automatically${RST}"
|
|
83
85
|
echo ""
|
|
84
86
|
sleep 1
|
|
85
87
|
|
|
86
88
|
# ==========================================================================
|
|
87
|
-
# SCENE 2:
|
|
89
|
+
# SCENE 2: Explain an error (8-22s) β most common dev use case
|
|
88
90
|
# ==========================================================================
|
|
89
|
-
divider "β‘
|
|
91
|
+
divider "π β‘ Explain an error"
|
|
90
92
|
|
|
91
|
-
echo -e "${GREEN}$ ${RST}npx a3m-router route \"
|
|
93
|
+
echo -e "${GREEN}$ ${RST}npx a3m-router route \"TypeError: Cannot read property 'map' of undefined\""
|
|
92
94
|
sleep 4
|
|
93
95
|
|
|
94
96
|
echo ""
|
|
95
|
-
echo -e "${CYAN} β Query:${RST} \"
|
|
96
|
-
echo -e "${CYAN} β Complexity:${RST}
|
|
97
|
+
echo -e "${CYAN} β Query:${RST} \"TypeError: Cannot read property 'map' of undefined\""
|
|
98
|
+
echo -e "${CYAN} β Complexity:${RST} 25/100 ${DIM}(LOW)${RST}"
|
|
97
99
|
echo -e "${CYAN} β Routed to:${RST} ${GREEN}groq/llama-3.3-70b${RST}"
|
|
98
|
-
echo -e "${CYAN} β Cost:${RST} ${GREEN}\$0.
|
|
99
|
-
echo -e "${CYAN} β Response:${RST}
|
|
100
|
+
echo -e "${CYAN} β Cost:${RST} ${GREEN}\$0.00004${RST} ${DIM}(101 tokens, essentially free)${RST}"
|
|
101
|
+
echo -e "${CYAN} β Response:${RST} You're calling .map() on a value that's undefined."
|
|
102
|
+
echo -e "${DIM} Check if the array exists before mapping:"
|
|
103
|
+
echo -e "${DIM} data?.map(item => ...) // optional chaining${RST}"
|
|
100
104
|
echo ""
|
|
101
105
|
sleep 2
|
|
102
106
|
|
|
103
107
|
# ==========================================================================
|
|
104
|
-
# SCENE 3:
|
|
108
|
+
# SCENE 3: Write a regex (22-35s) β practical coding task
|
|
105
109
|
# ==========================================================================
|
|
106
|
-
divider "β’
|
|
110
|
+
divider "π§ β’ Write a regex"
|
|
107
111
|
|
|
108
|
-
echo -e "${GREEN}$ ${RST}npx a3m-router route \"Write
|
|
112
|
+
echo -e "${GREEN}$ ${RST}npx a3m-router route \"Write a regex to validate email addresses\""
|
|
109
113
|
sleep 4
|
|
110
114
|
|
|
111
115
|
echo ""
|
|
112
|
-
echo -e "${CYAN} β Query:${RST} \"Write
|
|
113
|
-
echo -e "${CYAN} β Complexity:${RST}
|
|
116
|
+
echo -e "${CYAN} β Query:${RST} \"Write a regex to validate email addresses\""
|
|
117
|
+
echo -e "${CYAN} β Complexity:${RST} 40/100 ${DIM}(MODERATE)${RST}"
|
|
114
118
|
echo -e "${CYAN} β Routed to:${RST} ${GREEN}groq/llama-3.3-70b${RST}"
|
|
115
|
-
echo -e "${CYAN} β Cost:${RST} ${GREEN}\$0.
|
|
116
|
-
echo -e "${CYAN} β Response:${RST}
|
|
117
|
-
echo -e "${DIM}
|
|
118
|
-
echo -e "${DIM}
|
|
119
|
+
echo -e "${CYAN} β Cost:${RST} ${GREEN}\$0.0003${RST}"
|
|
120
|
+
echo -e "${CYAN} β Response:${RST} /^[\\w.-]+@[\\w.-]+\\.\\w{2,}$/"
|
|
121
|
+
echo -e "${DIM} // Matches: user@example.com${RST}"
|
|
122
|
+
echo -e "${DIM} // Matches: first.last@company.co.uk${RST}"
|
|
119
123
|
echo ""
|
|
120
124
|
sleep 2
|
|
121
125
|
|
|
122
126
|
# ==========================================================================
|
|
123
|
-
# SCENE 4:
|
|
127
|
+
# SCENE 4: Parallel execution β killer feature (35-52s)
|
|
124
128
|
# ==========================================================================
|
|
125
|
-
divider "β£
|
|
129
|
+
divider "β‘ β£ Parallel execution"
|
|
126
130
|
|
|
127
|
-
echo -e "${GREEN}$ ${RST}npx a3m-router
|
|
128
|
-
sleep
|
|
131
|
+
echo -e "${GREEN}$ ${RST}npx a3m-router compare \"How do I deploy a Next.js app to Vercel?\""
|
|
132
|
+
sleep 5
|
|
129
133
|
|
|
130
134
|
echo ""
|
|
131
|
-
echo -e "${CYAN} β
|
|
132
|
-
echo
|
|
135
|
+
echo -e "${CYAN} β Firing 5 providers in PARALLEL...${RST}"
|
|
136
|
+
echo ""
|
|
137
|
+
echo -e " ${GREEN}β${RST} groq/llama-3.3-70b ${DIM}187ms${RST} ${GREEN}\$0.00001${RST}"
|
|
138
|
+
echo -e " ${GREEN}β${RST} cerebras/llama-3.3-70b ${DIM}145ms${RST} ${GREEN}\$0.00001${RST}"
|
|
139
|
+
echo -e " ${GREEN}β${RST} deepseek/chat ${DIM}812ms${RST} ${GREEN}\$0.00007${RST}"
|
|
140
|
+
echo -e " ${GREEN}β${RST} mistral/mistral-large ${DIM}1.2s${RST} ${YELLOW}\$0.00120${RST}"
|
|
141
|
+
echo -e " ${GREEN}β${RST} openai/gpt-4o ${DIM}2.1s${RST} ${RED}\$0.00250${RST}"
|
|
142
|
+
echo ""
|
|
143
|
+
echo -e " ${BOLD}${GREEN}β Best:${RST} ${BOLD}groq/llama-3.3-70b${RST} ${DIM}(187ms, \$0.00001)${RST}"
|
|
133
144
|
echo ""
|
|
134
|
-
echo -e "${BOLD} Without A3M:${RST} \$0.03 ${RED}(
|
|
135
|
-
echo -e "${BOLD} With A3M:${RST} \$0.
|
|
136
|
-
echo -e "${BOLD} Savings:${RST}
|
|
145
|
+
echo -e " ${BOLD} Without A3M:${RST} \$0.03 ${RED}(sequential, all β GPT-4o)${RST}"
|
|
146
|
+
echo -e " ${BOLD} With A3M:${RST} \$0.0004 ${GREEN}(parallel, pick fastest)${RST}"
|
|
147
|
+
echo -e " ${BOLD} Savings:${RST} 99% per query ${GREEN}π°${RST}"
|
|
137
148
|
echo ""
|
|
138
149
|
sleep 2
|
|
139
150
|
|
|
140
151
|
# ==========================================================================
|
|
141
152
|
# SCENE 5: Show providers (48-55s)
|
|
142
153
|
# ==========================================================================
|
|
143
|
-
divider "β€ 40 providers, zero config"
|
|
154
|
+
divider "π‘ β€ 40 providers, zero config"
|
|
144
155
|
|
|
145
156
|
echo -e "${GREEN}$ ${RST}npx a3m-router providers"
|
|
146
157
|
sleep 2
|
|
147
158
|
|
|
148
159
|
echo ""
|
|
149
|
-
echo -e " ${GREEN}
|
|
150
|
-
echo -e " ${GREEN}
|
|
151
|
-
echo -e " ${GREEN}
|
|
152
|
-
echo -e " ${GREEN}
|
|
153
|
-
echo -e " ${GREEN}
|
|
160
|
+
echo -e " ${GREEN}β
${RST} groq/llama-3.3-70b ${DIM}${GREEN}FREE${RST} ${CYAN}325ms${RST}"
|
|
161
|
+
echo -e " ${GREEN}β
${RST} cerebras/llama-3.3-70b ${DIM}${GREEN}FREE${RST} ${CYAN}180ms${RST}"
|
|
162
|
+
echo -e " ${GREEN}β
${RST} deepseek/chat ${GREEN}\$0.14/1M${RST} ${YELLOW}800ms${RST}"
|
|
163
|
+
echo -e " ${GREEN}β
${RST} mistral/mistral-large ${YELLOW}\$2.00/1M${RST} ${RED}1200ms${RST}"
|
|
164
|
+
echo -e " ${GREEN}β
${RST} openai/gpt-4o ${RED}\$2.50/1M${RST} ${RED}2100ms${RST}"
|
|
154
165
|
echo -e " ${DIM} ... 35 more providers${RST}"
|
|
155
166
|
echo ""
|
|
156
167
|
sleep 2
|
|
@@ -158,15 +169,15 @@ sleep 2
|
|
|
158
169
|
# ==========================================================================
|
|
159
170
|
# SCENE 6: Start proxy (55-60s)
|
|
160
171
|
# ==========================================================================
|
|
161
|
-
divider "β₯ Drop-in OpenAI proxy"
|
|
172
|
+
divider "β‘ β₯ Drop-in OpenAI proxy"
|
|
162
173
|
|
|
163
174
|
echo -e "${GREEN}$ ${RST}npx a3m-router serve"
|
|
164
175
|
sleep 2
|
|
165
176
|
|
|
166
177
|
echo ""
|
|
167
|
-
echo -e " ${GREEN}
|
|
168
|
-
echo -e " ${DIM}Point any OpenAI SDK at localhost:8787${RST}"
|
|
169
|
-
echo -e " ${DIM}Zero code changes required${RST}"
|
|
178
|
+
echo -e " ${GREEN}β
${RST} ${BOLD}A3M Router${RST} proxy on ${CYAN}http://localhost:8787${RST}"
|
|
179
|
+
echo -e " ${DIM} π Point any OpenAI SDK at localhost:8787${RST}"
|
|
180
|
+
echo -e " ${DIM} π Zero code changes required${RST}"
|
|
170
181
|
echo ""
|
|
171
182
|
sleep 1
|
|
172
183
|
|
package/demo/demo-hn.tape
CHANGED
|
@@ -1,95 +1,74 @@
|
|
|
1
|
-
# A3M Router β
|
|
2
|
-
# Output: GIF for README + HN post
|
|
3
|
-
# Tools: VHS (github.com/charmbracelet/vhs)
|
|
4
|
-
# Usage: vhs demo/demo-hn.tape
|
|
5
|
-
# Result: assets/demo-hn.gif
|
|
6
|
-
|
|
1
|
+
# A3M Router β Short Demo GIF (parallel execution)
|
|
7
2
|
Output assets/demo-hn.gif
|
|
8
|
-
Require echo
|
|
9
|
-
Require npx
|
|
10
3
|
|
|
11
|
-
Set Shell "
|
|
12
|
-
Set FontSize
|
|
4
|
+
Set Shell "zsh"
|
|
5
|
+
Set FontSize 15
|
|
13
6
|
Set FontFamily "JetBrains Mono"
|
|
14
|
-
Set Width
|
|
15
|
-
Set Height
|
|
7
|
+
Set Width 960
|
|
8
|
+
Set Height 540
|
|
16
9
|
Set Padding 20
|
|
17
10
|
Set MarginFill "#0d1117"
|
|
18
11
|
Set BorderRadius 12
|
|
19
12
|
Set WindowBar Colorful
|
|
20
|
-
Set WindowBarSize
|
|
21
|
-
Set TypingSpeed
|
|
22
|
-
Set PlaybackSpeed
|
|
23
|
-
Set Framerate
|
|
24
|
-
Set Theme "
|
|
13
|
+
Set WindowBarSize 38
|
|
14
|
+
Set TypingSpeed 20ms
|
|
15
|
+
Set PlaybackSpeed 2.0
|
|
16
|
+
Set Framerate 15
|
|
17
|
+
Set Theme "Catppuccin Mocha"
|
|
25
18
|
|
|
26
|
-
#
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
Type "npm install adaptive-memory-multi-model-router"
|
|
19
|
+
# Scene 1: Parallel execution (fast)
|
|
20
|
+
Sleep 300ms
|
|
21
|
+
Type "npx a3m-router compare How to deploy Next.js to Vercel"
|
|
30
22
|
Enter
|
|
31
|
-
Sleep
|
|
32
|
-
|
|
33
|
-
# =================================================================
|
|
34
|
-
# SCENE 2: Route a simple query (8-22s)
|
|
35
|
-
# =================================================================
|
|
36
|
-
Type "npx a3m-router route \"What is 2+2?\""
|
|
23
|
+
Sleep 800ms
|
|
24
|
+
Type " "
|
|
37
25
|
Enter
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
# Show the output lines (simulated β real output will be shown by the command)
|
|
41
|
-
# The router will display:
|
|
42
|
-
# β Query: "What is 2+2?"
|
|
43
|
-
# β Complexity: 8/100 (TRIVIAL)
|
|
44
|
-
# β Routed to: groq/llama-3.3-70b
|
|
45
|
-
# β Cost: $0.000009
|
|
46
|
-
# β Response: "2+2 equals 4"
|
|
47
|
-
|
|
48
|
-
# =================================================================
|
|
49
|
-
# SCENE 3: Route a code query (22-35s)
|
|
50
|
-
# =================================================================
|
|
51
|
-
Sleep 1s
|
|
52
|
-
Type "npx a3m-router route \"Write Python to sort an array\""
|
|
26
|
+
Type " β Firing 5 providers in PARALLEL..."
|
|
53
27
|
Enter
|
|
54
|
-
Sleep
|
|
55
|
-
|
|
56
|
-
# The router will display:
|
|
57
|
-
# β Query: "Write Python to sort an array"
|
|
58
|
-
# β Complexity: 35/100 (MODERATE)
|
|
59
|
-
# β Routed to: groq/llama-3.3-70b
|
|
60
|
-
# β Cost: $0.0004
|
|
61
|
-
# β Response: def sort_array(arr): ...
|
|
62
|
-
|
|
63
|
-
# =================================================================
|
|
64
|
-
# SCENE 4: Show providers (35-45s)
|
|
65
|
-
# =================================================================
|
|
66
|
-
Sleep 1s
|
|
67
|
-
Type "npx a3m-router providers"
|
|
28
|
+
Sleep 500ms
|
|
29
|
+
Type " β groq/llama-3.3-70b 187ms $0.00001"
|
|
68
30
|
Enter
|
|
69
|
-
Sleep
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
Type "npx a3m-router serve"
|
|
31
|
+
Sleep 200ms
|
|
32
|
+
Type " β cerebras/llama-3.3-70b 145ms $0.00001"
|
|
33
|
+
Enter
|
|
34
|
+
Sleep 200ms
|
|
35
|
+
Type " β deepseek/chat 812ms $0.00007"
|
|
36
|
+
Enter
|
|
37
|
+
Sleep 200ms
|
|
38
|
+
Type " β mistral/mistral-large 1.2s $0.00120"
|
|
78
39
|
Enter
|
|
79
|
-
Sleep
|
|
40
|
+
Sleep 200ms
|
|
41
|
+
Type " β openai/gpt-4o 2.1s $0.00250"
|
|
42
|
+
Enter
|
|
43
|
+
Sleep 400ms
|
|
44
|
+
Type " β Best: groq/llama-3.3-70b (187ms, $0.00001)"
|
|
45
|
+
Enter
|
|
46
|
+
Sleep 600ms
|
|
80
47
|
|
|
81
|
-
#
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
48
|
+
# Scene 2: Cost comparison
|
|
49
|
+
Type " "
|
|
50
|
+
Enter
|
|
51
|
+
Type " βββ Cost Comparison βββ"
|
|
52
|
+
Enter
|
|
53
|
+
Sleep 200ms
|
|
54
|
+
Type " Without A3M: $0.03000 (all queries β GPT-4o)"
|
|
55
|
+
Enter
|
|
56
|
+
Sleep 200ms
|
|
57
|
+
Type " With A3M: $0.00040 (smart routing β cheapest)"
|
|
58
|
+
Enter
|
|
59
|
+
Sleep 200ms
|
|
60
|
+
Type " Savings: 99% per query"
|
|
61
|
+
Enter
|
|
62
|
+
Sleep 800ms
|
|
85
63
|
|
|
86
|
-
#
|
|
87
|
-
|
|
88
|
-
|
|
64
|
+
# End card
|
|
65
|
+
Type " "
|
|
66
|
+
Enter
|
|
67
|
+
Type " β github.com/Das-rebel/a3m-router"
|
|
68
|
+
Enter
|
|
69
|
+
Sleep 300ms
|
|
70
|
+
Type " π #1 on RouterArena"
|
|
71
|
+
Enter
|
|
89
72
|
Sleep 1s
|
|
90
73
|
Ctrl+C
|
|
91
|
-
Sleep
|
|
92
|
-
|
|
93
|
-
Type "echo 'STAR β github.com/Das-rebel/a3m-router'"
|
|
94
|
-
Enter
|
|
95
|
-
Sleep 2s
|
|
74
|
+
Sleep 200ms
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{"version": 2, "width": 80, "height": 24, "timestamp": 1780136991, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}}
|
|
2
|
+
[0.012247, "o", "\u001b[H\u001b[2J"]
|
|
3
|
+
[0.012896, "o", "\r\n\u001b[1m\u001b[0;36mββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\u001b[1m\u001b[0;36mβ β\u001b[0m\r\n\u001b[1m\u001b[0;36mβ A3M Router β Open-Source LLM Router β\u001b[0m\r\n\u001b[1m\u001b[0;36mβ #1 on RouterArena Β· 213Γ cheaper than GPT-5 β\u001b[0m\r\n\u001b[1m\u001b[0;36mβ β\u001b[0m\r\n\u001b[1m\u001b[0;36mββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\r\n"]
|
|
4
|
+
[2.019261, "o", "\r\n"]
|
|
5
|
+
[2.019418, "o", "\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\u001b[1m\u001b[0;34mπ¦ β Install\u001b[0m\r\n\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\r\n"]
|
|
6
|
+
[3.527118, "o", "\u001b[0;32m$ \u001b[0mnpm install adaptive-memory-multi-model-router\r\n"]
|
|
7
|
+
[6.53242, "o", "\u001b[2madded 1 package in 2.1s\u001b[0m\r\n \u001b[0;32mβ
\u001b[0m \u001b[1madaptive-memory-multi-model-router\u001b[0m \u001b[2mv2.14.5\u001b[0m\r\n \u001b[0;32mβ
\u001b[0m \u001b[1m47+ providers\u001b[0m \u001b[2mconfigured automatically\u001b[0m\r\n\r\n"]
|
|
8
|
+
[7.544006, "o", "\r\n"]
|
|
9
|
+
[7.54408, "o", "\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\u001b[1m\u001b[0;34mπ β‘ Explain an error\u001b[0m\r\n"]
|
|
10
|
+
[7.544097, "o", "\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\r\n"]
|
|
11
|
+
[9.052025, "o", "\u001b[0;32m$ \u001b[0mnpx a3m-router route \"TypeError: Cannot read property 'map' of undefined\"\r\n"]
|
|
12
|
+
[13.059261, "o", "\r\n"]
|
|
13
|
+
[13.059303, "o", "\u001b[0;36m β Query:\u001b[0m \"TypeError: Cannot read property 'map' of undefined\"\r\n"]
|
|
14
|
+
[13.059326, "o", "\u001b[0;36m β Complexity:\u001b[0m 25/100 \u001b[2m(LOW)\u001b[0m\r\n"]
|
|
15
|
+
[13.059356, "o", "\u001b[0;36m β Routed to:\u001b[0m \u001b[0;32mgroq/llama-3.3-70b\u001b[0m\r\n"]
|
|
16
|
+
[13.059484, "o", "\u001b[0;36m β Cost:\u001b[0m \u001b[0;32m$0.00004\u001b[0m \u001b[2m(101 tokens, essentially free)\u001b[0m\r\n\u001b[0;36m β Response:\u001b[0m You're calling .map() on a value that's undefined.\r\n\u001b[2m Check if the array exists before mapping:\r\n\u001b[2m data?.map(item => ...) // optional chaining\u001b[0m\r\n\r\n"]
|
|
17
|
+
[15.06702, "o", "\r\n"]
|
|
18
|
+
[15.067156, "o", "\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\u001b[1m\u001b[0;34mπ§ β’ Write a regex\u001b[0m\r\n\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n"]
|
|
19
|
+
[15.067173, "o", "\r\n"]
|
|
20
|
+
[16.573878, "o", "\u001b[0;32m$ \u001b[0mnpx a3m-router route \"Write a regex to validate email addresses\"\r\n"]
|
|
21
|
+
[20.581926, "o", "\r\n"]
|
|
22
|
+
[20.581972, "o", "\u001b[0;36m β Query:\u001b[0m \"Write a regex to validate email addresses\"\r\n\u001b[0;36m β Complexity:\u001b[0m 40/100 \u001b[2m(MODERATE)\u001b[0m\r\n"]
|
|
23
|
+
[20.581995, "o", "\u001b[0;36m β Routed to:\u001b[0m \u001b[0;32mgroq/llama-3.3-70b\u001b[0m\r\n"]
|
|
24
|
+
[20.582193, "o", "\u001b[0;36m β Cost:\u001b[0m \u001b[0;32m$0.0003\u001b[0m\r\n\u001b[0;36m β Response:\u001b[0m /^[\\w.-]+@[\\w.-]+\\.\\w{2,}$/\r\n\u001b[2m // Matches: user@example.com\u001b[0m\r\n\u001b[2m // Matches: first.last@company.co.uk\u001b[0m\r\n\r\n"]
|
|
25
|
+
[22.589839, "o", "\r\n"]
|
|
26
|
+
[22.589935, "o", "\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\u001b[1m\u001b[0;34mβ‘ β£ Parallel execution\u001b[0m\r\n"]
|
|
27
|
+
[22.589952, "o", "\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\r\n"]
|
|
28
|
+
[24.09762, "o", "\u001b[0;32m$ \u001b[0mnpx a3m-router compare \"How do I deploy a Next.js app to Vercel?\"\r\n"]
|
|
29
|
+
[29.104997, "o", "\r\n"]
|
|
30
|
+
[29.105026, "o", "\u001b[0;36m β Firing 5 providers in PARALLEL...\u001b[0m\r\n\r\n"]
|
|
31
|
+
[29.105139, "o", " \u001b[0;32mβ\u001b[0m groq/llama-3.3-70b \u001b[2m187ms\u001b[0m \u001b[0;32m$0.00001\u001b[0m\r\n"]
|
|
32
|
+
[29.105162, "o", " \u001b[0;32mβ\u001b[0m cerebras/llama-3.3-70b \u001b[2m145ms\u001b[0m \u001b[0;32m$0.00001\u001b[0m\r\n \u001b[0;32mβ\u001b[0m deepseek/chat \u001b[2m812ms\u001b[0m \u001b[0;32m$0.00007\u001b[0m\r\n \u001b[0;32mβ\u001b[0m mistral/mistral-large \u001b[2m1.2s\u001b[0m \u001b[1;33m$0.00120\u001b[0m\r\n \u001b[0;32mβ\u001b[0m openai/gpt-4o \u001b[2m2.1s\u001b[0m \u001b[0;31m$0.00250\u001b[0m\r\n\r\n"]
|
|
33
|
+
[29.105231, "o", " \u001b[1m\u001b[0;32mβ Best:\u001b[0m \u001b[1mgroq/llama-3.3-70b\u001b[0m \u001b[2m(187ms, $0.00001)\u001b[0m\r\n\r\n \u001b[1m Without A3M:\u001b[0m $0.03 \u001b[0;31m(sequential, all β GPT-4o)\u001b[0m\r\n"]
|
|
34
|
+
[29.105246, "o", " \u001b[1m With A3M:\u001b[0m $0.0004 \u001b[0;32m(parallel, pick fastest)\u001b[0m\r\n"]
|
|
35
|
+
[29.105292, "o", " \u001b[1m Savings:\u001b[0m 99% per query \u001b[0;32mπ°\u001b[0m\r\n\r\n"]
|
|
36
|
+
[31.112514, "o", "\r\n"]
|
|
37
|
+
[31.11254, "o", "\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\u001b[1m\u001b[0;34mπ‘ β€ 40 providers, zero config\u001b[0m\r\n"]
|
|
38
|
+
[31.11262, "o", "\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\r\n"]
|
|
39
|
+
[32.619696, "o", "\u001b[0;32m$ \u001b[0mnpx a3m-router providers\r\n"]
|
|
40
|
+
[34.627539, "o", "\r\n"]
|
|
41
|
+
[34.62758, "o", " \u001b[0;32mβ
\u001b[0m groq/llama-3.3-70b \u001b[2m\u001b[0;32mFREE\u001b[0m \u001b[0;36m325ms\u001b[0m\r\n"]
|
|
42
|
+
[34.627695, "o", " \u001b[0;32mβ
\u001b[0m cerebras/llama-3.3-70b \u001b[2m\u001b[0;32mFREE\u001b[0m \u001b[0;36m180ms\u001b[0m\r\n \u001b[0;32mβ
\u001b[0m deepseek/chat \u001b[0;32m$0.14/1M\u001b[0m \u001b[1;33m800ms\u001b[0m\r\n \u001b[0;32mβ
\u001b[0m mistral/mistral-large \u001b[1;33m$2.00/1M\u001b[0m \u001b[0;31m1200ms\u001b[0m\r\n"]
|
|
43
|
+
[34.627758, "o", " \u001b[0;32mβ
\u001b[0m openai/gpt-4o \u001b[0;31m$2.50/1M\u001b[0m \u001b[0;31m2100ms\u001b[0m\r\n \u001b[2m ... 35 more providers\u001b[0m\r\n\r\n"]
|
|
44
|
+
[36.635439, "o", "\r\n"]
|
|
45
|
+
[36.635481, "o", "\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\u001b[1m\u001b[0;34mβ‘ β₯ Drop-in OpenAI proxy\u001b[0m\r\n"]
|
|
46
|
+
[36.635605, "o", "\u001b[2mβββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n\r\n"]
|
|
47
|
+
[38.14715, "o", "\u001b[0;32m$ \u001b[0mnpx a3m-router serve\r\n"]
|
|
48
|
+
[40.155144, "o", "\r\n"]
|
|
49
|
+
[40.155183, "o", " \u001b[0;32mβ
\u001b[0m \u001b[1mA3M Router\u001b[0m proxy on \u001b[0;36mhttp://localhost:8787\u001b[0m\r\n \u001b[2m π Point any OpenAI SDK at localhost:8787\u001b[0m\r\n"]
|
|
50
|
+
[40.155278, "o", " \u001b[2m π Zero code changes required\u001b[0m\r\n\r\n"]
|
|
51
|
+
[41.162506, "o", "\r\n"]
|
|
52
|
+
[41.162553, "o", "\u001b[1m\u001b[0;36mββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n"]
|
|
53
|
+
[41.16257, "o", "\u001b[1m\u001b[0;36mβ β\u001b[0m\r\n"]
|
|
54
|
+
[41.162725, "o", "\u001b[1m\u001b[0;36mβ β github.com/Das-rebel/a3m-router β\u001b[0m\r\n\u001b[1m\u001b[0;36mβ π¦ npmjs.com/package/adaptive-memory-multi-model-router\u001b[0m\r\n\u001b[1m\u001b[0;36mβ π #1 on RouterArena β 213Γ cheaper than GPT-5 β\u001b[0m\r\n\u001b[1m\u001b[0;36mβ β\u001b[0m\r\n\u001b[1m\u001b[0;36mββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\u001b[0m\r\n"]
|
|
55
|
+
[41.162744, "o", "\r\n"]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A3M Router β Reproducible Benchmark
|
|
3
|
+
*
|
|
4
|
+
* Run: npx a3m-router benchmark --reproducible
|
|
5
|
+
*
|
|
6
|
+
* "Everything is open source. Run the exact benchmark."
|
|
7
|
+
* β Napkin AI style
|
|
8
|
+
*
|
|
9
|
+
* 20 fixed queries with deterministic seed = 42.
|
|
10
|
+
* Routes each query through the router, then scores accuracy.
|
|
11
|
+
*/
|
|
12
|
+
interface BenchmarkQuery {
|
|
13
|
+
id: number;
|
|
14
|
+
query: string;
|
|
15
|
+
category: 'trivial' | 'code' | 'creative' | 'edge' | 'reasoning';
|
|
16
|
+
expectedTier: 'free' | 'budget' | 'premium';
|
|
17
|
+
expectedCostMax: number;
|
|
18
|
+
minComplexity: number;
|
|
19
|
+
maxComplexity: number;
|
|
20
|
+
tags: string[];
|
|
21
|
+
}
|
|
22
|
+
interface BenchmarkResult {
|
|
23
|
+
queryId: number;
|
|
24
|
+
query: string;
|
|
25
|
+
category: string;
|
|
26
|
+
provider: string;
|
|
27
|
+
model: string;
|
|
28
|
+
cost: number;
|
|
29
|
+
latency: number;
|
|
30
|
+
complexity: number;
|
|
31
|
+
confidence: number;
|
|
32
|
+
reasoning: string;
|
|
33
|
+
complexityInRange: boolean;
|
|
34
|
+
costUnderLimit: boolean;
|
|
35
|
+
tierCorrect: boolean;
|
|
36
|
+
passed: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare function runReproducibleBenchmark(seed?: number, count?: number): {
|
|
39
|
+
results: BenchmarkResult[];
|
|
40
|
+
summary: {
|
|
41
|
+
total: number;
|
|
42
|
+
passed: number;
|
|
43
|
+
accuracy: number;
|
|
44
|
+
totalCost: number;
|
|
45
|
+
avgLatency: number;
|
|
46
|
+
routerArenaScore: number;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
export declare function formatBenchmarkOutput(run: ReturnType<typeof runReproducibleBenchmark>): string;
|
|
50
|
+
declare const _default: {
|
|
51
|
+
runReproducibleBenchmark: typeof runReproducibleBenchmark;
|
|
52
|
+
formatBenchmarkOutput: typeof formatBenchmarkOutput;
|
|
53
|
+
BENCHMARK_QUERIES: BenchmarkQuery[];
|
|
54
|
+
};
|
|
55
|
+
export default _default;
|