adaptive-memory-multi-model-router 2.15.5 → 2.16.1
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/workflows/auto-submit-sitemap.yml +41 -0
- package/.github/workflows/mcp-pypi-publish.yml +34 -0
- package/.github/workflows/pypi-publish.yml +61 -17
- package/.github/workflows/tmlpd-publish.yml +23 -0
- package/README.md +181 -207
- package/RELEASE_v2.16.0.md +149 -0
- package/TECHNICAL_README.md +253 -0
- package/discoverability-diagnosis.md +280 -0
- package/dist/analytics/costAnalytics.d.ts.map +1 -1
- package/dist/benchmark/reproducible.d.ts.map +1 -1
- package/dist/cache/semanticCache.d.ts.map +1 -1
- package/dist/cli/setupWizard.d.ts +257 -50
- package/dist/cli/setupWizard.d.ts.map +1 -1
- package/dist/cli/setupWizard.js +419 -109
- package/dist/cli/setupWizard.js.map +1 -1
- package/dist/cli/tui.js +96 -67
- package/dist/cli.js +9 -0
- package/dist/cost/budgetEnforcer.d.ts.map +1 -1
- package/dist/cost/costTracker.d.ts.map +1 -1
- package/dist/ensemble/multiRoundDialog.d.ts.map +1 -1
- package/dist/ensemble/shapleyValue.d.ts.map +1 -1
- package/dist/ensemble.d.ts +1 -1
- package/dist/ensemble.js +141 -0
- package/dist/integrations/langchainAdapter.d.ts.map +1 -1
- package/dist/integrations/langchainAdapter.js +3 -3
- package/dist/integrations/langchainAdapter.js.map +1 -1
- package/dist/integrations/oauth.d.ts.map +1 -1
- package/dist/integrations/scienceAdapter.d.ts.map +1 -1
- package/dist/memory/autoFetch.d.ts.map +1 -1
- package/dist/memory/hybridMemory.d.ts.map +1 -1
- package/dist/memory/memoryTree.d.ts.map +1 -1
- package/dist/memory/obsidianVault.d.ts.map +1 -1
- package/dist/memory/reasoningBank.d.ts.map +1 -1
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/tracer.d.ts.map +1 -1
- package/dist/providers/providerConfig.d.ts.map +1 -1
- package/dist/providers/providerConfig.js +32 -17
- package/dist/providers/providerConfig.js.map +1 -1
- package/dist/routing/advancedRouter.d.ts.map +1 -1
- package/dist/routing/advancedRouter.js +106 -14
- package/dist/routing/advancedRouter.js.map +1 -1
- package/dist/routing/providerHealth.d.ts.map +1 -1
- package/dist/routing/providerRetry.d.ts.map +1 -1
- package/dist/routing/shadowSampler.js.map +1 -1
- package/dist/security/guardrails.d.ts.map +1 -1
- package/dist/server/handlers/chatHandler.d.ts.map +1 -1
- package/dist/server/handlers/completionsHandler.d.ts.map +1 -1
- package/dist/server/handlers/embeddingsHandler.d.ts.map +1 -1
- package/dist/server/handlers/healthHandler.d.ts.map +1 -1
- package/dist/server/handlers/metricsHandler.d.ts.map +1 -1
- package/dist/server/handlers/modelsHandler.d.ts.map +1 -1
- package/dist/server/metrics.d.ts.map +1 -1
- package/dist/server/proxyServer.d.ts.map +1 -1
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/state.d.ts.map +1 -1
- package/dist/skills/__tests__/skill_manager.test.js +5 -265
- package/dist/skills/__tests__/skill_manager.test.js.map +1 -1
- package/dist/utils/tokenUtils.d.ts.map +1 -1
- package/docs/ARTICLE_Biology_Inspired_Routing.md +208 -0
- package/docs/ARTICLE_Master.md +78 -0
- package/docs/ARTICLE_Master_CN.md +78 -0
- package/docs/ARTICLE_OpenRouter_Stripe.md +140 -0
- package/docs/DEVPTO_ARTICLE.md +84 -0
- package/docs/HUMAN_STYLE_GUIDE.md +75 -0
- package/docs/IMPRINT_PLAN.md +88 -0
- package/docs/OPENROUTER_ALTERNATIVE.md +184 -0
- package/docs/SOCIAL_CAMPAIGN.md +316 -0
- package/docs/anthropic.html +45 -0
- package/docs/best-llm-routers-2025.html +157 -0
- package/docs/cerebras.html +43 -0
- package/docs/cli-cheatsheet.md +286 -212
- package/docs/deepseek.html +44 -0
- package/docs/google.html +47 -0
- package/docs/groq.html +44 -0
- package/docs/mistral.html +43 -0
- package/docs/ollama.html +50 -0
- package/docs/openai.html +57 -0
- package/docs/sitemap.xml +69 -57
- package/docs-site/blog/best-llm-routers-2025.html +157 -0
- package/docs-site/index.html +59 -0
- package/docs-site/providers/anthropic.html +45 -0
- package/docs-site/providers/cerebras.html +43 -0
- package/docs-site/providers/deepseek.html +44 -0
- package/docs-site/providers/google.html +47 -0
- package/docs-site/providers/groq.html +44 -0
- package/docs-site/providers/index.html +41 -0
- package/docs-site/providers/mistral.html +43 -0
- package/docs-site/providers/ollama.html +50 -0
- package/docs-site/providers/openai.html +57 -0
- package/docs-site/sitemap.xml +69 -0
- package/package.json +36 -124
- package/python/README.md +33 -106
- package/python/mcp-server/a3m_mcp/__init__.py +20 -10
- package/python/mcp-server/a3m_mcp/server.py +172 -306
- package/python/pyproject.toml +6 -3
- package/scripts/submit-sitemap.sh +52 -0
- package/src/__types__/registry.d.ts +14 -0
- package/src/cli/setupWizard.ts +443 -112
- package/src/cli/tui.ts +159 -0
- package/src/ensemble.ts +154 -1
- package/src/integrations/langchainAdapter.ts +2 -2
- package/src/providers/providerConfig.ts +32 -17
- package/src/providers/registry.js +27 -0
- package/src/routing/advancedRouter.ts +99 -14
- package/src/routing/shadowSampler.ts +1 -1
- package/test-install/package.json +12 -0
- package/tests/tsconfig.json +0 -1
- package/tmlpd-pi-extension/README.md +105 -44
- package/tmlpd-pi-extension/docs/demo.svg +33 -0
- package/tmlpd-pi-extension/package.json +35 -106
- package/tmlpd-pi-extension/src/tokenOptimization/contextStratifier.ts +163 -0
- package/tmlpd-pi-extension/src/tokenOptimization/fetchOnceLocal.ts +136 -0
- package/tmlpd-pi-extension/src/tokenOptimization/index.ts +197 -0
- package/tmlpd-pi-extension/src/tokenOptimization/interAgentCompression.ts +157 -0
- package/tmlpd-pi-extension/src/tokenOptimization/schemaContract.ts +101 -0
- package/tmlpd-pi-extension/src/tokenOptimization/semanticCache.ts +248 -0
- package/tmlpd-pi-extension/src/tokenOptimization/tokenAwareFallback.ts +192 -0
- package/tmlpd-pi-extension/test/verify.js +21 -0
- package/tsconfig.build.json +2 -0
- package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts +0 -12
- package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts.map +0 -1
- package/packages/a3m-vercel-ai/dist/a3m-language-model.js +0 -289
- package/packages/a3m-vercel-ai/dist/a3m-language-model.js.map +0 -1
- package/packages/a3m-vercel-ai/dist/index.d.ts +0 -82
- package/packages/a3m-vercel-ai/dist/index.d.ts.map +0 -1
- package/packages/a3m-vercel-ai/dist/index.js +0 -79
- package/packages/a3m-vercel-ai/dist/index.js.map +0 -1
- package/packages/a3m-vercel-ai/dist/types.d.ts +0 -97
- package/packages/a3m-vercel-ai/dist/types.d.ts.map +0 -1
- package/packages/a3m-vercel-ai/dist/types.js +0 -5
- package/packages/a3m-vercel-ai/dist/types.js.map +0 -1
- package/python/a3m_router.egg-info/PKG-INFO +0 -172
- package/python/a3m_router.egg-info/SOURCES.txt +0 -17
- package/python/a3m_router.egg-info/dependency_links.txt +0 -1
- package/python/a3m_router.egg-info/requires.txt +0 -24
- package/python/a3m_router.egg-info/top_level.txt +0 -1
- package/python/dist/a3m_router-2.2.1-py3-none-any.whl +0 -0
- package/python/dist/a3m_router-2.2.1.tar.gz +0 -0
- package/python/dist/a3m_router-2.2.2-py3-none-any.whl +0 -0
- package/python/dist/a3m_router-2.2.2.tar.gz +0 -0
- package/src/skills/__tests__/skill_manager.test.ts +0 -328
- package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts +0 -114
- package/tmlpd-pi-extension/dist/cache/prefixCache.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/cache/prefixCache.js +0 -285
- package/tmlpd-pi-extension/dist/cache/prefixCache.js.map +0 -1
- package/tmlpd-pi-extension/dist/cache/responseCache.d.ts +0 -58
- package/tmlpd-pi-extension/dist/cache/responseCache.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/cache/responseCache.js +0 -153
- package/tmlpd-pi-extension/dist/cache/responseCache.js.map +0 -1
- package/tmlpd-pi-extension/dist/cli.js +0 -59
- package/tmlpd-pi-extension/dist/cost/costTracker.d.ts +0 -95
- package/tmlpd-pi-extension/dist/cost/costTracker.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/cost/costTracker.js +0 -240
- package/tmlpd-pi-extension/dist/cost/costTracker.js.map +0 -1
- package/tmlpd-pi-extension/dist/index.d.ts +0 -723
- package/tmlpd-pi-extension/dist/index.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/index.js +0 -239
- package/tmlpd-pi-extension/dist/index.js.map +0 -1
- package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts +0 -82
- package/tmlpd-pi-extension/dist/memory/episodicMemory.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/memory/episodicMemory.js +0 -145
- package/tmlpd-pi-extension/dist/memory/episodicMemory.js.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts +0 -102
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js +0 -207
- package/tmlpd-pi-extension/dist/orchestration/haloOrchestrator.js.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts +0 -85
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js +0 -210
- package/tmlpd-pi-extension/dist/orchestration/mctsWorkflow.js.map +0 -1
- package/tmlpd-pi-extension/dist/providers/localProvider.d.ts +0 -102
- package/tmlpd-pi-extension/dist/providers/localProvider.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/providers/localProvider.js +0 -338
- package/tmlpd-pi-extension/dist/providers/localProvider.js.map +0 -1
- package/tmlpd-pi-extension/dist/providers/registry.d.ts +0 -55
- package/tmlpd-pi-extension/dist/providers/registry.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/providers/registry.js +0 -138
- package/tmlpd-pi-extension/dist/providers/registry.js.map +0 -1
- package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts +0 -68
- package/tmlpd-pi-extension/dist/routing/advancedRouter.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/routing/advancedRouter.js +0 -332
- package/tmlpd-pi-extension/dist/routing/advancedRouter.js.map +0 -1
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts +0 -101
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.js +0 -368
- package/tmlpd-pi-extension/dist/tools/tmlpdTools.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts +0 -96
- package/tmlpd-pi-extension/dist/utils/batchProcessor.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/batchProcessor.js +0 -170
- package/tmlpd-pi-extension/dist/utils/batchProcessor.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/compression.d.ts +0 -61
- package/tmlpd-pi-extension/dist/utils/compression.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/compression.js +0 -281
- package/tmlpd-pi-extension/dist/utils/compression.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/reliability.d.ts +0 -74
- package/tmlpd-pi-extension/dist/utils/reliability.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/reliability.js +0 -177
- package/tmlpd-pi-extension/dist/utils/reliability.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts +0 -117
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js +0 -246
- package/tmlpd-pi-extension/dist/utils/speculativeDecoding.js.map +0 -1
- package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts +0 -50
- package/tmlpd-pi-extension/dist/utils/tokenUtils.d.ts.map +0 -1
- package/tmlpd-pi-extension/dist/utils/tokenUtils.js +0 -124
- package/tmlpd-pi-extension/dist/utils/tokenUtils.js.map +0 -1
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token-Aware Fallback Chain - Token Optimization Pattern #3
|
|
3
|
+
*
|
|
4
|
+
* Route to smaller models when high-token content is detected.
|
|
5
|
+
* Reduces cost by using cheap models for simple/high-volume queries.
|
|
6
|
+
*
|
|
7
|
+
* Based on: arXiv:2608.17188 - Token Optimization and Context Window Management
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export interface TokenThreshold {
|
|
11
|
+
maxTokens: number;
|
|
12
|
+
models: string[]; // Available models at this tier
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface TokenAwareFallbackConfig {
|
|
16
|
+
thresholds: TokenThreshold[];
|
|
17
|
+
defaultModel?: string;
|
|
18
|
+
enableDynamicThreshold?: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface FallbackDecision {
|
|
22
|
+
targetModel: string;
|
|
23
|
+
tier: "cheap" | "medium" | "expensive";
|
|
24
|
+
estimatedTokens: number;
|
|
25
|
+
reasoning: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Model cost tiers (approximate, per 1M tokens)
|
|
30
|
+
*/
|
|
31
|
+
const MODEL_COSTS: Record<string, number> = {
|
|
32
|
+
// Cheap tier (< $0.50/1M)
|
|
33
|
+
"gpt-4o-mini": 0.15,
|
|
34
|
+
"claude-haiku": 0.25,
|
|
35
|
+
"gemini-flash": 0.075,
|
|
36
|
+
"gpt-3.5-turbo": 0.50,
|
|
37
|
+
|
|
38
|
+
// Medium tier ($0.50 - $3.00/1M)
|
|
39
|
+
"gpt-4o": 2.50,
|
|
40
|
+
"claude-sonnet": 3.00,
|
|
41
|
+
"gemini-pro": 1.25,
|
|
42
|
+
|
|
43
|
+
// Expensive tier (> $3.00/1M)
|
|
44
|
+
"gpt-4-turbo": 10.00,
|
|
45
|
+
"claude-opus": 15.00,
|
|
46
|
+
"gpt-4": 30.00,
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export class TokenAwareFallback {
|
|
50
|
+
private config: TokenAwareFallbackConfig;
|
|
51
|
+
|
|
52
|
+
constructor(config: Partial<TokenAwareFallbackConfig> = {}) {
|
|
53
|
+
this.config = {
|
|
54
|
+
thresholds: config.thresholds ?? [
|
|
55
|
+
{ maxTokens: 500, models: ["gpt-4o-mini", "claude-haiku", "gemini-flash"] },
|
|
56
|
+
{ maxTokens: 2000, models: ["gpt-4o", "claude-sonnet", "gemini-pro"] },
|
|
57
|
+
{ maxTokens: Infinity, models: ["gpt-4o", "claude-opus", "gpt-4-turbo"] },
|
|
58
|
+
],
|
|
59
|
+
defaultModel: config.defaultModel ?? "gpt-4o",
|
|
60
|
+
enableDynamicThreshold: config.enableDynamicThreshold ?? false,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Estimate token count from text (rough approximation)
|
|
66
|
+
*/
|
|
67
|
+
estimateTokens(text: string): number {
|
|
68
|
+
// ~4 characters per token for English
|
|
69
|
+
return Math.ceil(text.length / 4);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Estimate tokens including history
|
|
74
|
+
*/
|
|
75
|
+
estimateTotalTokens(
|
|
76
|
+
query: string,
|
|
77
|
+
history?: Array<{ content: string }>
|
|
78
|
+
): number {
|
|
79
|
+
let total = this.estimateTokens(query);
|
|
80
|
+
|
|
81
|
+
if (history) {
|
|
82
|
+
total += history.reduce((sum, msg) => sum + this.estimateTokens(msg.content), 0);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return total;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Select appropriate model based on token count
|
|
90
|
+
*/
|
|
91
|
+
selectModel(estimatedTokens: number): FallbackDecision {
|
|
92
|
+
for (const threshold of this.config.thresholds) {
|
|
93
|
+
if (estimatedTokens <= threshold.maxTokens) {
|
|
94
|
+
const model = threshold.models[0]; // Select first available in tier
|
|
95
|
+
const tier = this.getModelTier(model);
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
targetModel: model,
|
|
99
|
+
tier,
|
|
100
|
+
estimatedTokens,
|
|
101
|
+
reasoning: `Selected ${tier} model ${model} for ${estimatedTokens} tokens`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Fallback to default
|
|
107
|
+
return {
|
|
108
|
+
targetModel: this.config.defaultModel!,
|
|
109
|
+
tier: "medium",
|
|
110
|
+
estimatedTokens,
|
|
111
|
+
reasoning: `Defaulting to ${this.config.defaultModel} for ${estimatedTokens} tokens`,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Get cost tier for a model
|
|
117
|
+
*/
|
|
118
|
+
private getModelTier(model: string): "cheap" | "medium" | "expensive" {
|
|
119
|
+
const cost = MODEL_COSTS[model.toLowerCase()] ?? 1.0;
|
|
120
|
+
if (cost < 0.5) return "cheap";
|
|
121
|
+
if (cost < 3.0) return "medium";
|
|
122
|
+
return "expensive";
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Create fallback chain for a query
|
|
127
|
+
*/
|
|
128
|
+
createFallbackChain(
|
|
129
|
+
query: string,
|
|
130
|
+
history?: Array<{ content: string }>
|
|
131
|
+
): string[] {
|
|
132
|
+
const estimatedTokens = this.estimateTotalTokens(query, history);
|
|
133
|
+
const chain: string[] = [];
|
|
134
|
+
|
|
135
|
+
// Find appropriate tier and all models in that tier
|
|
136
|
+
for (const threshold of this.config.thresholds) {
|
|
137
|
+
if (estimatedTokens <= threshold.maxTokens) {
|
|
138
|
+
chain.push(...threshold.models);
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// If still empty, add all models
|
|
144
|
+
if (chain.length === 0) {
|
|
145
|
+
for (const threshold of this.config.thresholds) {
|
|
146
|
+
chain.push(...threshold.models);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return chain;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Estimate cost savings vs always using expensive model
|
|
155
|
+
*/
|
|
156
|
+
estimateSavings(
|
|
157
|
+
query: string,
|
|
158
|
+
history?: Array<{ content: string }>
|
|
159
|
+
): { savingsPercent: number; cheapModel: string; expensiveModel: string } {
|
|
160
|
+
const estimatedTokens = this.estimateTotalTokens(query, history);
|
|
161
|
+
const decision = this.selectModel(estimatedTokens);
|
|
162
|
+
|
|
163
|
+
const cheapCost = this.getModelCost(decision.targetModel) * estimatedTokens / 1_000_000;
|
|
164
|
+
const expensiveCost = this.getModelCost("gpt-4-turbo") * estimatedTokens / 1_000_000;
|
|
165
|
+
|
|
166
|
+
const savingsPercent = expensiveCost > 0
|
|
167
|
+
? ((expensiveCost - cheapCost) / expensiveCost) * 100
|
|
168
|
+
: 0;
|
|
169
|
+
|
|
170
|
+
return {
|
|
171
|
+
savingsPercent: Math.round(savingsPercent * 100) / 100,
|
|
172
|
+
cheapModel: decision.targetModel,
|
|
173
|
+
expensiveModel: "gpt-4-turbo",
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Get model cost per 1M tokens
|
|
179
|
+
*/
|
|
180
|
+
getModelCost(model: string): number {
|
|
181
|
+
return MODEL_COSTS[model.toLowerCase()] ?? 1.0;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Get all configured thresholds
|
|
186
|
+
*/
|
|
187
|
+
getThresholds(): TokenThreshold[] {
|
|
188
|
+
return this.config.thresholds;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export default TokenAwareFallback;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Smoke test: package compiles, core exports + tokenOptimization module load
|
|
2
|
+
const assert = require("assert");
|
|
3
|
+
|
|
4
|
+
const mod = require("../dist/index.js");
|
|
5
|
+
|
|
6
|
+
// Core exports exist
|
|
7
|
+
for (const name of ["createTMLPD", "TMLPDTools", "ResponseCache", "CostTracker", "ProviderRegistry"]) {
|
|
8
|
+
assert(name in mod, `missing core export: ${name}`);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// tokenOptimization sub-module loads (added v1.3.2)
|
|
12
|
+
const to = require("../dist/tokenOptimization/index.js");
|
|
13
|
+
for (const name of ["SemanticCache", "ContextStratifier", "TokenAwareFallback", "SchemaContractor", "FetchOnceProcessor"]) {
|
|
14
|
+
assert(name in to, `missing tokenOptimization export: ${name}`);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// SemanticCache basic behavior
|
|
18
|
+
const cache = new to.SemanticCache({ maxEntries: 10 });
|
|
19
|
+
assert(typeof cache.get === "function" && typeof cache.set === "function", "SemanticCache API broken");
|
|
20
|
+
|
|
21
|
+
console.log("✓ smoke test passed — dist loads, tokenOptimization exports verified");
|
package/tsconfig.build.json
CHANGED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A3M Router Language Model for Vercel AI SDK (v3)
|
|
3
|
-
*
|
|
4
|
-
* Implements the LanguageModelV1 interface from @ai-sdk/provider
|
|
5
|
-
*/
|
|
6
|
-
import { LanguageModelV1 } from '@ai-sdk/provider';
|
|
7
|
-
import type { A3MRouterConfig } from './types';
|
|
8
|
-
/**
|
|
9
|
-
* Create an A3M Router Language Model for Vercel AI SDK
|
|
10
|
-
*/
|
|
11
|
-
export declare function createA3MLanguageModel(config?: A3MRouterConfig): LanguageModelV1;
|
|
12
|
-
//# sourceMappingURL=a3m-language-model.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"a3m-language-model.d.ts","sourceRoot":"","sources":["../src/a3m-language-model.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EAOhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA6C/C;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,eAAoB,mBA6TlE"}
|
|
@@ -1,289 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A3M Router Language Model for Vercel AI SDK (v3)
|
|
3
|
-
*
|
|
4
|
-
* Implements the LanguageModelV1 interface from @ai-sdk/provider
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Convert Vercel AI SDK prompt format to OpenAI format for A3M
|
|
8
|
-
*/
|
|
9
|
-
function convertMessages(prompt) {
|
|
10
|
-
const result = [];
|
|
11
|
-
// Handle string prompts
|
|
12
|
-
if (typeof prompt === 'string') {
|
|
13
|
-
return [{ role: 'user', content: prompt }];
|
|
14
|
-
}
|
|
15
|
-
// messages is an array of prompt parts
|
|
16
|
-
for (const part of prompt) {
|
|
17
|
-
if (part.role === 'system') {
|
|
18
|
-
result.push({ role: 'system', content: part.content });
|
|
19
|
-
}
|
|
20
|
-
else if (part.role === 'user') {
|
|
21
|
-
if (typeof part.content === 'string') {
|
|
22
|
-
result.push({ role: 'user', content: part.content });
|
|
23
|
-
}
|
|
24
|
-
else if (Array.isArray(part.content)) {
|
|
25
|
-
const textContent = part.content
|
|
26
|
-
.filter((p) => p.type === 'text')
|
|
27
|
-
.map(p => p.text)
|
|
28
|
-
.join('\n');
|
|
29
|
-
result.push({ role: 'user', content: textContent });
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
else if (part.role === 'assistant') {
|
|
33
|
-
if (typeof part.content === 'string') {
|
|
34
|
-
result.push({ role: 'assistant', content: part.content });
|
|
35
|
-
}
|
|
36
|
-
else if (Array.isArray(part.content)) {
|
|
37
|
-
const textContent = part.content
|
|
38
|
-
.filter((p) => p.type === 'text')
|
|
39
|
-
.map(p => p.text)
|
|
40
|
-
.join('\n');
|
|
41
|
-
result.push({ role: 'assistant', content: textContent });
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return result;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Create an A3M Router Language Model for Vercel AI SDK
|
|
49
|
-
*/
|
|
50
|
-
export function createA3MLanguageModel(config = {}) {
|
|
51
|
-
const baseURL = config.baseURL || 'http://localhost:8787';
|
|
52
|
-
const apiKey = config.apiKey || 'not-needed';
|
|
53
|
-
const model = {
|
|
54
|
-
specificationVersion: 'v1',
|
|
55
|
-
provider: 'a3m',
|
|
56
|
-
modelId: 'auto',
|
|
57
|
-
defaultObjectGenerationMode: undefined,
|
|
58
|
-
async doGenerate(options) {
|
|
59
|
-
const messages = convertMessages(options.prompt);
|
|
60
|
-
// Extract system prompt if present
|
|
61
|
-
const systemMessages = messages.filter(m => m.role === 'system');
|
|
62
|
-
const nonSystemMessages = messages.filter(m => m.role !== 'system');
|
|
63
|
-
const system = systemMessages.map(m => m.content).join('\n');
|
|
64
|
-
// Build the request body for A3M
|
|
65
|
-
const requestBody = {
|
|
66
|
-
model: 'auto',
|
|
67
|
-
messages: nonSystemMessages.length > 0 ? nonSystemMessages : [{ role: 'user', content: ' ' }],
|
|
68
|
-
};
|
|
69
|
-
if (system) {
|
|
70
|
-
requestBody.system = system;
|
|
71
|
-
}
|
|
72
|
-
if (options.temperature !== undefined) {
|
|
73
|
-
requestBody.temperature = options.temperature;
|
|
74
|
-
}
|
|
75
|
-
if (options.maxTokens !== undefined) {
|
|
76
|
-
requestBody.max_tokens = options.maxTokens;
|
|
77
|
-
}
|
|
78
|
-
if (options.topP !== undefined) {
|
|
79
|
-
requestBody.top_p = options.topP;
|
|
80
|
-
}
|
|
81
|
-
if (options.stopSequences !== undefined) {
|
|
82
|
-
requestBody.stop = options.stopSequences;
|
|
83
|
-
}
|
|
84
|
-
if (config.parallelEnsemble) {
|
|
85
|
-
requestBody.parallel = config.parallelCount || 3;
|
|
86
|
-
}
|
|
87
|
-
if (config.stealth) {
|
|
88
|
-
requestBody.stealth = true;
|
|
89
|
-
}
|
|
90
|
-
try {
|
|
91
|
-
// Call A3M Router
|
|
92
|
-
const response = await fetch(`${baseURL}/v1/chat/completions`, {
|
|
93
|
-
method: 'POST',
|
|
94
|
-
headers: {
|
|
95
|
-
'Content-Type': 'application/json',
|
|
96
|
-
'Authorization': `Bearer ${apiKey}`,
|
|
97
|
-
},
|
|
98
|
-
body: JSON.stringify(requestBody),
|
|
99
|
-
});
|
|
100
|
-
if (!response.ok) {
|
|
101
|
-
const error = await response.text();
|
|
102
|
-
throw new Error(`A3M Router error: ${response.status} ${error}`);
|
|
103
|
-
}
|
|
104
|
-
const data = await response.json();
|
|
105
|
-
const choice = data.choices[0];
|
|
106
|
-
return {
|
|
107
|
-
text: choice.message.content || undefined,
|
|
108
|
-
toolCalls: choice.message.tool_calls?.map(tc => ({
|
|
109
|
-
toolCallType: 'function',
|
|
110
|
-
toolCallId: tc.id,
|
|
111
|
-
toolName: tc.function.name,
|
|
112
|
-
args: tc.function.arguments,
|
|
113
|
-
})),
|
|
114
|
-
finishReason: choice.finish_reason || 'stop',
|
|
115
|
-
usage: {
|
|
116
|
-
promptTokens: data.usage?.prompt_tokens || 0,
|
|
117
|
-
completionTokens: data.usage?.completion_tokens || 0,
|
|
118
|
-
totalTokens: data.usage?.total_tokens || 0,
|
|
119
|
-
},
|
|
120
|
-
rawCall: {
|
|
121
|
-
rawPrompt: messages,
|
|
122
|
-
rawSettings: requestBody,
|
|
123
|
-
},
|
|
124
|
-
providerMetadata: data._meta ? {
|
|
125
|
-
a3m: {
|
|
126
|
-
provider: data._meta.provider,
|
|
127
|
-
cost: data._meta.cost,
|
|
128
|
-
},
|
|
129
|
-
} : undefined,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
catch (error) {
|
|
133
|
-
throw new Error(`A3M Router generation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
doStream(options) {
|
|
137
|
-
const messages = convertMessages(options.prompt);
|
|
138
|
-
// Extract system prompt if present
|
|
139
|
-
const systemMessages = messages.filter(m => m.role === 'system');
|
|
140
|
-
const nonSystemMessages = messages.filter(m => m.role !== 'system');
|
|
141
|
-
const system = systemMessages.map(m => m.content).join('\n');
|
|
142
|
-
const requestBody = {
|
|
143
|
-
model: 'auto',
|
|
144
|
-
messages: nonSystemMessages.length > 0 ? nonSystemMessages : [{ role: 'user', content: ' ' }],
|
|
145
|
-
stream: true,
|
|
146
|
-
};
|
|
147
|
-
if (system) {
|
|
148
|
-
requestBody.system = system;
|
|
149
|
-
}
|
|
150
|
-
if (options.temperature !== undefined) {
|
|
151
|
-
requestBody.temperature = options.temperature;
|
|
152
|
-
}
|
|
153
|
-
if (options.maxTokens !== undefined) {
|
|
154
|
-
requestBody.max_tokens = options.maxTokens;
|
|
155
|
-
}
|
|
156
|
-
if (config.parallelEnsemble) {
|
|
157
|
-
requestBody.parallel = config.parallelCount || 3;
|
|
158
|
-
}
|
|
159
|
-
if (config.stealth) {
|
|
160
|
-
requestBody.stealth = true;
|
|
161
|
-
}
|
|
162
|
-
let attemptCount = 0;
|
|
163
|
-
const maxAttempts = 3;
|
|
164
|
-
const doStream = async () => {
|
|
165
|
-
attemptCount++;
|
|
166
|
-
try {
|
|
167
|
-
const response = await fetch(`${baseURL}/v1/chat/completions`, {
|
|
168
|
-
method: 'POST',
|
|
169
|
-
headers: {
|
|
170
|
-
'Content-Type': 'application/json',
|
|
171
|
-
'Authorization': `Bearer ${apiKey}`,
|
|
172
|
-
},
|
|
173
|
-
body: JSON.stringify(requestBody),
|
|
174
|
-
});
|
|
175
|
-
if (!response.ok) {
|
|
176
|
-
const error = await response.text();
|
|
177
|
-
throw new Error(`A3M Router streaming error: ${response.status} ${error}`);
|
|
178
|
-
}
|
|
179
|
-
if (!response.body) {
|
|
180
|
-
throw new Error('A3M Router: no response body');
|
|
181
|
-
}
|
|
182
|
-
const stream = new ReadableStream({
|
|
183
|
-
async start(controller) {
|
|
184
|
-
const reader = response.body.getReader();
|
|
185
|
-
const decoder = new TextDecoder();
|
|
186
|
-
let buffer = '';
|
|
187
|
-
try {
|
|
188
|
-
while (true) {
|
|
189
|
-
const { done, value } = await reader.read();
|
|
190
|
-
if (done) {
|
|
191
|
-
controller.close();
|
|
192
|
-
break;
|
|
193
|
-
}
|
|
194
|
-
buffer += decoder.decode(value, { stream: true });
|
|
195
|
-
const lines = buffer.split('\n');
|
|
196
|
-
buffer = lines.pop() || '';
|
|
197
|
-
for (const line of lines) {
|
|
198
|
-
if (line.startsWith('data: ')) {
|
|
199
|
-
const data = line.slice(6);
|
|
200
|
-
if (data === '[DONE]') {
|
|
201
|
-
controller.close();
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
try {
|
|
205
|
-
const parsed = JSON.parse(data);
|
|
206
|
-
// Handle chat completion chunks
|
|
207
|
-
if (parsed.choices?.[0]?.delta?.content) {
|
|
208
|
-
const chunk = parsed.choices[0].delta.content;
|
|
209
|
-
controller.enqueue({
|
|
210
|
-
type: 'text-delta',
|
|
211
|
-
textDelta: chunk,
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
// Handle tool call start
|
|
215
|
-
if (parsed.choices?.[0]?.delta?.tool_calls?.[0]) {
|
|
216
|
-
const toolCall = parsed.choices[0].delta.tool_calls[0];
|
|
217
|
-
if (toolCall.id) {
|
|
218
|
-
controller.enqueue({
|
|
219
|
-
type: 'tool-call',
|
|
220
|
-
toolCallType: 'function',
|
|
221
|
-
toolCallId: toolCall.id,
|
|
222
|
-
toolName: toolCall.function?.name || '',
|
|
223
|
-
args: toolCall.function?.arguments || '',
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
// Handle tool call delta
|
|
228
|
-
if (parsed.choices?.[0]?.delta?.tool_calls?.[0]?.function?.arguments) {
|
|
229
|
-
const argsDelta = parsed.choices[0].delta.tool_calls[0].function.arguments;
|
|
230
|
-
if (argsDelta) {
|
|
231
|
-
controller.enqueue({
|
|
232
|
-
type: 'tool-call-delta',
|
|
233
|
-
toolCallType: 'function',
|
|
234
|
-
toolCallId: parsed.choices[0].delta.tool_calls[0].id,
|
|
235
|
-
toolName: parsed.choices[0].delta.tool_calls[0].function?.name || '',
|
|
236
|
-
argsTextDelta: argsDelta,
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
// Handle finish
|
|
241
|
-
if (parsed.choices?.[0]?.finish_reason) {
|
|
242
|
-
controller.enqueue({
|
|
243
|
-
type: 'finish',
|
|
244
|
-
finishReason: parsed.choices[0].finish_reason,
|
|
245
|
-
usage: {
|
|
246
|
-
promptTokens: parsed.usage?.prompt_tokens || 0,
|
|
247
|
-
completionTokens: parsed.usage?.completion_tokens || 0,
|
|
248
|
-
},
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
catch {
|
|
253
|
-
// Skip malformed JSON
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
catch (streamError) {
|
|
260
|
-
controller.error(streamError);
|
|
261
|
-
}
|
|
262
|
-
},
|
|
263
|
-
});
|
|
264
|
-
return {
|
|
265
|
-
stream,
|
|
266
|
-
rawCall: {
|
|
267
|
-
rawPrompt: messages,
|
|
268
|
-
rawSettings: requestBody,
|
|
269
|
-
},
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
catch (error) {
|
|
273
|
-
if (attemptCount < maxAttempts) {
|
|
274
|
-
await new Promise(resolve => setTimeout(resolve, 1000 * attemptCount));
|
|
275
|
-
return doStream();
|
|
276
|
-
}
|
|
277
|
-
throw error;
|
|
278
|
-
}
|
|
279
|
-
};
|
|
280
|
-
return new Promise((resolve, reject) => {
|
|
281
|
-
doStream()
|
|
282
|
-
.then(resolve)
|
|
283
|
-
.catch(reject);
|
|
284
|
-
});
|
|
285
|
-
},
|
|
286
|
-
};
|
|
287
|
-
return model;
|
|
288
|
-
}
|
|
289
|
-
//# sourceMappingURL=a3m-language-model.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"a3m-language-model.js","sourceRoot":"","sources":["../src/a3m-language-model.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH;;GAEG;AACH,SAAS,eAAe,CACtB,MAA4C;IAE5C,MAAM,MAAM,GAAsE,EAAE,CAAC;IAErF,wBAAwB;IACxB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,uCAAuC;IACvC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACvD,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO;qBAC7B,MAAM,CAAC,CAAC,CAAC,EAAuC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;qBACrE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBAChB,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACrC,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO;qBAC7B,MAAM,CAAC,CAAC,CAAC,EAAuC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;qBACrE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBAChB,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAA0B,EAAE;IACjE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,uBAAuB,CAAC;IAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC;IAE7C,MAAM,KAAK,GAAoB;QAC7B,oBAAoB,EAAE,IAAI;QAC1B,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,MAAM;QACf,2BAA2B,EAAE,SAAS;QAEtC,KAAK,CAAC,UAAU,CAAC,OAAmC;YAgBlD,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEjD,mCAAmC;YACnC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACjE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE7D,iCAAiC;YACjC,MAAM,WAAW,GAA4B;gBAC3C,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;aAC9F,CAAC;YAEF,IAAI,MAAM,EAAE,CAAC;gBACX,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;YAC9B,CAAC;YAED,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBACtC,WAAW,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YAChD,CAAC;YAED,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACpC,WAAW,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;YAC7C,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/B,WAAW,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;YACnC,CAAC;YAED,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;gBACxC,WAAW,CAAC,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;YAC3C,CAAC;YAED,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,CAAC;YAED,IAAI,CAAC;gBACH,kBAAkB;gBAClB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,sBAAsB,EAAE;oBAC7D,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,eAAe,EAAE,UAAU,MAAM,EAAE;qBACpC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;iBAClC,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACpC,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;gBACnE,CAAC;gBAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAoB/B,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAE/B,OAAO;oBACL,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,SAAS;oBACzC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBAC/C,YAAY,EAAE,UAAmB;wBACjC,UAAU,EAAE,EAAE,CAAC,EAAE;wBACjB,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;wBAC1B,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS;qBAC5B,CAAC,CAAC;oBACH,YAAY,EAAG,MAAM,CAAC,aAA6C,IAAI,MAAM;oBAC7E,KAAK,EAAE;wBACL,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;wBAC5C,gBAAgB,EAAE,IAAI,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC;wBACpD,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;qBAC3C;oBACD,OAAO,EAAE;wBACP,SAAS,EAAE,QAAQ;wBACnB,WAAW,EAAE,WAAW;qBACzB;oBACD,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;wBAC7B,GAAG,EAAE;4BACH,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;4BAC7B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;yBACtB;qBACF,CAAC,CAAC,CAAC,SAAS;iBACd,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC1F,CAAC;YACJ,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,OAAmC;YAC1C,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEjD,mCAAmC;YACnC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACjE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE7D,MAAM,WAAW,GAA4B;gBAC3C,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;gBAC7F,MAAM,EAAE,IAAI;aACb,CAAC;YAEF,IAAI,MAAM,EAAE,CAAC;gBACX,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC;YAC9B,CAAC;YAED,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBACtC,WAAW,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;YAChD,CAAC;YAED,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACpC,WAAW,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;YAC7C,CAAC;YAED,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;YACnD,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC7B,CAAC;YAED,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,MAAM,WAAW,GAAG,CAAC,CAAC;YAEtB,MAAM,QAAQ,GAAG,KAAK,IAGnB,EAAE;gBACH,YAAY,EAAE,CAAC;gBAEf,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,sBAAsB,EAAE;wBAC7D,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE;4BACP,cAAc,EAAE,kBAAkB;4BAClC,eAAe,EAAE,UAAU,MAAM,EAAE;yBACpC;wBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;qBAClC,CAAC,CAAC;oBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;wBACpC,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;oBAC7E,CAAC;oBAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;wBACnB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;oBAClD,CAAC;oBAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAA4B;wBAC3D,KAAK,CAAC,KAAK,CAAC,UAAU;4BACpB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAK,CAAC,SAAS,EAAE,CAAC;4BAC1C,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;4BAClC,IAAI,MAAM,GAAG,EAAE,CAAC;4BAEhB,IAAI,CAAC;gCACH,OAAO,IAAI,EAAE,CAAC;oCACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oCAE5C,IAAI,IAAI,EAAE,CAAC;wCACT,UAAU,CAAC,KAAK,EAAE,CAAC;wCACnB,MAAM;oCACR,CAAC;oCAED,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oCAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oCACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;oCAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wCACzB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;4CAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;4CAE3B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gDACtB,UAAU,CAAC,KAAK,EAAE,CAAC;gDACnB,OAAO;4CACT,CAAC;4CAED,IAAI,CAAC;gDACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gDAEhC,gCAAgC;gDAChC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;oDACxC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;oDAC9C,UAAU,CAAC,OAAO,CAAC;wDACjB,IAAI,EAAE,YAAY;wDAClB,SAAS,EAAE,KAAK;qDACY,CAAC,CAAC;gDAClC,CAAC;gDAED,yBAAyB;gDACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oDAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oDACvD,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;wDAChB,UAAU,CAAC,OAAO,CAAC;4DACjB,IAAI,EAAE,WAAW;4DACjB,YAAY,EAAE,UAAU;4DACxB,UAAU,EAAE,QAAQ,CAAC,EAAE;4DACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE;4DACvC,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,IAAI,EAAE;yDACZ,CAAC,CAAC;oDAClC,CAAC;gDACH,CAAC;gDAED,yBAAyB;gDACzB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;oDACrE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;oDAC3E,IAAI,SAAS,EAAE,CAAC;wDACd,UAAU,CAAC,OAAO,CAAC;4DACjB,IAAI,EAAE,iBAAiB;4DACvB,YAAY,EAAE,UAAU;4DACxB,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;4DACpD,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE;4DACpE,aAAa,EAAE,SAAS;yDACI,CAAC,CAAC;oDAClC,CAAC;gDACH,CAAC;gDAED,gBAAgB;gDAChB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;oDACvC,UAAU,CAAC,OAAO,CAAC;wDACjB,IAAI,EAAE,QAAQ;wDACd,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAA4C;wDAC5E,KAAK,EAAE;4DACL,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;4DAC9C,gBAAgB,EAAE,MAAM,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC;yDACvD;qDAC2B,CAAC,CAAC;gDAClC,CAAC;4CACH,CAAC;4CAAC,MAAM,CAAC;gDACP,sBAAsB;4CACxB,CAAC;wCACH,CAAC;oCACH,CAAC;gCACH,CAAC;4BACH,CAAC;4BAAC,OAAO,WAAW,EAAE,CAAC;gCACrB,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;4BAChC,CAAC;wBACH,CAAC;qBACF,CAAC,CAAC;oBAEH,OAAO;wBACL,MAAM;wBACN,OAAO,EAAE;4BACP,SAAS,EAAE,QAAQ;4BACnB,WAAW,EAAE,WAAW;yBACzB;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,YAAY,GAAG,WAAW,EAAE,CAAC;wBAC/B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC;wBACvE,OAAO,QAAQ,EAAE,CAAC;oBACpB,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC,CAAC;YAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,QAAQ,EAAE;qBACP,IAAI,CAAC,OAAO,CAAC;qBACb,KAAK,CAAC,MAAM,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @a3m/vercel-ai - A3M Router Provider for Vercel AI SDK
|
|
3
|
-
*
|
|
4
|
-
* Drop-in replacement that routes to the cheapest capable provider
|
|
5
|
-
* with parallel execution, caching, and automatic fallback.
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
8
|
-
* ```typescript
|
|
9
|
-
* import { createA3MProvider } from '@a3m/vercel-ai';
|
|
10
|
-
* import { generateText } from 'ai';
|
|
11
|
-
*
|
|
12
|
-
* const a3m = createA3MProvider();
|
|
13
|
-
*
|
|
14
|
-
* const { text } = await generateText({
|
|
15
|
-
* model: a3m('auto'),
|
|
16
|
-
* prompt: 'What is the capital of France?',
|
|
17
|
-
* });
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
20
|
-
export type { A3MRouterConfig, A3MRouteResponse, A3MStreamChunk } from './types';
|
|
21
|
-
export { createA3MLanguageModel } from './a3m-language-model';
|
|
22
|
-
import type { LanguageModelV1 } from '@ai-sdk/provider';
|
|
23
|
-
import type { A3MRouterConfig } from './types';
|
|
24
|
-
/**
|
|
25
|
-
* A3M Router provider for Vercel AI SDK
|
|
26
|
-
*/
|
|
27
|
-
export interface A3MProvider {
|
|
28
|
-
name: 'a3m';
|
|
29
|
-
/**
|
|
30
|
-
* Returns an A3M language model.
|
|
31
|
-
*
|
|
32
|
-
* @param modelId - Use 'auto' for automatic routing, or specify a model like 'gpt-4', 'claude-3', etc.
|
|
33
|
-
*/
|
|
34
|
-
(modelId: string): LanguageModelV1;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Create an A3M Router provider for Vercel AI SDK
|
|
38
|
-
*/
|
|
39
|
-
export declare function createA3MProvider(config?: A3MRouterConfig): A3MProvider;
|
|
40
|
-
/**
|
|
41
|
-
* Example usage with Next.js App Router
|
|
42
|
-
*
|
|
43
|
-
* ```typescript
|
|
44
|
-
* // app/api/chat/route.ts
|
|
45
|
-
* import { createA3MProvider } from '@a3m/vercel-ai';
|
|
46
|
-
* import { generateText } from 'ai';
|
|
47
|
-
*
|
|
48
|
-
* const a3m = createA3MProvider({
|
|
49
|
-
* parallelEnsemble: true,
|
|
50
|
-
* });
|
|
51
|
-
*
|
|
52
|
-
* export async function POST(req: Request) {
|
|
53
|
-
* const { messages } = await req.json();
|
|
54
|
-
*
|
|
55
|
-
* const result = await generateText({
|
|
56
|
-
* model: a3m('auto'),
|
|
57
|
-
* messages,
|
|
58
|
-
* });
|
|
59
|
-
*
|
|
60
|
-
* return Response.json(result);
|
|
61
|
-
* }
|
|
62
|
-
* ```
|
|
63
|
-
*/
|
|
64
|
-
/**
|
|
65
|
-
* Example usage with streaming
|
|
66
|
-
*
|
|
67
|
-
* ```typescript
|
|
68
|
-
* import { createA3MProvider } from '@a3m/vercel-ai';
|
|
69
|
-
* import { streamText } from 'ai';
|
|
70
|
-
*
|
|
71
|
-
* const a3m = createA3MProvider();
|
|
72
|
-
*
|
|
73
|
-
* const result = await streamText({
|
|
74
|
-
* model: a3m('auto'),
|
|
75
|
-
* prompt: 'Write a story about a robot...',
|
|
76
|
-
* });
|
|
77
|
-
*
|
|
78
|
-
* // Stream to response
|
|
79
|
-
* return result.toDataStreamResponse();
|
|
80
|
-
* ```
|
|
81
|
-
*/
|
|
82
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,KAAK,CAAC;IACZ;;;;OAIG;IACH,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,eAAoB,GAAG,WAAW,CAgB3E;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;;;;;;;;;;;;;;GAiBG"}
|