adaptive-memory-multi-model-router 2.15.4 → 2.16.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/AGENT_COUNCIL_FINDINGS.md +123 -98
- package/CAMPAIGN_SUMMARY.md +87 -0
- package/CHANGELOG.md +7 -1
- package/ENTERPRISE_INTEGRATIONS.md +94 -0
- package/INTEGRATION_PROGRESS.md +96 -0
- package/OPPORTUNITIES_100.md +277 -0
- package/POPULARITY_BOOSTERS.md +1 -1
- package/README.md +147 -275
- package/README_ja.md +17 -21
- package/README_zh.md +13 -17
- package/TODO_BROWSER_AUTOMATION.md +87 -0
- package/a3m-integrations-summary.md +73 -0
- package/apps/cost-calculator/README.md +72 -0
- package/apps/cost-calculator/calculator.css +280 -0
- package/apps/cost-calculator/calculator.js +150 -0
- package/apps/cost-calculator/index.html +321 -0
- package/apps/cost-calculator/package.json +13 -0
- package/articles/ANNOUNCEMENT_reddit_ml.md +76 -0
- package/articles/ANNOUNCEMENT_vc/347/244/276/345/214/272.md +71 -0
- package/articles/ANNOUNCEMENT_vercel.md +85 -0
- package/articles/CHINESE_DIRECTORIES.md +2 -2
- package/articles/CHINESE_SUBMISSIONS_READY.md +5 -5
- package/articles/HN_POST_READY.md +16 -20
- package/articles/INDIEHACKERS_READY.md +19 -34
- package/dist/analytics/costAnalytics.d.ts +0 -1
- package/dist/benchmark/reproducible.d.ts +0 -1
- package/dist/cache/semanticCache.d.ts +0 -1
- package/dist/cost/budgetEnforcer.d.ts +0 -1
- package/dist/cost/costTracker.d.ts +0 -1
- package/dist/ensemble/multiRoundDialog.d.ts +0 -1
- package/dist/ensemble/shapleyValue.d.ts +0 -1
- package/dist/ensemble.d.ts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/integrations/oauth.d.ts +0 -1
- package/dist/integrations/scienceAdapter.d.ts +0 -1
- package/dist/memory/autoFetch.d.ts +0 -1
- package/dist/memory/hybridMemory.d.ts +0 -1
- package/dist/memory/memoryTree.d.ts +0 -1
- package/dist/memory/obsidianVault.d.ts +0 -1
- package/dist/memory/reasoningBank.d.ts +0 -1
- package/dist/observability/changeWatch.d.ts +0 -1
- package/dist/observability/fatigueDetector.d.ts +0 -1
- package/dist/observability/index.d.ts +0 -1
- package/dist/observability/metrics.d.ts +0 -1
- package/dist/observability/middleware.d.ts +0 -1
- package/dist/observability/tracer.d.ts +0 -1
- package/dist/observability/types.d.ts +0 -1
- package/dist/providers/providerConfig.d.ts +5 -2
- package/dist/providers/providerConfig.js +1006 -1
- package/dist/providers/providerConfig.js.map +1 -1
- package/dist/routing/advancedRouter.d.ts +1 -2
- package/dist/routing/advancedRouter.js +84 -0
- package/dist/routing/advancedRouter.js.map +1 -1
- package/dist/routing/crossModelValidation.d.ts +0 -1
- package/dist/routing/providerHealth.d.ts +77 -2
- package/dist/routing/providerHealth.js +190 -4
- package/dist/routing/providerHealth.js.map +1 -1
- package/dist/routing/providerRetry.d.ts +0 -1
- package/dist/routing/shadowSampler.d.ts +187 -0
- package/dist/routing/shadowSampler.js +306 -0
- package/dist/routing/shadowSampler.js.map +1 -0
- package/dist/sdk.d.ts +0 -1
- package/dist/security/guardrails.d.ts +0 -1
- package/dist/server/dashboard.d.ts +0 -1
- package/dist/server/handlers/chatHandler.d.ts +0 -1
- package/dist/server/handlers/completionsHandler.d.ts +0 -1
- package/dist/server/handlers/embeddingsHandler.d.ts +0 -1
- package/dist/server/handlers/healthHandler.d.ts +0 -1
- package/dist/server/handlers/metricsHandler.d.ts +0 -1
- package/dist/server/handlers/modelsHandler.d.ts +0 -1
- package/dist/server/metrics.d.ts +0 -1
- package/dist/server/modelMapper.d.ts +0 -1
- package/dist/server/proxyServer.d.ts +0 -1
- package/dist/server/router.d.ts +0 -1
- package/dist/server/state.d.ts +0 -1
- package/dist/tui/dashboard.d.ts +0 -1
- package/dist/utils/costUtils.d.ts +0 -1
- package/dist/utils/sorting.d.ts +0 -1
- package/dist/utils/tokenUtils.d.ts +0 -1
- package/docs/llms-full.txt +153 -286
- package/docs/llms.txt +71 -112
- package/integrations/browser-use/README.md +155 -0
- package/integrations/browser-use/examples/form-filling.ts +179 -0
- package/integrations/browser-use/index.ts +145 -0
- package/integrations/browser-use/package.json +34 -0
- package/integrations/browser-use/tsconfig.json +17 -0
- package/integrations/mcp-browser/README.md +177 -0
- package/integrations/mcp-browser/package.json +38 -0
- package/integrations/mcp-browser/src/index.ts +297 -0
- package/integrations/sota-browser/README.md +191 -0
- package/integrations/sota-browser/package.json +34 -0
- package/llms-full.txt +6 -6
- package/llms.txt +62 -112
- package/package.json +92 -13
- package/packages/a3m-vercel-ai/README.md +161 -0
- package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts +12 -0
- package/packages/a3m-vercel-ai/dist/a3m-language-model.d.ts.map +1 -0
- package/packages/a3m-vercel-ai/dist/a3m-language-model.js +289 -0
- package/packages/a3m-vercel-ai/dist/a3m-language-model.js.map +1 -0
- package/packages/a3m-vercel-ai/dist/index.d.ts +82 -0
- package/packages/a3m-vercel-ai/dist/index.d.ts.map +1 -0
- package/packages/a3m-vercel-ai/dist/index.js +79 -0
- package/packages/a3m-vercel-ai/dist/index.js.map +1 -0
- package/packages/a3m-vercel-ai/dist/types.d.ts +97 -0
- package/packages/a3m-vercel-ai/dist/types.d.ts.map +1 -0
- package/packages/a3m-vercel-ai/dist/types.js +5 -0
- package/packages/a3m-vercel-ai/dist/types.js.map +1 -0
- package/packages/a3m-vercel-ai/package-lock.json +969 -0
- package/packages/a3m-vercel-ai/package.json +46 -0
- package/packages/a3m-vercel-ai/src/a3m-language-model.ts +381 -0
- package/packages/a3m-vercel-ai/src/index.ts +104 -0
- package/packages/a3m-vercel-ai/src/types.ts +116 -0
- package/packages/a3m-vercel-ai/tsconfig.json +20 -0
- package/src/providers/providerConfig.ts +1053 -1
- package/summary.txt +38 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -94
- package/.github/ISSUE_TEMPLATE/config.yml +0 -17
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -71
- package/.well-known/ai-plugin.json +0 -16
- package/adapters/README.md +0 -36
- package/adapters/__init__.py +0 -25
- package/adapters/a3m_adapter/__init__.py +0 -15
- package/adapters/a3m_adapter/adapter/__init__.py +0 -7
- package/adapters/a3m_adapter/adapter/config.py +0 -100
- package/adapters/a3m_adapter/adapter/langchain.py +0 -155
- package/adapters/a3m_adapter/adapter/llamaindex.py +0 -162
- package/adapters/a3m_adapter/tests/__init__.py +0 -1
- package/adapters/a3m_adapter/tests/test_adapters.py +0 -120
- package/adapters/setup.py +0 -23
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# a3m-vercel-ai
|
|
2
|
+
|
|
3
|
+
**A3M Router provider for Vercel AI SDK** — intelligent cost-based routing with parallel execution, automatic fallback, and 60%+ cost savings.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🔀 **Automatic Model Selection** — Routes to the cheapest capable provider automatically
|
|
8
|
+
- ⚡ **Parallel Ensemble** — Runs multiple providers simultaneously, picks the best result
|
|
9
|
+
- 💰 **60%+ Cost Savings** — Routes simple queries to free/cheap providers automatically
|
|
10
|
+
- 🔄 **Automatic Fallback** — If primary provider fails, routes to next best option
|
|
11
|
+
- 🛡️ **Circuit Breakers** — Skips degraded providers automatically
|
|
12
|
+
- 📊 **Cost Tracking** — Per-request cost visibility in response metadata
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install a3m-vercel-ai ai
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { createA3MProvider } from 'a3m-vercel-ai';
|
|
24
|
+
import { generateText } from 'ai';
|
|
25
|
+
|
|
26
|
+
const a3m = createA3MProvider();
|
|
27
|
+
|
|
28
|
+
const result = await generateText({
|
|
29
|
+
model: a3m('auto'),
|
|
30
|
+
prompt: 'What is the capital of France?',
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
console.log(result.text);
|
|
34
|
+
// A3M automatically routes to the cheapest capable provider
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Configuration
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
const a3m = createA3MProvider({
|
|
41
|
+
// A3M Router endpoint (default: http://localhost:8787)
|
|
42
|
+
baseURL: process.env.A3M_ROUTER_URL || 'http://localhost:8787',
|
|
43
|
+
|
|
44
|
+
// API key (default: 'not-needed' for local)
|
|
45
|
+
apiKey: process.env.A3M_API_KEY,
|
|
46
|
+
|
|
47
|
+
// Enable parallel ensemble execution
|
|
48
|
+
parallelEnsemble: true,
|
|
49
|
+
|
|
50
|
+
// Number of providers to run in parallel (default: 3)
|
|
51
|
+
parallelCount: 3,
|
|
52
|
+
|
|
53
|
+
// Enable stealth mode for browser automation
|
|
54
|
+
stealth: false,
|
|
55
|
+
|
|
56
|
+
// Cache configuration
|
|
57
|
+
cache: {
|
|
58
|
+
enabled: true,
|
|
59
|
+
ttl: 3600, // 1 hour
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
// Provider API keys (if not using environment variables)
|
|
63
|
+
providers: {
|
|
64
|
+
openai: { apiKey: process.env.OPENAI_API_KEY },
|
|
65
|
+
anthropic: { apiKey: process.env.ANTHROPIC_API_KEY },
|
|
66
|
+
groq: { apiKey: process.env.GROQ_API_KEY },
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Next.js App Router Example
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// app/api/chat/route.ts
|
|
75
|
+
import { createA3MProvider } from 'a3m-vercel-ai';
|
|
76
|
+
import { streamText } from 'ai';
|
|
77
|
+
|
|
78
|
+
const a3m = createA3MProvider({
|
|
79
|
+
parallelEnsemble: true,
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
export async function POST(req: Request) {
|
|
83
|
+
const { messages } = await req.json();
|
|
84
|
+
|
|
85
|
+
const result = await streamText({
|
|
86
|
+
model: a3m('auto'),
|
|
87
|
+
messages,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
return result.toDataStreamResponse();
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Streaming Response
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
const result = await streamText({
|
|
98
|
+
model: a3m('auto'),
|
|
99
|
+
prompt: 'Write a story about a robot...',
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Stream to response
|
|
103
|
+
return result.toDataStreamResponse();
|
|
104
|
+
|
|
105
|
+
// Or accumulate and use
|
|
106
|
+
const { text } = await result.consumeStream();
|
|
107
|
+
console.log(text);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## How It Works
|
|
111
|
+
|
|
112
|
+
A3M Router analyzes each request and routes to the optimal provider:
|
|
113
|
+
|
|
114
|
+
| Request Type | Example | Routed To | Why |
|
|
115
|
+
|-------------|---------|-----------|-----|
|
|
116
|
+
| Simple Q&A | "What is 2+2?" | Groq (free) | Basic math,不需要高级模型 |
|
|
117
|
+
| Code generation | "Write a sorting function" | DeepSeek Coder | 专用代码模型 |
|
|
118
|
+
| Complex analysis | "Analyze this legal contract" | Claude 3.5 | 需要长上下文 |
|
|
119
|
+
| Creative writing | "Write a poem" | GPT-4o | 创意任务 |
|
|
120
|
+
|
|
121
|
+
## Cost Savings
|
|
122
|
+
|
|
123
|
+
| Setup | Monthly Cost (100K requests) |
|
|
124
|
+
|-------|-------------------------------|
|
|
125
|
+
| GPT-4o only | $3,000 |
|
|
126
|
+
| Claude only | $2,500 |
|
|
127
|
+
| **A3M Router** | **$800** |
|
|
128
|
+
|
|
129
|
+
## Environment Variables
|
|
130
|
+
|
|
131
|
+
Configure your provider API keys:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# .env.local
|
|
135
|
+
A3M_ROUTER_URL=http://localhost:8787
|
|
136
|
+
OPENAI_API_KEY=sk-...
|
|
137
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
138
|
+
GROQ_API_KEY=gsk_...
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Requirements
|
|
142
|
+
|
|
143
|
+
- Node.js 18+
|
|
144
|
+
- Vercel AI SDK 3.0+
|
|
145
|
+
- A3M Router running (or use hosted version)
|
|
146
|
+
|
|
147
|
+
## Start A3M Router
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# Install A3M Router
|
|
151
|
+
npm install -g adaptive-memory-multi-model-router
|
|
152
|
+
|
|
153
|
+
# Start the router
|
|
154
|
+
a3m-router serve
|
|
155
|
+
|
|
156
|
+
# Router now running at http://localhost:8787
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## License
|
|
160
|
+
|
|
161
|
+
MIT
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,289 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a3m-language-model.js","sourceRoot":"","sources":["../src/a3m-language-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
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 { createA3MLanguageModel } from './a3m-language-model';
|
|
21
|
+
import { createA3MLanguageModel } from './a3m-language-model';
|
|
22
|
+
/**
|
|
23
|
+
* Create an A3M Router provider for Vercel AI SDK
|
|
24
|
+
*/
|
|
25
|
+
export function createA3MProvider(config = {}) {
|
|
26
|
+
const languageModel = createA3MLanguageModel(config);
|
|
27
|
+
const provider = Object.assign((modelId) => {
|
|
28
|
+
// Return the language model - A3M handles model selection internally
|
|
29
|
+
return languageModel;
|
|
30
|
+
}, {
|
|
31
|
+
name: 'a3m',
|
|
32
|
+
// Allow accessing config for introspection
|
|
33
|
+
__config: config,
|
|
34
|
+
});
|
|
35
|
+
return provider;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Example usage with Next.js App Router
|
|
39
|
+
*
|
|
40
|
+
* ```typescript
|
|
41
|
+
* // app/api/chat/route.ts
|
|
42
|
+
* import { createA3MProvider } from '@a3m/vercel-ai';
|
|
43
|
+
* import { generateText } from 'ai';
|
|
44
|
+
*
|
|
45
|
+
* const a3m = createA3MProvider({
|
|
46
|
+
* parallelEnsemble: true,
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* export async function POST(req: Request) {
|
|
50
|
+
* const { messages } = await req.json();
|
|
51
|
+
*
|
|
52
|
+
* const result = await generateText({
|
|
53
|
+
* model: a3m('auto'),
|
|
54
|
+
* messages,
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* return Response.json(result);
|
|
58
|
+
* }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
/**
|
|
62
|
+
* Example usage with streaming
|
|
63
|
+
*
|
|
64
|
+
* ```typescript
|
|
65
|
+
* import { createA3MProvider } from '@a3m/vercel-ai';
|
|
66
|
+
* import { streamText } from 'ai';
|
|
67
|
+
*
|
|
68
|
+
* const a3m = createA3MProvider();
|
|
69
|
+
*
|
|
70
|
+
* const result = await streamText({
|
|
71
|
+
* model: a3m('auto'),
|
|
72
|
+
* prompt: 'Write a story about a robot...',
|
|
73
|
+
* });
|
|
74
|
+
*
|
|
75
|
+
* // Stream to response
|
|
76
|
+
* return result.toDataStreamResponse();
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAI9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAe9D;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAA0B,EAAE;IAC5D,MAAM,aAAa,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,CAAC,OAAe,EAAE,EAAE;QAClB,qEAAqE;QACrE,OAAO,aAAa,CAAC;IACvB,CAAC,EACD;QACE,IAAI,EAAE,KAAc;QACpB,2CAA2C;QAC3C,QAAQ,EAAE,MAAM;KACjB,CACF,CAAC;IAEF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;;;;;;;;;;;;;;GAiBG"}
|