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,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A3M Router - HTTP Route Registry
|
|
3
|
+
*
|
|
4
|
+
* Pluggable route table pattern replacing monolithic if/else routing.
|
|
5
|
+
* Adding a new endpoint = 1 handler file + 1 registration line.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { createRouter, registerRoute } from './router';
|
|
9
|
+
* registerRoute('GET', /^\/health$/, handleHealth);
|
|
10
|
+
* registerRoute('POST', /^\/v1\/chat\/completions$/, handleChatCompletions);
|
|
11
|
+
* const router = createRouter();
|
|
12
|
+
* server.use(router);
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import * as http from 'http';
|
|
16
|
+
|
|
17
|
+
// ============================================================
|
|
18
|
+
// TYPES
|
|
19
|
+
// ============================================================
|
|
20
|
+
|
|
21
|
+
export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS';
|
|
22
|
+
|
|
23
|
+
export interface RouteContext {
|
|
24
|
+
requestId: string;
|
|
25
|
+
startTime: number;
|
|
26
|
+
method: HTTPMethod;
|
|
27
|
+
path: string;
|
|
28
|
+
query: Record<string, string>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type RouteHandler = (
|
|
32
|
+
req: http.IncomingMessage,
|
|
33
|
+
res: http.ServerResponse,
|
|
34
|
+
ctx: RouteContext
|
|
35
|
+
) => Promise<void> | void;
|
|
36
|
+
|
|
37
|
+
export interface Route {
|
|
38
|
+
method: HTTPMethod;
|
|
39
|
+
pattern: RegExp;
|
|
40
|
+
handler: RouteHandler;
|
|
41
|
+
name: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// ============================================================
|
|
45
|
+
// ROUTE REGISTRY
|
|
46
|
+
// ============================================================
|
|
47
|
+
|
|
48
|
+
const routes: Route[] = [];
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Generate a short request ID.
|
|
52
|
+
*/
|
|
53
|
+
function generateRequestId(): string {
|
|
54
|
+
return 'req-' + Math.random().toString(36).substring(2, 10) + Date.now().toString(36);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Parse query string from URL.
|
|
59
|
+
*/
|
|
60
|
+
function parseQuery(url: string): Record<string, string> {
|
|
61
|
+
try {
|
|
62
|
+
const urlObj = new URL(url, 'http://localhost');
|
|
63
|
+
const query: Record<string, string> = {};
|
|
64
|
+
urlObj.searchParams.forEach((value, key) => {
|
|
65
|
+
query[key] = value;
|
|
66
|
+
});
|
|
67
|
+
return query;
|
|
68
|
+
} catch {
|
|
69
|
+
return {};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Parse HTTP method safely.
|
|
75
|
+
*/
|
|
76
|
+
function parseMethod(method: string | undefined): HTTPMethod {
|
|
77
|
+
const m = (method || 'GET').toUpperCase();
|
|
78
|
+
if (['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'].includes(m)) {
|
|
79
|
+
return m as HTTPMethod;
|
|
80
|
+
}
|
|
81
|
+
return 'GET';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Register a route. Routes are matched in registration order.
|
|
86
|
+
*/
|
|
87
|
+
export function registerRoute(
|
|
88
|
+
method: HTTPMethod,
|
|
89
|
+
pattern: RegExp,
|
|
90
|
+
handler: RouteHandler,
|
|
91
|
+
name?: string
|
|
92
|
+
): void {
|
|
93
|
+
routes.push({ method, pattern, handler, name: name || `${method} ${pattern}` });
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Create the request handler function for the registered routes.
|
|
98
|
+
* Returns a function compatible with http.createServer's requestListener.
|
|
99
|
+
*/
|
|
100
|
+
export function createRequestHandler(): (req: http.IncomingMessage, res: http.ServerResponse) => Promise<void> {
|
|
101
|
+
return async function handleRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise<void> {
|
|
102
|
+
const method = parseMethod(req.method);
|
|
103
|
+
const url = req.url || '/';
|
|
104
|
+
const ctx: RouteContext = {
|
|
105
|
+
requestId: generateRequestId(),
|
|
106
|
+
startTime: Date.now(),
|
|
107
|
+
method,
|
|
108
|
+
path: url.split('?')[0],
|
|
109
|
+
query: parseQuery(url),
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// CORS preflight
|
|
113
|
+
if (method === 'OPTIONS') {
|
|
114
|
+
res.writeHead(204, {
|
|
115
|
+
'Access-Control-Allow-Origin': '*',
|
|
116
|
+
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
|
|
117
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization, x-request-id',
|
|
118
|
+
'Access-Control-Max-Age': '86400',
|
|
119
|
+
});
|
|
120
|
+
res.end();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Find matching route
|
|
125
|
+
for (const route of routes) {
|
|
126
|
+
if (route.method !== method) continue;
|
|
127
|
+
const match = ctx.path.match(route.pattern);
|
|
128
|
+
if (match) {
|
|
129
|
+
try {
|
|
130
|
+
await route.handler(req, res, ctx);
|
|
131
|
+
} catch (err: any) {
|
|
132
|
+
console.error(`[a3m-router] Route ${route.name} error: ${err.message}`);
|
|
133
|
+
if (!res.headersSent) {
|
|
134
|
+
res.writeHead(500, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
|
|
135
|
+
res.end(JSON.stringify({ error: { message: err.message, type: 'server_error' } }));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// No route matched — 404
|
|
143
|
+
if (!res.headersSent) {
|
|
144
|
+
res.writeHead(404, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
|
|
145
|
+
res.end(JSON.stringify({ error: { message: `Not found: ${method} ${url}`, type: 'not_found' } }));
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Get all registered routes (for debugging and /routes endpoint).
|
|
152
|
+
*/
|
|
153
|
+
export function getRegisteredRoutes(): Route[] {
|
|
154
|
+
return [...routes];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export default { registerRoute, createRequestHandler, getRegisteredRoutes };
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
|
|
8
|
+
import { CostTracker } from '../cost/costTracker';
|
|
9
|
+
|
|
10
|
+
// ============================================================
|
|
11
|
+
// SHARED STATE
|
|
12
|
+
// ============================================================
|
|
13
|
+
|
|
14
|
+
/** Singleton cost tracker instance */
|
|
15
|
+
export const costTracker = new CostTracker();
|
|
16
|
+
|
|
17
|
+
/** In-memory request log (last 1000 entries) */
|
|
18
|
+
export interface RequestLog {
|
|
19
|
+
id: string;
|
|
20
|
+
model: string;
|
|
21
|
+
resolvedProvider: string;
|
|
22
|
+
resolvedModel: string;
|
|
23
|
+
latencyMs: number;
|
|
24
|
+
tokensIn: number;
|
|
25
|
+
tokensOut: number;
|
|
26
|
+
cost: number;
|
|
27
|
+
status: 'success' | 'error';
|
|
28
|
+
error?: string;
|
|
29
|
+
timestamp: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const requestLogs: RequestLog[] = [];
|
|
33
|
+
|
|
34
|
+
export default { costTracker, requestLogs };
|