adaptive-memory-multi-model-router 2.14.60 → 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.
Files changed (146) hide show
  1. package/.github/ISSUE_TEMPLATE/checklist.md +35 -0
  2. package/.github/workflows/ci.yml +9 -6
  3. package/POPULARITY_BOOSTERS.md +18 -0
  4. package/README.md +222 -1039
  5. package/assets/chart-accuracy-by-tier.svg +63 -0
  6. package/assets/chart-confusion-matrix.svg +98 -0
  7. package/assets/chart-cost-comparison.svg +66 -0
  8. package/assets/chart-latency-overhead.svg +102 -0
  9. package/assets/chart-routerena-leaderboard.svg +76 -0
  10. package/dist/analytics/costAnalytics.d.ts +1 -0
  11. package/dist/benchmark/comprehensive.d.ts +4 -53
  12. package/dist/benchmark/comprehensive.d.ts.map +1 -0
  13. package/dist/benchmark/comprehensive.js +112 -214
  14. package/dist/benchmark/comprehensive.js.map +1 -1
  15. package/dist/benchmark/reproducible.d.ts +1 -0
  16. package/dist/cache/semanticCache.d.ts +1 -0
  17. package/dist/cli/setupWizard.d.ts +6 -1
  18. package/dist/cli/setupWizard.d.ts.map +1 -1
  19. package/dist/cli/setupWizard.js +6 -9
  20. package/dist/cli/setupWizard.js.map +1 -1
  21. package/dist/cli.js +15 -14
  22. package/dist/cost/budgetEnforcer.d.ts +1 -0
  23. package/dist/cost/costTracker.d.ts +1 -0
  24. package/dist/ensemble/multiRoundDialog.d.ts +1 -0
  25. package/dist/ensemble/multiRoundDialog.d.ts.map +1 -0
  26. package/dist/ensemble/shapleyValue.d.ts +1 -0
  27. package/dist/ensemble/shapleyValue.d.ts.map +1 -0
  28. package/dist/ensemble.d.ts +1 -0
  29. package/dist/index.d.ts +1 -0
  30. package/dist/integrations/langchainAdapter.d.ts +1 -0
  31. package/dist/integrations/oauth.d.ts +1 -0
  32. package/dist/integrations/scienceAdapter.d.ts +1 -0
  33. package/dist/integrations/scienceAdapter.d.ts.map +1 -0
  34. package/dist/memory/autoFetch.d.ts +1 -0
  35. package/dist/memory/hybridMemory.d.ts +1 -0
  36. package/dist/memory/hybridMemory.d.ts.map +1 -0
  37. package/dist/memory/memoryTree.d.ts +1 -0
  38. package/dist/memory/memoryTree.d.ts.map +1 -1
  39. package/dist/memory/obsidianVault.d.ts +1 -0
  40. package/dist/memory/obsidianVault.d.ts.map +1 -1
  41. package/dist/memory/reasoningBank.d.ts +1 -0
  42. package/dist/memory/reasoningBank.d.ts.map +1 -0
  43. package/dist/observability/changeWatch.d.ts +1 -0
  44. package/dist/observability/fatigueDetector.d.ts +1 -0
  45. package/dist/observability/index.d.ts +1 -0
  46. package/dist/observability/metrics.d.ts +1 -0
  47. package/dist/observability/metrics.d.ts.map +1 -1
  48. package/dist/observability/middleware.d.ts +1 -0
  49. package/dist/observability/tracer.d.ts +1 -0
  50. package/dist/observability/tracer.d.ts.map +1 -1
  51. package/dist/observability/types.d.ts +1 -0
  52. package/dist/providers/providerConfig.d.ts +1 -0
  53. package/dist/providers/providerConfig.d.ts.map +1 -1
  54. package/dist/routing/advancedRouter.d.ts +2 -1
  55. package/dist/routing/advancedRouter.d.ts.map +1 -1
  56. package/dist/routing/crossModelValidation.d.ts +1 -0
  57. package/dist/routing/providerHealth.d.ts +1 -0
  58. package/dist/routing/providerHealth.d.ts.map +1 -1
  59. package/dist/routing/providerRetry.d.ts +1 -0
  60. package/dist/sdk.d.ts +1 -0
  61. package/dist/security/guardrails.d.ts +1 -0
  62. package/dist/security/guardrails.d.ts.map +1 -1
  63. package/dist/server/dashboard.d.ts +1 -0
  64. package/dist/server/handlers/chatHandler.d.ts +11 -0
  65. package/dist/server/handlers/chatHandler.d.ts.map +1 -0
  66. package/dist/server/handlers/chatHandler.js +159 -0
  67. package/dist/server/handlers/chatHandler.js.map +1 -0
  68. package/dist/server/handlers/completionsHandler.d.ts +10 -0
  69. package/dist/server/handlers/completionsHandler.d.ts.map +1 -0
  70. package/dist/server/handlers/completionsHandler.js +124 -0
  71. package/dist/server/handlers/completionsHandler.js.map +1 -0
  72. package/dist/server/handlers/embeddingsHandler.d.ts +17 -0
  73. package/dist/server/handlers/embeddingsHandler.d.ts.map +1 -0
  74. package/dist/server/handlers/embeddingsHandler.js +235 -0
  75. package/dist/server/handlers/embeddingsHandler.js.map +1 -0
  76. package/dist/server/handlers/healthHandler.d.ts +10 -0
  77. package/dist/server/handlers/healthHandler.d.ts.map +1 -0
  78. package/dist/server/handlers/healthHandler.js +49 -0
  79. package/dist/server/handlers/healthHandler.js.map +1 -0
  80. package/dist/server/handlers/metricsHandler.d.ts +11 -0
  81. package/dist/server/handlers/metricsHandler.d.ts.map +1 -0
  82. package/dist/server/handlers/metricsHandler.js +24 -0
  83. package/dist/server/handlers/metricsHandler.js.map +1 -0
  84. package/dist/server/handlers/modelsHandler.d.ts +10 -0
  85. package/dist/server/handlers/modelsHandler.d.ts.map +1 -0
  86. package/dist/server/handlers/modelsHandler.js +19 -0
  87. package/dist/server/handlers/modelsHandler.js.map +1 -0
  88. package/dist/server/metrics.d.ts +96 -0
  89. package/dist/server/metrics.d.ts.map +1 -0
  90. package/dist/server/metrics.js +267 -0
  91. package/dist/server/metrics.js.map +1 -0
  92. package/dist/server/modelMapper.d.ts +1 -0
  93. package/dist/server/proxyServer.d.ts +53 -17
  94. package/dist/server/proxyServer.d.ts.map +1 -1
  95. package/dist/server/proxyServer.js +66 -303
  96. package/dist/server/proxyServer.js.map +1 -1
  97. package/dist/server/router.d.ts +49 -0
  98. package/dist/server/router.d.ts.map +1 -0
  99. package/dist/server/router.js +120 -0
  100. package/dist/server/router.js.map +1 -0
  101. package/dist/server/state.d.ts +30 -0
  102. package/dist/server/state.d.ts.map +1 -0
  103. package/dist/server/state.js +18 -0
  104. package/dist/server/state.js.map +1 -0
  105. package/dist/skills/__tests__/skill_manager.test.d.ts +3 -0
  106. package/dist/skills/__tests__/skill_manager.test.d.ts.map +1 -1
  107. package/dist/skills/__tests__/skill_manager.test.js +3 -6
  108. package/dist/skills/__tests__/skill_manager.test.js.map +1 -1
  109. package/dist/tui/dashboard.d.ts +1 -0
  110. package/dist/tui/index.d.ts +1 -0
  111. package/dist/utils/costUtils.d.ts +1 -0
  112. package/dist/utils/reliability.js +4 -18
  113. package/dist/utils/sorting.d.ts +1 -0
  114. package/dist/utils/tokenUtils.d.ts +1 -0
  115. package/docs/assets/chart-accuracy-by-tier.svg +63 -0
  116. package/docs/assets/chart-confusion-matrix.svg +98 -0
  117. package/docs/assets/chart-cost-comparison.svg +66 -0
  118. package/docs/assets/chart-latency-overhead.svg +102 -0
  119. package/docs/assets/chart-routerena-leaderboard.svg +76 -0
  120. package/docs/index.html +72 -80
  121. package/docs/llms-full.txt +156 -184
  122. package/docs/llms.txt +77 -42
  123. package/hf-space/app.py +3 -3
  124. package/llms-full.txt +156 -184
  125. package/llms.txt +77 -42
  126. package/mcp-server/package.json +6 -0
  127. package/mcp-server/tsconfig.json +3 -2
  128. package/package.json +2 -2
  129. package/src/server/handlers/chatHandler.ts +173 -0
  130. package/src/server/handlers/completionsHandler.ts +120 -0
  131. package/src/server/handlers/embeddingsHandler.ts +271 -0
  132. package/src/server/handlers/healthHandler.ts +57 -0
  133. package/src/server/handlers/metricsHandler.ts +30 -0
  134. package/src/server/handlers/modelsHandler.ts +25 -0
  135. package/src/server/metrics.ts +303 -0
  136. package/src/server/proxyServer.ts +71 -394
  137. package/src/server/router.ts +157 -0
  138. package/src/server/state.ts +34 -0
  139. package/src/skills/__tests__/skill_manager.test.ts +3 -3
  140. package/NEW_OPPORTUNITIES.md +0 -163
  141. package/NEW_SUBMISSIONS.md +0 -80
  142. package/PRIORITY_REDDIT_TARGETS.md +0 -53
  143. package/VISIBILITY_PLAN.md +0 -146
  144. package/articles/TWITTER_THREAD_IMPLICATIONS.md +0 -182
  145. package/articles/TWITTER_THREAD_VAULT.md +0 -164
  146. package/index.html +0 -667
@@ -0,0 +1 @@
1
+ {"version":3,"file":"healthHandler.js","sourceRoot":"","sources":["../../../src/server/handlers/healthHandler.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAYH,oCAsCC;AA9CD,mEAAuE;AACvE,oCAAoD;AAEpD,SAAS,YAAY,CAAC,GAAwB,EAAE,UAAkB,EAAE,IAAY;IAC9E,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IACtG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,IAA0B,EAC1B,GAAwB,EACxB,IAAkB;IAElB,MAAM,SAAS,GAAG,IAAA,sCAAqB,GAAE,CAAC;IAC1C,MAAM,cAAc,GAA2B,EAAE,CAAC;IAClD,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC;QACtD,cAAc,CAAC,EAAE,CAAC,GAAG;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;YACzB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC;YACpC,SAAS,EAAE,WAAW;SACvB,CAAC;QACF,IAAI,WAAW;YAAE,YAAY,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,WAAW,GAAG,mBAAW,CAAC,UAAU,EAAE,CAAC;IAE7C,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE;QACrB,MAAM,EAAE,IAAI;QACZ,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM;YACpC,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE,cAAc;SACxB;QACD,IAAI,EAAE;YACJ,KAAK,EAAE,WAAW,CAAC,UAAU;YAC7B,QAAQ,EAAE,WAAW,CAAC,aAAa;SACpC;QACD,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;QACxB,cAAc,EAAE,mBAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;KACvC,CAAC,CAAC;AACL,CAAC;AAED,kBAAe,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * A3M Router - Prometheus Metrics Handler
3
+ *
4
+ * Handles GET /metrics
5
+ * Returns Prometheus-compatible metrics output.
6
+ */
7
+ import * as http from 'http';
8
+ import { RouteContext } from '../router';
9
+ export declare function handleMetrics(_req: http.IncomingMessage, res: http.ServerResponse, _ctx: RouteContext): void;
10
+ export default handleMetrics;
11
+ //# sourceMappingURL=metricsHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metricsHandler.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/metricsHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,CAAC,eAAe,EAC1B,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,IAAI,EAAE,YAAY,GACjB,IAAI,CAGN;AAED,eAAe,aAAa,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * A3M Router - Prometheus Metrics Handler
4
+ *
5
+ * Handles GET /metrics
6
+ * Returns Prometheus-compatible metrics output.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.handleMetrics = handleMetrics;
10
+ const metrics_1 = require("../metrics");
11
+ function textResponse(res, statusCode, body) {
12
+ res.writeHead(statusCode, {
13
+ 'Content-Type': 'text/plain; version=0.0.4; charset=utf-8',
14
+ 'Access-Control-Allow-Origin': '*',
15
+ 'Cache-Control': 'no-cache',
16
+ });
17
+ res.end(body);
18
+ }
19
+ function handleMetrics(_req, res, _ctx) {
20
+ const output = (0, metrics_1.generatePrometheusMetrics)();
21
+ textResponse(res, 200, output);
22
+ }
23
+ exports.default = handleMetrics;
24
+ //# sourceMappingURL=metricsHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metricsHandler.js","sourceRoot":"","sources":["../../../src/server/handlers/metricsHandler.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAeH,sCAOC;AAlBD,wCAAuD;AAEvD,SAAS,YAAY,CAAC,GAAwB,EAAE,UAAkB,EAAE,IAAY;IAC9E,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE;QACxB,cAAc,EAAE,0CAA0C;QAC1D,6BAA6B,EAAE,GAAG;QAClC,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAgB,aAAa,CAC3B,IAA0B,EAC1B,GAAwB,EACxB,IAAkB;IAElB,MAAM,MAAM,GAAG,IAAA,mCAAyB,GAAE,CAAC;IAC3C,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,kBAAe,aAAa,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * A3M Router - Models Handler
3
+ *
4
+ * Handles GET /v1/models
5
+ */
6
+ import * as http from 'http';
7
+ import { RouteContext } from '../router';
8
+ export declare function handleModels(_req: http.IncomingMessage, res: http.ServerResponse, _ctx: RouteContext): void;
9
+ export default handleModels;
10
+ //# sourceMappingURL=modelsHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelsHandler.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/modelsHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,CAAC,eAAe,EAC1B,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,IAAI,EAAE,YAAY,GACjB,IAAI,CAGN;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ /**
3
+ * A3M Router - Models Handler
4
+ *
5
+ * Handles GET /v1/models
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.handleModels = handleModels;
9
+ const modelMapper_1 = require("../modelMapper");
10
+ function jsonResponse(res, statusCode, body) {
11
+ res.writeHead(statusCode, { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
12
+ res.end(JSON.stringify(body));
13
+ }
14
+ function handleModels(_req, res, _ctx) {
15
+ const models = (0, modelMapper_1.listAvailableModels)();
16
+ jsonResponse(res, 200, { object: 'list', data: models });
17
+ }
18
+ exports.default = handleModels;
19
+ //# sourceMappingURL=modelsHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelsHandler.js","sourceRoot":"","sources":["../../../src/server/handlers/modelsHandler.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAWH,oCAOC;AAdD,gDAAqD;AAErD,SAAS,YAAY,CAAC,GAAwB,EAAE,UAAkB,EAAE,IAAY;IAC9E,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;IACtG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,SAAgB,YAAY,CAC1B,IAA0B,EAC1B,GAAwB,EACxB,IAAkB;IAElB,MAAM,MAAM,GAAG,IAAA,iCAAmB,GAAE,CAAC;IACrC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,kBAAe,YAAY,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * A3M Router - Prometheus Metrics
3
+ *
4
+ * Lightweight metrics collector for observability.
5
+ * Exports Prometheus-compatible /metrics endpoint.
6
+ *
7
+ * Metrics:
8
+ * a3m_requests_total{endpoint, provider, status} — Counter
9
+ * a3m_request_duration_ms{endpoint, provider} — Histogram
10
+ * a3m_cost_usd_total{provider} — Counter
11
+ * a3m_tokens_total{provider, type} — Counter
12
+ * a3m_cache_hits_total{cache_type} — Counter
13
+ * a3m_fallback_triggered_total{provider} — Counter
14
+ * a3m_provider_errors_total{provider, error_type} — Counter
15
+ * a3m_routing_decisions_total{model} — Counter
16
+ * a3m_active_requests — Gauge
17
+ */
18
+ export interface Counter {
19
+ value: number;
20
+ labels: Record<string, string>;
21
+ }
22
+ export interface Histogram {
23
+ values: number[];
24
+ count: number;
25
+ sum: number;
26
+ buckets: {
27
+ bound: number;
28
+ count: number;
29
+ }[];
30
+ }
31
+ export interface Gauge {
32
+ value: number;
33
+ }
34
+ /**
35
+ * Increment a counter by delta (default 1).
36
+ */
37
+ export declare function incrementCounter(name: string, labels?: Record<string, string>, delta?: number): void;
38
+ /**
39
+ * Record a histogram value (duration, size, etc.).
40
+ */
41
+ export declare function recordHistogram(name: string, labels: Record<string, string>, value: number): void;
42
+ /**
43
+ * Set a gauge value.
44
+ */
45
+ export declare function setGauge(name: string, labels: Record<string, string>, value: number): void;
46
+ /**
47
+ * Increment active requests gauge (call on start, decrement on end).
48
+ */
49
+ export declare function recordActiveRequest(delta: 1 | -1): void;
50
+ /**
51
+ * Get current active request count.
52
+ */
53
+ export declare function getActiveRequests(): number;
54
+ /**
55
+ * Generate Prometheus /metrics output.
56
+ */
57
+ export declare function generatePrometheusMetrics(): string;
58
+ /**
59
+ * Record a completed request with all metrics.
60
+ */
61
+ export declare function recordRequest(params: {
62
+ endpoint: string;
63
+ provider: string;
64
+ status: 'success' | 'error';
65
+ durationMs: number;
66
+ tokensIn?: number;
67
+ tokensOut?: number;
68
+ cost?: number;
69
+ model?: string;
70
+ }): void;
71
+ /**
72
+ * Record a provider error.
73
+ */
74
+ export declare function recordProviderError(provider: string, errorType: string): void;
75
+ /**
76
+ * Record a cache hit.
77
+ */
78
+ export declare function recordCacheHit(cacheType: 'semantic' | 'exact' | 'none'): void;
79
+ /**
80
+ * Record a fallback trigger.
81
+ */
82
+ export declare function recordFallback(provider: string): void;
83
+ declare const _default: {
84
+ incrementCounter: typeof incrementCounter;
85
+ recordHistogram: typeof recordHistogram;
86
+ setGauge: typeof setGauge;
87
+ recordActiveRequest: typeof recordActiveRequest;
88
+ getActiveRequests: typeof getActiveRequests;
89
+ generatePrometheusMetrics: typeof generatePrometheusMetrics;
90
+ recordRequest: typeof recordRequest;
91
+ recordProviderError: typeof recordProviderError;
92
+ recordCacheHit: typeof recordCacheHit;
93
+ recordFallback: typeof recordFallback;
94
+ };
95
+ export default _default;
96
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/server/metrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,KAAK;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AA6FD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EAAE,KAAK,SAAI,GAAG,IAAI,CAInG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CASjG;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI1F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAEvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAMD;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CA8ClD;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,IAAI,CAoBP;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAE7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAE7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAErD;;;;;;;;;;;;;AAED,wBAWE"}
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ /**
3
+ * A3M Router - Prometheus Metrics
4
+ *
5
+ * Lightweight metrics collector for observability.
6
+ * Exports Prometheus-compatible /metrics endpoint.
7
+ *
8
+ * Metrics:
9
+ * a3m_requests_total{endpoint, provider, status} — Counter
10
+ * a3m_request_duration_ms{endpoint, provider} — Histogram
11
+ * a3m_cost_usd_total{provider} — Counter
12
+ * a3m_tokens_total{provider, type} — Counter
13
+ * a3m_cache_hits_total{cache_type} — Counter
14
+ * a3m_fallback_triggered_total{provider} — Counter
15
+ * a3m_provider_errors_total{provider, error_type} — Counter
16
+ * a3m_routing_decisions_total{model} — Counter
17
+ * a3m_active_requests — Gauge
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.incrementCounter = incrementCounter;
21
+ exports.recordHistogram = recordHistogram;
22
+ exports.setGauge = setGauge;
23
+ exports.recordActiveRequest = recordActiveRequest;
24
+ exports.getActiveRequests = getActiveRequests;
25
+ exports.generatePrometheusMetrics = generatePrometheusMetrics;
26
+ exports.recordRequest = recordRequest;
27
+ exports.recordProviderError = recordProviderError;
28
+ exports.recordCacheHit = recordCacheHit;
29
+ exports.recordFallback = recordFallback;
30
+ // ============================================================
31
+ // METRICS STORE
32
+ // ============================================================
33
+ // Counters: { name: { labels: value } }
34
+ const counters = new Map();
35
+ // Histograms: { name: { labels: { values[], count, sum, buckets[] } } }
36
+ const histograms = new Map();
37
+ // Gauges: { name: { labels: value } }
38
+ const gauges = new Map();
39
+ // Metric definitions
40
+ const METRIC_DEFINITIONS = {
41
+ a3m_requests_total: { type: 'counter', help: 'Total requests' },
42
+ a3m_request_duration_ms: {
43
+ type: 'histogram',
44
+ help: 'Request duration in milliseconds',
45
+ buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000],
46
+ },
47
+ a3m_cost_usd_total: { type: 'counter', help: 'Total cost in USD' },
48
+ a3m_tokens_total: { type: 'counter', help: 'Total tokens' },
49
+ a3m_cache_hits_total: { type: 'counter', help: 'Cache hits' },
50
+ a3m_fallback_triggered_total: { type: 'counter', help: 'Fallback triggered count' },
51
+ a3m_provider_errors_total: { type: 'counter', help: 'Provider errors' },
52
+ a3m_routing_decisions_total: { type: 'counter', help: 'Routing decisions' },
53
+ a3m_active_requests: { type: 'gauge', help: 'Active requests' },
54
+ };
55
+ const LABEL_NAMES = {
56
+ a3m_requests_total: ['endpoint', 'provider', 'status'],
57
+ a3m_request_duration_ms: ['endpoint', 'provider'],
58
+ a3m_cost_usd_total: ['provider'],
59
+ a3m_tokens_total: ['provider', 'type'],
60
+ a3m_cache_hits_total: ['cache_type'],
61
+ a3m_fallback_triggered_total: ['provider'],
62
+ a3m_provider_errors_total: ['provider', 'error_type'],
63
+ a3m_routing_decisions_total: ['model'],
64
+ a3m_active_requests: [],
65
+ };
66
+ // ============================================================
67
+ // HELPERS
68
+ // ============================================================
69
+ function labelsToKey(labels) {
70
+ return Object.keys(labels)
71
+ .sort()
72
+ .map((k) => `${k}="${labels[k]}"`)
73
+ .join(',');
74
+ }
75
+ function getOrInitCounter(name, labels) {
76
+ if (!counters.has(name))
77
+ counters.set(name, new Map());
78
+ const counterMap = counters.get(name);
79
+ const key = labelsToKey(labels);
80
+ if (!counterMap.has(key))
81
+ counterMap.set(key, 0);
82
+ return counterMap;
83
+ }
84
+ function getOrInitHistogram(name, labels) {
85
+ if (!histograms.has(name))
86
+ histograms.set(name, new Map());
87
+ const histMap = histograms.get(name);
88
+ const key = labelsToKey(labels);
89
+ if (!histMap.has(key)) {
90
+ const def = METRIC_DEFINITIONS[name];
91
+ if (def.type !== 'histogram') {
92
+ throw new Error(`Metric ${name} is not a histogram`);
93
+ }
94
+ const histDef = def;
95
+ histMap.set(key, {
96
+ values: [],
97
+ count: 0,
98
+ sum: 0,
99
+ buckets: histDef.buckets.map((b) => ({ bound: b, count: 0 })),
100
+ });
101
+ }
102
+ return histMap.get(key);
103
+ }
104
+ function getOrInitGauge(name, labels) {
105
+ if (!gauges.has(name))
106
+ gauges.set(name, new Map());
107
+ const gaugeMap = gauges.get(name);
108
+ const key = labelsToKey(labels);
109
+ if (!gaugeMap.has(key))
110
+ gaugeMap.set(key, 0);
111
+ return gaugeMap;
112
+ }
113
+ // ============================================================
114
+ // PUBLIC API
115
+ // ============================================================
116
+ /**
117
+ * Increment a counter by delta (default 1).
118
+ */
119
+ function incrementCounter(name, labels = {}, delta = 1) {
120
+ const counterMap = getOrInitCounter(name, labels);
121
+ const key = labelsToKey(labels);
122
+ counterMap.set(key, counterMap.get(key) + delta);
123
+ }
124
+ /**
125
+ * Record a histogram value (duration, size, etc.).
126
+ */
127
+ function recordHistogram(name, labels, value) {
128
+ const hist = getOrInitHistogram(name, labels);
129
+ hist.values.push(value);
130
+ hist.count++;
131
+ hist.sum += value;
132
+ // Update bucket counts
133
+ for (const bucket of hist.buckets) {
134
+ if (value <= bucket.bound)
135
+ bucket.count++;
136
+ }
137
+ }
138
+ /**
139
+ * Set a gauge value.
140
+ */
141
+ function setGauge(name, labels, value) {
142
+ const gaugeMap = getOrInitGauge(name, labels);
143
+ const key = labelsToKey(labels);
144
+ gaugeMap.set(key, value);
145
+ }
146
+ /**
147
+ * Increment active requests gauge (call on start, decrement on end).
148
+ */
149
+ function recordActiveRequest(delta) {
150
+ setGauge('a3m_active_requests', {}, Math.max(0, getActiveRequests() + delta));
151
+ }
152
+ /**
153
+ * Get current active request count.
154
+ */
155
+ function getActiveRequests() {
156
+ const gaugeMap = gauges.get('a3m_active_requests');
157
+ if (!gaugeMap || gaugeMap.size === 0)
158
+ return 0;
159
+ return Array.from(gaugeMap.values())[0] || 0;
160
+ }
161
+ // ============================================================
162
+ // PROMETHEUS EXPORT FORMAT
163
+ // ============================================================
164
+ /**
165
+ * Generate Prometheus /metrics output.
166
+ */
167
+ function generatePrometheusMetrics() {
168
+ const lines = [];
169
+ // Helper to get metric help/type
170
+ function metricHeader(name) {
171
+ const def = METRIC_DEFINITIONS[name];
172
+ if (!def)
173
+ return '';
174
+ return `# HELP ${name} ${def.help}\n# TYPE ${name} ${def.type}`;
175
+ }
176
+ // Counters
177
+ for (const [name, counterMap] of counters) {
178
+ lines.push(metricHeader(name));
179
+ for (const [labelKey, value] of counterMap) {
180
+ lines.push(`${name}{${labelKey}} ${value}`);
181
+ }
182
+ lines.push('');
183
+ }
184
+ // Histograms
185
+ for (const [name, histMap] of histograms) {
186
+ lines.push(metricHeader(name));
187
+ for (const [labelKey, hist] of histMap) {
188
+ // Per-bucket cumulative counts
189
+ for (const bucket of hist.buckets) {
190
+ lines.push(`${name}_bucket{${labelKey},le="${bucket.bound}"} ${bucket.count}`);
191
+ }
192
+ // +Inf bucket = total count
193
+ lines.push(`${name}_bucket{${labelKey},le="+Inf"} ${hist.count}`);
194
+ // Summary
195
+ lines.push(`${name}_sum{${labelKey}} ${hist.sum}`);
196
+ lines.push(`${name}_count{${labelKey}} ${hist.count}`);
197
+ }
198
+ lines.push('');
199
+ }
200
+ // Gauges
201
+ for (const [name, gaugeMap] of gauges) {
202
+ lines.push(metricHeader(name));
203
+ for (const [labelKey, value] of gaugeMap) {
204
+ lines.push(`${name}{${labelKey}} ${value}`);
205
+ }
206
+ lines.push('');
207
+ }
208
+ return lines.join('\n');
209
+ }
210
+ // ============================================================
211
+ // SPECIALIZED RECORDERS (convenience wrappers)
212
+ // ============================================================
213
+ /**
214
+ * Record a completed request with all metrics.
215
+ */
216
+ function recordRequest(params) {
217
+ incrementCounter('a3m_requests_total', {
218
+ endpoint: params.endpoint,
219
+ provider: params.provider,
220
+ status: params.status,
221
+ });
222
+ recordHistogram('a3m_request_duration_ms', {
223
+ endpoint: params.endpoint,
224
+ provider: params.provider,
225
+ }, params.durationMs);
226
+ if (params.tokensIn !== undefined && params.tokensOut !== undefined) {
227
+ incrementCounter('a3m_tokens_total', { provider: params.provider, type: 'input' }, params.tokensIn);
228
+ incrementCounter('a3m_tokens_total', { provider: params.provider, type: 'output' }, params.tokensOut);
229
+ }
230
+ if (params.cost !== undefined && params.cost > 0) {
231
+ incrementCounter('a3m_cost_usd_total', { provider: params.provider }, Math.round(params.cost * 1e6) / 1e6);
232
+ }
233
+ if (params.model) {
234
+ incrementCounter('a3m_routing_decisions_total', { model: params.model });
235
+ }
236
+ }
237
+ /**
238
+ * Record a provider error.
239
+ */
240
+ function recordProviderError(provider, errorType) {
241
+ incrementCounter('a3m_provider_errors_total', { provider, error_type: errorType });
242
+ }
243
+ /**
244
+ * Record a cache hit.
245
+ */
246
+ function recordCacheHit(cacheType) {
247
+ incrementCounter('a3m_cache_hits_total', { cache_type: cacheType });
248
+ }
249
+ /**
250
+ * Record a fallback trigger.
251
+ */
252
+ function recordFallback(provider) {
253
+ incrementCounter('a3m_fallback_triggered_total', { provider });
254
+ }
255
+ exports.default = {
256
+ incrementCounter,
257
+ recordHistogram,
258
+ setGauge,
259
+ recordActiveRequest,
260
+ getActiveRequests,
261
+ generatePrometheusMetrics,
262
+ recordRequest,
263
+ recordProviderError,
264
+ recordCacheHit,
265
+ recordFallback,
266
+ };
267
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/server/metrics.ts"],"names":[],"mappings":"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"}
@@ -41,3 +41,4 @@ export declare function listAvailableModels(): Array<{
41
41
  created: number;
42
42
  owned_by: string;
43
43
  }>;
44
+ //# sourceMappingURL=modelMapper.d.ts.map
@@ -13,29 +13,65 @@
13
13
  * Build: npx tsc
14
14
  * Run: npx a3m-router serve [--port 8787]
15
15
  */
16
- import * as http from "http";
17
- import { CostTracker } from "../cost/costTracker";
18
- interface RequestLog {
19
- id: string;
16
+ import * as http from 'http';
17
+ import { ModelMapping } from './modelMapper';
18
+ interface ChatMessage {
19
+ role: "system" | "user" | "assistant" | "tool";
20
+ content: string;
21
+ }
22
+ interface ProviderCallResult {
23
+ content: string;
20
24
  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;
25
+ usage: {
26
+ prompt_tokens: number;
27
+ completion_tokens: number;
28
+ total_tokens: number;
29
+ };
30
+ finish_reason: string;
30
31
  }
31
- declare const requestLogs: RequestLog[];
32
- declare const costTracker: CostTracker;
33
32
  /**
34
- * Create and start the proxy server.
33
+ * Call the actual LLM provider with the given messages.
34
+ * Handles OpenAI-compatible APIs, Anthropic, Google, and local providers.
35
+ */
36
+ export declare function callProvider(mapping: ModelMapping, messages: ChatMessage[], options: {
37
+ temperature?: number;
38
+ max_tokens?: number;
39
+ stream?: boolean;
40
+ stop?: string | string[];
41
+ }): Promise<ProviderCallResult>;
42
+ /**
43
+ * Stream a provider response as SSE chunks.
44
+ */
45
+ export declare function streamProviderResponse(res: http.ServerResponse, mapping: ModelMapping, messages: ChatMessage[], options: {
46
+ temperature?: number;
47
+ max_tokens?: number;
48
+ stop?: string | string[];
49
+ }, requestId: string): Promise<void>;
50
+ /**
51
+ * Try the primary mapping, then fall back to alternatives.
52
+ */
53
+ export declare function callWithFallback(model: string, messages: ChatMessage[], options: {
54
+ temperature?: number;
55
+ max_tokens?: number;
56
+ stream?: boolean;
57
+ stop?: string | string[];
58
+ }, prompt: string): Promise<{
59
+ result: ProviderCallResult;
60
+ mapping: ModelMapping;
61
+ }>;
62
+ /**
63
+ * Create and start the A3M Router proxy server.
64
+ *
65
+ * Uses a route table pattern (router.ts) for pluggable endpoint registration.
66
+ * To add a new endpoint:
67
+ * 1. Create src/server/handlers/yourHandler.ts
68
+ * 2. Import and register: registerRoute('GET', /^\/path$/, handleYourPath);
35
69
  *
36
70
  * @param port - Port to listen on (default: 8787, env: PORT)
37
71
  * @returns The http.Server instance
38
72
  */
39
73
  export declare function createProxyServer(port?: number): http.Server;
40
- export { CostTracker, costTracker, requestLogs };
74
+ export { costTracker, requestLogs } from './state';
75
+ export type { RequestLog } from './state';
41
76
  export default createProxyServer;
77
+ //# sourceMappingURL=proxyServer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxyServer.d.ts","sourceRoot":"","sources":["../../src/server/proxyServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAmClD,UAAU,UAAU;IAClB,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;AAmnBD,QAAA,MAAM,WAAW,EAAE,UAAU,EAAO,CAAC;AACrC,QAAA,MAAM,WAAW,aAAoB,CAAC;AA0StC;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAmG5D;AAMD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACjD,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"proxyServer.d.ts","sourceRoot":"","sources":["../../src/server/proxyServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAqC,YAAY,EAAE,MAAM,eAAe,CAAC;AAehF,UAAU,WAAW;IACnB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;CACjB;AAmFD,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAClF,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,GACjG,OAAO,CAAC,kBAAkB,CAAC,CAqB7B;AA2OD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,EAChF,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CA6Pf;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,EAClG,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC,CAwChE;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CA0E5D;AAMD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,eAAe,iBAAiB,CAAC"}