adaptive-memory-multi-model-router 2.14.46 → 2.14.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{docs/llms.txt → llms.txt.bak} +6 -6
- package/package.json +13 -84
- package/src/routing/advancedRouter.ts.bak +650 -0
- package/test.js.bak +376 -0
- package/.dockerignore +0 -82
- package/.env.example +0 -303
- package/.github/DISCUSSIONS_WELCOME.md +0 -27
- package/.github/DISCUSSION_TEMPLATE.yml +0 -5
- package/.github/FUNDING.yml +0 -2
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -94
- package/.github/ISSUE_TEMPLATE/config.yml +0 -17
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -71
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -71
- package/.github/dependabot.yml +0 -9
- package/.github/workflows/auto-publish.yml +0 -51
- package/.github/workflows/ci.yml +0 -263
- package/.github/workflows/codeql.yml +0 -38
- package/.github/workflows/npm-publish.yml +0 -20
- package/.github/workflows/pages.yml +0 -37
- package/.github/workflows/stale.yml +0 -54
- package/.publish-tick +0 -1
- package/.well-known/ai-plugin.json +0 -16
- package/AGENT_COUNCIL_FINDINGS.md +0 -142
- package/ARCHITECTURE.md +0 -346
- package/AUDIT_REPORT.md +0 -28
- package/CODE_OF_CONDUCT.md +0 -128
- package/CONTRIBUTING.md +0 -50
- package/CONTRIBUTORS.md +0 -20
- package/Dockerfile +0 -53
- package/Dockerfile.proxy +0 -33
- package/HEALTH_REPORT.md +0 -118
- package/IMPROVEMENT_PLAN.md +0 -107
- package/LANDING.md +0 -43
- package/LAUNCH-PAIN-DRIVEN.md +0 -339
- package/LAUNCH.md +0 -337
- package/LAUNCH_CHECKLIST.md +0 -141
- package/LAUNCH_SNAPSHOT.md +0 -260
- package/MANIFESTO.md +0 -41
- package/POPULARITY_BOOSTERS.md +0 -285
- package/PR_STATUS_REPORT.md +0 -148
- package/REDESIGN.md +0 -95
- package/RUNKIT.md +0 -83
- package/SECURITY.md +0 -29
- package/SUBMISSIONS.md +0 -43
- package/_schema.html +0 -53
- package/ai-plugin.json +0 -16
- package/articles/AI_AGENT_LLM_ROUTING.md +0 -150
- package/articles/CHINESE_DIRECTORIES.md +0 -100
- package/articles/CHINESE_SUBMISSIONS_READY.md +0 -322
- package/articles/COMPETITOR_ALERTS.md +0 -31
- package/articles/COMPLETE_POSTING_DIRECTORY.md +0 -147
- package/articles/CONTENT_STRUCTURE.md +0 -292
- package/articles/DEVTO_COST_GUIDE.md +0 -473
- package/articles/DEVTO_FINAL.md +0 -416
- package/articles/DEVTO_MULTI_PROVIDER.md +0 -542
- package/articles/DEVTO_READY.md +0 -255
- package/articles/DEVTO_V2_ANNOUNCEMENT.md +0 -160
- package/articles/DEVTO_VIRAL_GROWTH.md +0 -280
- package/articles/FRESH_devto.md +0 -460
- package/articles/FRESH_devto_2026_05.md +0 -73
- package/articles/FRESH_hackernews.md +0 -14
- package/articles/FRESH_reddit_ml.md +0 -90
- package/articles/FRESH_reddit_node.md +0 -198
- package/articles/FRESH_reddit_sideproject.md +0 -72
- package/articles/FRESH_reddit_webdev.md +0 -130
- package/articles/FROM_ZERO_TO_10K.md +0 -107
- package/articles/HN_10X_BETTER.md +0 -430
- package/articles/HN_ACCOUNT_GUIDE.md +0 -21
- package/articles/HN_CHINESE_STYLE.md +0 -308
- package/articles/HN_FINAL.md +0 -148
- package/articles/HN_POSTED_VERSION.md +0 -56
- package/articles/HN_POST_READY.md +0 -137
- package/articles/HN_RESEARCH.md +0 -364
- package/articles/HN_SHOW_routerarena.md +0 -17
- package/articles/HN_TIMING_GUIDE.md +0 -52
- package/articles/INDIEHACKERS_POST.md +0 -52
- package/articles/INDIEHACKERS_READY.md +0 -120
- package/articles/LLM_BENCHMARK_DEEP_DIVE.md +0 -153
- package/articles/MASTER_POSTING_DIRECTORY.md +0 -189
- package/articles/NEWSLETTER_SEND_NOW.md +0 -259
- package/articles/NEWSLETTER_SUBMISSIONS.md +0 -112
- package/articles/PAIN-DRIVEN-devto-v2.md +0 -308
- package/articles/PAIN-DRIVEN-devto-v3.md +0 -268
- package/articles/PAIN-DRIVEN-devto.md +0 -242
- package/articles/PAIN-DRIVEN-hackernews-v2.md +0 -138
- package/articles/PAIN-DRIVEN-hackernews-v3.md +0 -151
- package/articles/PAIN-DRIVEN-hackernews.md +0 -131
- package/articles/PAIN-DRIVEN-reddit-v2.md +0 -301
- package/articles/PAIN-DRIVEN-reddit-v3.md +0 -236
- package/articles/PAIN-DRIVEN-reddit.md +0 -218
- package/articles/PAIN-DRIVEN-twitter-v2.md +0 -110
- package/articles/PAIN-DRIVEN-twitter-v3.md +0 -121
- package/articles/PAIN-DRIVEN-twitter.md +0 -120
- package/articles/PORTKEY_VS_A3M.md +0 -147
- package/articles/POSTING_KIT_2026_05.md +0 -67
- package/articles/PRESS_KIT_routerarena.md +0 -77
- package/articles/PRODUCTHUNT_LISTING.md +0 -48
- package/articles/PRODUCTHUNT_READY.md +0 -106
- package/articles/PR_PLAN_vault.md +0 -125
- package/articles/REDDIT_FINAL.md +0 -232
- package/articles/REDDIT_POST.md +0 -67
- package/articles/REDDIT_SUBMISSION_READY.md +0 -348
- package/articles/ROUTERARENA_LEADER.md +0 -45
- package/articles/SHOW_HN_FINAL.md +0 -29
- package/articles/TWEETS_10K_DOWNLOADS.md +0 -47
- package/articles/TWEETS_BENCHMARK_FIRST.md +0 -46
- package/articles/TWEETS_MCP_PLAY.md +0 -51
- package/articles/TWEETS_SEQUENTIAL_BROKEN.md +0 -49
- package/articles/TWEETS_WHY_BUILD.md +0 -54
- package/articles/TWEETS_routerarena_leader.md +0 -53
- package/articles/TWEET_STORM_READY.md +0 -165
- package/articles/TWITTER_FINAL.md +0 -167
- package/articles/WHY_10X_BETTER.md +0 -261
- package/articles/WHY_CHINESE_STYLE_BETTER.md +0 -323
- package/articles/ai-discoverability-llm-routing.md +0 -210
- package/articles/devto-llm-routing.md +0 -138
- package/articles/hackernews-show-hn.md +0 -54
- package/articles/hashnode-llm-cost-optimization.md +0 -125
- package/articles/hn_show_2026_05.md +0 -11
- package/articles/medium-building-llm-router.md +0 -205
- package/articles/reddit-ml.md +0 -76
- package/articles/twitter-thread-cost-savings.md +0 -50
- package/articles/youtube-tutorial-script.md +0 -262
- package/assets/a3m_3blue1brown.mp4 +0 -0
- package/assets/banner.svg +0 -109
- package/assets/chart-cost-v2.svg +0 -91
- package/assets/chart-cost-v3.svg +0 -143
- package/assets/chart-features-v2.svg +0 -132
- package/assets/chart-features-v3.svg +0 -211
- package/assets/chart-growth-v2.svg +0 -122
- package/assets/chart-growth-v3.svg +0 -189
- package/assets/cost-comparison.svg +0 -134
- package/assets/cost-simple.svg +0 -64
- package/assets/demo-hn.gif +0 -0
- package/assets/feature-matrix.svg +0 -136
- package/assets/growth-chart-animated.svg +0 -76
- package/assets/growth-chart.svg +0 -82
- package/assets/growth-simple.svg +0 -69
- package/assets/hero-diagram.svg +0 -81
- package/assets/logo-new.svg +0 -21
- package/assets/logo.svg +0 -68
- package/assets/provider-comparison.svg +0 -121
- package/assets/social-preview-new.svg +0 -100
- package/assets/social-preview.svg +0 -194
- package/assets/social-v2.svg +0 -130
- package/assets/social-v3.svg +0 -212
- package/benchmark-provider-results.json +0 -245
- package/benchmark-results.json +0 -54
- package/council-votes/architecture-vote.md +0 -121
- package/council-votes/coverage-vote.md +0 -93
- package/data/adaptive-benchmark.json +0 -92
- package/data/benchmark-results.json +0 -47
- package/data/labeled-benchmark.json +0 -88
- package/demo/3blue1brown_video.py +0 -285
- package/demo/3blue1brown_video_v2.py +0 -310
- package/demo/IMPROVED_PROMPTS.md +0 -229
- package/demo/VEO3_PROMPTS.md +0 -269
- package/demo/VIDEO_PRODUCTION_GUIDE.md +0 -333
- package/demo/a3m_3blue1brown.mp4 +0 -0
- package/demo/asciinema-demo.sh +0 -195
- package/demo/demo-hn.tape +0 -74
- package/demo/demo-script.md +0 -53
- package/demo/demo-script.sh +0 -62
- package/demo/demo.svg +0 -75
- package/demo/frame1_ai_data_center.png +0 -0
- package/demo/frame1_sunset_video.mp4 +0 -0
- package/demo/frame2_cost_comparison.png +0 -0
- package/demo/frame2_cost_comparison_fallback.png +0 -0
- package/demo/frame3_parallel_execution.png +0 -0
- package/demo/frame3_parallel_execution_fallback.png +0 -0
- package/demo/frame4_providers.png +0 -0
- package/demo/frame4_providers_fallback.png +0 -0
- package/demo/frame5_endcard.png +0 -0
- package/demo/frame5_endcard_fallback.png +0 -0
- package/demo/new_frame1_hook.png +0 -0
- package/demo/new_frame2_proof.png +0 -0
- package/demo/new_frame3_wow.png +0 -0
- package/demo/new_frame4_social.png +0 -0
- package/demo/new_frame5_cta.png +0 -0
- package/demo/package.json +0 -13
- package/demo/product-video-final.mp4 +0 -0
- package/demo/product-video-hype-v1.mp4 +0 -0
- package/demo/product-video-v1.mp4 +0 -0
- package/demo/public/index.html +0 -762
- package/demo/recording.cast +0 -55
- package/demo/server.js +0 -405
- package/demo-new.tape +0 -71
- package/demo-real.sh +0 -198
- package/demo-simple.tape +0 -205
- package/demo.html +0 -520
- package/demo.sh +0 -85
- package/demo.tape +0 -259
- package/dist/analytics/costAnalytics.d.ts.map +0 -1
- package/dist/analytics/costAnalytics.js.map +0 -1
- package/dist/benchmark/comprehensive.js.map +0 -1
- package/dist/benchmark/reproducible.d.ts.map +0 -1
- package/dist/benchmark/reproducible.js.map +0 -1
- package/dist/cache/prefixCache.d.ts.map +0 -1
- package/dist/cache/prefixCache.js.map +0 -1
- package/dist/cache/responseCache.d.ts.map +0 -1
- package/dist/cache/responseCache.js.map +0 -1
- package/dist/cache/semanticCache.d.ts.map +0 -1
- package/dist/cache/semanticCache.js.map +0 -1
- package/dist/cli/setupWizard.d.ts.map +0 -1
- package/dist/cli/setupWizard.js.map +0 -1
- package/dist/cost/budgetEnforcer.d.ts.map +0 -1
- package/dist/cost/budgetEnforcer.js.map +0 -1
- package/dist/cost/costTracker.d.ts.map +0 -1
- package/dist/cost/costTracker.js.map +0 -1
- package/dist/ensemble/multiRoundDialog.js.map +0 -1
- package/dist/ensemble/shapleyValue.js.map +0 -1
- package/dist/integrations/langchainAdapter.d.ts.map +0 -1
- package/dist/integrations/langchainAdapter.js.map +0 -1
- package/dist/integrations/oauth.d.ts.map +0 -1
- package/dist/integrations/oauth.js.map +0 -1
- package/dist/integrations/scienceAdapter.js.map +0 -1
- package/dist/memory/autoFetch.d.ts.map +0 -1
- package/dist/memory/autoFetch.js.map +0 -1
- package/dist/memory/episodicMemory.d.ts.map +0 -1
- package/dist/memory/episodicMemory.js.map +0 -1
- package/dist/memory/hybridMemory.js.map +0 -1
- package/dist/memory/memoryTree.d.ts.map +0 -1
- package/dist/memory/memoryTree.js.map +0 -1
- package/dist/memory/obsidianVault.d.ts.map +0 -1
- package/dist/memory/obsidianVault.js.map +0 -1
- package/dist/memory/reasoningBank.js.map +0 -1
- package/dist/observability/changeWatch.d.ts.map +0 -1
- package/dist/observability/changeWatch.js.map +0 -1
- package/dist/observability/fatigueDetector.d.ts.map +0 -1
- package/dist/observability/fatigueDetector.js.map +0 -1
- package/dist/observability/index.d.ts.map +0 -1
- package/dist/observability/index.js.map +0 -1
- package/dist/observability/metrics.d.ts.map +0 -1
- package/dist/observability/metrics.js.map +0 -1
- package/dist/observability/middleware.d.ts.map +0 -1
- package/dist/observability/middleware.js.map +0 -1
- package/dist/observability/tracer.d.ts.map +0 -1
- package/dist/observability/tracer.js.map +0 -1
- package/dist/observability/types.d.ts.map +0 -1
- package/dist/observability/types.js.map +0 -1
- package/dist/orchestration/haloOrchestrator.d.ts.map +0 -1
- package/dist/orchestration/haloOrchestrator.js.map +0 -1
- package/dist/orchestration/mctsWorkflow.d.ts.map +0 -1
- package/dist/orchestration/mctsWorkflow.js.map +0 -1
- package/dist/providers/localProvider.d.ts.map +0 -1
- package/dist/providers/localProvider.js.map +0 -1
- package/dist/providers/providerConfig.d.ts.map +0 -1
- package/dist/providers/providerConfig.js.map +0 -1
- package/dist/providers/registry.d.ts.map +0 -1
- package/dist/providers/registry.js.map +0 -1
- package/dist/routing/advancedRouter.d.ts.map +0 -1
- package/dist/routing/advancedRouter.js.map +0 -1
- package/dist/routing/crossModelValidation.d.ts.map +0 -1
- package/dist/routing/crossModelValidation.js.map +0 -1
- package/dist/routing/providerHealth.d.ts.map +0 -1
- package/dist/routing/providerHealth.js.map +0 -1
- package/dist/routing/providerRetry.d.ts.map +0 -1
- package/dist/routing/providerRetry.js.map +0 -1
- package/dist/scripts/banner.js +0 -29
- package/dist/security/guardrails.d.ts.map +0 -1
- package/dist/security/guardrails.js.map +0 -1
- package/dist/server/dashboard.d.ts.map +0 -1
- package/dist/server/dashboard.js.map +0 -1
- package/dist/server/modelMapper.d.ts.map +0 -1
- package/dist/server/modelMapper.js.map +0 -1
- package/dist/server/proxyServer.d.ts.map +0 -1
- package/dist/server/proxyServer.js.map +0 -1
- package/dist/skills/__tests__/skill_manager.test.d.ts +0 -2
- package/dist/skills/__tests__/skill_manager.test.d.ts.map +0 -1
- package/dist/skills/__tests__/skill_manager.test.js +0 -268
- package/dist/skills/__tests__/skill_manager.test.js.map +0 -1
- package/dist/tools/tmlpdTools.d.ts.map +0 -1
- package/dist/tools/tmlpdTools.js.map +0 -1
- package/dist/tui/dashboard.d.ts.map +0 -1
- package/dist/tui/dashboard.js.map +0 -1
- package/dist/tui/index.d.ts.map +0 -1
- package/dist/tui/index.js.map +0 -1
- package/dist/utils/batchProcessor.d.ts.map +0 -1
- package/dist/utils/batchProcessor.js.map +0 -1
- package/dist/utils/compression.d.ts.map +0 -1
- package/dist/utils/compression.js.map +0 -1
- package/dist/utils/costUtils.d.ts.map +0 -1
- package/dist/utils/costUtils.js.map +0 -1
- package/dist/utils/reliability.d.ts.map +0 -1
- package/dist/utils/reliability.js.map +0 -1
- package/dist/utils/sorting.d.ts.map +0 -1
- package/dist/utils/sorting.js.map +0 -1
- package/dist/utils/speculativeDecoding.d.ts.map +0 -1
- package/dist/utils/speculativeDecoding.js.map +0 -1
- package/dist/utils/tokenUtils.d.ts.map +0 -1
- package/dist/utils/tokenUtils.js.map +0 -1
- package/docs/.nojekyll +0 -0
- package/docs/ANALYSIS_PRINCIPLES.md +0 -162
- package/docs/API.md +0 -855
- package/docs/ARCHITECTURAL-IMPROVEMENTS-2025.md +0 -1391
- package/docs/ARCHITECTURAL-IMPROVEMENTS-REVISED-2025.md +0 -1051
- package/docs/BENCHMARK.md +0 -170
- package/docs/CHINESE_PROVIDER_RELIABILITY.md +0 -37
- package/docs/CITATIONS.md +0 -74
- package/docs/CLAIMS_AND_EVIDENCE.md +0 -58
- package/docs/CONFIGURATION.md +0 -476
- package/docs/COUNCIL_DECISION.json +0 -816
- package/docs/COUNCIL_SUMMARY.md +0 -319
- package/docs/COUNCIL_V2.2_DECISION.md +0 -416
- package/docs/ENGINEERING_SPEC.md +0 -55
- package/docs/FACTORY_RESET.md +0 -34
- package/docs/GEO.md +0 -66
- package/docs/GEO_OPTIMIZATION.md +0 -30
- package/docs/GEO_ROOT_CAUSE.md +0 -136
- package/docs/GEO_STATUS.md +0 -85
- package/docs/GEO_TEST_RESULTS.md +0 -176
- package/docs/HN_CHECKLIST.md +0 -38
- package/docs/HN_FOUNDER_COMMENT.md +0 -17
- package/docs/HN_SUBMISSION_FINAL.md +0 -180
- package/docs/HN_SUBMISSION_V3.md +0 -56
- package/docs/IMPROVEMENT_ROADMAP.md +0 -515
- package/docs/INTEGRATIONS.md +0 -420
- package/docs/LANGCHAIN_INTEGRATION.md +0 -147
- package/docs/LLM_COUNCIL_DECISION.md +0 -508
- package/docs/MIDDLEWARE_CHAIN.md +0 -35
- package/docs/PROMO_CHECKLIST.md +0 -200
- package/docs/QUICKSTART.md +0 -271
- package/docs/QUICK_START.md +0 -43
- package/docs/QUICK_START_VISIBILITY.md +0 -782
- package/docs/REDDIT_GAP_ANALYSIS.md +0 -299
- package/docs/RELEASE_CHECKLIST.md +0 -32
- package/docs/REPRODUCIBILITY.md +0 -63
- package/docs/RESEARCH_BACKED_IMPROVEMENTS.md +0 -1180
- package/docs/ROUTING_RUBRIC.md +0 -197
- package/docs/SEO_AUDIT.md +0 -186
- package/docs/SOCIAL_LISTENING.md +0 -219
- package/docs/TMLPD_QNA.md +0 -751
- package/docs/TMLPD_V2.1_COMPLETE.md +0 -763
- package/docs/TMLPD_V2.2_RESEARCH_ROADMAP.md +0 -754
- package/docs/UPDATE_TOPICS.md +0 -15
- package/docs/USE_CASES.md +0 -59
- package/docs/V2.2_IMPLEMENTATION_COMPLETE.md +0 -446
- package/docs/V2_IMPLEMENTATION_GUIDE.md +0 -388
- package/docs/VERCEL_AI_SDK.md +0 -209
- package/docs/VISIBILITY_ADOPTION_PLAN.md +0 -1005
- package/docs/_config.yml +0 -49
- package/docs/ai-plugin.json +0 -16
- package/docs/api.html +0 -513
- package/docs/architecture-diagram.md +0 -40
- package/docs/benchmark-chart.png +0 -0
- package/docs/benchmark.html +0 -387
- package/docs/blog/routerarena-number-one.html +0 -73
- package/docs/cli-cheatsheet.md +0 -339
- package/docs/compare.md +0 -109
- package/docs/comparison-litellm.md +0 -88
- package/docs/comparison.md +0 -108
- package/docs/cost-chart-ascii.md +0 -42
- package/docs/cost-comparison-chart.svg +0 -88
- package/docs/curl-examples.md +0 -247
- package/docs/demo-auto.html +0 -264
- package/docs/demo.html +0 -416
- package/docs/geo/GENERATIVE_ENGINE_OPTIMIZATION.md +0 -232
- package/docs/index.html +0 -507
- package/docs/launch-content/LAUNCH_EXECUTION_CHECKLIST.md +0 -421
- package/docs/launch-content/README.md +0 -457
- package/docs/launch-content/assets/cost_comparison_100_tasks.png +0 -0
- package/docs/launch-content/assets/cumulative_savings.png +0 -0
- package/docs/launch-content/assets/parallel_speedup.png +0 -0
- package/docs/launch-content/assets/provider_pricing_comparison.png +0 -0
- package/docs/launch-content/assets/task_breakdown_comparison.png +0 -0
- package/docs/launch-content/generate_charts.py +0 -313
- package/docs/launch-content/hn_show_post.md +0 -139
- package/docs/launch-content/partner_outreach_templates.md +0 -745
- package/docs/launch-content/reddit_posts.md +0 -467
- package/docs/launch-content/twitter_thread.txt +0 -460
- package/docs/npm-downloads-chart.svg +0 -43
- package/docs/openapi.json +0 -139
- package/docs/openapi.yaml +0 -1318
- package/docs/quick-start.html +0 -366
- package/docs/robots.txt +0 -52
- package/docs/sitemap.xml +0 -57
- package/docs/styles.css +0 -682
- package/docs/well-known/ai-plugin.json +0 -16
- package/docs/wellknown/ai-plugin.json +0 -16
- package/docs-site/assets/og-banner.svg +0 -194
- package/docs-site/index.html +0 -632
- package/eval/README.md +0 -46
- package/eval/baselines/main.json +0 -12
- package/eval/benchmark_dataset.jsonl +0 -16
- package/eval/check_golden_routes.js +0 -64
- package/eval/datasets/catalog.json +0 -33
- package/eval/datasets/slices/cn_provider_reliability_v1.jsonl +0 -3
- package/eval/datasets/slices/cost_pressure_v1.jsonl +0 -3
- package/eval/datasets/slices/safety_guardrails_v1.jsonl +0 -3
- package/eval/evals.json +0 -199
- package/eval/fault_injection_thresholds.json +0 -3
- package/eval/generate_report.js +0 -128
- package/eval/golden_routes.json +0 -114
- package/eval/lib/experiment_registry.js +0 -24
- package/eval/run_eval.js +0 -197
- package/eval/run_fault_injection.js +0 -201
- package/eval/run_shadow_eval.js +0 -85
- package/eval/thresholds.json +0 -9
- package/examples/QUICKSTART.md +0 -183
- package/examples/README.md +0 -61
- package/examples/a3m-sdk.js +0 -124
- package/examples/basic-route.js +0 -54
- package/examples/chat-loop.js +0 -202
- package/examples/classify-then-route.js +0 -102
- package/examples/cost-compare.js +0 -120
- package/examples/ensemble.js +0 -160
- package/examples/whatsapp-telegram-bridge-demo.js +0 -302
- package/examples/whatsapp-telegram-bridge.js +0 -269
- package/hf-space/README.md +0 -23
- package/hf-space/app.py +0 -240
- package/hf-space/requirements.txt +0 -1
- package/huggingface_space/README.md +0 -35
- package/huggingface_space/app.py +0 -126
- package/huggingface_space/create_space.py +0 -208
- package/huggingface_space/requirements.txt +0 -1
- package/mcp-server/README.md +0 -188
- package/mcp-server/package.json +0 -29
- package/mcp-server/src/index.ts +0 -744
- package/mcp-server/tsconfig.json +0 -19
- package/openclaw-alexa-bridge/ALL_REMAINING_FIXES_PLAN.md +0 -313
- package/openclaw-alexa-bridge/REMAINING_FIXES_SUMMARY.md +0 -277
- package/openclaw-alexa-bridge/src/alexa_handler_no_tmlpd.js +0 -1234
- package/openclaw-alexa-bridge/test_fixes.js +0 -77
- package/playground/README.md +0 -51
- package/playground/codesandbox.json +0 -12
- package/playground/index.js +0 -39
- package/proxy/README.md +0 -227
- package/proxy/package-lock.json +0 -831
- package/proxy/package.json +0 -17
- package/proxy/rate-limit.js +0 -145
- package/proxy/rate-limit.test.js +0 -311
- package/proxy/server.js +0 -970
- package/python/README.md +0 -102
- package/python/a3m/__init__.py +0 -6
- package/python/a3m/client.py +0 -190
- package/python/a3m/models.py +0 -40
- package/python/a3m/sync_client.py +0 -61
- package/python/examples.py +0 -53
- package/python/integrations.py +0 -330
- package/python/pyproject.toml +0 -23
- package/python/setup.py +0 -28
- package/python/tmlpd.py +0 -369
- package/qna/REDDIT_GAP_ANALYSIS.md +0 -299
- package/qna/TMLPD_QNA.md +0 -751
- package/research/FINDING_001_safety.md +0 -28
- package/research/FINDING_002_error_diversity.md +0 -32
- package/research/FINDING_003_confidence_weighted_voting.md +0 -32
- package/research/FINDING_004_cross_model_semantic_detection.md +0 -37
- package/research/FINDING_005_knowledge_gap_orthogonality.md +0 -34
- package/research/HALLUCINATION_RESEARCH.md +0 -27
- package/research/ensemble-voting.md +0 -324
- package/research/loss-functions.md +0 -545
- package/research-log.md +0 -49
- package/scripts/banner.js +0 -29
- package/scripts/benchmark-local-routerarena.ts +0 -176
- package/scripts/benchmark.js +0 -145
- package/scripts/benchmark.sh +0 -61
- package/scripts/compare-providers.sh +0 -230
- package/scripts/content-planner.js +0 -25
- package/scripts/create-labeled-benchmark.ts +0 -105
- package/scripts/cross_post.py +0 -443
- package/scripts/local-router-benchmark.ts +0 -154
- package/scripts/post-all.sh +0 -41
- package/scripts/publish_fcc.py +0 -106
- package/scripts/push-to-gitee.sh +0 -25
- package/scripts/routerarena_ensemble.js +0 -144
- package/scripts/routing-benchmark-v2.js +0 -373
- package/scripts/routing-benchmark-v3.js +0 -118
- package/scripts/routing-benchmark.js +0 -462
- package/scripts/run-labeled-benchmark.mjs +0 -104
- package/scripts/run-mmlu-benchmark.js +0 -176
- package/scripts/run-provider-benchmark.js +0 -244
- package/scripts/update-npm-badges.js +0 -158
- package/skill/SKILL.md +0 -238
- package/src/__tests__/integration/tmpld_integration.test.py +0 -540
- package/src/skills/__tests__/skill_manager.test.ts +0 -328
- package/submissions/benchmarks/ALL_PLATFORMS_SUBMISSION.md +0 -94
- package/submissions/benchmarks/LLMROUTERBENCH_SUBMISSION.md +0 -121
- package/submissions/benchmarks/MMRBENCH_SUBMISSION.md +0 -94
- package/submissions/benchmarks/ROUTERARENA_UPDATE.md +0 -83
- package/submissions/benchmarks/ROUTERBENCH_SUBMISSION.md +0 -225
- package/test-council/1-structure-tests.test.js +0 -353
- package/test-council/1-structure-tests.test.ts +0 -353
- package/test-council/2-edge-case-tests.test.ts +0 -361
- package/test-council/3-performance-tests.test.ts +0 -669
- package/test-council/4-integration-tests.test.ts +0 -391
- package/test-council/5-agent-council-eval.test.ts +0 -413
- package/test-council/AGENT_COUNCIL_ARCHITECTURE.md +0 -349
- package/test-council/TEST_COUNCIL_REPORT.md +0 -201
- package/test-council/agents/edge-case-agent.ts +0 -363
- package/test-council/agents/performance-agent.ts +0 -426
- package/test-council/agents/structure-agent.ts +0 -227
- package/test-council/council.md +0 -183
- package/tests/__mocks__/tokenUtils.ts +0 -8
- package/tests/memory/episodicMemory.test.ts +0 -227
- package/tests/package-lock.json +0 -1628
- package/tests/package.json +0 -18
- package/tests/routing/ensembleVoting.test.ts +0 -236
- package/tests/routing/providerRetry.test.ts +0 -360
- package/tests/routing/queryTypePresets.test.ts +0 -208
- package/tests/security/guardrailEngine.test.ts +0 -700
- package/tests/tsconfig.json +0 -21
- package/tests/vitest.config.ts +0 -18
- package/tmlpd-pi-extension/README.md +0 -66
- package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts +0 -114
- package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/cache/prefixCache.js +0 -285
- package/tmlpd-pi-extension/dist/cache/prefixCache.js.map +0 -1
- package/tmlpd-pi-extension/dist/cache/responseCache.d.ts +0 -58
- package/tmlpd-pi-extension/dist/cache/responseCache.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/cache/responseCache.js +0 -153
- package/tmlpd-pi-extension/dist/cache/responseCache.js.map +0 -1
- package/tmlpd-pi-extension/dist/cli.js +0 -59
- package/tmlpd-pi-extension/dist/cost/costTracker.d.ts +0 -95
- package/tmlpd-pi-extension/dist/cost/costTracker.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/cost/costTracker.js +0 -240
- package/tmlpd-pi-extension/dist/cost/costTracker.js.map +0 -1
- package/tmlpd-pi-extension/dist/index.d.ts +0 -723
- package/tmlpd-pi-extension/dist/index.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/index.js +0 -239
- package/tmlpd-pi-extension/dist/index.js.map +0 -1
- package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts +0 -82
- package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/memory/episodicMemory.js +0 -145
- package/tmlpd-pi-extension/dist/memory/episodicMemory.js.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts +0 -102
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js +0 -207
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts +0 -85
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js +0 -210
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js.map +0 -1
- package/tmlpd-pi-extension/dist/providers/localProvider.d.ts +0 -102
- package/tmlpd-pi-extension/dist/providers/localProvider.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/providers/localProvider.js +0 -338
- package/tmlpd-pi-extension/dist/providers/localProvider.js.map +0 -1
- package/tmlpd-pi-extension/dist/providers/registry.d.ts +0 -55
- package/tmlpd-pi-extension/dist/providers/registry.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/providers/registry.js +0 -138
- package/tmlpd-pi-extension/dist/providers/registry.js.map +0 -1
- package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts +0 -68
- package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/routing/advancedRouter.js +0 -332
- package/tmlpd-pi-extension/dist/routing/advancedRouter.js.map +0 -1
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts +0 -101
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.js +0 -368
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts +0 -96
- package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/batchProcessor.js +0 -170
- package/tmlpd-pi-extension/dist/utils/batchProcessor.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/compression.d.ts +0 -61
- package/tmlpd-pi-extension/dist/utils/compression.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/compression.js +0 -281
- package/tmlpd-pi-extension/dist/utils/compression.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/reliability.d.ts +0 -74
- package/tmlpd-pi-extension/dist/utils/reliability.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/reliability.js +0 -177
- package/tmlpd-pi-extension/dist/utils/reliability.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts +0 -117
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js +0 -246
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts +0 -50
- package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/tokenUtils.js +0 -124
- package/tmlpd-pi-extension/dist/utils/tokenUtils.js.map +0 -1
- package/tmlpd-pi-extension/examples/QUICKSTART.md +0 -183
- package/tmlpd-pi-extension/package-lock.json +0 -79
- package/tmlpd-pi-extension/package.json +0 -172
- package/tmlpd-pi-extension/python/examples.py +0 -53
- package/tmlpd-pi-extension/python/integrations.py +0 -330
- package/tmlpd-pi-extension/python/setup.py +0 -28
- package/tmlpd-pi-extension/python/tmlpd.py +0 -369
- package/tmlpd-pi-extension/qna/REDDIT_GAP_ANALYSIS.md +0 -299
- package/tmlpd-pi-extension/qna/TMLPD_QNA.md +0 -751
- package/tmlpd-pi-extension/skill/SKILL.md +0 -238
- package/tmlpd-pi-extension/src/cache/responseCache.ts +0 -147
- package/tmlpd-pi-extension/src/cost/costTracker.ts +0 -302
- package/tmlpd-pi-extension/src/index.ts +0 -232
- package/tmlpd-pi-extension/src/memory/episodicMemory.ts +0 -257
- package/tmlpd-pi-extension/src/orchestration/haloOrchestrator.ts +0 -266
- package/tmlpd-pi-extension/src/orchestration/mctsWorkflow.ts +0 -262
- package/tmlpd-pi-extension/src/providers/localProvider.ts +0 -406
- package/tmlpd-pi-extension/src/providers/registry.ts +0 -164
- package/tmlpd-pi-extension/src/routing/ensembleVoting.ts +0 -159
- package/tmlpd-pi-extension/src/routing/queryTypePresets.ts +0 -136
- package/tmlpd-pi-extension/src/tools/tmlpdTools.ts +0 -433
- package/tmlpd-pi-extension/src/utils/batchProcessor.ts +0 -232
- package/tmlpd-pi-extension/src/utils/compression.ts +0 -325
- package/tmlpd-pi-extension/src/utils/reliability.ts +0 -221
- package/tmlpd-pi-extension/src/utils/tokenUtils.ts +0 -145
- package/tmlpd-pi-extension/tsconfig.json +0 -18
- package/tsconfig.build.json +0 -29
- package/tsconfig.json +0 -18
- /package/{docs/llms-full.txt → llms-full.txt.bak} +0 -0
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* WhatsApp ↔ Telegram Bridge Example
|
|
4
|
-
*
|
|
5
|
-
* This example shows how to use a Telegram bot to process
|
|
6
|
-
* WhatsApp messages and send replies back.
|
|
7
|
-
*
|
|
8
|
-
* Prerequisites:
|
|
9
|
-
* 1. WhatsApp Business API credentials (phoneNumberId, accessToken)
|
|
10
|
-
* 2. Telegram Bot Token (from @BotFather)
|
|
11
|
-
* 3. Webhook endpoint to receive WhatsApp messages
|
|
12
|
-
*
|
|
13
|
-
* Usage:
|
|
14
|
-
* node whatsapp-telegram-bridge.js
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
const {
|
|
18
|
-
createIntegration,
|
|
19
|
-
WhatsAppIntegration,
|
|
20
|
-
TelegramIntegration,
|
|
21
|
-
createA3MRouter
|
|
22
|
-
} = require('../dist/index.js');
|
|
23
|
-
|
|
24
|
-
// Configuration
|
|
25
|
-
const CONFIG = {
|
|
26
|
-
whatsapp: {
|
|
27
|
-
phoneNumberId: process.env.WHATSAPP_PHONE_NUMBER_ID,
|
|
28
|
-
accessToken: process.env.WHATSAPP_ACCESS_TOKEN,
|
|
29
|
-
},
|
|
30
|
-
telegram: {
|
|
31
|
-
botToken: process.env.TELEGRAM_BOT_TOKEN,
|
|
32
|
-
// The chat ID where your bot will process messages
|
|
33
|
-
// This could be your personal chat with the bot
|
|
34
|
-
chatId: process.env.TELEGRAM_CHAT_ID,
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
// Validate config
|
|
39
|
-
function validateConfig() {
|
|
40
|
-
const missing = [];
|
|
41
|
-
if (!CONFIG.whatsapp.phoneNumberId) missing.push('WHATSAPP_PHONE_NUMBER_ID');
|
|
42
|
-
if (!CONFIG.whatsapp.accessToken) missing.push('WHATSAPP_ACCESS_TOKEN');
|
|
43
|
-
if (!CONFIG.telegram.botToken) missing.push('TELEGRAM_BOT_TOKEN');
|
|
44
|
-
if (!CONFIG.telegram.chatId) missing.push('TELEGRAM_CHAT_ID');
|
|
45
|
-
|
|
46
|
-
if (missing.length > 0) {
|
|
47
|
-
console.error('❌ Missing environment variables:');
|
|
48
|
-
missing.forEach(v => console.error(` - ${v}`));
|
|
49
|
-
console.error('\nSet these variables and try again.');
|
|
50
|
-
process.exit(1);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* WhatsApp → Telegram Bridge
|
|
56
|
-
*
|
|
57
|
-
* Flow:
|
|
58
|
-
* 1. Receive message from WhatsApp (via webhook)
|
|
59
|
-
* 2. Forward message to Telegram bot
|
|
60
|
-
* 3. Get reply from Telegram (bot processes it)
|
|
61
|
-
* 4. Send reply back to WhatsApp user
|
|
62
|
-
*/
|
|
63
|
-
class WhatsAppTelegramBridge {
|
|
64
|
-
constructor(config) {
|
|
65
|
-
this.whatsapp = new WhatsAppIntegration(
|
|
66
|
-
config.whatsapp.phoneNumberId,
|
|
67
|
-
config.whatsapp.accessToken
|
|
68
|
-
);
|
|
69
|
-
this.telegram = new TelegramIntegration(config.telegram.botToken);
|
|
70
|
-
this.telegramChatId = config.telegram.chatId;
|
|
71
|
-
|
|
72
|
-
// A3M Router for intelligent routing
|
|
73
|
-
this.router = createA3MRouter();
|
|
74
|
-
|
|
75
|
-
// Message tracking
|
|
76
|
-
this.pendingReplies = new Map(); // messageId -> { whatsappUser, timestamp }
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Handle incoming WhatsApp message
|
|
81
|
-
* @param {Object} whatsappMessage - WhatsApp webhook payload
|
|
82
|
-
*/
|
|
83
|
-
async handleWhatsAppMessage(whatsappMessage) {
|
|
84
|
-
try {
|
|
85
|
-
// Extract message details
|
|
86
|
-
const entry = whatsappMessage.entry?.[0];
|
|
87
|
-
const change = entry?.changes?.[0];
|
|
88
|
-
const value = change?.value;
|
|
89
|
-
const message = value?.messages?.[0];
|
|
90
|
-
|
|
91
|
-
if (!message) {
|
|
92
|
-
console.log('No message in webhook payload');
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const from = message.from; // WhatsApp user phone number
|
|
97
|
-
const text = message.text?.body || '';
|
|
98
|
-
const messageId = message.id;
|
|
99
|
-
|
|
100
|
-
console.log(`📩 WhatsApp message from ${from}: "${text.substring(0, 50)}..."`);
|
|
101
|
-
|
|
102
|
-
// Route the message to get best processing strategy
|
|
103
|
-
const route = this.router.route(text);
|
|
104
|
-
console.log(`🔀 Routed to: ${route.primary_model} (${route.reasoning})`);
|
|
105
|
-
|
|
106
|
-
// Forward to Telegram bot with context
|
|
107
|
-
const telegramMessage = await this.forwardToTelegram(from, text, route);
|
|
108
|
-
|
|
109
|
-
// Track pending reply
|
|
110
|
-
this.pendingReplies.set(telegramMessage.messageId, {
|
|
111
|
-
whatsappUser: from,
|
|
112
|
-
originalText: text,
|
|
113
|
-
timestamp: Date.now(),
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
console.log(`📤 Forwarded to Telegram (message ID: ${telegramMessage.messageId})`);
|
|
117
|
-
|
|
118
|
-
} catch (error) {
|
|
119
|
-
console.error('❌ Error handling WhatsApp message:', error.message);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Forward WhatsApp message to Telegram
|
|
125
|
-
*/
|
|
126
|
-
async forwardToTelegram(whatsappUser, text, route) {
|
|
127
|
-
// Format message for Telegram bot
|
|
128
|
-
const formattedMessage = `
|
|
129
|
-
🔄 <b>WhatsApp Bridge</b>
|
|
130
|
-
📱 <b>From:</b> ${whatsappUser}
|
|
131
|
-
🤖 <b>Route:</b> ${route.primary_model}
|
|
132
|
-
|
|
133
|
-
💬 <b>Message:</b>
|
|
134
|
-
${text}
|
|
135
|
-
|
|
136
|
-
<i>Reply to this message to respond back to WhatsApp user</i>
|
|
137
|
-
`.trim();
|
|
138
|
-
|
|
139
|
-
// Send to Telegram
|
|
140
|
-
const result = await this.telegram.sendMessage(
|
|
141
|
-
this.telegramChatId,
|
|
142
|
-
formattedMessage
|
|
143
|
-
);
|
|
144
|
-
|
|
145
|
-
return {
|
|
146
|
-
messageId: result.message_id || `msg_${Date.now()}`,
|
|
147
|
-
chatId: this.telegramChatId,
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Handle Telegram reply
|
|
153
|
-
* @param {Object} telegramUpdate - Telegram webhook/update payload
|
|
154
|
-
*/
|
|
155
|
-
async handleTelegramReply(telegramUpdate) {
|
|
156
|
-
try {
|
|
157
|
-
const message = telegramUpdate.message || telegramUpdate.callback_query?.message;
|
|
158
|
-
if (!message) return;
|
|
159
|
-
|
|
160
|
-
const replyToMessage = message.reply_to_message;
|
|
161
|
-
if (!replyToMessage) {
|
|
162
|
-
console.log('Not a reply message, ignoring');
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Extract original message ID from reply
|
|
167
|
-
const originalMessageId = replyToMessage.message_id;
|
|
168
|
-
const pending = this.pendingReplies.get(originalMessageId);
|
|
169
|
-
|
|
170
|
-
if (!pending) {
|
|
171
|
-
console.log('No pending WhatsApp reply found for this message');
|
|
172
|
-
return;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
const replyText = message.text || message.caption || '';
|
|
176
|
-
console.log(`📩 Telegram reply: "${replyText.substring(0, 50)}..."`);
|
|
177
|
-
|
|
178
|
-
// Send reply back to WhatsApp
|
|
179
|
-
await this.sendWhatsAppReply(pending.whatsappUser, replyText);
|
|
180
|
-
|
|
181
|
-
// Clean up pending reply
|
|
182
|
-
this.pendingReplies.delete(originalMessageId);
|
|
183
|
-
|
|
184
|
-
} catch (error) {
|
|
185
|
-
console.error('❌ Error handling Telegram reply:', error.message);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Send reply back to WhatsApp user
|
|
191
|
-
*/
|
|
192
|
-
async sendWhatsAppReply(to, text) {
|
|
193
|
-
const result = await this.whatsapp.sendMessage(to, text);
|
|
194
|
-
console.log(`📤 Sent WhatsApp reply to ${to}: "${text.substring(0, 50)}..."`);
|
|
195
|
-
return result;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Clean up old pending replies (older than 1 hour)
|
|
200
|
-
*/
|
|
201
|
-
cleanupPendingReplies() {
|
|
202
|
-
const now = Date.now();
|
|
203
|
-
const oneHour = 60 * 60 * 1000;
|
|
204
|
-
|
|
205
|
-
for (const [messageId, pending] of this.pendingReplies) {
|
|
206
|
-
if (now - pending.timestamp > oneHour) {
|
|
207
|
-
this.pendingReplies.delete(messageId);
|
|
208
|
-
console.log(`🧹 Cleaned up expired pending reply: ${messageId}`);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Start cleanup interval
|
|
215
|
-
*/
|
|
216
|
-
startCleanup() {
|
|
217
|
-
setInterval(() => this.cleanupPendingReplies(), 5 * 60 * 1000); // Every 5 minutes
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// Example usage
|
|
222
|
-
async function main() {
|
|
223
|
-
validateConfig();
|
|
224
|
-
|
|
225
|
-
console.log('🚀 Starting WhatsApp ↔ Telegram Bridge\n');
|
|
226
|
-
|
|
227
|
-
const bridge = new WhatsAppTelegramBridge(CONFIG);
|
|
228
|
-
bridge.startCleanup();
|
|
229
|
-
|
|
230
|
-
console.log('✅ Bridge initialized');
|
|
231
|
-
console.log(` WhatsApp Phone Number ID: ${CONFIG.whatsapp.phoneNumberId}`);
|
|
232
|
-
console.log(` Telegram Chat ID: ${CONFIG.telegram.chatId}`);
|
|
233
|
-
console.log('');
|
|
234
|
-
|
|
235
|
-
// Example: Simulate receiving a WhatsApp message
|
|
236
|
-
console.log('📋 Example: Simulating WhatsApp webhook payload\n');
|
|
237
|
-
|
|
238
|
-
const exampleWhatsAppMessage = {
|
|
239
|
-
entry: [{
|
|
240
|
-
changes: [{
|
|
241
|
-
value: {
|
|
242
|
-
messages: [{
|
|
243
|
-
from: '1234567890',
|
|
244
|
-
id: 'wamid.example123',
|
|
245
|
-
text: { body: 'Hello, I need help with my order #12345' },
|
|
246
|
-
timestamp: Date.now().toString(),
|
|
247
|
-
}],
|
|
248
|
-
},
|
|
249
|
-
}],
|
|
250
|
-
}],
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
await bridge.handleWhatsAppMessage(exampleWhatsAppMessage);
|
|
254
|
-
|
|
255
|
-
console.log('\n📋 To use this in production:');
|
|
256
|
-
console.log(' 1. Set up WhatsApp Business API webhook');
|
|
257
|
-
console.log(' 2. Set up Telegram bot webhook');
|
|
258
|
-
console.log(' 3. Route webhooks to handleWhatsAppMessage() and handleTelegramReply()');
|
|
259
|
-
console.log('');
|
|
260
|
-
console.log('📖 See: https://developers.facebook.com/docs/whatsapp/cloud-api/guides/set-up-webhooks');
|
|
261
|
-
console.log('📖 See: https://core.telegram.org/bots/webhooks');
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// Run if executed directly
|
|
265
|
-
if (require.main === module) {
|
|
266
|
-
main().catch(console.error);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
module.exports = { WhatsAppTelegramBridge };
|
package/hf-space/README.md
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: A3M Router Demo
|
|
3
|
-
emoji: 🔀
|
|
4
|
-
colorFrom: green
|
|
5
|
-
colorTo: blue
|
|
6
|
-
sdk: gradio
|
|
7
|
-
sdk_version: 5.34.0
|
|
8
|
-
app_file: app.py
|
|
9
|
-
pinned: false
|
|
10
|
-
license: mit
|
|
11
|
-
short_description: '#1 LLM routing benchmark & cheapest router with memory'
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# 🔀 A3M Router — #1 LLM Routing Benchmark & Cheapest Router with Memory
|
|
15
|
-
|
|
16
|
-
See how parallel LLM execution works in real-time. Enter a query and watch 7 providers compete simultaneously.
|
|
17
|
-
|
|
18
|
-
- 🏆 **#1 on RouterArena** (70.32 score)
|
|
19
|
-
- 💰 **Cheapest** at $0.047/1K queries
|
|
20
|
-
- 🔓 **Open-source** (MIT), 19.5KB
|
|
21
|
-
- 🧠 **Only LLM router with memory**
|
|
22
|
-
|
|
23
|
-
[Try it live →](https://github.com/Das-rebel/a3m-router)
|
package/hf-space/app.py
DELETED
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import gradio as gr
|
|
2
|
-
import json
|
|
3
|
-
import time
|
|
4
|
-
import os
|
|
5
|
-
import random
|
|
6
|
-
|
|
7
|
-
# A3M Router Demo - Live Parallel LLM Execution Visualization
|
|
8
|
-
# No API keys needed - uses simulated responses for the demo
|
|
9
|
-
|
|
10
|
-
PROVIDERS = [
|
|
11
|
-
("OpenAI/GPT-4o-mini", 0.00015, 0.85),
|
|
12
|
-
("Anthropic/Claude-3.5-Haiku", 0.00025, 0.83),
|
|
13
|
-
("Groq/Llama-3.3-70B", 0.000059, 0.82),
|
|
14
|
-
("DeepSeek/Chat", 0.000014, 0.79),
|
|
15
|
-
("NVIDIA/Llama-3.3-70B", 0.00022, 0.84),
|
|
16
|
-
("Together/Mistral-7B", 0.000018, 0.76),
|
|
17
|
-
("OpenRouter/Auto", 0.000030, 0.80),
|
|
18
|
-
]
|
|
19
|
-
|
|
20
|
-
BENCHMARK_DATA = [
|
|
21
|
-
("A3M Router 🥇", 76.43, 0.047, True),
|
|
22
|
-
("Sqwish 🥈", 75.27, 0.18, False),
|
|
23
|
-
("Azure (Microsoft) 🥉", 71.87, 0.22, False),
|
|
24
|
-
("GPT-5 (OpenAI)", 64.32, 10.02, False),
|
|
25
|
-
("RouteLLM (Berkeley)", 48.07, 0.27, True),
|
|
26
|
-
]
|
|
27
|
-
|
|
28
|
-
SAMPLE_RESPONSES = {
|
|
29
|
-
"hello": "Hello! I'm here to help. What would you like to know?",
|
|
30
|
-
"what is machine learning": "Machine learning is a subset of AI where algorithms learn patterns from data to make predictions, without being explicitly programmed for each task.",
|
|
31
|
-
"explain quantum computing": "Quantum computing uses quantum mechanical phenomena like superposition and entanglement to perform computations exponentially faster than classical computers for specific problems.",
|
|
32
|
-
"write a python sort": "def quicksort(arr):\n if len(arr) <= 1: return arr\n pivot = arr[len(arr)//2]\n left = [x for x in arr if x < pivot]\n right = [x for x in arr if x > pivot]\n return quicksort(left) + [pivot] + quicksort(right)",
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
def simulate_routing(query, strategy):
|
|
36
|
-
"""Simulate parallel LLM routing with confidence scoring."""
|
|
37
|
-
if not query.strip():
|
|
38
|
-
return "", "", "", ""
|
|
39
|
-
|
|
40
|
-
start = time.time()
|
|
41
|
-
|
|
42
|
-
# Find best matching sample response
|
|
43
|
-
response_base = SAMPLE_RESPONSES.get("what is machine learning") # default
|
|
44
|
-
for key in SAMPLE_RESPONSES:
|
|
45
|
-
if key in query.lower():
|
|
46
|
-
response_base = SAMPLE_RESPONSES[key]
|
|
47
|
-
break
|
|
48
|
-
|
|
49
|
-
# Simulate parallel execution
|
|
50
|
-
results = []
|
|
51
|
-
for provider, cost, base_conf in PROVIDERS:
|
|
52
|
-
latency = round(random.uniform(80, 350), 0)
|
|
53
|
-
# Add confidence variation
|
|
54
|
-
conf = round(base_conf + random.uniform(-0.05, 0.05), 2)
|
|
55
|
-
conf = min(max(conf, 0.5), 0.99)
|
|
56
|
-
results.append({
|
|
57
|
-
"provider": provider,
|
|
58
|
-
"response": response_base[:60] + "...",
|
|
59
|
-
"latency_ms": int(latency),
|
|
60
|
-
"confidence": conf,
|
|
61
|
-
"cost": cost,
|
|
62
|
-
"winner": False
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
# Sort by confidence (A3M's strategy)
|
|
66
|
-
results.sort(key=lambda x: x["confidence"], reverse=True)
|
|
67
|
-
results[0]["winner"] = True
|
|
68
|
-
|
|
69
|
-
winner = results[0]
|
|
70
|
-
total_cost = winner["cost"]
|
|
71
|
-
total_latency = max(r["latency_ms"] for r in results) # Parallel = max
|
|
72
|
-
elapsed = round((time.time() - start) * 1000, 0)
|
|
73
|
-
|
|
74
|
-
# Format results table
|
|
75
|
-
table = "| Provider | Confidence | Latency | Cost |\n|----------|-----------|---------|------|\n"
|
|
76
|
-
for r in results:
|
|
77
|
-
icon = "🏆" if r["winner"] else ""
|
|
78
|
-
table += f"| {icon} {r['provider']} | {r['confidence']:.0%} | {r['latency_ms']}ms | ${r['cost']:.6f} |\n"
|
|
79
|
-
|
|
80
|
-
# Summary
|
|
81
|
-
summary = f"### 🏆 Winner: **{winner['provider']}**\n\n"
|
|
82
|
-
summary += f"- **Confidence:** {winner['confidence']:.0%}\n"
|
|
83
|
-
summary += f"- **Cost:** ${winner['cost']:.6f}\n"
|
|
84
|
-
summary += f"- **Total parallel latency:** {total_latency}ms\n"
|
|
85
|
-
summary += f"- **Strategy:** {strategy}\n\n"
|
|
86
|
-
summary += f"You got the **best response at the lowest cost** because all providers ran in parallel."
|
|
87
|
-
|
|
88
|
-
# Cost comparison
|
|
89
|
-
gpt5_cost = 10.02 / 1000
|
|
90
|
-
savings = round(gpt5_cost / winner["cost"]) if winner["cost"] > 0 else 999
|
|
91
|
-
cost_text = f"### 💰 Cost vs Sequential Fallback\n\n"
|
|
92
|
-
cost_text += f"| Approach | Cost | Latency |\n|----------|------|----------|\n"
|
|
93
|
-
cost_text += f"| **A3M (parallel)** | **${winner['cost']:.6f}** | **{total_latency}ms** |\n"
|
|
94
|
-
cost_text += f"| Sequential (3 retries) | ${total_cost * 3:.6f} | {total_latency * 3}ms |\n"
|
|
95
|
-
cost_text += f"| GPT-5 (OpenAI) | ${gpt5_cost:.4f} | ~500ms |\n\n"
|
|
96
|
-
cost_text += f"**{savings}× cheaper** than calling GPT-5 directly.\n"
|
|
97
|
-
|
|
98
|
-
return table, summary, cost_text, json.dumps(results, indent=2)
|
|
99
|
-
|
|
100
|
-
def generate_benchmark():
|
|
101
|
-
"""Generate benchmark comparison chart."""
|
|
102
|
-
chart_data = gr.Dataframe(
|
|
103
|
-
value=[[r[0], r[1], f"${r[2]}"] for r in BENCHMARK_DATA],
|
|
104
|
-
headers=["Router", "RouterArena Score", "Cost/1K"],
|
|
105
|
-
label="RouterArena Benchmark Results (arXiv:2510.00202)"
|
|
106
|
-
)
|
|
107
|
-
return chart_data
|
|
108
|
-
|
|
109
|
-
with gr.Blocks(
|
|
110
|
-
theme=gr.themes.Soft(primary_hue="green"),
|
|
111
|
-
css="""
|
|
112
|
-
.winner-row { background-color: #1a3a1a !important; }
|
|
113
|
-
footer { display: none !important; }
|
|
114
|
-
"""
|
|
115
|
-
) as demo:
|
|
116
|
-
gr.Markdown("""
|
|
117
|
-
# 🔀 A3M Router — #1 LLM Routing Benchmark & Cheapest Router with Memory
|
|
118
|
-
|
|
119
|
-
**See how parallel LLM execution works in real-time.** Enter a query and watch 7 providers compete simultaneously.
|
|
120
|
-
|
|
121
|
-
⭐ RouterArena #1 (76.43) | 💰 Cheapest at $0.047/1K | 🔓 Open-source (MIT) | 📦 19.5KB
|
|
122
|
-
""")
|
|
123
|
-
|
|
124
|
-
with gr.Tab("🚀 Try It"):
|
|
125
|
-
with gr.Row():
|
|
126
|
-
query = gr.Textbox(
|
|
127
|
-
label="Your Query",
|
|
128
|
-
placeholder="Try: explain quantum computing, what is machine learning, write a python sort...",
|
|
129
|
-
scale=4
|
|
130
|
-
)
|
|
131
|
-
strategy = gr.Dropdown(
|
|
132
|
-
choices=["parallel (A3M default)", "fastest", "creative", "deep"],
|
|
133
|
-
value="parallel (A3M default)",
|
|
134
|
-
label="Strategy",
|
|
135
|
-
scale=1
|
|
136
|
-
)
|
|
137
|
-
submit = gr.Button("🚀 Execute Parallel Routing", variant="primary", size="lg")
|
|
138
|
-
|
|
139
|
-
with gr.Row():
|
|
140
|
-
with gr.Column(scale=2):
|
|
141
|
-
results_table = gr.Markdown(label="Results")
|
|
142
|
-
with gr.Column(scale=1):
|
|
143
|
-
summary = gr.Markdown(label="Best Result")
|
|
144
|
-
|
|
145
|
-
with gr.Row():
|
|
146
|
-
cost_comparison = gr.Markdown(label="Cost Savings")
|
|
147
|
-
|
|
148
|
-
with gr.Accordion("Raw JSON Output", open=False):
|
|
149
|
-
raw_output = gr.JSON()
|
|
150
|
-
|
|
151
|
-
gr.Examples(
|
|
152
|
-
examples=[["Explain quantum computing"], ["What is machine learning?"], ["Write a Python sort function"], ["Hello, how are you?"]],
|
|
153
|
-
inputs=query
|
|
154
|
-
)
|
|
155
|
-
|
|
156
|
-
submit.click(
|
|
157
|
-
fn=simulate_routing,
|
|
158
|
-
inputs=[query, strategy],
|
|
159
|
-
outputs=[results_table, summary, cost_comparison, raw_output]
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
with gr.Tab("📊 Benchmark"):
|
|
163
|
-
gr.Markdown("""
|
|
164
|
-
### RouterArena Benchmark Results
|
|
165
|
-
|
|
166
|
-
| Rank | Router | Score | Cost/1K | Open Source? |
|
|
167
|
-
|------|--------|:-----:|:-------:|:------------:|
|
|
168
|
-
| 🥇 | **A3M Router** | **76.43** | **$0.047** | ✅ |
|
|
169
|
-
| 🥈 | Sqwish | 75.27 | $0.18 | ❌ |
|
|
170
|
-
| 🥉 | Azure (Microsoft) | 71.87 | $0.22 | ❌ |
|
|
171
|
-
| 4 | GPT-5 (OpenAI) | 64.32 | $10.02 | ❌ |
|
|
172
|
-
| 5 | RouteLLM (Berkeley) | 48.07 | $0.27 | ✅ |
|
|
173
|
-
|
|
174
|
-
**213× cheaper than GPT-5, 12 points higher.** Evaluated by RouterArena (arXiv:2510.00202) on 8,400 queries across 9 domains.
|
|
175
|
-
|
|
176
|
-
[Full Benchmark →](https://das-rebel.github.io/a3m-router/benchmark) | [RouterArena PR →](https://github.com/RouteWorks/RouterArena/pull/113)
|
|
177
|
-
""")
|
|
178
|
-
|
|
179
|
-
with gr.Tab("💻 Code"):
|
|
180
|
-
gr.Markdown("""
|
|
181
|
-
### Install & Run in 5 Seconds
|
|
182
|
-
|
|
183
|
-
```bash
|
|
184
|
-
# No config needed — auto-detects API keys from environment
|
|
185
|
-
npm install adaptive-memory-multi-model-router
|
|
186
|
-
npx a3m-router route "Explain quantum computing"
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### TypeScript/Node.js
|
|
190
|
-
|
|
191
|
-
```javascript
|
|
192
|
-
import { createRouter } from 'adaptive-memory-multi-model-router';
|
|
193
|
-
|
|
194
|
-
const router = createRouter(); // auto-detects API keys
|
|
195
|
-
|
|
196
|
-
// Parallel execution with confidence scoring
|
|
197
|
-
const result = await router.route('What is machine learning?');
|
|
198
|
-
|
|
199
|
-
console.log(result.response); // Best response
|
|
200
|
-
console.log(result.provider); // Winning provider
|
|
201
|
-
console.log(result.cost); // Actual cost
|
|
202
|
-
console.log(result.confidence); // Confidence score
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
### With Memory (Unique Feature)
|
|
206
|
-
|
|
207
|
-
```javascript
|
|
208
|
-
const router = createRouter({
|
|
209
|
-
memory: { enabled: true } // Context persists across sessions
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
await router.route('My name is Alice');
|
|
213
|
-
await router.route('What is my name?'); // → "Your name is Alice!"
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
### CLI
|
|
217
|
-
|
|
218
|
-
```bash
|
|
219
|
-
# Route a query
|
|
220
|
-
npx a3m-router route "Explain quantum computing"
|
|
221
|
-
|
|
222
|
-
# Check costs
|
|
223
|
-
npx a3m-router cost
|
|
224
|
-
|
|
225
|
-
# Health check
|
|
226
|
-
npx a3m-router health
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
[GitHub →](https://github.com/Das-rebel/a3m-router) | [npm →](https://www.npmjs.com/package/adaptive-memory-multi-model-router) | [Docs →](https://das-rebel.github.io/a3m-router/)
|
|
230
|
-
""")
|
|
231
|
-
|
|
232
|
-
gr.Markdown("""
|
|
233
|
-
---
|
|
234
|
-
🔀 A3M Router — #1 LLM Routing Benchmark & Cheapest Router with Memory | [GitHub](https://github.com/Das-rebel/a3m-router) | [npm](https://www.npmjs.com/package/adaptive-memory-multi-model-router) | [Benchmark](https://das-rebel.github.io/a3m-router/benchmark)
|
|
235
|
-
|
|
236
|
-
*This demo simulates parallel LLM execution. In production, A3M makes real API calls to 47+ providers.*
|
|
237
|
-
""")
|
|
238
|
-
|
|
239
|
-
if __name__ == "__main__":
|
|
240
|
-
demo.launch()
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
gradio>=4.0.0
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: A3M Router Demo
|
|
3
|
-
emoji: 🎯
|
|
4
|
-
colorFrom: blue
|
|
5
|
-
colorTo: purple
|
|
6
|
-
sdk: gradio
|
|
7
|
-
sdk_version: 4.44.0
|
|
8
|
-
app_file: app.py
|
|
9
|
-
pinned: false
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
# A3M Router Demo
|
|
13
|
-
|
|
14
|
-
[A3M Router](https://github.com/Das-rebel/a3m-router) — #1 LLM routing benchmark at $0.047/1K queries.
|
|
15
|
-
|
|
16
|
-
This Space demonstrates intelligent LLM routing using 12 keyword signals.
|
|
17
|
-
|
|
18
|
-
## Features
|
|
19
|
-
|
|
20
|
-
- **Instant Routing**: <1ms routing decision
|
|
21
|
-
- **47+ Providers**: OpenAI, Anthropic, Groq, Cerebras, DeepSeek, Gemini, Mistral...
|
|
22
|
-
- **Cost Saving**: Routes to cheapest capable model
|
|
23
|
-
- **No ML Required**: Rule-based heuristic routing
|
|
24
|
-
|
|
25
|
-
## How It Works
|
|
26
|
-
|
|
27
|
-
1. Enter your query
|
|
28
|
-
2. A3M analyzes 12 keyword signals
|
|
29
|
-
3. Routes to optimal provider based on query complexity
|
|
30
|
-
4. Get fast, cost-effective responses
|
|
31
|
-
|
|
32
|
-
## Disclaimer
|
|
33
|
-
|
|
34
|
-
This demo uses a local A3M Router instance. For production use,
|
|
35
|
-
deploy your own router or use the npm package.
|
package/huggingface_space/app.py
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import gradio as gr
|
|
2
|
-
import json
|
|
3
|
-
import time
|
|
4
|
-
|
|
5
|
-
# Simulated routing decisions (in production, use actual A3M Router API)
|
|
6
|
-
ROUTING_RULES = {
|
|
7
|
-
"greeting": {"model": "groq/llama-3.3-70b", "tier": "free", "cost": 0.00001},
|
|
8
|
-
"code": {"model": "groq/llama-3.3-70b", "tier": "cheap", "cost": 0.0004},
|
|
9
|
-
"math": {"model": "deepseek/deepseek-chat", "tier": "cheap", "cost": 0.0003},
|
|
10
|
-
"creative": {"model": "anthropic/claude-3-haiku", "tier": "mid", "cost": 0.001},
|
|
11
|
-
"reasoning": {"model": "openai/gpt-4o-mini", "tier": "mid", "cost": 0.0015},
|
|
12
|
-
"default": {"model": "groq/llama-3.3-70b", "tier": "cheap", "cost": 0.0004}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
def route_query(query):
|
|
16
|
-
"""Route a query to the optimal provider"""
|
|
17
|
-
query_lower = query.lower()
|
|
18
|
-
|
|
19
|
-
# Simple keyword matching
|
|
20
|
-
if any(word in query_lower for word in ["hi", "hello", "hey", "thanks"]):
|
|
21
|
-
result = ROUTING_RULES["greeting"]
|
|
22
|
-
reasoning = "Simple greeting detected → free tier"
|
|
23
|
-
elif any(word in query_lower for word in ["code", "python", "javascript", "function", "bug"]):
|
|
24
|
-
result = ROUTING_RULES["code"]
|
|
25
|
-
reasoning = "Coding task detected → cheap tier (Groq)"
|
|
26
|
-
elif any(word in query_lower for word in ["math", "calculate", "equation", "solve for"]):
|
|
27
|
-
result = ROUTING_RULES["math"]
|
|
28
|
-
reasoning = "Mathematical query → cheap tier (DeepSeek)"
|
|
29
|
-
elif any(word in query_lower for word in ["write", "story", "poem", "creative"]):
|
|
30
|
-
result = ROUTING_RULES["creative"]
|
|
31
|
-
reasoning = "Creative task → mid tier (Claude Haiku)"
|
|
32
|
-
elif any(word in query_lower for word in ["explain", "why", "how", "what is"]):
|
|
33
|
-
result = ROUTING_RULES["reasoning"]
|
|
34
|
-
reasoning = "Explanation needed → mid tier (GPT-4o mini)"
|
|
35
|
-
else:
|
|
36
|
-
result = ROUTING_RULES["default"]
|
|
37
|
-
reasoning = "General query → cheap tier (Groq)"
|
|
38
|
-
|
|
39
|
-
# Simulate routing time
|
|
40
|
-
routing_time = round(time.time() % 1 * 10, 2) # 0-10ms simulated
|
|
41
|
-
|
|
42
|
-
return {
|
|
43
|
-
"model": result["model"],
|
|
44
|
-
"tier": result["tier"],
|
|
45
|
-
"estimated_cost": f"${result['cost']:.6f}",
|
|
46
|
-
"routing_time_ms": routing_time,
|
|
47
|
-
"reasoning": reasoning
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
def explain_routing():
|
|
51
|
-
"""Return explanation of A3M Router"""
|
|
52
|
-
return """
|
|
53
|
-
## How A3M Router Works
|
|
54
|
-
|
|
55
|
-
### 12 Keyword Signals
|
|
56
|
-
A3M analyzes queries across 5 dimensions:
|
|
57
|
-
1. **Domain**: coding, math, creative, factual
|
|
58
|
-
2. **Complexity**: simple, medium, hard
|
|
59
|
-
3. **Intent**: debug, explain, create, compare
|
|
60
|
-
4. **Length**: short, medium, long
|
|
61
|
-
5. **Structure**: structured, unstructured
|
|
62
|
-
|
|
63
|
-
### Provider Tiers
|
|
64
|
-
| Tier | Providers | Cost/1K |
|
|
65
|
-
|------|-----------|----------|
|
|
66
|
-
| Free | Groq, Together | $0 |
|
|
67
|
-
| Cheap | Mistral, DeepSeek | $0.001-0.01 |
|
|
68
|
-
| Mid | Claude Haiku, GPT-4o mini | $0.01-0.05 |
|
|
69
|
-
| Premium | GPT-4o, Claude 3.5 | $0.50+ |
|
|
70
|
-
|
|
71
|
-
### Benchmark Results
|
|
72
|
-
- **RouterArena Score**: 76.43 (#1 of 19 routers)
|
|
73
|
-
- **Cost/1K queries**: $0.047
|
|
74
|
-
- **vs GPT-5**: 213× cheaper
|
|
75
|
-
"""
|
|
76
|
-
|
|
77
|
-
# Examples for Gradio
|
|
78
|
-
EXAMPLES = [
|
|
79
|
-
["Hi, how are you?"],
|
|
80
|
-
["Write a Python function to sort a list"],
|
|
81
|
-
["Explain quantum entanglement"],
|
|
82
|
-
["Solve for x: 2x + 5 = 15"],
|
|
83
|
-
["Write a haiku about coding"],
|
|
84
|
-
]
|
|
85
|
-
|
|
86
|
-
# Build Gradio interface
|
|
87
|
-
with gr.Blocks(title="A3M Router Demo", theme=gr.themes.Soft()) as demo:
|
|
88
|
-
gr.Markdown("# 🎯 A3M Router Demo")
|
|
89
|
-
gr.Markdown("### #1 LLM Routing Benchmark — $0.047/1K — 213× cheaper than GPT-5")
|
|
90
|
-
|
|
91
|
-
with gr.Row():
|
|
92
|
-
with gr.Column(scale=2):
|
|
93
|
-
query_input = gr.Textbox(
|
|
94
|
-
label="Enter your query",
|
|
95
|
-
placeholder="e.g., Explain machine learning...",
|
|
96
|
-
lines=3
|
|
97
|
-
)
|
|
98
|
-
route_btn = gr.Button("Route Query", variant="primary")
|
|
99
|
-
|
|
100
|
-
with gr.Column(scale=1):
|
|
101
|
-
output_info = gr.JSON(label="Routing Decision")
|
|
102
|
-
|
|
103
|
-
gr.Examples(EXAMPLES, inputs=[query_input], label="Try these examples")
|
|
104
|
-
|
|
105
|
-
route_btn.click(
|
|
106
|
-
fn=route_query,
|
|
107
|
-
inputs=[query_input],
|
|
108
|
-
outputs=[output_info]
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
query_input.submit(
|
|
112
|
-
fn=route_query,
|
|
113
|
-
inputs=[query_input],
|
|
114
|
-
outputs=[output_info]
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
gr.Markdown(explain_routing())
|
|
118
|
-
|
|
119
|
-
gr.Markdown("""
|
|
120
|
-
---
|
|
121
|
-
📚 **Learn more**: [GitHub](https://github.com/Das-rebel/a3m-router) |
|
|
122
|
-
[npm](https://www.npmjs.com/package/adaptive-memory-multi-model-router) |
|
|
123
|
-
[RouterArena](https://arxiv.org/abs/2510.00202)
|
|
124
|
-
""")
|
|
125
|
-
|
|
126
|
-
demo.launch()
|