@rubrion/mastra-cloudflare 0.0.0-stage → 0.2.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/LICENSE +674 -0
- package/README.md +103 -2
- package/dist/agents.d.ts +47 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +53 -0
- package/dist/agents.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/memory.d.ts +15 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +19 -0
- package/dist/memory.js.map +1 -0
- package/dist/models.d.ts +47 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +46 -0
- package/dist/models.js.map +1 -0
- package/dist/routing.d.ts +32 -0
- package/dist/routing.d.ts.map +1 -0
- package/dist/routing.js +62 -0
- package/dist/routing.js.map +1 -0
- package/dist/server.d.ts +34 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +244 -0
- package/dist/server.js.map +1 -0
- package/package.json +56 -4
package/dist/server.js
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// An OpenAI-compatible server for a registry of agents, as a Worker `fetch`
|
|
2
|
+
// handler. No HTTP framework: Mastra's own server route table costs most of
|
|
3
|
+
// a Worker's startup CPU allowance, and this surface is three routes.
|
|
4
|
+
//
|
|
5
|
+
// GET / health: name and agent ids
|
|
6
|
+
// GET /v1/models the agents (and "auto" when it can route)
|
|
7
|
+
// POST /v1/chat/completions OpenAI chat completions, streamed (SSE) or not.
|
|
8
|
+
// model: an agent id, or "auto" to let the planner
|
|
9
|
+
// pick one or more agents for the last message.
|
|
10
|
+
//
|
|
11
|
+
// Request headers (all optional; a middleware in front sets them):
|
|
12
|
+
// Authorization: Bearer <key> required when `apiKey` returns a key
|
|
13
|
+
// X-Provider-Base-URL / X-Provider-Key / X-Provider-Model
|
|
14
|
+
// the OpenAI-compatible model for this request
|
|
15
|
+
// X-Agents: id,id only these agents are on for this request
|
|
16
|
+
// X-Session-Id: <id> keep memory per (session, agent); send only the
|
|
17
|
+
// new message. Needs `memory` on the registry.
|
|
18
|
+
import { RequestContext } from '@mastra/core/request-context';
|
|
19
|
+
import { DEFAULT_MODEL, PROVIDER } from './models.js';
|
|
20
|
+
import { candidatesJson, fallbackPlan, lastUserText, mergeReplies, plannerAgent, recentTurns, RoutingPlanSchema, sanitizePlan, textOf } from './routing.js';
|
|
21
|
+
export const HEADERS = {
|
|
22
|
+
baseURL: 'x-provider-base-url',
|
|
23
|
+
key: 'x-provider-key',
|
|
24
|
+
model: 'x-provider-model',
|
|
25
|
+
agents: 'x-agents',
|
|
26
|
+
session: 'x-session-id',
|
|
27
|
+
};
|
|
28
|
+
const json = (data, status = 200) => new Response(JSON.stringify(data), { status, headers: { 'content-type': 'application/json' } });
|
|
29
|
+
const fail = (status, message, code) => json({ error: { message, type: 'invalid_request_error', code } }, status);
|
|
30
|
+
/** OpenAI message content as Mastra input: text and image parts. */
|
|
31
|
+
function toInput(messages) {
|
|
32
|
+
return messages
|
|
33
|
+
.filter((m) => m.role === 'system' || m.role === 'user' || m.role === 'assistant')
|
|
34
|
+
.map((m) => {
|
|
35
|
+
if (m.role !== 'user' || !Array.isArray(m.content))
|
|
36
|
+
return { role: m.role, content: textOf(m.content) };
|
|
37
|
+
const parts = m.content.flatMap((p) => p?.type === 'text' ? [{ type: 'text', text: String(p.text) }] : p?.type === 'image_url' ? [{ type: 'image', image: p.image_url?.url ?? p.image_url }] : []);
|
|
38
|
+
return { role: 'user', content: parts };
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export function createAgentServer(options) {
|
|
42
|
+
const { agents, name = 'agents' } = options;
|
|
43
|
+
const setting = (v, env, fallback) => (typeof v === 'function' ? v(env) : (v ?? fallback));
|
|
44
|
+
let planner;
|
|
45
|
+
const plannerOf = () => (planner ??= plannerAgent(options.planner ? options.planner.model : undefined, options.planner ? options.planner.rules : undefined));
|
|
46
|
+
return {
|
|
47
|
+
async fetch(request, env) {
|
|
48
|
+
const url = new URL(request.url);
|
|
49
|
+
const h = request.headers;
|
|
50
|
+
const key = options.apiKey?.(env);
|
|
51
|
+
if (key && h.get('authorization') !== `Bearer ${key}`)
|
|
52
|
+
return fail(401, 'Invalid API key', 'invalid_api_key');
|
|
53
|
+
const only = h.get(HEADERS.agents)?.split(',').map((s) => s.trim()).filter(Boolean);
|
|
54
|
+
const candidates = agents.list().filter((s) => !only || only.includes(s.id));
|
|
55
|
+
const routes = options.planner !== false && candidates.length > 1;
|
|
56
|
+
if (request.method === 'GET' && url.pathname === '/')
|
|
57
|
+
return json({ name, status: 'ok', agents: candidates.map((s) => s.id) });
|
|
58
|
+
if (request.method === 'GET' && url.pathname === '/v1/models') {
|
|
59
|
+
const model = (id, title, description) => ({ id, object: 'model', created: 0, owned_by: name, name: title, description });
|
|
60
|
+
return json({
|
|
61
|
+
object: 'list',
|
|
62
|
+
data: [
|
|
63
|
+
...(routes ? [model('auto', 'Auto', 'Sends each message to the agent(s) best suited for it.')] : []),
|
|
64
|
+
...candidates.map((s) => model(s.id, s.name, s.description)),
|
|
65
|
+
],
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (request.method !== 'POST' || url.pathname !== '/v1/chat/completions')
|
|
69
|
+
return fail(404, 'Not found', 'not_found');
|
|
70
|
+
let body;
|
|
71
|
+
try {
|
|
72
|
+
body = (await request.json());
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return fail(400, 'Body must be JSON', 'invalid_json');
|
|
76
|
+
}
|
|
77
|
+
const messages = Array.isArray(body.messages) ? body.messages : [];
|
|
78
|
+
if (!messages.some((m) => m.role === 'user'))
|
|
79
|
+
return fail(400, 'messages needs a user message', 'invalid_messages');
|
|
80
|
+
if (!candidates.length)
|
|
81
|
+
return fail(503, 'No agents are on', 'no_agents');
|
|
82
|
+
const requested = body.model && body.model !== 'auto' ? body.model : routes ? 'auto' : candidates[0].id;
|
|
83
|
+
if (requested !== 'auto' && !candidates.some((s) => s.id === requested))
|
|
84
|
+
return fail(404, `Unknown model ${requested}`, 'model_not_found');
|
|
85
|
+
agents.mastra();
|
|
86
|
+
const maxSteps = setting(options.maxSteps, env, 5);
|
|
87
|
+
const maxAgents = setting(options.maxAgents, env, 3);
|
|
88
|
+
// Tokens over the planner, every agent and every tool round: returned as OpenAI's `usage`.
|
|
89
|
+
const usage = { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 };
|
|
90
|
+
const count = (u) => {
|
|
91
|
+
usage.prompt_tokens += u?.inputTokens ?? 0;
|
|
92
|
+
usage.completion_tokens += u?.outputTokens ?? 0;
|
|
93
|
+
usage.total_tokens = usage.prompt_tokens + usage.completion_tokens;
|
|
94
|
+
};
|
|
95
|
+
const requestContext = new RequestContext();
|
|
96
|
+
const provider = h.get(HEADERS.baseURL) && h.get(HEADERS.model)
|
|
97
|
+
? { baseURL: h.get(HEADERS.baseURL), apiKey: h.get(HEADERS.key) ?? '', model: h.get(HEADERS.model) }
|
|
98
|
+
: options.provider?.(env);
|
|
99
|
+
if (provider)
|
|
100
|
+
requestContext.set(PROVIDER, provider);
|
|
101
|
+
else if (options.defaultModel)
|
|
102
|
+
requestContext.set(DEFAULT_MODEL, options.defaultModel(env));
|
|
103
|
+
const session = h.get(HEADERS.session) ?? '';
|
|
104
|
+
const remembers = !!session && !!agents.memory;
|
|
105
|
+
const input = toInput(messages);
|
|
106
|
+
const latest = [...input].reverse().find((m) => m.role === 'user');
|
|
107
|
+
/**
|
|
108
|
+
* Run one agent. With `steer` (its slice of a routed request) the last
|
|
109
|
+
* user turn becomes that assignment, so it can't drift into another
|
|
110
|
+
* agent's deliverable; the earlier turns stay as context.
|
|
111
|
+
*/
|
|
112
|
+
const call = (spec, steer) => {
|
|
113
|
+
const { agent } = agents.get(spec.id);
|
|
114
|
+
const turn = steer
|
|
115
|
+
? {
|
|
116
|
+
role: 'user',
|
|
117
|
+
content: `You are ${spec.name}, one of several agents answering one message. Deliver only your part and nothing owned by the others.\nYour part: ${steer}`,
|
|
118
|
+
}
|
|
119
|
+
: latest;
|
|
120
|
+
const history = remembers ? [] : input.slice(0, input.lastIndexOf(latest));
|
|
121
|
+
return {
|
|
122
|
+
input: [...history, turn],
|
|
123
|
+
options: {
|
|
124
|
+
requestContext,
|
|
125
|
+
maxSteps,
|
|
126
|
+
abortSignal: request.signal,
|
|
127
|
+
...(spec.maxOutputTokens ? { modelSettings: { maxOutputTokens: spec.maxOutputTokens } } : {}),
|
|
128
|
+
...(remembers ? { memory: { thread: `${session}:${spec.id}`, resource: session } } : {}),
|
|
129
|
+
},
|
|
130
|
+
agent,
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
// Which agents answer, and with what slice of the request.
|
|
134
|
+
let slices;
|
|
135
|
+
if (requested === 'auto') {
|
|
136
|
+
let plan = null;
|
|
137
|
+
try {
|
|
138
|
+
const ctx = new RequestContext();
|
|
139
|
+
if (provider)
|
|
140
|
+
ctx.set(PROVIDER, provider);
|
|
141
|
+
else if (options.defaultModel)
|
|
142
|
+
ctx.set(DEFAULT_MODEL, options.defaultModel(env));
|
|
143
|
+
ctx.set('candidates', candidatesJson(candidates));
|
|
144
|
+
const recent = recentTurns(messages).map((m) => ({ role: m.role === 'assistant' ? 'assistant' : 'user', content: textOf(m.content) }));
|
|
145
|
+
const out = await plannerOf().generate(recent, {
|
|
146
|
+
requestContext: ctx,
|
|
147
|
+
structuredOutput: { schema: RoutingPlanSchema, jsonPromptInjection: true },
|
|
148
|
+
modelSettings: { temperature: 0 },
|
|
149
|
+
});
|
|
150
|
+
count(out.totalUsage);
|
|
151
|
+
plan = sanitizePlan(out.object, new Set(candidates.map((s) => s.id)), maxAgents);
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
console.log('[agent-server] planner failed:', String(e));
|
|
155
|
+
}
|
|
156
|
+
plan ??= fallbackPlan(candidates[0].id, lastUserText(messages));
|
|
157
|
+
slices = plan.slices.map((s) => ({ spec: candidates.find((c) => c.id === s.agent), steer: plan.slices.length > 1 ? s.instructions : undefined }));
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
slices = [{ spec: candidates.find((s) => s.id === requested) }];
|
|
161
|
+
}
|
|
162
|
+
const model = slices.map((s) => s.spec.id).join('+');
|
|
163
|
+
const id = `chatcmpl-${crypto.randomUUID()}`;
|
|
164
|
+
const created = Math.floor(Date.now() / 1000);
|
|
165
|
+
// Several agents: run them together, answer with their merged replies.
|
|
166
|
+
const several = async () => {
|
|
167
|
+
const parts = await Promise.all(slices.map(async ({ spec, steer }) => {
|
|
168
|
+
const run = call(spec, steer);
|
|
169
|
+
try {
|
|
170
|
+
const out = await run.agent.generate(run.input, run.options);
|
|
171
|
+
count(out.totalUsage);
|
|
172
|
+
return { name: spec.name, text: out.text ?? '' };
|
|
173
|
+
}
|
|
174
|
+
catch (e) {
|
|
175
|
+
console.log(`[agent-server] ${spec.id} failed:`, String(e));
|
|
176
|
+
return { name: spec.name, text: '' };
|
|
177
|
+
}
|
|
178
|
+
}));
|
|
179
|
+
const ok = parts.filter((p) => p.text.trim());
|
|
180
|
+
return ok.length ? mergeReplies(ok) : 'None of the agents could answer right now.';
|
|
181
|
+
};
|
|
182
|
+
if (!body.stream) {
|
|
183
|
+
let text;
|
|
184
|
+
if (slices.length > 1)
|
|
185
|
+
text = await several();
|
|
186
|
+
else {
|
|
187
|
+
const run = call(slices[0].spec);
|
|
188
|
+
try {
|
|
189
|
+
const out = await run.agent.generate(run.input, run.options);
|
|
190
|
+
count(out.totalUsage);
|
|
191
|
+
text = out.text ?? '';
|
|
192
|
+
}
|
|
193
|
+
catch (e) {
|
|
194
|
+
console.log(`[agent-server] ${slices[0].spec.id} failed:`, String(e));
|
|
195
|
+
return json({ error: { message: e.message, type: 'upstream_error', code: 'agent_failed' } }, 502);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return json({
|
|
199
|
+
id,
|
|
200
|
+
object: 'chat.completion',
|
|
201
|
+
created,
|
|
202
|
+
model,
|
|
203
|
+
choices: [{ index: 0, message: { role: 'assistant', content: text }, finish_reason: 'stop' }],
|
|
204
|
+
usage,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
const { readable, writable } = new TransformStream();
|
|
208
|
+
const writer = writable.getWriter();
|
|
209
|
+
const enc = new TextEncoder();
|
|
210
|
+
const send = (delta, finish = null) => writer.write(enc.encode(`data: ${JSON.stringify({ id, object: 'chat.completion.chunk', created, model, choices: [{ index: 0, delta, finish_reason: finish }], ...(finish ? { usage } : {}) })}\n\n`));
|
|
211
|
+
// Not awaited: the response goes out while this keeps writing into it.
|
|
212
|
+
void (async () => {
|
|
213
|
+
try {
|
|
214
|
+
await send({ role: 'assistant', content: '' });
|
|
215
|
+
if (slices.length > 1)
|
|
216
|
+
await send({ content: await several() });
|
|
217
|
+
else {
|
|
218
|
+
const run = call(slices[0].spec);
|
|
219
|
+
const out = await run.agent.stream(run.input, run.options);
|
|
220
|
+
// fullStream, not textStream: a provider error arrives as a chunk and must surface.
|
|
221
|
+
for await (const chunk of out.fullStream) {
|
|
222
|
+
if (chunk.type === 'text-delta' && chunk.payload?.text)
|
|
223
|
+
await send({ content: String(chunk.payload.text) });
|
|
224
|
+
if (chunk.type === 'error')
|
|
225
|
+
throw chunk.payload?.error instanceof Error ? chunk.payload.error : new Error(String(chunk.payload?.error ?? 'error'));
|
|
226
|
+
}
|
|
227
|
+
count(await out.totalUsage?.catch(() => undefined));
|
|
228
|
+
}
|
|
229
|
+
await send({}, 'stop');
|
|
230
|
+
}
|
|
231
|
+
catch (e) {
|
|
232
|
+
console.log('[agent-server] stream failed:', String(e));
|
|
233
|
+
await send({ content: `\n\n(The agent failed: ${e.message})` }, 'stop').catch(() => undefined);
|
|
234
|
+
}
|
|
235
|
+
finally {
|
|
236
|
+
await writer.write(enc.encode('data: [DONE]\n\n')).catch(() => undefined);
|
|
237
|
+
await writer.close().catch(() => undefined);
|
|
238
|
+
}
|
|
239
|
+
})();
|
|
240
|
+
return new Response(readable, { headers: { 'content-type': 'text/event-stream', 'cache-control': 'no-cache' } });
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,58 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rubrion/mastra-cloudflare",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Mastra agents on Cloudflare Workers: D1 memory, Workers AI and OpenAI-compatible models, and an OpenAI-compatible agent server with multi-agent routing.",
|
|
5
|
+
"license": "GPL-3.0-only",
|
|
6
|
+
"author": "Rubrion",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/rubrion/mastra-cloudflare.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/rubrion/mastra-cloudflare#readme",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"mastra",
|
|
14
|
+
"cloudflare",
|
|
15
|
+
"workers",
|
|
16
|
+
"d1",
|
|
17
|
+
"workers-ai",
|
|
18
|
+
"agents",
|
|
19
|
+
"openai-compatible"
|
|
20
|
+
],
|
|
21
|
+
"type": "module",
|
|
22
|
+
"main": "./dist/index.js",
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"import": "./dist/index.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"README.md",
|
|
33
|
+
"LICENSE"
|
|
34
|
+
],
|
|
35
|
+
"sideEffects": false,
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "rm -rf dist && tsc -p tsconfig.json",
|
|
38
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
39
|
+
"prepublishOnly": "npm run build"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@ai-sdk/openai-compatible": "^3.0.74",
|
|
43
|
+
"@ai-sdk/provider": "^4.0.31",
|
|
44
|
+
"@mastra/cloudflare-d1": "^1.4.3",
|
|
45
|
+
"@mastra/core": "^1.78.0",
|
|
46
|
+
"@mastra/memory": "^1.38.0",
|
|
47
|
+
"@opentelemetry/api": "^1.9.1",
|
|
48
|
+
"workers-ai-provider": "^4.0.1",
|
|
49
|
+
"zod": "^4.4.3"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@cloudflare/workers-types": "^4.20250918.0",
|
|
53
|
+
"typescript": "^5.9.3"
|
|
54
|
+
},
|
|
55
|
+
"publishConfig": {
|
|
56
|
+
"access": "public"
|
|
57
|
+
}
|
|
58
|
+
}
|