adaptive-memory-multi-model-router 2.14.59 → 2.15.0
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/.github/ISSUE_TEMPLATE/checklist.md +35 -0
- package/.github/workflows/ci.yml +9 -6
- package/POPULARITY_BOOSTERS.md +18 -0
- package/PR_STATUS_REPORT.md +55 -148
- package/README.md +222 -1035
- package/assets/chart-accuracy-by-tier.svg +63 -0
- package/assets/chart-confusion-matrix.svg +98 -0
- package/assets/chart-cost-comparison.svg +66 -0
- package/assets/chart-latency-overhead.svg +102 -0
- package/assets/chart-routerena-leaderboard.svg +76 -0
- package/dist/analytics/costAnalytics.d.ts +1 -0
- package/dist/benchmark/comprehensive.d.ts +4 -53
- package/dist/benchmark/comprehensive.d.ts.map +1 -0
- package/dist/benchmark/comprehensive.js +112 -214
- package/dist/benchmark/comprehensive.js.map +1 -1
- package/dist/benchmark/reproducible.d.ts +1 -0
- package/dist/cache/semanticCache.d.ts +1 -0
- package/dist/cli/setupWizard.d.ts +6 -1
- package/dist/cli/setupWizard.d.ts.map +1 -1
- package/dist/cli/setupWizard.js +6 -9
- package/dist/cli/setupWizard.js.map +1 -1
- package/dist/cost/budgetEnforcer.d.ts +1 -0
- package/dist/cost/costTracker.d.ts +1 -0
- package/dist/ensemble/multiRoundDialog.d.ts +1 -0
- package/dist/ensemble/multiRoundDialog.d.ts.map +1 -0
- package/dist/ensemble/shapleyValue.d.ts +1 -0
- package/dist/ensemble/shapleyValue.d.ts.map +1 -0
- package/dist/ensemble.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/integrations/langchainAdapter.d.ts +1 -0
- package/dist/integrations/oauth.d.ts +1 -0
- package/dist/integrations/scienceAdapter.d.ts +1 -0
- package/dist/integrations/scienceAdapter.d.ts.map +1 -0
- package/dist/memory/autoFetch.d.ts +1 -0
- package/dist/memory/hybridMemory.d.ts +1 -0
- package/dist/memory/hybridMemory.d.ts.map +1 -0
- package/dist/memory/memoryTree.d.ts +1 -0
- package/dist/memory/memoryTree.d.ts.map +1 -1
- package/dist/memory/obsidianVault.d.ts +1 -0
- package/dist/memory/obsidianVault.d.ts.map +1 -1
- package/dist/memory/reasoningBank.d.ts +1 -0
- package/dist/memory/reasoningBank.d.ts.map +1 -0
- package/dist/observability/changeWatch.d.ts +1 -0
- package/dist/observability/fatigueDetector.d.ts +1 -0
- package/dist/observability/index.d.ts +1 -0
- package/dist/observability/metrics.d.ts +1 -0
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/middleware.d.ts +1 -0
- package/dist/observability/tracer.d.ts +1 -0
- package/dist/observability/tracer.d.ts.map +1 -1
- package/dist/observability/types.d.ts +1 -0
- package/dist/providers/providerConfig.d.ts +1 -0
- package/dist/providers/providerConfig.d.ts.map +1 -1
- package/dist/routing/advancedRouter.d.ts +2 -1
- package/dist/routing/advancedRouter.d.ts.map +1 -1
- package/dist/routing/crossModelValidation.d.ts +1 -0
- package/dist/routing/providerHealth.d.ts +1 -0
- package/dist/routing/providerHealth.d.ts.map +1 -1
- package/dist/routing/providerRetry.d.ts +1 -0
- package/dist/sdk.d.ts +1 -0
- package/dist/security/guardrails.d.ts +1 -0
- package/dist/security/guardrails.d.ts.map +1 -1
- package/dist/server/dashboard.d.ts +1 -0
- package/dist/server/handlers/chatHandler.d.ts +11 -0
- package/dist/server/handlers/chatHandler.d.ts.map +1 -0
- package/dist/server/handlers/chatHandler.js +159 -0
- package/dist/server/handlers/chatHandler.js.map +1 -0
- package/dist/server/handlers/completionsHandler.d.ts +10 -0
- package/dist/server/handlers/completionsHandler.d.ts.map +1 -0
- package/dist/server/handlers/completionsHandler.js +124 -0
- package/dist/server/handlers/completionsHandler.js.map +1 -0
- package/dist/server/handlers/embeddingsHandler.d.ts +17 -0
- package/dist/server/handlers/embeddingsHandler.d.ts.map +1 -0
- package/dist/server/handlers/embeddingsHandler.js +235 -0
- package/dist/server/handlers/embeddingsHandler.js.map +1 -0
- package/dist/server/handlers/healthHandler.d.ts +10 -0
- package/dist/server/handlers/healthHandler.d.ts.map +1 -0
- package/dist/server/handlers/healthHandler.js +49 -0
- package/dist/server/handlers/healthHandler.js.map +1 -0
- package/dist/server/handlers/metricsHandler.d.ts +11 -0
- package/dist/server/handlers/metricsHandler.d.ts.map +1 -0
- package/dist/server/handlers/metricsHandler.js +24 -0
- package/dist/server/handlers/metricsHandler.js.map +1 -0
- package/dist/server/handlers/modelsHandler.d.ts +10 -0
- package/dist/server/handlers/modelsHandler.d.ts.map +1 -0
- package/dist/server/handlers/modelsHandler.js +19 -0
- package/dist/server/handlers/modelsHandler.js.map +1 -0
- package/dist/server/metrics.d.ts +96 -0
- package/dist/server/metrics.d.ts.map +1 -0
- package/dist/server/metrics.js +267 -0
- package/dist/server/metrics.js.map +1 -0
- package/dist/server/modelMapper.d.ts +1 -0
- package/dist/server/proxyServer.d.ts +53 -17
- package/dist/server/proxyServer.d.ts.map +1 -1
- package/dist/server/proxyServer.js +66 -303
- package/dist/server/proxyServer.js.map +1 -1
- package/dist/server/router.d.ts +49 -0
- package/dist/server/router.d.ts.map +1 -0
- package/dist/server/router.js +120 -0
- package/dist/server/router.js.map +1 -0
- package/dist/server/state.d.ts +30 -0
- package/dist/server/state.d.ts.map +1 -0
- package/dist/server/state.js +18 -0
- package/dist/server/state.js.map +1 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts +3 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts.map +1 -1
- package/dist/skills/__tests__/skill_manager.test.js +3 -6
- package/dist/skills/__tests__/skill_manager.test.js.map +1 -1
- package/dist/tui/dashboard.d.ts +1 -0
- package/dist/tui/index.d.ts +1 -0
- package/dist/utils/costUtils.d.ts +1 -0
- package/dist/utils/reliability.js +4 -18
- package/dist/utils/sorting.d.ts +1 -0
- package/dist/utils/tokenUtils.d.ts +1 -0
- package/docs/assets/chart-accuracy-by-tier.svg +63 -0
- package/docs/assets/chart-confusion-matrix.svg +98 -0
- package/docs/assets/chart-cost-comparison.svg +66 -0
- package/docs/assets/chart-latency-overhead.svg +102 -0
- package/docs/assets/chart-routerena-leaderboard.svg +76 -0
- package/docs/index.html +72 -80
- package/docs/llms-full.txt +156 -184
- package/docs/llms.txt +77 -42
- package/llms-full.txt +156 -184
- package/llms.txt +77 -42
- package/mcp-server/package.json +6 -0
- package/mcp-server/tsconfig.json +3 -2
- package/package.json +4 -3
- package/scripts/postinstall-nudge.js +3 -0
- package/src/server/handlers/chatHandler.ts +173 -0
- package/src/server/handlers/completionsHandler.ts +120 -0
- package/src/server/handlers/embeddingsHandler.ts +271 -0
- package/src/server/handlers/healthHandler.ts +57 -0
- package/src/server/handlers/metricsHandler.ts +30 -0
- package/src/server/handlers/modelsHandler.ts +25 -0
- package/src/server/metrics.ts +303 -0
- package/src/server/proxyServer.ts +71 -394
- package/src/server/router.ts +157 -0
- package/src/server/state.ts +34 -0
- package/src/skills/__tests__/skill_manager.test.ts +3 -3
- package/index.html +0 -667
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A3M Router - HTTP Route Registry
|
|
4
|
+
*
|
|
5
|
+
* Pluggable route table pattern replacing monolithic if/else routing.
|
|
6
|
+
* Adding a new endpoint = 1 handler file + 1 registration line.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { createRouter, registerRoute } from './router';
|
|
10
|
+
* registerRoute('GET', /^\/health$/, handleHealth);
|
|
11
|
+
* registerRoute('POST', /^\/v1\/chat\/completions$/, handleChatCompletions);
|
|
12
|
+
* const router = createRouter();
|
|
13
|
+
* server.use(router);
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.registerRoute = registerRoute;
|
|
17
|
+
exports.createRequestHandler = createRequestHandler;
|
|
18
|
+
exports.getRegisteredRoutes = getRegisteredRoutes;
|
|
19
|
+
// ============================================================
|
|
20
|
+
// ROUTE REGISTRY
|
|
21
|
+
// ============================================================
|
|
22
|
+
const routes = [];
|
|
23
|
+
/**
|
|
24
|
+
* Generate a short request ID.
|
|
25
|
+
*/
|
|
26
|
+
function generateRequestId() {
|
|
27
|
+
return 'req-' + Math.random().toString(36).substring(2, 10) + Date.now().toString(36);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parse query string from URL.
|
|
31
|
+
*/
|
|
32
|
+
function parseQuery(url) {
|
|
33
|
+
try {
|
|
34
|
+
const urlObj = new URL(url, 'http://localhost');
|
|
35
|
+
const query = {};
|
|
36
|
+
urlObj.searchParams.forEach((value, key) => {
|
|
37
|
+
query[key] = value;
|
|
38
|
+
});
|
|
39
|
+
return query;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parse HTTP method safely.
|
|
47
|
+
*/
|
|
48
|
+
function parseMethod(method) {
|
|
49
|
+
const m = (method || 'GET').toUpperCase();
|
|
50
|
+
if (['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'].includes(m)) {
|
|
51
|
+
return m;
|
|
52
|
+
}
|
|
53
|
+
return 'GET';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Register a route. Routes are matched in registration order.
|
|
57
|
+
*/
|
|
58
|
+
function registerRoute(method, pattern, handler, name) {
|
|
59
|
+
routes.push({ method, pattern, handler, name: name || `${method} ${pattern}` });
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create the request handler function for the registered routes.
|
|
63
|
+
* Returns a function compatible with http.createServer's requestListener.
|
|
64
|
+
*/
|
|
65
|
+
function createRequestHandler() {
|
|
66
|
+
return async function handleRequest(req, res) {
|
|
67
|
+
const method = parseMethod(req.method);
|
|
68
|
+
const url = req.url || '/';
|
|
69
|
+
const ctx = {
|
|
70
|
+
requestId: generateRequestId(),
|
|
71
|
+
startTime: Date.now(),
|
|
72
|
+
method,
|
|
73
|
+
path: url.split('?')[0],
|
|
74
|
+
query: parseQuery(url),
|
|
75
|
+
};
|
|
76
|
+
// CORS preflight
|
|
77
|
+
if (method === 'OPTIONS') {
|
|
78
|
+
res.writeHead(204, {
|
|
79
|
+
'Access-Control-Allow-Origin': '*',
|
|
80
|
+
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
|
|
81
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization, x-request-id',
|
|
82
|
+
'Access-Control-Max-Age': '86400',
|
|
83
|
+
});
|
|
84
|
+
res.end();
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// Find matching route
|
|
88
|
+
for (const route of routes) {
|
|
89
|
+
if (route.method !== method)
|
|
90
|
+
continue;
|
|
91
|
+
const match = ctx.path.match(route.pattern);
|
|
92
|
+
if (match) {
|
|
93
|
+
try {
|
|
94
|
+
await route.handler(req, res, ctx);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
console.error(`[a3m-router] Route ${route.name} error: ${err.message}`);
|
|
98
|
+
if (!res.headersSent) {
|
|
99
|
+
res.writeHead(500, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
|
|
100
|
+
res.end(JSON.stringify({ error: { message: err.message, type: 'server_error' } }));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// No route matched — 404
|
|
107
|
+
if (!res.headersSent) {
|
|
108
|
+
res.writeHead(404, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
|
|
109
|
+
res.end(JSON.stringify({ error: { message: `Not found: ${method} ${url}`, type: 'not_found' } }));
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get all registered routes (for debugging and /routes endpoint).
|
|
115
|
+
*/
|
|
116
|
+
function getRegisteredRoutes() {
|
|
117
|
+
return [...routes];
|
|
118
|
+
}
|
|
119
|
+
exports.default = { registerRoute, createRequestHandler, getRegisteredRoutes };
|
|
120
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/server/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A3M Router - Shared Server State
|
|
3
|
+
*
|
|
4
|
+
* Singleton state shared across the proxy server and all handlers.
|
|
5
|
+
* Extracted from proxyServer.ts to enable modular handler architecture.
|
|
6
|
+
*/
|
|
7
|
+
import { CostTracker } from '../cost/costTracker';
|
|
8
|
+
/** Singleton cost tracker instance */
|
|
9
|
+
export declare const costTracker: CostTracker;
|
|
10
|
+
/** In-memory request log (last 1000 entries) */
|
|
11
|
+
export interface RequestLog {
|
|
12
|
+
id: string;
|
|
13
|
+
model: string;
|
|
14
|
+
resolvedProvider: string;
|
|
15
|
+
resolvedModel: string;
|
|
16
|
+
latencyMs: number;
|
|
17
|
+
tokensIn: number;
|
|
18
|
+
tokensOut: number;
|
|
19
|
+
cost: number;
|
|
20
|
+
status: 'success' | 'error';
|
|
21
|
+
error?: string;
|
|
22
|
+
timestamp: number;
|
|
23
|
+
}
|
|
24
|
+
export declare const requestLogs: RequestLog[];
|
|
25
|
+
declare const _default: {
|
|
26
|
+
costTracker: CostTracker;
|
|
27
|
+
requestLogs: RequestLog[];
|
|
28
|
+
};
|
|
29
|
+
export default _default;
|
|
30
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/server/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAMlD,sCAAsC;AACtC,eAAO,MAAM,WAAW,aAAoB,CAAC;AAE7C,gDAAgD;AAChD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,WAAW,EAAE,UAAU,EAAO,CAAC;;;;;AAE5C,wBAA4C"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A3M Router - Shared Server State
|
|
4
|
+
*
|
|
5
|
+
* Singleton state shared across the proxy server and all handlers.
|
|
6
|
+
* Extracted from proxyServer.ts to enable modular handler architecture.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.requestLogs = exports.costTracker = void 0;
|
|
10
|
+
const costTracker_1 = require("../cost/costTracker");
|
|
11
|
+
// ============================================================
|
|
12
|
+
// SHARED STATE
|
|
13
|
+
// ============================================================
|
|
14
|
+
/** Singleton cost tracker instance */
|
|
15
|
+
exports.costTracker = new costTracker_1.CostTracker();
|
|
16
|
+
exports.requestLogs = [];
|
|
17
|
+
exports.default = { costTracker: exports.costTracker, requestLogs: exports.requestLogs };
|
|
18
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/server/state.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,qDAAkD;AAElD,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D,sCAAsC;AACzB,QAAA,WAAW,GAAG,IAAI,yBAAW,EAAE,CAAC;AAiBhC,QAAA,WAAW,GAAiB,EAAE,CAAC;AAE5C,kBAAe,EAAE,WAAW,EAAX,mBAAW,EAAE,WAAW,EAAX,mBAAW,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill_manager.test.d.ts","sourceRoot":"","sources":["../../../src/skills/__tests__/skill_manager.test.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"skill_manager.test.d.ts","sourceRoot":"","sources":["../../../src/skills/__tests__/skill_manager.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* Tests for SkillManager and TMLEnhancedAgent
|
|
4
|
+
*/
|
|
4
5
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
6
|
if (k2 === undefined) k2 = k;
|
|
6
7
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -35,10 +36,6 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
36
|
};
|
|
36
37
|
})();
|
|
37
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
Tests;
|
|
39
|
-
for (skill_manager_1.SkillManager; and; skill_enhanced_agent_1.TMLEnhancedAgent)
|
|
40
|
-
"";
|
|
41
|
-
";
|
|
42
39
|
const globals_1 = require("@jest/globals");
|
|
43
40
|
const skill_manager_1 = require("../skill_manager");
|
|
44
41
|
const skill_enhanced_agent_1 = require("../../agents/skill_enhanced_agent");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill_manager.test.js","sourceRoot":"","sources":["../../../src/skills/__tests__/skill_manager.test.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"skill_manager.test.js","sourceRoot":"","sources":["../../../src/skills/__tests__/skill_manager.test.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/dashboard.d.ts
CHANGED
package/dist/tui/index.d.ts
CHANGED
|
@@ -55,3 +55,4 @@ 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
|
|
@@ -134,17 +134,13 @@ class CircuitBreaker {
|
|
|
134
134
|
}
|
|
135
135
|
exports.CircuitBreaker = CircuitBreaker;
|
|
136
136
|
/**
|
|
137
|
-
* Enhanced retry wrapper with circuit breaker integration
|
|
137
|
+
* Enhanced retry wrapper with circuit breaker integration
|
|
138
138
|
*/
|
|
139
139
|
async function withRetry(fn, config = {}, circuitBreaker) {
|
|
140
140
|
const retryConfig = { ...exports.DEFAULT_RETRY_CONFIG, ...config };
|
|
141
141
|
let lastError = null;
|
|
142
142
|
let attempts = 0;
|
|
143
143
|
let circuit_tripped = false;
|
|
144
|
-
|
|
145
|
-
// Apply timeout if configured (default 30s per attempt)
|
|
146
|
-
const requestTimeout = config.timeout_ms || 30000;
|
|
147
|
-
|
|
148
144
|
for (let i = 0; i < retryConfig.max_attempts; i++) {
|
|
149
145
|
attempts++;
|
|
150
146
|
try {
|
|
@@ -153,14 +149,7 @@ async function withRetry(fn, config = {}, circuitBreaker) {
|
|
|
153
149
|
circuit_tripped = true;
|
|
154
150
|
throw new Error("Circuit breaker is open");
|
|
155
151
|
}
|
|
156
|
-
|
|
157
|
-
// Race between the request and a timeout
|
|
158
|
-
const timeoutPromise = new Promise((_, reject) => {
|
|
159
|
-
setTimeout(() => reject(new Error("Request timeout after " + requestTimeout + "ms")), requestTimeout);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
const result = await Promise.race([fn(), timeoutPromise]);
|
|
163
|
-
|
|
152
|
+
const result = await fn();
|
|
164
153
|
if (circuitBreaker) {
|
|
165
154
|
circuitBreaker.recordSuccess();
|
|
166
155
|
}
|
|
@@ -168,13 +157,9 @@ async function withRetry(fn, config = {}, circuitBreaker) {
|
|
|
168
157
|
}
|
|
169
158
|
catch (error) {
|
|
170
159
|
lastError = error instanceof Error ? error : new Error(String(error));
|
|
171
|
-
|
|
172
|
-
// Check if this was a timeout error
|
|
173
|
-
const isTimeout = lastError.message.includes("timeout");
|
|
174
|
-
|
|
175
160
|
// Check if should retry
|
|
176
161
|
const statusCode = error.statusCode || error.response?.statusCode || null;
|
|
177
|
-
if (!isRetryableStatus(statusCode, retryConfig)
|
|
162
|
+
if (!isRetryableStatus(statusCode, retryConfig)) {
|
|
178
163
|
return { result: null, error: lastError, attempts, circuit_tripped };
|
|
179
164
|
}
|
|
180
165
|
if (circuitBreaker) {
|
|
@@ -189,3 +174,4 @@ async function withRetry(fn, config = {}, circuitBreaker) {
|
|
|
189
174
|
}
|
|
190
175
|
return { result: null, error: lastError, attempts, circuit_tripped };
|
|
191
176
|
}
|
|
177
|
+
//# sourceMappingURL=reliability.js.map
|
package/dist/utils/sorting.d.ts
CHANGED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 280" width="480" height="280">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="barGrad" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
4
|
+
<stop offset="0%" stop-color="#22c55e"/>
|
|
5
|
+
<stop offset="100%" stop-color="#16a34a"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
|
|
9
|
+
<!-- Background -->
|
|
10
|
+
<rect width="480" height="280" fill="#fefefe"/>
|
|
11
|
+
|
|
12
|
+
<!-- Title -->
|
|
13
|
+
<text x="240" y="28" text-anchor="middle" fill="#111" font-family="system-ui,sans-serif" font-size="14" font-weight="600">Routing Accuracy by Tier (n=200)</text>
|
|
14
|
+
|
|
15
|
+
<!-- Y-axis -->
|
|
16
|
+
<line x1="60" y1="50" x2="60" y2="230" stroke="#333" stroke-width="1"/>
|
|
17
|
+
<line x1="60" y1="230" x2="460" y2="230" stroke="#333" stroke-width="1"/>
|
|
18
|
+
|
|
19
|
+
<!-- Y-axis labels -->
|
|
20
|
+
<g font-family="system-ui,sans-serif" font-size="10" fill="#555" text-anchor="end">
|
|
21
|
+
<text x="52" y="54">100%</text>
|
|
22
|
+
<text x="52" y="99">80%</text>
|
|
23
|
+
<text x="52" y="144">60%</text>
|
|
24
|
+
<text x="52" y="189">40%</text>
|
|
25
|
+
<text x="52" y="234">0%</text>
|
|
26
|
+
</g>
|
|
27
|
+
|
|
28
|
+
<!-- Grid lines -->
|
|
29
|
+
<g stroke="#e5e7eb" stroke-width="1" stroke-dasharray="4,3">
|
|
30
|
+
<line x1="60" y1="55" x2="460" y2="55"/>
|
|
31
|
+
<line x1="60" y1="100" x2="460" y2="100"/>
|
|
32
|
+
<line x1="60" y1="145" x2="460" y2="145"/>
|
|
33
|
+
<line x1="60" y1="190" x2="460" y2="190"/>
|
|
34
|
+
</g>
|
|
35
|
+
|
|
36
|
+
<!-- Bars: correct/total -->
|
|
37
|
+
<!-- free: 48/50 = 96% -->
|
|
38
|
+
<rect x="100" y="55" width="60" height="175" fill="url(#barGrad)" rx="2"/>
|
|
39
|
+
<text x="130" y="245" text-anchor="middle" fill="#333" font-family="system-ui,sans-serif" font-size="10">free</text>
|
|
40
|
+
<text x="130" y="48" text-anchor="middle" fill="#16a34a" font-family="system-ui,sans-serif" font-size="11" font-weight="600">96%</text>
|
|
41
|
+
<text x="130" y="238" text-anchor="middle" fill="#888" font-family="system-ui,sans-serif" font-size="9">48/50</text>
|
|
42
|
+
|
|
43
|
+
<!-- cheap: 45/60 = 75% -->
|
|
44
|
+
<rect x="200" y="85" width="60" height="145" fill="url(#barGrad)" rx="2"/>
|
|
45
|
+
<text x="230" y="245" text-anchor="middle" fill="#333" font-family="system-ui,sans-serif" font-size="10">cheap</text>
|
|
46
|
+
<text x="230" y="78" text-anchor="middle" fill="#16a34a" font-family="system-ui,sans-serif" font-size="11" font-weight="600">75%</text>
|
|
47
|
+
<text x="230" y="238" text-anchor="middle" fill="#888" font-family="system-ui,sans-serif" font-size="9">45/60</text>
|
|
48
|
+
|
|
49
|
+
<!-- mid: 18/50 = 36% -->
|
|
50
|
+
<rect x="300" y="169" width="60" height="61" fill="url(#barGrad)" rx="2"/>
|
|
51
|
+
<text x="330" y="245" text-anchor="middle" fill="#333" font-family="system-ui,sans-serif" font-size="10">mid</text>
|
|
52
|
+
<text x="330" y="162" text-anchor="middle" fill="#16a34a" font-family="system-ui,sans-serif" font-size="11" font-weight="600">36%</text>
|
|
53
|
+
<text x="330" y="238" text-anchor="middle" fill="#888" font-family="system-ui,sans-serif" font-size="9">18/50</text>
|
|
54
|
+
|
|
55
|
+
<!-- premium: 23/40 = 57.5% -->
|
|
56
|
+
<rect x="400" y="124" width="60" height="106" fill="url(#barGrad)" rx="2"/>
|
|
57
|
+
<text x="430" y="245" text-anchor="middle" fill="#333" font-family="system-ui,sans-serif" font-size="10">premium</text>
|
|
58
|
+
<text x="430" y="117" text-anchor="middle" fill="#16a34a" font-family="system-ui,sans-serif" font-size="11" font-weight="600">57%</text>
|
|
59
|
+
<text x="430" y="238" text-anchor="middle" fill="#888" font-family="system-ui,sans-serif" font-size="9">23/40</text>
|
|
60
|
+
|
|
61
|
+
<!-- Overall -->
|
|
62
|
+
<text x="240" y="268" text-anchor="middle" fill="#888" font-family="system-ui,sans-serif" font-size="9">Exact tier match: 67% | Within 1 tier: 96%</text>
|
|
63
|
+
</svg>
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 340" width="420" height="340">
|
|
2
|
+
<rect width="420" height="340" fill="#fefefe"/>
|
|
3
|
+
|
|
4
|
+
<!-- Title -->
|
|
5
|
+
<text x="210" y="22" text-anchor="middle" fill="#111" font-family="system-ui,sans-serif" font-size="13" font-weight="600">Confusion Matrix — Routing Decisions (n=200)</text>
|
|
6
|
+
<text x="210" y="38" text-anchor="middle" fill="#666" font-family="system-ui,sans-serif" font-size="9">Predicted tier vs actual tier</text>
|
|
7
|
+
|
|
8
|
+
<!-- Matrix: 4x4, each cell 60x45 -->
|
|
9
|
+
<!-- Actual label on left, Predicted on top -->
|
|
10
|
+
<!-- free: 50, cheap: 60, mid: 50, premium: 40 -->
|
|
11
|
+
|
|
12
|
+
<!-- Column headers -->
|
|
13
|
+
<text x="120" y="58" text-anchor="middle" fill="#333" font-family="system-ui,sans-serif" font-size="10" font-weight="600">free</text>
|
|
14
|
+
<text x="180" y="58" text-anchor="middle" fill="#333" font-family="system-ui,sans-serif" font-size="10" font-weight="600">cheap</text>
|
|
15
|
+
<text x="240" y="58" text-anchor="middle" fill="#333" font-family="system-ui,sans-serif" font-size="10" font-weight="600">mid</text>
|
|
16
|
+
<text x="300" y="58" text-anchor="middle" fill="#333" font-family="system-ui,sans-serif" font-size="10" font-weight="600">premium</text>
|
|
17
|
+
|
|
18
|
+
<!-- Row: free (actual=50) | predicted: free=48, cheap=2, mid=0, premium=0 -->
|
|
19
|
+
<text x="85" y="100" text-anchor="end" fill="#333" font-family="system-ui,sans-serif" font-size="10" font-weight="600">free</text>
|
|
20
|
+
<text x="85" y="115" text-anchor="end" fill="#888" font-family="system-ui,sans-serif" font-size="8">(n=50)</text>
|
|
21
|
+
<!-- free→free: 48/50=96% -->
|
|
22
|
+
<rect x="105" y="80" width="55" height="35" fill="#16a34a" rx="2"/>
|
|
23
|
+
<text x="132" y="102" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="13" font-weight="600">48</text>
|
|
24
|
+
<!-- free→cheap: 2 -->
|
|
25
|
+
<rect x="165" y="80" width="55" height="35" fill="#bbf7d0" rx="2"/>
|
|
26
|
+
<text x="192" y="102" text-anchor="middle" fill="#16634a" font-family="system-ui,sans-serif" font-size="12">2</text>
|
|
27
|
+
<!-- free→mid: 0 -->
|
|
28
|
+
<rect x="225" y="80" width="55" height="35" fill="#d1fae5" rx="2"/>
|
|
29
|
+
<text x="252" y="102" text-anchor="middle" fill="#16634a" font-family="system-ui,sans-serif" font-size="12">0</text>
|
|
30
|
+
<!-- free→premium: 0 -->
|
|
31
|
+
<rect x="285" y="80" width="55" height="35" fill="#d1fae5" rx="2"/>
|
|
32
|
+
<text x="312" y="102" text-anchor="middle" fill="#16634a" font-family="system-ui,sans-serif" font-size="12">0</text>
|
|
33
|
+
|
|
34
|
+
<!-- Row: cheap (actual=60) | predicted: free=13, cheap=45, mid=1, premium=1 -->
|
|
35
|
+
<text x="85" y="145" text-anchor="end" fill="#333" font-family="system-ui,sans-serif" font-size="10" font-weight="600">cheap</text>
|
|
36
|
+
<text x="85" y="160" text-anchor="end" fill="#888" font-family="system-ui,sans-serif" font-size="8">(n=60)</text>
|
|
37
|
+
<!-- cheap→free: 13 -->
|
|
38
|
+
<rect x="105" y="125" width="55" height="35" fill="#fef08a" rx="2"/>
|
|
39
|
+
<text x="132" y="147" text-anchor="middle" fill="#713f12" font-family="system-ui,sans-serif" font-size="12">13</text>
|
|
40
|
+
<!-- cheap→cheap: 45/60=75% -->
|
|
41
|
+
<rect x="165" y="125" width="55" height="35" fill="#16a34a" rx="2"/>
|
|
42
|
+
<text x="192" y="147" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="13" font-weight="600">45</text>
|
|
43
|
+
<!-- cheap→mid: 1 -->
|
|
44
|
+
<rect x="225" y="125" width="55" height="35" fill="#d1fae5" rx="2"/>
|
|
45
|
+
<text x="252" y="147" text-anchor="middle" fill="#16634a" font-family="system-ui,sans-serif" font-size="12">1</text>
|
|
46
|
+
<!-- cheap→premium: 1 -->
|
|
47
|
+
<rect x="285" y="125" width="55" height="35" fill="#d1fae5" rx="2"/>
|
|
48
|
+
<text x="312" y="147" text-anchor="middle" fill="#16634a" font-family="system-ui,sans-serif" font-size="12">1</text>
|
|
49
|
+
|
|
50
|
+
<!-- Row: mid (actual=50) | predicted: free=1, cheap=22, mid=18, premium=9 -->
|
|
51
|
+
<text x="85" y="190" text-anchor="end" fill="#333" font-family="system-ui,sans-serif" font-size="10" font-weight="600">mid</text>
|
|
52
|
+
<text x="85" y="205" text-anchor="end" fill="#888" font-family="system-ui,sans-serif" font-size="8">(n=50)</text>
|
|
53
|
+
<!-- mid→free: 1 -->
|
|
54
|
+
<rect x="105" y="170" width="55" height="35" fill="#d1fae5" rx="2"/>
|
|
55
|
+
<text x="132" y="192" text-anchor="middle" fill="#16634a" font-family="system-ui,sans-serif" font-size="12">1</text>
|
|
56
|
+
<!-- mid→cheap: 22 (most common error) -->
|
|
57
|
+
<rect x="165" y="170" width="55" height="35" fill="#fef08a" rx="2"/>
|
|
58
|
+
<text x="192" y="192" text-anchor="middle" fill="#713f12" font-family="system-ui,sans-serif" font-size="12">22</text>
|
|
59
|
+
<!-- mid→mid: 18/50=36% -->
|
|
60
|
+
<rect x="225" y="170" width="55" height="35" fill="#16a34a" rx="2"/>
|
|
61
|
+
<text x="252" y="192" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="13" font-weight="600">18</text>
|
|
62
|
+
<!-- mid→premium: 9 -->
|
|
63
|
+
<rect x="285" y="170" width="55" height="35" fill="#fef08a" rx="2"/>
|
|
64
|
+
<text x="312" y="192" text-anchor="middle" fill="#713f12" font-family="system-ui,sans-serif" font-size="12">9</text>
|
|
65
|
+
|
|
66
|
+
<!-- Row: premium (actual=40) | predicted: free=2, cheap=4, mid=11, premium=23 -->
|
|
67
|
+
<text x="85" y="235" text-anchor="end" fill="#333" font-family="system-ui,sans-serif" font-size="10" font-weight="600">premium</text>
|
|
68
|
+
<text x="85" y="250" text-anchor="end" fill="#888" font-family="system-ui,sans-serif" font-size="8">(n=40)</text>
|
|
69
|
+
<!-- premium→free: 2 -->
|
|
70
|
+
<rect x="105" y="215" width="55" height="35" fill="#d1fae5" rx="2"/>
|
|
71
|
+
<text x="132" y="237" text-anchor="middle" fill="#16634a" font-family="system-ui,sans-serif" font-size="12">2</text>
|
|
72
|
+
<!-- premium→cheap: 4 -->
|
|
73
|
+
<rect x="165" y="215" width="55" height="35" fill="#d1fae5" rx="2"/>
|
|
74
|
+
<text x="192" y="237" text-anchor="middle" fill="#16634a" font-family="system-ui,sans-serif" font-size="12">4</text>
|
|
75
|
+
<!-- premium→mid: 11 -->
|
|
76
|
+
<rect x="225" y="215" width="55" height="35" fill="#fef08a" rx="2"/>
|
|
77
|
+
<text x="252" y="237" text-anchor="middle" fill="#713f12" font-family="system-ui,sans-serif" font-size="12">11</text>
|
|
78
|
+
<!-- premium→premium: 23/40=57.5% -->
|
|
79
|
+
<rect x="285" y="215" width="55" height="35" fill="#16a34a" rx="2"/>
|
|
80
|
+
<text x="312" y="237" text-anchor="middle" fill="#fff" font-family="system-ui,sans-serif" font-size="13" font-weight="600">23</text>
|
|
81
|
+
|
|
82
|
+
<!-- Y-axis label (actual) -->
|
|
83
|
+
<text x="18" y="165" text-anchor="middle" fill="#555" font-family="system-ui,sans-serif" font-size="10" transform="rotate(-90,18,165)">Actual Tier</text>
|
|
84
|
+
|
|
85
|
+
<!-- X-axis label (predicted) -->
|
|
86
|
+
<text x="210" y="268" text-anchor="middle" fill="#555" font-family="system-ui,sans-serif" font-size="10">Predicted Tier</text>
|
|
87
|
+
|
|
88
|
+
<!-- Legend -->
|
|
89
|
+
<rect x="105" y="278" width="12" height="12" fill="#16a34a" rx="2"/>
|
|
90
|
+
<text x="122" y="288" fill="#333" font-family="system-ui,sans-serif" font-size="9">Correct</text>
|
|
91
|
+
<rect x="165" y="278" width="12" height="12" fill="#fef08a" rx="2"/>
|
|
92
|
+
<text x="182" y="288" fill="#333" font-family="system-ui,sans-serif" font-size="9">Off by 1 tier</text>
|
|
93
|
+
<rect x="245" y="278" width="12" height="12" fill="#d1fae5" rx="2"/>
|
|
94
|
+
<text x="262" y="288" fill="#333" font-family="system-ui,sans-serif" font-size="9">Off by 2+ tiers</text>
|
|
95
|
+
|
|
96
|
+
<!-- Summary -->
|
|
97
|
+
<text x="210" y="310" text-anchor="middle" fill="#555" font-family="system-ui,sans-serif" font-size="9">Exact match: 67% (134/200) | Off by 1: 29% (58/200) | Off by 2+: 4% (8/200)</text>
|
|
98
|
+
</svg>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 280" width="420" height="280">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="costBg" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
4
|
+
<stop offset="0%" stop-color="#1e293b"/>
|
|
5
|
+
<stop offset="100%" stop-color="#0f172a"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
|
|
9
|
+
<rect width="420" height="280" fill="url(#costBg)" rx="8"/>
|
|
10
|
+
|
|
11
|
+
<!-- Title -->
|
|
12
|
+
<text x="210" y="28" text-anchor="middle" fill="#f1f5f9" font-family="system-ui,sans-serif" font-size="14" font-weight="600">Cost per 1K Tokens — Router Comparison</text>
|
|
13
|
+
<text x="210" y="44" text-anchor="middle" fill="#64748b" font-family="system-ui,sans-serif" font-size="10">Lower is better | All values from RouterArena evaluation (PR#144)</text>
|
|
14
|
+
|
|
15
|
+
<!-- Y-axis: 0 to $0.30, mapped 190px -->
|
|
16
|
+
<!-- Scale: $0.30 = 190px → $1 = 633px, $0.01 = 6.33px -->
|
|
17
|
+
|
|
18
|
+
<g transform="translate(55,58)">
|
|
19
|
+
<!-- Y-axis -->
|
|
20
|
+
<line x1="40" y1="0" x2="40" y2="190" stroke="#334155" stroke-width="1.5"/>
|
|
21
|
+
<line x1="40" y1="190" x2="360" y2="190" stroke="#334155" stroke-width="1.5"/>
|
|
22
|
+
|
|
23
|
+
<!-- Y-axis gridlines (every $0.05) -->
|
|
24
|
+
<g stroke="#1e293b" stroke-width="1">
|
|
25
|
+
<line x1="40" y1="0" x2="360" y2="0"/> <!-- $0.30 -->
|
|
26
|
+
<line x1="40" y1="31.7" x2="360" y2="31.7"/> <!-- $0.25 -->
|
|
27
|
+
<line x1="40" y1="63.3" x2="360" y2="63.3"/> <!-- $0.20 -->
|
|
28
|
+
<line x1="40" y1="95" x2="360" y2="95"/> <!-- $0.15 -->
|
|
29
|
+
<line x1="40" y1="126.7" x2="360" y2="126.7"/> <!-- $0.10 -->
|
|
30
|
+
<line x1="40" y1="158.3" x2="360" y2="158.3"/> <!-- $0.05 -->
|
|
31
|
+
<line x1="40" y1="190" x2="360" y2="190"/> <!-- $0 -->
|
|
32
|
+
</g>
|
|
33
|
+
|
|
34
|
+
<!-- Y-axis labels -->
|
|
35
|
+
<g fill="#64748b" font-family="system-ui,sans-serif" font-size="10" text-anchor="end">
|
|
36
|
+
<text x="35" y="4">$0.30</text>
|
|
37
|
+
<text x="35" y="66">$0.20</text>
|
|
38
|
+
<text x="35" y="127">$0.10</text>
|
|
39
|
+
<text x="35" y="194">$0</text>
|
|
40
|
+
</g>
|
|
41
|
+
|
|
42
|
+
<!-- Bar 1: A3M Router $0.0768 = 49px → y=141, h=49 -->
|
|
43
|
+
<rect x="60" y="141" width="70" height="49" fill="#22c55e" rx="3"/>
|
|
44
|
+
<text x="95" y="135" text-anchor="middle" fill="#4ade80" font-family="system-ui,sans-serif" font-size="12" font-weight="600">$0.0768</text>
|
|
45
|
+
<text x="95" y="207" text-anchor="middle" fill="#94a3b8" font-family="system-ui,sans-serif" font-size="10">A3M Router</text>
|
|
46
|
+
<text x="95" y="219" text-anchor="middle" fill="#64748b" font-family="system-ui,sans-serif" font-size="8">(this work)</text>
|
|
47
|
+
|
|
48
|
+
<!-- Bar 2: Sqwish $0.18 = 114px → y=76, h=114 -->
|
|
49
|
+
<rect x="160" y="76" width="70" height="114" fill="#94a3b8" rx="3" opacity="0.7"/>
|
|
50
|
+
<text x="195" y="70" text-anchor="middle" fill="#cbd5e1" font-family="system-ui,sans-serif" font-size="12" font-weight="600">$0.18</text>
|
|
51
|
+
<text x="195" y="207" text-anchor="middle" fill="#94a3b8" font-family="system-ui,sans-serif" font-size="10">Sqwish</text>
|
|
52
|
+
|
|
53
|
+
<!-- Bar 3: Azure-Model-Router $0.22 = 139px → y=51, h=139 -->
|
|
54
|
+
<rect x="260" y="51" width="70" height="139" fill="#94a3b8" rx="3" opacity="0.5"/>
|
|
55
|
+
<text x="295" y="45" text-anchor="middle" fill="#cbd5e1" font-family="system-ui,sans-serif" font-size="12" font-weight="600">$0.22</text>
|
|
56
|
+
<text x="295" y="207" text-anchor="middle" fill="#94a3b8" font-family="system-ui,sans-serif" font-size="10">Azure-Router</text>
|
|
57
|
+
|
|
58
|
+
<!-- Bar 4: RouteLLM $0.27 = 171px → y=19, h=171 -->
|
|
59
|
+
<rect x="360" y="19" width="70" height="171" fill="#94a3b8" rx="3" opacity="0.35"/>
|
|
60
|
+
<text x="395" y="13" text-anchor="middle" fill="#94a3b8" font-family="system-ui,sans-serif" font-size="12" font-weight="600">$0.27</text>
|
|
61
|
+
<text x="395" y="207" text-anchor="middle" fill="#94a3b8" font-family="system-ui,sans-serif" font-size="10">RouteLLM</text>
|
|
62
|
+
</g>
|
|
63
|
+
|
|
64
|
+
<!-- A3M savings annotation -->
|
|
65
|
+
<text x="210" y="265" text-anchor="middle" fill="#64748b" font-family="system-ui,sans-serif" font-size="9">A3M is 3.5x cheaper than RouteLLM | 2.3x cheaper than Sqwish | 2.9x cheaper than Azure-Router</text>
|
|
66
|
+
</svg>
|