adaptive-memory-multi-model-router 2.14.59 → 2.15.0
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/ISSUE_TEMPLATE/checklist.md +35 -0
- package/.github/workflows/ci.yml +9 -6
- package/POPULARITY_BOOSTERS.md +18 -0
- package/PR_STATUS_REPORT.md +55 -148
- package/README.md +222 -1035
- package/assets/chart-accuracy-by-tier.svg +63 -0
- package/assets/chart-confusion-matrix.svg +98 -0
- package/assets/chart-cost-comparison.svg +66 -0
- package/assets/chart-latency-overhead.svg +102 -0
- package/assets/chart-routerena-leaderboard.svg +76 -0
- package/dist/analytics/costAnalytics.d.ts +1 -0
- package/dist/benchmark/comprehensive.d.ts +4 -53
- package/dist/benchmark/comprehensive.d.ts.map +1 -0
- package/dist/benchmark/comprehensive.js +112 -214
- package/dist/benchmark/comprehensive.js.map +1 -1
- package/dist/benchmark/reproducible.d.ts +1 -0
- package/dist/cache/semanticCache.d.ts +1 -0
- package/dist/cli/setupWizard.d.ts +6 -1
- package/dist/cli/setupWizard.d.ts.map +1 -1
- package/dist/cli/setupWizard.js +6 -9
- package/dist/cli/setupWizard.js.map +1 -1
- package/dist/cost/budgetEnforcer.d.ts +1 -0
- package/dist/cost/costTracker.d.ts +1 -0
- package/dist/ensemble/multiRoundDialog.d.ts +1 -0
- package/dist/ensemble/multiRoundDialog.d.ts.map +1 -0
- package/dist/ensemble/shapleyValue.d.ts +1 -0
- package/dist/ensemble/shapleyValue.d.ts.map +1 -0
- package/dist/ensemble.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/integrations/langchainAdapter.d.ts +1 -0
- package/dist/integrations/oauth.d.ts +1 -0
- package/dist/integrations/scienceAdapter.d.ts +1 -0
- package/dist/integrations/scienceAdapter.d.ts.map +1 -0
- package/dist/memory/autoFetch.d.ts +1 -0
- package/dist/memory/hybridMemory.d.ts +1 -0
- package/dist/memory/hybridMemory.d.ts.map +1 -0
- package/dist/memory/memoryTree.d.ts +1 -0
- package/dist/memory/memoryTree.d.ts.map +1 -1
- package/dist/memory/obsidianVault.d.ts +1 -0
- package/dist/memory/obsidianVault.d.ts.map +1 -1
- package/dist/memory/reasoningBank.d.ts +1 -0
- package/dist/memory/reasoningBank.d.ts.map +1 -0
- package/dist/observability/changeWatch.d.ts +1 -0
- package/dist/observability/fatigueDetector.d.ts +1 -0
- package/dist/observability/index.d.ts +1 -0
- package/dist/observability/metrics.d.ts +1 -0
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/middleware.d.ts +1 -0
- package/dist/observability/tracer.d.ts +1 -0
- package/dist/observability/tracer.d.ts.map +1 -1
- package/dist/observability/types.d.ts +1 -0
- package/dist/providers/providerConfig.d.ts +1 -0
- package/dist/providers/providerConfig.d.ts.map +1 -1
- package/dist/routing/advancedRouter.d.ts +2 -1
- package/dist/routing/advancedRouter.d.ts.map +1 -1
- package/dist/routing/crossModelValidation.d.ts +1 -0
- package/dist/routing/providerHealth.d.ts +1 -0
- package/dist/routing/providerHealth.d.ts.map +1 -1
- package/dist/routing/providerRetry.d.ts +1 -0
- package/dist/sdk.d.ts +1 -0
- package/dist/security/guardrails.d.ts +1 -0
- package/dist/security/guardrails.d.ts.map +1 -1
- package/dist/server/dashboard.d.ts +1 -0
- package/dist/server/handlers/chatHandler.d.ts +11 -0
- package/dist/server/handlers/chatHandler.d.ts.map +1 -0
- package/dist/server/handlers/chatHandler.js +159 -0
- package/dist/server/handlers/chatHandler.js.map +1 -0
- package/dist/server/handlers/completionsHandler.d.ts +10 -0
- package/dist/server/handlers/completionsHandler.d.ts.map +1 -0
- package/dist/server/handlers/completionsHandler.js +124 -0
- package/dist/server/handlers/completionsHandler.js.map +1 -0
- package/dist/server/handlers/embeddingsHandler.d.ts +17 -0
- package/dist/server/handlers/embeddingsHandler.d.ts.map +1 -0
- package/dist/server/handlers/embeddingsHandler.js +235 -0
- package/dist/server/handlers/embeddingsHandler.js.map +1 -0
- package/dist/server/handlers/healthHandler.d.ts +10 -0
- package/dist/server/handlers/healthHandler.d.ts.map +1 -0
- package/dist/server/handlers/healthHandler.js +49 -0
- package/dist/server/handlers/healthHandler.js.map +1 -0
- package/dist/server/handlers/metricsHandler.d.ts +11 -0
- package/dist/server/handlers/metricsHandler.d.ts.map +1 -0
- package/dist/server/handlers/metricsHandler.js +24 -0
- package/dist/server/handlers/metricsHandler.js.map +1 -0
- package/dist/server/handlers/modelsHandler.d.ts +10 -0
- package/dist/server/handlers/modelsHandler.d.ts.map +1 -0
- package/dist/server/handlers/modelsHandler.js +19 -0
- package/dist/server/handlers/modelsHandler.js.map +1 -0
- package/dist/server/metrics.d.ts +96 -0
- package/dist/server/metrics.d.ts.map +1 -0
- package/dist/server/metrics.js +267 -0
- package/dist/server/metrics.js.map +1 -0
- package/dist/server/modelMapper.d.ts +1 -0
- package/dist/server/proxyServer.d.ts +53 -17
- package/dist/server/proxyServer.d.ts.map +1 -1
- package/dist/server/proxyServer.js +66 -303
- package/dist/server/proxyServer.js.map +1 -1
- package/dist/server/router.d.ts +49 -0
- package/dist/server/router.d.ts.map +1 -0
- package/dist/server/router.js +120 -0
- package/dist/server/router.js.map +1 -0
- package/dist/server/state.d.ts +30 -0
- package/dist/server/state.d.ts.map +1 -0
- package/dist/server/state.js +18 -0
- package/dist/server/state.js.map +1 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts +3 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts.map +1 -1
- package/dist/skills/__tests__/skill_manager.test.js +3 -6
- package/dist/skills/__tests__/skill_manager.test.js.map +1 -1
- package/dist/tui/dashboard.d.ts +1 -0
- package/dist/tui/index.d.ts +1 -0
- package/dist/utils/costUtils.d.ts +1 -0
- package/dist/utils/reliability.js +4 -18
- package/dist/utils/sorting.d.ts +1 -0
- package/dist/utils/tokenUtils.d.ts +1 -0
- package/docs/assets/chart-accuracy-by-tier.svg +63 -0
- package/docs/assets/chart-confusion-matrix.svg +98 -0
- package/docs/assets/chart-cost-comparison.svg +66 -0
- package/docs/assets/chart-latency-overhead.svg +102 -0
- package/docs/assets/chart-routerena-leaderboard.svg +76 -0
- package/docs/index.html +72 -80
- package/docs/llms-full.txt +156 -184
- package/docs/llms.txt +77 -42
- package/llms-full.txt +156 -184
- package/llms.txt +77 -42
- package/mcp-server/package.json +6 -0
- package/mcp-server/tsconfig.json +3 -2
- package/package.json +4 -3
- package/scripts/postinstall-nudge.js +3 -0
- package/src/server/handlers/chatHandler.ts +173 -0
- package/src/server/handlers/completionsHandler.ts +120 -0
- package/src/server/handlers/embeddingsHandler.ts +271 -0
- package/src/server/handlers/healthHandler.ts +57 -0
- package/src/server/handlers/metricsHandler.ts +30 -0
- package/src/server/handlers/modelsHandler.ts +25 -0
- package/src/server/metrics.ts +303 -0
- package/src/server/proxyServer.ts +71 -394
- package/src/server/router.ts +157 -0
- package/src/server/state.ts +34 -0
- package/src/skills/__tests__/skill_manager.test.ts +3 -3
- package/index.html +0 -667
package/llms-full.txt
CHANGED
|
@@ -1,227 +1,199 @@
|
|
|
1
|
-
# A3M Router — Complete Reference
|
|
1
|
+
# A3M Router — Complete Reference
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
|
-
A3M Router is an
|
|
4
|
+
A3M Router is an OpenAI-compatible LLM routing gateway that selects the cheapest capable provider per query using multi-signal heuristic scoring. Evaluated on RouterArena across 8,400 queries: 96.77% accuracy, $0.0768/1K average cost, 1.0000 robustness, zero abnormal entries. Open-source, MIT licensed, 19.5 KB gzipped, zero ML dependencies.
|
|
5
5
|
|
|
6
|
-
**
|
|
7
|
-
**
|
|
8
|
-
**
|
|
9
|
-
**
|
|
10
|
-
|
|
6
|
+
**Package:** `adaptive-memory-multi-model-router` (npm)
|
|
7
|
+
**Repository:** `Das-rebel/a3m-router` (GitHub)
|
|
8
|
+
**Language:** TypeScript (Node.js)
|
|
9
|
+
**License:** MIT
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Benchmark Results
|
|
14
|
+
|
|
15
|
+
### RouterArena (ICLR 2025)
|
|
16
|
+
|
|
17
|
+
| Metric | Value |
|
|
18
|
+
|--------|-------|
|
|
19
|
+
| Score | 0.9404 |
|
|
20
|
+
| Accuracy | 96.77% |
|
|
21
|
+
| Avg Cost / 1K tokens | $0.0768 |
|
|
22
|
+
| Robustness | 1.0000 |
|
|
23
|
+
| Abnormal entries | 0 |
|
|
24
|
+
| Queries evaluated | 8,400 |
|
|
25
|
+
|
|
26
|
+
Source: RouteWorks/RouterArena#144 (merged, premium-tier evaluation)
|
|
27
|
+
|
|
28
|
+
### Official Baseline Status
|
|
29
|
+
|
|
30
|
+
| Benchmark | Venue | Status | Reference |
|
|
31
|
+
| RouterArena premium tier | ICLR 2025 | Baseline merged | RouteWorks/RouterArena#144 |
|
|
32
|
+
| RouterArena free tier | ICLR 2025 | Submitted | RouteWorks/RouterArena#152 |
|
|
33
|
+
| RouterEval | EMNLP 2025 | Baseline merged | MilkThink-Lab/RouterEval#4 |
|
|
34
|
+
| MMR-Bench | ArXiv 2026 | Baseline merged | Hunter-Wrynn/MMR-Bench#4 |
|
|
35
|
+
| LLMRouterBench | ACL 2026 | Submitted | ynulihao/LLMRouterBench#3 |
|
|
36
|
+
|
|
37
|
+
### Local Evaluation
|
|
38
|
+
|
|
39
|
+
| Metric | Value |
|
|
40
|
+
|--------|-------|
|
|
41
|
+
| Exact tier match | 67% |
|
|
42
|
+
| Within 1 tier | 96% |
|
|
43
|
+
| Cost savings vs all-premium | 62.9% |
|
|
11
44
|
|
|
12
45
|
---
|
|
13
46
|
|
|
14
47
|
## Architecture
|
|
15
48
|
|
|
16
49
|
```
|
|
17
|
-
Request → Guardrails
|
|
18
|
-
├─ 12 Signal Analyzer (keyword density, complexity, domain, etc.)
|
|
19
|
-
├─ RouteLLM Tier Classifier (free/cheap/mid/premium/enterprise)
|
|
20
|
-
└─ Provider Selector → Execute → Cost Track → Response
|
|
50
|
+
Request → Guardrails → Semantic Cache → Router (5-signal heuristic) → Provider → Response
|
|
21
51
|
```
|
|
22
52
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
Score 3: relevance (overlap with query terms)
|
|
29
|
-
Winner: highest combined score → return with reasoning
|
|
30
|
-
```
|
|
53
|
+
The routing pipeline executes in four stages:
|
|
54
|
+
1. Guardrails: Input validation (prompt injection, PII, content filtering)
|
|
55
|
+
2. Cache lookup: Semantic cache with embedding similarity
|
|
56
|
+
3. Routing decision: Multi-signal heuristic scoring → complexity score → provider tier
|
|
57
|
+
4. Execution: LLM call to selected provider with routing metadata in response
|
|
31
58
|
|
|
32
59
|
---
|
|
33
60
|
|
|
34
|
-
##
|
|
35
|
-
|
|
36
|
-
###
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
### Reliability
|
|
57
|
-
- **Circuit breaker**: 3 consecutive failures → 60s cooldown → half-open retry
|
|
58
|
-
- **Auto failover**: Fallback to next cheapest capable provider
|
|
59
|
-
- **Provider scoring**: Latency-weighted history
|
|
60
|
-
- **Retry logic**: Exponential backoff with jitter
|
|
61
|
-
|
|
62
|
-
### Security
|
|
63
|
-
- **Prompt injection guardrails**: 17 detection patterns
|
|
64
|
-
- **PII detection**: Email, phone, SSN, API keys, credit cards
|
|
65
|
-
- **Content filtering**: Configurable safety levels
|
|
66
|
-
|
|
67
|
-
### Memory
|
|
68
|
-
- **Episodic memory** (`src/memory/episodicMemory.ts`): JSON file-based, auto-save every 3 entries, keyword index rebuild
|
|
69
|
-
- **Query history**: Last N queries with outcomes
|
|
70
|
-
- **Provider preference learning**: EMA-based
|
|
71
|
-
|
|
72
|
-
### Observability
|
|
73
|
-
- **Cost tracking**: Per-provider breakdown
|
|
74
|
-
- **Performance metrics**: Latency, error rates, cache hit rates
|
|
75
|
-
- **Provider health monitoring**: Circuit breaker status
|
|
61
|
+
## Routing Method
|
|
62
|
+
|
|
63
|
+
### Complexity Score Computation
|
|
64
|
+
|
|
65
|
+
Five signal dimensions, summed:
|
|
66
|
+
|
|
67
|
+
| Dimension | Max | Method |
|
|
68
|
+
|-----------|-----|--------|
|
|
69
|
+
| Domain detection | +0.35 | Keyword matching: legal, medical, security, finance, code, ML |
|
|
70
|
+
| Task indicators | +0.25 | Keyword matching: code, math, translate, creative |
|
|
71
|
+
| Query structure | +0.20 | Clause count, character length, qualifier presence |
|
|
72
|
+
| Action verb intensity | +0.20 | Expert +0.20, mid +0.10, simple −0.10 |
|
|
73
|
+
| Multi-step detection | +0.15 | Explicit step markers (first...then, step 1/2/3) |
|
|
74
|
+
|
|
75
|
+
### Tier Mapping
|
|
76
|
+
|
|
77
|
+
| Score Range | Tier | Example Providers |
|
|
78
|
+
|------------|------|-----------------|
|
|
79
|
+
| 0.00–0.19 | free | taste-1 ($0) |
|
|
80
|
+
| 0.20–0.44 | cheap | llama-3.3-70b ($0.20/M) |
|
|
81
|
+
| 0.45–0.69 | mid | gpt-4o-mini ($0.60/M) |
|
|
82
|
+
| 0.70–1.00 | premium | gpt-4o ($2.50/M), claude-3.5-sonnet ($1.50/M) |
|
|
76
83
|
|
|
77
84
|
---
|
|
78
85
|
|
|
79
|
-
##
|
|
86
|
+
## Provider Coverage (47+)
|
|
87
|
+
|
|
88
|
+
| Provider | Tiers | Models |
|
|
89
|
+
|---------|-------|--------|
|
|
90
|
+
| OpenAI | premium, mid | gpt-4o, gpt-4o-mini |
|
|
91
|
+
| Anthropic | premium, mid | claude-3.5-sonnet, claude-3-haiku |
|
|
92
|
+
| Google | premium, mid | gemini-1.5-pro, gemini-1.5-flash |
|
|
93
|
+
| Groq | cheap | llama-3.3-70b, llama-3.1-8b |
|
|
94
|
+
| DeepSeek | cheap, mid | deepseek-chat, deepseek-coder |
|
|
95
|
+
| Mistral | cheap, mid | mistral-large, mistral-small |
|
|
96
|
+
| NVIDIA | premium | nvidia/llama-3.1-nemotron |
|
|
97
|
+
| OpenRouter | all | aggregated access |
|
|
98
|
+
| Kimi | cheap | moonshot-v1 |
|
|
99
|
+
| Qwen | cheap, mid | qwen-turbo, qwen-plus |
|
|
100
|
+
| Zhipu | cheap | glm-4 |
|
|
101
|
+
| Yi | cheap | yi-large |
|
|
102
|
+
| Azure OpenAI | premium, mid | via OpenAI-compatible endpoint |
|
|
103
|
+
| AWS Bedrock | premium, mid | via OpenAI-compatible endpoint |
|
|
104
|
+
| Local Ollama | all | configurable model discovery |
|
|
105
|
+
| Local vLLM | all | OpenAI-compatible server |
|
|
80
106
|
|
|
81
|
-
|
|
82
|
-
```typescript
|
|
83
|
-
import { createA3MRouter } from 'adaptive-memory-multi-model-router';
|
|
107
|
+
---
|
|
84
108
|
|
|
85
|
-
|
|
109
|
+
## Feature Specifications
|
|
86
110
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
// { provider: "groq", model: "llama-3.3-70b", cost: 0, latency: 374ms }
|
|
111
|
+
### Parallel Ensemble
|
|
112
|
+
Executes a single query against multiple providers simultaneously. Each response is scored on specificity, structure, and relevance. The highest-scoring result is returned with full provenance.
|
|
90
113
|
|
|
91
|
-
|
|
92
|
-
import { executeEnsemble } from 'adaptive-memory-multi-model-router';
|
|
93
|
-
const
|
|
94
|
-
//
|
|
114
|
+
```typescript
|
|
115
|
+
import { executeEnsemble } from 'adaptive-memory-multi-model-router/ensemble';
|
|
116
|
+
const result = await executeEnsemble(query, systemPrompt, context, providers, options);
|
|
117
|
+
// result.winner — provider key
|
|
118
|
+
// result.scores — per-provider score map
|
|
119
|
+
// result.reasoning — human-readable scoring rationale
|
|
120
|
+
// result.allResults — preserved responses from all providers
|
|
95
121
|
```
|
|
96
122
|
|
|
97
|
-
###
|
|
98
|
-
|
|
99
|
-
npx a3m-router serve
|
|
100
|
-
# Point any OpenAI SDK at localhost:8787 with model: "auto"
|
|
101
|
-
```
|
|
123
|
+
### Semantic Cache
|
|
124
|
+
Embedding-based lookup with configurable similarity threshold (default 0.92). Per-route TTL allows different freshness requirements per query domain.
|
|
102
125
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
npx a3m-router providers # List available providers
|
|
108
|
-
npx a3m-router cache # Cache stats
|
|
109
|
-
npx a3m-router cost # Cost breakdown
|
|
126
|
+
```typescript
|
|
127
|
+
import { SemanticCache } from 'adaptive-memory-multi-model-router/cache';
|
|
128
|
+
const cache = new SemanticCache({ similarityThreshold: 0.92, ttl: 3600000 });
|
|
129
|
+
// Embedding similarity > threshold → cache hit (no LLM call)
|
|
110
130
|
```
|
|
111
131
|
|
|
112
|
-
|
|
132
|
+
### Guardrails
|
|
133
|
+
Prompt injection detection covers 17 patterns including jailbreak templates, system prompt overrides, and delimiter-based injection. PII detection supports common entity types.
|
|
113
134
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const router = createA3MRouter({
|
|
117
|
-
cache: { ttl: 3600000, maxSize: 1000 },
|
|
118
|
-
costs: { monthlyBudget: 50 },
|
|
119
|
-
circuitBreaker: { threshold: 3, cooldown: 60000 },
|
|
120
|
-
providers: ['openai', 'anthropic', 'groq', 'deepseek'],
|
|
121
|
-
ensemble: { enabled: true, minProviders: 2 }
|
|
122
|
-
});
|
|
123
|
-
```
|
|
135
|
+
### Adaptive Memory
|
|
136
|
+
Model quality scores update online via exponential moving average (alpha=0.2) after each real LLM call. Historical feedback influences future routing decisions within the same session.
|
|
124
137
|
|
|
125
|
-
|
|
138
|
+
### Budget Enforcement
|
|
139
|
+
Per-user and per-team monthly spend caps with hard limits. Real-time alerts at 50%, 80%, and 100% thresholds. Per-provider cost breakdown.
|
|
126
140
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
**Date:** May 2026
|
|
130
|
-
**Provider:** Groq (llama-3.3-70b-versatile)
|
|
141
|
+
### Circuit Breaker
|
|
142
|
+
Trip after 3 failures, 60s cooldown. Automatic fallback chain across provider tiers.
|
|
131
143
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
| Direct to Groq | 138ms | baseline |
|
|
135
|
-
| Through A3M (forced) | 234ms | +96ms |
|
|
136
|
-
| Through A3M (auto route) | 374ms | +236ms |
|
|
144
|
+
### Per-Provider Retry
|
|
145
|
+
Custom timeout per provider. Exponential backoff with jitter. Rate limit detection (429) triggers Retry-After-aware backoff.
|
|
137
146
|
|
|
138
|
-
|
|
139
|
-
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## API Reference
|
|
140
150
|
|
|
141
|
-
|
|
151
|
+
| Method | Endpoint | Description |
|
|
152
|
+
|--------|----------|-------------|
|
|
153
|
+
| POST | `/v1/chat/completions` | OpenAI-compatible chat |
|
|
154
|
+
| POST | `/v1/route` | Routing decision without LLM call |
|
|
155
|
+
| GET | `/v1/models` | Available models with pricing |
|
|
156
|
+
| GET | `/health` | Provider health scores |
|
|
142
157
|
|
|
143
158
|
---
|
|
144
159
|
|
|
145
|
-
##
|
|
160
|
+
## Installation
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
npm install adaptive-memory-multi-model-router
|
|
164
|
+
npx a3m-router serve # proxy at http://localhost:8787
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
```python
|
|
168
|
+
pip install a3m-router
|
|
146
169
|
```
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
│ │ ├── queryTypePresets.ts # Query type classification (P1)
|
|
153
|
-
│ │ └── providerRetry.ts # Retry + failover
|
|
154
|
-
│ ├── providers/
|
|
155
|
-
│ │ └── providerConfig.ts # 47 provider configs
|
|
156
|
-
│ ├── cache/
|
|
157
|
-
│ │ └── semanticCache.ts # Embedding cache
|
|
158
|
-
│ ├── memory/
|
|
159
|
-
│ │ └── episodicMemory.ts # Persistent memory (P3)
|
|
160
|
-
│ ├── cost/
|
|
161
|
-
│ │ └── budgetEnforcer.ts # Budget tracking
|
|
162
|
-
│ ├── guardrails/
|
|
163
|
-
│ │ └── securityGuardrails.ts # 17 injection patterns
|
|
164
|
-
│ └── security/
|
|
165
|
-
│ └── piiDetection.ts # PII detection
|
|
166
|
-
├── docs/
|
|
167
|
-
│ ├── BENCHMARK.md # Independent benchmark
|
|
168
|
-
│ ├── QUICK_START.md # Quick start guide
|
|
169
|
-
│ └── CORE_VISION_PRD.md # Product vision
|
|
170
|
-
└── articles/ # Community content
|
|
170
|
+
|
|
171
|
+
```python
|
|
172
|
+
from openai import OpenAI
|
|
173
|
+
client = OpenAI(base_url="http://localhost:8787/v1", api_key="not-needed")
|
|
174
|
+
response = client.chat.completions.create(model="auto", messages=[...])
|
|
171
175
|
```
|
|
172
176
|
|
|
173
177
|
---
|
|
174
178
|
|
|
175
|
-
##
|
|
176
|
-
```bash
|
|
177
|
-
npm install adaptive-memory-multi-model-router
|
|
178
|
-
# or
|
|
179
|
-
npx adaptive-memory-multi-model-router
|
|
179
|
+
## Citation
|
|
180
180
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
181
|
+
```bibtex
|
|
182
|
+
@software{a3m_router,
|
|
183
|
+
title = {A3M Router: OpenAI-Compatible LLM Routing Gateway},
|
|
184
|
+
author = {Subho Mukherjee},
|
|
185
|
+
year = {2025},
|
|
186
|
+
url = {https://github.com/Das-rebel/a3m-router},
|
|
187
|
+
note = {RouterArena evaluated: 96.77% accuracy, $0.0768/1K, 1.0000 robustness}
|
|
188
|
+
}
|
|
184
189
|
```
|
|
185
190
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
-
|
|
190
|
-
-
|
|
191
|
-
-
|
|
192
|
-
-
|
|
193
|
-
-
|
|
194
|
-
-
|
|
195
|
-
- [QUICK_START.md](./docs/QUICK_START.md) — Quick start guide
|
|
196
|
-
- [ARCHITECTURAL-IMPROVEMENTS.md](./docs/ARCHITECTURAL-IMPROVEMENTS-2025.md) — Architecture docs
|
|
197
|
-
|
|
198
|
-
### Integrations
|
|
199
|
-
- [LangChain](./integrations/langchain/) — LangChain integration adapter
|
|
200
|
-
- [Vercel AI SDK](./integrations/vercel-ai-sdk/) — Vercel AI SDK integration (use with @ai-sdk packages)
|
|
201
|
-
|
|
202
|
-
### Servers & Tools
|
|
203
|
-
- [MCP Server](./mcp-server/) — Model Context Protocol server
|
|
204
|
-
- [Demo](./demo/) — Interactive demo application
|
|
205
|
-
- [Proxy](./proxy/) — OpenAI-compatible proxy server
|
|
206
|
-
|
|
207
|
-
### Community
|
|
208
|
-
- [GitHub Discussions](https://github.com/Das-rebel/a3m-router/discussions) — Community Q&A, ideas, and show-and-tell
|
|
209
|
-
|
|
210
|
-
### Documentation Site
|
|
211
|
-
- [GitHub Pages](https://das-rebel.github.io/a3m-router/) — Full documentation website
|
|
212
|
-
- [Benchmark Results](https://das-rebel.github.io/a3m-router/benchmark) — Independent benchmark data
|
|
213
|
-
- [Quick Start](https://das-rebel.github.io/a3m-router/quick-start) — Getting started guide
|
|
214
|
-
- [API Reference](https://das-rebel.github.io/a3m-router/api) — SDK and CLI reference
|
|
215
|
-
|
|
216
|
-
### Docs
|
|
217
|
-
- [ARCHITECTURE.md](./ARCHITECTURE.md) — Codebase architecture
|
|
218
|
-
- [CHANGELOG.md](./CHANGELOG.md) — Version history
|
|
219
|
-
- [docs/comparison.md](./docs/comparison.md) — Competitor comparison
|
|
220
|
-
- [docs/cli-cheatsheet.md](./docs/cli-cheatsheet.md) — CLI quick reference
|
|
221
|
-
- [docs/curl-examples.md](./docs/curl-examples.md) — One-liner curl examples
|
|
222
|
-
- [docs/openapi.yaml](./docs/openapi.yaml) — OpenAPI specification
|
|
223
|
-
- [docs/BENCHMARK.md](./docs/BENCHMARK.md) — Detailed benchmark data
|
|
224
|
-
|
|
225
|
-
### Deployments
|
|
226
|
-
- [Docker](https://github.com/Das-rebel/a3m-router) — Multi-stage Dockerfile and docker-compose
|
|
227
|
-
- [npm](https://www.npmjs.com/package/adaptive-memory-multi-model-router) — npm package (install: npm install -g adaptive-memory-multi-model-router)
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## References
|
|
194
|
+
- RouteWorks/RouterArena (ICLR 2025): https://github.com/RouteWorks/RouterArena
|
|
195
|
+
- MilkThink-Lab/RouterEval (EMNLP 2025): https://github.com/MilkThink-Lab/RouterEval
|
|
196
|
+
- Hunter-Wrynn/MMR-Bench (ArXiv 2026): https://github.com/Hunter-Wrynn/MMR-Bench
|
|
197
|
+
- ynulihao/LLMRouterBench (ACL 2026): https://github.com/ynulihao/LLMRouterBench
|
|
198
|
+
- Lin et al. "RouteLLM." arXiv:2404.06035, 2024
|
|
199
|
+
- Zhong et al. "RadixAttention." arXiv:2412.15115, 2024
|
package/llms.txt
CHANGED
|
@@ -1,44 +1,79 @@
|
|
|
1
|
-
# A3M Router
|
|
2
|
-
|
|
3
|
-
##
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
##
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
##
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
1
|
+
# A3M Router
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
A3M Router is an OpenAI-compatible LLM routing gateway that selects the cheapest capable provider per query using multi-signal heuristic scoring. Evaluated on RouterArena across 8,400 queries: 96.77% accuracy, $0.0768/1K average cost, 1.0000 robustness, zero abnormal entries.
|
|
5
|
+
|
|
6
|
+
## Architecture
|
|
7
|
+
- Stateless proxy between client applications and LLM providers
|
|
8
|
+
- Pipeline: Guardrails → Semantic Cache → Multi-Signal Heuristic Routing → Provider Execution
|
|
9
|
+
- No ML training required; no GPU resources needed for routing decisions
|
|
10
|
+
|
|
11
|
+
## Routing Method
|
|
12
|
+
Multi-signal heuristic scoring across five dimensions:
|
|
13
|
+
1. Domain detection (legal, medical, security, finance, code, ML) — up to +0.35
|
|
14
|
+
2. Task indicators (code, math, translate, creative) — up to +0.25
|
|
15
|
+
3. Query structure (clauses, length, qualifiers) — up to +0.20
|
|
16
|
+
4. Action verb intensity (expert/mid/simple) — +0.20 to −0.10
|
|
17
|
+
5. Multi-step detection (explicit step markers) — up to +0.15
|
|
18
|
+
|
|
19
|
+
Complexity score (0.0–1.0) maps to provider tiers: free (taste-1), cheap (llama-3.3-70b), mid (gpt-4o-mini), premium (gpt-4o, claude-3.5-sonnet).
|
|
20
|
+
|
|
21
|
+
## Benchmark Results
|
|
22
|
+
|
|
23
|
+
| Metric | Value |
|
|
24
|
+
|--------|-------|
|
|
25
|
+
| RouterArena Score | 0.9404 |
|
|
26
|
+
| Accuracy | 96.77% |
|
|
27
|
+
| Avg Cost / 1K tokens | $0.0768 |
|
|
28
|
+
| Robustness | 1.0000 |
|
|
29
|
+
| Abnormal entries | 0 |
|
|
30
|
+
| Queries evaluated | 8,400 |
|
|
31
|
+
|
|
32
|
+
Source: RouteWorks/RouterArena#144 (merged, premium-tier evaluation)
|
|
33
|
+
|
|
34
|
+
## Official Baseline Status
|
|
35
|
+
- RouterArena premium tier (ICLR 2025): baseline merged — PR#144 | Score 0.9404, Accuracy 96.77%
|
|
36
|
+
- RouterArena free tier (ICLR 2025): baseline submitted — PR#152 | 50.59% accuracy (pending)
|
|
37
|
+
- RouterEval (EMNLP 2025): baseline merged — MilkThink-Lab/RouterEval#4
|
|
38
|
+
- MMR-Bench (ArXiv 2026): baseline merged — Hunter-Wrynn/MMR-Bench#4 | Accuracy 67%, Cost savings 63.5%
|
|
39
|
+
- LLMRouterBench (ACL 2026): baseline submitted — ynulihao/LLMRouterBench#3
|
|
40
|
+
|
|
41
|
+
## Local Evaluation
|
|
42
|
+
|
|
43
|
+
| Metric | Value |
|
|
44
|
+
|--------|-------|
|
|
45
|
+
| Exact tier match | 67% |
|
|
46
|
+
| Within 1 tier | 96% |
|
|
47
|
+
| Cost savings vs all-premium | 62.9% |
|
|
48
|
+
|
|
49
|
+
## Provider Coverage
|
|
50
|
+
47+ providers: OpenAI, Anthropic, Google, Groq, DeepSeek, Mistral, NVIDIA, OpenRouter, Kimi, Qwen, Zhipu, Yi, Azure OpenAI, AWS Bedrock, Local Ollama, Local vLLM.
|
|
51
|
+
|
|
52
|
+
## Features
|
|
53
|
+
- Parallel ensemble execution (multiple providers simultaneously, confidence-weighted scoring)
|
|
54
|
+
- Semantic cache (embedding-based, configurable similarity threshold, per-route TTL)
|
|
55
|
+
- Budget enforcement (per-user/team caps, real-time alerts at 50%/80%/100%)
|
|
56
|
+
- Circuit breaker (3-failure trigger, 60s cooldown)
|
|
57
|
+
- Per-provider retry with exponential backoff and 429 detection
|
|
58
|
+
- Guardrails (prompt injection detection, PII detection)
|
|
59
|
+
- Adaptive memory (EMA-based model quality scoring, no retraining)
|
|
60
|
+
|
|
61
|
+
## API
|
|
62
|
+
OpenAI-compatible proxy at localhost:8787. Model selection via `model="auto"` invokes heuristic routing.
|
|
63
|
+
|
|
64
|
+
## Citation
|
|
65
|
+
```
|
|
66
|
+
@software{a3m_router,
|
|
67
|
+
title = {A3M Router: OpenAI-Compatible LLM Routing Gateway},
|
|
68
|
+
author = {Subho Mukherjee},
|
|
69
|
+
year = {2025},
|
|
70
|
+
url = {https://github.com/Das-rebel/a3m-router},
|
|
71
|
+
note = {RouterArena evaluated: 96.77% accuracy, $0.0768/1K, 1.0000 robustness}
|
|
72
|
+
}
|
|
37
73
|
```
|
|
38
74
|
|
|
39
|
-
##
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
- License: MIT
|
|
75
|
+
## References
|
|
76
|
+
- RouteWorks/RouterArena (ICLR 2025): https://github.com/RouteWorks/RouterArena
|
|
77
|
+
- MilkThink-Lab/RouterEval (EMNLP 2025): https://github.com/MilkThink-Lab/RouterEval
|
|
78
|
+
- Hunter-Wrynn/MMR-Bench (ArXiv 2026): https://github.com/Hunter-Wrynn/MMR-Bench
|
|
79
|
+
- ynulihao/LLMRouterBench (ACL 2026): https://github.com/ynulihao/LLMRouterBench
|
package/mcp-server/package.json
CHANGED
package/mcp-server/tsconfig.json
CHANGED
|
@@ -10,9 +10,10 @@
|
|
|
10
10
|
"esModuleInterop": true,
|
|
11
11
|
"skipLibCheck": true,
|
|
12
12
|
"forceConsistentCasingInFileNames": true,
|
|
13
|
+
"resolveJsonModule": true,
|
|
13
14
|
"declaration": true,
|
|
14
|
-
"
|
|
15
|
-
"
|
|
15
|
+
"declarationMap": true,
|
|
16
|
+
"sourceMap": true
|
|
16
17
|
},
|
|
17
18
|
"include": ["src/**/*"],
|
|
18
19
|
"exclude": ["node_modules", "dist"]
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adaptive-memory-multi-model-router",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.15.0",
|
|
4
4
|
"shortName": "A3M Router",
|
|
5
5
|
"displayName": "A3M Router - Adaptive Memory Multi-Model Router",
|
|
6
|
-
"description": "RouterArena #1
|
|
6
|
+
"description": "RouterArena #1 (ICLR 2025): 96.77% accuracy, $0.0768/1K, 1.0000 robustness. Modular OpenAI-compatible LLM router across 47+ providers with parallel ensemble execution.",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"bin": {
|
|
9
9
|
"a3m-router": "dist/cli.js",
|
|
@@ -179,7 +179,8 @@
|
|
|
179
179
|
"test:providers": "node test/provider-test.js",
|
|
180
180
|
"benchmark": "node test/benchmark.js",
|
|
181
181
|
"benchmark:verbose": "node test/benchmark.js --verbose",
|
|
182
|
-
"build": "npx tsc -p tsconfig.build.json"
|
|
182
|
+
"build": "npx tsc -p tsconfig.build.json",
|
|
183
|
+
"postinstall": "node scripts/postinstall-nudge.js"
|
|
183
184
|
},
|
|
184
185
|
"engines": {
|
|
185
186
|
"node": ">=18.0.0"
|