adaptive-memory-multi-model-router 2.16.0 โ†’ 2.16.1

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 (245) hide show
  1. package/.github/workflows/adapters-ci.yml +142 -0
  2. package/.github/workflows/auto-submit-sitemap.yml +41 -0
  3. package/.github/workflows/ci.yml +2 -5
  4. package/.github/workflows/mcp-pypi-publish.yml +34 -0
  5. package/.github/workflows/pypi-publish.yml +146 -0
  6. package/.github/workflows/tmlpd-publish.yml +23 -0
  7. package/README.md +245 -148
  8. package/RELEASE_v2.16.0.md +149 -0
  9. package/TECHNICAL_README.md +253 -0
  10. package/adapters/README.md +36 -0
  11. package/adapters/__init__.py +25 -0
  12. package/adapters/a3m_adapter/__init__.py +51 -0
  13. package/adapters/a3m_adapter/adapter/__init__.py +22 -0
  14. package/adapters/a3m_adapter/adapter/autogen.py +169 -0
  15. package/adapters/a3m_adapter/adapter/config.py +100 -0
  16. package/adapters/a3m_adapter/adapter/haystack.py +197 -0
  17. package/adapters/a3m_adapter/adapter/langchain.py +155 -0
  18. package/adapters/a3m_adapter/adapter/langgraph.py +196 -0
  19. package/adapters/a3m_adapter/adapter/llamaindex.py +162 -0
  20. package/adapters/a3m_adapter/adapter/pinecone.py +217 -0
  21. package/adapters/a3m_adapter/adapter/vercel.py +188 -0
  22. package/adapters/a3m_adapter/tests/__init__.py +1 -0
  23. package/adapters/a3m_adapter/tests/test_adapters.py +118 -0
  24. package/adapters/a3m_adapter/tests/test_integration.py +80 -0
  25. package/adapters/requirements-dev.txt +6 -0
  26. package/adapters/requirements.txt +4 -0
  27. package/adapters/setup.py +23 -0
  28. package/demo.py +251 -0
  29. package/discoverability-diagnosis.md +280 -0
  30. package/dist/analytics/costAnalytics.d.ts.map +1 -1
  31. package/dist/benchmark/reproducible.d.ts.map +1 -1
  32. package/dist/cache/semanticCache.d.ts.map +1 -1
  33. package/dist/cli/setupWizard.d.ts +257 -50
  34. package/dist/cli/setupWizard.d.ts.map +1 -1
  35. package/dist/cli/setupWizard.js +419 -109
  36. package/dist/cli/setupWizard.js.map +1 -1
  37. package/dist/cli/tui.js +96 -67
  38. package/dist/cli.js +9 -0
  39. package/dist/cost/budgetEnforcer.d.ts.map +1 -1
  40. package/dist/cost/costTracker.d.ts.map +1 -1
  41. package/dist/ensemble/multiRoundDialog.d.ts.map +1 -1
  42. package/dist/ensemble/shapleyValue.d.ts.map +1 -1
  43. package/dist/ensemble.d.ts +1 -1
  44. package/dist/ensemble.js +141 -0
  45. package/dist/integrations/langchainAdapter.d.ts.map +1 -1
  46. package/dist/integrations/langchainAdapter.js +3 -3
  47. package/dist/integrations/langchainAdapter.js.map +1 -1
  48. package/dist/integrations/oauth.d.ts.map +1 -1
  49. package/dist/integrations/scienceAdapter.d.ts.map +1 -1
  50. package/dist/memory/autoFetch.d.ts.map +1 -1
  51. package/dist/memory/hybridMemory.d.ts.map +1 -1
  52. package/dist/memory/memoryTree.d.ts.map +1 -1
  53. package/dist/memory/obsidianVault.d.ts.map +1 -1
  54. package/dist/memory/reasoningBank.d.ts.map +1 -1
  55. package/dist/observability/metrics.d.ts.map +1 -1
  56. package/dist/observability/tracer.d.ts.map +1 -1
  57. package/dist/providers/providerConfig.d.ts.map +1 -1
  58. package/dist/providers/providerConfig.js +32 -17
  59. package/dist/providers/providerConfig.js.map +1 -1
  60. package/dist/routing/advancedRouter.d.ts.map +1 -1
  61. package/dist/routing/advancedRouter.js +106 -14
  62. package/dist/routing/advancedRouter.js.map +1 -1
  63. package/dist/routing/providerHealth.d.ts.map +1 -1
  64. package/dist/routing/providerRetry.d.ts.map +1 -1
  65. package/dist/routing/shadowSampler.js.map +1 -1
  66. package/dist/security/guardrails.d.ts.map +1 -1
  67. package/dist/server/handlers/chatHandler.d.ts.map +1 -1
  68. package/dist/server/handlers/completionsHandler.d.ts.map +1 -1
  69. package/dist/server/handlers/embeddingsHandler.d.ts.map +1 -1
  70. package/dist/server/handlers/healthHandler.d.ts.map +1 -1
  71. package/dist/server/handlers/metricsHandler.d.ts.map +1 -1
  72. package/dist/server/handlers/modelsHandler.d.ts.map +1 -1
  73. package/dist/server/metrics.d.ts.map +1 -1
  74. package/dist/server/proxyServer.d.ts.map +1 -1
  75. package/dist/server/router.d.ts.map +1 -1
  76. package/dist/server/state.d.ts.map +1 -1
  77. package/dist/skills/__tests__/skill_manager.test.js +5 -265
  78. package/dist/skills/__tests__/skill_manager.test.js.map +1 -1
  79. package/dist/utils/tokenUtils.d.ts.map +1 -1
  80. package/docker-compose.yml +84 -60
  81. package/docs/ARTICLE_Biology_Inspired_Routing.md +208 -0
  82. package/docs/ARTICLE_Master.md +78 -0
  83. package/docs/ARTICLE_Master_CN.md +78 -0
  84. package/docs/ARTICLE_OpenRouter_Stripe.md +140 -0
  85. package/docs/DEVPTO_ARTICLE.md +84 -0
  86. package/docs/HUMAN_STYLE_GUIDE.md +75 -0
  87. package/docs/IMPRINT_PLAN.md +88 -0
  88. package/docs/OPENROUTER_ALTERNATIVE.md +184 -0
  89. package/docs/SOCIAL_CAMPAIGN.md +316 -0
  90. package/docs/anthropic.html +45 -0
  91. package/docs/best-llm-routers-2025.html +157 -0
  92. package/docs/cerebras.html +43 -0
  93. package/docs/cli-cheatsheet.md +286 -212
  94. package/docs/comparison.md +2 -2
  95. package/docs/deepseek.html +44 -0
  96. package/docs/google.html +47 -0
  97. package/docs/groq.html +44 -0
  98. package/docs/llms-full.txt +360 -138
  99. package/docs/llms.txt +70 -71
  100. package/docs/mistral.html +43 -0
  101. package/docs/ollama.html +50 -0
  102. package/docs/openai.html +57 -0
  103. package/docs/sitemap.xml +69 -57
  104. package/docs-site/blog/best-llm-routers-2025.html +157 -0
  105. package/docs-site/index.html +68 -9
  106. package/docs-site/providers/anthropic.html +45 -0
  107. package/docs-site/providers/cerebras.html +43 -0
  108. package/docs-site/providers/deepseek.html +44 -0
  109. package/docs-site/providers/google.html +47 -0
  110. package/docs-site/providers/groq.html +44 -0
  111. package/docs-site/providers/index.html +41 -0
  112. package/docs-site/providers/mistral.html +43 -0
  113. package/docs-site/providers/ollama.html +50 -0
  114. package/docs-site/providers/openai.html +57 -0
  115. package/docs-site/sitemap.xml +69 -0
  116. package/llms.txt +70 -62
  117. package/package.json +44 -182
  118. package/packages/agentkit-adapter/LICENSE +21 -0
  119. package/packages/agentkit-adapter/README.md +126 -0
  120. package/packages/agentkit-adapter/examples/agentkit-example.ts +139 -0
  121. package/packages/agentkit-adapter/package.json +57 -0
  122. package/packages/agentkit-adapter/src/adapter.ts +381 -0
  123. package/packages/agentkit-adapter/src/index.ts +36 -0
  124. package/packages/agentkit-adapter/src/types.ts +105 -0
  125. package/packages/agentkit-adapter/src/util.ts +13 -0
  126. package/packages/agentkit-adapter/tsconfig.json +22 -0
  127. package/prometheus.yml +8 -0
  128. package/python/README.md +35 -81
  129. package/python/a3m/__init__.py +32 -3
  130. package/python/a3m/adapters/__init__.py +21 -0
  131. package/python/a3m/adapters/langchain.py +190 -0
  132. package/python/a3m/adapters/llamaindex.py +249 -0
  133. package/python/a3m/adapters/qdrant.py +240 -0
  134. package/python/a3m/adapters/weaviate.py +263 -0
  135. package/python/a3m/client.py +5 -0
  136. package/python/build_verify.sh +32 -0
  137. package/python/mcp-server/README.md +172 -0
  138. package/python/mcp-server/a3m_mcp/__init__.py +25 -0
  139. package/python/mcp-server/a3m_mcp/__main__.py +15 -0
  140. package/python/mcp-server/a3m_mcp/server.py +205 -0
  141. package/python/mcp-server/pyproject.toml +24 -0
  142. package/python/pyproject.toml +60 -6
  143. package/python/setup.py +3 -28
  144. package/scripts/submit-sitemap.sh +52 -0
  145. package/src/__types__/registry.d.ts +14 -0
  146. package/src/cli/setupWizard.ts +443 -112
  147. package/src/cli/tui.ts +159 -0
  148. package/src/ensemble.ts +154 -1
  149. package/src/integrations/langchainAdapter.ts +2 -2
  150. package/src/providers/providerConfig.ts +32 -17
  151. package/src/providers/registry.js +27 -0
  152. package/src/routing/advancedRouter.ts +99 -14
  153. package/src/routing/shadowSampler.ts +1 -1
  154. package/test-install/package.json +12 -0
  155. package/tests/tsconfig.json +0 -1
  156. package/tmlpd-pi-extension/README.md +105 -44
  157. package/tmlpd-pi-extension/docs/demo.svg +33 -0
  158. package/tmlpd-pi-extension/package.json +35 -106
  159. package/tmlpd-pi-extension/src/tokenOptimization/contextStratifier.ts +163 -0
  160. package/tmlpd-pi-extension/src/tokenOptimization/fetchOnceLocal.ts +136 -0
  161. package/tmlpd-pi-extension/src/tokenOptimization/index.ts +197 -0
  162. package/tmlpd-pi-extension/src/tokenOptimization/interAgentCompression.ts +157 -0
  163. package/tmlpd-pi-extension/src/tokenOptimization/schemaContract.ts +101 -0
  164. package/tmlpd-pi-extension/src/tokenOptimization/semanticCache.ts +248 -0
  165. package/tmlpd-pi-extension/src/tokenOptimization/tokenAwareFallback.ts +192 -0
  166. package/tmlpd-pi-extension/test/verify.js +21 -0
  167. package/tsconfig.build.json +3 -2
  168. package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts +0 -12
  169. package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts.map +0 -1
  170. package/packages/a3m-vercel-ai/dist/a3m-language-model.js +0 -289
  171. package/packages/a3m-vercel-ai/dist/a3m-language-model.js.map +0 -1
  172. package/packages/a3m-vercel-ai/dist/index.d.ts +0 -82
  173. package/packages/a3m-vercel-ai/dist/index.d.ts.map +0 -1
  174. package/packages/a3m-vercel-ai/dist/index.js +0 -79
  175. package/packages/a3m-vercel-ai/dist/index.js.map +0 -1
  176. package/packages/a3m-vercel-ai/dist/types.d.ts +0 -97
  177. package/packages/a3m-vercel-ai/dist/types.d.ts.map +0 -1
  178. package/packages/a3m-vercel-ai/dist/types.js +0 -5
  179. package/packages/a3m-vercel-ai/dist/types.js.map +0 -1
  180. package/src/skills/__tests__/skill_manager.test.ts +0 -328
  181. package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts +0 -114
  182. package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts.map +0 -1
  183. package/tmlpd-pi-extension/dist/cache/prefixCache.js +0 -285
  184. package/tmlpd-pi-extension/dist/cache/prefixCache.js.map +0 -1
  185. package/tmlpd-pi-extension/dist/cache/responseCache.d.ts +0 -58
  186. package/tmlpd-pi-extension/dist/cache/responseCache.d.ts.map +0 -1
  187. package/tmlpd-pi-extension/dist/cache/responseCache.js +0 -153
  188. package/tmlpd-pi-extension/dist/cache/responseCache.js.map +0 -1
  189. package/tmlpd-pi-extension/dist/cli.js +0 -59
  190. package/tmlpd-pi-extension/dist/cost/costTracker.d.ts +0 -95
  191. package/tmlpd-pi-extension/dist/cost/costTracker.d.ts.map +0 -1
  192. package/tmlpd-pi-extension/dist/cost/costTracker.js +0 -240
  193. package/tmlpd-pi-extension/dist/cost/costTracker.js.map +0 -1
  194. package/tmlpd-pi-extension/dist/index.d.ts +0 -723
  195. package/tmlpd-pi-extension/dist/index.d.ts.map +0 -1
  196. package/tmlpd-pi-extension/dist/index.js +0 -239
  197. package/tmlpd-pi-extension/dist/index.js.map +0 -1
  198. package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts +0 -82
  199. package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts.map +0 -1
  200. package/tmlpd-pi-extension/dist/memory/episodicMemory.js +0 -145
  201. package/tmlpd-pi-extension/dist/memory/episodicMemory.js.map +0 -1
  202. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts +0 -102
  203. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts.map +0 -1
  204. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js +0 -207
  205. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js.map +0 -1
  206. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts +0 -85
  207. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts.map +0 -1
  208. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js +0 -210
  209. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js.map +0 -1
  210. package/tmlpd-pi-extension/dist/providers/localProvider.d.ts +0 -102
  211. package/tmlpd-pi-extension/dist/providers/localProvider.d.ts.map +0 -1
  212. package/tmlpd-pi-extension/dist/providers/localProvider.js +0 -338
  213. package/tmlpd-pi-extension/dist/providers/localProvider.js.map +0 -1
  214. package/tmlpd-pi-extension/dist/providers/registry.d.ts +0 -55
  215. package/tmlpd-pi-extension/dist/providers/registry.d.ts.map +0 -1
  216. package/tmlpd-pi-extension/dist/providers/registry.js +0 -138
  217. package/tmlpd-pi-extension/dist/providers/registry.js.map +0 -1
  218. package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts +0 -68
  219. package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts.map +0 -1
  220. package/tmlpd-pi-extension/dist/routing/advancedRouter.js +0 -332
  221. package/tmlpd-pi-extension/dist/routing/advancedRouter.js.map +0 -1
  222. package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts +0 -101
  223. package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts.map +0 -1
  224. package/tmlpd-pi-extension/dist/tools/tmlpdTools.js +0 -368
  225. package/tmlpd-pi-extension/dist/tools/tmlpdTools.js.map +0 -1
  226. package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts +0 -96
  227. package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts.map +0 -1
  228. package/tmlpd-pi-extension/dist/utils/batchProcessor.js +0 -170
  229. package/tmlpd-pi-extension/dist/utils/batchProcessor.js.map +0 -1
  230. package/tmlpd-pi-extension/dist/utils/compression.d.ts +0 -61
  231. package/tmlpd-pi-extension/dist/utils/compression.d.ts.map +0 -1
  232. package/tmlpd-pi-extension/dist/utils/compression.js +0 -281
  233. package/tmlpd-pi-extension/dist/utils/compression.js.map +0 -1
  234. package/tmlpd-pi-extension/dist/utils/reliability.d.ts +0 -74
  235. package/tmlpd-pi-extension/dist/utils/reliability.d.ts.map +0 -1
  236. package/tmlpd-pi-extension/dist/utils/reliability.js +0 -177
  237. package/tmlpd-pi-extension/dist/utils/reliability.js.map +0 -1
  238. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts +0 -117
  239. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts.map +0 -1
  240. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js +0 -246
  241. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js.map +0 -1
  242. package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts +0 -50
  243. package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts.map +0 -1
  244. package/tmlpd-pi-extension/dist/utils/tokenUtils.js +0 -124
  245. package/tmlpd-pi-extension/dist/utils/tokenUtils.js.map +0 -1
@@ -1,52 +1,212 @@
1
1
  "use strict";
2
2
  /**
3
3
  * A3M Router Setup Wizard
4
- * Interactive configuration wizard
4
+ * Interactive configuration wizard with smart defaults
5
5
  */
6
6
  const fs = require('fs');
7
7
  const path = require('path');
8
8
  const readline = require('readline');
9
9
  const CONFIG_DIR = path.join(process.env.HOME || '/tmp', '.config', 'a3m-router');
10
- const CONFIG_FILE = path.join(CONFIG_DIR, 'providers.json');
10
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
11
+ const PROVIDERS_FILE = path.join(CONFIG_DIR, 'providers.json');
11
12
  // API key environment variable mappings
12
13
  const API_KEY_ENV_MAP = {
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',
14
+ // Free tier (recommended first)
15
+ 'GROQ_API_KEY': { id: 'groq', tier: 'free' },
16
+ 'OPENAI_API_KEY': { id: 'openai', tier: 'paid' },
17
+ 'ANTHROPIC_API_KEY': { id: 'anthropic', tier: 'paid' },
18
+ 'DEEPSEEK_API_KEY': { id: 'deepseek', tier: 'cheap' },
19
+ 'MISTRAL_API_KEY': { id: 'mistral', tier: 'cheap' },
20
+ 'GOOGLE_API_KEY': { id: 'google', tier: 'free' },
21
+ 'XAI_API_KEY': { id: 'xai', tier: 'paid' },
22
+ 'FIREWORKS_API_KEY': { id: 'fireworks', tier: 'cheap' },
23
+ 'TOGETHER_API_KEY': { id: 'together', tier: 'cheap' },
24
+ 'CEREBRAS_API_KEY': { id: 'cerebras', tier: 'free' },
25
+ 'AI21_API_KEY': { id: 'ai21', tier: 'paid' },
26
+ 'COHERE_API_KEY': { id: 'cohere', tier: 'cheap' },
27
+ 'PERPLEXITY_API_KEY': { id: 'perplexity', tier: 'paid' },
28
+ // Chinese providers
29
+ 'MINIMAX_API_KEY': { id: 'minimax', tier: 'cheap' },
30
+ 'KIMI_API_KEY': { id: 'kimi', tier: 'cheap' },
31
+ 'MOONSHOT_API_KEY': { id: 'moonshot', tier: 'cheap' },
32
+ 'QWEN_API_KEY': { id: 'qwen', tier: 'cheap' },
33
+ 'ZHIPU_API_KEY': { id: 'zhipu', tier: 'cheap' },
34
+ 'YI_API_KEY': { id: 'yi', tier: 'cheap' },
35
+ 'BAICHUAN_API_KEY': { id: 'baichuan', tier: 'cheap' },
36
+ 'STEPFUN_API_KEY': { id: 'stepfun', tier: 'cheap' },
37
+ // Other providers
38
+ 'REPLICATE_API_KEY': { id: 'replicate', tier: 'cheap' },
39
+ 'HUGGINGFACE_API_KEY': { id: 'huggingface', tier: 'cheap' },
40
+ 'NVIDIA_API_KEY': { id: 'nvidia', tier: 'paid' },
41
+ 'OPENROUTER_API_KEY': { id: 'openrouter', tier: 'mixed' },
42
+ 'AZURE_OPENAI_API_KEY': { id: 'azure', tier: 'paid' },
43
+ 'DEEPINFRA_API_KEY': { id: 'deepinfra', tier: 'cheap' },
44
+ 'SAMBANOVA_API_KEY': { id: 'sambanova', tier: 'cheap' },
45
+ 'ANYSCALE_API_KEY': { id: 'anyscale', tier: 'cheap' },
46
+ 'VOYAGE_API_KEY': { id: 'voyage', tier: 'cheap' },
47
+ 'JINA_API_KEY': { id: 'jina', tier: 'cheap' },
48
+ 'NOVITA_API_KEY': { id: 'novita', tier: 'cheap' },
49
+ 'OCTOAI_API_KEY': { id: 'octoai', tier: 'cheap' },
50
+ 'LAMINAR_API_KEY': { id: 'laminar', tier: 'cheap' },
51
+ 'WRITER_API_KEY': { id: 'writer', tier: 'paid' },
30
52
  };
31
- // Provider metadata
53
+ // Provider metadata with useful defaults
32
54
  const PROVIDER_INFO = {
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' },
55
+ // FREE TIER (no cost, start here!)
56
+ groq: {
57
+ name: 'Groq',
58
+ defaultModel: 'llama-3.3-70b-versatile',
59
+ tier: 'free',
60
+ strength: 'โšก Fastest inference, generous free tier',
61
+ specialties: ['code', 'general', 'fast responses'],
62
+ note: 'Best for production free tier'
63
+ },
64
+ cerebras: {
65
+ name: 'Cerebras',
66
+ defaultModel: 'llama-3.3-70b',
67
+ tier: 'free',
68
+ strength: '๐Ÿš€ Fastest GPU in world',
69
+ specialties: ['code', 'fast inference'],
70
+ note: 'Unique hardware, excellent speed'
71
+ },
72
+ google: {
73
+ name: 'Google AI',
74
+ defaultModel: 'gemini-1.5-flash',
75
+ tier: 'free',
76
+ strength: '๐Ÿ–ผ๏ธ Multimodal, 1M context',
77
+ specialties: ['multimodal', 'long context', 'vision'],
78
+ note: 'Best free multimodal option'
79
+ },
80
+ // CHEAP TIER (best cost/speed ratio)
81
+ deepseek: {
82
+ name: 'DeepSeek',
83
+ defaultModel: 'deepseek-chat-v3',
84
+ tier: 'cheap',
85
+ strength: '๐Ÿ’ฐ Best value, excellent code',
86
+ specialties: ['code', 'reasoning', 'math', 'value'],
87
+ note: 'Our top recommendation for cost/quality'
88
+ },
89
+ groq_alt: {
90
+ name: 'Groq (Alt)',
91
+ defaultModel: 'mixtral-8x7b-32768',
92
+ tier: 'cheap',
93
+ strength: '๐Ÿ’ฐ Fast + cheap',
94
+ specialties: ['code', 'fast', 'long context'],
95
+ note: 'Good alternative to paid tiers'
96
+ },
97
+ together: {
98
+ name: 'Together AI',
99
+ defaultModel: 'Llama-3.3-70B-Instruct',
100
+ tier: 'cheap',
101
+ strength: '๐Ÿ† Managed, reliable',
102
+ specialties: ['general', 'code', 'reasoning'],
103
+ note: 'Great for production workloads'
104
+ },
105
+ fireworks: {
106
+ name: 'Fireworks AI',
107
+ defaultModel: 'mixtral-8x22b-instruct',
108
+ tier: 'cheap',
109
+ strength: '๐Ÿ”ฅ Fast inference engine',
110
+ specialties: ['code', 'fast', 'function calling'],
111
+ note: 'Excellent for agentic workflows'
112
+ },
113
+ mistral: {
114
+ name: 'Mistral AI',
115
+ defaultModel: 'mistral-small-latest',
116
+ tier: 'cheap',
117
+ strength: '๐Ÿ‡ช๐Ÿ‡บ European, balanced',
118
+ specialties: ['general', 'code', 'European data'],
119
+ note: 'Great for EU compliance'
120
+ },
121
+ cohere: {
122
+ name: 'Cohere',
123
+ defaultModel: 'command-r7b',
124
+ tier: 'cheap',
125
+ strength: '๐Ÿ“Š Great embeddings',
126
+ specialties: ['code', 'embeddings', 'rerank'],
127
+ note: 'Best for RAG workloads'
128
+ },
129
+ qwen: {
130
+ name: 'Qwen (Alibaba)',
131
+ defaultModel: 'qwen-turbo',
132
+ tier: 'cheap',
133
+ strength: '๐Ÿ‡จ๐Ÿ‡ณ Best Chinese model',
134
+ specialties: ['chinese', 'multilingual', 'code'],
135
+ note: 'Top Chinese language support'
136
+ },
137
+ zhipu: {
138
+ name: 'Zhipu GLM',
139
+ defaultModel: 'glm-4',
140
+ tier: 'cheap',
141
+ strength: '๐Ÿ‡จ๐Ÿ‡ณ Smart Chinese reasoning',
142
+ specialties: ['chinese', 'reasoning', 'code'],
143
+ note: 'Excellent for Chinese language tasks'
144
+ },
145
+ kimi: {
146
+ name: 'Kimi/Moonshot',
147
+ defaultModel: 'moonshot-v1-8k',
148
+ tier: 'cheap',
149
+ strength: '๐Ÿ‡จ๐Ÿ‡ณ 128k context window',
150
+ specialties: ['long context', 'chinese', 'analysis'],
151
+ note: 'Best for very long documents'
152
+ },
153
+ yi: {
154
+ name: 'Yi (01.AI)',
155
+ defaultModel: 'yi-large',
156
+ tier: 'cheap',
157
+ strength: '๐Ÿ‡จ๐Ÿ‡ณ Strong reasoning',
158
+ specialties: ['reasoning', 'chinese', 'english'],
159
+ note: 'Good bilingual support'
160
+ },
161
+ minimax: {
162
+ name: 'MiniMax',
163
+ defaultModel: 'abab6.5s-chat',
164
+ tier: 'cheap',
165
+ strength: '๐Ÿ‡จ๐Ÿ‡ณ Fast Chinese responses',
166
+ specialties: ['chinese', 'fast', 'chat'],
167
+ note: 'Great for Chinese chatbots'
168
+ },
169
+ stepfun: {
170
+ name: 'StepFun',
171
+ defaultModel: 'step-1v-8k',
172
+ tier: 'cheap',
173
+ strength: '๐Ÿ‡จ๐Ÿ‡ณ Vision + text',
174
+ specialties: ['vision', 'multimodal', 'chinese'],
175
+ note: 'Good for image understanding'
176
+ },
177
+ // PAID TIER (best quality)
178
+ openai: {
179
+ name: 'OpenAI',
180
+ defaultModel: 'gpt-4o-mini',
181
+ tier: 'paid',
182
+ strength: '๐Ÿง  Best overall quality',
183
+ specialties: ['reasoning', 'code', 'general', 'function calling'],
184
+ note: 'Premium quality, higher cost'
185
+ },
186
+ anthropic: {
187
+ name: 'Anthropic',
188
+ defaultModel: 'claude-3.5-haiku',
189
+ tier: 'paid',
190
+ strength: '๐Ÿ›ก๏ธ Best reasoning, safest',
191
+ specialties: ['reasoning', 'analysis', 'safety'],
192
+ note: 'Excellent for sensitive tasks'
193
+ },
194
+ xai: {
195
+ name: 'xAI (Grok)',
196
+ defaultModel: 'grok-3',
197
+ tier: 'paid',
198
+ strength: '๐Ÿค– Real-time data access',
199
+ specialties: ['real-time', 'web search', 'reasoning'],
200
+ note: 'Accesses real-time information'
201
+ },
202
+ perplexity: {
203
+ name: 'Perplexity',
204
+ defaultModel: 'sonar',
205
+ tier: 'paid',
206
+ strength: '๐ŸŒ Online search + reasoning',
207
+ specialties: ['search', 'factual', 'research'],
208
+ note: 'Best for research with web access'
209
+ },
50
210
  };
51
211
  function createInterface() {
52
212
  return readline.createInterface({
@@ -59,110 +219,260 @@ function question(rl, text) {
59
219
  rl.question(text, (answer) => resolve(answer));
60
220
  });
61
221
  }
222
+ /**
223
+ * Detect API keys from environment variables
224
+ */
62
225
  async function detectApiKeys() {
63
226
  const detected = [];
64
- for (const [envVar, providerId] of Object.entries(API_KEY_ENV_MAP)) {
227
+ for (const [envVar, config] of Object.entries(API_KEY_ENV_MAP)) {
65
228
  if (process.env[envVar]) {
66
- detected.push({ envVar, providerId, info: PROVIDER_INFO[providerId] });
229
+ const info = PROVIDER_INFO[config.id];
230
+ detected.push({
231
+ envVar,
232
+ providerId: config.id,
233
+ tier: config.tier,
234
+ info
235
+ });
67
236
  }
68
237
  }
69
238
  return detected;
70
239
  }
71
- async function runWizard() {
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 });
78
- }
79
- // Check for existing config
80
- let existingConfig = {};
240
+ /**
241
+ * Load existing configuration
242
+ */
243
+ function loadExistingConfig() {
244
+ const config = { providers: {} };
245
+ // Try new config location
81
246
  if (fs.existsSync(CONFIG_FILE)) {
82
247
  try {
83
- existingConfig = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
84
- console.log('โœ“ Found existing config at', CONFIG_FILE);
85
- const providerKeys = Object.keys(existingConfig.providers || {});
86
- console.log(' Providers:', providerKeys.length > 0 ? providerKeys.join(', ') : '(none)');
87
- console.log('');
248
+ const data = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
249
+ console.log(' โœ“ Found existing config');
250
+ return data;
88
251
  }
89
252
  catch (e) {
90
- console.log('โš  Could not read existing config, starting fresh\n');
253
+ // Fall through
91
254
  }
92
255
  }
93
- // Auto-detect API keys
94
- console.log('Checking configuration...');
95
- const detected = await detectApiKeys();
96
- if (detected.length > 0) {
97
- console.log('โœ“ Found', detected.length, 'configured provider(s):');
98
- detected.forEach(({ envVar, providerId, info }) => {
99
- console.log(' โœ“', info?.name || providerId);
100
- });
101
- console.log('');
256
+ // Try legacy providers.json location
257
+ if (fs.existsSync(PROVIDERS_FILE)) {
258
+ try {
259
+ const data = JSON.parse(fs.readFileSync(PROVIDERS_FILE, 'utf8'));
260
+ console.log(' โœ“ Found legacy config (will migrate)');
261
+ return data;
262
+ }
263
+ catch (e) {
264
+ // Fall through
265
+ }
102
266
  }
103
- // Provider selection
267
+ return config;
268
+ }
269
+ /**
270
+ * Auto-detect best starter config based on available keys
271
+ */
272
+ function suggestStarterConfig(detected) {
273
+ const suggestions = [];
274
+ // Priority: Free tier first, then cheap, then paid
275
+ const tierOrder = { free: 1, cheap: 2, paid: 3 };
276
+ detected
277
+ .sort((a, b) => (tierOrder[a.tier] || 4) - (tierOrder[b.tier] || 4))
278
+ .forEach(({ providerId, info, tier }) => {
279
+ suggestions.push({ providerId, info, tier });
280
+ });
281
+ return suggestions;
282
+ }
283
+ /**
284
+ * Print provider list with status
285
+ */
286
+ function printProviderList(selected, detected) {
104
287
  const allProviders = Object.keys(PROVIDER_INFO);
105
- const selected = new Set();
106
- // Pre-select providers with detected keys
107
- detected.forEach(({ providerId }) => selected.add(providerId));
108
- console.log('๐Ÿ“ก Select providers to configure (comma-separated numbers, or "all"):');
109
- console.log('');
110
- const numbered = allProviders.map((id, i) => ({ id, i }));
111
- numbered.forEach(({ id, i }) => {
288
+ console.log('\n Available providers:\n');
289
+ console.log(' ## Provider Tier Strength');
290
+ console.log(' โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');
291
+ allProviders.forEach((id, i) => {
112
292
  const info = PROVIDER_INFO[id];
113
- const selected_mark = selected.has(id) ? '[x]' : '[ ]';
114
- const tier_mark = info?.tier === 'free' ? '(FREE)' : info?.tier === 'cheap' ? '(cheap)' : '(paid)';
115
- console.log(` ${String(i + 1).padStart(2)}. ${selected_mark} ${id.padEnd(12)} ${tier_mark} - ${info?.strength || ''}`);
293
+ const hasKey = detected.some(d => d.providerId === id);
294
+ const isSelected = selected.has(id);
295
+ let mark = ' ';
296
+ if (hasKey)
297
+ mark = '๐Ÿ”‘';
298
+ else if (isSelected)
299
+ mark = 'โœ“ ';
300
+ const tierIcon = info.tier === 'free' ? '๐Ÿ†“ ' :
301
+ info.tier === 'cheap' ? '๐Ÿ’ฐ ' : '๐Ÿ’Ž ';
302
+ const tierStr = info.tier.padEnd(6);
303
+ const name = info.name.padEnd(20);
304
+ console.log(` ${String(i + 1).padStart(2)}. ${mark} ${name} ${tierIcon}${tierStr} ${info.strength}`);
116
305
  });
306
+ console.log(' โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€');
307
+ console.log(' ๐Ÿ”‘ = API key detected in environment');
308
+ }
309
+ /**
310
+ * Print usage tips
311
+ */
312
+ function printTips(detected) {
313
+ console.log('\n ๐Ÿ’ก Pro tips:');
117
314
  console.log('');
118
- const answer = await question(rl, ' Enter numbers or "all" [all with keys detected]: ');
119
- if (answer.toLowerCase().trim() === 'all') {
120
- allProviders.forEach(id => selected.add(id));
315
+ if (detected.length === 0) {
316
+ console.log(' โ€ข Get free API keys at: https://console.groq.com (Groq is free!)');
317
+ console.log(' โ€ข DeepSeek offers best cost/quality: https://platform.deepseek.com');
318
+ console.log(' โ€ข A3M works with ANY provider - even 1 key is enough');
121
319
  }
122
- else if (answer.trim()) {
123
- const nums = answer.split(',').map(s => parseInt(s.trim())).filter(n => !isNaN(n));
124
- nums.forEach(n => {
125
- const idx = n - 1;
126
- if (idx >= 0 && idx < allProviders.length) {
127
- selected.add(allProviders[idx]);
128
- }
129
- });
320
+ else {
321
+ // Analyze detected providers
322
+ const tiers = new Set(detected.map(d => d.tier));
323
+ if (!tiers.has('free') && !tiers.has('cheap')) {
324
+ console.log(' โ€ข Consider adding Groq (free tier) for cost savings');
325
+ }
326
+ if (!detected.some(d => d.providerId === 'deepseek')) {
327
+ console.log(' โ€ข DeepSeek V3 is excellent and cheap - highly recommended');
328
+ }
329
+ if (detected.length < 3) {
330
+ console.log(' โ€ข Adding 3+ providers enables ensemble voting for hallucination detection');
331
+ }
130
332
  }
131
- console.log('\nโœ“ Selected providers:', Array.from(selected).join(', '));
132
- // Build config
333
+ console.log(' โ€ข Run "a3m-router test" after setup to verify connections');
334
+ console.log(' โ€ข Ensemble mode (3+ providers) catches hallucinations automatically');
335
+ }
336
+ /**
337
+ * Build configuration object
338
+ */
339
+ function buildConfig(selected, detected) {
133
340
  const config = {
134
- version: '1.0',
341
+ version: '2.0',
135
342
  providers: {}
136
343
  };
137
344
  selected.forEach(providerId => {
138
345
  const info = PROVIDER_INFO[providerId];
139
- const envKey = Object.entries(API_KEY_ENV_MAP).find(([k, v]) => v === providerId)?.[0];
346
+ const envEntry = Object.entries(API_KEY_ENV_MAP).find(([, v]) => v.id === providerId);
347
+ const envVar = envEntry ? envEntry[0] : null;
140
348
  config.providers[providerId] = {
141
349
  name: info?.name || providerId,
142
- apiKey: envKey ? process.env[envKey] : '',
143
- models: [info?.models || 'default'],
350
+ apiKey: envVar ? process.env[envVar] : '',
351
+ defaultModel: info?.defaultModel || 'auto',
352
+ models: [info?.defaultModel || 'auto'],
144
353
  type: 'api',
145
- enabled: true
354
+ enabled: true,
355
+ tier: info?.tier || 'cheap'
146
356
  };
147
357
  });
148
- // Save config
358
+ return config;
359
+ }
360
+ /**
361
+ * Main wizard execution
362
+ */
363
+ async function runWizard() {
364
+ console.log('\n โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—');
365
+ console.log(' โ•‘ โ•‘');
366
+ console.log(' โ•‘ ๐Ÿค– A3M Router Setup Wizard โ•‘');
367
+ console.log(' โ•‘ The intelligent LLM gateway โ•‘');
368
+ console.log(' โ•‘ โ•‘');
369
+ console.log(' โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n');
370
+ const rl = createInterface();
371
+ // Ensure config directory exists
372
+ if (!fs.existsSync(CONFIG_DIR)) {
373
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
374
+ console.log(' โœ“ Created config directory:', CONFIG_DIR);
375
+ }
376
+ // Load existing config
377
+ const existingConfig = loadExistingConfig();
378
+ const existingProviders = Object.keys(existingConfig.providers || {});
379
+ if (existingProviders.length > 0) {
380
+ console.log(' โœ“ Found', existingProviders.length, 'configured provider(s)');
381
+ }
382
+ // Detect API keys
383
+ console.log('\n ๐Ÿ” Scanning for API keys...\n');
384
+ const detected = await detectApiKeys();
385
+ if (detected.length > 0) {
386
+ console.log(' โœ“ Found', detected.length, 'API key(s) in environment:\n');
387
+ detected.forEach(({ envVar, info, tier }) => {
388
+ const tierMark = tier === 'free' ? '๐Ÿ†“' : tier === 'cheap' ? '๐Ÿ’ฐ' : '๐Ÿ’Ž';
389
+ console.log(` ${tierMark} ${info?.name || envVar} (${tier} tier)`);
390
+ });
391
+ }
392
+ else {
393
+ console.log(' โš ๏ธ No API keys detected in environment');
394
+ console.log(' You can still configure providers manually or add keys later\n');
395
+ }
396
+ // Starter suggestions
397
+ const suggestions = suggestStarterConfig(detected);
398
+ const selected = new Set();
399
+ // Auto-select detected providers
400
+ suggestions.forEach(({ providerId }) => selected.add(providerId));
401
+ // Print provider list
402
+ printProviderList(selected, detected);
403
+ // Selection prompt
404
+ console.log('\n ๐Ÿ“ก Provider Selection:');
405
+ console.log(' โ€ข Enter numbers separated by commas (e.g., 1,3,5)');
406
+ console.log(' โ€ข Enter "all" to select all providers');
407
+ console.log(' โ€ข Enter "free" for free tier only');
408
+ console.log(' โ€ข Enter "min" for minimum viable (1 free + 1 cheap)');
409
+ console.log(' โ€ข Press Enter to use detected providers (recommended)\n');
410
+ const answer = await question(rl, ' Select providers [Enter for detected]: ');
411
+ const trimmed = answer.toLowerCase().trim();
412
+ if (trimmed === 'all') {
413
+ Object.keys(PROVIDER_INFO).forEach(id => selected.add(id));
414
+ }
415
+ else if (trimmed === 'free') {
416
+ Object.entries(PROVIDER_INFO)
417
+ .filter(([, info]) => info.tier === 'free')
418
+ .forEach(([id]) => selected.add(id));
419
+ }
420
+ else if (trimmed === 'min') {
421
+ // One free + one cheap
422
+ const free = Object.entries(PROVIDER_INFO).find(([, info]) => info.tier === 'free');
423
+ const cheap = Object.entries(PROVIDER_INFO).find(([, info]) => info.tier === 'cheap');
424
+ if (free)
425
+ selected.add(free[0]);
426
+ if (cheap)
427
+ selected.add(cheap[0]);
428
+ }
429
+ else if (trimmed) {
430
+ const nums = answer.split(',').map(s => parseInt(s.trim())).filter(n => !isNaN(n));
431
+ selected.clear();
432
+ nums.forEach(n => {
433
+ const idx = n - 1;
434
+ const providers = Object.keys(PROVIDER_INFO);
435
+ if (idx >= 0 && idx < providers.length) {
436
+ selected.add(providers[idx]);
437
+ }
438
+ });
439
+ }
440
+ // Summary
441
+ console.log('\n โœ“ Selected providers:');
442
+ const selectedList = Array.from(selected).map(id => ({
443
+ id,
444
+ info: PROVIDER_INFO[id]
445
+ })).sort((a, b) => {
446
+ const order = { free: 1, cheap: 2, paid: 3 };
447
+ return (order[a.info?.tier] || 4) - (order[b.info?.tier] || 4);
448
+ });
449
+ selectedList.forEach(({ id, info }) => {
450
+ const tierMark = info.tier === 'free' ? '๐Ÿ†“' : info.tier === 'cheap' ? '๐Ÿ’ฐ' : '๐Ÿ’Ž';
451
+ console.log(` ${tierMark} ${info?.name} (${info?.tier} tier) - ${info?.defaultModel}`);
452
+ });
453
+ // Build and save config
454
+ const config = buildConfig(selected, detected);
149
455
  fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
150
- console.log('\nโœ“ Config saved to', CONFIG_FILE);
151
- // Test connections
152
- console.log('\n๐Ÿงช Testing connections...');
153
- console.log(' (Skipped in wizard mode - run "npx a3m-router test" to verify)\n');
154
- // Ready message
155
- console.log('โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”');
156
- console.log('โœ… A3M Router is ready!');
157
- console.log('');
158
- console.log(' Next steps:');
159
- console.log(' 1. npx a3m-router serve # Start proxy server');
160
- console.log(' 2. npx a3m-router test # Test provider connections');
161
- console.log(' 3. npx a3m-router route "hi" # Try routing a query');
162
- console.log('');
163
- console.log(' Docs: https://github.com/Das-rebel/a3m-router');
164
- console.log('');
456
+ console.log('\n โœ“ Config saved to:', CONFIG_FILE);
457
+ // Migration notice
458
+ if (existingProviders.length > 0 && existingProviders.length !== selected.size) {
459
+ console.log(' โ„น๏ธ Note: Legacy config preserved at:', PROVIDERS_FILE);
460
+ }
461
+ // Tips
462
+ printTips(detected);
463
+ // Next steps
464
+ console.log('\n โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—');
465
+ console.log(' โ•‘ โœ… A3M Router is ready! โ•‘');
466
+ console.log(' โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•\n');
467
+ console.log(' ๐Ÿ“– Next steps:\n');
468
+ console.log(' 1. Test connections: a3m-router test');
469
+ console.log(' 2. Start proxy: a3m-router serve');
470
+ console.log(' 3. Try routing: a3m-router route "Hello world"');
471
+ console.log(' 4. Open dashboard: a3m-router tui');
472
+ console.log('\n ๐Ÿ“š Docs: https://github.com/Das-rebel/a3m-router');
473
+ console.log(' ๐Ÿ“‹ Cheat sheet: https://github.com/Das-rebel/a3m-router/blob/main/docs/cli-cheatsheet.md\n');
165
474
  rl.close();
475
+ return config;
166
476
  }
167
477
  module.exports = { runWizard };
168
478
  //# sourceMappingURL=setupWizard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setupWizard.js","sourceRoot":"","sources":["../../src/cli/setupWizard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setupWizard.js","sourceRoot":"","sources":["../../src/cli/setupWizard.ts"],"names":[],"mappings":"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"}