adaptive-memory-multi-model-router 2.11.0 → 2.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/.github/workflows/ci.yml +56 -0
  2. package/.github/workflows/pages.yml +37 -0
  3. package/Awesome-LLM/LICENSE.md +121 -0
  4. package/Awesome-LLM/README.md +625 -0
  5. package/Awesome-LLM/contributing.md +24 -0
  6. package/Awesome-LLM/paper_list/RLHF.md +1 -0
  7. package/Awesome-LLM/paper_list/Retrieval_Augmented_Generation.md +6 -0
  8. package/Awesome-LLM/paper_list/acceleration.md +10 -0
  9. package/Awesome-LLM/paper_list/alignment.md +20 -0
  10. package/Awesome-LLM/paper_list/application.md +19 -0
  11. package/Awesome-LLM/paper_list/augmentation.md +14 -0
  12. package/Awesome-LLM/paper_list/chain_of_thougt.md +16 -0
  13. package/Awesome-LLM/paper_list/code_pretraining.md +0 -0
  14. package/Awesome-LLM/paper_list/detection.md +11 -0
  15. package/Awesome-LLM/paper_list/evaluation.md +64 -0
  16. package/Awesome-LLM/paper_list/in_context_learning.md +4 -0
  17. package/Awesome-LLM/paper_list/instruction-tuning.md +35 -0
  18. package/Awesome-LLM/paper_list/moe.md +0 -0
  19. package/Awesome-LLM/paper_list/prompt_learning.md +15 -0
  20. package/Awesome-LLM/resources/DeepSpeed_light.svg +27 -0
  21. package/Awesome-LLM/resources/alpa-logo-cropped.png +0 -0
  22. package/Awesome-LLM/resources/colossal-ai_logo_vertical.png +0 -0
  23. package/Awesome-LLM/resources/creepy_llm.jpeg +0 -0
  24. package/Awesome-LLM/resources/image8.gif +0 -0
  25. package/Awesome-LLM/resources/jax_logo_250px.png +0 -0
  26. package/Awesome-LLM/resources/logo.png +0 -0
  27. package/Awesome-LLM/resources/nvidia.png +0 -0
  28. package/Awesome-LLM/resources/tensorflow.png +0 -0
  29. package/Awesome-LLM/resources//345/244/247/345/236/213/350/257/255/350/250/200/346/250/241/345/236/213/347/232/204/350/203/275/345/212/233/345/210/206/346/236/220/344/270/216/345/272/224/347/224/250 - 30min.pdf +0 -0
  30. package/LANDING.md +46 -0
  31. package/MANIFESTO.md +54 -0
  32. package/README.md +3 -3
  33. package/SUBMISSIONS.md +43 -0
  34. package/assets/chart-cost-v2.svg +91 -0
  35. package/assets/chart-cost-v3.svg +143 -0
  36. package/assets/chart-features-v2.svg +132 -0
  37. package/assets/chart-features-v3.svg +211 -0
  38. package/assets/chart-growth-v2.svg +122 -0
  39. package/assets/chart-growth-v3.svg +189 -0
  40. package/assets/cost-simple.svg +64 -0
  41. package/assets/growth-simple.svg +69 -0
  42. package/assets/hero-diagram.svg +81 -0
  43. package/assets/logo-new.svg +21 -0
  44. package/assets/social-preview-new.svg +100 -0
  45. package/assets/social-v2.svg +130 -0
  46. package/assets/social-v3.svg +212 -0
  47. package/awesome-ai-gateways/CONTRIBUTING.md +49 -0
  48. package/awesome-ai-gateways/LICENSE +3 -0
  49. package/awesome-ai-gateways/README.md +190 -0
  50. package/awesome-selfhosted/.github/ISSUE_TEMPLATE/config.yml +5 -0
  51. package/awesome-selfhosted/.github/PULL_REQUEST_TEMPLATE.md +1 -0
  52. package/awesome-selfhosted/LICENSE +376 -0
  53. package/awesome-selfhosted/README.md +2303 -0
  54. package/awesome-selfhosted/_static/awesome.png +0 -0
  55. package/awesome-selfhosted/non-free.md +377 -0
  56. package/demo-new.tape +71 -0
  57. package/demo-real.sh +198 -0
  58. package/demo-simple.tape +205 -0
  59. package/demo.html +520 -0
  60. package/demo.sh +85 -0
  61. package/demo.tape +259 -0
  62. package/dist/cli/setupWizard.js +194 -0
  63. package/dist/cli/tui.js +152 -0
  64. package/dist/cli.js +9 -2
  65. package/dist/routing/providerRetry.d.ts +5 -0
  66. package/dist/routing/providerRetry.js +37 -0
  67. package/dist/routing/providerRetry.js.map +1 -1
  68. package/docs/CHINESE_PROVIDER_RELIABILITY.md +37 -0
  69. package/docs/CLAIMS_AND_EVIDENCE.md +58 -0
  70. package/docs/ENGINEERING_SPEC.md +55 -0
  71. package/docs/RELEASE_CHECKLIST.md +32 -0
  72. package/docs/REPRODUCIBILITY.md +63 -0
  73. package/docs/demo-auto.html +264 -0
  74. package/docs/demo.html +416 -0
  75. package/docs/index.html +112 -599
  76. package/eval/README.md +46 -0
  77. package/eval/baselines/main.json +12 -0
  78. package/eval/benchmark_dataset.jsonl +16 -0
  79. package/eval/check_golden_routes.js +64 -0
  80. package/eval/datasets/catalog.json +33 -0
  81. package/eval/datasets/slices/cn_provider_reliability_v1.jsonl +3 -0
  82. package/eval/datasets/slices/cost_pressure_v1.jsonl +3 -0
  83. package/eval/datasets/slices/safety_guardrails_v1.jsonl +3 -0
  84. package/eval/fault_injection_thresholds.json +3 -0
  85. package/eval/generate_report.js +128 -0
  86. package/eval/golden_routes.json +114 -0
  87. package/eval/lib/experiment_registry.js +24 -0
  88. package/eval/run_eval.js +197 -0
  89. package/eval/run_fault_injection.js +201 -0
  90. package/eval/run_shadow_eval.js +85 -0
  91. package/eval/thresholds.json +9 -0
  92. package/index.html +667 -0
  93. package/package.json +29 -168
  94. package/pytest.ini +2 -0
  95. package/src/cli/setupWizard.ts +194 -0
  96. package/src/routing/providerRetry.ts +41 -1
  97. package/docs/assets/cost-comparison.svg +0 -134
  98. package/docs/assets/growth-chart-animated.svg +0 -76
  99. package/docs/assets/og-banner.svg +0 -194
  100. package/docs/assets/social-preview.svg +0 -194
  101. package/python/a3m/__pycache__/__init__.cpython-312.pyc +0 -0
  102. package/python/a3m/__pycache__/client.cpython-312.pyc +0 -0
  103. package/python/a3m/__pycache__/models.cpython-312.pyc +0 -0
  104. package/python/a3m/__pycache__/sync_client.cpython-312.pyc +0 -0
@@ -0,0 +1,143 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 450" width="700" height="450">
2
+ <defs>
3
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#0a0a0f"/>
5
+ <stop offset="50%" stop-color="#12121a"/>
6
+ <stop offset="100%" stop-color="#1a1a2e"/>
7
+ </linearGradient>
8
+
9
+ <!-- GPT-4 gradient -->
10
+ <linearGradient id="gpt4Grad" x1="0%" y1="0%" x2="0%" y2="100%">
11
+ <stop offset="0%" stop-color="#3b82f6"/>
12
+ <stop offset="100%" stop-color="#1d4ed8"/>
13
+ </linearGradient>
14
+
15
+ <!-- A3M gradient with shimmer -->
16
+ <linearGradient id="a3mGrad" x1="0%" y1="0%" x2="0%" y2="100%">
17
+ <stop offset="0%" stop-color="#10b981">
18
+ <animate attributeName="stop-color" values="#10b981;#34d399;#10b981" dur="3s" repeatCount="indefinite"/>
19
+ </stop>
20
+ <stop offset="100%" stop-color="#059669"/>
21
+ </linearGradient>
22
+
23
+ <!-- Savings badge gradient -->
24
+ <linearGradient id="savingsGrad" x1="0%" y1="0%" x2="100%" y2="0%">
25
+ <stop offset="0%" stop-color="#10b981"/>
26
+ <stop offset="100%" stop-color="#06b6d4"/>
27
+ </linearGradient>
28
+
29
+ <!-- Glow filter -->
30
+ <filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
31
+ <feGaussianBlur stdDeviation="5" result="blur"/>
32
+ <feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
33
+ </filter>
34
+
35
+ <!-- Bar glow -->
36
+ <filter id="barGlow" x="-20%" y="-20%" width="140%" height="140%">
37
+ <feGaussianBlur stdDeviation="3" result="blur"/>
38
+ <feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
39
+ </filter>
40
+
41
+ <!-- Grid pattern -->
42
+ <pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
43
+ <path d="M 40 0 L 0 0 0 40" fill="none" stroke="#ffffff" stroke-width="0.5" opacity="0.04"/>
44
+ </pattern>
45
+ </defs>
46
+
47
+ <style>
48
+ @keyframes fadeIn { from { opacity: 0; transform: translateY(15px); } to { opacity: 1; transform: translateY(0); } }
49
+ @keyframes slideUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } }
50
+ @keyframes pulse { 0%, 100% { box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.4); } 50% { box-shadow: 0 0 20px 5px rgba(16, 185, 129, 0.2); } }
51
+ @keyframes countUp { from { opacity: 0; } to { opacity: 1; } }
52
+ .title { animation: fadeIn 0.6s ease-out; }
53
+ .bar-group { animation: slideUp 0.8s ease-out; animation-fill-mode: both; }
54
+ .gpt4-bar { animation: slideUp 0.8s ease-out 0.1s both; }
55
+ .a3m-bar { animation: slideUp 0.8s ease-out 0.3s both; }
56
+ .savings { animation: slideUp 0.8s ease-out 0.5s both; }
57
+ </style>
58
+
59
+ <!-- Background -->
60
+ <rect width="700" height="450" fill="url(#bg)"/>
61
+ <rect width="700" height="450" fill="url(#grid)"/>
62
+
63
+ <!-- Ambient glow -->
64
+ <ellipse cx="350" cy="225" rx="300" ry="200" fill="#3b82f6" opacity="0.03" filter="url(#glow)"/>
65
+ <ellipse cx="350" cy="300" rx="200" ry="100" fill="#10b981" opacity="0.05" filter="url(#glow)"/>
66
+
67
+ <!-- Header -->
68
+ <g class="title">
69
+ <text x="350" y="42" text-anchor="middle" fill="#ffffff" font-family="system-ui,-apple-system,sans-serif" font-size="26" font-weight="700">
70
+ Cost Comparison
71
+ </text>
72
+ <text x="350" y="65" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="13">
73
+ 100 mixed queries • Code, math, creative, translation
74
+ </text>
75
+ </g>
76
+
77
+ <!-- Chart area -->
78
+ <g transform="translate(80, 100)">
79
+ <!-- Y-axis labels -->
80
+ <g fill="#666688" font-family="system-ui,sans-serif" font-size="12" text-anchor="end">
81
+ <text x="55" y="255">$0</text>
82
+ <text x="55" y="195">$5</text>
83
+ <text x="55" y="135">$10</text>
84
+ <text x="55" y="75">$15</text>
85
+ <text x="55" y="40">$20</text>
86
+ </g>
87
+
88
+ <!-- Y-axis grid -->
89
+ <g stroke="#ffffff" stroke-opacity="0.06" stroke-dasharray="4,4">
90
+ <line x1="70" y1="190" x2="540" y2="190"/>
91
+ <line x1="70" y1="130" x2="540" y2="130"/>
92
+ <line x1="70" y1="70" x2="540" y2="70"/>
93
+ </g>
94
+
95
+ <!-- Axes -->
96
+ <line x1="70" y1="250" x2="540" y2="250" stroke="#444466" stroke-width="2"/>
97
+ <line x1="70" y1="30" x2="70" y2="250" stroke="#444466" stroke-width="2"/>
98
+
99
+ <!-- GPT-4 Bar with glow -->
100
+ <g class="gpt4-bar" filter="url(#barGlow)">
101
+ <rect x="130" y="65" width="110" height="185" rx="8" fill="url(#gpt4Grad)" class="bar">
102
+ <animate attributeName="height" values="0;185;185" dur="1s" ease-out" fill="freeze"/>
103
+ <animate attributeName="y" values="250;65;65" dur="1s" ease-out" fill="freeze"/>
104
+ </rect>
105
+ <!-- Shine effect -->
106
+ <rect x="130" y="65" width="55" height="185" rx="8" fill="#ffffff" fill-opacity="0.1"/>
107
+ </g>
108
+ <text x="185" y="50" text-anchor="middle" fill="#60a5fa" font-family="system-ui,sans-serif" font-size="18" font-weight="700">$15.00</text>
109
+ <text x="185" y="275" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="15" font-weight="600">GPT-4</text>
110
+ <text x="185" y="292" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="11">$0.15/1K tokens</text>
111
+
112
+ <!-- A3M Bar with glow -->
113
+ <g class="a3m-bar" filter="url(#barGlow)">
114
+ <rect x="380" y="200" width="110" height="50" rx="8" fill="url(#a3mGrad)" class="bar">
115
+ <animate attributeName="height" values="0;50;50" dur="1s" ease-out" fill="freeze"/>
116
+ <animate attributeName="y" values="250;200;200" dur="1s" ease-out" fill="freeze"/>
117
+ </rect>
118
+ <!-- Shine effect -->
119
+ <rect x="380" y="200" width="55" height="50" rx="8" fill="#ffffff" fill-opacity="0.15"/>
120
+ </g>
121
+ <text x="435" y="185" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="18" font-weight="700">$5.75</text>
122
+ <text x="435" y="275" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="15" font-weight="600">A3M Router</text>
123
+ <text x="435" y="292" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="11">auto-routed</text>
124
+
125
+ <!-- Savings badge -->
126
+ <g class="savings">
127
+ <rect x="230" y="115" width="160" height="65" rx="32" fill="url(#savingsGrad)" fill-opacity="0.15" stroke="url(#savingsGrad)" stroke-width="1.5" filter="url(#glow)"/>
128
+ <text x="310" y="145" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="26" font-weight="800">-62%</text>
129
+ <text x="310" y="168" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="12">savings per query</text>
130
+ </g>
131
+
132
+ <!-- Connection lines -->
133
+ <path d="M185,130 L260,148" stroke="#10b981" stroke-width="1.5" stroke-dasharray="4,4" fill="none" opacity="0.6"/>
134
+ <path d="M435,175 L390,148" stroke="#10b981" stroke-width="1.5" stroke-dasharray="4,4" fill="none" opacity="0.6"/>
135
+ </g>
136
+
137
+ <!-- Bottom info -->
138
+ <g transform="translate(0, 400)">
139
+ <text x="350" y="20" text-anchor="middle" fill="#555577" font-family="system-ui,sans-serif" font-size="11">
140
+ Based on actual benchmark • May 2026 • Real provider pricing
141
+ </text>
142
+ </g>
143
+ </svg>
@@ -0,0 +1,132 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 500" width="800" height="500">
2
+ <defs>
3
+ <linearGradient id="bgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
4
+ <stop offset="0%" stop-color="#0a0f1c"/>
5
+ <stop offset="100%" stop-color="#111827"/>
6
+ </linearGradient>
7
+ <linearGradient id="headerGrad" x1="0%" y1="0%" x2="100%" y2="0%">
8
+ <stop offset="0%" stop-color="#6366f1"/>
9
+ <stop offset="100%" stop-color="#06b6d4"/>
10
+ </linearGradient>
11
+ <linearGradient id="a3mGrad" x1="0%" y1="0%" x2="0%" y2="100%">
12
+ <stop offset="0%" stop-color="#10b981"/>
13
+ <stop offset="100%" stop-color="#059669"/>
14
+ </linearGradient>
15
+
16
+ <!-- Glow filter -->
17
+ <filter id="cellGlow" x="-10%" y="-10%" width="120%" height="120%">
18
+ <feGaussianBlur stdDeviation="2" result="blur"/>
19
+ <feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
20
+ </filter>
21
+
22
+ <!-- Grid pattern -->
23
+ <pattern id="gridPattern" width="40" height="40" patternUnits="userSpaceOnUse">
24
+ <path d="M 40 0 L 0 0 0 40" fill="none" stroke="#1f2937" stroke-width="0.5" opacity="0.3"/>
25
+ </pattern>
26
+ </defs>
27
+
28
+ <!-- Background -->
29
+ <rect width="800" height="500" fill="url(#bgGrad)"/>
30
+ <rect width="800" height="500" fill="url(#gridPattern)"/>
31
+
32
+ <!-- Header -->
33
+ <text x="400" y="38" text-anchor="middle" fill="#f9fafb" font-family="system-ui,-apple-system,sans-serif" font-size="22" font-weight="700">A3M Router Capabilities</text>
34
+ <text x="400" y="60" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="13">Production-ready features for intelligent LLM routing</text>
35
+
36
+ <!-- Table -->
37
+ <g transform="translate(80, 90)">
38
+ <!-- Header row -->
39
+ <rect x="0" y="0" width="640" height="45" rx="8" fill="url(#headerGrad)" fill-opacity="0.15"/>
40
+ <text x="320" y="28" text-anchor="middle" fill="#f9fafb" font-family="system-ui,sans-serif" font-size="14" font-weight="700">Feature</text>
41
+ <text x="540" y="28" text-anchor="middle" fill="#f9fafb" font-family="system-ui,sans-serif" font-size="14" font-weight="700">A3M Router</text>
42
+ <text x="620" y="28" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="14" font-weight="700">Others</text>
43
+
44
+ <!-- Divider -->
45
+ <line x1="0" y1="45" x2="640" y2="45" stroke="#374151" stroke-width="1"/>
46
+
47
+ <!-- Feature rows -->
48
+ <!-- Row 1 -->
49
+ <g transform="translate(0, 55)">
50
+ <text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Routing Accuracy</text>
51
+ <g transform="translate(500)">
52
+ <rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
53
+ <text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">100%</text>
54
+ </g>
55
+ <text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">~85%</text>
56
+ </g>
57
+
58
+ <!-- Row 2 -->
59
+ <g transform="translate(0, 100)">
60
+ <text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Cost Savings</text>
61
+ <g transform="translate(500)">
62
+ <rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
63
+ <text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">62%</text>
64
+ </g>
65
+ <text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">None</text>
66
+ </g>
67
+
68
+ <!-- Row 3 -->
69
+ <g transform="translate(0, 145)">
70
+ <text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Zero ML / No GPU</text>
71
+ <g transform="translate(500)">
72
+ <rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
73
+ <text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">✓</text>
74
+ </g>
75
+ <text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">✗</text>
76
+ </g>
77
+
78
+ <!-- Row 4 -->
79
+ <g transform="translate(0, 190)">
80
+ <text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Provider Failover</text>
81
+ <g transform="translate(500)">
82
+ <rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
83
+ <text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">Auto</text>
84
+ </g>
85
+ <text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">Manual</text>
86
+ </g>
87
+
88
+ <!-- Row 5 -->
89
+ <g transform="translate(0, 235)">
90
+ <text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Budget Enforcement</text>
91
+ <g transform="translate(500)">
92
+ <rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
93
+ <text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">Hard</text>
94
+ </g>
95
+ <text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">Soft</text>
96
+ </g>
97
+
98
+ <!-- Row 6 -->
99
+ <g transform="translate(0, 280)">
100
+ <text x="20" y="22" fill="#d1d5db" font-family="system-ui,sans-serif" font-size="13">Chinese Providers</text>
101
+ <g transform="translate(500)">
102
+ <rect x="0" y="5" width="80" height="28" rx="14" fill="url(#a3mGrad)" filter="url(#cellGlow)"/>
103
+ <text x="40" y="25" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="12" font-weight="600">47+</text>
104
+ </g>
105
+ <text x="620" y="25" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">5-10</text>
106
+ </g>
107
+ </g>
108
+
109
+ <!-- Bottom metrics row -->
110
+ <g transform="translate(80, 420)">
111
+ <g transform="translate(0, 0)">
112
+ <rect x="0" y="0" width="145" height="60" rx="10" fill="#10b981" fill-opacity="0.1" stroke="#10b981" stroke-width="1"/>
113
+ <text x="72" y="28" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="22" font-weight="800">100%</text>
114
+ <text x="72" y="48" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="11">Routing Accuracy</text>
115
+ </g>
116
+ <g transform="translate(165, 0)">
117
+ <rect x="0" y="0" width="145" height="60" rx="10" fill="#06b6d4" fill-opacity="0.1" stroke="#06b6d4" stroke-width="1"/>
118
+ <text x="72" y="28" text-anchor="middle" fill="#06b6d4" font-family="system-ui,sans-serif" font-size="22" font-weight="800">19.5KB</text>
119
+ <text x="72" y="48" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="11">Package Size</text>
120
+ </g>
121
+ <g transform="translate(330, 0)">
122
+ <rect x="0" y="0" width="145" height="60" rx="10" fill="#8b5cf6" fill-opacity="0.1" stroke="#8b5cf6" stroke-width="1"/>
123
+ <text x="72" y="28" text-anchor="middle" fill="#8b5cf6" font-family="system-ui,sans-serif" font-size="22" font-weight="800">&lt;100ms</text>
124
+ <text x="72" y="48" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="11">Startup Time</text>
125
+ </g>
126
+ <g transform="translate(495, 0)">
127
+ <rect x="0" y="0" width="145" height="60" rx="10" fill="#f472b6" fill-opacity="0.1" stroke="#f472b6" stroke-width="1"/>
128
+ <text x="72" y="28" text-anchor="middle" fill="#f472b6" font-family="system-ui,sans-serif" font-size="22" font-weight="800">MIT</text>
129
+ <text x="72" y="48" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="11">License</text>
130
+ </g>
131
+ </g>
132
+ </svg>
@@ -0,0 +1,211 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 550" width="900" height="550">
2
+ <defs>
3
+ <!-- Background gradient -->
4
+ <linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
5
+ <stop offset="0%" stop-color="#0a0a0f"/>
6
+ <stop offset="50%" stop-color="#0f0f1a"/>
7
+ <stop offset="100%" stop-color="#1a1a2e"/>
8
+ </linearGradient>
9
+
10
+ <!-- Header gradient -->
11
+ <linearGradient id="headerGrad" x1="0%" y1="0%" x2="100%" y2="0%">
12
+ <stop offset="0%" stop-color="#6366f1"/>
13
+ <stop offset="50%" stop-color="#8b5cf6"/>
14
+ <stop offset="100%" stop-color="#06b6d4"/>
15
+ </linearGradient>
16
+
17
+ <!-- Success badge gradient -->
18
+ <linearGradient id="successGrad" x1="0%" y1="0%" x2="0%" y2="100%">
19
+ <stop offset="0%" stop-color="#10b981">
20
+ <animate attributeName="stop-color" values="#10b981;#34d399;#10b981" dur="2s" repeatCount="indefinite"/>
21
+ </stop>
22
+ <stop offset="100%" stop-color="#059669"/>
23
+ </linearGradient>
24
+
25
+ <!-- Warning gradient -->
26
+ <linearGradient id="warnGrad" x1="0%" y1="0%" x2="0%" y2="100%">
27
+ <stop offset="0%" stop-color="#f59e0b"/>
28
+ <stop offset="100%" stop-color="#d97706"/>
29
+ </linearGradient>
30
+
31
+ <!-- Glow filter -->
32
+ <filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
33
+ <feGaussianBlur stdDeviation="4" result="blur"/>
34
+ <feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
35
+ </filter>
36
+
37
+ <!-- Intense glow -->
38
+ <filter id="glowIntense" x="-100%" y="-100%" width="300%" height="300%">
39
+ <feGaussianBlur stdDeviation="6" result="blur"/>
40
+ <feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
41
+ </filter>
42
+
43
+ <!-- Grid pattern -->
44
+ <pattern id="grid" width="40" height="40" patternUnits="userSpaceOnUse">
45
+ <path d="M 40 0 L 0 0 0 40" fill="none" stroke="#ffffff" stroke-width="0.5" opacity="0.03"/>
46
+ </pattern>
47
+ </defs>
48
+
49
+ <style>
50
+ @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
51
+ @keyframes slideIn { from { opacity: 0; transform: translateX(-20px); } to { opacity: 1; transform: translateX(0); } }
52
+ @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.05); } }
53
+ @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } }
54
+ .header { animation: fadeIn 0.5s ease-out; }
55
+ .row { animation: fadeIn 0.4s ease-out; animation-fill-mode: both; }
56
+ .row:nth-child(1) { animation-delay: 0.1s; }
57
+ .row:nth-child(2) { animation-delay: 0.15s; }
58
+ .row:nth-child(3) { animation-delay: 0.2s; }
59
+ .row:nth-child(4) { animation-delay: 0.25s; }
60
+ .row:nth-child(5) { animation-delay: 0.3s; }
61
+ .row:nth-child(6) { animation-delay: 0.35s; }
62
+ .row:nth-child(7) { animation-delay: 0.4s; }
63
+ .check { animation: pulse 2s ease-in-out infinite; }
64
+ .metric { animation: fadeIn 0.6s ease-out; animation-fill-mode: both; }
65
+ .metric:nth-child(1) { animation-delay: 0.5s; }
66
+ .metric:nth-child(2) { animation-delay: 0.6s; }
67
+ .metric:nth-child(3) { animation-delay: 0.7s; }
68
+ .metric:nth-child(4) { animation-delay: 0.8s; }
69
+ </style>
70
+
71
+ <!-- Background -->
72
+ <rect width="900" height="550" fill="url(#bg)"/>
73
+ <rect width="900" height="550" fill="url(#grid)"/>
74
+
75
+ <!-- Ambient glow -->
76
+ <ellipse cx="450" cy="275" rx="400" ry="250" fill="#6366f1" opacity="0.04" filter="url(#glow)"/>
77
+
78
+ <!-- Header -->
79
+ <g class="header">
80
+ <text x="450" y="42" text-anchor="middle" fill="#ffffff" font-family="system-ui,-apple-system,sans-serif" font-size="26" font-weight="700">
81
+ A3M Router Capabilities
82
+ </text>
83
+ <text x="450" y="65" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="13">
84
+ Production-ready features • Open-source LLM gateway
85
+ </text>
86
+ </g>
87
+
88
+ <!-- Comparison Table -->
89
+ <g transform="translate(80, 100)">
90
+ <!-- Table Header -->
91
+ <rect x="0" y="0" width="740" height="45" rx="8" fill="url(#headerGrad)" fill-opacity="0.15"/>
92
+ <text x="200" y="28" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">Feature</text>
93
+ <text x="450" y="28" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="14" font-weight="700">A3M Router</text>
94
+ <text x="650" y="28" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="14" font-weight="700">Others</text>
95
+
96
+ <!-- Row 1 -->
97
+ <g class="row" transform="translate(0, 55)">
98
+ <rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
99
+ <text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Routing Accuracy</text>
100
+ <g transform="translate(350)">
101
+ <rect x="0" y="8" width="90" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
102
+ <text x="45" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">100%</text>
103
+ </g>
104
+ <text x="650" y="30" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="14">~85%</text>
105
+ <!-- Checkmark -->
106
+ <g transform="translate(290, 12)" class="check">
107
+ <circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
108
+ <path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
109
+ </g>
110
+ </g>
111
+
112
+ <!-- Row 2 -->
113
+ <g class="row" transform="translate(0, 110)">
114
+ <rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
115
+ <text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Cost Savings</text>
116
+ <g transform="translate(350)">
117
+ <rect x="0" y="8" width="80" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
118
+ <text x="40" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">62%</text>
119
+ </g>
120
+ <text x="650" y="30" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="14">None</text>
121
+ <g transform="translate(290, 12)" class="check">
122
+ <circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
123
+ <path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
124
+ </g>
125
+ </g>
126
+
127
+ <!-- Row 3 -->
128
+ <g class="row" transform="translate(0, 165)">
129
+ <rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
130
+ <text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Zero ML / No GPU Required</text>
131
+ <g transform="translate(350)">
132
+ <rect x="0" y="8" width="70" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
133
+ <text x="35" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">✓</text>
134
+ </g>
135
+ <text x="650" y="30" text-anchor="middle" fill="#f59e0b" font-family="system-ui,sans-serif" font-size="14">✗</text>
136
+ <g transform="translate(290, 12)" class="check">
137
+ <circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
138
+ <path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
139
+ </g>
140
+ </g>
141
+
142
+ <!-- Row 4 -->
143
+ <g class="row" transform="translate(0, 220)">
144
+ <rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
145
+ <text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Automatic Provider Failover</text>
146
+ <g transform="translate(350)">
147
+ <rect x="0" y="8" width="70" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
148
+ <text x="35" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">Auto</text>
149
+ </g>
150
+ <text x="650" y="30" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="14">Manual</text>
151
+ <g transform="translate(290, 12)" class="check">
152
+ <circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
153
+ <path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
154
+ </g>
155
+ </g>
156
+
157
+ <!-- Row 5 -->
158
+ <g class="row" transform="translate(0, 275)">
159
+ <rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
160
+ <text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Hard Budget Enforcement</text>
161
+ <g transform="translate(350)">
162
+ <rect x="0" y="8" width="70" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
163
+ <text x="35" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">✓</text>
164
+ </g>
165
+ <text x="650" y="30" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="14">Soft</text>
166
+ <g transform="translate(290, 12)" class="check">
167
+ <circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
168
+ <path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
169
+ </g>
170
+ </g>
171
+
172
+ <!-- Row 6 -->
173
+ <g class="row" transform="translate(0, 330)">
174
+ <rect x="0" y="0" width="740" height="50" rx="6" fill="#ffffff" fill-opacity="0.02"/>
175
+ <text x="30" y="30" fill="#ccccdd" font-family="system-ui,sans-serif" font-size="14">Chinese Providers (Kimi, DeepSeek, Qwen)</text>
176
+ <g transform="translate(350)">
177
+ <rect x="0" y="8" width="70" height="32" rx="16" fill="url(#successGrad)" filter="url(#glow)"/>
178
+ <text x="35" y="30" text-anchor="middle" fill="#ffffff" font-family="system-ui,sans-serif" font-size="14" font-weight="700">47+</text>
179
+ </g>
180
+ <text x="650" y="30" text-anchor="middle" fill="#666688" font-family="system-ui,sans-serif" font-size="14">5-10</text>
181
+ <g transform="translate(290, 12)" class="check">
182
+ <circle cx="12" cy="12" r="14" fill="#10b981" fill-opacity="0.2"/>
183
+ <path d="M6,12 L10,16 L18,8" stroke="#10b981" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"/>
184
+ </g>
185
+ </g>
186
+ </g>
187
+
188
+ <!-- Bottom metrics row -->
189
+ <g transform="translate(80, 490)">
190
+ <g class="metric">
191
+ <rect x="0" y="0" width="155" height="50" rx="10" fill="#10b981" fill-opacity="0.1" stroke="#10b981" stroke-width="1" filter="url(#glow)"/>
192
+ <text x="77" y="28" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="22" font-weight="800">100%</text>
193
+ <text x="77" y="44" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="11">Accuracy</text>
194
+ </g>
195
+ <g class="metric">
196
+ <rect x="175" y="0" width="155" height="50" rx="10" fill="#06b6d4" fill-opacity="0.1" stroke="#06b6d4" stroke-width="1" filter="url(#glow)"/>
197
+ <text x="252" y="28" text-anchor="middle" fill="#06b6d4" font-family="system-ui,sans-serif" font-size="22" font-weight="800">19.5KB</text>
198
+ <text x="252" y="44" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="11">Package Size</text>
199
+ </g>
200
+ <g class="metric">
201
+ <rect x="350" y="0" width="155" height="50" rx="10" fill="#8b5cf6" fill-opacity="0.1" stroke="#8b5cf6" stroke-width="1" filter="url(#glow)"/>
202
+ <text x="427" y="28" text-anchor="middle" fill="#8b5cf6" font-family="system-ui,sans-serif" font-size="22" font-weight="800">&lt;100ms</text>
203
+ <text x="427" y="44" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="11">Startup Time</text>
204
+ </g>
205
+ <g class="metric">
206
+ <rect x="525" y="0" width="155" height="50" rx="10" fill="#f472b6" fill-opacity="0.1" stroke="#f472b6" stroke-width="1" filter="url(#glow)"/>
207
+ <text x="602" y="28" text-anchor="middle" fill="#f472b6" font-family="system-ui,sans-serif" font-size="22" font-weight="800">MIT</text>
208
+ <text x="602" y="44" text-anchor="middle" fill="#8888aa" font-family="system-ui,sans-serif" font-size="11">License</text>
209
+ </g>
210
+ </g>
211
+ </svg>
@@ -0,0 +1,122 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 400" width="800" height="400">
2
+ <defs>
3
+ <!-- Gradients -->
4
+ <linearGradient id="bgGrad" x1="0%" y1="0%" x2="100%" y2="100%">
5
+ <stop offset="0%" stop-color="#0a0f1c"/>
6
+ <stop offset="100%" stop-color="#111827"/>
7
+ </linearGradient>
8
+ <linearGradient id="lineGrad" x1="0%" y1="0%" x2="100%" y2="0%">
9
+ <stop offset="0%" stop-color="#6366f1"/>
10
+ <stop offset="33%" stop-color="#8b5cf6"/>
11
+ <stop offset="66%" stop-color="#06b6d4"/>
12
+ <stop offset="100%" stop-color="#10b981"/>
13
+ </linearGradient>
14
+ <linearGradient id="areaGrad" x1="0%" y1="0%" x2="0%" y2="100%">
15
+ <stop offset="0%" stop-color="#6366f1" stop-opacity="0.35"/>
16
+ <stop offset="50%" stop-color="#8b5cf6" stop-opacity="0.15"/>
17
+ <stop offset="100%" stop-color="#06b6d4" stop-opacity="0"/>
18
+ </linearGradient>
19
+ <linearGradient id="glowGrad" x1="0%" y1="0%" x2="100%" y2="0%">
20
+ <stop offset="0%" stop-color="#6366f1" stop-opacity="0.4"/>
21
+ <stop offset="100%" stop-color="#06b6d4" stop-opacity="0.1"/>
22
+ </linearGradient>
23
+
24
+ <!-- Filters -->
25
+ <filter id="softGlow" x="-50%" y="-50%" width="200%" height="200%">
26
+ <feGaussianBlur stdDeviation="4" result="blur"/>
27
+ <feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
28
+ </filter>
29
+ <filter id="lineGlow" x="-20%" y="-20%" width="140%" height="140%">
30
+ <feGaussianBlur stdDeviation="2" result="blur"/>
31
+ <feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
32
+ </filter>
33
+
34
+ <!-- Grid pattern -->
35
+ <pattern id="gridPattern" width="40" height="40" patternUnits="userSpaceOnUse">
36
+ <path d="M 40 0 L 0 0 0 40" fill="none" stroke="#1f2937" stroke-width="0.5" opacity="0.5"/>
37
+ </pattern>
38
+ </defs>
39
+
40
+ <!-- Background -->
41
+ <rect width="800" height="400" fill="url(#bgGrad)"/>
42
+ <rect width="800" height="400" fill="url(#gridPattern)"/>
43
+
44
+ <!-- Header -->
45
+ <text x="400" y="38" text-anchor="middle" fill="#f9fafb" font-family="system-ui,-apple-system,sans-serif" font-size="22" font-weight="700" letter-spacing="-0.5">Downloads Growth</text>
46
+ <text x="400" y="60" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="13">Last 4 weeks trajectory</text>
47
+
48
+ <!-- Chart area: x=80..750, y=90..330 -->
49
+
50
+ <!-- Y-axis labels -->
51
+ <g fill="#6b7280" font-family="system-ui,sans-serif" font-size="12" text-anchor="end">
52
+ <text x="65" y="330">0</text>
53
+ <text x="65" y="265">500</text>
54
+ <text x="65" y="200">1K</text>
55
+ <text x="65" y="135">1.5K</text>
56
+ <text x="65" y="100">2K</text>
57
+ </g>
58
+
59
+ <!-- Y-axis grid lines -->
60
+ <g stroke="#1f2937" stroke-width="1" stroke-dasharray="3,3">
61
+ <line x1="80" y1="330" x2="750" y2="330"/>
62
+ <line x1="80" y1="265" x2="750" y2="265"/>
63
+ <line x1="80" y1="200" x2="750" y2="200"/>
64
+ <line x1="80" y1="135" x2="750" y2="135"/>
65
+ <line x1="80" y1="100" x2="750" y2="100"/>
66
+ </g>
67
+
68
+ <!-- Axes -->
69
+ <line x1="80" y1="330" x2="750" y2="330" stroke="#374151" stroke-width="2"/>
70
+ <line x1="80" y1="100" x2="80" y2="330" stroke="#374151" stroke-width="2"/>
71
+
72
+ <!-- Area fill -->
73
+ <path d="M80,310 Q130,308 180,295 T280,260 T380,210 T480,155 T580,115 T680,95 T750,88 L750,330 L80,330 Z" fill="url(#areaGrad)"/>
74
+
75
+ <!-- Glow line behind -->
76
+ <path d="M80,310 Q130,308 180,295 T280,260 T380,210 T480,155 T580,115 T680,95 T750,88"
77
+ stroke="url(#lineGrad)" stroke-width="8" fill="none" stroke-linecap="round" opacity="0.3" filter="url(#lineGlow)"/>
78
+
79
+ <!-- Main line -->
80
+ <path d="M80,310 Q130,308 180,295 T280,260 T380,210 T480,155 T580,115 T680,95 T750,88"
81
+ stroke="url(#lineGrad)" stroke-width="3" fill="none" stroke-linecap="round" filter="url(#softGlow)"/>
82
+
83
+ <!-- Data points with glow -->
84
+ <g filter="url(#softGlow)">
85
+ <circle cx="80" cy="310" r="6" fill="#6366f1"/>
86
+ <circle cx="180" cy="295" r="6" fill="#8b5cf6"/>
87
+ <circle cx="280" cy="260" r="6" fill="#8b5cf6"/>
88
+ <circle cx="380" cy="210" r="6" fill="#06b6d4"/>
89
+ <circle cx="480" cy="155" r="6" fill="#06b6d4"/>
90
+ <circle cx="580" cy="115" r="6" fill="#10b981"/>
91
+ <circle cx="680" cy="95" r="6" fill="#10b981"/>
92
+ <circle cx="750" cy="88" r="8" fill="#10b981"/>
93
+ </g>
94
+
95
+ <!-- Inner dots -->
96
+ <g>
97
+ <circle cx="80" cy="310" r="2.5" fill="#fff"/>
98
+ <circle cx="180" cy="295" r="2.5" fill="#fff"/>
99
+ <circle cx="280" cy="260" r="2.5" fill="#fff"/>
100
+ <circle cx="380" cy="210" r="2.5" fill="#fff"/>
101
+ <circle cx="480" cy="155" r="2.5" fill="#fff"/>
102
+ <circle cx="580" cy="115" r="2.5" fill="#fff"/>
103
+ <circle cx="680" cy="95" r="2.5" fill="#fff"/>
104
+ <circle cx="750" cy="88" r="3" fill="#fff"/>
105
+ </g>
106
+
107
+ <!-- X-axis labels -->
108
+ <g fill="#6b7280" font-family="system-ui,sans-serif" font-size="12" text-anchor="middle">
109
+ <text x="80" y="355">Week 0</text>
110
+ <text x="280" y="355">Week 1</text>
111
+ <text x="480" y="355">Week 2</text>
112
+ <text x="680" y="355">Week 3</text>
113
+ <text x="750" y="355">Now</text>
114
+ </g>
115
+
116
+ <!-- Stat card -->
117
+ <g transform="translate(580, 55)">
118
+ <rect x="0" y="0" width="160" height="55" rx="10" fill="#10b981" fill-opacity="0.15" stroke="#10b981" stroke-width="1"/>
119
+ <text x="80" y="25" text-anchor="middle" fill="#10b981" font-family="system-ui,sans-serif" font-size="22" font-weight="800">+149%</text>
120
+ <text x="80" y="45" text-anchor="middle" fill="#6b7280" font-family="system-ui,sans-serif" font-size="12">growth in 4 weeks</text>
121
+ </g>
122
+ </svg>