adaptive-memory-multi-model-router 1.9.5 → 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.
- package/.github/ISSUE_TEMPLATE/bug_report.md +50 -0
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +37 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +44 -0
- package/.github/workflows/npm-stats-validation.yml +152 -0
- package/.github/workflows/pages.yml +37 -0
- package/CHANGELOG.md +122 -0
- package/CODE_OF_CONDUCT.md +128 -0
- package/CONTRIBUTING.md +110 -0
- package/LAUNCH-PAIN-DRIVEN.md +339 -0
- package/LAUNCH.md +575 -0
- package/POPULARITY_BOOSTERS.md +285 -0
- package/README.md +231 -300
- package/SECURITY.md +69 -0
- package/articles/CONTENT_STRUCTURE.md +292 -0
- package/articles/DEVTO_COST_GUIDE.md +473 -0
- package/articles/DEVTO_FINAL.md +416 -0
- package/articles/DEVTO_MULTI_PROVIDER.md +542 -0
- package/articles/HN_10X_BETTER.md +430 -0
- package/articles/HN_CHINESE_STYLE.md +308 -0
- package/articles/HN_FINAL.md +199 -0
- package/articles/HN_POSTED_VERSION.md +56 -0
- package/articles/HN_RESEARCH.md +364 -0
- package/articles/PAIN-DRIVEN-devto-v2.md +308 -0
- package/articles/PAIN-DRIVEN-devto-v3.md +268 -0
- package/articles/PAIN-DRIVEN-devto.md +242 -0
- package/articles/PAIN-DRIVEN-hackernews-v2.md +138 -0
- package/articles/PAIN-DRIVEN-hackernews-v3.md +151 -0
- package/articles/PAIN-DRIVEN-hackernews.md +131 -0
- package/articles/PAIN-DRIVEN-reddit-v2.md +301 -0
- package/articles/PAIN-DRIVEN-reddit-v3.md +236 -0
- package/articles/PAIN-DRIVEN-reddit.md +218 -0
- package/articles/PAIN-DRIVEN-twitter-v2.md +110 -0
- package/articles/PAIN-DRIVEN-twitter-v3.md +121 -0
- package/articles/PAIN-DRIVEN-twitter.md +120 -0
- package/articles/PORTKEY_VS_A3M.md +147 -0
- package/articles/REDDIT_FINAL.md +232 -0
- package/articles/TWITTER_FINAL.md +167 -0
- package/articles/WHY_10X_BETTER.md +261 -0
- package/articles/WHY_CHINESE_STYLE_BETTER.md +323 -0
- package/articles/hashnode-llm-cost-optimization.md +125 -0
- package/articles/medium-building-llm-router.md +205 -0
- package/articles/twitter-thread-cost-savings.md +98 -0
- package/articles/youtube-tutorial-script.md +262 -0
- package/assets/banner.svg +109 -0
- package/assets/logo.svg +68 -0
- package/assets/social-preview.svg +64 -0
- package/demo/demo-script.md +53 -0
- package/dist/analytics/costAnalytics.d.ts +77 -0
- package/dist/analytics/costAnalytics.d.ts.map +1 -0
- package/dist/analytics/costAnalytics.js +219 -0
- package/dist/analytics/costAnalytics.js.map +1 -0
- package/dist/cache/semanticCache.d.ts +62 -0
- package/dist/cache/semanticCache.d.ts.map +1 -0
- package/dist/cache/semanticCache.js +176 -0
- package/dist/cache/semanticCache.js.map +1 -0
- package/dist/cli.js +35 -0
- package/dist/index.d.ts +4 -723
- package/dist/index.js +11 -362
- package/dist/index.js.map +1 -1
- package/dist/integrations/langchainAdapter.d.ts +146 -0
- package/dist/integrations/langchainAdapter.d.ts.map +1 -0
- package/dist/integrations/langchainAdapter.js +731 -0
- package/dist/integrations/langchainAdapter.js.map +1 -0
- package/dist/integrations/oauth.d.ts +69 -0
- package/dist/integrations/oauth.d.ts.map +1 -0
- package/dist/integrations/oauth.js +225 -21
- package/dist/integrations/oauth.js.map +1 -0
- package/dist/memory/autoFetch.d.ts +39 -0
- package/dist/memory/autoFetch.d.ts.map +1 -0
- package/dist/memory/autoFetch.js +80 -88
- package/dist/memory/autoFetch.js.map +1 -0
- package/dist/memory/memoryTree.d.ts +76 -0
- package/dist/memory/memoryTree.d.ts.map +1 -0
- package/dist/memory/memoryTree.js +185 -130
- package/dist/memory/memoryTree.js.map +1 -0
- package/dist/memory/obsidianVault.d.ts +71 -0
- package/dist/memory/obsidianVault.d.ts.map +1 -0
- package/dist/memory/obsidianVault.js +207 -22
- package/dist/memory/obsidianVault.js.map +1 -0
- package/dist/providers/providerConfig.d.ts +49 -0
- package/dist/providers/providerConfig.d.ts.map +1 -0
- package/dist/providers/providerConfig.js +806 -401
- package/dist/providers/providerConfig.js.map +1 -0
- package/dist/security/guardrails.d.ts +76 -0
- package/dist/security/guardrails.d.ts.map +1 -0
- package/dist/security/guardrails.js +479 -0
- package/dist/security/guardrails.js.map +1 -0
- package/dist/server/dashboard.d.ts +58 -0
- package/dist/server/dashboard.d.ts.map +1 -0
- package/dist/server/dashboard.js +553 -0
- package/dist/server/dashboard.js.map +1 -0
- package/dist/server/modelMapper.d.ts +43 -0
- package/dist/server/modelMapper.d.ts.map +1 -0
- package/dist/server/modelMapper.js +154 -0
- package/dist/server/modelMapper.js.map +1 -0
- package/dist/server/proxyServer.d.ts +41 -0
- package/dist/server/proxyServer.d.ts.map +1 -0
- package/dist/server/proxyServer.js +932 -0
- package/dist/server/proxyServer.js.map +1 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts +2 -0
- package/dist/skills/__tests__/skill_manager.test.d.ts.map +1 -0
- package/dist/skills/__tests__/skill_manager.test.js +268 -0
- package/dist/skills/__tests__/skill_manager.test.js.map +1 -0
- package/docs-site/index.html +347 -0
- package/package.json +53 -7
- package/playground/README.md +51 -0
- package/playground/codesandbox.json +12 -0
- package/playground/index.js +39 -0
- package/scripts/update-npm-badges.js +158 -0
- package/src/analytics/costAnalytics.ts +304 -0
- package/src/cache/semanticCache.ts +221 -0
- package/src/index.ts +6 -0
- package/src/integrations/langchainAdapter.ts +955 -0
- package/src/providers/providerConfig.ts +923 -0
- package/src/security/guardrails.ts +585 -0
- package/src/server/dashboard.ts +610 -0
- package/src/server/modelMapper.ts +182 -0
- package/src/server/proxyServer.ts +1105 -0
- package/src/types/langchain.d.ts +83 -0
- package/tsconfig.build.json +20 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* A3M Router - Model Mapper
|
|
4
|
+
*
|
|
5
|
+
* Maps OpenAI-compatible model names to our provider/model pairs.
|
|
6
|
+
* Supports:
|
|
7
|
+
* - "auto" → intelligent routing via advancedRouter
|
|
8
|
+
* - "gpt-4" → best available premium provider
|
|
9
|
+
* - "gpt-3.5-turbo" → best available fast provider
|
|
10
|
+
* - "groq/llama-3.3-70b" → specific provider/model
|
|
11
|
+
* - "claude-3.5-sonnet" → Anthropic provider
|
|
12
|
+
* - "gemini-2.0-flash" → Google provider
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.resolveModel = resolveModel;
|
|
16
|
+
exports.listAvailableModels = listAvailableModels;
|
|
17
|
+
const advancedRouter_1 = require("../routing/advancedRouter");
|
|
18
|
+
const providerConfig_1 = require("../providers/providerConfig");
|
|
19
|
+
// ============================================================
|
|
20
|
+
// OPENAI MODEL ALIASES → provider preference order
|
|
21
|
+
// ============================================================
|
|
22
|
+
const OPENAI_ALIASES = {
|
|
23
|
+
"gpt-4": ["openai/gpt-4o", "anthropic/claude-3.5-sonnet", "google/gemini-2.5-pro", "mistral/mistral-large-latest"],
|
|
24
|
+
"gpt-4-turbo": ["openai/gpt-4-turbo", "openai/gpt-4o", "anthropic/claude-3.5-sonnet"],
|
|
25
|
+
"gpt-4o": ["openai/gpt-4o", "anthropic/claude-3.5-sonnet", "google/gemini-2.5-pro"],
|
|
26
|
+
"gpt-4o-mini": ["openai/gpt-4o-mini", "groq/llama-3.3-70b-versatile", "google/gemini-2.0-flash", "mistral/mistral-small-latest"],
|
|
27
|
+
"gpt-3.5-turbo": ["groq/llama-3.3-70b-versatile", "cerebras/llama3.1-8b", "google/gemini-2.0-flash", "mistral/mistral-small-latest", "deepseek/deepseek-chat"],
|
|
28
|
+
"claude-3.5-sonnet": ["anthropic/claude-3.5-sonnet"],
|
|
29
|
+
"claude-3-opus": ["anthropic/claude-3-opus"],
|
|
30
|
+
"claude-3-haiku": ["anthropic/claude-3-haiku"],
|
|
31
|
+
"gemini-2.0-flash": ["google/gemini-2.0-flash"],
|
|
32
|
+
"gemini-2.5-pro": ["google/gemini-2.5-pro"],
|
|
33
|
+
"o1": ["openai/gpt-4o", "anthropic/claude-3.5-sonnet"],
|
|
34
|
+
"o1-mini": ["openai/gpt-4o-mini", "groq/llama-3.3-70b-versatile"],
|
|
35
|
+
"o3-mini": ["openai/gpt-4o-mini", "google/gemini-2.5-flash"],
|
|
36
|
+
};
|
|
37
|
+
// ============================================================
|
|
38
|
+
// MODEL MAPPING
|
|
39
|
+
// ============================================================
|
|
40
|
+
/**
|
|
41
|
+
* Resolve an OpenAI-compatible model name to a concrete provider/model pair.
|
|
42
|
+
*
|
|
43
|
+
* Resolution order:
|
|
44
|
+
* 1. "auto" → route through advancedRouter
|
|
45
|
+
* 2. "provider/model" format → direct lookup
|
|
46
|
+
* 3. OpenAI alias → preference list lookup
|
|
47
|
+
* 4. Bare model name → search across all providers
|
|
48
|
+
* 5. Fallback → first available provider's first model
|
|
49
|
+
*/
|
|
50
|
+
function resolveModel(modelName, prompt) {
|
|
51
|
+
const available = (0, providerConfig_1.getAvailableProviders)();
|
|
52
|
+
// 1. "auto" → intelligent routing
|
|
53
|
+
if (modelName === "auto") {
|
|
54
|
+
const query = prompt || "";
|
|
55
|
+
const route = (0, advancedRouter_1.routeQuery)(query);
|
|
56
|
+
if (!route.primary_model)
|
|
57
|
+
return null;
|
|
58
|
+
return lookupProviderModel(route.primary_model, available);
|
|
59
|
+
}
|
|
60
|
+
// 2. "provider/model" format → direct lookup
|
|
61
|
+
if (modelName.includes("/")) {
|
|
62
|
+
const mapping = lookupProviderModel(modelName, available);
|
|
63
|
+
if (mapping)
|
|
64
|
+
return mapping;
|
|
65
|
+
}
|
|
66
|
+
// 3. OpenAI alias → preference list
|
|
67
|
+
const aliasList = OPENAI_ALIASES[modelName];
|
|
68
|
+
if (aliasList) {
|
|
69
|
+
for (const candidate of aliasList) {
|
|
70
|
+
const mapping = lookupProviderModel(candidate, available);
|
|
71
|
+
if (mapping)
|
|
72
|
+
return mapping;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// 4. Bare model name → search across all providers
|
|
76
|
+
for (const [providerId, provider] of Object.entries(available)) {
|
|
77
|
+
if (provider.models && provider.models.includes(modelName)) {
|
|
78
|
+
return {
|
|
79
|
+
providerId,
|
|
80
|
+
model: modelName,
|
|
81
|
+
baseUrl: provider.baseUrl || "",
|
|
82
|
+
apiKey: provider.apiKey || null,
|
|
83
|
+
costPerK: provider.costPerK || { input: 0, output: 0 },
|
|
84
|
+
type: provider.type || "api",
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// 5. Fallback → first available provider's first model
|
|
89
|
+
const firstProvider = Object.values(available)[0];
|
|
90
|
+
if (firstProvider && firstProvider.models && firstProvider.models.length > 0) {
|
|
91
|
+
return {
|
|
92
|
+
providerId: firstProvider.id,
|
|
93
|
+
model: firstProvider.models[0],
|
|
94
|
+
baseUrl: firstProvider.baseUrl || "",
|
|
95
|
+
apiKey: firstProvider.apiKey || null,
|
|
96
|
+
costPerK: firstProvider.costPerK || { input: 0, output: 0 },
|
|
97
|
+
type: firstProvider.type || "api",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Look up a "provider/model" key against the available providers map.
|
|
104
|
+
*/
|
|
105
|
+
function lookupProviderModel(key, available) {
|
|
106
|
+
const slashIdx = key.indexOf("/");
|
|
107
|
+
const providerId = slashIdx >= 0 ? key.substring(0, slashIdx) : key;
|
|
108
|
+
const model = slashIdx >= 0 ? key.substring(slashIdx + 1) : key;
|
|
109
|
+
const provider = available[providerId];
|
|
110
|
+
if (!provider)
|
|
111
|
+
return null;
|
|
112
|
+
// Verify the model is in the provider's list (or accept if list is empty)
|
|
113
|
+
if (provider.models && provider.models.length > 0 && !provider.models.includes(model)) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
providerId,
|
|
118
|
+
model,
|
|
119
|
+
baseUrl: provider.baseUrl || "",
|
|
120
|
+
apiKey: provider.apiKey || null,
|
|
121
|
+
costPerK: provider.costPerK || { input: 0, output: 0 },
|
|
122
|
+
type: provider.type || "api",
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* List all available models in OpenAI-compatible format.
|
|
127
|
+
*/
|
|
128
|
+
function listAvailableModels() {
|
|
129
|
+
const available = (0, providerConfig_1.getAvailableProviders)();
|
|
130
|
+
const models = [];
|
|
131
|
+
for (const [providerId, provider] of Object.entries(available)) {
|
|
132
|
+
if (provider.models) {
|
|
133
|
+
for (const model of provider.models) {
|
|
134
|
+
models.push({
|
|
135
|
+
id: providerId + "/" + model,
|
|
136
|
+
object: "model",
|
|
137
|
+
created: Math.floor(Date.now() / 1000),
|
|
138
|
+
owned_by: provider.name || providerId,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Add aliases
|
|
144
|
+
for (const alias of Object.keys(OPENAI_ALIASES)) {
|
|
145
|
+
models.push({
|
|
146
|
+
id: alias,
|
|
147
|
+
object: "model",
|
|
148
|
+
created: Math.floor(Date.now() / 1000),
|
|
149
|
+
owned_by: "a3m-router",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return models;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=modelMapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelMapper.js","sourceRoot":"","sources":["../../src/server/modelMapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A3M Router - OpenAI-Compatible Proxy Server
|
|
3
|
+
*
|
|
4
|
+
* Lightweight HTTP server that accepts OpenAI API requests and routes them
|
|
5
|
+
* through the A3M Router engine. Uses only Node.js built-in http module.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints:
|
|
8
|
+
* POST /v1/chat/completions — OpenAI-compatible chat
|
|
9
|
+
* POST /v1/completions — OpenAI completions
|
|
10
|
+
* GET /v1/models — List available models
|
|
11
|
+
* GET /health — Health check with provider status
|
|
12
|
+
*
|
|
13
|
+
* Build: npx tsc
|
|
14
|
+
* Run: npx a3m-router serve [--port 8787]
|
|
15
|
+
*/
|
|
16
|
+
import * as http from "http";
|
|
17
|
+
import { CostTracker } from "../cost/costTracker";
|
|
18
|
+
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
|
+
declare const requestLogs: RequestLog[];
|
|
32
|
+
declare const costTracker: any;
|
|
33
|
+
/**
|
|
34
|
+
* Create and start the proxy server.
|
|
35
|
+
*
|
|
36
|
+
* @param port - Port to listen on (default: 8787, env: PORT)
|
|
37
|
+
* @returns The http.Server instance
|
|
38
|
+
*/
|
|
39
|
+
export declare function createProxyServer(port?: number): http.Server;
|
|
40
|
+
export { CostTracker, costTracker, requestLogs };
|
|
41
|
+
export default createProxyServer;
|
|
@@ -0,0 +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,KAAoB,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"}
|