adaptive-memory-multi-model-router 2.15.2 → 2.15.3

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/AGENT_COUNCIL_FINDINGS.md +123 -98
  2. package/ARCHITECTURE.md +1 -1
  3. package/CAMPAIGN_SUMMARY.md +87 -0
  4. package/ENTERPRISE_INTEGRATIONS.md +94 -0
  5. package/INTEGRATION_PROGRESS.md +96 -0
  6. package/OPPORTUNITIES_100.md +277 -0
  7. package/POPULARITY_BOOSTERS.md +1 -1
  8. package/README.md +143 -173
  9. package/README_ja.md +16 -20
  10. package/README_zh.md +13 -17
  11. package/TODO_BROWSER_AUTOMATION.md +87 -0
  12. package/a3m-integrations-summary.md +73 -0
  13. package/articles/CHINESE_DIRECTORIES.md +2 -2
  14. package/articles/CHINESE_SUBMISSIONS_READY.md +5 -5
  15. package/articles/HN_POST_READY.md +16 -20
  16. package/articles/HN_SHOW_SEO.md +49 -0
  17. package/articles/INDIEHACKERS_READY.md +19 -34
  18. package/articles/PRODUCTHUNT_READY.md +47 -67
  19. package/articles/REDDIT_SEO_2026.md +50 -0
  20. package/demo/IMPROVED_PROMPTS.md +3 -3
  21. package/demo/VEO3_PROMPTS.md +2 -2
  22. package/demo/VIDEO_PRODUCTION_GUIDE.md +3 -3
  23. package/dist/analytics/costAnalytics.d.ts +0 -1
  24. package/dist/benchmark/reproducible.d.ts +0 -1
  25. package/dist/cache/semanticCache.d.ts +0 -1
  26. package/dist/cost/budgetEnforcer.d.ts +0 -1
  27. package/dist/cost/costTracker.d.ts +0 -1
  28. package/dist/ensemble/multiRoundDialog.d.ts +0 -1
  29. package/dist/ensemble/shapleyValue.d.ts +0 -1
  30. package/dist/ensemble.d.ts +0 -1
  31. package/dist/index.d.ts +0 -1
  32. package/dist/integrations/oauth.d.ts +0 -1
  33. package/dist/integrations/scienceAdapter.d.ts +0 -1
  34. package/dist/memory/autoFetch.d.ts +0 -1
  35. package/dist/memory/hybridMemory.d.ts +0 -1
  36. package/dist/memory/memoryTree.d.ts +0 -1
  37. package/dist/memory/obsidianVault.d.ts +0 -1
  38. package/dist/memory/reasoningBank.d.ts +0 -1
  39. package/dist/observability/changeWatch.d.ts +0 -1
  40. package/dist/observability/fatigueDetector.d.ts +0 -1
  41. package/dist/observability/index.d.ts +0 -1
  42. package/dist/observability/metrics.d.ts +0 -1
  43. package/dist/observability/middleware.d.ts +0 -1
  44. package/dist/observability/tracer.d.ts +0 -1
  45. package/dist/observability/types.d.ts +0 -1
  46. package/dist/providers/providerConfig.d.ts +0 -1
  47. package/dist/routing/advancedRouter.d.ts +1 -2
  48. package/dist/routing/advancedRouter.js +84 -0
  49. package/dist/routing/advancedRouter.js.map +1 -1
  50. package/dist/routing/crossModelValidation.d.ts +0 -1
  51. package/dist/routing/providerHealth.d.ts +77 -2
  52. package/dist/routing/providerHealth.js +190 -4
  53. package/dist/routing/providerHealth.js.map +1 -1
  54. package/dist/routing/providerRetry.d.ts +0 -1
  55. package/dist/routing/shadowSampler.d.ts +187 -0
  56. package/dist/routing/shadowSampler.js +306 -0
  57. package/dist/routing/shadowSampler.js.map +1 -0
  58. package/dist/sdk.d.ts +0 -1
  59. package/dist/security/guardrails.d.ts +0 -1
  60. package/dist/server/dashboard.d.ts +0 -1
  61. package/dist/server/handlers/chatHandler.d.ts +0 -1
  62. package/dist/server/handlers/completionsHandler.d.ts +0 -1
  63. package/dist/server/handlers/embeddingsHandler.d.ts +0 -1
  64. package/dist/server/handlers/healthHandler.d.ts +0 -1
  65. package/dist/server/handlers/metricsHandler.d.ts +0 -1
  66. package/dist/server/handlers/modelsHandler.d.ts +0 -1
  67. package/dist/server/metrics.d.ts +0 -1
  68. package/dist/server/modelMapper.d.ts +0 -1
  69. package/dist/server/proxyServer.d.ts +0 -1
  70. package/dist/server/router.d.ts +0 -1
  71. package/dist/server/state.d.ts +0 -1
  72. package/dist/tui/dashboard.d.ts +0 -1
  73. package/dist/utils/costUtils.d.ts +0 -1
  74. package/dist/utils/sorting.d.ts +0 -1
  75. package/dist/utils/tokenUtils.d.ts +0 -1
  76. package/docs/comparison-litellm.md +10 -18
  77. package/docs/index.html +29 -34
  78. package/docs/llms-full.txt +6 -6
  79. package/docs/llms.txt +21 -23
  80. package/docs-site/index.html +19 -19
  81. package/integrations/browser-use/README.md +155 -0
  82. package/integrations/browser-use/examples/form-filling.ts +179 -0
  83. package/integrations/browser-use/index.ts +145 -0
  84. package/integrations/browser-use/package.json +34 -0
  85. package/integrations/browser-use/tsconfig.json +17 -0
  86. package/integrations/mcp-browser/README.md +177 -0
  87. package/integrations/mcp-browser/package.json +38 -0
  88. package/integrations/mcp-browser/src/index.ts +297 -0
  89. package/integrations/sota-browser/README.md +191 -0
  90. package/integrations/sota-browser/package.json +34 -0
  91. package/llms-full.txt +6 -6
  92. package/llms.txt +22 -33
  93. package/mcp-server/package.json +0 -6
  94. package/mcp-server/tsconfig.json +2 -3
  95. package/package.json +3 -3
  96. package/sitemap.xml +15 -9
  97. package/src/routing/advancedRouter.ts +101 -0
  98. package/src/routing/providerHealth.ts +234 -4
  99. package/src/routing/shadowSampler.ts +427 -0
  100. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -94
  101. package/.github/ISSUE_TEMPLATE/checklist.md +0 -35
  102. package/.github/ISSUE_TEMPLATE/config.yml +0 -17
  103. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -71
  104. package/.well-known/ai-plugin.json +0 -16
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ /**
3
+ * ShadowSampler — Value-Proportional Shadow Verification
4
+ *
5
+ * Implements Optimal Defense Theory (Rhoades 1979; McKey 1974; Zangerl & Bazzaz 1992)
6
+ * from plant ecological economics:
7
+ *
8
+ * "A plant allocates defensive compounds (defense cost) in proportion to
9
+ * tissue value, attack probability, and the marginal cost of defense."
10
+ *
11
+ * Mapped to A3M routing:
12
+ * - Tissue value → query stakes / expected cost of wrong answer
13
+ * - Attack probability → probability that the primary provider fails/misbehaves
14
+ * - Defense cost → cost of the shadow verification call
15
+ * - Marginal return → expected reduction in error rate from verification
16
+ *
17
+ * Instead of binary always-on (wasteful) or always-off (risky), ODT says:
18
+ * Sample shadow verification PROPORTIONALLY to expected value of verification.
19
+ *
20
+ * The sampling probability is:
21
+ * P(shadow) = f(expected_error_cost_reduction, query_risk)
22
+ *
23
+ * This is NOT the Zahavi "shared expert" (which always runs on 100% of queries).
24
+ * ODT shadow runs probabilistically — only on queries where the expected
25
+ * verification benefit exceeds the verification cost.
26
+ *
27
+ * Usage:
28
+ * const sampler = new ShadowSampler();
29
+ * const decision = await sampler.routeWithShadow(query, { strategy: 'auto' });
30
+ * // decision.hasShadow === true iff we sampled a shadow provider
31
+ * // decision.primaryResult and decision.shadowResult are compared automatically
32
+ */
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.ShadowSampler = void 0;
35
+ const advancedRouter_1 = require("./advancedRouter");
36
+ const providerConfig_1 = require("../providers/providerConfig");
37
+ /**
38
+ * Optimal Defense Theory Shadow Sampler
39
+ *
40
+ * Allocates shadow verification proportionally to query value and risk.
41
+ *
42
+ * The ODT sampling probability:
43
+ * P_shadow = min(maxP, baseP + risk_adj + cost_adj + complexity_adj)
44
+ *
45
+ * where:
46
+ * baseP = baseline verification rate (ODT " constitutive defense")
47
+ * risk_adj = risk_profile scaling (ODT "induced defense")
48
+ * cost_adj = output cost scaling (value of correct answer)
49
+ * complexity_adj = query complexity signal
50
+ */
51
+ class ShadowSampler {
52
+ config;
53
+ // Cached shadow provider (auto-selected on first call)
54
+ _shadowProvider = null;
55
+ // Counters for sampling statistics
56
+ _shadowCount = 0;
57
+ _totalCount = 0;
58
+ constructor(config = {}) {
59
+ this.config = {
60
+ minQueryStake: config.minQueryStake ?? 0.01,
61
+ maxShadowProbability: config.maxShadowProbability ?? 0.15,
62
+ riskScalingFactor: config.riskScalingFactor ?? 0.5,
63
+ costScalingFactor: config.costScalingFactor ?? 0.3,
64
+ shadowProvider: config.shadowProvider ?? null,
65
+ forceShadowProvider: config.forceShadowProvider ?? false,
66
+ useComplexitySignal: config.useComplexitySignal ?? true,
67
+ forceShadow: config.forceShadow ?? false,
68
+ };
69
+ }
70
+ /**
71
+ * Auto-select the cheapest available provider as the shadow.
72
+ * Excludes the primary provider to ensure diversity.
73
+ */
74
+ selectShadowProvider(primaryProvider) {
75
+ if (this.config.forceShadowProvider && this.config.shadowProvider) {
76
+ return this.config.shadowProvider;
77
+ }
78
+ if (this._shadowProvider)
79
+ return this._shadowProvider;
80
+ const profiles = (0, providerConfig_1.getAvailableProviders)();
81
+ const candidates = Object.entries(profiles)
82
+ .filter(([name, p]) => {
83
+ // Exclude primary
84
+ if (name === primaryProvider)
85
+ return false;
86
+ // Must be available (has API key) — cost must be finite
87
+ const cost = (p.costPerK.input + p.costPerK.output) / 2;
88
+ return cost < Infinity;
89
+ })
90
+ .sort((a, b) => {
91
+ const costA = (a[1].costPerK.input + a[1].costPerK.output) / 2;
92
+ const costB = (b[1].costPerK.input + b[1].costPerK.output) / 2;
93
+ return costA - costB;
94
+ });
95
+ if (candidates.length === 0) {
96
+ // Fallback: pick any non-primary
97
+ const fallback = Object.keys(profiles).find(n => n !== primaryProvider);
98
+ this._shadowProvider = fallback || primaryProvider;
99
+ }
100
+ else {
101
+ this._shadowProvider = candidates[0][0];
102
+ }
103
+ return this._shadowProvider;
104
+ }
105
+ /**
106
+ * Estimate the query "stakes" — the expected cost of a wrong answer.
107
+ *
108
+ * ODT maps this to "tissue value": how much is this asset worth protecting?
109
+ * In routing terms: if this query fails, how much does it cost?
110
+ *
111
+ * We approximate this as:
112
+ * stake ≈ estimated_output_tokens × cost_per_token × criticality_multiplier
113
+ *
114
+ * where criticality is derived from query complexity and risk_profile.
115
+ */
116
+ estimateQueryStake(features) {
117
+ const estimatedTokens = features.length * 1.5; // rough estimate
118
+ const avgCostPerToken = 0.0001; // roughly $0.10/1K tokens
119
+ const stake = estimatedTokens * avgCostPerToken;
120
+ // Criticality multiplier from risk profile
121
+ const riskMultiplier = {
122
+ high: 10.0, // Wrong answer could cause real harm — worth verifying
123
+ medium: 2.0, // Some cost to wrong answer
124
+ low: 0.5, // Low stakes — skip verification
125
+ };
126
+ const riskMult = riskMultiplier[features.risk_profile || 'medium'] ?? 1.0;
127
+ // Complexity multiplier — complex queries are harder to verify but more valuable
128
+ // We use complexity as a proxy for "correctness is harder to judge"
129
+ const complexityMultiplier = 1 + (features.complexity || 0) * 2;
130
+ return stake * riskMult * complexityMultiplier;
131
+ }
132
+ /**
133
+ * Compute the ODT sampling probability for this query.
134
+ *
135
+ * ODT principle: defense (shadow) allocation ∝ expected benefit of defense.
136
+ * Expected benefit = P(failure) × cost_of_failure
137
+ *
138
+ * So P(shadow) scales with:
139
+ * 1. Query stake (expected cost of wrong answer)
140
+ * 2. Risk profile (probability of primary failure)
141
+ * 3. Output cost (verification ROI — cheaper outputs need less verification)
142
+ * 4. Complexity (complex queries benefit more from verification)
143
+ */
144
+ computeShadowProbability(features, stake) {
145
+ // Base probability (ODT "constitutive defense" — baseline verification rate)
146
+ let p = 0.02; // 2% baseline
147
+ // === STAKES ADJUSTMENT (ODT "tissue value") ===
148
+ // Higher stake → proportionally higher verification probability
149
+ // Scale from 2% to maxP as stake goes from minStake to $1.00
150
+ if (stake >= this.config.minQueryStake) {
151
+ const stakeAdj = Math.min((stake - this.config.minQueryStake) / (1.0 - this.config.minQueryStake), 1.0) * (this.config.maxShadowProbability - 0.02);
152
+ p += stakeAdj;
153
+ }
154
+ else {
155
+ // Below minimum stake — no verification regardless
156
+ return 0;
157
+ }
158
+ // === RISK ADJUSTMENT (ODT "attack probability") ===
159
+ // High-risk queries are more likely to have primary failures
160
+ // Scale risk_adj by riskScalingFactor (0.5 = 50% boost for high-risk)
161
+ const riskAdj = {
162
+ high: 0.10 * this.config.riskScalingFactor,
163
+ medium: 0.03 * this.config.riskScalingFactor,
164
+ low: 0.0,
165
+ };
166
+ p += riskAdj[features.risk_profile || 'medium'] ?? 0;
167
+ // === COMPLEXITY ADJUSTMENT (ODT "defense efficacy") ===
168
+ // Complex queries benefit more from verification (more errors to catch)
169
+ // But also harder to verify (requires domain knowledge to judge)
170
+ if (this.config.useComplexitySignal) {
171
+ if (features.has_code) {
172
+ p += 0.05; // Code verification has high ROI (bugs are costly)
173
+ }
174
+ if (features.requires_reasoning) {
175
+ p += 0.03; // Reasoning errors are subtle but costly
176
+ }
177
+ if (features.has_math) {
178
+ p += 0.04; // Math has objective ground truth — easy to verify (note: field is has_math)
179
+ }
180
+ }
181
+ // === COST SCALING (ODT "marginal defense cost") ===
182
+ // Expensive outputs are harder to produce — verify to avoid waste
183
+ if (this.config.costScalingFactor > 0 && features.length > 500) {
184
+ const costAdj = Math.min((features.length - 500) / 10000, // scale up for very long outputs
185
+ 0.05) * this.config.costScalingFactor;
186
+ p += costAdj;
187
+ }
188
+ // Clamp to [0, maxShadowProbability]
189
+ return Math.min(Math.max(p, 0), this.config.maxShadowProbability);
190
+ }
191
+ /**
192
+ * Route a query, with optional ODT-proportional shadow verification.
193
+ *
194
+ * @param prompt - The user query
195
+ * @param options - Routing options (same as routeQuery)
196
+ * @returns ShadowDecision with shadow metadata
197
+ */
198
+ routeWithShadow(prompt, options) {
199
+ const features = (0, advancedRouter_1.extractQueryFeatures)(prompt);
200
+ const primaryDecision = (0, advancedRouter_1.routeQuery)(prompt, options?.available_models, options?.budget_multiplier);
201
+ // Compute query stakes and shadow probability
202
+ const stake = this.estimateQueryStake(features);
203
+ const shadowProb = this.computeShadowProbability(features, stake);
204
+ // ODT sampling decision
205
+ const shouldShadow = this.config.forceShadow || Math.random() < shadowProb;
206
+ const shadowProvider = shouldShadow
207
+ ? this.selectShadowProvider(primaryDecision.primary_model || '')
208
+ : null;
209
+ if (shouldShadow) {
210
+ this._shadowCount++;
211
+ }
212
+ this._totalCount++;
213
+ const reasoning = shouldShadow
214
+ ? `ODT shadow: stake=${stake.toFixed(4)}, risk=${features.risk_profile}, P=${shadowProb.toFixed(3)}, complexity=${features.complexity.toFixed(2)}`
215
+ : `ODT no-shadow: stake=${stake.toFixed(4)} below threshold`;
216
+ return {
217
+ ...primaryDecision,
218
+ hasShadow: shouldShadow,
219
+ shadowProvider,
220
+ shadowProbability: shadowProb,
221
+ features,
222
+ shadowReasoning: reasoning,
223
+ };
224
+ }
225
+ /**
226
+ * Compare primary and shadow outputs.
227
+ * Returns the "better" answer and confidence delta.
228
+ *
229
+ * For production use: this would call both providers in parallel
230
+ * and compare outputs. For now, returns a stub that signals
231
+ * the caller should handle comparison.
232
+ */
233
+ async compareOutputs(primaryAnswer, shadowAnswer) {
234
+ if (!shadowAnswer) {
235
+ return {
236
+ primary: primaryAnswer,
237
+ shadow: null,
238
+ winner: 'no-shadow',
239
+ confidenceDelta: 0,
240
+ };
241
+ }
242
+ // Simple comparison: length + character overlap as proxy for agreement
243
+ // In production, this would use a proper semantic similarity check
244
+ const primaryLen = primaryAnswer.length;
245
+ const shadowLen = shadowAnswer.length;
246
+ const lengthRatio = Math.min(primaryLen, shadowLen) / Math.max(primaryLen, shadowLen);
247
+ // Count common bigrams as a simple similarity proxy
248
+ const primaryBigrams = new Set();
249
+ const shadowBigrams = new Set();
250
+ for (let i = 0; i < primaryAnswer.length - 1; i++) {
251
+ primaryBigrams.add(primaryAnswer.slice(i, i + 2));
252
+ }
253
+ for (let i = 0; i < shadowAnswer.length - 1; i++) {
254
+ shadowBigrams.add(shadowAnswer.slice(i, i + 2));
255
+ }
256
+ let intersection = 0;
257
+ for (const bg of primaryBigrams) {
258
+ if (shadowBigrams.has(bg))
259
+ intersection++;
260
+ }
261
+ const union = primaryBigrams.size + shadowBigrams.size - intersection;
262
+ const jaccard = union > 0 ? intersection / union : 0;
263
+ // High agreement (jaccard > 0.8) → trust primary
264
+ // Low agreement → flag for review or prefer primary
265
+ const winner = jaccard > 0.8 ? 'primary'
266
+ : jaccard > 0.5 ? 'tie'
267
+ : 'shadow'; // Low agreement: shadow might have caught something
268
+ const confidenceDelta = jaccard > 0.8 ? 0 : -0.1; // Reduce confidence if they differ
269
+ return {
270
+ primary: primaryAnswer,
271
+ shadow: shadowAnswer,
272
+ winner,
273
+ confidenceDelta,
274
+ };
275
+ }
276
+ /**
277
+ * Get sampling statistics for monitoring.
278
+ */
279
+ getStats() {
280
+ return {
281
+ shadowCount: this._shadowCount,
282
+ totalCount: this._totalCount,
283
+ shadowRate: this._totalCount > 0 ? this._shadowCount / this._totalCount : 0,
284
+ };
285
+ }
286
+ /**
287
+ * Reset statistics counters.
288
+ */
289
+ resetStats() {
290
+ this._shadowCount = 0;
291
+ this._totalCount = 0;
292
+ }
293
+ /**
294
+ * Update configuration at runtime.
295
+ */
296
+ configure(config) {
297
+ this.config = { ...this.config, ...config };
298
+ }
299
+ }
300
+ exports.ShadowSampler = ShadowSampler;
301
+ // ============================================================
302
+ // NOTE: Named exports are at declaration level above.
303
+ // ShadowSampler, ShadowSamplerConfig, ShadowDecision, ShadowedResponse
304
+ // are all exported via 'export interface' / 'export class'
305
+ // ============================================================
306
+ //# sourceMappingURL=shadowSampler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadowSampler.js","sourceRoot":"","sources":["../../src/routing/shadowSampler.ts"],"names":[],"mappings":"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"}
package/dist/sdk.d.ts CHANGED
@@ -133,4 +133,3 @@ export declare class A3MRouter {
133
133
  * @returns Configured A3MRouter instance
134
134
  */
135
135
  export declare function createSDK(config?: A3MRouterConfig): A3MRouter;
136
- //# sourceMappingURL=sdk.d.ts.map
@@ -74,4 +74,3 @@ export declare class GuardrailEngine {
74
74
  }
75
75
  export declare function createGuardrails(config?: Partial<GuardrailConfig>): GuardrailEngine;
76
76
  export {};
77
- //# sourceMappingURL=guardrails.d.ts.map
@@ -56,4 +56,3 @@ export declare function registerProvider(id: string, name: string): void;
56
56
  */
57
57
  export declare function handleDashboardRequest(req: http.IncomingMessage, res: http.ServerResponse): boolean;
58
58
  export declare function getDashboardHTML(): string;
59
- //# sourceMappingURL=dashboard.d.ts.map
@@ -8,4 +8,3 @@ import * as http from 'http';
8
8
  import { RouteContext } from '../router';
9
9
  export declare function handleChatCompletions(req: http.IncomingMessage, res: http.ServerResponse, ctx: RouteContext): Promise<void>;
10
10
  export default handleChatCompletions;
11
- //# sourceMappingURL=chatHandler.d.ts.map
@@ -7,4 +7,3 @@ import * as http from 'http';
7
7
  import { RouteContext } from '../router';
8
8
  export declare function handleCompletions(req: http.IncomingMessage, res: http.ServerResponse, ctx: RouteContext): Promise<void>;
9
9
  export default handleCompletions;
10
- //# sourceMappingURL=completionsHandler.d.ts.map
@@ -14,4 +14,3 @@ import * as http from 'http';
14
14
  import { RouteContext } from '../router';
15
15
  export declare function handleEmbeddings(req: http.IncomingMessage, res: http.ServerResponse, ctx: RouteContext): Promise<void>;
16
16
  export default handleEmbeddings;
17
- //# sourceMappingURL=embeddingsHandler.d.ts.map
@@ -7,4 +7,3 @@ import * as http from 'http';
7
7
  import { RouteContext } from '../router';
8
8
  export declare function handleHealth(_req: http.IncomingMessage, res: http.ServerResponse, _ctx: RouteContext): Promise<void>;
9
9
  export default handleHealth;
10
- //# sourceMappingURL=healthHandler.d.ts.map
@@ -8,4 +8,3 @@ import * as http from 'http';
8
8
  import { RouteContext } from '../router';
9
9
  export declare function handleMetrics(_req: http.IncomingMessage, res: http.ServerResponse, _ctx: RouteContext): void;
10
10
  export default handleMetrics;
11
- //# sourceMappingURL=metricsHandler.d.ts.map
@@ -7,4 +7,3 @@ import * as http from 'http';
7
7
  import { RouteContext } from '../router';
8
8
  export declare function handleModels(_req: http.IncomingMessage, res: http.ServerResponse, _ctx: RouteContext): void;
9
9
  export default handleModels;
10
- //# sourceMappingURL=modelsHandler.d.ts.map
@@ -93,4 +93,3 @@ declare const _default: {
93
93
  recordFallback: typeof recordFallback;
94
94
  };
95
95
  export default _default;
96
- //# sourceMappingURL=metrics.d.ts.map
@@ -41,4 +41,3 @@ export declare function listAvailableModels(): Array<{
41
41
  created: number;
42
42
  owned_by: string;
43
43
  }>;
44
- //# sourceMappingURL=modelMapper.d.ts.map
@@ -74,4 +74,3 @@ export declare function createProxyServer(port?: number): http.Server;
74
74
  export { costTracker, requestLogs } from './state';
75
75
  export type { RequestLog } from './state';
76
76
  export default createProxyServer;
77
- //# sourceMappingURL=proxyServer.d.ts.map
@@ -46,4 +46,3 @@ declare const _default: {
46
46
  getRegisteredRoutes: typeof getRegisteredRoutes;
47
47
  };
48
48
  export default _default;
49
- //# sourceMappingURL=router.d.ts.map
@@ -27,4 +27,3 @@ declare const _default: {
27
27
  requestLogs: RequestLog[];
28
28
  };
29
29
  export default _default;
30
- //# sourceMappingURL=state.d.ts.map
@@ -3,4 +3,3 @@
3
3
  * A3M Router — Overlay Box TUI (Sakura Light Theme)
4
4
  */
5
5
  export {};
6
- //# sourceMappingURL=dashboard.d.ts.map
@@ -55,4 +55,3 @@ export declare function qualityAdjustedCostScore(costScore: number, qualityScore
55
55
  */
56
56
  export declare function budgetAwareCostScore(costPer1K: number, budgetMultiplier?: number): number;
57
57
  export declare function runValidationTests(): void;
58
- //# sourceMappingURL=costUtils.d.ts.map
@@ -10,4 +10,3 @@ export declare function quickselectTopK<T>(arr: T[], k: number, compare: (a: T)
10
10
  * Select top candidate using Quickselect
11
11
  */
12
12
  export declare function selectTop<T>(arr: T[], compare: (a: T) => number): T | undefined;
13
- //# sourceMappingURL=sorting.d.ts.map
@@ -50,4 +50,3 @@ declare const _default: {
50
50
  MODEL_COSTS: Record<string, TokenCost>;
51
51
  };
52
52
  export default _default;
53
- //# sourceMappingURL=tokenUtils.d.ts.map
@@ -8,16 +8,15 @@ litellm (48K★) is the most popular LLM gateway. Here's why A3M exists alongsid
8
8
  |---------|---------|------------|
9
9
  | **Approach** | Sequential fallback | Parallel ensemble |
10
10
  | **Model selection** | Try one, fail, try next | Run all, pick best by confidence |
11
- | **Benchmark** | None published | #1 on RouterArena (96.77%) |
12
- | **Cost** | Pay for every attempt | Pay for best response |
11
+ | **Cost model** | Pay for every attempt | Pay for best response only |
13
12
  | **Latency** | N × round-trip (sequential) | 1 × round-trip (parallel) |
14
13
  | **Memory** | None | Episodic memory across sessions |
15
14
  | **Size** | ~1.5GB (PyTorch) | 19.5KB (zero ML) |
16
15
  | **Startup** | ~3s | <100ms |
17
16
  | **GPU required** | Yes (for some models) | No |
18
- | **Benchmark data** | Not published | [RouterArena #1](https://github.com/RouteWorks/RouterArena/pull/144) |
19
- | **Routing accuracy** | Claims "100%" (no data) | 96.77% (evaluated on RouterArena benchmark) |
20
- | **Cheapest cost** | Not published | $0.0768/1K (#1 on leaderboard) |
17
+ | **Routing accuracy** | Claims "100%" (no data) | 67% exact tier match (MMR-Bench) |
18
+ | **Cost savings** | Not published | 63% vs all-premium (MMR-Bench) |
19
+ | **Cache** | None | Semantic (embedding-based) |
21
20
 
22
21
  ## The Core Difference
23
22
 
@@ -54,11 +53,12 @@ const result = await router.route("Explain quantum computing")
54
53
 
55
54
  ## When to Use A3M
56
55
 
57
- - You want the **cheapest** routing (2.3× cheaper than Sqwish)
58
- - You want the **highest accuracy** (#1 on RouterArena)
59
- - You want **memory** across sessions (only router that has this)
56
+ - You want the **cheapest** routing (parallel execution means you only pay for the best result)
57
+ - You want **highest accuracy** (confidence-weighted ensemble beats sequential fallback)
58
+ - You want **memory** across sessions (only router with episodic memory)
60
59
  - You want **sub-100ms startup** (litellm takes ~3s)
61
- - You want **zero ML dependencies** (no GPU, no PyTorch)
60
+ - You want **zero ML dependencies** (no GPU, no PyTorch, 19.5KB)
61
+ - You want **semantic caching** (avoid repeated API calls for similar queries)
62
62
  - You're building in Node.js/TypeScript
63
63
 
64
64
  ## When to Use Both
@@ -75,14 +75,6 @@ const router = createRouter({
75
75
 
76
76
  This gives you litellm's 100+ providers AND A3M's parallel scoring.
77
77
 
78
- ## The Benchmark Question
79
-
80
- litellm claims "100% routing accuracy" but publishes **zero data** to back this up. RouterArena (arXiv:2510.00202) is the first standardized benchmark for LLM routers. A3M submitted, litellm didn't.
81
-
82
- > "Benchmark or GTFO." — A principle we stand by.
83
-
84
- If litellm submits to RouterArena and scores higher than 96.77%, we'll celebrate. Competition drives improvement.
85
-
86
78
  ---
87
79
 
88
- [GitHub](https://github.com/Das-rebel/a3m-router) · [npm](https://www.npmjs.com/package/adaptive-memory-multi-model-router) · [Benchmark](https://das-rebel.github.io/a3m-router/benchmark)
80
+ [GitHub](https://github.com/Das-rebel/a3m-router) · [npm](https://www.npmjs.com/package/adaptive-memory-multi-model-router)