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.
Files changed (80) hide show
  1. package/.env +2 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +13 -40
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +10 -27
  4. package/.github/workflows/ci.yml +8 -49
  5. package/.github/workflows/pages.yml +37 -0
  6. package/Awesome-LLM/LICENSE.md +121 -0
  7. package/Awesome-LLM/README.md +625 -0
  8. package/Awesome-LLM/contributing.md +24 -0
  9. package/Awesome-LLM/paper_list/RLHF.md +1 -0
  10. package/Awesome-LLM/paper_list/Retrieval_Augmented_Generation.md +6 -0
  11. package/Awesome-LLM/paper_list/acceleration.md +10 -0
  12. package/Awesome-LLM/paper_list/alignment.md +20 -0
  13. package/Awesome-LLM/paper_list/application.md +19 -0
  14. package/Awesome-LLM/paper_list/augmentation.md +14 -0
  15. package/Awesome-LLM/paper_list/chain_of_thougt.md +16 -0
  16. package/Awesome-LLM/paper_list/code_pretraining.md +0 -0
  17. package/Awesome-LLM/paper_list/detection.md +11 -0
  18. package/Awesome-LLM/paper_list/evaluation.md +64 -0
  19. package/Awesome-LLM/paper_list/in_context_learning.md +4 -0
  20. package/Awesome-LLM/paper_list/instruction-tuning.md +35 -0
  21. package/Awesome-LLM/paper_list/moe.md +0 -0
  22. package/Awesome-LLM/paper_list/prompt_learning.md +15 -0
  23. package/Awesome-LLM/resources/DeepSpeed_light.svg +27 -0
  24. package/Awesome-LLM/resources/alpa-logo-cropped.png +0 -0
  25. package/Awesome-LLM/resources/colossal-ai_logo_vertical.png +0 -0
  26. package/Awesome-LLM/resources/creepy_llm.jpeg +0 -0
  27. package/Awesome-LLM/resources/image8.gif +0 -0
  28. package/Awesome-LLM/resources/jax_logo_250px.png +0 -0
  29. package/Awesome-LLM/resources/logo.png +0 -0
  30. package/Awesome-LLM/resources/nvidia.png +0 -0
  31. package/Awesome-LLM/resources/tensorflow.png +0 -0
  32. 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
  33. package/README.md +5 -4
  34. package/SUBMISSIONS.md +43 -0
  35. package/assets/chart-cost-v2.svg +91 -0
  36. package/assets/chart-cost-v3.svg +143 -0
  37. package/assets/chart-features-v2.svg +132 -0
  38. package/assets/chart-features-v3.svg +211 -0
  39. package/assets/chart-growth-v2.svg +122 -0
  40. package/assets/chart-growth-v3.svg +189 -0
  41. package/assets/cost-simple.svg +64 -0
  42. package/assets/growth-simple.svg +69 -0
  43. package/assets/hero-diagram.svg +81 -0
  44. package/assets/logo-new.svg +21 -0
  45. package/assets/social-preview-new.svg +100 -0
  46. package/assets/social-v2.svg +130 -0
  47. package/assets/social-v3.svg +212 -0
  48. package/awesome-ai-gateways/CONTRIBUTING.md +49 -0
  49. package/awesome-ai-gateways/LICENSE +3 -0
  50. package/awesome-ai-gateways/README.md +190 -0
  51. package/awesome-selfhosted/.github/ISSUE_TEMPLATE/config.yml +5 -0
  52. package/awesome-selfhosted/.github/PULL_REQUEST_TEMPLATE.md +1 -0
  53. package/awesome-selfhosted/LICENSE +376 -0
  54. package/awesome-selfhosted/README.md +2303 -0
  55. package/awesome-selfhosted/_static/awesome.png +0 -0
  56. package/awesome-selfhosted/non-free.md +377 -0
  57. package/demo-new.tape +71 -0
  58. package/demo-real.sh +198 -0
  59. package/demo-simple.tape +205 -0
  60. package/demo.html +520 -0
  61. package/demo.tape +259 -0
  62. package/dist/cli/setupWizard.d.ts +136 -0
  63. package/dist/cli/setupWizard.js +142 -165
  64. package/dist/cli/setupWizard.js.map +1 -0
  65. package/dist/cli/tui.js +152 -0
  66. package/dist/providers/providerConfig.js +28 -1
  67. package/dist/providers/providerConfig.js.map +1 -1
  68. package/dist/server/proxyServer.js +15 -0
  69. package/docs/QUICK_START.md +43 -0
  70. package/docs/USE_CASES.md +59 -0
  71. package/docs/demo-auto.html +264 -0
  72. package/docs/demo.html +416 -0
  73. package/docs/index.html +112 -599
  74. package/index.html +667 -0
  75. package/package.json +26 -169
  76. package/src/providers/providerConfig.ts +29 -1
  77. package/docs/assets/cost-comparison.svg +0 -134
  78. package/docs/assets/growth-chart-animated.svg +0 -76
  79. package/docs/assets/og-banner.svg +0 -194
  80. package/docs/assets/social-preview.svg +0 -194
@@ -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
- 'GROQ_API_KEY': 'groq',
16
- 'OPENAI_API_KEY': 'openai',
17
- 'ANTHROPIC_API_KEY': 'anthropic',
18
- 'DEEPSEEK_API_KEY': 'deepseek',
19
- 'MISTRAL_API_KEY': 'mistral',
20
- 'GOOGLE_API_KEY': 'google',
21
- 'CEREBRAS_API_KEY': 'cerebras',
22
- 'TOGETHER_API_KEY': 'together',
23
- 'AI21_API_KEY': 'ai21',
24
- 'COHERE_API_KEY': 'cohere',
25
- 'MINIMAX_API_KEY': 'minimax',
26
- 'KIMI_API_KEY': 'kimi',
27
- 'MOONSHOT_API_KEY': 'moonshot',
28
- 'QWEN_API_KEY': 'qwen',
29
- 'ZHIPU_API_KEY': 'zhipu',
30
- 'YI_API_KEY': 'yi',
31
- 'BAICHUAN_API_KEY': 'baichuan',
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
- groq: { name: 'Groq', models: 'llama-3.3-70b-versatile', tier: 'free', strength: 'Fast, free tier' },
37
- openai: { name: 'OpenAI', models: 'gpt-4o-mini', tier: 'paid', strength: 'GPT-4, most capable' },
38
- anthropic: { name: 'Anthropic', models: 'claude-3.5-haiku', tier: 'paid', strength: 'Claude, best reasoning' },
39
- deepseek: { name: 'DeepSeek', models: 'deepseek-chat-v3', tier: 'cheap', strength: 'Cheap, good code' },
40
- mistral: { name: 'Mistral', models: 'mistral-small-latest', tier: 'cheap', strength: 'European, balanced' },
41
- google: { name: 'Google AI', models: 'gemini-1.5-flash', tier: 'free', strength: 'Gemini, multimodal' },
42
- cerebras: { name: 'Cerebras', models: 'llama-3.3-70b', tier: 'free', strength: 'Fastest inference' },
43
- together: { name: 'Together AI', models: 'Llama-3.3-70B-Instruct', tier: 'cheap', strength: 'Managed, reliable' },
44
- ai21: { name: 'AI21', models: 'jamba-1.5-medium', tier: 'paid', strength: 'Jamba, long context' },
45
- cohere: { name: 'Cohere', models: 'command-r7b', tier: 'cheap', strength: 'Command series, fast' },
46
- minimax: { name: 'MiniMax', models: 'abab6.5s-chat', tier: 'cheap', strength: 'Chinese, cheap' },
47
- kimi: { name: 'Kimi/Moonshot', models: 'moonshot-v1-8k', tier: 'cheap', strength: 'Chinese, 128k context' },
48
- moonshot: { name: 'Moonshot', models: 'moonshot-v1-8k', tier: 'cheap', strength: 'Chinese, good' },
49
- qwen: { name: 'Qwen', models: 'qwen-turbo', tier: 'cheap', strength: 'Alibaba, multilingual' },
50
- zhipu: { name: 'Zhipu GLM', models: 'glm-4', tier: 'cheap', strength: 'Chinese, smart' },
51
- yi: { name: 'Yi', models: 'yi-large', tier: 'cheap', strength: 'Chinese, good reasoning' },
52
- baichuan: { name: 'Baichuan', models: 'baichuan-4', tier: 'cheap', strength: 'Chinese, balanced' },
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
- return readline.createInterface({
57
- input: process.stdin,
58
- output: process.stdout
59
- });
52
+ return readline.createInterface({
53
+ input: process.stdin,
54
+ output: process.stdout
55
+ });
60
56
  }
61
-
62
57
  function question(rl, text) {
63
- return new Promise((resolve) => {
64
- rl.question(text, (answer) => resolve(answer));
65
- });
58
+ return new Promise((resolve) => {
59
+ rl.question(text, (answer) => resolve(answer));
60
+ });
66
61
  }
67
-
68
62
  async function detectApiKeys() {
69
- const detected = [];
70
- for (const [envVar, providerId] of Object.entries(API_KEY_ENV_MAP)) {
71
- if (process.env[envVar]) {
72
- detected.push({ envVar, providerId, info: PROVIDER_INFO[providerId] });
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
- console.log('\nšŸ”§ A3M Router Setup Wizard');
80
- console.log('━━━━━━━━━━━━━━━━━━━━━━━━━\n');
81
-
82
- const rl = createInterface();
83
-
84
- // Ensure config directory exists
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
- // Auto-detect API keys
103
- console.log('šŸ” Scanning for API keys in environment...');
104
- const detected = await detectApiKeys();
105
-
106
- if (detected.length === 0) {
107
- console.log('⚠ No API keys detected in environment.');
108
- console.log(' Set any of: GROQ_API_KEY, OPENAI_API_KEY, DEEPSEEK_API_KEY, etc.\n');
109
- } else {
110
- console.log('āœ“ Found', detected.length, 'API key(s):');
111
- detected.forEach(({ envVar, providerId, info }) => {
112
- console.log(' āœ“', envVar, '→', info?.name || providerId);
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
- // Provider selection
118
- const allProviders = Object.keys(PROVIDER_INFO);
119
- const selected = new Set();
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
- console.log('\nāœ“ Selected providers:', Array.from(selected).join(', '));
151
-
152
- // Build config
153
- const config = {
154
- version: '1.0',
155
- providers: {}
156
- };
157
-
158
- selected.forEach(providerId => {
159
- const info = PROVIDER_INFO[providerId];
160
- const envKey = Object.entries(API_KEY_ENV_MAP).find(([k, v]) => v === providerId)?.[0];
161
-
162
- config.providers[providerId] = {
163
- name: info?.name || providerId,
164
- apiKey: envKey ? process.env[envKey] : '',
165
- models: [info?.models || 'default'],
166
- type: 'api',
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
- // Save config
172
- fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
173
- console.log('\nāœ“ Config saved to', CONFIG_FILE);
174
-
175
- // Test connections
176
- console.log('\n🧪 Testing connections...');
177
- console.log(' (Skipped in wizard mode - run "npx a3m-router test" to verify)\n');
178
-
179
- // Ready message
180
- console.log('━━━━━━━━━━━━━━━━━━━━━━━━━');
181
- console.log('āœ… A3M Router is ready!');
182
- console.log('');
183
- console.log(' Next steps:');
184
- console.log(' 1. npx a3m-router serve # Start proxy server');
185
- console.log(' 2. npx a3m-router test # Test provider connections');
186
- console.log(' 3. npx a3m-router route "hi" # Try routing a query');
187
- console.log('');
188
- console.log(' Docs: https://github.com/Das-rebel/adaptive-memory-multi-model-router');
189
- console.log('');
190
-
191
- rl.close();
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":";AAAA;;;GAGG;AAEH,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAErC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAClF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;AAE5D,wCAAwC;AACxC,MAAM,eAAe,GAAG;IACtB,cAAc,EAAE,MAAM;IACtB,gBAAgB,EAAE,QAAQ;IAC1B,mBAAmB,EAAE,WAAW;IAChC,kBAAkB,EAAE,UAAU;IAC9B,iBAAiB,EAAE,SAAS;IAC5B,gBAAgB,EAAE,QAAQ;IAC1B,kBAAkB,EAAE,UAAU;IAC9B,kBAAkB,EAAE,UAAU;IAC9B,cAAc,EAAE,MAAM;IACtB,gBAAgB,EAAE,QAAQ;IAC1B,iBAAiB,EAAE,SAAS;IAC5B,cAAc,EAAE,MAAM;IACtB,kBAAkB,EAAE,UAAU;IAC9B,cAAc,EAAE,MAAM;IACtB,eAAe,EAAE,OAAO;IACxB,YAAY,EAAE,IAAI;IAClB,kBAAkB,EAAE,UAAU;CAC/B,CAAC;AAEF,oBAAoB;AACpB,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE;IACpG,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,EAAE;IAChG,SAAS,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,wBAAwB,EAAE;IAC9G,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE;IACvG,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE;IAC3G,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE;IACvG,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE;IACpG,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,wBAAwB,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE;IACjH,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,EAAE;IACjG,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE;IAClG,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE;IAChG,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IAC3G,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE;IAClG,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE;IAC9F,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE;IACxF,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,yBAAyB,EAAE;IAC1F,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE;CACnG,CAAC;AAEF,SAAS,eAAe;IACtB,OAAO,QAAQ,CAAC,eAAe,CAAC;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,EAAE,EAAE,IAAI;IACxB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,KAAK,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QACnE,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAE7B,iCAAiC;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,4BAA4B;IAC5B,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,WAAW,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACpF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;IAEvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACtF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACvD,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,IAAI,UAAU,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,qBAAqB;IACrB,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;IAE3B,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnG,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,aAAa,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,MAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1H,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,EAAE,qDAAqD,CAAC,CAAC;IAEzF,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;QAC1C,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACf,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAClB,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC1C,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAExE,eAAe;IACf,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,EAAE;KACd,CAAC;IAEF,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;QAC5B,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvF,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG;YAC7B,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,UAAU;YAC9B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YACzC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC;YACnC,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,cAAc;IACd,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;IAEhD,mBAAmB;IACnB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IAElF,gBAAgB;IAChB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,EAAE,CAAC,KAAK,EAAE,CAAC;AACb,CAAC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,SAAS,EAAE,CAAC"}
@@ -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-chat', 'deepseek-reasoner', 'deepseek-coder'],
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