adaptive-memory-multi-model-router 2.16.0 → 2.16.2
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/auto-submit-sitemap.yml +41 -0
- package/.github/workflows/ci.yml +2 -5
- package/.github/workflows/mcp-pypi-publish.yml +34 -0
- package/.github/workflows/pypi-publish.yml +146 -0
- package/.github/workflows/tmlpd-publish.yml +23 -0
- package/README.md +245 -148
- package/RELEASE_v2.16.0.md +149 -0
- package/TECHNICAL_README.md +253 -0
- package/adapters/README.md +36 -0
- package/adapters/__init__.py +25 -0
- package/adapters/a3m_adapter/__init__.py +51 -0
- package/adapters/a3m_adapter/adapter/__init__.py +22 -0
- package/adapters/a3m_adapter/adapter/autogen.py +169 -0
- package/adapters/a3m_adapter/adapter/config.py +100 -0
- package/adapters/a3m_adapter/adapter/haystack.py +197 -0
- package/adapters/a3m_adapter/adapter/langchain.py +155 -0
- package/adapters/a3m_adapter/adapter/langgraph.py +196 -0
- package/adapters/a3m_adapter/adapter/llamaindex.py +162 -0
- package/adapters/a3m_adapter/adapter/pinecone.py +217 -0
- package/adapters/a3m_adapter/adapter/vercel.py +188 -0
- package/adapters/a3m_adapter/tests/__init__.py +1 -0
- package/adapters/a3m_adapter/tests/test_adapters.py +118 -0
- package/adapters/a3m_adapter/tests/test_integration.py +80 -0
- package/adapters/requirements-dev.txt +6 -0
- package/adapters/requirements.txt +4 -0
- package/adapters/setup.py +23 -0
- package/demo.py +251 -0
- package/discoverability-diagnosis.md +280 -0
- package/dist/analytics/costAnalytics.d.ts.map +1 -1
- package/dist/benchmark/reproducible.d.ts.map +1 -1
- package/dist/cache/semanticCache.d.ts.map +1 -1
- package/dist/cli/setupWizard.d.ts +257 -50
- package/dist/cli/setupWizard.d.ts.map +1 -1
- package/dist/cli/setupWizard.js +419 -109
- package/dist/cli/setupWizard.js.map +1 -1
- package/dist/cli/tui.d.ts +6 -0
- package/dist/cli/tui.js +96 -67
- package/dist/cli/tui.js.map +1 -0
- package/dist/cli.js +9 -0
- package/dist/cost/budgetEnforcer.d.ts.map +1 -1
- package/dist/cost/costTracker.d.ts.map +1 -1
- package/dist/ensemble/multiRoundDialog.d.ts.map +1 -1
- package/dist/ensemble/shapleyValue.d.ts.map +1 -1
- package/dist/ensemble.d.ts +1 -1
- package/dist/ensemble.js +141 -0
- package/dist/integrations/langchainAdapter.d.ts.map +1 -1
- package/dist/integrations/langchainAdapter.js +3 -3
- package/dist/integrations/langchainAdapter.js.map +1 -1
- package/dist/integrations/oauth.d.ts.map +1 -1
- package/dist/integrations/scienceAdapter.d.ts.map +1 -1
- package/dist/memory/autoFetch.d.ts.map +1 -1
- package/dist/memory/hybridMemory.d.ts.map +1 -1
- package/dist/memory/memoryTree.d.ts.map +1 -1
- package/dist/memory/obsidianVault.d.ts.map +1 -1
- package/dist/memory/reasoningBank.d.ts.map +1 -1
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/tracer.d.ts.map +1 -1
- package/dist/providers/providerConfig.d.ts.map +1 -1
- package/dist/providers/providerConfig.js +32 -17
- package/dist/providers/providerConfig.js.map +1 -1
- package/dist/routing/advancedRouter.d.ts.map +1 -1
- package/dist/routing/advancedRouter.js +106 -14
- package/dist/routing/advancedRouter.js.map +1 -1
- package/dist/routing/providerHealth.d.ts.map +1 -1
- package/dist/routing/providerRetry.d.ts.map +1 -1
- package/dist/routing/shadowSampler.d.ts.map +1 -0
- package/dist/routing/shadowSampler.js.map +1 -1
- package/dist/security/guardrails.d.ts.map +1 -1
- package/dist/server/handlers/chatHandler.d.ts.map +1 -1
- package/dist/server/handlers/completionsHandler.d.ts.map +1 -1
- package/dist/server/handlers/embeddingsHandler.d.ts.map +1 -1
- package/dist/server/handlers/healthHandler.d.ts.map +1 -1
- package/dist/server/handlers/metricsHandler.d.ts.map +1 -1
- package/dist/server/handlers/modelsHandler.d.ts.map +1 -1
- package/dist/server/metrics.d.ts.map +1 -1
- package/dist/server/proxyServer.d.ts.map +1 -1
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/state.d.ts.map +1 -1
- package/dist/skills/__tests__/skill_manager.test.js +5 -265
- package/dist/skills/__tests__/skill_manager.test.js.map +1 -1
- package/dist/utils/tokenUtils.d.ts.map +1 -1
- package/docker-compose.yml +84 -60
- package/docs/ARTICLE_Biology_Inspired_Routing.md +208 -0
- package/docs/ARTICLE_Master.md +78 -0
- package/docs/ARTICLE_Master_CN.md +78 -0
- package/docs/ARTICLE_OpenRouter_Stripe.md +140 -0
- package/docs/DEVPTO_ARTICLE.md +84 -0
- package/docs/HUMAN_STYLE_GUIDE.md +75 -0
- package/docs/IMPRINT_PLAN.md +88 -0
- package/docs/OPENROUTER_ALTERNATIVE.md +184 -0
- package/docs/SOCIAL_CAMPAIGN.md +316 -0
- package/docs/anthropic.html +45 -0
- package/docs/best-llm-routers-2025.html +157 -0
- package/docs/cerebras.html +43 -0
- package/docs/cli-cheatsheet.md +286 -212
- package/docs/comparison.md +2 -2
- package/docs/deepseek.html +44 -0
- package/docs/google.html +47 -0
- package/docs/groq.html +44 -0
- package/docs/llms-full.txt +360 -138
- package/docs/llms.txt +70 -71
- package/docs/mistral.html +43 -0
- package/docs/ollama.html +50 -0
- package/docs/openai.html +57 -0
- package/docs/sitemap.xml +69 -57
- package/docs-site/blog/best-llm-routers-2025.html +157 -0
- package/docs-site/index.html +68 -9
- package/docs-site/providers/anthropic.html +45 -0
- package/docs-site/providers/cerebras.html +43 -0
- package/docs-site/providers/deepseek.html +44 -0
- package/docs-site/providers/google.html +47 -0
- package/docs-site/providers/groq.html +44 -0
- package/docs-site/providers/index.html +41 -0
- package/docs-site/providers/mistral.html +43 -0
- package/docs-site/providers/ollama.html +50 -0
- package/docs-site/providers/openai.html +57 -0
- package/docs-site/sitemap.xml +69 -0
- package/llms.txt +70 -62
- package/package.json +44 -182
- 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 +35 -81
- 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/build_verify.sh +32 -0
- package/python/mcp-server/README.md +172 -0
- package/python/mcp-server/a3m_mcp/__init__.py +25 -0
- package/python/mcp-server/a3m_mcp/__main__.py +15 -0
- package/python/mcp-server/a3m_mcp/server.py +205 -0
- package/python/mcp-server/pyproject.toml +24 -0
- package/python/pyproject.toml +60 -6
- package/python/setup.py +3 -28
- package/scripts/submit-sitemap.sh +52 -0
- package/src/__types__/registry.d.ts +14 -0
- package/src/cli/setupWizard.ts +443 -112
- package/src/cli/tui.ts +159 -0
- package/src/ensemble.ts +154 -1
- package/src/integrations/langchainAdapter.ts +2 -2
- package/src/providers/providerConfig.ts +32 -17
- package/src/providers/registry.js +27 -0
- package/src/routing/advancedRouter.ts +99 -14
- package/src/routing/shadowSampler.ts +1 -1
- package/test-install/package.json +12 -0
- package/tests/tsconfig.json +0 -1
- package/tmlpd-pi-extension/README.md +105 -44
- package/tmlpd-pi-extension/docs/demo.svg +33 -0
- package/tmlpd-pi-extension/package.json +35 -106
- package/tmlpd-pi-extension/src/tokenOptimization/contextStratifier.ts +163 -0
- package/tmlpd-pi-extension/src/tokenOptimization/fetchOnceLocal.ts +136 -0
- package/tmlpd-pi-extension/src/tokenOptimization/index.ts +197 -0
- package/tmlpd-pi-extension/src/tokenOptimization/interAgentCompression.ts +157 -0
- package/tmlpd-pi-extension/src/tokenOptimization/schemaContract.ts +101 -0
- package/tmlpd-pi-extension/src/tokenOptimization/semanticCache.ts +248 -0
- package/tmlpd-pi-extension/src/tokenOptimization/tokenAwareFallback.ts +192 -0
- package/tmlpd-pi-extension/test/verify.js +21 -0
- package/tsconfig.build.json +3 -2
- package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts +0 -12
- package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts.map +0 -1
- package/packages/a3m-vercel-ai/dist/a3m-language-model.js +0 -289
- package/packages/a3m-vercel-ai/dist/a3m-language-model.js.map +0 -1
- package/packages/a3m-vercel-ai/dist/index.d.ts +0 -82
- package/packages/a3m-vercel-ai/dist/index.d.ts.map +0 -1
- package/packages/a3m-vercel-ai/dist/index.js +0 -79
- package/packages/a3m-vercel-ai/dist/index.js.map +0 -1
- package/packages/a3m-vercel-ai/dist/types.d.ts +0 -97
- package/packages/a3m-vercel-ai/dist/types.d.ts.map +0 -1
- package/packages/a3m-vercel-ai/dist/types.js +0 -5
- package/packages/a3m-vercel-ai/dist/types.js.map +0 -1
- package/src/skills/__tests__/skill_manager.test.ts +0 -328
- package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts +0 -114
- package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/cache/prefixCache.js +0 -285
- package/tmlpd-pi-extension/dist/cache/prefixCache.js.map +0 -1
- package/tmlpd-pi-extension/dist/cache/responseCache.d.ts +0 -58
- package/tmlpd-pi-extension/dist/cache/responseCache.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/cache/responseCache.js +0 -153
- package/tmlpd-pi-extension/dist/cache/responseCache.js.map +0 -1
- package/tmlpd-pi-extension/dist/cli.js +0 -59
- package/tmlpd-pi-extension/dist/cost/costTracker.d.ts +0 -95
- package/tmlpd-pi-extension/dist/cost/costTracker.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/cost/costTracker.js +0 -240
- package/tmlpd-pi-extension/dist/cost/costTracker.js.map +0 -1
- package/tmlpd-pi-extension/dist/index.d.ts +0 -723
- package/tmlpd-pi-extension/dist/index.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/index.js +0 -239
- package/tmlpd-pi-extension/dist/index.js.map +0 -1
- package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts +0 -82
- package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/memory/episodicMemory.js +0 -145
- package/tmlpd-pi-extension/dist/memory/episodicMemory.js.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts +0 -102
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js +0 -207
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts +0 -85
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js +0 -210
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js.map +0 -1
- package/tmlpd-pi-extension/dist/providers/localProvider.d.ts +0 -102
- package/tmlpd-pi-extension/dist/providers/localProvider.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/providers/localProvider.js +0 -338
- package/tmlpd-pi-extension/dist/providers/localProvider.js.map +0 -1
- package/tmlpd-pi-extension/dist/providers/registry.d.ts +0 -55
- package/tmlpd-pi-extension/dist/providers/registry.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/providers/registry.js +0 -138
- package/tmlpd-pi-extension/dist/providers/registry.js.map +0 -1
- package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts +0 -68
- package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/routing/advancedRouter.js +0 -332
- package/tmlpd-pi-extension/dist/routing/advancedRouter.js.map +0 -1
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts +0 -101
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.js +0 -368
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts +0 -96
- package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/batchProcessor.js +0 -170
- package/tmlpd-pi-extension/dist/utils/batchProcessor.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/compression.d.ts +0 -61
- package/tmlpd-pi-extension/dist/utils/compression.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/compression.js +0 -281
- package/tmlpd-pi-extension/dist/utils/compression.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/reliability.d.ts +0 -74
- package/tmlpd-pi-extension/dist/utils/reliability.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/reliability.js +0 -177
- package/tmlpd-pi-extension/dist/utils/reliability.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts +0 -117
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js +0 -246
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts +0 -50
- package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/tokenUtils.js +0 -124
- package/tmlpd-pi-extension/dist/utils/tokenUtils.js.map +0 -1
package/docs/cli-cheatsheet.md
CHANGED
|
@@ -1,322 +1,402 @@
|
|
|
1
1
|
# A3M Router CLI Cheat Sheet
|
|
2
2
|
|
|
3
|
-
> The
|
|
3
|
+
> 🤖 **The intelligent LLM gateway** — routes to the cheapest capable model automatically.
|
|
4
|
+
> 📊 **92% cost savings** | ⚡ **14% faster** | 🌐 **47+ providers** | 🏆 **RouterArena #1**
|
|
4
5
|
|
|
5
6
|
---
|
|
6
7
|
|
|
7
|
-
##
|
|
8
|
+
## 🚀 Quick Start
|
|
8
9
|
|
|
9
10
|
```bash
|
|
10
|
-
#
|
|
11
|
+
# Install
|
|
11
12
|
npm install -g adaptive-memory-multi-model-router
|
|
12
|
-
# or
|
|
13
|
-
npx a3m-router <command>
|
|
14
13
|
|
|
15
|
-
#
|
|
16
|
-
|
|
14
|
+
# One-command setup (auto-detects API keys)
|
|
15
|
+
a3m-router setup
|
|
16
|
+
|
|
17
|
+
# Route a query instantly
|
|
18
|
+
a3m-router route "Explain quantum entanglement"
|
|
17
19
|
|
|
18
|
-
#
|
|
19
|
-
a3m-router
|
|
20
|
+
# Start proxy server
|
|
21
|
+
a3m-router serve
|
|
20
22
|
```
|
|
21
23
|
|
|
22
24
|
---
|
|
23
25
|
|
|
24
|
-
##
|
|
26
|
+
## 📋 Command Reference
|
|
27
|
+
|
|
28
|
+
### Core Commands
|
|
29
|
+
|
|
30
|
+
| Command | Description | Example |
|
|
31
|
+
|---------|-------------|---------|
|
|
32
|
+
| `a3m-router route <query>` | Route to best provider | `a3m-router route "What is Rust?"` |
|
|
33
|
+
| `a3m-router serve` | Start OpenAI-compatible proxy | `a3m-router serve --port 3000` |
|
|
34
|
+
| `a3m-router compare <query>` | Compare all providers | `a3m-router compare "Write a poem"` |
|
|
35
|
+
| `a3m-router test` | Test all provider connections | `a3m-router test` |
|
|
36
|
+
| `a3m-router setup` | Interactive setup wizard | `a3m-router setup` |
|
|
37
|
+
| `a3m-router tui` | Terminal dashboard | `a3m-router tui` |
|
|
38
|
+
|
|
39
|
+
### Model & Provider Commands
|
|
25
40
|
|
|
26
41
|
| Command | Description |
|
|
27
42
|
|---------|-------------|
|
|
28
|
-
| `a3m-router
|
|
29
|
-
| `a3m-router route <query>` | Route a single query to best provider |
|
|
30
|
-
| `a3m-router compare <query>` | Compare providers side by side |
|
|
43
|
+
| `a3m-router models` | List all 1,000+ available models |
|
|
31
44
|
| `a3m-router providers` | List configured providers |
|
|
32
|
-
| `a3m-router
|
|
33
|
-
| `a3m-router
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
|
38
|
-
|
|
39
|
-
| `a3m-router
|
|
45
|
+
| `a3m-router status` | Router health & uptime |
|
|
46
|
+
| `a3m-router recommend <task>` | Get model recommendation |
|
|
47
|
+
|
|
48
|
+
### Cost & Performance
|
|
49
|
+
|
|
50
|
+
| Command | Description | Example |
|
|
51
|
+
|---------|-------------|---------|
|
|
52
|
+
| `a3m-router cost <text>` | Estimate cost in USD | `a3m-router cost "Write a novel"` |
|
|
53
|
+
| `a3m-router token <text>` | Count tokens | `a3m-router token "Hello world"` |
|
|
54
|
+
| `a3m-router benchmark` | Benchmark all providers | `a3m-router benchmark` |
|
|
55
|
+
|
|
56
|
+
### Memory & Context
|
|
57
|
+
|
|
58
|
+
| Command | Description |
|
|
59
|
+
|---------|-------------|
|
|
60
|
+
| `a3m-router memory add` | Add context to memory |
|
|
61
|
+
| `a3m-router memory search <q>` | Semantic search memory |
|
|
62
|
+
| `a3m-router memory stats` | Memory usage stats |
|
|
63
|
+
|
|
64
|
+
### Batch & Advanced
|
|
65
|
+
|
|
66
|
+
| Command | Description |
|
|
67
|
+
|---------|-------------|
|
|
40
68
|
| `a3m-router batch <q1> <q2>...` | Route multiple queries |
|
|
41
|
-
| `a3m-router
|
|
42
|
-
| `a3m-router
|
|
43
|
-
| `a3m-router
|
|
44
|
-
| `a3m-router
|
|
69
|
+
| `a3m-router config` | Show current config |
|
|
70
|
+
| `a3m-router config set <key> <value>` | Update config |
|
|
71
|
+
| `a3m-router logs` | View recent logs |
|
|
72
|
+
| `a3m-router logs --tail` | Stream live logs |
|
|
45
73
|
|
|
46
74
|
---
|
|
47
75
|
|
|
48
|
-
##
|
|
76
|
+
## 💡 Practical Examples
|
|
49
77
|
|
|
78
|
+
### 1. Instant Query Routing
|
|
50
79
|
```bash
|
|
51
|
-
#
|
|
52
|
-
a3m-router route "What is
|
|
53
|
-
|
|
54
|
-
# Force routing through a specific provider
|
|
55
|
-
# (via environment variable or config file)
|
|
80
|
+
# Auto-detects complexity, routes to cheapest capable
|
|
81
|
+
a3m-router route "What is 2+2?"
|
|
56
82
|
|
|
57
|
-
#
|
|
58
|
-
a3m-router
|
|
83
|
+
# Complex query routes to better model
|
|
84
|
+
a3m-router route "Write a REST API in Go with authentication"
|
|
85
|
+
```
|
|
59
86
|
|
|
60
|
-
|
|
61
|
-
|
|
87
|
+
### 2. Compare Providers Side-by-Side
|
|
88
|
+
```bash
|
|
89
|
+
# See responses from all providers at once
|
|
90
|
+
a3m-router compare "Explain Kubernetes in 3 sentences"
|
|
62
91
|
|
|
63
|
-
#
|
|
64
|
-
a3m-router recommend "code generation"
|
|
65
|
-
a3m-router recommend "creative writing"
|
|
66
|
-
a3m-router recommend "data extraction"
|
|
92
|
+
# Output shows winner, latency, cost per provider
|
|
67
93
|
```
|
|
68
94
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
95
|
+
### 3. Batch Processing
|
|
96
|
+
```bash
|
|
97
|
+
# Process 100 queries efficiently
|
|
98
|
+
a3m-router batch \
|
|
99
|
+
"What is the capital of France?" \
|
|
100
|
+
"Write a Python function to sort a list" \
|
|
101
|
+
"Explain neural networks"
|
|
72
102
|
|
|
73
|
-
|
|
103
|
+
# Or pipe from file
|
|
104
|
+
cat queries.txt | a3m-router batch --stdin
|
|
105
|
+
```
|
|
74
106
|
|
|
107
|
+
### 4. Cost Estimation Before API Call
|
|
75
108
|
```bash
|
|
76
|
-
#
|
|
77
|
-
a3m-router
|
|
109
|
+
# Estimate before expensive operation
|
|
110
|
+
a3m-router cost "Write a 10,000 word report on AI ethics"
|
|
111
|
+
# Output: ~$0.34 via DeepSeek-V3 vs $2.80 via GPT-4o
|
|
112
|
+
|
|
113
|
+
# Choose wisely!
|
|
114
|
+
```
|
|
78
115
|
|
|
79
|
-
|
|
80
|
-
|
|
116
|
+
### 5. Self-Hosted Proxy
|
|
117
|
+
```bash
|
|
118
|
+
# Start server
|
|
119
|
+
a3m-router serve --port 8787 --host 0.0.0.0
|
|
81
120
|
|
|
82
|
-
#
|
|
83
|
-
|
|
121
|
+
# Use with any OpenAI-compatible client
|
|
122
|
+
curl http://localhost:8787/v1/chat/completions \
|
|
123
|
+
-H "Content-Type: application/json" \
|
|
124
|
+
-d '{"model": "auto", "messages": [{"role": "user", "content": "Hi!"}]}'
|
|
84
125
|
```
|
|
85
126
|
|
|
86
|
-
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 🔌 Proxy Server Usage
|
|
87
130
|
|
|
131
|
+
### Python
|
|
88
132
|
```python
|
|
89
|
-
import
|
|
90
|
-
|
|
91
|
-
|
|
133
|
+
from openai import OpenAI
|
|
134
|
+
|
|
135
|
+
client = OpenAI(
|
|
136
|
+
api_key="sk-unused", # Any value works
|
|
92
137
|
base_url="http://localhost:8787/v1"
|
|
93
138
|
)
|
|
139
|
+
|
|
140
|
+
# A3M auto-routes to best provider
|
|
94
141
|
response = client.chat.completions.create(
|
|
95
|
-
model="auto",
|
|
96
|
-
messages=[{"role": "user", "content": "
|
|
142
|
+
model="auto",
|
|
143
|
+
messages=[{"role": "user", "content": "Explain quantum computing"}]
|
|
97
144
|
)
|
|
145
|
+
print(response.choices[0].message.content)
|
|
98
146
|
```
|
|
99
147
|
|
|
148
|
+
### TypeScript
|
|
100
149
|
```typescript
|
|
101
150
|
import OpenAI from 'openai';
|
|
151
|
+
|
|
102
152
|
const client = new OpenAI({
|
|
103
|
-
|
|
104
|
-
|
|
153
|
+
apiKey: 'sk-unused',
|
|
154
|
+
baseURL: 'http://localhost:8787/v1',
|
|
105
155
|
});
|
|
156
|
+
|
|
106
157
|
const response = await client.chat.completions.create({
|
|
107
|
-
|
|
108
|
-
|
|
158
|
+
model: 'auto',
|
|
159
|
+
messages: [{ role: 'user', content: 'Explain quantum computing' }],
|
|
160
|
+
});
|
|
161
|
+
console.log(response.choices[0].message.content);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### LangChain
|
|
165
|
+
```typescript
|
|
166
|
+
import { ChatOpenAI } from '@langchain/openai';
|
|
167
|
+
|
|
168
|
+
const model = new ChatOpenAI({
|
|
169
|
+
model: 'auto',
|
|
170
|
+
apiKey: 'sk-unused',
|
|
171
|
+
configuration: {
|
|
172
|
+
baseURL: 'http://localhost:8787/v1',
|
|
173
|
+
},
|
|
109
174
|
});
|
|
110
175
|
```
|
|
111
176
|
|
|
112
177
|
---
|
|
113
178
|
|
|
114
|
-
##
|
|
179
|
+
## 🧠 Ensemble Mode (Hallucination Detection)
|
|
115
180
|
|
|
116
|
-
|
|
181
|
+
A3M's unique **ensemble voting** detects and filters hallucinations:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# Enable ensemble for high-stakes queries
|
|
185
|
+
a3m-router route "Medical diagnosis for symptoms X, Y, Z" --ensemble
|
|
186
|
+
|
|
187
|
+
# Or via config
|
|
188
|
+
a3m-router config set ensemble.enabled true
|
|
189
|
+
a3m-router config set ensemble.voters 3
|
|
190
|
+
```
|
|
117
191
|
|
|
118
192
|
```typescript
|
|
119
|
-
|
|
120
|
-
import { route, ensemble, createA3MRouter } from 'adaptive-memory-multi-model-router';
|
|
193
|
+
import { ensemble } from 'adaptive-memory-multi-model-router';
|
|
121
194
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
195
|
+
const result = await ensemble({
|
|
196
|
+
query: "Medical diagnosis for symptoms X, Y, Z",
|
|
197
|
+
providers: ['openai', 'anthropic', 'deepseek'],
|
|
198
|
+
minAgreement: 2, // Majority vote threshold
|
|
126
199
|
});
|
|
127
|
-
console.log(result.primary_model, result.content);
|
|
128
200
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
});
|
|
134
|
-
console.log(ensembleResult.winner, ensembleResult.scores);
|
|
135
|
-
|
|
136
|
-
// Cost estimation
|
|
137
|
-
import { estimateCost, countTokens } from 'adaptive-memory-multi-model-router/cost';
|
|
138
|
-
const tokens = countTokens("Hello world");
|
|
139
|
-
const cost = estimateCost("gpt-4o", tokens);
|
|
140
|
-
|
|
141
|
-
// Memory operations
|
|
142
|
-
import { MemoryTree } from 'adaptive-memory-multi-model-router/memory';
|
|
143
|
-
const memory = new MemoryTree();
|
|
144
|
-
await memory.remember("user_preference", "likes short responses");
|
|
145
|
-
|
|
146
|
-
// Query with SDK (clean high-level API)
|
|
147
|
-
import { A3M } from 'adaptive-memory-multi-model-router/sdk';
|
|
148
|
-
const a3m = new A3M();
|
|
149
|
-
const response = await a3m.query("What is the capital of France?");
|
|
201
|
+
if (!result.agreement) {
|
|
202
|
+
console.log('⚠️ Low consensus - verify output');
|
|
203
|
+
}
|
|
204
|
+
console.log(result.content);
|
|
150
205
|
```
|
|
151
206
|
|
|
152
|
-
|
|
207
|
+
---
|
|
153
208
|
|
|
154
|
-
|
|
155
|
-
from a3m_router import A3M
|
|
209
|
+
## ⚙️ Configuration
|
|
156
210
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
211
|
+
### Interactive Setup
|
|
212
|
+
```bash
|
|
213
|
+
# Auto-detects API keys from environment
|
|
214
|
+
a3m-router setup
|
|
160
215
|
|
|
161
|
-
#
|
|
162
|
-
|
|
163
|
-
|
|
216
|
+
# Config stored at ~/.config/a3m-router/config.json
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Manual Config
|
|
220
|
+
```bash
|
|
221
|
+
# Set API keys
|
|
222
|
+
a3m-router config set providers.openai.key $OPENAI_API_KEY
|
|
223
|
+
a3m-router config set providers.deepseek.key $DEEPSEEK_API_KEY
|
|
224
|
+
|
|
225
|
+
# Set default strategy
|
|
226
|
+
a3m-router config set routing.defaultStrategy auto # auto | cheapest | fastest | best
|
|
227
|
+
|
|
228
|
+
# Set monthly budget
|
|
229
|
+
a3m-router config set limits.monthlyBudget 100
|
|
230
|
+
|
|
231
|
+
# Enable ensemble voting
|
|
232
|
+
a3m-router config set ensemble.enabled true
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Config File Location
|
|
236
|
+
```
|
|
237
|
+
~/.config/a3m-router/config.json # Primary
|
|
238
|
+
~/.a3m-router/config.json # Alternative
|
|
164
239
|
```
|
|
165
240
|
|
|
166
241
|
---
|
|
167
242
|
|
|
168
|
-
## Environment Variables
|
|
169
|
-
|
|
170
|
-
### Provider API Keys
|
|
171
|
-
|
|
172
|
-
| Variable |
|
|
173
|
-
|
|
174
|
-
| `OPENAI_API_KEY` |
|
|
175
|
-
| `ANTHROPIC_API_KEY` |
|
|
176
|
-
| `
|
|
177
|
-
| `
|
|
178
|
-
| `
|
|
179
|
-
| `
|
|
180
|
-
| `
|
|
181
|
-
| `TOGETHER_API_KEY` |
|
|
182
|
-
| `
|
|
183
|
-
| `
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
| `COHERE_API_KEY` | Optional | Cohere | Command R+, embeddings |
|
|
187
|
-
| `REPLICATE_API_KEY` | Optional | Replicate | Open-source models |
|
|
188
|
-
| `HUGGINGFACE_API_KEY` | Optional | HuggingFace | Inference API |
|
|
189
|
-
| `NVIDIA_API_KEY` | Optional | NVIDIA | NVIDIA NIM |
|
|
190
|
-
| `OPENROUTER_API_KEY` | Optional | OpenRouter | 400+ models via one key |
|
|
191
|
-
| `AZURE_OPENAI_API_KEY` | Optional | Azure OpenAI | Enterprise OpenAI |
|
|
192
|
-
| `ZHIPU_API_KEY` | Optional | Zhipu AI | GLM series |
|
|
193
|
-
| `DASHSCOPE_API_KEY` | Optional | Alibaba (Qwen) | Qwen models |
|
|
194
|
-
| `MOONSHOT_API_KEY` | Optional | Moonshot AI | Kimi models |
|
|
195
|
-
| `MINIMAX_API_KEY` | Optional | MiniMax | MiniMax models |
|
|
196
|
-
| `STEPFUN_API_KEY` | Optional | StepFun | Step models |
|
|
197
|
-
| `NOVITA_API_KEY` | Optional | Novita AI | Low-cost inference |
|
|
198
|
-
| `SAMBANOVA_API_KEY` | Optional | SambaNova | Fast open models |
|
|
199
|
-
| `ANYSCALE_API_KEY` | Optional | Anyscale | Open model endpoints |
|
|
200
|
-
| `WRITER_API_KEY` | Optional | Writer | Palmyra models |
|
|
201
|
-
| `OCTOAI_API_KEY` | Optional | OctoAI | Fast custom models |
|
|
202
|
-
| `AI21_API_KEY` | Optional | AI21 Labs | Jamba 1.5 |
|
|
203
|
-
| `LAMINAR_API_KEY` | Optional | Laminar | Laminar models |
|
|
204
|
-
| `JINA_API_KEY` | Optional | Jina AI | Embeddings, rerank |
|
|
205
|
-
| `VOYAGE_API_KEY` | Optional | Voyage AI | Embeddings |
|
|
206
|
-
|
|
207
|
-
### Configuration
|
|
243
|
+
## 🔑 Environment Variables
|
|
244
|
+
|
|
245
|
+
### Provider API Keys
|
|
246
|
+
|
|
247
|
+
| Variable | Provider | Models |
|
|
248
|
+
|----------|----------|--------|
|
|
249
|
+
| `OPENAI_API_KEY` | OpenAI | GPT-4o, o1, o3 |
|
|
250
|
+
| `ANTHROPIC_API_KEY` | Anthropic | Claude Sonnet 4, Opus |
|
|
251
|
+
| `DEEPSEEK_API_KEY` | DeepSeek | DeepSeek-V3, DeepSeek-R1 |
|
|
252
|
+
| `GROQ_API_KEY` | Groq | Llama, Mixtral (free tier) |
|
|
253
|
+
| `GOOGLE_API_KEY` | Google | Gemini 2.5 Flash/Pro |
|
|
254
|
+
| `XAI_API_KEY` | xAI | Grok-3, Grok-2 |
|
|
255
|
+
| `FIREWORKS_API_KEY` | Fireworks AI | Llama, Mixtral |
|
|
256
|
+
| `TOGETHER_API_KEY` | Together AI | Qwen, Llama |
|
|
257
|
+
| `MISTRAL_API_KEY` | Mistral | Codestral, Mistral Large |
|
|
258
|
+
| `PERPLEXITY_API_KEY` | Perplexity | Sonar (online) |
|
|
259
|
+
|
|
260
|
+
### Router Settings
|
|
208
261
|
|
|
209
262
|
| Variable | Default | Description |
|
|
210
263
|
|----------|---------|-------------|
|
|
211
|
-
| `A3M_LOG_LEVEL` | `info` |
|
|
212
|
-
| `A3M_CONFIG_DIR` | `~/.config/a3m-router` | Config directory |
|
|
213
|
-
| `A3M_CACHE_SIZE` | `1000` | Semantic cache entry limit |
|
|
214
|
-
| `A3M_BUDGET_MONTHLY` | unset | Monthly budget cap (USD) |
|
|
215
|
-
| `A3M_DEFAULT_STRATEGY` | `auto` | Routing strategy (auto, cheapest, fastest, best) |
|
|
264
|
+
| `A3M_LOG_LEVEL` | `info` | debug, info, warn, error |
|
|
216
265
|
| `A3M_PROXY_PORT` | `8787` | Proxy server port |
|
|
217
|
-
| `
|
|
266
|
+
| `A3M_BUDGET_MONTHLY` | unset | Monthly budget cap (USD) |
|
|
267
|
+
| `A3M_DEFAULT_STRATEGY` | `auto` | auto, cheapest, fastest, best |
|
|
268
|
+
| `A3M_CACHE_SIZE` | `1000` | Semantic cache entries |
|
|
218
269
|
|
|
219
270
|
---
|
|
220
271
|
|
|
221
|
-
##
|
|
222
|
-
|
|
223
|
-
Launch the interactive dashboard:
|
|
272
|
+
## 🐳 Docker
|
|
224
273
|
|
|
274
|
+
### Quick Container
|
|
225
275
|
```bash
|
|
226
|
-
|
|
227
|
-
a3m-
|
|
276
|
+
docker run -d \
|
|
277
|
+
--name a3m-proxy \
|
|
278
|
+
-p 8787:8787 \
|
|
279
|
+
-e OPENAI_API_KEY=sk-... \
|
|
280
|
+
-e DEEPSEEK_API_KEY=sk-... \
|
|
281
|
+
-e GROQ_API_KEY=gsk_... \
|
|
282
|
+
ghcr.io/das-rebel/a3m-router:latest
|
|
283
|
+
```
|
|
228
284
|
|
|
229
|
-
|
|
285
|
+
### Docker Compose
|
|
286
|
+
```yaml
|
|
287
|
+
services:
|
|
288
|
+
a3m-router:
|
|
289
|
+
image: ghcr.io/das-rebel/a3m-router:latest
|
|
290
|
+
ports:
|
|
291
|
+
- "8787:8787"
|
|
292
|
+
environment:
|
|
293
|
+
- OPENAI_API_KEY=${OPENAI_API_KEY}
|
|
294
|
+
- DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}
|
|
295
|
+
- GROQ_API_KEY=${GROQ_API_KEY}
|
|
296
|
+
- A3M_LOG_LEVEL=info
|
|
297
|
+
volumes:
|
|
298
|
+
- a3m-data:/root/.config/a3m-router
|
|
299
|
+
|
|
300
|
+
volumes:
|
|
301
|
+
a3m-data:
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## 🖥️ Terminal UI (TUI)
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
# Launch dashboard
|
|
230
310
|
a3m-router tui
|
|
231
311
|
|
|
232
|
-
# Or
|
|
233
|
-
|
|
312
|
+
# Or use the separate binary
|
|
313
|
+
a3m-tui
|
|
234
314
|
```
|
|
235
315
|
|
|
236
|
-
TUI
|
|
316
|
+
### TUI Commands
|
|
237
317
|
|
|
238
318
|
| Command | Description |
|
|
239
319
|
|---------|-------------|
|
|
240
320
|
| `/route <query>` | Route a query |
|
|
241
321
|
| `/cost <text>` | Estimate cost |
|
|
242
322
|
| `/health` | Check all providers |
|
|
243
|
-
| `/models` |
|
|
244
|
-
| `/
|
|
245
|
-
| `/
|
|
246
|
-
| `/exit`
|
|
323
|
+
| `/models` | Browse all models |
|
|
324
|
+
| `/provider <name>` | Provider details |
|
|
325
|
+
| `/logs` | View logs |
|
|
326
|
+
| `/exit` | Exit TUI |
|
|
247
327
|
|
|
248
328
|
---
|
|
249
329
|
|
|
250
|
-
##
|
|
330
|
+
## 📊 Benchmark Comparison
|
|
251
331
|
|
|
252
|
-
|
|
332
|
+
| Metric | A3M Router | OpenRouter |
|
|
333
|
+
|--------|-------------|------------|
|
|
334
|
+
| **Cost Savings** | 92% | baseline |
|
|
335
|
+
| **Latency** | 14% faster | baseline |
|
|
336
|
+
| **Providers** | 47+ | 400+ |
|
|
337
|
+
| **Ensemble Voting** | ✅ | ❌ |
|
|
338
|
+
| **Self-Hostable** | ✅ | ❌ |
|
|
339
|
+
| **Open Source** | 100% | ❌ |
|
|
253
340
|
|
|
254
|
-
|
|
255
|
-
# Test all configured providers
|
|
256
|
-
a3m-router test
|
|
341
|
+
---
|
|
257
342
|
|
|
258
|
-
|
|
259
|
-
a3m-router status
|
|
343
|
+
## 🆘 Troubleshooting
|
|
260
344
|
|
|
261
|
-
|
|
262
|
-
|
|
345
|
+
### "Connection refused" errors
|
|
346
|
+
```bash
|
|
347
|
+
# Check if server is running
|
|
348
|
+
a3m-router status
|
|
263
349
|
|
|
264
|
-
#
|
|
265
|
-
a3m-router
|
|
350
|
+
# Restart server
|
|
351
|
+
a3m-router serve
|
|
266
352
|
```
|
|
267
353
|
|
|
268
|
-
###
|
|
269
|
-
|
|
354
|
+
### "No providers configured"
|
|
270
355
|
```bash
|
|
271
|
-
#
|
|
272
|
-
a3m-router
|
|
273
|
-
|
|
274
|
-
# Count tokens
|
|
275
|
-
a3m-router token "Hello, world! This is a test."
|
|
356
|
+
# Run setup
|
|
357
|
+
a3m-router setup
|
|
276
358
|
|
|
277
|
-
#
|
|
278
|
-
a3m-router
|
|
359
|
+
# Or manually set keys
|
|
360
|
+
a3m-router config set providers.deepseek.key YOUR_KEY
|
|
279
361
|
```
|
|
280
362
|
|
|
281
|
-
###
|
|
282
|
-
|
|
363
|
+
### Slow routing
|
|
283
364
|
```bash
|
|
284
|
-
#
|
|
285
|
-
a3m-router
|
|
286
|
-
"What is the speed of light?" \
|
|
287
|
-
"Write a haiku about coding" \
|
|
288
|
-
"Explain DNS in 3 sentences"
|
|
365
|
+
# Use fastest strategy
|
|
366
|
+
a3m-router config set routing.defaultStrategy fastest
|
|
289
367
|
|
|
290
|
-
#
|
|
291
|
-
a3m-router
|
|
368
|
+
# Or benchmark providers
|
|
369
|
+
a3m-router benchmark
|
|
292
370
|
```
|
|
293
371
|
|
|
294
|
-
###
|
|
295
|
-
|
|
372
|
+
### High costs
|
|
296
373
|
```bash
|
|
297
|
-
#
|
|
298
|
-
a3m-router
|
|
374
|
+
# Switch to cheapest
|
|
375
|
+
a3m-router config set routing.defaultStrategy cheapest
|
|
376
|
+
|
|
377
|
+
# Set budget cap
|
|
378
|
+
a3m-router config set limits.monthlyBudget 50
|
|
299
379
|
```
|
|
300
380
|
|
|
301
381
|
---
|
|
302
382
|
|
|
303
|
-
##
|
|
383
|
+
## 📚 Further Reading
|
|
304
384
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
385
|
+
| Document | Description |
|
|
386
|
+
|----------|-------------|
|
|
387
|
+
| [Quick Start Guide](./QUICK_START.md) | Get started in 5 minutes |
|
|
388
|
+
| [Configuration Guide](./CONFIGURATION.md) | Advanced configuration |
|
|
389
|
+
| [API Reference](./API.md) | SDK documentation |
|
|
390
|
+
| [Benchmark Results](./BENCHMARK.md) | Performance data |
|
|
391
|
+
| [GitHub Repo](https://github.com/Das-rebel/a3m-router) | Star, issues, PRs |
|
|
392
|
+
| [npm Package](https://www.npmjs.com/package/adaptive-memory-multi-model-router) | Downloads |
|
|
312
393
|
|
|
313
394
|
---
|
|
314
395
|
|
|
315
|
-
##
|
|
316
|
-
|
|
317
|
-
Add to `~/.zshrc` or `~/.bashrc`:
|
|
396
|
+
## ⚡ Quick Aliases
|
|
318
397
|
|
|
319
398
|
```bash
|
|
399
|
+
# Add to ~/.zshrc or ~/.bashrc
|
|
320
400
|
alias a3m='a3m-router'
|
|
321
401
|
alias a3m-route='a3m-router route'
|
|
322
402
|
alias a3m-compare='a3m-router compare'
|
|
@@ -324,16 +404,10 @@ alias a3m-serve='a3m-router serve'
|
|
|
324
404
|
alias a3m-health='a3m-router test'
|
|
325
405
|
alias a3m-cost='a3m-router cost'
|
|
326
406
|
alias a3m-providers='a3m-router providers'
|
|
327
|
-
alias a3m-
|
|
407
|
+
alias a3m-tui='a3m-router tui'
|
|
328
408
|
```
|
|
329
409
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
- [Quick Start Guide](./QUICK_START.md)
|
|
335
|
-
- [Configuration Guide](./CONFIGURATION.md)
|
|
336
|
-
- [API Reference](./API.md)
|
|
337
|
-
- [Benchmark Results](./BENCHMARK.md)
|
|
338
|
-
- [GitHub: Das-rebel/a3m-router](https://github.com/Das-rebel/a3m-router)
|
|
339
|
-
- [npm: adaptive-memory-multi-model-router](https://www.npmjs.com/package/adaptive-memory-multi-model-router)
|
|
410
|
+
```bash
|
|
411
|
+
# Reload shell
|
|
412
|
+
source ~/.zshrc
|
|
413
|
+
```
|
package/docs/comparison.md
CHANGED
|
@@ -17,7 +17,7 @@ A3M Router is the **only open-source LLM gateway** that does **parallel multi-LL
|
|
|
17
17
|
| **Parallel Execution** | **YES** (ensemble) | NO (sequential) | NO (fallback) | NO (load bal) | NO (sequential) | NO (fallback) |
|
|
18
18
|
| **Confidence Scoring** | **YES** (voting) | NO | NO | NO | NO | NO |
|
|
19
19
|
| **Result Merging** | **YES** (weighted) | NO | NO | NO | NO | NO |
|
|
20
|
-
| **Independent Benchmarks** |
|
|
20
|
+
| **Independent Benchmarks** | Pending submission | YES (8ms P95) | NO | NO | NO | NO |
|
|
21
21
|
| **Open Source** | YES (MIT) | YES (MIT) | NO | YES (MIT) | YES (MIT) | YES (MIT) |
|
|
22
22
|
| **Providers Supported** | 47+ | 100+ | 60+ | 25+ | 250+ | 100+ |
|
|
23
23
|
| **Streaming Support** | YES | YES | YES | YES | YES | YES |
|
|
@@ -94,7 +94,7 @@ Query -> Run GPT-4o + Claude + Gemini simultaneously -> Score -> Pick best
|
|
|
94
94
|
- **+26%** answer quality over single-best provider
|
|
95
95
|
- **-57%** hallucination rate (1.8% vs 4.2%)
|
|
96
96
|
- **+19pp** multi-step reasoning accuracy (91% vs 72%)
|
|
97
|
-
-
|
|
97
|
+
- Parallel ensemble execution achieves +26% answer quality over single-best provider (see benchmarks)
|
|
98
98
|
|
|
99
99
|
---
|
|
100
100
|
|