adaptive-memory-multi-model-router 2.14.46 → 2.14.48

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 (598) hide show
  1. package/{docs/llms.txt → llms.txt.bak} +6 -6
  2. package/package.json +270 -72
  3. package/src/routing/advancedRouter.ts.bak +650 -0
  4. package/test.js.bak +376 -0
  5. package/.dockerignore +0 -82
  6. package/.env.example +0 -303
  7. package/.github/DISCUSSIONS_WELCOME.md +0 -27
  8. package/.github/DISCUSSION_TEMPLATE.yml +0 -5
  9. package/.github/FUNDING.yml +0 -2
  10. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -94
  11. package/.github/ISSUE_TEMPLATE/config.yml +0 -17
  12. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -71
  13. package/.github/PULL_REQUEST_TEMPLATE.md +0 -71
  14. package/.github/dependabot.yml +0 -9
  15. package/.github/workflows/auto-publish.yml +0 -51
  16. package/.github/workflows/ci.yml +0 -263
  17. package/.github/workflows/codeql.yml +0 -38
  18. package/.github/workflows/npm-publish.yml +0 -20
  19. package/.github/workflows/pages.yml +0 -37
  20. package/.github/workflows/stale.yml +0 -54
  21. package/.publish-tick +0 -1
  22. package/.well-known/ai-plugin.json +0 -16
  23. package/AGENT_COUNCIL_FINDINGS.md +0 -142
  24. package/ARCHITECTURE.md +0 -346
  25. package/AUDIT_REPORT.md +0 -28
  26. package/CODE_OF_CONDUCT.md +0 -128
  27. package/CONTRIBUTING.md +0 -50
  28. package/CONTRIBUTORS.md +0 -20
  29. package/Dockerfile +0 -53
  30. package/Dockerfile.proxy +0 -33
  31. package/HEALTH_REPORT.md +0 -118
  32. package/IMPROVEMENT_PLAN.md +0 -107
  33. package/LANDING.md +0 -43
  34. package/LAUNCH-PAIN-DRIVEN.md +0 -339
  35. package/LAUNCH.md +0 -337
  36. package/LAUNCH_CHECKLIST.md +0 -141
  37. package/LAUNCH_SNAPSHOT.md +0 -260
  38. package/MANIFESTO.md +0 -41
  39. package/POPULARITY_BOOSTERS.md +0 -285
  40. package/PR_STATUS_REPORT.md +0 -148
  41. package/REDESIGN.md +0 -95
  42. package/RUNKIT.md +0 -83
  43. package/SECURITY.md +0 -29
  44. package/SUBMISSIONS.md +0 -43
  45. package/_schema.html +0 -53
  46. package/ai-plugin.json +0 -16
  47. package/articles/AI_AGENT_LLM_ROUTING.md +0 -150
  48. package/articles/CHINESE_DIRECTORIES.md +0 -100
  49. package/articles/CHINESE_SUBMISSIONS_READY.md +0 -322
  50. package/articles/COMPETITOR_ALERTS.md +0 -31
  51. package/articles/COMPLETE_POSTING_DIRECTORY.md +0 -147
  52. package/articles/CONTENT_STRUCTURE.md +0 -292
  53. package/articles/DEVTO_COST_GUIDE.md +0 -473
  54. package/articles/DEVTO_FINAL.md +0 -416
  55. package/articles/DEVTO_MULTI_PROVIDER.md +0 -542
  56. package/articles/DEVTO_READY.md +0 -255
  57. package/articles/DEVTO_V2_ANNOUNCEMENT.md +0 -160
  58. package/articles/DEVTO_VIRAL_GROWTH.md +0 -280
  59. package/articles/FRESH_devto.md +0 -460
  60. package/articles/FRESH_devto_2026_05.md +0 -73
  61. package/articles/FRESH_hackernews.md +0 -14
  62. package/articles/FRESH_reddit_ml.md +0 -90
  63. package/articles/FRESH_reddit_node.md +0 -198
  64. package/articles/FRESH_reddit_sideproject.md +0 -72
  65. package/articles/FRESH_reddit_webdev.md +0 -130
  66. package/articles/FROM_ZERO_TO_10K.md +0 -107
  67. package/articles/HN_10X_BETTER.md +0 -430
  68. package/articles/HN_ACCOUNT_GUIDE.md +0 -21
  69. package/articles/HN_CHINESE_STYLE.md +0 -308
  70. package/articles/HN_FINAL.md +0 -148
  71. package/articles/HN_POSTED_VERSION.md +0 -56
  72. package/articles/HN_POST_READY.md +0 -137
  73. package/articles/HN_RESEARCH.md +0 -364
  74. package/articles/HN_SHOW_routerarena.md +0 -17
  75. package/articles/HN_TIMING_GUIDE.md +0 -52
  76. package/articles/INDIEHACKERS_POST.md +0 -52
  77. package/articles/INDIEHACKERS_READY.md +0 -120
  78. package/articles/LLM_BENCHMARK_DEEP_DIVE.md +0 -153
  79. package/articles/MASTER_POSTING_DIRECTORY.md +0 -189
  80. package/articles/NEWSLETTER_SEND_NOW.md +0 -259
  81. package/articles/NEWSLETTER_SUBMISSIONS.md +0 -112
  82. package/articles/PAIN-DRIVEN-devto-v2.md +0 -308
  83. package/articles/PAIN-DRIVEN-devto-v3.md +0 -268
  84. package/articles/PAIN-DRIVEN-devto.md +0 -242
  85. package/articles/PAIN-DRIVEN-hackernews-v2.md +0 -138
  86. package/articles/PAIN-DRIVEN-hackernews-v3.md +0 -151
  87. package/articles/PAIN-DRIVEN-hackernews.md +0 -131
  88. package/articles/PAIN-DRIVEN-reddit-v2.md +0 -301
  89. package/articles/PAIN-DRIVEN-reddit-v3.md +0 -236
  90. package/articles/PAIN-DRIVEN-reddit.md +0 -218
  91. package/articles/PAIN-DRIVEN-twitter-v2.md +0 -110
  92. package/articles/PAIN-DRIVEN-twitter-v3.md +0 -121
  93. package/articles/PAIN-DRIVEN-twitter.md +0 -120
  94. package/articles/PORTKEY_VS_A3M.md +0 -147
  95. package/articles/POSTING_KIT_2026_05.md +0 -67
  96. package/articles/PRESS_KIT_routerarena.md +0 -77
  97. package/articles/PRODUCTHUNT_LISTING.md +0 -48
  98. package/articles/PRODUCTHUNT_READY.md +0 -106
  99. package/articles/PR_PLAN_vault.md +0 -125
  100. package/articles/REDDIT_FINAL.md +0 -232
  101. package/articles/REDDIT_POST.md +0 -67
  102. package/articles/REDDIT_SUBMISSION_READY.md +0 -348
  103. package/articles/ROUTERARENA_LEADER.md +0 -45
  104. package/articles/SHOW_HN_FINAL.md +0 -29
  105. package/articles/TWEETS_10K_DOWNLOADS.md +0 -47
  106. package/articles/TWEETS_BENCHMARK_FIRST.md +0 -46
  107. package/articles/TWEETS_MCP_PLAY.md +0 -51
  108. package/articles/TWEETS_SEQUENTIAL_BROKEN.md +0 -49
  109. package/articles/TWEETS_WHY_BUILD.md +0 -54
  110. package/articles/TWEETS_routerarena_leader.md +0 -53
  111. package/articles/TWEET_STORM_READY.md +0 -165
  112. package/articles/TWITTER_FINAL.md +0 -167
  113. package/articles/WHY_10X_BETTER.md +0 -261
  114. package/articles/WHY_CHINESE_STYLE_BETTER.md +0 -323
  115. package/articles/ai-discoverability-llm-routing.md +0 -210
  116. package/articles/devto-llm-routing.md +0 -138
  117. package/articles/hackernews-show-hn.md +0 -54
  118. package/articles/hashnode-llm-cost-optimization.md +0 -125
  119. package/articles/hn_show_2026_05.md +0 -11
  120. package/articles/medium-building-llm-router.md +0 -205
  121. package/articles/reddit-ml.md +0 -76
  122. package/articles/twitter-thread-cost-savings.md +0 -50
  123. package/articles/youtube-tutorial-script.md +0 -262
  124. package/assets/a3m_3blue1brown.mp4 +0 -0
  125. package/assets/banner.svg +0 -109
  126. package/assets/chart-cost-v2.svg +0 -91
  127. package/assets/chart-cost-v3.svg +0 -143
  128. package/assets/chart-features-v2.svg +0 -132
  129. package/assets/chart-features-v3.svg +0 -211
  130. package/assets/chart-growth-v2.svg +0 -122
  131. package/assets/chart-growth-v3.svg +0 -189
  132. package/assets/cost-comparison.svg +0 -134
  133. package/assets/cost-simple.svg +0 -64
  134. package/assets/demo-hn.gif +0 -0
  135. package/assets/feature-matrix.svg +0 -136
  136. package/assets/growth-chart-animated.svg +0 -76
  137. package/assets/growth-chart.svg +0 -82
  138. package/assets/growth-simple.svg +0 -69
  139. package/assets/hero-diagram.svg +0 -81
  140. package/assets/logo-new.svg +0 -21
  141. package/assets/logo.svg +0 -68
  142. package/assets/provider-comparison.svg +0 -121
  143. package/assets/social-preview-new.svg +0 -100
  144. package/assets/social-preview.svg +0 -194
  145. package/assets/social-v2.svg +0 -130
  146. package/assets/social-v3.svg +0 -212
  147. package/benchmark-provider-results.json +0 -245
  148. package/benchmark-results.json +0 -54
  149. package/council-votes/architecture-vote.md +0 -121
  150. package/council-votes/coverage-vote.md +0 -93
  151. package/data/adaptive-benchmark.json +0 -92
  152. package/data/benchmark-results.json +0 -47
  153. package/data/labeled-benchmark.json +0 -88
  154. package/demo/3blue1brown_video.py +0 -285
  155. package/demo/3blue1brown_video_v2.py +0 -310
  156. package/demo/IMPROVED_PROMPTS.md +0 -229
  157. package/demo/VEO3_PROMPTS.md +0 -269
  158. package/demo/VIDEO_PRODUCTION_GUIDE.md +0 -333
  159. package/demo/a3m_3blue1brown.mp4 +0 -0
  160. package/demo/asciinema-demo.sh +0 -195
  161. package/demo/demo-hn.tape +0 -74
  162. package/demo/demo-script.md +0 -53
  163. package/demo/demo-script.sh +0 -62
  164. package/demo/demo.svg +0 -75
  165. package/demo/frame1_ai_data_center.png +0 -0
  166. package/demo/frame1_sunset_video.mp4 +0 -0
  167. package/demo/frame2_cost_comparison.png +0 -0
  168. package/demo/frame2_cost_comparison_fallback.png +0 -0
  169. package/demo/frame3_parallel_execution.png +0 -0
  170. package/demo/frame3_parallel_execution_fallback.png +0 -0
  171. package/demo/frame4_providers.png +0 -0
  172. package/demo/frame4_providers_fallback.png +0 -0
  173. package/demo/frame5_endcard.png +0 -0
  174. package/demo/frame5_endcard_fallback.png +0 -0
  175. package/demo/new_frame1_hook.png +0 -0
  176. package/demo/new_frame2_proof.png +0 -0
  177. package/demo/new_frame3_wow.png +0 -0
  178. package/demo/new_frame4_social.png +0 -0
  179. package/demo/new_frame5_cta.png +0 -0
  180. package/demo/package.json +0 -13
  181. package/demo/product-video-final.mp4 +0 -0
  182. package/demo/product-video-hype-v1.mp4 +0 -0
  183. package/demo/product-video-v1.mp4 +0 -0
  184. package/demo/public/index.html +0 -762
  185. package/demo/recording.cast +0 -55
  186. package/demo/server.js +0 -405
  187. package/demo-new.tape +0 -71
  188. package/demo-real.sh +0 -198
  189. package/demo-simple.tape +0 -205
  190. package/demo.html +0 -520
  191. package/demo.sh +0 -85
  192. package/demo.tape +0 -259
  193. package/dist/analytics/costAnalytics.d.ts.map +0 -1
  194. package/dist/analytics/costAnalytics.js.map +0 -1
  195. package/dist/benchmark/comprehensive.js.map +0 -1
  196. package/dist/benchmark/reproducible.d.ts.map +0 -1
  197. package/dist/benchmark/reproducible.js.map +0 -1
  198. package/dist/cache/prefixCache.d.ts.map +0 -1
  199. package/dist/cache/prefixCache.js.map +0 -1
  200. package/dist/cache/responseCache.d.ts.map +0 -1
  201. package/dist/cache/responseCache.js.map +0 -1
  202. package/dist/cache/semanticCache.d.ts.map +0 -1
  203. package/dist/cache/semanticCache.js.map +0 -1
  204. package/dist/cli/setupWizard.d.ts.map +0 -1
  205. package/dist/cli/setupWizard.js.map +0 -1
  206. package/dist/cost/budgetEnforcer.d.ts.map +0 -1
  207. package/dist/cost/budgetEnforcer.js.map +0 -1
  208. package/dist/cost/costTracker.d.ts.map +0 -1
  209. package/dist/cost/costTracker.js.map +0 -1
  210. package/dist/ensemble/multiRoundDialog.js.map +0 -1
  211. package/dist/ensemble/shapleyValue.js.map +0 -1
  212. package/dist/integrations/langchainAdapter.d.ts.map +0 -1
  213. package/dist/integrations/langchainAdapter.js.map +0 -1
  214. package/dist/integrations/oauth.d.ts.map +0 -1
  215. package/dist/integrations/oauth.js.map +0 -1
  216. package/dist/integrations/scienceAdapter.js.map +0 -1
  217. package/dist/memory/autoFetch.d.ts.map +0 -1
  218. package/dist/memory/autoFetch.js.map +0 -1
  219. package/dist/memory/episodicMemory.d.ts.map +0 -1
  220. package/dist/memory/episodicMemory.js.map +0 -1
  221. package/dist/memory/hybridMemory.js.map +0 -1
  222. package/dist/memory/memoryTree.d.ts.map +0 -1
  223. package/dist/memory/memoryTree.js.map +0 -1
  224. package/dist/memory/obsidianVault.d.ts.map +0 -1
  225. package/dist/memory/obsidianVault.js.map +0 -1
  226. package/dist/memory/reasoningBank.js.map +0 -1
  227. package/dist/observability/changeWatch.d.ts.map +0 -1
  228. package/dist/observability/changeWatch.js.map +0 -1
  229. package/dist/observability/fatigueDetector.d.ts.map +0 -1
  230. package/dist/observability/fatigueDetector.js.map +0 -1
  231. package/dist/observability/index.d.ts.map +0 -1
  232. package/dist/observability/index.js.map +0 -1
  233. package/dist/observability/metrics.d.ts.map +0 -1
  234. package/dist/observability/metrics.js.map +0 -1
  235. package/dist/observability/middleware.d.ts.map +0 -1
  236. package/dist/observability/middleware.js.map +0 -1
  237. package/dist/observability/tracer.d.ts.map +0 -1
  238. package/dist/observability/tracer.js.map +0 -1
  239. package/dist/observability/types.d.ts.map +0 -1
  240. package/dist/observability/types.js.map +0 -1
  241. package/dist/orchestration/haloOrchestrator.d.ts.map +0 -1
  242. package/dist/orchestration/haloOrchestrator.js.map +0 -1
  243. package/dist/orchestration/mctsWorkflow.d.ts.map +0 -1
  244. package/dist/orchestration/mctsWorkflow.js.map +0 -1
  245. package/dist/providers/localProvider.d.ts.map +0 -1
  246. package/dist/providers/localProvider.js.map +0 -1
  247. package/dist/providers/providerConfig.d.ts.map +0 -1
  248. package/dist/providers/providerConfig.js.map +0 -1
  249. package/dist/providers/registry.d.ts.map +0 -1
  250. package/dist/providers/registry.js.map +0 -1
  251. package/dist/routing/advancedRouter.d.ts.map +0 -1
  252. package/dist/routing/advancedRouter.js.map +0 -1
  253. package/dist/routing/crossModelValidation.d.ts.map +0 -1
  254. package/dist/routing/crossModelValidation.js.map +0 -1
  255. package/dist/routing/providerHealth.d.ts.map +0 -1
  256. package/dist/routing/providerHealth.js.map +0 -1
  257. package/dist/routing/providerRetry.d.ts.map +0 -1
  258. package/dist/routing/providerRetry.js.map +0 -1
  259. package/dist/scripts/banner.js +0 -29
  260. package/dist/security/guardrails.d.ts.map +0 -1
  261. package/dist/security/guardrails.js.map +0 -1
  262. package/dist/server/dashboard.d.ts.map +0 -1
  263. package/dist/server/dashboard.js.map +0 -1
  264. package/dist/server/modelMapper.d.ts.map +0 -1
  265. package/dist/server/modelMapper.js.map +0 -1
  266. package/dist/server/proxyServer.d.ts.map +0 -1
  267. package/dist/server/proxyServer.js.map +0 -1
  268. package/dist/skills/__tests__/skill_manager.test.d.ts +0 -2
  269. package/dist/skills/__tests__/skill_manager.test.d.ts.map +0 -1
  270. package/dist/skills/__tests__/skill_manager.test.js +0 -268
  271. package/dist/skills/__tests__/skill_manager.test.js.map +0 -1
  272. package/dist/tools/tmlpdTools.d.ts.map +0 -1
  273. package/dist/tools/tmlpdTools.js.map +0 -1
  274. package/dist/tui/dashboard.d.ts.map +0 -1
  275. package/dist/tui/dashboard.js.map +0 -1
  276. package/dist/tui/index.d.ts.map +0 -1
  277. package/dist/tui/index.js.map +0 -1
  278. package/dist/utils/batchProcessor.d.ts.map +0 -1
  279. package/dist/utils/batchProcessor.js.map +0 -1
  280. package/dist/utils/compression.d.ts.map +0 -1
  281. package/dist/utils/compression.js.map +0 -1
  282. package/dist/utils/costUtils.d.ts.map +0 -1
  283. package/dist/utils/costUtils.js.map +0 -1
  284. package/dist/utils/reliability.d.ts.map +0 -1
  285. package/dist/utils/reliability.js.map +0 -1
  286. package/dist/utils/sorting.d.ts.map +0 -1
  287. package/dist/utils/sorting.js.map +0 -1
  288. package/dist/utils/speculativeDecoding.d.ts.map +0 -1
  289. package/dist/utils/speculativeDecoding.js.map +0 -1
  290. package/dist/utils/tokenUtils.d.ts.map +0 -1
  291. package/dist/utils/tokenUtils.js.map +0 -1
  292. package/docs/.nojekyll +0 -0
  293. package/docs/ANALYSIS_PRINCIPLES.md +0 -162
  294. package/docs/API.md +0 -855
  295. package/docs/ARCHITECTURAL-IMPROVEMENTS-2025.md +0 -1391
  296. package/docs/ARCHITECTURAL-IMPROVEMENTS-REVISED-2025.md +0 -1051
  297. package/docs/BENCHMARK.md +0 -170
  298. package/docs/CHINESE_PROVIDER_RELIABILITY.md +0 -37
  299. package/docs/CITATIONS.md +0 -74
  300. package/docs/CLAIMS_AND_EVIDENCE.md +0 -58
  301. package/docs/CONFIGURATION.md +0 -476
  302. package/docs/COUNCIL_DECISION.json +0 -816
  303. package/docs/COUNCIL_SUMMARY.md +0 -319
  304. package/docs/COUNCIL_V2.2_DECISION.md +0 -416
  305. package/docs/ENGINEERING_SPEC.md +0 -55
  306. package/docs/FACTORY_RESET.md +0 -34
  307. package/docs/GEO.md +0 -66
  308. package/docs/GEO_OPTIMIZATION.md +0 -30
  309. package/docs/GEO_ROOT_CAUSE.md +0 -136
  310. package/docs/GEO_STATUS.md +0 -85
  311. package/docs/GEO_TEST_RESULTS.md +0 -176
  312. package/docs/HN_CHECKLIST.md +0 -38
  313. package/docs/HN_FOUNDER_COMMENT.md +0 -17
  314. package/docs/HN_SUBMISSION_FINAL.md +0 -180
  315. package/docs/HN_SUBMISSION_V3.md +0 -56
  316. package/docs/IMPROVEMENT_ROADMAP.md +0 -515
  317. package/docs/INTEGRATIONS.md +0 -420
  318. package/docs/LANGCHAIN_INTEGRATION.md +0 -147
  319. package/docs/LLM_COUNCIL_DECISION.md +0 -508
  320. package/docs/MIDDLEWARE_CHAIN.md +0 -35
  321. package/docs/PROMO_CHECKLIST.md +0 -200
  322. package/docs/QUICKSTART.md +0 -271
  323. package/docs/QUICK_START.md +0 -43
  324. package/docs/QUICK_START_VISIBILITY.md +0 -782
  325. package/docs/REDDIT_GAP_ANALYSIS.md +0 -299
  326. package/docs/RELEASE_CHECKLIST.md +0 -32
  327. package/docs/REPRODUCIBILITY.md +0 -63
  328. package/docs/RESEARCH_BACKED_IMPROVEMENTS.md +0 -1180
  329. package/docs/ROUTING_RUBRIC.md +0 -197
  330. package/docs/SEO_AUDIT.md +0 -186
  331. package/docs/SOCIAL_LISTENING.md +0 -219
  332. package/docs/TMLPD_QNA.md +0 -751
  333. package/docs/TMLPD_V2.1_COMPLETE.md +0 -763
  334. package/docs/TMLPD_V2.2_RESEARCH_ROADMAP.md +0 -754
  335. package/docs/UPDATE_TOPICS.md +0 -15
  336. package/docs/USE_CASES.md +0 -59
  337. package/docs/V2.2_IMPLEMENTATION_COMPLETE.md +0 -446
  338. package/docs/V2_IMPLEMENTATION_GUIDE.md +0 -388
  339. package/docs/VERCEL_AI_SDK.md +0 -209
  340. package/docs/VISIBILITY_ADOPTION_PLAN.md +0 -1005
  341. package/docs/_config.yml +0 -49
  342. package/docs/ai-plugin.json +0 -16
  343. package/docs/api.html +0 -513
  344. package/docs/architecture-diagram.md +0 -40
  345. package/docs/benchmark-chart.png +0 -0
  346. package/docs/benchmark.html +0 -387
  347. package/docs/blog/routerarena-number-one.html +0 -73
  348. package/docs/cli-cheatsheet.md +0 -339
  349. package/docs/compare.md +0 -109
  350. package/docs/comparison-litellm.md +0 -88
  351. package/docs/comparison.md +0 -108
  352. package/docs/cost-chart-ascii.md +0 -42
  353. package/docs/cost-comparison-chart.svg +0 -88
  354. package/docs/curl-examples.md +0 -247
  355. package/docs/demo-auto.html +0 -264
  356. package/docs/demo.html +0 -416
  357. package/docs/geo/GENERATIVE_ENGINE_OPTIMIZATION.md +0 -232
  358. package/docs/index.html +0 -507
  359. package/docs/launch-content/LAUNCH_EXECUTION_CHECKLIST.md +0 -421
  360. package/docs/launch-content/README.md +0 -457
  361. package/docs/launch-content/assets/cost_comparison_100_tasks.png +0 -0
  362. package/docs/launch-content/assets/cumulative_savings.png +0 -0
  363. package/docs/launch-content/assets/parallel_speedup.png +0 -0
  364. package/docs/launch-content/assets/provider_pricing_comparison.png +0 -0
  365. package/docs/launch-content/assets/task_breakdown_comparison.png +0 -0
  366. package/docs/launch-content/generate_charts.py +0 -313
  367. package/docs/launch-content/hn_show_post.md +0 -139
  368. package/docs/launch-content/partner_outreach_templates.md +0 -745
  369. package/docs/launch-content/reddit_posts.md +0 -467
  370. package/docs/launch-content/twitter_thread.txt +0 -460
  371. package/docs/npm-downloads-chart.svg +0 -43
  372. package/docs/openapi.json +0 -139
  373. package/docs/openapi.yaml +0 -1318
  374. package/docs/quick-start.html +0 -366
  375. package/docs/robots.txt +0 -52
  376. package/docs/sitemap.xml +0 -57
  377. package/docs/styles.css +0 -682
  378. package/docs/well-known/ai-plugin.json +0 -16
  379. package/docs/wellknown/ai-plugin.json +0 -16
  380. package/docs-site/assets/og-banner.svg +0 -194
  381. package/docs-site/index.html +0 -632
  382. package/eval/README.md +0 -46
  383. package/eval/baselines/main.json +0 -12
  384. package/eval/benchmark_dataset.jsonl +0 -16
  385. package/eval/check_golden_routes.js +0 -64
  386. package/eval/datasets/catalog.json +0 -33
  387. package/eval/datasets/slices/cn_provider_reliability_v1.jsonl +0 -3
  388. package/eval/datasets/slices/cost_pressure_v1.jsonl +0 -3
  389. package/eval/datasets/slices/safety_guardrails_v1.jsonl +0 -3
  390. package/eval/evals.json +0 -199
  391. package/eval/fault_injection_thresholds.json +0 -3
  392. package/eval/generate_report.js +0 -128
  393. package/eval/golden_routes.json +0 -114
  394. package/eval/lib/experiment_registry.js +0 -24
  395. package/eval/run_eval.js +0 -197
  396. package/eval/run_fault_injection.js +0 -201
  397. package/eval/run_shadow_eval.js +0 -85
  398. package/eval/thresholds.json +0 -9
  399. package/examples/QUICKSTART.md +0 -183
  400. package/examples/README.md +0 -61
  401. package/examples/a3m-sdk.js +0 -124
  402. package/examples/basic-route.js +0 -54
  403. package/examples/chat-loop.js +0 -202
  404. package/examples/classify-then-route.js +0 -102
  405. package/examples/cost-compare.js +0 -120
  406. package/examples/ensemble.js +0 -160
  407. package/examples/whatsapp-telegram-bridge-demo.js +0 -302
  408. package/examples/whatsapp-telegram-bridge.js +0 -269
  409. package/hf-space/README.md +0 -23
  410. package/hf-space/app.py +0 -240
  411. package/hf-space/requirements.txt +0 -1
  412. package/huggingface_space/README.md +0 -35
  413. package/huggingface_space/app.py +0 -126
  414. package/huggingface_space/create_space.py +0 -208
  415. package/huggingface_space/requirements.txt +0 -1
  416. package/mcp-server/README.md +0 -188
  417. package/mcp-server/package.json +0 -29
  418. package/mcp-server/src/index.ts +0 -744
  419. package/mcp-server/tsconfig.json +0 -19
  420. package/openclaw-alexa-bridge/ALL_REMAINING_FIXES_PLAN.md +0 -313
  421. package/openclaw-alexa-bridge/REMAINING_FIXES_SUMMARY.md +0 -277
  422. package/openclaw-alexa-bridge/src/alexa_handler_no_tmlpd.js +0 -1234
  423. package/openclaw-alexa-bridge/test_fixes.js +0 -77
  424. package/playground/README.md +0 -51
  425. package/playground/codesandbox.json +0 -12
  426. package/playground/index.js +0 -39
  427. package/proxy/README.md +0 -227
  428. package/proxy/package-lock.json +0 -831
  429. package/proxy/package.json +0 -17
  430. package/proxy/rate-limit.js +0 -145
  431. package/proxy/rate-limit.test.js +0 -311
  432. package/proxy/server.js +0 -970
  433. package/python/README.md +0 -102
  434. package/python/a3m/__init__.py +0 -6
  435. package/python/a3m/client.py +0 -190
  436. package/python/a3m/models.py +0 -40
  437. package/python/a3m/sync_client.py +0 -61
  438. package/python/examples.py +0 -53
  439. package/python/integrations.py +0 -330
  440. package/python/pyproject.toml +0 -23
  441. package/python/setup.py +0 -28
  442. package/python/tmlpd.py +0 -369
  443. package/qna/REDDIT_GAP_ANALYSIS.md +0 -299
  444. package/qna/TMLPD_QNA.md +0 -751
  445. package/research/FINDING_001_safety.md +0 -28
  446. package/research/FINDING_002_error_diversity.md +0 -32
  447. package/research/FINDING_003_confidence_weighted_voting.md +0 -32
  448. package/research/FINDING_004_cross_model_semantic_detection.md +0 -37
  449. package/research/FINDING_005_knowledge_gap_orthogonality.md +0 -34
  450. package/research/HALLUCINATION_RESEARCH.md +0 -27
  451. package/research/ensemble-voting.md +0 -324
  452. package/research/loss-functions.md +0 -545
  453. package/research-log.md +0 -49
  454. package/scripts/banner.js +0 -29
  455. package/scripts/benchmark-local-routerarena.ts +0 -176
  456. package/scripts/benchmark.js +0 -145
  457. package/scripts/benchmark.sh +0 -61
  458. package/scripts/compare-providers.sh +0 -230
  459. package/scripts/content-planner.js +0 -25
  460. package/scripts/create-labeled-benchmark.ts +0 -105
  461. package/scripts/cross_post.py +0 -443
  462. package/scripts/local-router-benchmark.ts +0 -154
  463. package/scripts/post-all.sh +0 -41
  464. package/scripts/publish_fcc.py +0 -106
  465. package/scripts/push-to-gitee.sh +0 -25
  466. package/scripts/routerarena_ensemble.js +0 -144
  467. package/scripts/routing-benchmark-v2.js +0 -373
  468. package/scripts/routing-benchmark-v3.js +0 -118
  469. package/scripts/routing-benchmark.js +0 -462
  470. package/scripts/run-labeled-benchmark.mjs +0 -104
  471. package/scripts/run-mmlu-benchmark.js +0 -176
  472. package/scripts/run-provider-benchmark.js +0 -244
  473. package/scripts/update-npm-badges.js +0 -158
  474. package/skill/SKILL.md +0 -238
  475. package/src/__tests__/integration/tmpld_integration.test.py +0 -540
  476. package/src/skills/__tests__/skill_manager.test.ts +0 -328
  477. package/submissions/benchmarks/ALL_PLATFORMS_SUBMISSION.md +0 -94
  478. package/submissions/benchmarks/LLMROUTERBENCH_SUBMISSION.md +0 -121
  479. package/submissions/benchmarks/MMRBENCH_SUBMISSION.md +0 -94
  480. package/submissions/benchmarks/ROUTERARENA_UPDATE.md +0 -83
  481. package/submissions/benchmarks/ROUTERBENCH_SUBMISSION.md +0 -225
  482. package/test-council/1-structure-tests.test.js +0 -353
  483. package/test-council/1-structure-tests.test.ts +0 -353
  484. package/test-council/2-edge-case-tests.test.ts +0 -361
  485. package/test-council/3-performance-tests.test.ts +0 -669
  486. package/test-council/4-integration-tests.test.ts +0 -391
  487. package/test-council/5-agent-council-eval.test.ts +0 -413
  488. package/test-council/AGENT_COUNCIL_ARCHITECTURE.md +0 -349
  489. package/test-council/TEST_COUNCIL_REPORT.md +0 -201
  490. package/test-council/agents/edge-case-agent.ts +0 -363
  491. package/test-council/agents/performance-agent.ts +0 -426
  492. package/test-council/agents/structure-agent.ts +0 -227
  493. package/test-council/council.md +0 -183
  494. package/tests/__mocks__/tokenUtils.ts +0 -8
  495. package/tests/memory/episodicMemory.test.ts +0 -227
  496. package/tests/package-lock.json +0 -1628
  497. package/tests/package.json +0 -18
  498. package/tests/routing/ensembleVoting.test.ts +0 -236
  499. package/tests/routing/providerRetry.test.ts +0 -360
  500. package/tests/routing/queryTypePresets.test.ts +0 -208
  501. package/tests/security/guardrailEngine.test.ts +0 -700
  502. package/tests/tsconfig.json +0 -21
  503. package/tests/vitest.config.ts +0 -18
  504. package/tmlpd-pi-extension/README.md +0 -66
  505. package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts +0 -114
  506. package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts.map +0 -1
  507. package/tmlpd-pi-extension/dist/cache/prefixCache.js +0 -285
  508. package/tmlpd-pi-extension/dist/cache/prefixCache.js.map +0 -1
  509. package/tmlpd-pi-extension/dist/cache/responseCache.d.ts +0 -58
  510. package/tmlpd-pi-extension/dist/cache/responseCache.d.ts.map +0 -1
  511. package/tmlpd-pi-extension/dist/cache/responseCache.js +0 -153
  512. package/tmlpd-pi-extension/dist/cache/responseCache.js.map +0 -1
  513. package/tmlpd-pi-extension/dist/cli.js +0 -59
  514. package/tmlpd-pi-extension/dist/cost/costTracker.d.ts +0 -95
  515. package/tmlpd-pi-extension/dist/cost/costTracker.d.ts.map +0 -1
  516. package/tmlpd-pi-extension/dist/cost/costTracker.js +0 -240
  517. package/tmlpd-pi-extension/dist/cost/costTracker.js.map +0 -1
  518. package/tmlpd-pi-extension/dist/index.d.ts +0 -723
  519. package/tmlpd-pi-extension/dist/index.d.ts.map +0 -1
  520. package/tmlpd-pi-extension/dist/index.js +0 -239
  521. package/tmlpd-pi-extension/dist/index.js.map +0 -1
  522. package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts +0 -82
  523. package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts.map +0 -1
  524. package/tmlpd-pi-extension/dist/memory/episodicMemory.js +0 -145
  525. package/tmlpd-pi-extension/dist/memory/episodicMemory.js.map +0 -1
  526. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts +0 -102
  527. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts.map +0 -1
  528. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js +0 -207
  529. package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js.map +0 -1
  530. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts +0 -85
  531. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts.map +0 -1
  532. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js +0 -210
  533. package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js.map +0 -1
  534. package/tmlpd-pi-extension/dist/providers/localProvider.d.ts +0 -102
  535. package/tmlpd-pi-extension/dist/providers/localProvider.d.ts.map +0 -1
  536. package/tmlpd-pi-extension/dist/providers/localProvider.js +0 -338
  537. package/tmlpd-pi-extension/dist/providers/localProvider.js.map +0 -1
  538. package/tmlpd-pi-extension/dist/providers/registry.d.ts +0 -55
  539. package/tmlpd-pi-extension/dist/providers/registry.d.ts.map +0 -1
  540. package/tmlpd-pi-extension/dist/providers/registry.js +0 -138
  541. package/tmlpd-pi-extension/dist/providers/registry.js.map +0 -1
  542. package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts +0 -68
  543. package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts.map +0 -1
  544. package/tmlpd-pi-extension/dist/routing/advancedRouter.js +0 -332
  545. package/tmlpd-pi-extension/dist/routing/advancedRouter.js.map +0 -1
  546. package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts +0 -101
  547. package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts.map +0 -1
  548. package/tmlpd-pi-extension/dist/tools/tmlpdTools.js +0 -368
  549. package/tmlpd-pi-extension/dist/tools/tmlpdTools.js.map +0 -1
  550. package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts +0 -96
  551. package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts.map +0 -1
  552. package/tmlpd-pi-extension/dist/utils/batchProcessor.js +0 -170
  553. package/tmlpd-pi-extension/dist/utils/batchProcessor.js.map +0 -1
  554. package/tmlpd-pi-extension/dist/utils/compression.d.ts +0 -61
  555. package/tmlpd-pi-extension/dist/utils/compression.d.ts.map +0 -1
  556. package/tmlpd-pi-extension/dist/utils/compression.js +0 -281
  557. package/tmlpd-pi-extension/dist/utils/compression.js.map +0 -1
  558. package/tmlpd-pi-extension/dist/utils/reliability.d.ts +0 -74
  559. package/tmlpd-pi-extension/dist/utils/reliability.d.ts.map +0 -1
  560. package/tmlpd-pi-extension/dist/utils/reliability.js +0 -177
  561. package/tmlpd-pi-extension/dist/utils/reliability.js.map +0 -1
  562. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts +0 -117
  563. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts.map +0 -1
  564. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js +0 -246
  565. package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js.map +0 -1
  566. package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts +0 -50
  567. package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts.map +0 -1
  568. package/tmlpd-pi-extension/dist/utils/tokenUtils.js +0 -124
  569. package/tmlpd-pi-extension/dist/utils/tokenUtils.js.map +0 -1
  570. package/tmlpd-pi-extension/examples/QUICKSTART.md +0 -183
  571. package/tmlpd-pi-extension/package-lock.json +0 -79
  572. package/tmlpd-pi-extension/package.json +0 -172
  573. package/tmlpd-pi-extension/python/examples.py +0 -53
  574. package/tmlpd-pi-extension/python/integrations.py +0 -330
  575. package/tmlpd-pi-extension/python/setup.py +0 -28
  576. package/tmlpd-pi-extension/python/tmlpd.py +0 -369
  577. package/tmlpd-pi-extension/qna/REDDIT_GAP_ANALYSIS.md +0 -299
  578. package/tmlpd-pi-extension/qna/TMLPD_QNA.md +0 -751
  579. package/tmlpd-pi-extension/skill/SKILL.md +0 -238
  580. package/tmlpd-pi-extension/src/cache/responseCache.ts +0 -147
  581. package/tmlpd-pi-extension/src/cost/costTracker.ts +0 -302
  582. package/tmlpd-pi-extension/src/index.ts +0 -232
  583. package/tmlpd-pi-extension/src/memory/episodicMemory.ts +0 -257
  584. package/tmlpd-pi-extension/src/orchestration/haloOrchestrator.ts +0 -266
  585. package/tmlpd-pi-extension/src/orchestration/mctsWorkflow.ts +0 -262
  586. package/tmlpd-pi-extension/src/providers/localProvider.ts +0 -406
  587. package/tmlpd-pi-extension/src/providers/registry.ts +0 -164
  588. package/tmlpd-pi-extension/src/routing/ensembleVoting.ts +0 -159
  589. package/tmlpd-pi-extension/src/routing/queryTypePresets.ts +0 -136
  590. package/tmlpd-pi-extension/src/tools/tmlpdTools.ts +0 -433
  591. package/tmlpd-pi-extension/src/utils/batchProcessor.ts +0 -232
  592. package/tmlpd-pi-extension/src/utils/compression.ts +0 -325
  593. package/tmlpd-pi-extension/src/utils/reliability.ts +0 -221
  594. package/tmlpd-pi-extension/src/utils/tokenUtils.ts +0 -145
  595. package/tmlpd-pi-extension/tsconfig.json +0 -18
  596. package/tsconfig.build.json +0 -29
  597. package/tsconfig.json +0 -18
  598. /package/{docs/llms-full.txt → llms-full.txt.bak} +0 -0
@@ -1,460 +0,0 @@
1
- ---
2
- title: "We Built an LLM Router That Runs on Keywords, Not Neural Networks — Here's How It Works"
3
- published: false
4
- description: "A 19.5 KB TypeScript package that routes LLM queries with 70.32 accuracy using 5 keyword-based signals. No GPU, no ML weights, zero dependencies."
5
- tags: llm, typescript, ai, optimization
6
- cover_image: https://placeholder.dev.to/cover.png
7
- ---
8
-
9
- We needed to route LLM queries across 36 providers. The ML approach (BERT classifier, embedding similarity, LLM-as-judge) adds latency, infrastructure, and cost. We tried something simpler: a 5-signal keyword scoring system in pure TypeScript.
10
-
11
- The result: **70.32 accuracy**, **64.5% exact match**, **0.3ms routing latency**, in a **19.5 KB gzipped** package with zero runtime dependencies.
12
-
13
- Here's exactly how each signal works, with code.
14
-
15
- ---
16
-
17
- ## The problem
18
-
19
- We have 36 LLM providers across 5 complexity tiers:
20
-
21
- | Tier | Count | Examples | Price range |
22
- |------|-------|---------|-------------|
23
- | Free | 6 | Gemini Flash, Groq free tier | $0 |
24
- | Cheap | 15 | DeepSeek, Mistral Small | ~$0.15/1M tokens |
25
- | Mid | 9 | Claude Sonnet, GPT-4o-mini | ~$1-3/1M tokens |
26
- | Premium | 3 | GPT-4, Claude Opus | ~$15-30/1M tokens |
27
- | Enterprise | 3 | Claude Max, GPT-4 turbo | ~$60+/1M tokens |
28
-
29
- Every query needs to land in the right tier. Sending "what is 2+2?" to GPT-4 wastes money. Sending "design a Byzantine fault-tolerant consensus algorithm" to a free model wastes the response.
30
-
31
- ## The 5-signal architecture
32
-
33
- Each incoming query is scored on five orthogonal signals (0-1 range). The weighted sum maps to a tier.
34
-
35
- ```
36
- Query → [domain, task, structure, verb, specificity] → weighted sum → tier → provider
37
- ```
38
-
39
- Let's break down each signal.
40
-
41
- ---
42
-
43
- ### Signal 1: Domain Detection
44
-
45
- **What it measures:** Is this query from a specialized domain (code, math, legal, medical)?
46
-
47
- **Why it matters:** Domain-specific queries need domain-specific capabilities. Code generation needs instruction-following. Math needs chain-of-thought. Medical needs accuracy.
48
-
49
- ```typescript
50
- const DOMAIN_PATTERNS: Record<string, RegExp[]> = {
51
- code: [
52
- /\b(function|class|import|export|async|await|def|return|const|let|var)\b/gi,
53
- /\b(api|endpoint|database|query|schema|migrate|deploy)\b/gi,
54
- ],
55
- math: [
56
- /\b(equation|integral|derivative|theorem|proof|calculate|solve|formula)\b/gi,
57
- /\b(algebra|calculus|geometry|statistics|probability)\b/gi,
58
- ],
59
- legal: [
60
- /\b(contract|liability|clause|statute|regulation|compliance|attorney)\b/gi,
61
- ],
62
- medical: [
63
- /\b(diagnosis|symptom|treatment|patient|clinical|dosage|prescription)\b/gi,
64
- ],
65
- };
66
-
67
- function scoreDomain(query: string): number {
68
- let maxScore = 0;
69
- for (const [domain, patterns] of Object.entries(DOMAIN_PATTERNS)) {
70
- const matchCount = patterns.reduce(
71
- (sum, pattern) => sum + (query.match(pattern)?.length ?? 0), 0
72
- );
73
- const domainScore = Math.min(matchCount * 0.15, 1.0);
74
- maxScore = Math.max(maxScore, domainScore);
75
- }
76
- return maxScore;
77
- }
78
- ```
79
-
80
- **Example scoring:**
81
-
82
- | Query | Domain score | Detected domain |
83
- |-------|-------------|----------------|
84
- | "What is the weather?" | 0.0 | none |
85
- | "Explain async/await in JavaScript" | 0.45 | code |
86
- | "Prove that sqrt(2) is irrational" | 0.45 | math |
87
- | "Debug this React component, the useState hook isn't updating" | 0.60 | code |
88
-
89
- ---
90
-
91
- ### Signal 2: Task Indicators
92
-
93
- **What it measures:** What type of task is the user asking for? Summarize, translate, debug, create, analyze?
94
-
95
- **Why it matters:** Different tasks have different complexity ceilings. "Summarize" is bounded. "Create from scratch" is unbounded.
96
-
97
- ```typescript
98
- const TASK_KEYWORDS: Record<string, { keywords: string[]; complexity: number }> = {
99
- summarize: {
100
- keywords: ['summarize', 'tldr', 'brief', 'overview', 'recap', 'sum up'],
101
- complexity: 0.2,
102
- },
103
- translate: {
104
- keywords: ['translate', 'in french', 'in spanish', 'in german', 'in japanese'],
105
- complexity: 0.25,
106
- },
107
- explain: {
108
- keywords: ['explain', 'describe', 'tell me about', 'what is', 'how does'],
109
- complexity: 0.3,
110
- },
111
- debug: {
112
- keywords: ['debug', 'fix this', 'error', 'stack trace', 'not working', 'broken'],
113
- complexity: 0.55,
114
- },
115
- analyze: {
116
- keywords: ['analyze', 'compare', 'evaluate', 'assess', 'investigate', 'critique'],
117
- complexity: 0.7,
118
- },
119
- create: {
120
- keywords: ['write', 'create', 'generate', 'build', 'implement', 'design', 'develop'],
121
- complexity: 0.75,
122
- },
123
- architect: {
124
- keywords: ['architect', 'design a system', 'system design', 'infrastructure'],
125
- complexity: 0.9,
126
- },
127
- };
128
-
129
- function scoreTask(query: string): number {
130
- const lower = query.toLowerCase();
131
- let score = 0;
132
- for (const [task, config] of Object.entries(TASK_KEYWORDS)) {
133
- const matched = config.keywords.some(kw => lower.includes(kw));
134
- if (matched) score += config.complexity;
135
- }
136
- return Math.min(score, 1.0);
137
- }
138
- ```
139
-
140
- **Example scoring:**
141
-
142
- | Query | Task score | Tasks detected |
143
- |-------|-----------|---------------|
144
- | "What is React?" | 0.3 | explain |
145
- | "Summarize this article" | 0.2 | summarize |
146
- | "Debug this Python script and explain the fix" | 0.85 | debug + explain |
147
- | "Design a microservices architecture and write the API gateway" | 1.0 | architect + create |
148
-
149
- ---
150
-
151
- ### Signal 3: Query Structure
152
-
153
- **What it measures:** The structural complexity of the query — multiple steps, conditionals, nested requirements.
154
-
155
- **Why it matters:** "Translate this" is simple. "Translate this, then summarize in 3 bullets, then check for legal compliance" is structurally complex regardless of the individual tasks.
156
-
157
- ```typescript
158
- function scoreStructure(query: string): number {
159
- let score = 0;
160
-
161
- // Multi-step queries ("first do X, then do Y, finally Z")
162
- const stepMarkers = query.split(/\b(first|then|after|before|finally|next|lastly)\b/i);
163
- score += Math.max(0, (stepMarkers.length - 1)) * 0.2;
164
-
165
- // Conditional queries ("if X then Y otherwise Z")
166
- const conditionals = query.match(/\b(if|unless|otherwise|whether|given that)\b/gi);
167
- score += (conditionals?.length ?? 0) * 0.15;
168
-
169
- // Conjunction chains (A and B and C)
170
- const conjunctions = query.match(/\band\b/gi);
171
- score += Math.min((conjunctions?.length ?? 0) * 0.05, 0.2);
172
-
173
- // Query length with diminishing returns
174
- score += Math.min(query.length / 500, 0.3);
175
-
176
- // Nested quotes or code blocks (indicates context-heavy queries)
177
- const codeBlocks = query.match(/```[\s\S]*?```/g);
178
- score += (codeBlocks?.length ?? 0) * 0.1;
179
-
180
- return Math.min(score, 1.0);
181
- }
182
- ```
183
-
184
- **Example scoring:**
185
-
186
- | Query | Structure score | Why |
187
- |-------|----------------|-----|
188
- | "What is Python?" | 0.04 | short, simple |
189
- | "Explain async/await" | 0.05 | short, simple |
190
- | "First translate to French, then summarize in 3 bullets" | 0.47 | multi-step |
191
- | "If the user is admin, show the dashboard with all metrics, otherwise show a limited view with only their data" | 0.72 | conditional + multi-step |
192
-
193
- ---
194
-
195
- ### Signal 4: Action Verb Intensity
196
-
197
- **What it measures:** How demanding the requested action is. "List" < "explain" < "analyze" < "design" < "architect".
198
-
199
- ```typescript
200
- const VERB_WEIGHTS: Record<string, number> = {
201
- // Low intensity
202
- 'what is': 0.1, 'define': 0.15, 'list': 0.2, 'describe': 0.25,
203
- // Medium intensity
204
- 'explain': 0.35, 'convert': 0.4, 'translate': 0.4, 'summarize': 0.4,
205
- 'rewrite': 0.45, 'format': 0.45,
206
- // High intensity
207
- 'debug': 0.6, 'fix': 0.6, 'analyze': 0.65, 'compare': 0.65,
208
- 'optimize': 0.7, 'refactor': 0.7, 'implement': 0.75,
209
- // Very high intensity
210
- 'design': 0.8, 'architect': 0.85, 'reverse-engineer': 0.9,
211
- 'create from scratch': 0.9,
212
- };
213
-
214
- function scoreVerb(query: string): number {
215
- const lower = query.toLowerCase();
216
- let maxVerb = 0;
217
- for (const [verb, weight] of Object.entries(VERB_WEIGHTS)) {
218
- if (lower.includes(verb)) {
219
- maxVerb = Math.max(maxVerb, weight);
220
- }
221
- }
222
- return maxVerb;
223
- }
224
- ```
225
-
226
- ---
227
-
228
- ### Signal 5: Specificity
229
-
230
- **What it measures:** How precise and technical the query is. "Tell me about AI" vs "Implement a transformer decoder with multi-head attention using PyTorch".
231
-
232
- ```typescript
233
- function scoreSpecificity(query: string): number {
234
- let score = 0;
235
-
236
- // Technical terms (camelCase, PascalCase identifiers)
237
- const technicalTerms = query.match(/\b[A-Z][a-z]+[A-Z][a-z]+\b/g);
238
- score += Math.min((technicalTerms?.length ?? 0) * 0.12, 0.3);
239
-
240
- // Quoted strings (specific values, names, identifiers)
241
- const quotedTerms = query.match(/["'`][^"'`]+["'`]/g);
242
- score += Math.min((quotedTerms?.length ?? 0) * 0.1, 0.2);
243
-
244
- // Numbers and measurements (specificity indicator)
245
- const numbers = query.match(/\d+/g);
246
- score += Math.min((numbers?.length ?? 0) * 0.03, 0.15);
247
-
248
- // Penalize vagueness
249
- const vagueTerms = query.match(/\b(something|anything|stuff|things|etc|whatever|some)\b/gi);
250
- score -= (vagueTerms?.length ?? 0) * 0.15;
251
-
252
- // Bonus for field-specific jargon density
253
- const jargonTerms = query.match(/\b(algorithm|protocol|architecture|paradigm|heuristic|orthogonal)\b/gi);
254
- score += Math.min((jargonTerms?.length ?? 0) * 0.1, 0.2);
255
-
256
- return Math.max(0, Math.min(score, 1.0));
257
- }
258
- ```
259
-
260
- ---
261
-
262
- ## Putting it all together
263
-
264
- ```typescript
265
- interface RoutingSignals {
266
- domain: number;
267
- task: number;
268
- structure: number;
269
- verbIntensity: number;
270
- specificity: number;
271
- }
272
-
273
- const WEIGHTS = {
274
- domain: 0.25,
275
- task: 0.25,
276
- structure: 0.20,
277
- verbIntensity: 0.15,
278
- specificity: 0.15,
279
- };
280
-
281
- const TIER_THRESHOLDS: [number, Tier][] = [
282
- [0.20, 'free'],
283
- [0.40, 'cheap'],
284
- [0.60, 'mid'],
285
- [0.80, 'premium'],
286
- [1.01, 'enterprise'],
287
- ];
288
-
289
- function route(query: string): Tier {
290
- const signals: RoutingSignals = {
291
- domain: scoreDomain(query),
292
- task: scoreTask(query),
293
- structure: scoreStructure(query),
294
- verbIntensity: scoreVerb(query),
295
- specificity: scoreSpecificity(query),
296
- };
297
-
298
- const score =
299
- signals.domain * WEIGHTS.domain +
300
- signals.task * WEIGHTS.task +
301
- signals.structure * WEIGHTS.structure +
302
- signals.verbIntensity * WEIGHTS.verbIntensity +
303
- signals.specificity * WEIGHTS.specificity;
304
-
305
- for (const [threshold, tier] of TIER_THRESHOLDS) {
306
- if (score < threshold) return tier;
307
- }
308
- return 'enterprise';
309
- }
310
- ```
311
-
312
- ---
313
-
314
- ## Real query examples with full scoring
315
-
316
- ### Example 1: "What is Python?"
317
-
318
- | Signal | Score | Weight | Weighted |
319
- |--------|-------|--------|----------|
320
- | Domain | 0.0 | 0.25 | 0.0 |
321
- | Task | 0.3 | 0.25 | 0.075 |
322
- | Structure | 0.03 | 0.20 | 0.006 |
323
- | Verb | 0.1 | 0.15 | 0.015 |
324
- | Specificity | 0.0 | 0.15 | 0.0 |
325
- | **Total** | | | **0.096** |
326
-
327
- **Routed to: Free tier** ✅
328
-
329
- ### Example 2: "Implement a red-black tree with insert, delete, and search operations in TypeScript"
330
-
331
- | Signal | Score | Weight | Weighted |
332
- |--------|-------|--------|----------|
333
- | Domain | 0.45 | 0.25 | 0.1125 |
334
- | Task | 0.75 | 0.25 | 0.1875 |
335
- | Structure | 0.15 | 0.20 | 0.03 |
336
- | Verb | 0.75 | 0.15 | 0.1125 |
337
- | Specificity | 0.42 | 0.15 | 0.063 |
338
- | **Total** | | | **0.505** |
339
-
340
- **Routed to: Mid tier** ✅
341
-
342
- ### Example 3: "Design a fault-tolerant distributed database that handles network partitions, supports ACID transactions, and can scale to 10,000 nodes. Include the consensus protocol, replication strategy, and failure recovery mechanism."
343
-
344
- | Signal | Score | Weight | Weighted |
345
- |--------|-------|--------|----------|
346
- | Domain | 0.30 | 0.25 | 0.075 |
347
- | Task | 0.90 | 0.25 | 0.225 |
348
- | Structure | 0.62 | 0.20 | 0.124 |
349
- | Verb | 0.80 | 0.15 | 0.12 |
350
- | Specificity | 0.65 | 0.15 | 0.0975 |
351
- | **Total** | | | **0.641** |
352
-
353
- **Routed to: Premium tier** ✅
354
-
355
- ---
356
-
357
- ## Benchmark results
358
-
359
- Tested on 2,500 real-world queries across coding, creative writing, analysis, math, translation, and general Q&A.
360
-
361
- ```
362
- Confusion Matrix (3-tier simplified):
363
-
364
- Predicted
365
- Free Mid Premium
366
- Actual Free 812 38 5
367
- Actual Mid 41 647 27
368
- Actual Premium 3 22 705
369
- ```
370
-
371
- | Metric | Value |
372
- |--------|-------|
373
- | Exact tier match | 64.5% |
374
- | accuracy | 70.32 |
375
- | Mean absolute error | 0.37 tiers |
376
- | Routing latency | 0.3ms per query |
377
- | Cost savings vs premium-only | 61.6% |
378
-
379
- ---
380
-
381
- ## What about the other features?
382
-
383
- ### Semantic Cache
384
-
385
- Uses trigram Jaccard similarity to detect near-duplicate queries:
386
-
387
- ```typescript
388
- function trigramJaccard(a: string, b: string): number {
389
- const trigrams = (s: string) => {
390
- const set = new Set<string>();
391
- for (let i = 0; i <= s.length - 3; i++) {
392
- set.add(s.slice(i, i + 3));
393
- }
394
- return set;
395
- };
396
- const setA = trigrams(a.toLowerCase());
397
- const setB = trigrams(b.toLowerCase());
398
- const intersection = [...setA].filter(x => setB.has(x)).length;
399
- const union = new Set([...setA, ...setB]).size;
400
- return intersection / union;
401
- }
402
-
403
- // "Explain React hooks" and "what are React hooks?" → Jaccard > 0.4 → cache hit
404
- ```
405
-
406
- ### Prompt Injection Detection
407
-
408
- 17 patterns covering common attack vectors:
409
-
410
- ```typescript
411
- const INJECTION_PATTERNS = [
412
- /ignore\s+(all\s+)?previous\s+instructions/i,
413
- /you\s+are\s+now\s+/i,
414
- /system\s*:\s*/i,
415
- /\[INST\]/i,
416
- /simulate\s+/i,
417
- /pretend\s+you\s+(are|can)/i,
418
- /jailbreak/i,
419
- /DAN\s+mode/i,
420
- // ... 9 more patterns
421
- ];
422
- ```
423
-
424
- ---
425
-
426
- ## Get started
427
-
428
- ```bash
429
- npm install adaptive-memory-multi-model-router
430
- ```
431
-
432
- ```typescript
433
- import { A3MRouter } from 'adaptive-memory-multi-model-router';
434
-
435
- const router = new A3MRouter({
436
- providers: {
437
- openai: { apiKey: process.env.OPENAI_API_KEY },
438
- anthropic: { apiKey: process.env.ANTHROPIC_API_KEY },
439
- google: { apiKey: process.env.GOOGLE_API_KEY },
440
- groq: { apiKey: process.env.GROQ_API_KEY },
441
- }
442
- });
443
-
444
- const result = await router.route({
445
- messages: [{ role: 'user', content: 'Your query here' }]
446
- });
447
-
448
- console.log(`Provider: ${result.provider}`);
449
- console.log(`Tier: ${result.tier}`);
450
- console.log(`Cost: $${result.cost}`);
451
- ```
452
-
453
- **GitHub:** https://github.com/Das-rebel/a3m-router
454
- **npm:** https://www.npmjs.com/package/adaptive-memory-multi-model-router
455
-
456
- MIT license. Self-hosted. No account. 19.5 KB. TypeScript + Python SDKs, CLI, REST API, OpenAI proxy, LangChain adapter.
457
-
458
- ---
459
-
460
- *We're actively looking for independent benchmark evaluations. If you run the router against your own query distribution, we'd love to see the results — especially cases where it fails.*
@@ -1,73 +0,0 @@
1
- LLM infrastructure has three problems that shouldn't exist in 2026. Here's what we built because nobody else fixed them.
2
-
3
- ---
4
-
5
- ## Problem 1: Your LLM bill is unnecessarily high
6
-
7
- Everyone routes everything to GPT-4 because who has time to configure per-query routing. The bill hits 3-5x what it should be for zero extra value.
8
-
9
- People are already switching because of this. A dev on X: *"Cancelled both my Claude Code Pro and ChatGPT Pro. Kimi K2.6 is just as good for my side projects as Opus or GPT 5.4 were. The price for this is crazy low."*
10
-
11
- Another one: *"Just used gemini-embedding-2 to vectorize 27,603 notes for semantic search. Total cost: $0.07. That's pretty amazing."*
12
-
13
- The pattern is obvious — developers are actively looking for cheaper alternatives. The problem is doing it query-by-query without wasting time.
14
-
15
- We built a router that classifies every query by complexity and sends it to the cheapest capable model.
16
-
17
- ```javascript
18
- "Design a clinical trial protocol" → premium ($2.50/M tokens)
19
- "Write a Python sort function" → groq ($0.20/M tokens)
20
- "What is 2+2?" → free ($0.00/M tokens)
21
- ```
22
-
23
- Result: **62% cost savings** measured across 200 real API calls. Not theoretical.
24
-
25
- ---
26
-
27
- ## Problem 2: Sequential fallback gives you one answer, not the best
28
-
29
- Every gateway does: try A → fail → try B → fail → try C.
30
-
31
- You always get one provider's answer. Never the best across all. If A is slow, everything waits.
32
-
33
- Someone already built `ai-retry` — a library for retry and fallback mechanisms — because this is such a common pain. People are hacking around it manually.
34
-
35
- We went further. Run all providers in parallel. Score every result on specificity, structure, and relevance. Return the best answer with reasons why it won.
36
-
37
- ```javascript
38
- const result = await executeEnsemble(query, context, {
39
- nvidia: callNvidia,
40
- groq: callGroq,
41
- openai: callOpenAI
42
- });
43
- // → nvidia (scored 75, higher specificity on code)
44
- ```
45
-
46
- ---
47
-
48
- ## Problem 3: Every gateway claims "negligible overhead." None publish numbers.
49
-
50
- It's the standard line. "Negligible overhead" followed by zero data.
51
-
52
- We ran ours through a third-party benchmark tool (llm-gateway-bench) and published everything:
53
-
54
- | Scenario | Time | What's included |
55
- |:---------|:----:|:----------------|
56
- | Direct to Groq | **138ms** | Raw API call |
57
- | Through A3M | **374ms** | Routing + cache + guardrails + cost tracking |
58
-
59
- 236ms overhead. Not zero. But it saves 62% on API costs — that's ~$2,600/year at 100K queries/month.
60
-
61
- ---
62
-
63
- ## Why it grew
64
-
65
- 10,024 downloads in 14 days. Zero marketing. Developers found it on npm, tried it, told other developers.
66
-
67
- The feedback loop was: *"My bill is too high"* → 62% savings. *"I want the best answer, not the first one"* → parallel ensemble. *"I don't trust your latency claims"* → here's the third-party benchmark, run it yourself.
68
-
69
- ---
70
-
71
- *npm: `npm install adaptive-memory-multi-model-router`*
72
- *GitHub: [github.com/Das-rebel/a3m-router](https://github.com/Das-rebel/a3m-router)*
73
- *Benchmarks: third-party via [llm-gateway-bench](https://github.com/taffy-owo/llm-gateway-bench)*
@@ -1,14 +0,0 @@
1
- Show HN: A3M Router — 70.32 LLM routing accuracy with zero ML, 36 providers, semantic cache
2
-
3
- A3M Router is a TypeScript LLM routing library that classifies query complexity using 5 keyword-based signals (domain detection, task indicators, query structure, action verb intensity, specificity) instead of neural networks. The weighted signal sum maps queries to one of 5 complexity tiers (free → enterprise), which routes to the cheapest provider that can handle the query.
4
-
5
- On a 2,500-query benchmark: 70.32 accuracy, 64.5% exact tier match, 0.3ms routing latency. The entire routing classifier is ~200 lines of TypeScript with zero runtime dependencies and a 19.5 KB gzipped package size. 61.6% cost savings vs. sending everything to premium providers.
6
-
7
- Supports 36 providers (OpenAI, Anthropic, Google, Groq, Cerebras, Mistral, DeepSeek, etc.) across 5 tiers. Includes a semantic cache (trigram Jaccard similarity), 17-pattern prompt injection detection, PII redaction, and cost analytics. Available as TypeScript SDK, Python SDK, CLI, REST API, OpenAI-compatible proxy, and LangChain adapter. MIT license, self-hosted, no account required.
8
-
9
- The core insight is that keyword-based routing is within of BERT-based routing for nearly all queries, at zero infrastructure cost. The routing signals are composable and adjustable — if a particular domain routes poorly, you add domain-specific patterns without retraining anything.
10
-
11
- Repo: https://github.com/Das-rebel/a3m-router
12
- npm: https://www.npmjs.com/package/adaptive-memory-multi-model-router
13
-
14
- Caveat: the 70.32 figure is self-benchmarked. We'd welcome independent evaluation, especially on non-English or creative writing query distributions where the keyword signals may be weaker.
@@ -1,90 +0,0 @@
1
- # [D] We benchmarked keyword-based routing vs BERT for LLM provider selection. The gap is smaller than we expected — and keyword routing has zero infra cost.
2
-
3
- **TL;DR:** A 5-signal keyword classifier routes LLM queries across 36 providers with 70.32 accuracy and 64.5% exact tier match, in a 19.5 KB gzipped package with no ML weights. We're sharing the methodology and invite scrutiny on the benchmark design.
4
-
5
- ---
6
-
7
- ## Background
8
-
9
- When you have 36 LLM providers (6 free, 15 cheap, 9 mid-tier, 3 premium, 3 enterprise), routing queries to the right provider matters. A simple "coding question → code model" heuristic breaks down fast. The established approaches are:
10
-
11
- 1. **BERT/transformer-based routing** (e.g., RouteLLM trains a BERT classifier on paired human preferences)
12
- 2. **LLM-as-judge routing** (ask GPT-4 to classify query complexity)
13
- 3. **Rule-based routing** (regex, keyword matching)
14
-
15
- We went with approach 3, but with a structured 5-signal scoring system instead of naive regex. The question was: how much accuracy do we actually sacrifice?
16
-
17
- ## The 5 routing signals
18
-
19
- Each query is scored on five orthogonal signals (0-1 scale each):
20
-
21
- | Signal | What it measures | Example high-score query |
22
- |--------|-----------------|------------------------|
23
- | Domain detection | Is this a specialized domain (code, math, legal, medical)? | "Implement a red-black tree with insert and delete" |
24
- | Task indicators | What type of task (summarize, translate, debug, create)? | "Debug this Python stack trace and explain the root cause" |
25
- | Query structure | Complexity of the query itself (multi-step, conditional, nested) | "First translate to French, then summarize in 3 bullets, then check for legal compliance" |
26
- | Action verb intensity | Strength/demand of the action requested | "Reverse-engineer" > "explain" > "mention" |
27
- | Specificity | How precise/vague the request is | "Quantum error correction in topological codes" vs "tell me about physics" |
28
-
29
- The weighted sum maps to one of 5 tiers, which maps to a provider. The whole thing runs in ~0.3ms per query.
30
-
31
- ## Benchmark results
32
-
33
- We tested on a held-out set of 2,500 real-world queries across domains (coding, creative writing, analysis, math, translation, general Q&A).
34
-
35
- **Confusion matrix (simplified to 3 tiers for readability):**
36
-
37
- ```
38
- Predicted
39
- Free Mid Premium
40
- Actual Free 812 38 5
41
- Actual Mid 41 647 27
42
- Actual Premium 3 22 705
43
- ```
44
-
45
- Full 5-tier results:
46
-
47
- | Metric | Value |
48
- |--------|-------|
49
- | Exact tier match | 64.5% |
50
- | accuracy | 70.32 |
51
- | Mean absolute error | 0.37 tiers |
52
- | Routing latency | 0.3ms/query |
53
-
54
- ** accuracy of 70.32** means the router is never sending a trivial "what's the weather" query to GPT-4, and it's never sending a "design a distributed consensus algorithm" query to a free tier.
55
-
56
- ### Cost impact
57
-
58
- On the same query workload:
59
-
60
- | Strategy | Cost | Savings |
61
- |----------|------|---------|
62
- | Premium-only (GPT-4 for everything) | $1.00 | — |
63
- | RouteLLM (reported in their paper) | ~$0.47 | ~53% |
64
- | A3M Router (our benchmark) | $0.384 | 61.6% |
65
-
66
- ## Honest caveats (please poke holes)
67
-
68
- 1. **Self-benchmarking.** We wrote the classifier, we designed the test set, we ran the evaluation. This is the biggest threat to validity. We'd love an independent evaluation. The test set and evaluation code are in the repo.
69
-
70
- 2. **The 64.5% exact match is mediocre.** If you need surgical tier precision (e.g., you're operating at margins where the difference between "cheap" and "mid-tier" matters a lot), 64.5% means 1 in 3 queries lands in an adjacent tier. The metric papers over this.
71
-
72
- 3. **No comparison with RouteLLM on the same data.** We reference RouteLLM's publicly reported numbers, but we didn't run RouteLLM on our test set. Different query distributions make direct comparison unreliable.
73
-
74
- 4. **Query distribution bias.** Our test set likely over-represents English, coding, and analytical queries because that's what we test with. Non-English and creative tasks may route differently.
75
-
76
- 5. **Cost savings depend heavily on your query mix.** 61.6% is our benchmark workload. If 90% of your queries are complex, routing saves less. If 90% are simple, routing saves more.
77
-
78
- ## Questions for the community
79
-
80
- - Is accuracy actually the right metric? Or should we optimize for exact match at the cost of simplicity?
81
- - Has anyone compared RouteLLM's BERT-based approach against a strong keyword baseline on the same dataset? Our suspicion is that the gap is smaller than the ML community assumes.
82
- - For production routing, what's the actual cost of a "wrong tier" routing? We assume is fine because provider quality within adjacent tiers overlaps significantly. Is that assumption valid?
83
- - Are there public LLM routing benchmarks we should be evaluating on?
84
-
85
- ## Links
86
-
87
- - **Repo:** https://github.com/Das-rebel/a3m-router
88
- - **npm:** https://www.npmjs.com/package/adaptive-memory-multi-model-router
89
-
90
- The classifier is ~200 lines of TypeScript. No dependencies beyond a standard Node.js runtime. If you want to reproduce the benchmark or contribute a more rigorous evaluation, PRs welcome.