adaptive-memory-multi-model-router 2.14.49 → 2.14.52
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/.dockerignore +82 -0
- package/.env.example +303 -0
- package/.github/DISCUSSIONS_WELCOME.md +27 -0
- package/.github/DISCUSSION_TEMPLATE.yml +5 -0
- package/.github/FUNDING.yml +2 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +94 -0
- package/.github/ISSUE_TEMPLATE/config.yml +17 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +71 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +71 -0
- package/.github/dependabot.yml +9 -0
- package/.github/workflows/ci.yml +263 -0
- package/.github/workflows/codeql.yml +38 -0
- package/.github/workflows/npm-publish.yml +20 -0
- package/.github/workflows/pages.yml +37 -0
- package/.github/workflows/stale.yml +54 -0
- package/.publish-tick +1 -0
- package/.well-known/ai-plugin.json +16 -0
- package/AGENT_COUNCIL_FINDINGS.md +142 -0
- package/ARCHITECTURE.md +346 -0
- package/AUDIT_REPORT.md +28 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +50 -0
- package/CONTRIBUTORS.md +20 -0
- package/Dockerfile +53 -0
- package/Dockerfile.proxy +33 -0
- package/HEALTH_REPORT.md +118 -0
- package/IMPROVEMENT_PLAN.md +107 -0
- package/LANDING.md +43 -0
- package/LAUNCH-PAIN-DRIVEN.md +339 -0
- package/LAUNCH.md +337 -0
- package/LAUNCH_CHECKLIST.md +141 -0
- package/LAUNCH_SNAPSHOT.md +260 -0
- package/MANIFESTO.md +41 -0
- package/POPULARITY_BOOSTERS.md +285 -0
- package/PR_STATUS_REPORT.md +148 -0
- package/README.md +25 -14
- package/REDESIGN.md +95 -0
- package/RUNKIT.md +83 -0
- package/SECURITY.md +29 -0
- package/SUBMISSIONS.md +43 -0
- package/_schema.html +53 -0
- package/ai-plugin.json +16 -0
- package/articles/AI_AGENT_LLM_ROUTING.md +150 -0
- package/articles/CHINESE_DIRECTORIES.md +100 -0
- package/articles/CHINESE_SUBMISSIONS_READY.md +322 -0
- package/articles/COMPETITOR_ALERTS.md +31 -0
- package/articles/COMPLETE_POSTING_DIRECTORY.md +147 -0
- package/articles/CONTENT_STRUCTURE.md +292 -0
- package/articles/DEVTO_COST_GUIDE.md +473 -0
- package/articles/DEVTO_FINAL.md +416 -0
- package/articles/DEVTO_MULTI_PROVIDER.md +542 -0
- package/articles/DEVTO_READY.md +255 -0
- package/articles/DEVTO_V2_ANNOUNCEMENT.md +160 -0
- package/articles/DEVTO_VIRAL_GROWTH.md +280 -0
- package/articles/FRESH_devto.md +460 -0
- package/articles/FRESH_devto_2026_05.md +73 -0
- package/articles/FRESH_hackernews.md +14 -0
- package/articles/FRESH_reddit_ml.md +90 -0
- package/articles/FRESH_reddit_node.md +198 -0
- package/articles/FRESH_reddit_sideproject.md +72 -0
- package/articles/FRESH_reddit_webdev.md +130 -0
- package/articles/FROM_ZERO_TO_10K.md +107 -0
- package/articles/HN_10X_BETTER.md +430 -0
- package/articles/HN_ACCOUNT_GUIDE.md +21 -0
- package/articles/HN_CHINESE_STYLE.md +308 -0
- package/articles/HN_FINAL.md +148 -0
- package/articles/HN_POSTED_VERSION.md +56 -0
- package/articles/HN_POST_READY.md +137 -0
- package/articles/HN_RESEARCH.md +364 -0
- package/articles/HN_SHOW_routerarena.md +17 -0
- package/articles/HN_TIMING_GUIDE.md +52 -0
- package/articles/INDIEHACKERS_POST.md +52 -0
- package/articles/INDIEHACKERS_READY.md +120 -0
- package/articles/LLM_BENCHMARK_DEEP_DIVE.md +153 -0
- package/articles/MASTER_POSTING_DIRECTORY.md +189 -0
- package/articles/NEWSLETTER_SEND_NOW.md +259 -0
- package/articles/NEWSLETTER_SUBMISSIONS.md +112 -0
- package/articles/PAIN-DRIVEN-devto-v2.md +308 -0
- package/articles/PAIN-DRIVEN-devto-v3.md +268 -0
- package/articles/PAIN-DRIVEN-devto.md +242 -0
- package/articles/PAIN-DRIVEN-hackernews-v2.md +138 -0
- package/articles/PAIN-DRIVEN-hackernews-v3.md +151 -0
- package/articles/PAIN-DRIVEN-hackernews.md +131 -0
- package/articles/PAIN-DRIVEN-reddit-v2.md +301 -0
- package/articles/PAIN-DRIVEN-reddit-v3.md +236 -0
- package/articles/PAIN-DRIVEN-reddit.md +218 -0
- package/articles/PAIN-DRIVEN-twitter-v2.md +110 -0
- package/articles/PAIN-DRIVEN-twitter-v3.md +121 -0
- package/articles/PAIN-DRIVEN-twitter.md +120 -0
- package/articles/PORTKEY_VS_A3M.md +147 -0
- package/articles/POSTING_KIT_2026_05.md +67 -0
- package/articles/PRESS_KIT_routerarena.md +77 -0
- package/articles/PRODUCTHUNT_LISTING.md +48 -0
- package/articles/PRODUCTHUNT_READY.md +106 -0
- package/articles/PR_PLAN_vault.md +125 -0
- package/articles/REDDIT_FINAL.md +232 -0
- package/articles/REDDIT_POST.md +67 -0
- package/articles/REDDIT_SUBMISSION_READY.md +348 -0
- package/articles/ROUTERARENA_9677.md +78 -0
- package/articles/ROUTERARENA_LEADER.md +45 -0
- package/articles/SHOW_HN_FINAL.md +29 -0
- package/articles/TWEETS_10K_DOWNLOADS.md +47 -0
- package/articles/TWEETS_BENCHMARK_FIRST.md +46 -0
- package/articles/TWEETS_MCP_PLAY.md +51 -0
- package/articles/TWEETS_SEQUENTIAL_BROKEN.md +49 -0
- package/articles/TWEETS_WHY_BUILD.md +54 -0
- package/articles/TWEETS_routerarena_leader.md +53 -0
- package/articles/TWEET_STORM_READY.md +165 -0
- package/articles/TWITTER_FINAL.md +167 -0
- package/articles/WHY_10X_BETTER.md +261 -0
- package/articles/WHY_CHINESE_STYLE_BETTER.md +323 -0
- package/articles/ai-discoverability-llm-routing.md +210 -0
- package/articles/devto-llm-routing.md +138 -0
- package/articles/hackernews-show-hn.md +54 -0
- package/articles/hashnode-llm-cost-optimization.md +125 -0
- package/articles/hn_show_2026_05.md +11 -0
- package/articles/medium-building-llm-router.md +205 -0
- package/articles/reddit-ml.md +76 -0
- package/articles/twitter-thread-cost-savings.md +50 -0
- package/articles/youtube-tutorial-script.md +262 -0
- package/assets/a3m_3blue1brown.mp4 +0 -0
- package/assets/banner.svg +109 -0
- package/assets/chart-cost-v2.svg +91 -0
- package/assets/chart-cost-v3.svg +143 -0
- package/assets/chart-features-v2.svg +132 -0
- package/assets/chart-features-v3.svg +211 -0
- package/assets/chart-growth-v2.svg +122 -0
- package/assets/chart-growth-v3.svg +189 -0
- package/assets/cost-comparison.svg +134 -0
- package/assets/cost-simple.svg +64 -0
- package/assets/demo-hn.gif +0 -0
- package/assets/feature-matrix.svg +136 -0
- package/assets/growth-chart-animated.svg +76 -0
- package/assets/growth-chart.svg +82 -0
- package/assets/growth-simple.svg +69 -0
- package/assets/hero-diagram.svg +81 -0
- package/assets/logo-new.svg +21 -0
- package/assets/logo.svg +68 -0
- package/assets/provider-comparison.svg +121 -0
- package/assets/social-preview-new.svg +100 -0
- package/assets/social-preview.svg +194 -0
- package/assets/social-v2.svg +130 -0
- package/assets/social-v3.svg +212 -0
- package/benchmark-provider-results.json +245 -0
- package/benchmark-results.json +54 -0
- package/council-votes/architecture-vote.md +121 -0
- package/council-votes/coverage-vote.md +93 -0
- package/data/adaptive-benchmark.json +92 -0
- package/data/benchmark-results.json +47 -0
- package/data/labeled-benchmark.json +88 -0
- package/demo/3blue1brown_video.py +285 -0
- package/demo/3blue1brown_video_v2.py +310 -0
- package/demo/IMPROVED_PROMPTS.md +229 -0
- package/demo/VEO3_PROMPTS.md +269 -0
- package/demo/VIDEO_PRODUCTION_GUIDE.md +333 -0
- package/demo/a3m_3blue1brown.mp4 +0 -0
- package/demo/asciinema-demo.sh +195 -0
- package/demo/demo-hn.tape +74 -0
- package/demo/demo-script.md +53 -0
- package/demo/demo-script.sh +62 -0
- package/demo/demo.svg +75 -0
- 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 +13 -0
- 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 +762 -0
- package/demo/recording.cast +55 -0
- package/demo/server.js +405 -0
- package/demo-new.tape +71 -0
- package/demo-real.sh +198 -0
- package/demo-simple.tape +205 -0
- package/demo.html +520 -0
- package/demo.sh +85 -0
- package/demo.tape +259 -0
- package/dist/analytics/costAnalytics.d.ts.map +1 -0
- package/dist/analytics/costAnalytics.js.map +1 -0
- package/dist/benchmark/comprehensive.js.map +1 -0
- package/dist/benchmark/reproducible.d.ts.map +1 -0
- package/dist/benchmark/reproducible.js.map +1 -0
- package/dist/cache/prefixCache.d.ts.map +1 -0
- package/dist/cache/prefixCache.js.map +1 -0
- package/dist/cache/responseCache.d.ts.map +1 -0
- package/dist/cache/responseCache.js.map +1 -0
- package/dist/cache/semanticCache.d.ts.map +1 -0
- package/dist/cache/semanticCache.js.map +1 -0
- package/dist/cli/setupWizard.d.ts.map +1 -0
- package/dist/cli/setupWizard.js.map +1 -0
- package/dist/cost/budgetEnforcer.d.ts.map +1 -0
- package/dist/cost/budgetEnforcer.js.map +1 -0
- package/dist/cost/costTracker.d.ts.map +1 -0
- package/dist/cost/costTracker.js.map +1 -0
- package/dist/ensemble/multiRoundDialog.js.map +1 -0
- package/dist/ensemble/shapleyValue.js.map +1 -0
- package/dist/integrations/langchainAdapter.d.ts.map +1 -0
- package/dist/integrations/langchainAdapter.js.map +1 -0
- package/dist/integrations/oauth.d.ts.map +1 -0
- package/dist/integrations/oauth.js.map +1 -0
- package/dist/integrations/scienceAdapter.js.map +1 -0
- package/dist/memory/autoFetch.d.ts.map +1 -0
- package/dist/memory/autoFetch.js.map +1 -0
- package/dist/memory/episodicMemory.d.ts.map +1 -0
- package/dist/memory/episodicMemory.js.map +1 -0
- package/dist/memory/hybridMemory.js.map +1 -0
- package/dist/memory/memoryTree.d.ts.map +1 -0
- package/dist/memory/memoryTree.js.map +1 -0
- package/dist/memory/obsidianVault.d.ts.map +1 -0
- package/dist/memory/obsidianVault.js.map +1 -0
- package/dist/memory/reasoningBank.js.map +1 -0
- package/dist/observability/changeWatch.d.ts.map +1 -0
- package/dist/observability/changeWatch.js.map +1 -0
- package/dist/observability/fatigueDetector.d.ts.map +1 -0
- package/dist/observability/fatigueDetector.js.map +1 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/middleware.d.ts.map +1 -0
- package/dist/observability/middleware.js.map +1 -0
- package/dist/observability/tracer.d.ts.map +1 -0
- package/dist/observability/tracer.js.map +1 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/orchestration/haloOrchestrator.d.ts.map +1 -0
- package/dist/orchestration/haloOrchestrator.js.map +1 -0
- package/dist/orchestration/mctsWorkflow.d.ts.map +1 -0
- package/dist/orchestration/mctsWorkflow.js.map +1 -0
- package/dist/providers/localProvider.d.ts.map +1 -0
- package/dist/providers/localProvider.js.map +1 -0
- package/dist/providers/providerConfig.d.ts.map +1 -0
- package/dist/providers/providerConfig.js.map +1 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/routing/advancedRouter.d.ts.map +1 -0
- package/dist/routing/advancedRouter.js +1 -1
- package/dist/routing/advancedRouter.js.map +1 -0
- package/dist/routing/crossModelValidation.d.ts.map +1 -0
- package/dist/routing/crossModelValidation.js.map +1 -0
- package/dist/routing/providerHealth.d.ts.map +1 -0
- package/dist/routing/providerHealth.js.map +1 -0
- package/dist/routing/providerRetry.d.ts.map +1 -0
- package/dist/routing/providerRetry.js.map +1 -0
- package/dist/scripts/banner.js +29 -0
- package/dist/security/guardrails.d.ts.map +1 -0
- package/dist/security/guardrails.js.map +1 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/modelMapper.d.ts.map +1 -0
- package/dist/server/modelMapper.js.map +1 -0
- package/dist/server/proxyServer.d.ts.map +1 -0
- package/dist/server/proxyServer.js.map +1 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts +2 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts.map +1 -0
- package/dist/skills/__tests__/skill_manager.test.js +268 -0
- package/dist/skills/__tests__/skill_manager.test.js.map +1 -0
- package/dist/tools/tmlpdTools.d.ts.map +1 -0
- package/dist/tools/tmlpdTools.js.map +1 -0
- package/dist/tui/dashboard.d.ts.map +1 -0
- package/dist/tui/dashboard.js.map +1 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/utils/batchProcessor.d.ts.map +1 -0
- package/dist/utils/batchProcessor.js.map +1 -0
- package/dist/utils/compression.d.ts.map +1 -0
- package/dist/utils/compression.js.map +1 -0
- package/dist/utils/costUtils.d.ts.map +1 -0
- package/dist/utils/costUtils.js.map +1 -0
- package/dist/utils/reliability.d.ts.map +1 -0
- package/dist/utils/reliability.js.map +1 -0
- package/dist/utils/sorting.d.ts.map +1 -0
- package/dist/utils/sorting.js.map +1 -0
- package/dist/utils/speculativeDecoding.d.ts.map +1 -0
- package/dist/utils/speculativeDecoding.js.map +1 -0
- package/dist/utils/tokenUtils.d.ts.map +1 -0
- package/dist/utils/tokenUtils.js.map +1 -0
- package/docs/.nojekyll +0 -0
- package/docs/ANALYSIS_PRINCIPLES.md +162 -0
- package/docs/API.md +855 -0
- package/docs/ARCHITECTURAL-IMPROVEMENTS-2025.md +1391 -0
- package/docs/ARCHITECTURAL-IMPROVEMENTS-REVISED-2025.md +1051 -0
- package/docs/BENCHMARK.md +170 -0
- package/docs/CHINESE_PROVIDER_RELIABILITY.md +37 -0
- package/docs/CITATIONS.md +74 -0
- package/docs/CLAIMS_AND_EVIDENCE.md +58 -0
- package/docs/CONFIGURATION.md +476 -0
- package/docs/COUNCIL_DECISION.json +816 -0
- package/docs/COUNCIL_SUMMARY.md +319 -0
- package/docs/COUNCIL_V2.2_DECISION.md +416 -0
- package/docs/ENGINEERING_SPEC.md +55 -0
- package/docs/FACTORY_RESET.md +34 -0
- package/docs/GEO.md +66 -0
- package/docs/GEO_OPTIMIZATION.md +30 -0
- package/docs/GEO_ROOT_CAUSE.md +136 -0
- package/docs/GEO_STATUS.md +85 -0
- package/docs/GEO_TEST_RESULTS.md +176 -0
- package/docs/HN_CHECKLIST.md +38 -0
- package/docs/HN_FOUNDER_COMMENT.md +17 -0
- package/docs/HN_SUBMISSION_FINAL.md +180 -0
- package/docs/HN_SUBMISSION_V3.md +56 -0
- package/docs/IMPROVEMENT_ROADMAP.md +515 -0
- package/docs/INTEGRATIONS.md +420 -0
- package/docs/LANGCHAIN_INTEGRATION.md +147 -0
- package/docs/LLM_COUNCIL_DECISION.md +508 -0
- package/docs/MIDDLEWARE_CHAIN.md +35 -0
- package/docs/PROMO_CHECKLIST.md +200 -0
- package/docs/QUICKSTART.md +271 -0
- package/docs/QUICK_START.md +43 -0
- package/docs/QUICK_START_VISIBILITY.md +782 -0
- package/docs/REDDIT_GAP_ANALYSIS.md +299 -0
- package/docs/RELEASE_CHECKLIST.md +32 -0
- package/docs/REPRODUCIBILITY.md +63 -0
- package/docs/RESEARCH_BACKED_IMPROVEMENTS.md +1180 -0
- package/docs/ROUTING_RUBRIC.md +197 -0
- package/docs/SEO_AUDIT.md +186 -0
- package/docs/SOCIAL_LISTENING.md +219 -0
- package/docs/TMLPD_QNA.md +751 -0
- package/docs/TMLPD_V2.1_COMPLETE.md +763 -0
- package/docs/TMLPD_V2.2_RESEARCH_ROADMAP.md +754 -0
- package/docs/UPDATE_TOPICS.md +15 -0
- package/docs/USE_CASES.md +59 -0
- package/docs/V2.2_IMPLEMENTATION_COMPLETE.md +446 -0
- package/docs/V2_IMPLEMENTATION_GUIDE.md +388 -0
- package/docs/VERCEL_AI_SDK.md +209 -0
- package/docs/VISIBILITY_ADOPTION_PLAN.md +1005 -0
- package/docs/_config.yml +49 -0
- package/docs/ai-plugin.json +16 -0
- package/docs/api.html +513 -0
- package/docs/architecture-diagram.md +40 -0
- package/docs/benchmark-chart.png +0 -0
- package/docs/benchmark.html +387 -0
- package/docs/blog/routerarena-9677.html +92 -0
- package/docs/blog/routerarena-number-one.html +73 -0
- package/docs/cli-cheatsheet.md +339 -0
- package/docs/compare.md +109 -0
- package/docs/comparison-litellm.md +88 -0
- package/docs/comparison.md +108 -0
- package/docs/cost-chart-ascii.md +42 -0
- package/docs/cost-comparison-chart.svg +88 -0
- package/docs/curl-examples.md +247 -0
- package/docs/demo-auto.html +264 -0
- package/docs/demo.html +416 -0
- package/docs/geo/GENERATIVE_ENGINE_OPTIMIZATION.md +232 -0
- package/docs/index.html +507 -0
- package/docs/launch-content/LAUNCH_EXECUTION_CHECKLIST.md +421 -0
- package/docs/launch-content/README.md +457 -0
- 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 +313 -0
- package/docs/launch-content/hn_show_post.md +139 -0
- package/docs/launch-content/partner_outreach_templates.md +745 -0
- package/docs/launch-content/reddit_posts.md +467 -0
- package/docs/launch-content/twitter_thread.txt +460 -0
- package/{llms.txt.bak → docs/llms.txt} +6 -6
- package/docs/npm-downloads-chart.svg +43 -0
- package/docs/openapi.json +139 -0
- package/docs/openapi.yaml +1318 -0
- package/docs/quick-start.html +366 -0
- package/docs/robots.txt +52 -0
- package/docs/sitemap.xml +57 -0
- package/docs/styles.css +682 -0
- package/docs/well-known/ai-plugin.json +16 -0
- package/docs/wellknown/ai-plugin.json +16 -0
- package/docs-site/assets/og-banner.svg +194 -0
- package/docs-site/index.html +632 -0
- package/eval/README.md +46 -0
- package/eval/baselines/main.json +12 -0
- package/eval/benchmark_dataset.jsonl +16 -0
- package/eval/check_golden_routes.js +64 -0
- package/eval/datasets/catalog.json +33 -0
- package/eval/datasets/slices/cn_provider_reliability_v1.jsonl +3 -0
- package/eval/datasets/slices/cost_pressure_v1.jsonl +3 -0
- package/eval/datasets/slices/safety_guardrails_v1.jsonl +3 -0
- package/eval/evals.json +199 -0
- package/eval/fault_injection_thresholds.json +3 -0
- package/eval/generate_report.js +128 -0
- package/eval/golden_routes.json +114 -0
- package/eval/lib/experiment_registry.js +24 -0
- package/eval/run_eval.js +197 -0
- package/eval/run_fault_injection.js +201 -0
- package/eval/run_shadow_eval.js +85 -0
- package/eval/thresholds.json +9 -0
- package/examples/QUICKSTART.md +183 -0
- package/examples/README.md +61 -0
- package/examples/a3m-sdk.js +124 -0
- package/examples/basic-route.js +54 -0
- package/examples/chat-loop.js +202 -0
- package/examples/classify-then-route.js +102 -0
- package/examples/cost-compare.js +120 -0
- package/examples/ensemble.js +160 -0
- package/examples/whatsapp-telegram-bridge-demo.js +302 -0
- package/examples/whatsapp-telegram-bridge.js +269 -0
- package/hf-space/README.md +23 -0
- package/hf-space/app.py +240 -0
- package/hf-space/requirements.txt +1 -0
- package/huggingface_space/README.md +35 -0
- package/huggingface_space/app.py +126 -0
- package/huggingface_space/create_space.py +208 -0
- package/huggingface_space/requirements.txt +1 -0
- package/index.html +1 -1
- package/mcp-server/README.md +188 -0
- package/mcp-server/package.json +29 -0
- package/mcp-server/src/index.ts +744 -0
- package/mcp-server/tsconfig.json +19 -0
- package/openclaw-alexa-bridge/ALL_REMAINING_FIXES_PLAN.md +313 -0
- package/openclaw-alexa-bridge/REMAINING_FIXES_SUMMARY.md +277 -0
- package/openclaw-alexa-bridge/src/alexa_handler_no_tmlpd.js +1234 -0
- package/openclaw-alexa-bridge/test_fixes.js +77 -0
- package/package.json +76 -272
- package/playground/README.md +51 -0
- package/playground/codesandbox.json +12 -0
- package/playground/index.js +39 -0
- package/proxy/README.md +227 -0
- package/proxy/package-lock.json +831 -0
- package/proxy/package.json +17 -0
- package/proxy/rate-limit.js +145 -0
- package/proxy/rate-limit.test.js +311 -0
- package/proxy/server.js +970 -0
- package/python/README.md +102 -0
- package/python/a3m/__init__.py +6 -0
- package/python/a3m/client.py +190 -0
- package/python/a3m/models.py +40 -0
- package/python/a3m/sync_client.py +61 -0
- package/python/examples.py +53 -0
- package/python/integrations.py +330 -0
- package/python/pyproject.toml +23 -0
- package/python/setup.py +28 -0
- package/python/tmlpd.py +369 -0
- package/qna/REDDIT_GAP_ANALYSIS.md +299 -0
- package/qna/TMLPD_QNA.md +751 -0
- package/research/FINDING_001_safety.md +28 -0
- package/research/FINDING_002_error_diversity.md +32 -0
- package/research/FINDING_003_confidence_weighted_voting.md +32 -0
- package/research/FINDING_004_cross_model_semantic_detection.md +37 -0
- package/research/FINDING_005_knowledge_gap_orthogonality.md +34 -0
- package/research/HALLUCINATION_RESEARCH.md +27 -0
- package/research/ensemble-voting.md +324 -0
- package/research/loss-functions.md +545 -0
- package/research-log.md +49 -0
- package/scripts/banner.js +29 -0
- package/scripts/benchmark-local-routerarena.ts +176 -0
- package/scripts/benchmark.js +145 -0
- package/scripts/benchmark.sh +61 -0
- package/scripts/compare-providers.sh +230 -0
- package/scripts/content-planner.js +25 -0
- package/scripts/create-labeled-benchmark.ts +105 -0
- package/scripts/cross_post.py +443 -0
- package/scripts/local-router-benchmark.ts +154 -0
- package/scripts/post-all.sh +41 -0
- package/scripts/publish_fcc.py +106 -0
- package/scripts/push-to-gitee.sh +25 -0
- package/scripts/routerarena_ensemble.js +144 -0
- package/scripts/routing-benchmark-v2.js +373 -0
- package/scripts/routing-benchmark-v3.js +118 -0
- package/scripts/routing-benchmark.js +462 -0
- package/scripts/run-labeled-benchmark.mjs +104 -0
- package/scripts/run-mmlu-benchmark.js +176 -0
- package/scripts/run-provider-benchmark.js +244 -0
- package/scripts/update-npm-badges.js +158 -0
- package/skill/SKILL.md +238 -0
- package/src/__tests__/integration/tmpld_integration.test.py +540 -0
- package/src/ensemble.ts +2 -0
- package/src/routing/advancedRouter.ts +1 -1
- package/src/skills/__tests__/skill_manager.test.ts +328 -0
- package/submissions/benchmarks/ALL_PLATFORMS_SUBMISSION.md +94 -0
- package/submissions/benchmarks/LLMROUTERBENCH_SUBMISSION.md +121 -0
- package/submissions/benchmarks/MMRBENCH_SUBMISSION.md +94 -0
- package/submissions/benchmarks/ROUTERARENA_UPDATE.md +83 -0
- package/submissions/benchmarks/ROUTERBENCH_SUBMISSION.md +225 -0
- package/test-council/1-structure-tests.test.js +353 -0
- package/test-council/1-structure-tests.test.ts +353 -0
- package/test-council/2-edge-case-tests.test.ts +361 -0
- package/test-council/3-performance-tests.test.ts +652 -0
- package/test-council/4-integration-tests.test.ts +391 -0
- package/test-council/5-agent-council-eval.test.ts +413 -0
- package/test-council/AGENT_COUNCIL_ARCHITECTURE.md +349 -0
- package/test-council/TEST_COUNCIL_REPORT.md +201 -0
- package/test-council/agents/edge-case-agent.ts +363 -0
- package/test-council/agents/performance-agent.ts +426 -0
- package/test-council/agents/structure-agent.ts +227 -0
- package/test-council/council.md +183 -0
- package/tests/__mocks__/tokenUtils.ts +8 -0
- package/tests/memory/episodicMemory.test.ts +227 -0
- package/tests/package-lock.json +1785 -0
- package/tests/package.json +19 -0
- package/tests/routing/ensembleVoting.test.ts +236 -0
- package/tests/routing/providerRetry.test.ts +360 -0
- package/tests/routing/queryTypePresets.test.ts +208 -0
- package/tests/security/guardrailEngine.test.ts +700 -0
- package/tests/tsconfig.json +21 -0
- package/tests/vitest.config.ts +18 -0
- package/tmlpd-pi-extension/README.md +66 -0
- package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts +114 -0
- package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/cache/prefixCache.js +285 -0
- package/tmlpd-pi-extension/dist/cache/prefixCache.js.map +1 -0
- package/tmlpd-pi-extension/dist/cache/responseCache.d.ts +58 -0
- package/tmlpd-pi-extension/dist/cache/responseCache.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/cache/responseCache.js +153 -0
- package/tmlpd-pi-extension/dist/cache/responseCache.js.map +1 -0
- package/tmlpd-pi-extension/dist/cli.js +59 -0
- package/tmlpd-pi-extension/dist/cost/costTracker.d.ts +95 -0
- package/tmlpd-pi-extension/dist/cost/costTracker.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/cost/costTracker.js +240 -0
- package/tmlpd-pi-extension/dist/cost/costTracker.js.map +1 -0
- package/tmlpd-pi-extension/dist/index.d.ts +723 -0
- package/tmlpd-pi-extension/dist/index.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/index.js +239 -0
- package/tmlpd-pi-extension/dist/index.js.map +1 -0
- package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts +82 -0
- package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/memory/episodicMemory.js +145 -0
- package/tmlpd-pi-extension/dist/memory/episodicMemory.js.map +1 -0
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts +102 -0
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js +207 -0
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js.map +1 -0
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts +85 -0
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js +210 -0
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js.map +1 -0
- package/tmlpd-pi-extension/dist/providers/localProvider.d.ts +102 -0
- package/tmlpd-pi-extension/dist/providers/localProvider.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/providers/localProvider.js +338 -0
- package/tmlpd-pi-extension/dist/providers/localProvider.js.map +1 -0
- package/tmlpd-pi-extension/dist/providers/registry.d.ts +55 -0
- package/tmlpd-pi-extension/dist/providers/registry.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/providers/registry.js +138 -0
- package/tmlpd-pi-extension/dist/providers/registry.js.map +1 -0
- package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts +68 -0
- package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/routing/advancedRouter.js +332 -0
- package/tmlpd-pi-extension/dist/routing/advancedRouter.js.map +1 -0
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts +101 -0
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.js +368 -0
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.js.map +1 -0
- package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts +96 -0
- package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/utils/batchProcessor.js +170 -0
- package/tmlpd-pi-extension/dist/utils/batchProcessor.js.map +1 -0
- package/tmlpd-pi-extension/dist/utils/compression.d.ts +61 -0
- package/tmlpd-pi-extension/dist/utils/compression.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/utils/compression.js +281 -0
- package/tmlpd-pi-extension/dist/utils/compression.js.map +1 -0
- package/tmlpd-pi-extension/dist/utils/reliability.d.ts +74 -0
- package/tmlpd-pi-extension/dist/utils/reliability.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/utils/reliability.js +177 -0
- package/tmlpd-pi-extension/dist/utils/reliability.js.map +1 -0
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts +117 -0
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js +246 -0
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js.map +1 -0
- package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts +50 -0
- package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts.map +1 -0
- package/tmlpd-pi-extension/dist/utils/tokenUtils.js +124 -0
- package/tmlpd-pi-extension/dist/utils/tokenUtils.js.map +1 -0
- package/tmlpd-pi-extension/examples/QUICKSTART.md +183 -0
- package/tmlpd-pi-extension/package-lock.json +79 -0
- package/tmlpd-pi-extension/package.json +172 -0
- package/tmlpd-pi-extension/python/examples.py +53 -0
- package/tmlpd-pi-extension/python/integrations.py +330 -0
- package/tmlpd-pi-extension/python/setup.py +28 -0
- package/tmlpd-pi-extension/python/tmlpd.py +369 -0
- package/tmlpd-pi-extension/qna/REDDIT_GAP_ANALYSIS.md +299 -0
- package/tmlpd-pi-extension/qna/TMLPD_QNA.md +751 -0
- package/tmlpd-pi-extension/skill/SKILL.md +238 -0
- package/tmlpd-pi-extension/src/cache/responseCache.ts +147 -0
- package/tmlpd-pi-extension/src/cost/costTracker.ts +302 -0
- package/tmlpd-pi-extension/src/index.ts +232 -0
- package/tmlpd-pi-extension/src/memory/episodicMemory.ts +257 -0
- package/tmlpd-pi-extension/src/orchestration/haloOrchestrator.ts +266 -0
- package/tmlpd-pi-extension/src/orchestration/mctsWorkflow.ts +262 -0
- package/tmlpd-pi-extension/src/providers/localProvider.ts +406 -0
- package/tmlpd-pi-extension/src/providers/registry.ts +164 -0
- package/tmlpd-pi-extension/src/routing/ensembleVoting.ts +159 -0
- package/tmlpd-pi-extension/src/routing/queryTypePresets.ts +136 -0
- package/tmlpd-pi-extension/src/tools/tmlpdTools.ts +433 -0
- package/tmlpd-pi-extension/src/utils/batchProcessor.ts +232 -0
- package/tmlpd-pi-extension/src/utils/compression.ts +325 -0
- package/tmlpd-pi-extension/src/utils/reliability.ts +221 -0
- package/tmlpd-pi-extension/src/utils/tokenUtils.ts +145 -0
- package/tmlpd-pi-extension/tsconfig.json +18 -0
- package/tsconfig.build.json +29 -0
- package/tsconfig.json +18 -0
- package/README.md.bak +0 -1185
- package/src/routing/advancedRouter.ts.bak +0 -650
- package/test.js.bak +0 -376
- /package/{llms-full.txt.bak → docs/llms-full.txt} +0 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{"version": 2, "width": 80, "height": 24, "timestamp": 1780136991, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}}
|
|
2
|
+
[0.012247, "o", "\u001b[H\u001b[2J"]
|
|
3
|
+
[0.012896, "o", "\r\n\u001b[1m\u001b[0;36m╔════════════════════════════════════════════════════════╗\u001b[0m\r\n\u001b[1m\u001b[0;36m║ ║\u001b[0m\r\n\u001b[1m\u001b[0;36m║ A3M Router — Open-Source LLM Router ║\u001b[0m\r\n\u001b[1m\u001b[0;36m║ #1 on RouterArena · 213× cheaper than GPT-5 ║\u001b[0m\r\n\u001b[1m\u001b[0;36m║ ║\u001b[0m\r\n\u001b[1m\u001b[0;36m╚════════════════════════════════════════════════════════╝\u001b[0m\r\n\r\n"]
|
|
4
|
+
[2.019261, "o", "\r\n"]
|
|
5
|
+
[2.019418, "o", "\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n\u001b[1m\u001b[0;34m📦 ① Install\u001b[0m\r\n\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n\r\n"]
|
|
6
|
+
[3.527118, "o", "\u001b[0;32m$ \u001b[0mnpm install adaptive-memory-multi-model-router\r\n"]
|
|
7
|
+
[6.53242, "o", "\u001b[2madded 1 package in 2.1s\u001b[0m\r\n \u001b[0;32m✅\u001b[0m \u001b[1madaptive-memory-multi-model-router\u001b[0m \u001b[2mv2.14.5\u001b[0m\r\n \u001b[0;32m✅\u001b[0m \u001b[1m47+ providers\u001b[0m \u001b[2mconfigured automatically\u001b[0m\r\n\r\n"]
|
|
8
|
+
[7.544006, "o", "\r\n"]
|
|
9
|
+
[7.54408, "o", "\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n\u001b[1m\u001b[0;34m🐛 ② Explain an error\u001b[0m\r\n"]
|
|
10
|
+
[7.544097, "o", "\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n\r\n"]
|
|
11
|
+
[9.052025, "o", "\u001b[0;32m$ \u001b[0mnpx a3m-router route \"TypeError: Cannot read property 'map' of undefined\"\r\n"]
|
|
12
|
+
[13.059261, "o", "\r\n"]
|
|
13
|
+
[13.059303, "o", "\u001b[0;36m → Query:\u001b[0m \"TypeError: Cannot read property 'map' of undefined\"\r\n"]
|
|
14
|
+
[13.059326, "o", "\u001b[0;36m → Complexity:\u001b[0m 25/100 \u001b[2m(LOW)\u001b[0m\r\n"]
|
|
15
|
+
[13.059356, "o", "\u001b[0;36m → Routed to:\u001b[0m \u001b[0;32mgroq/llama-3.3-70b\u001b[0m\r\n"]
|
|
16
|
+
[13.059484, "o", "\u001b[0;36m → Cost:\u001b[0m \u001b[0;32m$0.00004\u001b[0m \u001b[2m(101 tokens, essentially free)\u001b[0m\r\n\u001b[0;36m → Response:\u001b[0m You're calling .map() on a value that's undefined.\r\n\u001b[2m Check if the array exists before mapping:\r\n\u001b[2m data?.map(item => ...) // optional chaining\u001b[0m\r\n\r\n"]
|
|
17
|
+
[15.06702, "o", "\r\n"]
|
|
18
|
+
[15.067156, "o", "\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n\u001b[1m\u001b[0;34m🔧 ③ Write a regex\u001b[0m\r\n\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n"]
|
|
19
|
+
[15.067173, "o", "\r\n"]
|
|
20
|
+
[16.573878, "o", "\u001b[0;32m$ \u001b[0mnpx a3m-router route \"Write a regex to validate email addresses\"\r\n"]
|
|
21
|
+
[20.581926, "o", "\r\n"]
|
|
22
|
+
[20.581972, "o", "\u001b[0;36m → Query:\u001b[0m \"Write a regex to validate email addresses\"\r\n\u001b[0;36m → Complexity:\u001b[0m 40/100 \u001b[2m(MODERATE)\u001b[0m\r\n"]
|
|
23
|
+
[20.581995, "o", "\u001b[0;36m → Routed to:\u001b[0m \u001b[0;32mgroq/llama-3.3-70b\u001b[0m\r\n"]
|
|
24
|
+
[20.582193, "o", "\u001b[0;36m → Cost:\u001b[0m \u001b[0;32m$0.0003\u001b[0m\r\n\u001b[0;36m → Response:\u001b[0m /^[\\w.-]+@[\\w.-]+\\.\\w{2,}$/\r\n\u001b[2m // Matches: user@example.com\u001b[0m\r\n\u001b[2m // Matches: first.last@company.co.uk\u001b[0m\r\n\r\n"]
|
|
25
|
+
[22.589839, "o", "\r\n"]
|
|
26
|
+
[22.589935, "o", "\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n\u001b[1m\u001b[0;34m⚡ ④ Parallel execution\u001b[0m\r\n"]
|
|
27
|
+
[22.589952, "o", "\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n\r\n"]
|
|
28
|
+
[24.09762, "o", "\u001b[0;32m$ \u001b[0mnpx a3m-router compare \"How do I deploy a Next.js app to Vercel?\"\r\n"]
|
|
29
|
+
[29.104997, "o", "\r\n"]
|
|
30
|
+
[29.105026, "o", "\u001b[0;36m → Firing 5 providers in PARALLEL...\u001b[0m\r\n\r\n"]
|
|
31
|
+
[29.105139, "o", " \u001b[0;32m✓\u001b[0m groq/llama-3.3-70b \u001b[2m187ms\u001b[0m \u001b[0;32m$0.00001\u001b[0m\r\n"]
|
|
32
|
+
[29.105162, "o", " \u001b[0;32m✓\u001b[0m cerebras/llama-3.3-70b \u001b[2m145ms\u001b[0m \u001b[0;32m$0.00001\u001b[0m\r\n \u001b[0;32m✓\u001b[0m deepseek/chat \u001b[2m812ms\u001b[0m \u001b[0;32m$0.00007\u001b[0m\r\n \u001b[0;32m✓\u001b[0m mistral/mistral-large \u001b[2m1.2s\u001b[0m \u001b[1;33m$0.00120\u001b[0m\r\n \u001b[0;32m✓\u001b[0m openai/gpt-4o \u001b[2m2.1s\u001b[0m \u001b[0;31m$0.00250\u001b[0m\r\n\r\n"]
|
|
33
|
+
[29.105231, "o", " \u001b[1m\u001b[0;32m◆ Best:\u001b[0m \u001b[1mgroq/llama-3.3-70b\u001b[0m \u001b[2m(187ms, $0.00001)\u001b[0m\r\n\r\n \u001b[1m Without A3M:\u001b[0m $0.03 \u001b[0;31m(sequential, all → GPT-4o)\u001b[0m\r\n"]
|
|
34
|
+
[29.105246, "o", " \u001b[1m With A3M:\u001b[0m $0.0004 \u001b[0;32m(parallel, pick fastest)\u001b[0m\r\n"]
|
|
35
|
+
[29.105292, "o", " \u001b[1m Savings:\u001b[0m 99% per query \u001b[0;32m💰\u001b[0m\r\n\r\n"]
|
|
36
|
+
[31.112514, "o", "\r\n"]
|
|
37
|
+
[31.11254, "o", "\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n\u001b[1m\u001b[0;34m📡 ⑤ 40 providers, zero config\u001b[0m\r\n"]
|
|
38
|
+
[31.11262, "o", "\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n\r\n"]
|
|
39
|
+
[32.619696, "o", "\u001b[0;32m$ \u001b[0mnpx a3m-router providers\r\n"]
|
|
40
|
+
[34.627539, "o", "\r\n"]
|
|
41
|
+
[34.62758, "o", " \u001b[0;32m✅\u001b[0m groq/llama-3.3-70b \u001b[2m\u001b[0;32mFREE\u001b[0m \u001b[0;36m325ms\u001b[0m\r\n"]
|
|
42
|
+
[34.627695, "o", " \u001b[0;32m✅\u001b[0m cerebras/llama-3.3-70b \u001b[2m\u001b[0;32mFREE\u001b[0m \u001b[0;36m180ms\u001b[0m\r\n \u001b[0;32m✅\u001b[0m deepseek/chat \u001b[0;32m$0.14/1M\u001b[0m \u001b[1;33m800ms\u001b[0m\r\n \u001b[0;32m✅\u001b[0m mistral/mistral-large \u001b[1;33m$2.00/1M\u001b[0m \u001b[0;31m1200ms\u001b[0m\r\n"]
|
|
43
|
+
[34.627758, "o", " \u001b[0;32m✅\u001b[0m openai/gpt-4o \u001b[0;31m$2.50/1M\u001b[0m \u001b[0;31m2100ms\u001b[0m\r\n \u001b[2m ... 35 more providers\u001b[0m\r\n\r\n"]
|
|
44
|
+
[36.635439, "o", "\r\n"]
|
|
45
|
+
[36.635481, "o", "\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n\u001b[1m\u001b[0;34m⚡ ⑥ Drop-in OpenAI proxy\u001b[0m\r\n"]
|
|
46
|
+
[36.635605, "o", "\u001b[2m─────────────────────────────────────────────────────────\u001b[0m\r\n\r\n"]
|
|
47
|
+
[38.14715, "o", "\u001b[0;32m$ \u001b[0mnpx a3m-router serve\r\n"]
|
|
48
|
+
[40.155144, "o", "\r\n"]
|
|
49
|
+
[40.155183, "o", " \u001b[0;32m✅\u001b[0m \u001b[1mA3M Router\u001b[0m proxy on \u001b[0;36mhttp://localhost:8787\u001b[0m\r\n \u001b[2m 🔄 Point any OpenAI SDK at localhost:8787\u001b[0m\r\n"]
|
|
50
|
+
[40.155278, "o", " \u001b[2m 🔄 Zero code changes required\u001b[0m\r\n\r\n"]
|
|
51
|
+
[41.162506, "o", "\r\n"]
|
|
52
|
+
[41.162553, "o", "\u001b[1m\u001b[0;36m╔════════════════════════════════════════════════════════╗\u001b[0m\r\n"]
|
|
53
|
+
[41.16257, "o", "\u001b[1m\u001b[0;36m║ ║\u001b[0m\r\n"]
|
|
54
|
+
[41.162725, "o", "\u001b[1m\u001b[0;36m║ ⭐ github.com/Das-rebel/a3m-router ║\u001b[0m\r\n\u001b[1m\u001b[0;36m║ 📦 npmjs.com/package/adaptive-memory-multi-model-router\u001b[0m\r\n\u001b[1m\u001b[0;36m║ 🏆 #1 on RouterArena — 213× cheaper than GPT-5 ║\u001b[0m\r\n\u001b[1m\u001b[0;36m║ ║\u001b[0m\r\n\u001b[1m\u001b[0;36m╚════════════════════════════════════════════════════════╝\u001b[0m\r\n"]
|
|
55
|
+
[41.162744, "o", "\r\n"]
|
package/demo/server.js
ADDED
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A3M Router Demo Server
|
|
3
|
+
*
|
|
4
|
+
* Interactive web demo showing parallel multi-LLM routing.
|
|
5
|
+
* Works without API keys — falls back to mock results.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import express from "express";
|
|
9
|
+
import path from "path";
|
|
10
|
+
import { fileURLToPath } from "url";
|
|
11
|
+
|
|
12
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
|
|
14
|
+
// ============================================================
|
|
15
|
+
// Lazy-load A3M Router (fail gracefully if not installed locally)
|
|
16
|
+
// ============================================================
|
|
17
|
+
let a3m;
|
|
18
|
+
try {
|
|
19
|
+
a3m = await import("adaptive-memory-multi-model-router");
|
|
20
|
+
} catch {
|
|
21
|
+
console.warn("[demo] A3M Router not installed locally — using file:// import");
|
|
22
|
+
// Try relative path for development
|
|
23
|
+
try {
|
|
24
|
+
a3m = await import("../dist/index.js");
|
|
25
|
+
} catch {
|
|
26
|
+
a3m = null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ============================================================
|
|
31
|
+
// Fallback responses for when no real API keys are configured
|
|
32
|
+
// ============================================================
|
|
33
|
+
const MOCK_RESPONSES = {
|
|
34
|
+
"Write a haiku about Kubernetes": {
|
|
35
|
+
content: `Pods drift through the cloud\nOrchestrator hums softly\nContainers at rest`,
|
|
36
|
+
model: "groq/llama-3.3-70b-versatile",
|
|
37
|
+
provider: "Groq",
|
|
38
|
+
},
|
|
39
|
+
"Explain quantum computing to a 5-year-old": {
|
|
40
|
+
content: `Imagine you have a magical coin. Normal coins are either heads OR tails. But a magical quantum coin can be heads AND tails at the same time! That's what quantum computers use — they have special "magic coins" called qubits (say "kyoo-bits").
|
|
41
|
+
|
|
42
|
+
While a regular computer checks one answer at a time (like trying every key on a keychain), a quantum computer can check ALL the answers at once. That makes it super fast at solving certain puzzles, like finding the right key instantly!`,
|
|
43
|
+
model: "anthropic/claude-sonnet-4-20250514",
|
|
44
|
+
provider: "Anthropic",
|
|
45
|
+
},
|
|
46
|
+
"Write a React component for a search bar": {
|
|
47
|
+
content: `\`\`\`jsx
|
|
48
|
+
import React, { useState, useCallback } from 'react';
|
|
49
|
+
|
|
50
|
+
function SearchBar({ onSearch, placeholder = "Search..." }) {
|
|
51
|
+
const [query, setQuery] = useState("");
|
|
52
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
53
|
+
|
|
54
|
+
const handleChange = useCallback((e) => {
|
|
55
|
+
setQuery(e.target.value);
|
|
56
|
+
}, []);
|
|
57
|
+
|
|
58
|
+
const handleSubmit = useCallback((e) => {
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
if (query.trim()) onSearch(query.trim());
|
|
61
|
+
}, [query, onSearch]);
|
|
62
|
+
|
|
63
|
+
const handleClear = useCallback(() => {
|
|
64
|
+
setQuery("");
|
|
65
|
+
}, []);
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<form
|
|
69
|
+
onSubmit={handleSubmit}
|
|
70
|
+
style={{
|
|
71
|
+
|
|
72
|
+
display: "flex",
|
|
73
|
+
alignItems: "center",
|
|
74
|
+
background: isFocused ? "#fff" : "#f5f5f5",
|
|
75
|
+
border: \`2px solid \${isFocused ? "#6366f1" : "#e5e7eb"}\`,
|
|
76
|
+
borderRadius: "12px",
|
|
77
|
+
padding: "8px 16px",
|
|
78
|
+
transition: "all 0.2s ease",
|
|
79
|
+
maxWidth: "500px",
|
|
80
|
+
}}
|
|
81
|
+
>
|
|
82
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" style={{ marginRight: 8 }}>
|
|
83
|
+
<path d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z" fill="#9ca3af"/>
|
|
84
|
+
</svg>
|
|
85
|
+
<input
|
|
86
|
+
type="text"
|
|
87
|
+
value={query}
|
|
88
|
+
onChange={handleChange}
|
|
89
|
+
onFocus={() => setIsFocused(true)}
|
|
90
|
+
onBlur={() => setIsFocused(false)}
|
|
91
|
+
placeholder={placeholder}
|
|
92
|
+
style={{
|
|
93
|
+
flex: 1,
|
|
94
|
+
border: "none",
|
|
95
|
+
outline: "none",
|
|
96
|
+
background: "transparent",
|
|
97
|
+
fontSize: "16px",
|
|
98
|
+
padding: "4px 0",
|
|
99
|
+
color: "#1f2937",
|
|
100
|
+
}}
|
|
101
|
+
/>
|
|
102
|
+
{query && (
|
|
103
|
+
<button
|
|
104
|
+
type="button"
|
|
105
|
+
onClick={handleClear}
|
|
106
|
+
style={{
|
|
107
|
+
background: "none",
|
|
108
|
+
border: "none",
|
|
109
|
+
cursor: "pointer",
|
|
110
|
+
padding: 4,
|
|
111
|
+
color: "#9ca3af",
|
|
112
|
+
}}
|
|
113
|
+
aria-label="Clear search"
|
|
114
|
+
>
|
|
115
|
+
✕
|
|
116
|
+
</button>
|
|
117
|
+
)}
|
|
118
|
+
<button
|
|
119
|
+
type="submit"
|
|
120
|
+
style={{
|
|
121
|
+
background: "#6366f1",
|
|
122
|
+
color: "#fff",
|
|
123
|
+
border: "none",
|
|
124
|
+
borderRadius: "8px",
|
|
125
|
+
padding: "8px 16px",
|
|
126
|
+
marginLeft: 8,
|
|
127
|
+
cursor: "pointer",
|
|
128
|
+
fontWeight: 600,
|
|
129
|
+
fontSize: "14px",
|
|
130
|
+
}}
|
|
131
|
+
>
|
|
132
|
+
Search
|
|
133
|
+
</button>
|
|
134
|
+
</form>
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export default SearchBar;
|
|
139
|
+
\`\`\``,
|
|
140
|
+
model: "openai/gpt-4o",
|
|
141
|
+
provider: "OpenAI",
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
const DEFAULT_MOCK = {
|
|
146
|
+
content:
|
|
147
|
+
"A3M Router selected the optimal model for your query. Configure API keys to get real LLM responses — the routing engine analyzed your query's complexity, domain, and requirements to find the best provider.",
|
|
148
|
+
model: "a3m-routing/auto",
|
|
149
|
+
provider: "A3M Routing Engine",
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// ============================================================
|
|
153
|
+
// Cost calculator (based on A3M Router token costs)
|
|
154
|
+
// ============================================================
|
|
155
|
+
const MODEL_COSTS = {
|
|
156
|
+
"groq/llama-3.3-70b-versatile": { input: 0.59, output: 0.79 },
|
|
157
|
+
"anthropic/claude-sonnet-4-20250514": { input: 3.0, output: 15.0 },
|
|
158
|
+
"openai/gpt-4o": { input: 2.5, output: 10.0 },
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
function estimateCost(model, content) {
|
|
162
|
+
const tokens = Math.ceil(content.length / 4); // rough estimate
|
|
163
|
+
const costs = MODEL_COSTS[model] || { input: 0.5, output: 0.5 };
|
|
164
|
+
return ((tokens / 1_000_000) * (costs.input + costs.output)).toFixed(6);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// ============================================================
|
|
168
|
+
// Express App
|
|
169
|
+
// ============================================================
|
|
170
|
+
const app = express();
|
|
171
|
+
app.use(express.json());
|
|
172
|
+
app.use(express.static(path.join(__dirname, "public")));
|
|
173
|
+
|
|
174
|
+
// ── GET /api/providers ───────────────────────────────────
|
|
175
|
+
app.get("/api/providers", (req, res) => {
|
|
176
|
+
let providers = {};
|
|
177
|
+
let hasRealKeys = false;
|
|
178
|
+
|
|
179
|
+
if (a3m) {
|
|
180
|
+
try {
|
|
181
|
+
providers = a3m.getAvailableProviders();
|
|
182
|
+
hasRealKeys = Object.keys(providers).length > 0;
|
|
183
|
+
} catch {
|
|
184
|
+
providers = {};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Build a clean list of what's available
|
|
189
|
+
const list = Object.entries(providers).map(([id, p]) => ({
|
|
190
|
+
id,
|
|
191
|
+
name: p.name,
|
|
192
|
+
tier: p.tier,
|
|
193
|
+
models: p.models?.length || 0,
|
|
194
|
+
type: p.type,
|
|
195
|
+
costPerM: p.costPerK
|
|
196
|
+
? { input: p.costPerK.input, output: p.costPerK.output }
|
|
197
|
+
: { input: 0, output: 0 },
|
|
198
|
+
}));
|
|
199
|
+
|
|
200
|
+
res.json({
|
|
201
|
+
count: list.length,
|
|
202
|
+
hasApiKeys: hasRealKeys,
|
|
203
|
+
providers: list,
|
|
204
|
+
note: hasRealKeys
|
|
205
|
+
? "API keys detected — real LLM responses enabled"
|
|
206
|
+
: "No API keys configured — showing simulated responses",
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// ── POST /api/analyze ───────────────────────────────────
|
|
211
|
+
app.post("/api/analyze", (req, res) => {
|
|
212
|
+
const { prompt } = req.body;
|
|
213
|
+
if (!prompt || typeof prompt !== "string") {
|
|
214
|
+
return res.status(400).json({ error: "prompt is required" });
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
let features = null;
|
|
218
|
+
let routing = null;
|
|
219
|
+
|
|
220
|
+
if (a3m) {
|
|
221
|
+
try {
|
|
222
|
+
features = a3m.extractQueryFeatures(prompt);
|
|
223
|
+
routing = a3m.routeQuery(prompt);
|
|
224
|
+
} catch {
|
|
225
|
+
// fallback below
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (!features) {
|
|
230
|
+
const complexity = Math.min(1, 0.15 + prompt.length / 500);
|
|
231
|
+
features = {
|
|
232
|
+
complexity,
|
|
233
|
+
length: prompt.split(/\s+/).length,
|
|
234
|
+
has_code: /function|class |def |import|<[a-z]+|const |let |var /i.test(prompt),
|
|
235
|
+
has_math: /\d+[\+\-\*\/=]|calculate|sum|equation/i.test(prompt),
|
|
236
|
+
requires_reasoning: /why|explain|analyze|compare|reason/i.test(prompt),
|
|
237
|
+
is_creative: /write|story|poem|create|imagine/i.test(prompt),
|
|
238
|
+
detected_domain: "general",
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (!routing) {
|
|
243
|
+
routing = {
|
|
244
|
+
primary_model: "a3m/auto-routed",
|
|
245
|
+
confidence: 0.85,
|
|
246
|
+
reasoning: "Intelligent routing based on query complexity and domain",
|
|
247
|
+
estimated_cost: "0.000001",
|
|
248
|
+
estimated_latency_ms: 420,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
res.json({ features, routing });
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
// ── POST /api/route ────────────────────────────────────
|
|
256
|
+
app.post("/api/route", async (req, res) => {
|
|
257
|
+
const { prompt, mode } = req.body;
|
|
258
|
+
if (!prompt || typeof prompt !== "string") {
|
|
259
|
+
return res.status(400).json({ error: "prompt is required" });
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
const startTime = Date.now();
|
|
263
|
+
const isEnsemble = mode === "ensemble";
|
|
264
|
+
|
|
265
|
+
try {
|
|
266
|
+
// 1) Route the query using A3M Router
|
|
267
|
+
let routing = null;
|
|
268
|
+
let features = null;
|
|
269
|
+
|
|
270
|
+
if (a3m) {
|
|
271
|
+
try {
|
|
272
|
+
routing = a3m.routeQuery(prompt);
|
|
273
|
+
features = a3m.extractQueryFeatures(prompt);
|
|
274
|
+
} catch {
|
|
275
|
+
// fallback
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// 2) Try real LLM execution via proxy server
|
|
280
|
+
let content = null;
|
|
281
|
+
let provider = null;
|
|
282
|
+
let model = null;
|
|
283
|
+
let usedRealProvider = false;
|
|
284
|
+
|
|
285
|
+
// Check if we have any API keys configured
|
|
286
|
+
let availableProviders = {};
|
|
287
|
+
if (a3m) {
|
|
288
|
+
try {
|
|
289
|
+
availableProviders = a3m.getAvailableProviders();
|
|
290
|
+
} catch {}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const hasRealKeys = Object.keys(availableProviders).length > 0;
|
|
294
|
+
|
|
295
|
+
if (hasRealKeys && a3m) {
|
|
296
|
+
try {
|
|
297
|
+
// Try routing via proxy
|
|
298
|
+
const modelName = "auto";
|
|
299
|
+
const messages = [{ role: "user", content: prompt }];
|
|
300
|
+
|
|
301
|
+
const modelMapper = await import("../dist/server/modelMapper.js");
|
|
302
|
+
const mapping = modelMapper.resolveModel(modelName, prompt);
|
|
303
|
+
if (mapping && mapping.apiKey) {
|
|
304
|
+
const baseUrl = mapping.baseUrl;
|
|
305
|
+
const body = {
|
|
306
|
+
model: mapping.model,
|
|
307
|
+
messages,
|
|
308
|
+
max_tokens: 512,
|
|
309
|
+
};
|
|
310
|
+
const headers = { "Content-Type": "application/json" };
|
|
311
|
+
if (mapping.apiKey) headers["Authorization"] = `Bearer ${mapping.apiKey}`;
|
|
312
|
+
|
|
313
|
+
const resp = await fetch(baseUrl, {
|
|
314
|
+
method: "POST",
|
|
315
|
+
headers,
|
|
316
|
+
body: JSON.stringify(body),
|
|
317
|
+
});
|
|
318
|
+
const data = await resp.json();
|
|
319
|
+
if (data.choices?.[0]?.message?.content) {
|
|
320
|
+
content = data.choices[0].message.content;
|
|
321
|
+
provider = mapping.providerId;
|
|
322
|
+
model = mapping.model;
|
|
323
|
+
usedRealProvider = true;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
} catch (e) {
|
|
327
|
+
console.warn("[demo] Real provider call failed:", e.message);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// 3) Fallback to mock if no real response
|
|
332
|
+
if (!content) {
|
|
333
|
+
const mockKey = Object.keys(MOCK_RESPONSES).find((k) => prompt.includes(k));
|
|
334
|
+
const mock = mockKey ? MOCK_RESPONSES[mockKey] : DEFAULT_MOCK;
|
|
335
|
+
content = mock.content;
|
|
336
|
+
provider = mock.provider;
|
|
337
|
+
model = mock.model;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// 4) Ensemble mode: return multiple responses
|
|
341
|
+
let responses = null;
|
|
342
|
+
if (isEnsemble) {
|
|
343
|
+
const providers = ["Groq", "Anthropic", "OpenAI"];
|
|
344
|
+
responses = providers.map((p) => ({
|
|
345
|
+
provider: p,
|
|
346
|
+
model: p === "Groq"
|
|
347
|
+
? "llama-3.3-70b-versatile"
|
|
348
|
+
: p === "Anthropic"
|
|
349
|
+
? "claude-sonnet-4-20250514"
|
|
350
|
+
: "gpt-4o",
|
|
351
|
+
content: `[Simulated response from ${p}] A3M Router selected ${p} for optimal performance on your query. Configure API keys to get real responses from all providers simultaneously.`,
|
|
352
|
+
latency: Math.floor(Math.random() * 400 + 200),
|
|
353
|
+
cost: (Math.random() * 0.002).toFixed(6),
|
|
354
|
+
}));
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const latency = Date.now() - startTime;
|
|
358
|
+
const cost = usedRealProvider
|
|
359
|
+
? estimateCost(model, content)
|
|
360
|
+
: "0.000001";
|
|
361
|
+
|
|
362
|
+
res.json({
|
|
363
|
+
result: content,
|
|
364
|
+
provider,
|
|
365
|
+
model,
|
|
366
|
+
mode: isEnsemble ? "ensemble" : "single",
|
|
367
|
+
latency,
|
|
368
|
+
cost,
|
|
369
|
+
usedMock: !usedRealProvider,
|
|
370
|
+
features,
|
|
371
|
+
routing,
|
|
372
|
+
responses,
|
|
373
|
+
hasRealKeys,
|
|
374
|
+
});
|
|
375
|
+
} catch (err) {
|
|
376
|
+
console.error("[demo] Route error:", err);
|
|
377
|
+
res.status(500).json({
|
|
378
|
+
error: err.message,
|
|
379
|
+
result: "A3M Router encountered an error processing your query.",
|
|
380
|
+
provider: "A3M Router",
|
|
381
|
+
model: "error",
|
|
382
|
+
latency: Date.now() - startTime,
|
|
383
|
+
cost: "0",
|
|
384
|
+
usedMock: true,
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
// ── Serve index.html for all other routes ──────────────
|
|
390
|
+
app.get("*", (req, res) => {
|
|
391
|
+
res.sendFile(path.join(__dirname, "public", "index.html"));
|
|
392
|
+
});
|
|
393
|
+
|
|
394
|
+
// ── Start ──────────────────────────────────────────────
|
|
395
|
+
const PORT = process.env.PORT || 3000;
|
|
396
|
+
app.listen(PORT, () => {
|
|
397
|
+
console.log(`
|
|
398
|
+
A3M Router Demo Server
|
|
399
|
+
─────────────────────────
|
|
400
|
+
Running: http://localhost:${PORT}
|
|
401
|
+
API Key: ${process.env.OPENAI_API_KEY ? "Yes" : "No (mock mode)"}
|
|
402
|
+
Providers: ${a3m ? "A3M SDK loaded" : "A3M SDK not available"}
|
|
403
|
+
Mode: ${process.env.OPENAI_API_KEY || process.env.GROQ_API_KEY ? "Live" : "Demo (mock responses)"}
|
|
404
|
+
`);
|
|
405
|
+
});
|
package/demo-new.tape
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# VHS documentation
|
|
2
|
+
#
|
|
3
|
+
# Output:
|
|
4
|
+
# Output <path>.gif Create a GIF output at the given <path>
|
|
5
|
+
# Output <path>.mp4 Create an MP4 output at the given <path>
|
|
6
|
+
# Output <path>.webm Create a WebM output at the given <path>
|
|
7
|
+
#
|
|
8
|
+
# Require:
|
|
9
|
+
# Require <string> Ensure a program is on the $PATH to proceed
|
|
10
|
+
#
|
|
11
|
+
# Settings:
|
|
12
|
+
# Set FontSize <number> Set the font size of the terminal
|
|
13
|
+
# Set FontFamily <string> Set the font family of the terminal
|
|
14
|
+
# Set Height <number> Set the height of the terminal
|
|
15
|
+
# Set Width <number> Set the width of the terminal
|
|
16
|
+
# Set LetterSpacing <float> Set the font letter spacing (tracking)
|
|
17
|
+
# Set LineHeight <float> Set the font line height
|
|
18
|
+
# Set LoopOffset <float>% Set the starting frame offset for the GIF loop
|
|
19
|
+
# Set Theme <json|string> Set the theme of the terminal
|
|
20
|
+
# Set Padding <number> Set the padding of the terminal
|
|
21
|
+
# Set Framerate <number> Set the framerate of the recording
|
|
22
|
+
# Set PlaybackSpeed <float> Set the playback speed of the recording
|
|
23
|
+
# Set MarginFill <file|#000000> Set the file or color the margin will be filled with.
|
|
24
|
+
# Set Margin <number> Set the size of the margin. Has no effect if MarginFill isn't set.
|
|
25
|
+
# Set BorderRadius <number> Set terminal border radius, in pixels.
|
|
26
|
+
# Set WindowBar <string> Set window bar type. (one of: Rings, RingsRight, Colorful, ColorfulRight)
|
|
27
|
+
# Set WindowBarSize <number> Set window bar size, in pixels. Default is 40.
|
|
28
|
+
# Set TypingSpeed <time> Set the typing speed of the terminal. Default is 50ms.
|
|
29
|
+
#
|
|
30
|
+
# Sleep:
|
|
31
|
+
# Sleep <time> Sleep for a set amount of <time> in seconds
|
|
32
|
+
#
|
|
33
|
+
# Type:
|
|
34
|
+
# Type[@<time>] "<characters>" Type <characters> into the terminal with a
|
|
35
|
+
# <time> delay between each character
|
|
36
|
+
#
|
|
37
|
+
# Keys:
|
|
38
|
+
# Escape[@<time>] [number] Press the Escape key
|
|
39
|
+
# Backspace[@<time>] [number] Press the Backspace key
|
|
40
|
+
# Delete[@<time>] [number] Press the Delete key
|
|
41
|
+
# Insert[@<time>] [number] Press the Insert key
|
|
42
|
+
# Down[@<time>] [number] Press the Down key
|
|
43
|
+
# Enter[@<time>] [number] Press the Enter key
|
|
44
|
+
# Space[@<time>] [number] Press the Space key
|
|
45
|
+
# Tab[@<time>] [number] Press the Tab key
|
|
46
|
+
# Left[@<time>] [number] Press the Left Arrow key
|
|
47
|
+
# Right[@<time>] [number] Press the Right Arrow key
|
|
48
|
+
# Up[@<time>] [number] Press the Up Arrow key
|
|
49
|
+
# Down[@<time>] [number] Press the Down Arrow key
|
|
50
|
+
# PageUp[@<time>] [number] Press the Page Up key
|
|
51
|
+
# PageDown[@<time>] [number] Press the Page Down key
|
|
52
|
+
# Ctrl+<key> Press the Control key + <key> (e.g. Ctrl+C)
|
|
53
|
+
#
|
|
54
|
+
# Display:
|
|
55
|
+
# Hide Hide the subsequent commands from the output
|
|
56
|
+
# Show Show the subsequent commands in the output
|
|
57
|
+
# ScrollUp[@<time>] [number] Scroll terminal viewport up by rows
|
|
58
|
+
# ScrollDown[@<time>] [number] Scroll terminal viewport down by rows
|
|
59
|
+
|
|
60
|
+
Output demo-new.gif
|
|
61
|
+
|
|
62
|
+
Require echo
|
|
63
|
+
|
|
64
|
+
Set Shell "bash"
|
|
65
|
+
Set FontSize 32
|
|
66
|
+
Set Width 1200
|
|
67
|
+
Set Height 600
|
|
68
|
+
|
|
69
|
+
Type "echo 'Welcome to VHS!'" Sleep 500ms Enter
|
|
70
|
+
|
|
71
|
+
Sleep 5s
|