@agentxjs/mono-driver 2.0.0 → 2.0.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/dist/index.d.ts +30 -34
- package/dist/index.js +18 -60
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
- package/src/MonoDriver.ts +15 -65
- package/src/converters.ts +2 -2
- package/src/index.ts +6 -9
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,32 @@
|
|
|
1
|
-
import { DriverConfig, Driver, DriverState, DriverStreamEvent, StopReason } from '@agentxjs/core/driver';
|
|
2
|
-
import { UserMessage, Message } from '@agentxjs/core/agent';
|
|
3
1
|
import { ModelMessage } from 'ai';
|
|
4
2
|
export { stepCountIs } from 'ai';
|
|
3
|
+
import { Message, UserMessage } from '@agentxjs/core/agent';
|
|
4
|
+
import { DriverStreamEvent, StopReason, DriverConfig, Driver, DriverState } from '@agentxjs/core/driver';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Message and Event Converters
|
|
8
|
+
*
|
|
9
|
+
* Converts between AgentX types and Vercel AI SDK v6 types
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Convert AgentX Message to Vercel ModelMessage
|
|
14
|
+
*/
|
|
15
|
+
declare function toVercelMessage(message: Message): ModelMessage | null;
|
|
16
|
+
/**
|
|
17
|
+
* Convert array of AgentX Messages to Vercel ModelMessages
|
|
18
|
+
*/
|
|
19
|
+
declare function toVercelMessages(messages: Message[]): ModelMessage[];
|
|
20
|
+
/**
|
|
21
|
+
* Map Vercel AI SDK v6 finish reason to AgentX StopReason
|
|
22
|
+
*/
|
|
23
|
+
declare function toStopReason(finishReason: string | null | undefined): StopReason;
|
|
24
|
+
/**
|
|
25
|
+
* Create a DriverStreamEvent with timestamp
|
|
26
|
+
*/
|
|
27
|
+
declare function createEvent<T extends DriverStreamEvent["type"]>(type: T, data: Extract<DriverStreamEvent, {
|
|
28
|
+
type: T;
|
|
29
|
+
}>["data"]): DriverStreamEvent;
|
|
5
30
|
|
|
6
31
|
/**
|
|
7
32
|
* MonoDriver Types
|
|
@@ -110,10 +135,6 @@ declare class MonoDriver implements Driver {
|
|
|
110
135
|
private readonly provider;
|
|
111
136
|
private readonly maxSteps;
|
|
112
137
|
private readonly compatibleConfig?;
|
|
113
|
-
/** MCP clients created during initialize() */
|
|
114
|
-
private mcpClients;
|
|
115
|
-
/** Tools discovered from MCP servers */
|
|
116
|
-
private mcpTools;
|
|
117
138
|
constructor(config: MonoDriverConfig);
|
|
118
139
|
get sessionId(): string | null;
|
|
119
140
|
get state(): DriverState;
|
|
@@ -122,10 +143,10 @@ declare class MonoDriver implements Driver {
|
|
|
122
143
|
receive(message: UserMessage): AsyncIterable<DriverStreamEvent>;
|
|
123
144
|
interrupt(): void;
|
|
124
145
|
/**
|
|
125
|
-
*
|
|
126
|
-
*
|
|
146
|
+
* Convert config tools to Vercel AI SDK ToolSet.
|
|
147
|
+
* Tools are injected via DriverConfig.tools (from Platform providers like BashProvider).
|
|
127
148
|
*/
|
|
128
|
-
private
|
|
149
|
+
private getTools;
|
|
129
150
|
private getModel;
|
|
130
151
|
/**
|
|
131
152
|
* Get the base URL for the provider SDK.
|
|
@@ -142,29 +163,4 @@ declare class MonoDriver implements Driver {
|
|
|
142
163
|
*/
|
|
143
164
|
declare function createMonoDriver(config: MonoDriverConfig): Driver;
|
|
144
165
|
|
|
145
|
-
/**
|
|
146
|
-
* Message and Event Converters
|
|
147
|
-
*
|
|
148
|
-
* Converts between AgentX types and Vercel AI SDK v6 types
|
|
149
|
-
*/
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Convert AgentX Message to Vercel ModelMessage
|
|
153
|
-
*/
|
|
154
|
-
declare function toVercelMessage(message: Message): ModelMessage | null;
|
|
155
|
-
/**
|
|
156
|
-
* Convert array of AgentX Messages to Vercel ModelMessages
|
|
157
|
-
*/
|
|
158
|
-
declare function toVercelMessages(messages: Message[]): ModelMessage[];
|
|
159
|
-
/**
|
|
160
|
-
* Map Vercel AI SDK v6 finish reason to AgentX StopReason
|
|
161
|
-
*/
|
|
162
|
-
declare function toStopReason(finishReason: string | null | undefined): StopReason;
|
|
163
|
-
/**
|
|
164
|
-
* Create a DriverStreamEvent with timestamp
|
|
165
|
-
*/
|
|
166
|
-
declare function createEvent<T extends DriverStreamEvent["type"]>(type: T, data: Extract<DriverStreamEvent, {
|
|
167
|
-
type: T;
|
|
168
|
-
}>["data"]): DriverStreamEvent;
|
|
169
|
-
|
|
170
166
|
export { type MonoBuiltinProvider, MonoDriver, type MonoDriverConfig, type MonoDriverOptions, type MonoProvider, type OpenAICompatibleConfig, createEvent, createMonoDriver, toStopReason, toVercelMessage, toVercelMessages };
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,8 @@
|
|
|
1
|
-
// src/
|
|
2
|
-
import {
|
|
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";
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { stepCountIs as stepCountIs2 } from "ai";
|
|
13
3
|
|
|
14
4
|
// src/converters.ts
|
|
15
|
-
import {
|
|
5
|
+
import { jsonSchema, tool } from "ai";
|
|
16
6
|
function toVercelMessage(message) {
|
|
17
7
|
switch (message.subtype) {
|
|
18
8
|
case "user":
|
|
@@ -117,6 +107,15 @@ function toVercelTools(tools) {
|
|
|
117
107
|
}
|
|
118
108
|
|
|
119
109
|
// src/MonoDriver.ts
|
|
110
|
+
import { createAnthropic } from "@ai-sdk/anthropic";
|
|
111
|
+
import { createDeepSeek } from "@ai-sdk/deepseek";
|
|
112
|
+
import { createGoogleGenerativeAI } from "@ai-sdk/google";
|
|
113
|
+
import { createMistral } from "@ai-sdk/mistral";
|
|
114
|
+
import { createOpenAI } from "@ai-sdk/openai";
|
|
115
|
+
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
116
|
+
import { createXai } from "@ai-sdk/xai";
|
|
117
|
+
import { stepCountIs, streamText } from "ai";
|
|
118
|
+
import { createLogger } from "commonxjs/logger";
|
|
120
119
|
var logger = createLogger("mono-driver/MonoDriver");
|
|
121
120
|
var MonoDriver = class {
|
|
122
121
|
name = "MonoDriver";
|
|
@@ -128,10 +127,6 @@ var MonoDriver = class {
|
|
|
128
127
|
provider;
|
|
129
128
|
maxSteps;
|
|
130
129
|
compatibleConfig;
|
|
131
|
-
/** MCP clients created during initialize() */
|
|
132
|
-
mcpClients = [];
|
|
133
|
-
/** Tools discovered from MCP servers */
|
|
134
|
-
mcpTools = {};
|
|
135
130
|
constructor(config) {
|
|
136
131
|
this.config = config;
|
|
137
132
|
this.session = config.session;
|
|
@@ -161,34 +156,6 @@ var MonoDriver = class {
|
|
|
161
156
|
});
|
|
162
157
|
this._sessionId = `mono_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
163
158
|
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
159
|
logger.info("MonoDriver initialized", { sessionId: this._sessionId });
|
|
193
160
|
}
|
|
194
161
|
async dispose() {
|
|
@@ -198,11 +165,6 @@ var MonoDriver = class {
|
|
|
198
165
|
logger.info("Disposing MonoDriver", { agentId: this.config.agentId });
|
|
199
166
|
this.abortController?.abort();
|
|
200
167
|
this.abortController = null;
|
|
201
|
-
for (const client of this.mcpClients) {
|
|
202
|
-
await client.close();
|
|
203
|
-
}
|
|
204
|
-
this.mcpClients = [];
|
|
205
|
-
this.mcpTools = {};
|
|
206
168
|
this._state = "disposed";
|
|
207
169
|
logger.info("MonoDriver disposed");
|
|
208
170
|
}
|
|
@@ -237,7 +199,7 @@ var MonoDriver = class {
|
|
|
237
199
|
model: this.getModel(),
|
|
238
200
|
system: this.config.systemPrompt,
|
|
239
201
|
messages,
|
|
240
|
-
tools: this.
|
|
202
|
+
tools: this.getTools(),
|
|
241
203
|
stopWhen: stepCountIs(this.maxSteps),
|
|
242
204
|
abortSignal: this.abortController.signal
|
|
243
205
|
});
|
|
@@ -358,13 +320,12 @@ var MonoDriver = class {
|
|
|
358
320
|
// Private Methods
|
|
359
321
|
// ============================================================================
|
|
360
322
|
/**
|
|
361
|
-
*
|
|
362
|
-
*
|
|
323
|
+
* Convert config tools to Vercel AI SDK ToolSet.
|
|
324
|
+
* Tools are injected via DriverConfig.tools (from Platform providers like BashProvider).
|
|
363
325
|
*/
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
return Object.keys(merged).length > 0 ? merged : void 0;
|
|
326
|
+
getTools() {
|
|
327
|
+
if (!this.config.tools?.length) return void 0;
|
|
328
|
+
return toVercelTools(this.config.tools);
|
|
368
329
|
}
|
|
369
330
|
getModel() {
|
|
370
331
|
const modelId = this.config.model ?? this.getDefaultModel();
|
|
@@ -435,9 +396,6 @@ var MonoDriver = class {
|
|
|
435
396
|
function createMonoDriver(config) {
|
|
436
397
|
return new MonoDriver(config);
|
|
437
398
|
}
|
|
438
|
-
|
|
439
|
-
// src/index.ts
|
|
440
|
-
import { stepCountIs as stepCountIs2 } from "ai";
|
|
441
399
|
export {
|
|
442
400
|
MonoDriver,
|
|
443
401
|
createEvent,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/converters.ts","../src/MonoDriver.ts"],"sourcesContent":["/**\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// Re-export Vercel AI SDK utilities for advanced usage\nexport { stepCountIs } from \"ai\";\n// Converters (for advanced usage)\nexport { createEvent, toStopReason, toVercelMessage, toVercelMessages } from \"./converters\";\n// Main exports\nexport { createMonoDriver, MonoDriver } from \"./MonoDriver\";\n// Types\nexport type {\n MonoBuiltinProvider,\n MonoDriverConfig,\n MonoDriverOptions,\n MonoProvider,\n OpenAICompatibleConfig,\n} from \"./types\";\n","/**\n * Message and Event Converters\n *\n * Converts between AgentX types and Vercel AI SDK v6 types\n */\n\nimport type { Message, ToolResultMessage } from \"@agentxjs/core/agent\";\nimport type { DriverStreamEvent, StopReason, ToolDefinition } from \"@agentxjs/core/driver\";\nimport type { ModelMessage, ToolSet } from \"ai\";\nimport { jsonSchema, tool } from \"ai\";\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 * 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 type { UserMessage } from \"@agentxjs/core/agent\";\nimport type { Driver, DriverState, DriverStreamEvent } from \"@agentxjs/core/driver\";\nimport type { Session } from \"@agentxjs/core/session\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createDeepSeek } from \"@ai-sdk/deepseek\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createMistral } from \"@ai-sdk/mistral\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\nimport { createXai } from \"@ai-sdk/xai\";\nimport type { ToolSet } from \"ai\";\nimport { stepCountIs, streamText } from \"ai\";\nimport { createLogger } from \"commonxjs/logger\";\nimport { createEvent, toStopReason, toVercelMessages, toVercelTools } from \"./converters\";\nimport type { MonoDriverConfig, MonoProvider, OpenAICompatibleConfig } from \"./types\";\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 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 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 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.getTools(),\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 * Convert config tools to Vercel AI SDK ToolSet.\n * Tools are injected via DriverConfig.tools (from Platform providers like BashProvider).\n */\n private getTools(): ToolSet | undefined {\n if (!this.config.tools?.length) return undefined;\n return toVercelTools(this.config.tools);\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"],"mappings":"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","names":["stepCountIs"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentxjs/mono-driver",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Unified cross-platform Driver using Vercel AI SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,11 +22,10 @@
|
|
|
22
22
|
"test": "echo 'No tests yet'"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@agentxjs/core": "^2.0.
|
|
25
|
+
"@agentxjs/core": "^2.0.1",
|
|
26
26
|
"@ai-sdk/anthropic": "^3.0.36",
|
|
27
27
|
"@ai-sdk/deepseek": "2.0.17",
|
|
28
28
|
"@ai-sdk/google": "^3.0.21",
|
|
29
|
-
"@ai-sdk/mcp": "1.0.18",
|
|
30
29
|
"@ai-sdk/mistral": "3.0.18",
|
|
31
30
|
"@ai-sdk/openai": "^3.0.25",
|
|
32
31
|
"@ai-sdk/openai-compatible": "2.0.27",
|
package/src/MonoDriver.ts
CHANGED
|
@@ -23,24 +23,21 @@
|
|
|
23
23
|
* ```
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
-
import {
|
|
27
|
-
import type {
|
|
26
|
+
import type { UserMessage } from "@agentxjs/core/agent";
|
|
27
|
+
import type { Driver, DriverState, DriverStreamEvent } from "@agentxjs/core/driver";
|
|
28
|
+
import type { Session } from "@agentxjs/core/session";
|
|
28
29
|
import { createAnthropic } from "@ai-sdk/anthropic";
|
|
29
|
-
import { createOpenAI } from "@ai-sdk/openai";
|
|
30
|
-
import { createGoogleGenerativeAI } from "@ai-sdk/google";
|
|
31
|
-
import { createXai } from "@ai-sdk/xai";
|
|
32
30
|
import { createDeepSeek } from "@ai-sdk/deepseek";
|
|
31
|
+
import { createGoogleGenerativeAI } from "@ai-sdk/google";
|
|
33
32
|
import { createMistral } from "@ai-sdk/mistral";
|
|
33
|
+
import { createOpenAI } from "@ai-sdk/openai";
|
|
34
34
|
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
35
|
-
import {
|
|
36
|
-
import type {
|
|
37
|
-
import {
|
|
38
|
-
import type { Driver, DriverState, DriverStreamEvent } from "@agentxjs/core/driver";
|
|
39
|
-
import type { UserMessage } from "@agentxjs/core/agent";
|
|
40
|
-
import type { Session } from "@agentxjs/core/session";
|
|
35
|
+
import { createXai } from "@ai-sdk/xai";
|
|
36
|
+
import type { ToolSet } from "ai";
|
|
37
|
+
import { stepCountIs, streamText } from "ai";
|
|
41
38
|
import { createLogger } from "commonxjs/logger";
|
|
39
|
+
import { createEvent, toStopReason, toVercelMessages, toVercelTools } from "./converters";
|
|
42
40
|
import type { MonoDriverConfig, MonoProvider, OpenAICompatibleConfig } from "./types";
|
|
43
|
-
import { toVercelMessages, toStopReason, createEvent, toVercelTools } from "./converters";
|
|
44
41
|
|
|
45
42
|
const logger = createLogger("mono-driver/MonoDriver");
|
|
46
43
|
|
|
@@ -60,11 +57,6 @@ export class MonoDriver implements Driver {
|
|
|
60
57
|
private readonly maxSteps: number;
|
|
61
58
|
private readonly compatibleConfig?: OpenAICompatibleConfig;
|
|
62
59
|
|
|
63
|
-
/** MCP clients created during initialize() */
|
|
64
|
-
private mcpClients: MCPClient[] = [];
|
|
65
|
-
/** Tools discovered from MCP servers */
|
|
66
|
-
private mcpTools: ToolSet = {};
|
|
67
|
-
|
|
68
60
|
constructor(config: MonoDriverConfig) {
|
|
69
61
|
this.config = config;
|
|
70
62
|
this.session = config.session;
|
|
@@ -105,40 +97,6 @@ export class MonoDriver implements Driver {
|
|
|
105
97
|
// Notify session ID captured
|
|
106
98
|
this.config.onSessionIdCaptured?.(this._sessionId);
|
|
107
99
|
|
|
108
|
-
// Initialize MCP servers
|
|
109
|
-
if (this.config.mcpServers) {
|
|
110
|
-
for (const [name, serverConfig] of Object.entries(this.config.mcpServers)) {
|
|
111
|
-
let client: MCPClient;
|
|
112
|
-
|
|
113
|
-
if ("command" in serverConfig) {
|
|
114
|
-
// Stdio transport — local subprocess
|
|
115
|
-
const transport = new Experimental_StdioMCPTransport({
|
|
116
|
-
command: serverConfig.command,
|
|
117
|
-
args: serverConfig.args,
|
|
118
|
-
env: serverConfig.env,
|
|
119
|
-
});
|
|
120
|
-
client = await createMCPClient({ transport });
|
|
121
|
-
} else {
|
|
122
|
-
// HTTP Streamable transport — remote server
|
|
123
|
-
client = await createMCPClient({
|
|
124
|
-
transport: {
|
|
125
|
-
type: serverConfig.type,
|
|
126
|
-
url: serverConfig.url,
|
|
127
|
-
headers: serverConfig.headers,
|
|
128
|
-
},
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
this.mcpClients.push(client);
|
|
133
|
-
const tools = await client.tools();
|
|
134
|
-
Object.assign(this.mcpTools, tools);
|
|
135
|
-
logger.info("MCP server connected", {
|
|
136
|
-
name,
|
|
137
|
-
toolCount: Object.keys(tools).length,
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
100
|
logger.info("MonoDriver initialized", { sessionId: this._sessionId });
|
|
143
101
|
}
|
|
144
102
|
|
|
@@ -153,13 +111,6 @@ export class MonoDriver implements Driver {
|
|
|
153
111
|
this.abortController?.abort();
|
|
154
112
|
this.abortController = null;
|
|
155
113
|
|
|
156
|
-
// Close MCP clients
|
|
157
|
-
for (const client of this.mcpClients) {
|
|
158
|
-
await client.close();
|
|
159
|
-
}
|
|
160
|
-
this.mcpClients = [];
|
|
161
|
-
this.mcpTools = {};
|
|
162
|
-
|
|
163
114
|
this._state = "disposed";
|
|
164
115
|
logger.info("MonoDriver disposed");
|
|
165
116
|
}
|
|
@@ -210,7 +161,7 @@ export class MonoDriver implements Driver {
|
|
|
210
161
|
model: this.getModel(),
|
|
211
162
|
system: this.config.systemPrompt,
|
|
212
163
|
messages,
|
|
213
|
-
tools: this.
|
|
164
|
+
tools: this.getTools(),
|
|
214
165
|
stopWhen: stepCountIs(this.maxSteps),
|
|
215
166
|
abortSignal: this.abortController.signal,
|
|
216
167
|
});
|
|
@@ -357,13 +308,12 @@ export class MonoDriver implements Driver {
|
|
|
357
308
|
// ============================================================================
|
|
358
309
|
|
|
359
310
|
/**
|
|
360
|
-
*
|
|
361
|
-
*
|
|
311
|
+
* Convert config tools to Vercel AI SDK ToolSet.
|
|
312
|
+
* Tools are injected via DriverConfig.tools (from Platform providers like BashProvider).
|
|
362
313
|
*/
|
|
363
|
-
private
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
return Object.keys(merged).length > 0 ? merged : undefined;
|
|
314
|
+
private getTools(): ToolSet | undefined {
|
|
315
|
+
if (!this.config.tools?.length) return undefined;
|
|
316
|
+
return toVercelTools(this.config.tools);
|
|
367
317
|
}
|
|
368
318
|
|
|
369
319
|
private getModel() {
|
package/src/converters.ts
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* Converts between AgentX types and Vercel AI SDK v6 types
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { tool, jsonSchema } from "ai";
|
|
8
|
-
import type { ModelMessage, ToolSet } from "ai";
|
|
9
7
|
import type { Message, ToolResultMessage } from "@agentxjs/core/agent";
|
|
10
8
|
import type { DriverStreamEvent, StopReason, ToolDefinition } from "@agentxjs/core/driver";
|
|
9
|
+
import type { ModelMessage, ToolSet } from "ai";
|
|
10
|
+
import { jsonSchema, tool } from "ai";
|
|
11
11
|
|
|
12
12
|
// ============================================================================
|
|
13
13
|
// Message Converters (AgentX → Vercel AI SDK v6)
|
package/src/index.ts
CHANGED
|
@@ -34,20 +34,17 @@
|
|
|
34
34
|
* ```
|
|
35
35
|
*/
|
|
36
36
|
|
|
37
|
+
// Re-export Vercel AI SDK utilities for advanced usage
|
|
38
|
+
export { stepCountIs } from "ai";
|
|
39
|
+
// Converters (for advanced usage)
|
|
40
|
+
export { createEvent, toStopReason, toVercelMessage, toVercelMessages } from "./converters";
|
|
37
41
|
// Main exports
|
|
38
|
-
export {
|
|
39
|
-
|
|
42
|
+
export { createMonoDriver, MonoDriver } from "./MonoDriver";
|
|
40
43
|
// Types
|
|
41
44
|
export type {
|
|
45
|
+
MonoBuiltinProvider,
|
|
42
46
|
MonoDriverConfig,
|
|
43
47
|
MonoDriverOptions,
|
|
44
48
|
MonoProvider,
|
|
45
|
-
MonoBuiltinProvider,
|
|
46
49
|
OpenAICompatibleConfig,
|
|
47
50
|
} from "./types";
|
|
48
|
-
|
|
49
|
-
// Converters (for advanced usage)
|
|
50
|
-
export { toVercelMessage, toVercelMessages, toStopReason, createEvent } from "./converters";
|
|
51
|
-
|
|
52
|
-
// Re-export Vercel AI SDK utilities for advanced usage
|
|
53
|
-
export { stepCountIs } from "ai";
|