@agentxjs/mono-driver 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/README.md +244 -0
- package/dist/index.d.ts +170 -0
- package/dist/index.js +450 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
- package/src/MonoDriver.ts +444 -0
- package/src/converters.ts +175 -0
- package/src/index.ts +53 -0
- package/src/types.ts +84 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
// src/MonoDriver.ts
|
|
2
|
+
import { streamText, stepCountIs } from "ai";
|
|
3
|
+
import { createAnthropic } from "@ai-sdk/anthropic";
|
|
4
|
+
import { createOpenAI } from "@ai-sdk/openai";
|
|
5
|
+
import { createGoogleGenerativeAI } from "@ai-sdk/google";
|
|
6
|
+
import { createXai } from "@ai-sdk/xai";
|
|
7
|
+
import { createDeepSeek } from "@ai-sdk/deepseek";
|
|
8
|
+
import { createMistral } from "@ai-sdk/mistral";
|
|
9
|
+
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
10
|
+
import { createMCPClient } from "@ai-sdk/mcp";
|
|
11
|
+
import { Experimental_StdioMCPTransport } from "@ai-sdk/mcp/mcp-stdio";
|
|
12
|
+
import { createLogger } from "commonxjs/logger";
|
|
13
|
+
|
|
14
|
+
// src/converters.ts
|
|
15
|
+
import { tool, jsonSchema } from "ai";
|
|
16
|
+
function toVercelMessage(message) {
|
|
17
|
+
switch (message.subtype) {
|
|
18
|
+
case "user":
|
|
19
|
+
return {
|
|
20
|
+
role: "user",
|
|
21
|
+
content: typeof message.content === "string" ? message.content : extractText(message.content)
|
|
22
|
+
};
|
|
23
|
+
case "assistant": {
|
|
24
|
+
const content = "content" in message ? message.content : "";
|
|
25
|
+
if (typeof content === "string") {
|
|
26
|
+
return { role: "assistant", content };
|
|
27
|
+
}
|
|
28
|
+
const toolCalls = content.filter(
|
|
29
|
+
(p) => p.type === "tool-call"
|
|
30
|
+
);
|
|
31
|
+
if (toolCalls.length > 0) {
|
|
32
|
+
return {
|
|
33
|
+
role: "assistant",
|
|
34
|
+
content: [
|
|
35
|
+
...content.filter((p) => p.type === "text").map((p) => ({ type: "text", text: p.text })),
|
|
36
|
+
...toolCalls.map((tc) => ({
|
|
37
|
+
type: "tool-call",
|
|
38
|
+
toolCallId: tc.id,
|
|
39
|
+
toolName: tc.name,
|
|
40
|
+
input: tc.input
|
|
41
|
+
}))
|
|
42
|
+
]
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return { role: "assistant", content: extractText(content) };
|
|
46
|
+
}
|
|
47
|
+
case "tool-result": {
|
|
48
|
+
const msg = message;
|
|
49
|
+
return {
|
|
50
|
+
role: "tool",
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: "tool-result",
|
|
54
|
+
toolCallId: msg.toolCallId,
|
|
55
|
+
toolName: msg.toolResult.name,
|
|
56
|
+
output: msg.toolResult.output
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
default:
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function toVercelMessages(messages) {
|
|
66
|
+
const result = [];
|
|
67
|
+
for (const message of messages) {
|
|
68
|
+
const converted = toVercelMessage(message);
|
|
69
|
+
if (converted) {
|
|
70
|
+
result.push(converted);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
function extractText(content) {
|
|
76
|
+
if (typeof content === "string") return content;
|
|
77
|
+
if (Array.isArray(content)) {
|
|
78
|
+
return content.filter(
|
|
79
|
+
(part) => part !== null && typeof part === "object" && "text" in part && typeof part.text === "string"
|
|
80
|
+
).map((part) => part.text).join("");
|
|
81
|
+
}
|
|
82
|
+
return String(content ?? "");
|
|
83
|
+
}
|
|
84
|
+
function toStopReason(finishReason) {
|
|
85
|
+
switch (finishReason) {
|
|
86
|
+
case "stop":
|
|
87
|
+
return "end_turn";
|
|
88
|
+
case "length":
|
|
89
|
+
return "max_tokens";
|
|
90
|
+
case "tool-calls":
|
|
91
|
+
return "tool_use";
|
|
92
|
+
case "content-filter":
|
|
93
|
+
return "content_filter";
|
|
94
|
+
case "error":
|
|
95
|
+
return "error";
|
|
96
|
+
default:
|
|
97
|
+
return "other";
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function createEvent(type, data) {
|
|
101
|
+
return {
|
|
102
|
+
type,
|
|
103
|
+
timestamp: Date.now(),
|
|
104
|
+
data
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function toVercelTools(tools) {
|
|
108
|
+
const result = {};
|
|
109
|
+
for (const t of tools) {
|
|
110
|
+
result[t.name] = tool({
|
|
111
|
+
description: t.description,
|
|
112
|
+
inputSchema: jsonSchema(t.parameters),
|
|
113
|
+
execute: async (input) => t.execute(input)
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// src/MonoDriver.ts
|
|
120
|
+
var logger = createLogger("mono-driver/MonoDriver");
|
|
121
|
+
var MonoDriver = class {
|
|
122
|
+
name = "MonoDriver";
|
|
123
|
+
_sessionId = null;
|
|
124
|
+
_state = "idle";
|
|
125
|
+
abortController = null;
|
|
126
|
+
config;
|
|
127
|
+
session;
|
|
128
|
+
provider;
|
|
129
|
+
maxSteps;
|
|
130
|
+
compatibleConfig;
|
|
131
|
+
/** MCP clients created during initialize() */
|
|
132
|
+
mcpClients = [];
|
|
133
|
+
/** Tools discovered from MCP servers */
|
|
134
|
+
mcpTools = {};
|
|
135
|
+
constructor(config) {
|
|
136
|
+
this.config = config;
|
|
137
|
+
this.session = config.session;
|
|
138
|
+
this.provider = config.options?.provider ?? "anthropic";
|
|
139
|
+
this.maxSteps = config.options?.maxSteps ?? 10;
|
|
140
|
+
this.compatibleConfig = config.options?.compatibleConfig;
|
|
141
|
+
}
|
|
142
|
+
// ============================================================================
|
|
143
|
+
// Driver Interface Properties
|
|
144
|
+
// ============================================================================
|
|
145
|
+
get sessionId() {
|
|
146
|
+
return this._sessionId;
|
|
147
|
+
}
|
|
148
|
+
get state() {
|
|
149
|
+
return this._state;
|
|
150
|
+
}
|
|
151
|
+
// ============================================================================
|
|
152
|
+
// Lifecycle Methods
|
|
153
|
+
// ============================================================================
|
|
154
|
+
async initialize() {
|
|
155
|
+
if (this._state !== "idle") {
|
|
156
|
+
throw new Error(`Cannot initialize: Driver is in "${this._state}" state`);
|
|
157
|
+
}
|
|
158
|
+
logger.info("Initializing MonoDriver", {
|
|
159
|
+
agentId: this.config.agentId,
|
|
160
|
+
provider: this.provider
|
|
161
|
+
});
|
|
162
|
+
this._sessionId = `mono_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
163
|
+
this.config.onSessionIdCaptured?.(this._sessionId);
|
|
164
|
+
if (this.config.mcpServers) {
|
|
165
|
+
for (const [name, serverConfig] of Object.entries(this.config.mcpServers)) {
|
|
166
|
+
let client;
|
|
167
|
+
if ("command" in serverConfig) {
|
|
168
|
+
const transport = new Experimental_StdioMCPTransport({
|
|
169
|
+
command: serverConfig.command,
|
|
170
|
+
args: serverConfig.args,
|
|
171
|
+
env: serverConfig.env
|
|
172
|
+
});
|
|
173
|
+
client = await createMCPClient({ transport });
|
|
174
|
+
} else {
|
|
175
|
+
client = await createMCPClient({
|
|
176
|
+
transport: {
|
|
177
|
+
type: serverConfig.type,
|
|
178
|
+
url: serverConfig.url,
|
|
179
|
+
headers: serverConfig.headers
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
this.mcpClients.push(client);
|
|
184
|
+
const tools = await client.tools();
|
|
185
|
+
Object.assign(this.mcpTools, tools);
|
|
186
|
+
logger.info("MCP server connected", {
|
|
187
|
+
name,
|
|
188
|
+
toolCount: Object.keys(tools).length
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
logger.info("MonoDriver initialized", { sessionId: this._sessionId });
|
|
193
|
+
}
|
|
194
|
+
async dispose() {
|
|
195
|
+
if (this._state === "disposed") {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
logger.info("Disposing MonoDriver", { agentId: this.config.agentId });
|
|
199
|
+
this.abortController?.abort();
|
|
200
|
+
this.abortController = null;
|
|
201
|
+
for (const client of this.mcpClients) {
|
|
202
|
+
await client.close();
|
|
203
|
+
}
|
|
204
|
+
this.mcpClients = [];
|
|
205
|
+
this.mcpTools = {};
|
|
206
|
+
this._state = "disposed";
|
|
207
|
+
logger.info("MonoDriver disposed");
|
|
208
|
+
}
|
|
209
|
+
// ============================================================================
|
|
210
|
+
// Core Methods
|
|
211
|
+
// ============================================================================
|
|
212
|
+
async *receive(message) {
|
|
213
|
+
if (this._state === "disposed") {
|
|
214
|
+
throw new Error("Cannot receive: Driver is disposed");
|
|
215
|
+
}
|
|
216
|
+
if (this._state === "active") {
|
|
217
|
+
throw new Error("Cannot receive: Driver is already processing a message");
|
|
218
|
+
}
|
|
219
|
+
this._state = "active";
|
|
220
|
+
this.abortController = new AbortController();
|
|
221
|
+
try {
|
|
222
|
+
const history = this.session ? await this.session.getMessages() : [];
|
|
223
|
+
const messages = toVercelMessages(history);
|
|
224
|
+
messages.push({
|
|
225
|
+
role: "user",
|
|
226
|
+
content: typeof message.content === "string" ? message.content : message.content.map((part) => {
|
|
227
|
+
if ("text" in part) return { type: "text", text: part.text };
|
|
228
|
+
return { type: "text", text: String(part) };
|
|
229
|
+
})
|
|
230
|
+
});
|
|
231
|
+
logger.debug("Sending message to LLM", {
|
|
232
|
+
provider: this.provider,
|
|
233
|
+
messageCount: messages.length,
|
|
234
|
+
agentId: this.config.agentId
|
|
235
|
+
});
|
|
236
|
+
const result = streamText({
|
|
237
|
+
model: this.getModel(),
|
|
238
|
+
system: this.config.systemPrompt,
|
|
239
|
+
messages,
|
|
240
|
+
tools: this.mergeTools(),
|
|
241
|
+
stopWhen: stepCountIs(this.maxSteps),
|
|
242
|
+
abortSignal: this.abortController.signal
|
|
243
|
+
});
|
|
244
|
+
let messageStartEmitted = false;
|
|
245
|
+
let hasToolCallsInStep = false;
|
|
246
|
+
for await (const part of result.fullStream) {
|
|
247
|
+
if (this.abortController?.signal.aborted) {
|
|
248
|
+
yield createEvent("interrupted", { reason: "user" });
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
switch (part.type) {
|
|
252
|
+
case "start":
|
|
253
|
+
case "start-step":
|
|
254
|
+
if (!messageStartEmitted) {
|
|
255
|
+
const messageId = `msg_${Date.now()}`;
|
|
256
|
+
const model = this.config.model ?? this.getDefaultModel();
|
|
257
|
+
yield createEvent("message_start", { messageId, model });
|
|
258
|
+
messageStartEmitted = true;
|
|
259
|
+
}
|
|
260
|
+
hasToolCallsInStep = false;
|
|
261
|
+
break;
|
|
262
|
+
case "text-delta":
|
|
263
|
+
yield createEvent("text_delta", { text: part.text });
|
|
264
|
+
break;
|
|
265
|
+
case "tool-input-start":
|
|
266
|
+
yield createEvent("tool_use_start", {
|
|
267
|
+
toolCallId: part.id,
|
|
268
|
+
toolName: part.toolName
|
|
269
|
+
});
|
|
270
|
+
break;
|
|
271
|
+
case "tool-input-delta":
|
|
272
|
+
yield createEvent("input_json_delta", {
|
|
273
|
+
partialJson: part.delta
|
|
274
|
+
});
|
|
275
|
+
break;
|
|
276
|
+
case "tool-call":
|
|
277
|
+
hasToolCallsInStep = true;
|
|
278
|
+
yield createEvent("tool_use_stop", {
|
|
279
|
+
toolCallId: part.toolCallId,
|
|
280
|
+
toolName: part.toolName,
|
|
281
|
+
input: part.input
|
|
282
|
+
});
|
|
283
|
+
break;
|
|
284
|
+
case "tool-result":
|
|
285
|
+
if (hasToolCallsInStep) {
|
|
286
|
+
yield createEvent("message_stop", {
|
|
287
|
+
stopReason: toStopReason("tool-calls")
|
|
288
|
+
});
|
|
289
|
+
hasToolCallsInStep = false;
|
|
290
|
+
}
|
|
291
|
+
yield createEvent("tool_result", {
|
|
292
|
+
toolCallId: part.toolCallId,
|
|
293
|
+
result: part.output,
|
|
294
|
+
isError: false
|
|
295
|
+
});
|
|
296
|
+
break;
|
|
297
|
+
case "tool-error":
|
|
298
|
+
if (hasToolCallsInStep) {
|
|
299
|
+
yield createEvent("message_stop", {
|
|
300
|
+
stopReason: toStopReason("tool-calls")
|
|
301
|
+
});
|
|
302
|
+
hasToolCallsInStep = false;
|
|
303
|
+
}
|
|
304
|
+
yield createEvent("tool_result", {
|
|
305
|
+
toolCallId: part.toolCallId,
|
|
306
|
+
result: part.error,
|
|
307
|
+
isError: true
|
|
308
|
+
});
|
|
309
|
+
break;
|
|
310
|
+
case "finish-step":
|
|
311
|
+
if (part.usage) {
|
|
312
|
+
yield createEvent("message_delta", {
|
|
313
|
+
usage: {
|
|
314
|
+
inputTokens: part.usage.inputTokens ?? 0,
|
|
315
|
+
outputTokens: part.usage.outputTokens ?? 0
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
messageStartEmitted = false;
|
|
320
|
+
break;
|
|
321
|
+
case "finish":
|
|
322
|
+
yield createEvent("message_stop", {
|
|
323
|
+
stopReason: toStopReason(part.finishReason)
|
|
324
|
+
});
|
|
325
|
+
break;
|
|
326
|
+
case "error":
|
|
327
|
+
yield createEvent("error", {
|
|
328
|
+
message: String(part.error),
|
|
329
|
+
errorCode: "stream_error"
|
|
330
|
+
});
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
} catch (error) {
|
|
335
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
336
|
+
yield createEvent("interrupted", { reason: "user" });
|
|
337
|
+
} else {
|
|
338
|
+
yield createEvent("error", {
|
|
339
|
+
message: error instanceof Error ? error.message : String(error),
|
|
340
|
+
errorCode: "runtime_error"
|
|
341
|
+
});
|
|
342
|
+
throw error;
|
|
343
|
+
}
|
|
344
|
+
} finally {
|
|
345
|
+
this._state = "idle";
|
|
346
|
+
this.abortController = null;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
interrupt() {
|
|
350
|
+
if (this._state !== "active") {
|
|
351
|
+
logger.debug("Interrupt called but no active operation");
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
logger.debug("Interrupting MonoDriver");
|
|
355
|
+
this.abortController?.abort();
|
|
356
|
+
}
|
|
357
|
+
// ============================================================================
|
|
358
|
+
// Private Methods
|
|
359
|
+
// ============================================================================
|
|
360
|
+
/**
|
|
361
|
+
* Merge MCP tools and config tools into a single ToolSet.
|
|
362
|
+
* Config tools (bash etc.) take precedence over MCP tools with the same name.
|
|
363
|
+
*/
|
|
364
|
+
mergeTools() {
|
|
365
|
+
const configTools = this.config.tools?.length ? toVercelTools(this.config.tools) : {};
|
|
366
|
+
const merged = { ...this.mcpTools, ...configTools };
|
|
367
|
+
return Object.keys(merged).length > 0 ? merged : void 0;
|
|
368
|
+
}
|
|
369
|
+
getModel() {
|
|
370
|
+
const modelId = this.config.model ?? this.getDefaultModel();
|
|
371
|
+
const { apiKey } = this.config;
|
|
372
|
+
const baseURL = this.getBaseURL();
|
|
373
|
+
switch (this.provider) {
|
|
374
|
+
case "anthropic":
|
|
375
|
+
return createAnthropic({ apiKey, baseURL })(modelId);
|
|
376
|
+
case "openai":
|
|
377
|
+
return createOpenAI({ apiKey, baseURL })(modelId);
|
|
378
|
+
case "google":
|
|
379
|
+
return createGoogleGenerativeAI({ apiKey, baseURL })(modelId);
|
|
380
|
+
case "xai":
|
|
381
|
+
return createXai({ apiKey, baseURL })(modelId);
|
|
382
|
+
case "deepseek":
|
|
383
|
+
return createDeepSeek({ apiKey, baseURL })(modelId);
|
|
384
|
+
case "mistral":
|
|
385
|
+
return createMistral({ apiKey, baseURL })(modelId);
|
|
386
|
+
case "openai-compatible": {
|
|
387
|
+
if (!this.compatibleConfig) {
|
|
388
|
+
throw new Error("openai-compatible provider requires compatibleConfig in options");
|
|
389
|
+
}
|
|
390
|
+
const provider = createOpenAICompatible({
|
|
391
|
+
name: this.compatibleConfig.name,
|
|
392
|
+
baseURL: this.compatibleConfig.baseURL,
|
|
393
|
+
apiKey: this.compatibleConfig.apiKey ?? apiKey
|
|
394
|
+
});
|
|
395
|
+
return provider.chatModel(modelId);
|
|
396
|
+
}
|
|
397
|
+
default:
|
|
398
|
+
return createAnthropic({ apiKey, baseURL })(modelId);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Get the base URL for the provider SDK.
|
|
403
|
+
*
|
|
404
|
+
* Provider SDKs expect baseURL to include the version path (e.g. /v1).
|
|
405
|
+
* DriverConfig.baseUrl is the API root without version path.
|
|
406
|
+
* This method bridges the gap.
|
|
407
|
+
*/
|
|
408
|
+
getBaseURL() {
|
|
409
|
+
if (!this.config.baseUrl) return void 0;
|
|
410
|
+
const base = this.config.baseUrl.replace(/\/+$/, "");
|
|
411
|
+
if (base.endsWith("/v1")) return base;
|
|
412
|
+
return `${base}/v1`;
|
|
413
|
+
}
|
|
414
|
+
getDefaultModel() {
|
|
415
|
+
switch (this.provider) {
|
|
416
|
+
case "anthropic":
|
|
417
|
+
return "claude-sonnet-4-20250514";
|
|
418
|
+
case "openai":
|
|
419
|
+
return "gpt-4o";
|
|
420
|
+
case "google":
|
|
421
|
+
return "gemini-2.0-flash";
|
|
422
|
+
case "xai":
|
|
423
|
+
return "grok-3";
|
|
424
|
+
case "deepseek":
|
|
425
|
+
return "deepseek-chat";
|
|
426
|
+
case "mistral":
|
|
427
|
+
return "mistral-large-latest";
|
|
428
|
+
case "openai-compatible":
|
|
429
|
+
return "default";
|
|
430
|
+
default:
|
|
431
|
+
return "claude-sonnet-4-20250514";
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
function createMonoDriver(config) {
|
|
436
|
+
return new MonoDriver(config);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// src/index.ts
|
|
440
|
+
import { stepCountIs as stepCountIs2 } from "ai";
|
|
441
|
+
export {
|
|
442
|
+
MonoDriver,
|
|
443
|
+
createEvent,
|
|
444
|
+
createMonoDriver,
|
|
445
|
+
stepCountIs2 as stepCountIs,
|
|
446
|
+
toStopReason,
|
|
447
|
+
toVercelMessage,
|
|
448
|
+
toVercelMessages
|
|
449
|
+
};
|
|
450
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/MonoDriver.ts","../src/converters.ts","../src/index.ts"],"sourcesContent":["/**\n * MonoDriver - Unified Cross-Platform Driver\n *\n * Implements the Driver interface using Vercel AI SDK.\n * Supports multiple LLM providers (Anthropic, OpenAI, Google).\n *\n * ```\n * UserMessage\n * │\n * ▼\n * ┌─────────────────┐\n * │ MonoDriver │\n * │ │\n * │ receive() │──► AsyncIterable<DriverStreamEvent>\n * │ │ │\n * │ ▼ │\n * │ Vercel AI SDK │\n * └─────────────────┘\n * │\n * ▼\n * LLM Provider\n * (Anthropic/OpenAI/...)\n * ```\n */\n\nimport { streamText, stepCountIs } from \"ai\";\nimport type { ToolSet } from \"ai\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createXai } from \"@ai-sdk/xai\";\nimport { createDeepSeek } from \"@ai-sdk/deepseek\";\nimport { createMistral } from \"@ai-sdk/mistral\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\nimport { createMCPClient } from \"@ai-sdk/mcp\";\nimport type { MCPClient } from \"@ai-sdk/mcp\";\nimport { Experimental_StdioMCPTransport } from \"@ai-sdk/mcp/mcp-stdio\";\nimport type { Driver, DriverState, DriverStreamEvent } from \"@agentxjs/core/driver\";\nimport type { UserMessage } from \"@agentxjs/core/agent\";\nimport type { Session } from \"@agentxjs/core/session\";\nimport { createLogger } from \"commonxjs/logger\";\nimport type { MonoDriverConfig, MonoProvider, OpenAICompatibleConfig } from \"./types\";\nimport { toVercelMessages, toStopReason, createEvent, toVercelTools } from \"./converters\";\n\nconst logger = createLogger(\"mono-driver/MonoDriver\");\n\n/**\n * MonoDriver - Driver implementation using Vercel AI SDK\n */\nexport class MonoDriver implements Driver {\n readonly name = \"MonoDriver\";\n\n private _sessionId: string | null = null;\n private _state: DriverState = \"idle\";\n private abortController: AbortController | null = null;\n\n private readonly config: MonoDriverConfig;\n private readonly session?: Session;\n private readonly provider: MonoProvider;\n private readonly maxSteps: number;\n private readonly compatibleConfig?: OpenAICompatibleConfig;\n\n /** MCP clients created during initialize() */\n private mcpClients: MCPClient[] = [];\n /** Tools discovered from MCP servers */\n private mcpTools: ToolSet = {};\n\n constructor(config: MonoDriverConfig) {\n this.config = config;\n this.session = config.session;\n this.provider = config.options?.provider ?? \"anthropic\";\n this.maxSteps = config.options?.maxSteps ?? 10;\n this.compatibleConfig = config.options?.compatibleConfig;\n }\n\n // ============================================================================\n // Driver Interface Properties\n // ============================================================================\n\n get sessionId(): string | null {\n return this._sessionId;\n }\n\n get state(): DriverState {\n return this._state;\n }\n\n // ============================================================================\n // Lifecycle Methods\n // ============================================================================\n\n async initialize(): Promise<void> {\n if (this._state !== \"idle\") {\n throw new Error(`Cannot initialize: Driver is in \"${this._state}\" state`);\n }\n\n logger.info(\"Initializing MonoDriver\", {\n agentId: this.config.agentId,\n provider: this.provider,\n });\n\n // Generate a session ID for tracking\n this._sessionId = `mono_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n // Notify session ID captured\n this.config.onSessionIdCaptured?.(this._sessionId);\n\n // Initialize MCP servers\n if (this.config.mcpServers) {\n for (const [name, serverConfig] of Object.entries(this.config.mcpServers)) {\n let client: MCPClient;\n\n if (\"command\" in serverConfig) {\n // Stdio transport — local subprocess\n const transport = new Experimental_StdioMCPTransport({\n command: serverConfig.command,\n args: serverConfig.args,\n env: serverConfig.env,\n });\n client = await createMCPClient({ transport });\n } else {\n // HTTP Streamable transport — remote server\n client = await createMCPClient({\n transport: {\n type: serverConfig.type,\n url: serverConfig.url,\n headers: serverConfig.headers,\n },\n });\n }\n\n this.mcpClients.push(client);\n const tools = await client.tools();\n Object.assign(this.mcpTools, tools);\n logger.info(\"MCP server connected\", {\n name,\n toolCount: Object.keys(tools).length,\n });\n }\n }\n\n logger.info(\"MonoDriver initialized\", { sessionId: this._sessionId });\n }\n\n async dispose(): Promise<void> {\n if (this._state === \"disposed\") {\n return;\n }\n\n logger.info(\"Disposing MonoDriver\", { agentId: this.config.agentId });\n\n // Abort any ongoing request\n this.abortController?.abort();\n this.abortController = null;\n\n // Close MCP clients\n for (const client of this.mcpClients) {\n await client.close();\n }\n this.mcpClients = [];\n this.mcpTools = {};\n\n this._state = \"disposed\";\n logger.info(\"MonoDriver disposed\");\n }\n\n // ============================================================================\n // Core Methods\n // ============================================================================\n\n async *receive(message: UserMessage): AsyncIterable<DriverStreamEvent> {\n if (this._state === \"disposed\") {\n throw new Error(\"Cannot receive: Driver is disposed\");\n }\n\n if (this._state === \"active\") {\n throw new Error(\"Cannot receive: Driver is already processing a message\");\n }\n\n this._state = \"active\";\n this.abortController = new AbortController();\n\n try {\n // Get history from Session\n const history = this.session ? await this.session.getMessages() : [];\n\n // Convert to Vercel AI SDK format\n const messages = toVercelMessages(history);\n\n // Add current user message\n messages.push({\n role: \"user\",\n content:\n typeof message.content === \"string\"\n ? message.content\n : message.content.map((part) => {\n if (\"text\" in part) return { type: \"text\" as const, text: part.text };\n return { type: \"text\" as const, text: String(part) };\n }),\n });\n\n logger.debug(\"Sending message to LLM\", {\n provider: this.provider,\n messageCount: messages.length,\n agentId: this.config.agentId,\n });\n\n // Call Vercel AI SDK (v6)\n const result = streamText({\n model: this.getModel(),\n system: this.config.systemPrompt,\n messages,\n tools: this.mergeTools(),\n stopWhen: stepCountIs(this.maxSteps),\n abortSignal: this.abortController.signal,\n });\n\n // Track state for event conversion\n let messageStartEmitted = false;\n // Track tool calls in current step for correct message ordering.\n // AI SDK emits: tool-call → tool-result → finish-step\n // Engine needs: AssistantMessage(with tool-calls) BEFORE ToolResultMessage\n // So we inject message_stop before the first tool-result in each step.\n let hasToolCallsInStep = false;\n\n // Process fullStream (AI SDK v6 event types)\n for await (const part of result.fullStream) {\n if (this.abortController?.signal.aborted) {\n yield createEvent(\"interrupted\", { reason: \"user\" });\n break;\n }\n\n switch (part.type) {\n case \"start\":\n case \"start-step\":\n if (!messageStartEmitted) {\n const messageId = `msg_${Date.now()}`;\n const model = this.config.model ?? this.getDefaultModel();\n yield createEvent(\"message_start\", { messageId, model });\n messageStartEmitted = true;\n }\n hasToolCallsInStep = false;\n break;\n\n case \"text-delta\":\n yield createEvent(\"text_delta\", { text: part.text });\n break;\n\n case \"tool-input-start\":\n yield createEvent(\"tool_use_start\", {\n toolCallId: part.id,\n toolName: part.toolName,\n });\n break;\n\n case \"tool-input-delta\":\n yield createEvent(\"input_json_delta\", {\n partialJson: part.delta,\n });\n break;\n\n case \"tool-call\":\n hasToolCallsInStep = true;\n yield createEvent(\"tool_use_stop\", {\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n input: part.input as Record<string, unknown>,\n });\n break;\n\n case \"tool-result\":\n // Flush AssistantMessage before first tool-result in this step.\n // Ensures correct ordering: Assistant(tool-calls) → ToolResult\n if (hasToolCallsInStep) {\n yield createEvent(\"message_stop\", {\n stopReason: toStopReason(\"tool-calls\"),\n });\n hasToolCallsInStep = false;\n }\n yield createEvent(\"tool_result\", {\n toolCallId: part.toolCallId,\n result: part.output,\n isError: false,\n });\n break;\n\n case \"tool-error\":\n if (hasToolCallsInStep) {\n yield createEvent(\"message_stop\", {\n stopReason: toStopReason(\"tool-calls\"),\n });\n hasToolCallsInStep = false;\n }\n yield createEvent(\"tool_result\", {\n toolCallId: part.toolCallId,\n result: part.error,\n isError: true,\n });\n break;\n\n case \"finish-step\":\n // Emit usage data for this step\n if (part.usage) {\n yield createEvent(\"message_delta\", {\n usage: {\n inputTokens: part.usage.inputTokens ?? 0,\n outputTokens: part.usage.outputTokens ?? 0,\n },\n });\n }\n // Reset for next step so start-step emits a new message_start\n messageStartEmitted = false;\n break;\n\n case \"finish\":\n yield createEvent(\"message_stop\", {\n stopReason: toStopReason(part.finishReason),\n });\n break;\n\n case \"error\":\n yield createEvent(\"error\", {\n message: String(part.error),\n errorCode: \"stream_error\",\n });\n break;\n }\n }\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n yield createEvent(\"interrupted\", { reason: \"user\" });\n } else {\n yield createEvent(\"error\", {\n message: error instanceof Error ? error.message : String(error),\n errorCode: \"runtime_error\",\n });\n throw error;\n }\n } finally {\n this._state = \"idle\";\n this.abortController = null;\n }\n }\n\n interrupt(): void {\n if (this._state !== \"active\") {\n logger.debug(\"Interrupt called but no active operation\");\n return;\n }\n\n logger.debug(\"Interrupting MonoDriver\");\n this.abortController?.abort();\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n /**\n * Merge MCP tools and config tools into a single ToolSet.\n * Config tools (bash etc.) take precedence over MCP tools with the same name.\n */\n private mergeTools(): ToolSet | undefined {\n const configTools = this.config.tools?.length ? toVercelTools(this.config.tools) : {};\n const merged = { ...this.mcpTools, ...configTools };\n return Object.keys(merged).length > 0 ? merged : undefined;\n }\n\n private getModel() {\n const modelId = this.config.model ?? this.getDefaultModel();\n const { apiKey } = this.config;\n const baseURL = this.getBaseURL();\n\n switch (this.provider) {\n case \"anthropic\":\n return createAnthropic({ apiKey, baseURL })(modelId);\n case \"openai\":\n return createOpenAI({ apiKey, baseURL })(modelId);\n case \"google\":\n return createGoogleGenerativeAI({ apiKey, baseURL })(modelId);\n case \"xai\":\n return createXai({ apiKey, baseURL })(modelId);\n case \"deepseek\":\n return createDeepSeek({ apiKey, baseURL })(modelId);\n case \"mistral\":\n return createMistral({ apiKey, baseURL })(modelId);\n case \"openai-compatible\": {\n if (!this.compatibleConfig) {\n throw new Error(\"openai-compatible provider requires compatibleConfig in options\");\n }\n const provider = createOpenAICompatible({\n name: this.compatibleConfig.name,\n baseURL: this.compatibleConfig.baseURL,\n apiKey: this.compatibleConfig.apiKey ?? apiKey,\n });\n return provider.chatModel(modelId);\n }\n default:\n return createAnthropic({ apiKey, baseURL })(modelId);\n }\n }\n\n /**\n * Get the base URL for the provider SDK.\n *\n * Provider SDKs expect baseURL to include the version path (e.g. /v1).\n * DriverConfig.baseUrl is the API root without version path.\n * This method bridges the gap.\n */\n private getBaseURL(): string | undefined {\n if (!this.config.baseUrl) return undefined;\n const base = this.config.baseUrl.replace(/\\/+$/, \"\");\n if (base.endsWith(\"/v1\")) return base;\n return `${base}/v1`;\n }\n\n private getDefaultModel(): string {\n switch (this.provider) {\n case \"anthropic\":\n return \"claude-sonnet-4-20250514\";\n case \"openai\":\n return \"gpt-4o\";\n case \"google\":\n return \"gemini-2.0-flash\";\n case \"xai\":\n return \"grok-3\";\n case \"deepseek\":\n return \"deepseek-chat\";\n case \"mistral\":\n return \"mistral-large-latest\";\n case \"openai-compatible\":\n return \"default\";\n default:\n return \"claude-sonnet-4-20250514\";\n }\n }\n}\n\n/**\n * Create a MonoDriver instance\n */\nexport function createMonoDriver(config: MonoDriverConfig): Driver {\n return new MonoDriver(config);\n}\n","/**\n * Message and Event Converters\n *\n * Converts between AgentX types and Vercel AI SDK v6 types\n */\n\nimport { tool, jsonSchema } from \"ai\";\nimport type { ModelMessage, ToolSet } from \"ai\";\nimport type { Message, ToolResultMessage } from \"@agentxjs/core/agent\";\nimport type { DriverStreamEvent, StopReason, ToolDefinition } from \"@agentxjs/core/driver\";\n\n// ============================================================================\n// Message Converters (AgentX → Vercel AI SDK v6)\n// ============================================================================\n\n/**\n * Convert AgentX Message to Vercel ModelMessage\n */\nexport function toVercelMessage(message: Message): ModelMessage | null {\n switch (message.subtype) {\n case \"user\":\n return {\n role: \"user\",\n content:\n typeof message.content === \"string\" ? message.content : extractText(message.content),\n };\n\n case \"assistant\": {\n // Assistant message may contain text and tool calls in content\n const content = \"content\" in message ? message.content : \"\";\n if (typeof content === \"string\") {\n return { role: \"assistant\", content };\n }\n // Extract tool calls from content parts\n const toolCalls = content.filter(\n (p): p is { type: \"tool-call\"; id: string; name: string; input: Record<string, unknown> } =>\n p.type === \"tool-call\"\n );\n if (toolCalls.length > 0) {\n // Vercel AI SDK format: assistant with tool-call content\n return {\n role: \"assistant\",\n content: [\n ...content\n .filter((p) => p.type === \"text\")\n .map((p) => ({ type: \"text\" as const, text: (p as { text: string }).text })),\n ...toolCalls.map((tc) => ({\n type: \"tool-call\" as const,\n toolCallId: tc.id,\n toolName: tc.name,\n input: tc.input,\n })),\n ],\n } as unknown as ModelMessage;\n }\n return { role: \"assistant\", content: extractText(content) };\n }\n\n case \"tool-result\": {\n const msg = message as ToolResultMessage;\n return {\n role: \"tool\",\n content: [\n {\n type: \"tool-result\" as const,\n toolCallId: msg.toolCallId,\n toolName: msg.toolResult.name,\n output: msg.toolResult.output,\n },\n ],\n } as unknown as ModelMessage;\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Convert array of AgentX Messages to Vercel ModelMessages\n */\nexport function toVercelMessages(messages: Message[]): ModelMessage[] {\n const result: ModelMessage[] = [];\n for (const message of messages) {\n const converted = toVercelMessage(message);\n if (converted) {\n result.push(converted);\n }\n }\n return result;\n}\n\n/**\n * Extract text from any content shape\n */\nfunction extractText(content: unknown): string {\n if (typeof content === \"string\") return content;\n\n if (Array.isArray(content)) {\n return content\n .filter(\n (part) =>\n part !== null &&\n typeof part === \"object\" &&\n \"text\" in part &&\n typeof part.text === \"string\"\n )\n .map((part) => part.text)\n .join(\"\");\n }\n\n return String(content ?? \"\");\n}\n\n// ============================================================================\n// Event Converters (Vercel AI SDK → AgentX)\n// ============================================================================\n\n/**\n * Map Vercel AI SDK v6 finish reason to AgentX StopReason\n */\nexport function toStopReason(finishReason: string | null | undefined): StopReason {\n switch (finishReason) {\n case \"stop\":\n return \"end_turn\";\n case \"length\":\n return \"max_tokens\";\n case \"tool-calls\":\n return \"tool_use\";\n case \"content-filter\":\n return \"content_filter\";\n case \"error\":\n return \"error\";\n default:\n return \"other\";\n }\n}\n\n/**\n * Create a DriverStreamEvent with timestamp\n */\nexport function createEvent<T extends DriverStreamEvent[\"type\"]>(\n type: T,\n data: Extract<DriverStreamEvent, { type: T }>[\"data\"]\n): DriverStreamEvent {\n return {\n type,\n timestamp: Date.now(),\n data,\n } as DriverStreamEvent;\n}\n\n// ============================================================================\n// Tool Converters (AgentX → Vercel AI SDK v6)\n// ============================================================================\n\n/**\n * Convert AgentX ToolDefinitions to Vercel AI SDK tool format\n *\n * Uses jsonSchema() instead of Zod to avoid adding Zod dependency to core.\n * Type casts are needed to bridge our ToolDefinition.parameters (simplified\n * JSON Schema) to the AI SDK's strict JSONSchema7 type.\n */\nexport function toVercelTools(tools: ToolDefinition[]): ToolSet {\n const result: ToolSet = {};\n for (const t of tools) {\n result[t.name] = tool({\n description: t.description,\n\n inputSchema: jsonSchema(t.parameters as any),\n execute: async (input) => t.execute(input as Record<string, unknown>),\n });\n }\n return result;\n}\n","/**\n * @agentxjs/mono-driver\n *\n * Unified cross-platform Driver using Vercel AI SDK.\n *\n * Features:\n * - Multi-provider: Anthropic, OpenAI, Google (and more)\n * - Cross-platform: Node.js, Bun, Cloudflare Workers, Edge Runtime\n * - Lightweight: Direct HTTP API calls, no subprocess\n *\n * @example\n * ```typescript\n * import { createMonoDriver } from \"@agentxjs/mono-driver\";\n *\n * const driver = createMonoDriver({\n * apiKey: process.env.ANTHROPIC_API_KEY!,\n * agentId: \"my-agent\",\n * systemPrompt: \"You are helpful\",\n * options: {\n * provider: \"anthropic\",\n * maxSteps: 10,\n * },\n * });\n *\n * await driver.initialize();\n *\n * for await (const event of driver.receive({ content: \"Hello\" })) {\n * if (event.type === \"text_delta\") {\n * process.stdout.write(event.data.text);\n * }\n * }\n *\n * await driver.dispose();\n * ```\n */\n\n// Main exports\nexport { MonoDriver, createMonoDriver } from \"./MonoDriver\";\n\n// Types\nexport type {\n MonoDriverConfig,\n MonoDriverOptions,\n MonoProvider,\n MonoBuiltinProvider,\n OpenAICompatibleConfig,\n} from \"./types\";\n\n// Converters (for advanced usage)\nexport { toVercelMessage, toVercelMessages, toStopReason, createEvent } from \"./converters\";\n\n// Re-export Vercel AI SDK utilities for advanced usage\nexport { stepCountIs } from \"ai\";\n"],"mappings":"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","names":["stepCountIs"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agentxjs/mono-driver",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "Unified cross-platform Driver using Vercel AI SDK",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"src"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsup",
|
|
21
|
+
"typecheck": "tsc --noEmit",
|
|
22
|
+
"test": "echo 'No tests yet'"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@agentxjs/core": "^2.0.0",
|
|
26
|
+
"@ai-sdk/anthropic": "^3.0.36",
|
|
27
|
+
"@ai-sdk/deepseek": "2.0.17",
|
|
28
|
+
"@ai-sdk/google": "^3.0.21",
|
|
29
|
+
"@ai-sdk/mcp": "1.0.18",
|
|
30
|
+
"@ai-sdk/mistral": "3.0.18",
|
|
31
|
+
"@ai-sdk/openai": "^3.0.25",
|
|
32
|
+
"@ai-sdk/openai-compatible": "2.0.27",
|
|
33
|
+
"@ai-sdk/xai": "3.0.47",
|
|
34
|
+
"ai": "^6.0.70",
|
|
35
|
+
"commonxjs": "^0.1.1"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"typescript": "^5.3.3"
|
|
39
|
+
}
|
|
40
|
+
}
|