adaptive-memory-multi-model-router 2.12.0 ā 2.12.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/.env +2 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +13 -40
- package/.github/ISSUE_TEMPLATE/feature_request.md +10 -27
- package/.github/workflows/ci.yml +8 -49
- package/.github/workflows/pages.yml +37 -0
- package/Awesome-LLM/LICENSE.md +121 -0
- package/Awesome-LLM/README.md +625 -0
- package/Awesome-LLM/contributing.md +24 -0
- package/Awesome-LLM/paper_list/RLHF.md +1 -0
- package/Awesome-LLM/paper_list/Retrieval_Augmented_Generation.md +6 -0
- package/Awesome-LLM/paper_list/acceleration.md +10 -0
- package/Awesome-LLM/paper_list/alignment.md +20 -0
- package/Awesome-LLM/paper_list/application.md +19 -0
- package/Awesome-LLM/paper_list/augmentation.md +14 -0
- package/Awesome-LLM/paper_list/chain_of_thougt.md +16 -0
- package/Awesome-LLM/paper_list/code_pretraining.md +0 -0
- package/Awesome-LLM/paper_list/detection.md +11 -0
- package/Awesome-LLM/paper_list/evaluation.md +64 -0
- package/Awesome-LLM/paper_list/in_context_learning.md +4 -0
- package/Awesome-LLM/paper_list/instruction-tuning.md +35 -0
- package/Awesome-LLM/paper_list/moe.md +0 -0
- package/Awesome-LLM/paper_list/prompt_learning.md +15 -0
- package/Awesome-LLM/resources/DeepSpeed_light.svg +27 -0
- package/Awesome-LLM/resources/alpa-logo-cropped.png +0 -0
- package/Awesome-LLM/resources/colossal-ai_logo_vertical.png +0 -0
- package/Awesome-LLM/resources/creepy_llm.jpeg +0 -0
- package/Awesome-LLM/resources/image8.gif +0 -0
- package/Awesome-LLM/resources/jax_logo_250px.png +0 -0
- package/Awesome-LLM/resources/logo.png +0 -0
- package/Awesome-LLM/resources/nvidia.png +0 -0
- package/Awesome-LLM/resources/tensorflow.png +0 -0
- package/Awesome-LLM/resources//345/244/247/345/236/213/350/257/255/350/250/200/346/250/241/345/236/213/347/232/204/350/203/275/345/212/233/345/210/206/346/236/220/344/270/216/345/272/224/347/224/250 - 30min.pdf +0 -0
- package/README.md +5 -4
- package/SUBMISSIONS.md +43 -0
- package/assets/chart-cost-v2.svg +91 -0
- package/assets/chart-cost-v3.svg +143 -0
- package/assets/chart-features-v2.svg +132 -0
- package/assets/chart-features-v3.svg +211 -0
- package/assets/chart-growth-v2.svg +122 -0
- package/assets/chart-growth-v3.svg +189 -0
- package/assets/cost-simple.svg +64 -0
- package/assets/growth-simple.svg +69 -0
- package/assets/hero-diagram.svg +81 -0
- package/assets/logo-new.svg +21 -0
- package/assets/social-preview-new.svg +100 -0
- package/assets/social-v2.svg +130 -0
- package/assets/social-v3.svg +212 -0
- package/awesome-ai-gateways/CONTRIBUTING.md +49 -0
- package/awesome-ai-gateways/LICENSE +3 -0
- package/awesome-ai-gateways/README.md +190 -0
- package/awesome-selfhosted/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/awesome-selfhosted/.github/PULL_REQUEST_TEMPLATE.md +1 -0
- package/awesome-selfhosted/LICENSE +376 -0
- package/awesome-selfhosted/README.md +2303 -0
- package/awesome-selfhosted/_static/awesome.png +0 -0
- package/awesome-selfhosted/non-free.md +377 -0
- package/demo-new.tape +71 -0
- package/demo-real.sh +198 -0
- package/demo-simple.tape +205 -0
- package/demo.html +520 -0
- package/demo.tape +259 -0
- package/dist/cli/setupWizard.d.ts +136 -0
- package/dist/cli/setupWizard.js +142 -165
- package/dist/cli/setupWizard.js.map +1 -0
- package/dist/cli/tui.js +152 -0
- package/dist/providers/providerConfig.js +28 -1
- package/dist/providers/providerConfig.js.map +1 -1
- package/dist/server/proxyServer.js +15 -0
- package/docs/QUICK_START.md +43 -0
- package/docs/USE_CASES.md +59 -0
- package/docs/demo-auto.html +264 -0
- package/docs/demo.html +416 -0
- package/docs/index.html +112 -599
- package/index.html +667 -0
- package/package.json +26 -169
- package/src/providers/providerConfig.ts +29 -1
- package/docs/assets/cost-comparison.svg +0 -134
- package/docs/assets/growth-chart-animated.svg +0 -76
- package/docs/assets/og-banner.svg +0 -194
- package/docs/assets/social-preview.svg +0 -194
package/dist/cli/setupWizard.js
CHANGED
|
@@ -1,194 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* A3M Router Setup Wizard
|
|
3
4
|
* Interactive configuration wizard
|
|
4
5
|
*/
|
|
5
|
-
|
|
6
6
|
const fs = require('fs');
|
|
7
7
|
const path = require('path');
|
|
8
8
|
const readline = require('readline');
|
|
9
|
-
|
|
10
9
|
const CONFIG_DIR = path.join(process.env.HOME || '/tmp', '.config', 'a3m-router');
|
|
11
10
|
const CONFIG_FILE = path.join(CONFIG_DIR, 'providers.json');
|
|
12
|
-
|
|
13
11
|
// API key environment variable mappings
|
|
14
12
|
const API_KEY_ENV_MAP = {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
13
|
+
'GROQ_API_KEY': 'groq',
|
|
14
|
+
'OPENAI_API_KEY': 'openai',
|
|
15
|
+
'ANTHROPIC_API_KEY': 'anthropic',
|
|
16
|
+
'DEEPSEEK_API_KEY': 'deepseek',
|
|
17
|
+
'MISTRAL_API_KEY': 'mistral',
|
|
18
|
+
'GOOGLE_API_KEY': 'google',
|
|
19
|
+
'CEREBRAS_API_KEY': 'cerebras',
|
|
20
|
+
'TOGETHER_API_KEY': 'together',
|
|
21
|
+
'AI21_API_KEY': 'ai21',
|
|
22
|
+
'COHERE_API_KEY': 'cohere',
|
|
23
|
+
'MINIMAX_API_KEY': 'minimax',
|
|
24
|
+
'KIMI_API_KEY': 'kimi',
|
|
25
|
+
'MOONSHOT_API_KEY': 'moonshot',
|
|
26
|
+
'QWEN_API_KEY': 'qwen',
|
|
27
|
+
'ZHIPU_API_KEY': 'zhipu',
|
|
28
|
+
'YI_API_KEY': 'yi',
|
|
29
|
+
'BAICHUAN_API_KEY': 'baichuan',
|
|
32
30
|
};
|
|
33
|
-
|
|
34
31
|
// Provider metadata
|
|
35
32
|
const PROVIDER_INFO = {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
33
|
+
groq: { name: 'Groq', models: 'llama-3.3-70b-versatile', tier: 'free', strength: 'Fast, free tier' },
|
|
34
|
+
openai: { name: 'OpenAI', models: 'gpt-4o-mini', tier: 'paid', strength: 'GPT-4, most capable' },
|
|
35
|
+
anthropic: { name: 'Anthropic', models: 'claude-3.5-haiku', tier: 'paid', strength: 'Claude, best reasoning' },
|
|
36
|
+
deepseek: { name: 'DeepSeek', models: 'deepseek-chat-v3', tier: 'cheap', strength: 'Cheap, good code' },
|
|
37
|
+
mistral: { name: 'Mistral', models: 'mistral-small-latest', tier: 'cheap', strength: 'European, balanced' },
|
|
38
|
+
google: { name: 'Google AI', models: 'gemini-1.5-flash', tier: 'free', strength: 'Gemini, multimodal' },
|
|
39
|
+
cerebras: { name: 'Cerebras', models: 'llama-3.3-70b', tier: 'free', strength: 'Fastest inference' },
|
|
40
|
+
together: { name: 'Together AI', models: 'Llama-3.3-70B-Instruct', tier: 'cheap', strength: 'Managed, reliable' },
|
|
41
|
+
ai21: { name: 'AI21', models: 'jamba-1.5-medium', tier: 'paid', strength: 'Jamba, long context' },
|
|
42
|
+
cohere: { name: 'Cohere', models: 'command-r7b', tier: 'cheap', strength: 'Command series, fast' },
|
|
43
|
+
minimax: { name: 'MiniMax', models: 'abab6.5s-chat', tier: 'cheap', strength: 'Chinese, cheap' },
|
|
44
|
+
kimi: { name: 'Kimi/Moonshot', models: 'moonshot-v1-8k', tier: 'cheap', strength: 'Chinese, 128k context' },
|
|
45
|
+
moonshot: { name: 'Moonshot', models: 'moonshot-v1-8k', tier: 'cheap', strength: 'Chinese, good' },
|
|
46
|
+
qwen: { name: 'Qwen', models: 'qwen-turbo', tier: 'cheap', strength: 'Alibaba, multilingual' },
|
|
47
|
+
zhipu: { name: 'Zhipu GLM', models: 'glm-4', tier: 'cheap', strength: 'Chinese, smart' },
|
|
48
|
+
yi: { name: 'Yi', models: 'yi-large', tier: 'cheap', strength: 'Chinese, good reasoning' },
|
|
49
|
+
baichuan: { name: 'Baichuan', models: 'baichuan-4', tier: 'cheap', strength: 'Chinese, balanced' },
|
|
53
50
|
};
|
|
54
|
-
|
|
55
51
|
function createInterface() {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
return readline.createInterface({
|
|
53
|
+
input: process.stdin,
|
|
54
|
+
output: process.stdout
|
|
55
|
+
});
|
|
60
56
|
}
|
|
61
|
-
|
|
62
57
|
function question(rl, text) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
58
|
+
return new Promise((resolve) => {
|
|
59
|
+
rl.question(text, (answer) => resolve(answer));
|
|
60
|
+
});
|
|
66
61
|
}
|
|
67
|
-
|
|
68
62
|
async function detectApiKeys() {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
63
|
+
const detected = [];
|
|
64
|
+
for (const [envVar, providerId] of Object.entries(API_KEY_ENV_MAP)) {
|
|
65
|
+
if (process.env[envVar]) {
|
|
66
|
+
detected.push({ envVar, providerId, info: PROVIDER_INFO[providerId] });
|
|
67
|
+
}
|
|
73
68
|
}
|
|
74
|
-
|
|
75
|
-
return detected;
|
|
69
|
+
return detected;
|
|
76
70
|
}
|
|
77
|
-
|
|
78
71
|
async function runWizard() {
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (!fs.existsSync(CONFIG_DIR)) {
|
|
86
|
-
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Check for existing config
|
|
90
|
-
let existingConfig = {};
|
|
91
|
-
if (fs.existsSync(CONFIG_FILE)) {
|
|
92
|
-
try {
|
|
93
|
-
existingConfig = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
|
|
94
|
-
console.log('ā Found existing config at', CONFIG_FILE);
|
|
95
|
-
console.log(' Providers:', Object.keys(existingConfig.providers || {}).join(', '));
|
|
96
|
-
console.log('');
|
|
97
|
-
} catch (e) {
|
|
98
|
-
console.log('ā Could not read existing config, starting fresh\n');
|
|
72
|
+
console.log('\nš§ A3M Router Setup Wizard');
|
|
73
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāā\n');
|
|
74
|
+
const rl = createInterface();
|
|
75
|
+
// Ensure config directory exists
|
|
76
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
77
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
99
78
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
79
|
+
// Check for existing config
|
|
80
|
+
let existingConfig = {};
|
|
81
|
+
if (fs.existsSync(CONFIG_FILE)) {
|
|
82
|
+
try {
|
|
83
|
+
existingConfig = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
|
|
84
|
+
console.log('ā Found existing config at', CONFIG_FILE);
|
|
85
|
+
console.log(' Providers:', Object.keys(existingConfig.providers || {}).join(', '));
|
|
86
|
+
console.log('');
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
console.log('ā Could not read existing config, starting fresh\n');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Auto-detect API keys
|
|
93
|
+
console.log('š Scanning for API keys in environment...');
|
|
94
|
+
const detected = await detectApiKeys();
|
|
95
|
+
if (detected.length === 0) {
|
|
96
|
+
console.log('ā No API keys detected in environment.');
|
|
97
|
+
console.log(' Set any of: GROQ_API_KEY, OPENAI_API_KEY, DEEPSEEK_API_KEY, etc.\n');
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.log('ā Found', detected.length, 'API key(s):');
|
|
101
|
+
detected.forEach(({ envVar, providerId, info }) => {
|
|
102
|
+
console.log(' ā', envVar, 'ā', info?.name || providerId);
|
|
103
|
+
});
|
|
104
|
+
console.log('');
|
|
105
|
+
}
|
|
106
|
+
// Provider selection
|
|
107
|
+
const allProviders = Object.keys(PROVIDER_INFO);
|
|
108
|
+
const selected = new Set();
|
|
109
|
+
// Pre-select providers with detected keys
|
|
110
|
+
detected.forEach(({ providerId }) => selected.add(providerId));
|
|
111
|
+
console.log('š” Select providers to configure (comma-separated numbers, or "all"):');
|
|
114
112
|
console.log('');
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
// Pre-select providers with detected keys
|
|
122
|
-
detected.forEach(({ providerId }) => selected.add(providerId));
|
|
123
|
-
|
|
124
|
-
console.log('š” Select providers to configure (comma-separated numbers, or "all"):');
|
|
125
|
-
console.log('');
|
|
126
|
-
|
|
127
|
-
const numbered = allProviders.map((id, i) => ({ id, i }));
|
|
128
|
-
numbered.forEach(({ id, i }) => {
|
|
129
|
-
const info = PROVIDER_INFO[id];
|
|
130
|
-
const selected_mark = selected.has(id) ? '[x]' : '[ ]';
|
|
131
|
-
const tier_mark = info?.tier === 'free' ? '(FREE)' : info?.tier === 'cheap' ? '(cheap)' : '(paid)';
|
|
132
|
-
console.log(` ${String(i + 1).padStart(2)}. ${selected_mark} ${id.padEnd(12)} ${tier_mark} - ${info?.strength || ''}`);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
console.log('');
|
|
136
|
-
const answer = await question(rl, ' Enter numbers or "all" [all with keys detected]: ');
|
|
137
|
-
|
|
138
|
-
if (answer.toLowerCase().trim() === 'all') {
|
|
139
|
-
allProviders.forEach(id => selected.add(id));
|
|
140
|
-
} else if (answer.trim()) {
|
|
141
|
-
const nums = answer.split(',').map(s => parseInt(s.trim())).filter(n => !isNaN(n));
|
|
142
|
-
nums.forEach(n => {
|
|
143
|
-
const idx = n - 1;
|
|
144
|
-
if (idx >= 0 && idx < allProviders.length) {
|
|
145
|
-
selected.add(allProviders[idx]);
|
|
146
|
-
}
|
|
113
|
+
const numbered = allProviders.map((id, i) => ({ id, i }));
|
|
114
|
+
numbered.forEach(({ id, i }) => {
|
|
115
|
+
const info = PROVIDER_INFO[id];
|
|
116
|
+
const selected_mark = selected.has(id) ? '[x]' : '[ ]';
|
|
117
|
+
const tier_mark = info?.tier === 'free' ? '(FREE)' : info?.tier === 'cheap' ? '(cheap)' : '(paid)';
|
|
118
|
+
console.log(` ${String(i + 1).padStart(2)}. ${selected_mark} ${id.padEnd(12)} ${tier_mark} - ${info?.strength || ''}`);
|
|
147
119
|
});
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
enabled: true
|
|
120
|
+
console.log('');
|
|
121
|
+
const answer = await question(rl, ' Enter numbers or "all" [all with keys detected]: ');
|
|
122
|
+
if (answer.toLowerCase().trim() === 'all') {
|
|
123
|
+
allProviders.forEach(id => selected.add(id));
|
|
124
|
+
}
|
|
125
|
+
else if (answer.trim()) {
|
|
126
|
+
const nums = answer.split(',').map(s => parseInt(s.trim())).filter(n => !isNaN(n));
|
|
127
|
+
nums.forEach(n => {
|
|
128
|
+
const idx = n - 1;
|
|
129
|
+
if (idx >= 0 && idx < allProviders.length) {
|
|
130
|
+
selected.add(allProviders[idx]);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
console.log('\nā Selected providers:', Array.from(selected).join(', '));
|
|
135
|
+
// Build config
|
|
136
|
+
const config = {
|
|
137
|
+
version: '1.0',
|
|
138
|
+
providers: {}
|
|
168
139
|
};
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
140
|
+
selected.forEach(providerId => {
|
|
141
|
+
const info = PROVIDER_INFO[providerId];
|
|
142
|
+
const envKey = Object.entries(API_KEY_ENV_MAP).find(([k, v]) => v === providerId)?.[0];
|
|
143
|
+
config.providers[providerId] = {
|
|
144
|
+
name: info?.name || providerId,
|
|
145
|
+
apiKey: envKey ? process.env[envKey] : '',
|
|
146
|
+
models: [info?.models || 'default'],
|
|
147
|
+
type: 'api',
|
|
148
|
+
enabled: true
|
|
149
|
+
};
|
|
150
|
+
});
|
|
151
|
+
// Save config
|
|
152
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
153
|
+
console.log('\nā Config saved to', CONFIG_FILE);
|
|
154
|
+
// Test connections
|
|
155
|
+
console.log('\nš§Ŗ Testing connections...');
|
|
156
|
+
console.log(' (Skipped in wizard mode - run "npx a3m-router test" to verify)\n');
|
|
157
|
+
// Ready message
|
|
158
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
159
|
+
console.log('ā
A3M Router is ready!');
|
|
160
|
+
console.log('');
|
|
161
|
+
console.log(' Next steps:');
|
|
162
|
+
console.log(' 1. npx a3m-router serve # Start proxy server');
|
|
163
|
+
console.log(' 2. npx a3m-router test # Test provider connections');
|
|
164
|
+
console.log(' 3. npx a3m-router route "hi" # Try routing a query');
|
|
165
|
+
console.log('');
|
|
166
|
+
console.log(' Docs: https://github.com/Das-rebel/adaptive-memory-multi-model-router');
|
|
167
|
+
console.log('');
|
|
168
|
+
rl.close();
|
|
192
169
|
}
|
|
193
|
-
|
|
194
170
|
module.exports = { runWizard };
|
|
171
|
+
//# sourceMappingURL=setupWizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupWizard.js","sourceRoot":"","sources":["../../src/cli/setupWizard.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/tui.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* A3M Router Quick TUI
|
|
4
|
+
* Zero-config experience - no API key needed for free tier
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const args = process.argv.slice(2);
|
|
8
|
+
|
|
9
|
+
if (args.length === 0) {
|
|
10
|
+
console.log(`
|
|
11
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
12
|
+
ā š A3M Router - Zero Config ā
|
|
13
|
+
ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£
|
|
14
|
+
ā ā
|
|
15
|
+
ā One prompt in. The right model out. ā
|
|
16
|
+
ā ā
|
|
17
|
+
ā Usage: ā
|
|
18
|
+
ā a3m hello world # Route a query ā
|
|
19
|
+
ā a3m --serve # Start proxy ā
|
|
20
|
+
ā a3m --setup # Configure API keys ā
|
|
21
|
+
ā a3m --demo # Try without keys ā
|
|
22
|
+
ā ā
|
|
23
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
24
|
+
`);
|
|
25
|
+
process.exit(0);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const command = args[0];
|
|
29
|
+
|
|
30
|
+
// Demo mode - works without API key
|
|
31
|
+
if (command === '--demo') {
|
|
32
|
+
console.log(`
|
|
33
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
34
|
+
š® A3M Router Demo Mode
|
|
35
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
36
|
+
|
|
37
|
+
Try these queries:
|
|
38
|
+
⢠"Write Python hello world"
|
|
39
|
+
⢠"Explain quantum physics"
|
|
40
|
+
⢠"Translate to Japanese: Hello"
|
|
41
|
+
⢠"Write a haiku about coding"
|
|
42
|
+
`);
|
|
43
|
+
|
|
44
|
+
const readline = require('readline');
|
|
45
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
46
|
+
|
|
47
|
+
const demoResults = [
|
|
48
|
+
{ provider: 'groq', model: 'llama-3.3-70b-versatile', tier: 'free', cost: '$0.00' },
|
|
49
|
+
{ provider: 'deepseek', model: 'deepseek-chat-v3', tier: 'cheap', cost: '$0.00' },
|
|
50
|
+
{ provider: 'kimi', model: 'moonshot-v1-8k', tier: 'cheap', cost: '$0.00' },
|
|
51
|
+
{ provider: 'openai', model: 'gpt-4o-mini', tier: 'paid', cost: '$0.00' },
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
let count = 0;
|
|
55
|
+
function ask() {
|
|
56
|
+
rl.question('\nš Query: ', (q) => {
|
|
57
|
+
if (!q || q.toLowerCase() === 'exit') {
|
|
58
|
+
console.log('\nš Ready for the real thing? Run: npm install adaptive-memory-multi-model-router\n');
|
|
59
|
+
rl.close();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const r = demoResults[count++ % demoResults.length];
|
|
63
|
+
console.log(`\n š Best: ${r.provider} / ${r.model}`);
|
|
64
|
+
console.log(` š° Cost: ${r.cost} (${r.tier})`);
|
|
65
|
+
ask();
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
ask();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Serve mode
|
|
73
|
+
if (command === '--serve') {
|
|
74
|
+
console.log(`
|
|
75
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
76
|
+
š A3M Router Proxy Server
|
|
77
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
78
|
+
|
|
79
|
+
Server: http://localhost:8787/v1/chat/completions
|
|
80
|
+
API: OpenAI-compatible
|
|
81
|
+
|
|
82
|
+
No API keys configured? Add free tier:
|
|
83
|
+
GROQ_API_KEY=your_key npx a3m-router serve
|
|
84
|
+
|
|
85
|
+
Or run setup: a3m --setup
|
|
86
|
+
`);
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
const server = require('./server/proxyServer.js');
|
|
90
|
+
const port = parseInt(args[1]) || 8787;
|
|
91
|
+
server.createProxyServer({ port });
|
|
92
|
+
console.log(`\nā
Server running at http://localhost:${port}`);
|
|
93
|
+
} catch (e) {
|
|
94
|
+
console.log('\nā ļø Run "npm install" first, then "npm run build"\n');
|
|
95
|
+
}
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Setup mode
|
|
100
|
+
if (command === '--setup') {
|
|
101
|
+
const wizard = require('./cli/setupWizard.js');
|
|
102
|
+
wizard.runWizard();
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Zero-config mode - route with free tier defaults
|
|
107
|
+
const query = args.join(' ');
|
|
108
|
+
|
|
109
|
+
// Check for GROQ_API_KEY first (free tier)
|
|
110
|
+
if (process.env.GROQ_API_KEY) {
|
|
111
|
+
console.log('\nš Routing: "' + query + '"');
|
|
112
|
+
console.log('š” Using free tier (Groq)...\n');
|
|
113
|
+
|
|
114
|
+
// Quick route via groq
|
|
115
|
+
const { routeQuery } = require('./index.js');
|
|
116
|
+
routeQuery(query).then(r => {
|
|
117
|
+
console.log(` š Provider: ${r.provider || 'groq'}`);
|
|
118
|
+
console.log(` š¤ Model: ${r.model || 'llama-3.3-70b-versatile'}`);
|
|
119
|
+
console.log(` š° Est: $${(r.estimated_cost || 0.0001).toFixed(6)}`);
|
|
120
|
+
}).catch(e => {
|
|
121
|
+
console.log(' ā ļø Error:', e.message);
|
|
122
|
+
console.log(' Tip: Get free key at https://console.groq.com\n');
|
|
123
|
+
});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// No API key - show helpful message
|
|
128
|
+
console.log(`
|
|
129
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
130
|
+
ā ļø No API key detected
|
|
131
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
132
|
+
|
|
133
|
+
A3M Router needs at least one API key to route queries.
|
|
134
|
+
|
|
135
|
+
š„ FREE TIER OPTIONS:
|
|
136
|
+
1. Groq (fastest, 1000+ req/day free)
|
|
137
|
+
ā https://console.groq.com/apikeys
|
|
138
|
+
ā Set: export GROQ_API_KEY=your_key
|
|
139
|
+
|
|
140
|
+
2. Cerebras (fastest inference, free)
|
|
141
|
+
ā https://cerebras.ai/labs
|
|
142
|
+
ā Set: export CEREBRAS_API_KEY=your_key
|
|
143
|
+
|
|
144
|
+
3. Google AI (Gemini, free tier)
|
|
145
|
+
ā https://aistudio.google.com/app/apikey
|
|
146
|
+
ā Set: export GOOGLE_API_KEY=your_key
|
|
147
|
+
|
|
148
|
+
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
149
|
+
|
|
150
|
+
Quick setup: npx a3m --setup
|
|
151
|
+
Quick start: GROQ_API_KEY=your_key npx a3m-router serve
|
|
152
|
+
`);
|
|
@@ -294,7 +294,7 @@ exports.DEFAULT_PROVIDERS = {
|
|
|
294
294
|
name: 'DeepSeek',
|
|
295
295
|
baseUrl: 'https://api.deepseek.com/v1/chat/completions',
|
|
296
296
|
apiKeyEnv: 'DEEPSEEK_API_KEY',
|
|
297
|
-
models: ['deepseek-
|
|
297
|
+
models: ['deepseek-v4-flash', 'deepseek-v4-pro'],
|
|
298
298
|
costPerK: { input: 0.14, output: 0.28 },
|
|
299
299
|
tier: 'mid',
|
|
300
300
|
format: 'openai',
|
|
@@ -652,6 +652,33 @@ exports.DEFAULT_PROVIDERS = {
|
|
|
652
652
|
priority: 36,
|
|
653
653
|
maxTokens: 8192,
|
|
654
654
|
},
|
|
655
|
+
// ========================================================================
|
|
656
|
+
// NVIDIA NIM (free tier via NVIDIA API key)
|
|
657
|
+
// ========================================================================
|
|
658
|
+
nvidia: {
|
|
659
|
+
id: 'nvidia',
|
|
660
|
+
name: 'NVIDIA NIM',
|
|
661
|
+
baseUrl: 'https://integrate.api.nvidia.com/v1/chat/completions',
|
|
662
|
+
apiKeyEnv: 'NVIDIA_API_KEY',
|
|
663
|
+
models: [
|
|
664
|
+
'meta/llama-3.1-8b-instruct',
|
|
665
|
+
'meta/llama-3.3-70b-instruct',
|
|
666
|
+
'meta/llama-4-maverick-17b-128e-instruct',
|
|
667
|
+
'nvidia/nemotron-mini-4b-instruct',
|
|
668
|
+
'nvidia/nemotron-3-super-120b-a12b',
|
|
669
|
+
'google/gemma-4-31b-it',
|
|
670
|
+
'qwen/qwen3.5-397b-a17b',
|
|
671
|
+
'minimaxai/minimax-m2.7',
|
|
672
|
+
'mistralai/mistral-large-3-675b-instruct-2512',
|
|
673
|
+
'z-ai/glm-5.1',
|
|
674
|
+
],
|
|
675
|
+
costPerK: { input: 0, output: 0 },
|
|
676
|
+
tier: 'free',
|
|
677
|
+
format: 'openai',
|
|
678
|
+
type: 'api',
|
|
679
|
+
priority: 4,
|
|
680
|
+
maxTokens: 8192,
|
|
681
|
+
},
|
|
655
682
|
};
|
|
656
683
|
// ============================================================
|
|
657
684
|
// RUNTIME STATE
|