adaptive-memory-multi-model-router 1.9.4 → 2.0.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 (130) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +50 -0
  2. package/.github/ISSUE_TEMPLATE/config.yml +11 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +37 -0
  4. package/.github/PULL_REQUEST_TEMPLATE.md +44 -0
  5. package/.github/workflows/npm-stats-validation.yml +152 -0
  6. package/.github/workflows/pages.yml +37 -0
  7. package/CHANGELOG.md +122 -0
  8. package/CODE_OF_CONDUCT.md +128 -0
  9. package/CONTRIBUTING.md +110 -0
  10. package/LAUNCH-PAIN-DRIVEN.md +339 -0
  11. package/LAUNCH.md +575 -0
  12. package/POPULARITY_BOOSTERS.md +285 -0
  13. package/README.md +231 -300
  14. package/SECURITY.md +69 -0
  15. package/articles/CONTENT_STRUCTURE.md +292 -0
  16. package/articles/DEVTO_COST_GUIDE.md +473 -0
  17. package/articles/DEVTO_FINAL.md +416 -0
  18. package/articles/DEVTO_MULTI_PROVIDER.md +542 -0
  19. package/articles/HN_10X_BETTER.md +430 -0
  20. package/articles/HN_CHINESE_STYLE.md +308 -0
  21. package/articles/HN_FINAL.md +199 -0
  22. package/articles/HN_POSTED_VERSION.md +56 -0
  23. package/articles/HN_RESEARCH.md +364 -0
  24. package/articles/PAIN-DRIVEN-devto-v2.md +308 -0
  25. package/articles/PAIN-DRIVEN-devto-v3.md +268 -0
  26. package/articles/PAIN-DRIVEN-devto.md +242 -0
  27. package/articles/PAIN-DRIVEN-hackernews-v2.md +138 -0
  28. package/articles/PAIN-DRIVEN-hackernews-v3.md +151 -0
  29. package/articles/PAIN-DRIVEN-hackernews.md +131 -0
  30. package/articles/PAIN-DRIVEN-reddit-v2.md +301 -0
  31. package/articles/PAIN-DRIVEN-reddit-v3.md +236 -0
  32. package/articles/PAIN-DRIVEN-reddit.md +218 -0
  33. package/articles/PAIN-DRIVEN-twitter-v2.md +110 -0
  34. package/articles/PAIN-DRIVEN-twitter-v3.md +121 -0
  35. package/articles/PAIN-DRIVEN-twitter.md +120 -0
  36. package/articles/PORTKEY_VS_A3M.md +147 -0
  37. package/articles/REDDIT_FINAL.md +232 -0
  38. package/articles/TWITTER_FINAL.md +167 -0
  39. package/articles/WHY_10X_BETTER.md +261 -0
  40. package/articles/WHY_CHINESE_STYLE_BETTER.md +323 -0
  41. package/articles/ai-discoverability-llm-routing.md +210 -0
  42. package/articles/devto-llm-routing.md +109 -0
  43. package/articles/hackernews-show-hn.md +65 -0
  44. package/articles/hashnode-llm-cost-optimization.md +125 -0
  45. package/articles/medium-building-llm-router.md +205 -0
  46. package/articles/reddit-ml.md +86 -0
  47. package/articles/twitter-thread-cost-savings.md +98 -0
  48. package/articles/youtube-tutorial-script.md +262 -0
  49. package/assets/banner.svg +109 -0
  50. package/assets/logo.svg +68 -0
  51. package/assets/social-preview.svg +64 -0
  52. package/demo/demo-script.md +53 -0
  53. package/dist/analytics/costAnalytics.d.ts +77 -0
  54. package/dist/analytics/costAnalytics.d.ts.map +1 -0
  55. package/dist/analytics/costAnalytics.js +219 -0
  56. package/dist/analytics/costAnalytics.js.map +1 -0
  57. package/dist/cache/semanticCache.d.ts +62 -0
  58. package/dist/cache/semanticCache.d.ts.map +1 -0
  59. package/dist/cache/semanticCache.js +176 -0
  60. package/dist/cache/semanticCache.js.map +1 -0
  61. package/dist/cli.js +35 -0
  62. package/dist/geo/generativeEngineOptimization.js +321 -0
  63. package/dist/geo/geoRouter.js +387 -0
  64. package/dist/index.d.ts +4 -723
  65. package/dist/index.js +11 -344
  66. package/dist/index.js.map +1 -1
  67. package/dist/integrations/langchainAdapter.d.ts +146 -0
  68. package/dist/integrations/langchainAdapter.d.ts.map +1 -0
  69. package/dist/integrations/langchainAdapter.js +731 -0
  70. package/dist/integrations/langchainAdapter.js.map +1 -0
  71. package/dist/integrations/oauth.d.ts +69 -0
  72. package/dist/integrations/oauth.d.ts.map +1 -0
  73. package/dist/integrations/oauth.js +225 -21
  74. package/dist/integrations/oauth.js.map +1 -0
  75. package/dist/memory/autoFetch.d.ts +39 -0
  76. package/dist/memory/autoFetch.d.ts.map +1 -0
  77. package/dist/memory/autoFetch.js +80 -88
  78. package/dist/memory/autoFetch.js.map +1 -0
  79. package/dist/memory/memoryTree.d.ts +76 -0
  80. package/dist/memory/memoryTree.d.ts.map +1 -0
  81. package/dist/memory/memoryTree.js +185 -130
  82. package/dist/memory/memoryTree.js.map +1 -0
  83. package/dist/memory/obsidianVault.d.ts +71 -0
  84. package/dist/memory/obsidianVault.d.ts.map +1 -0
  85. package/dist/memory/obsidianVault.js +207 -22
  86. package/dist/memory/obsidianVault.js.map +1 -0
  87. package/dist/providers/providerConfig.d.ts +49 -0
  88. package/dist/providers/providerConfig.d.ts.map +1 -0
  89. package/dist/providers/providerConfig.js +806 -401
  90. package/dist/providers/providerConfig.js.map +1 -0
  91. package/dist/security/guardrails.d.ts +76 -0
  92. package/dist/security/guardrails.d.ts.map +1 -0
  93. package/dist/security/guardrails.js +479 -0
  94. package/dist/security/guardrails.js.map +1 -0
  95. package/dist/security/inputValidation.js +351 -0
  96. package/dist/server/dashboard.d.ts +58 -0
  97. package/dist/server/dashboard.d.ts.map +1 -0
  98. package/dist/server/dashboard.js +553 -0
  99. package/dist/server/dashboard.js.map +1 -0
  100. package/dist/server/modelMapper.d.ts +43 -0
  101. package/dist/server/modelMapper.d.ts.map +1 -0
  102. package/dist/server/modelMapper.js +154 -0
  103. package/dist/server/modelMapper.js.map +1 -0
  104. package/dist/server/proxyServer.d.ts +41 -0
  105. package/dist/server/proxyServer.d.ts.map +1 -0
  106. package/dist/server/proxyServer.js +932 -0
  107. package/dist/server/proxyServer.js.map +1 -0
  108. package/dist/skills/__tests__/skill_manager.test.d.ts +2 -0
  109. package/dist/skills/__tests__/skill_manager.test.d.ts.map +1 -0
  110. package/dist/skills/__tests__/skill_manager.test.js +268 -0
  111. package/dist/skills/__tests__/skill_manager.test.js.map +1 -0
  112. package/docs/geo/GENERATIVE_ENGINE_OPTIMIZATION.md +232 -0
  113. package/docs-site/index.html +347 -0
  114. package/llms.txt +138 -0
  115. package/package.json +72 -7
  116. package/playground/README.md +51 -0
  117. package/playground/codesandbox.json +12 -0
  118. package/playground/index.js +39 -0
  119. package/scripts/update-npm-badges.js +158 -0
  120. package/src/analytics/costAnalytics.ts +304 -0
  121. package/src/cache/semanticCache.ts +221 -0
  122. package/src/index.ts +6 -0
  123. package/src/integrations/langchainAdapter.ts +955 -0
  124. package/src/providers/providerConfig.ts +923 -0
  125. package/src/security/guardrails.ts +585 -0
  126. package/src/server/dashboard.ts +610 -0
  127. package/src/server/modelMapper.ts +182 -0
  128. package/src/server/proxyServer.ts +1105 -0
  129. package/src/types/langchain.d.ts +83 -0
  130. package/tsconfig.build.json +20 -0
@@ -1,26 +1,211 @@
1
+ "use strict";
1
2
  /**
2
- * Obsidian Vault Integration (Compiled)
3
+ * Obsidian Vault Integration
4
+ *
5
+ * Stores routing decisions and context as markdown files
6
+ * compatible with Obsidian note-taking app.
3
7
  */
4
- const fs = require('fs');
5
- const path = require('path');
6
-
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.ObsidianVault = void 0;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
7
45
  class ObsidianVault {
8
- constructor(config = {}) {
9
- this.config = { path: config.path || './vault', autoSave: config.autoSave !== false, maxFileAge: 30 };
10
- this.decisions = [];
11
- if (!fs.existsSync(this.config.path)) fs.mkdirSync(this.config.path, { recursive: true });
12
- }
13
-
14
- async saveDecision(decision) {
15
- this.decisions.push(decision);
16
- const filepath = path.join(this.config.path, `routing-decision-${decision.id}.md`);
17
- const content = `# Routing Decision ${decision.id}\n\nDate: ${new Date(decision.timestamp).toISOString()}\n\nProvider: ${decision.selectedProvider}\nModel: ${decision.selectedModel}\n\nReasoning: ${decision.reasoning}\nCost: $${decision.cost}\n`;
18
- fs.writeFileSync(filepath, content);
19
- return filepath;
20
- }
21
-
22
- getRecentDecisions(count = 10) { return this.decisions.slice(-count).reverse(); }
23
- searchDecisions(query) { return this.decisions.filter(d => d.prompt.includes(query)); }
24
- }
46
+ config;
47
+ decisions;
48
+ constructor(config = {}) {
49
+ this.config = {
50
+ path: config.path || './vault',
51
+ autoSave: config.autoSave !== false,
52
+ maxFileAge: config.maxFileAge || 30
53
+ };
54
+ this.decisions = [];
55
+ this.ensureDirectory();
56
+ }
57
+ ensureDirectory() {
58
+ if (!fs.existsSync(this.config.path)) {
59
+ fs.mkdirSync(this.config.path, { recursive: true });
60
+ }
61
+ }
62
+ /**
63
+ * Save a routing decision
64
+ */
65
+ async saveDecision(decision) {
66
+ this.decisions.push(decision);
67
+ const filename = `routing-decision-${decision.id}.md`;
68
+ const filepath = path.join(this.config.path, filename);
69
+ const content = this.formatDecisionAsMarkdown(decision);
70
+ fs.writeFileSync(filepath, content, 'utf-8');
71
+ // Update index
72
+ await this.updateIndex();
73
+ return filepath;
74
+ }
75
+ /**
76
+ * Format decision as markdown
77
+ */
78
+ formatDecisionAsMarkdown(decision) {
79
+ const date = new Date(decision.timestamp).toISOString();
80
+ return `# Routing Decision ${decision.id}
81
+
82
+ **Date:** ${date}
83
+ **Prompt:** ${this.escapeMarkdown(decision.prompt.substring(0, 200))}
84
+
85
+ ## Decision
86
+
87
+ | Field | Value |
88
+ |-------|-------|
89
+ | Provider | ${decision.selectedProvider} |
90
+ | Model | ${decision.selectedModel} |
91
+ | Reasoning | ${this.escapeMarkdown(decision.reasoning)} |
92
+ | Cost | $${decision.cost.toFixed(4)} |
93
+ | Latency | ${decision.latency}ms |
25
94
 
26
- module.exports = { ObsidianVault };
95
+ ## Context
96
+
97
+ \`\`\`json
98
+ ${JSON.stringify(decision.context, null, 2)}
99
+ \`\`\`
100
+
101
+ ## Prompt (Full)
102
+
103
+ ${decision.prompt}
104
+
105
+ ---
106
+ *Generated by A3M Router*
107
+ `;
108
+ }
109
+ /**
110
+ * Escape markdown special characters
111
+ */
112
+ escapeMarkdown(text) {
113
+ return text
114
+ .replace(/\*/g, '\\*')
115
+ .replace(/#/g, '\\#')
116
+ .replace(/\|/g, '\\|')
117
+ .replace(/`/g, '\\`');
118
+ }
119
+ /**
120
+ * Update the vault index
121
+ */
122
+ async updateIndex() {
123
+ const indexPath = path.join(this.config.path, 'routing-index.md');
124
+ const lines = [
125
+ '# Routing Decisions Index',
126
+ '',
127
+ `Last updated: ${new Date().toISOString()}`,
128
+ '',
129
+ `Total decisions: ${this.decisions.length}`,
130
+ '',
131
+ '## Recent Decisions',
132
+ ''
133
+ ];
134
+ for (const decision of this.decisions.slice(-20).reverse()) {
135
+ const date = new Date(decision.timestamp).toLocaleDateString();
136
+ lines.push(`- [${decision.id}](./routing-decision-${decision.id}.md) - ${date} - ${decision.selectedProvider}/${decision.selectedModel}`);
137
+ }
138
+ fs.writeFileSync(indexPath, lines.join('\n'), 'utf-8');
139
+ }
140
+ /**
141
+ * Get recent decisions
142
+ */
143
+ getRecentDecisions(count = 10) {
144
+ return this.decisions.slice(-count).reverse();
145
+ }
146
+ /**
147
+ * Search decisions
148
+ */
149
+ searchDecisions(query) {
150
+ const queryLower = query.toLowerCase();
151
+ return this.decisions.filter(d => d.prompt.toLowerCase().includes(queryLower) ||
152
+ d.selectedProvider.toLowerCase().includes(queryLower) ||
153
+ d.selectedModel.toLowerCase().includes(queryLower));
154
+ }
155
+ /**
156
+ * Export all decisions
157
+ */
158
+ async exportAll(filepath) {
159
+ const content = this.decisions.map(d => this.formatDecisionAsMarkdown(d)).join('\n\n---\n\n');
160
+ fs.writeFileSync(filepath, content, 'utf-8');
161
+ }
162
+ /**
163
+ * Get vault statistics
164
+ */
165
+ getStats() {
166
+ return {
167
+ totalDecisions: this.decisions.length,
168
+ vaultPath: this.config.path,
169
+ fileCount: fs.readdirSync(this.config.path).filter(f => f.endsWith('.md')).length,
170
+ totalSize: this.getDirectorySize(this.config.path)
171
+ };
172
+ }
173
+ getDirectorySize(dir) {
174
+ let size = 0;
175
+ const files = fs.readdirSync(dir);
176
+ for (const file of files) {
177
+ const filepath = path.join(dir, file);
178
+ const stat = fs.statSync(filepath);
179
+ if (stat.isDirectory()) {
180
+ size += this.getDirectorySize(filepath);
181
+ }
182
+ else {
183
+ size += stat.size;
184
+ }
185
+ }
186
+ return size;
187
+ }
188
+ /**
189
+ * Clean old files
190
+ */
191
+ async cleanOldFiles() {
192
+ const maxAge = this.config.maxFileAge * 24 * 60 * 60 * 1000;
193
+ const now = Date.now();
194
+ const files = fs.readdirSync(this.config.path);
195
+ let cleaned = 0;
196
+ for (const file of files) {
197
+ if (!file.endsWith('.md') || file === 'routing-index.md')
198
+ continue;
199
+ const filepath = path.join(this.config.path, file);
200
+ const stat = fs.statSync(filepath);
201
+ if (now - stat.mtimeMs > maxAge) {
202
+ fs.unlinkSync(filepath);
203
+ cleaned++;
204
+ }
205
+ }
206
+ return cleaned;
207
+ }
208
+ }
209
+ exports.ObsidianVault = ObsidianVault;
210
+ exports.default = ObsidianVault;
211
+ //# sourceMappingURL=obsidianVault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidianVault.js","sourceRoot":"","sources":["../../src/memory/obsidianVault.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * A3M Router - Generic Provider Configuration System
3
+ *
4
+ * Users can configure their available LLM providers via:
5
+ * 1. Environment variables (*_API_KEY patterns)
6
+ * 2. Config file at ~/.config/a3m-router/providers.json
7
+ * 3. Runtime registration via registerProvider()
8
+ *
9
+ * 40+ providers across free, cheap, mid-tier, premium, and enterprise tiers.
10
+ */
11
+ export type ProviderTier = 'free' | 'cheap' | 'mid' | 'premium' | 'enterprise';
12
+ export type ProviderFormat = 'openai' | 'anthropic' | 'google' | 'cohere' | 'aws-bedrock' | 'google-vertex';
13
+ export type ProviderType = 'api' | 'cli' | 'local';
14
+ export interface ProviderCost {
15
+ input: number;
16
+ output: number;
17
+ }
18
+ export interface ProviderDefinition {
19
+ id: string;
20
+ name: string;
21
+ baseUrl: string;
22
+ apiKeyEnv: string;
23
+ models: string[];
24
+ costPerK: ProviderCost;
25
+ tier: ProviderTier;
26
+ format: ProviderFormat;
27
+ type: ProviderType;
28
+ priority: number;
29
+ maxTokens: number;
30
+ cliCommand?: string;
31
+ apiKey?: string | null;
32
+ }
33
+ export declare const DEFAULT_PROVIDERS: Record<string, ProviderDefinition>;
34
+ export declare function loadConfig(configPath?: string): Record<string, ProviderDefinition>;
35
+ export declare function getAvailableProviders(): Record<string, ProviderDefinition>;
36
+ export declare function registerProvider(id: string, config: Partial<ProviderDefinition>): ProviderDefinition;
37
+ export declare function deregisterProvider(id: string): void;
38
+ export declare function updateProvider(id: string, updates: Partial<ProviderDefinition>): ProviderDefinition | null;
39
+ export declare function healthCheck(providerId: string): Promise<{
40
+ healthy: boolean;
41
+ error?: string;
42
+ latency?: number;
43
+ model?: string;
44
+ type?: string;
45
+ }>;
46
+ export declare function checkAllProviders(): Promise<Record<string, any>>;
47
+ export declare function findCheapestAvailableProvider(model?: string): ProviderDefinition | null;
48
+ export declare function findFastestAvailableProvider(): ProviderDefinition | null;
49
+ export declare function saveConfig(configPath?: string): string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerConfig.d.ts","sourceRoot":"","sources":["../../src/providers/providerConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,GAAG,YAAY,CAAC;AAC/E,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,aAAa,GAAG,eAAe,CAAC;AAC5G,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,YAAY,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAMD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAonBhE,CAAC;AAaF,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CA8DlF;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAoB1E;AAMD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAgBpG;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,GAAG,IAAI,CAM1G;AAMD,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC,CAmDD;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAStE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CASvF;AAED,wBAAgB,4BAA4B,IAAI,kBAAkB,GAAG,IAAI,CAIxE;AAMD,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBtD"}