@copilotkitnext/agent 0.0.24 → 0.0.26

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.
@@ -1,23 +1,23 @@
1
1
 
2
2
  
3
- > @copilotkitnext/agent@0.0.23 build /Users/mikeryan/Repos/cpk/vnext_experimental/packages/agent
3
+ > @copilotkitnext/agent@0.0.23 build /Users/mme/Projects/CopilotKit2/main/packages/agent
4
4
  > tsup
5
5
 
6
6
  CLI Building entry: src/index.ts
7
7
  CLI Using tsconfig: tsconfig.json
8
8
  CLI tsup v8.5.0
9
- CLI Using tsup config: /Users/mikeryan/Repos/cpk/vnext_experimental/packages/agent/tsup.config.ts
9
+ CLI Using tsup config: /Users/mme/Projects/CopilotKit2/main/packages/agent/tsup.config.ts
10
10
  CLI Target: es2022
11
11
  CLI Cleaning output folder
12
12
  CJS Build start
13
13
  ESM Build start
14
14
  ESM dist/index.mjs 20.84 KB
15
15
  ESM dist/index.mjs.map 43.55 KB
16
- ESM ⚡️ Build success in 9ms
16
+ ESM ⚡️ Build success in 13ms
17
17
  CJS dist/index.js 22.62 KB
18
18
  CJS dist/index.js.map 43.60 KB
19
- CJS ⚡️ Build success in 9ms
19
+ CJS ⚡️ Build success in 14ms
20
20
  DTS Build start
21
- DTS ⚡️ Build success in 1024ms
21
+ DTS ⚡️ Build success in 2105ms
22
22
  DTS dist/index.d.ts 5.88 KB
23
23
  DTS dist/index.d.mts 5.88 KB
@@ -0,0 +1,4 @@
1
+
2
+ > @copilotkitnext/agent@0.0.13-alpha.1 check-types /Users/mme/Projects/CopilotKit2/main/packages/agent
3
+ > tsc --noEmit
4
+
@@ -1,18 +1,18 @@
1
1
 
2
2
  
3
- > @copilotkitnext/agent@0.0.23 test /Users/mikeryan/Repos/cpk/vnext_experimental/packages/agent
3
+ > @copilotkitnext/agent@0.0.21 test /Users/mme/Projects/CopilotKit2/main/packages/agent
4
4
  > vitest run
5
5
 
6
6
  [?25l
7
-  RUN  v3.2.4 /Users/mikeryan/Repos/cpk/vnext_experimental/packages/agent
7
+  RUN  v3.2.4 /Users/mme/Projects/CopilotKit2/main/packages/agent
8
8
 
9
9
  [?2026h
10
-  ❯ src/__tests__/state-tools.test.ts [queued]
10
+  ❯ src/__tests__/utils.test.ts [queued]
11
11
 
12
12
   Test Files 0 passed (4)
13
13
   Tests 0 passed (0)
14
-  Start at 10:25:21
15
-  Duration 306ms
14
+  Start at 15:45:20
15
+  Duration 308ms
16
16
  [?2026l[?2026h
17
17
   ❯ src/__tests__/basic-agent.test.ts [queued]
18
18
   ❯ src/__tests__/property-overrides.test.ts [queued]
@@ -21,8 +21,18 @@
21
21
 
22
22
   Test Files 0 passed (4)
23
23
   Tests 0 passed (0)
24
-  Start at 10:25:21
25
-  Duration 921ms
24
+  Start at 15:45:20
25
+  Duration 532ms
26
+ [?2026l[?2026h
27
+  ❯ src/__tests__/basic-agent.test.ts [queued]
28
+  ❯ src/__tests__/property-overrides.test.ts [queued]
29
+  ❯ src/__tests__/state-tools.test.ts [queued]
30
+  ❯ src/__tests__/utils.test.ts [queued]
31
+
32
+  Test Files 0 passed (4)
33
+  Tests 0 passed (0)
34
+  Start at 15:45:20
35
+  Duration 959ms
26
36
  [?2026l[?2026h
27
37
   ❯ src/__tests__/basic-agent.test.ts 0/14
28
38
   ❯ src/__tests__/property-overrides.test.ts [queued]
@@ -31,24 +41,43 @@
31
41
 
32
42
   Test Files 0 passed (4)
33
43
   Tests 0 passed (14)
34
-  Start at 10:25:21
35
-  Duration 1.42s
36
- [?2026l[?2026h ✓ src/__tests__/basic-agent.test.ts (14 tests) 19ms
37
- ✓ src/__tests__/property-overrides.test.ts (21 tests) 10ms
38
- ✓ src/__tests__/state-tools.test.ts (10 tests) 33ms
44
+  Start at 15:45:20
45
+  Duration 1.47s
46
+ [?2026l[?2026h
47
+  src/__tests__/basic-agent.test.ts 1/14
48
+  src/__tests__/property-overrides.test.ts [queued]
49
+  ❯ src/__tests__/state-tools.test.ts [queued]
50
+  ❯ src/__tests__/utils.test.ts [queued]
51
+
52
+  Test Files 0 passed (4)
53
+  Tests 1 passed (14)
54
+  Start at 15:45:20
55
+  Duration 1.69s
56
+ [?2026l[?2026h ✓ src/__tests__/basic-agent.test.ts (14 tests) 16ms
57
+
58
+  ❯ src/__tests__/property-overrides.test.ts 0/21
59
+  ❯ src/__tests__/state-tools.test.ts [queued]
60
+  ❯ src/__tests__/utils.test.ts [queued]
39
61
 
62
+  Test Files 1 passed (4)
63
+  Tests 14 passed (35)
64
+  Start at 15:45:20
65
+  Duration 1.80s
66
+ [?2026l[?2026h ✓ src/__tests__/property-overrides.test.ts (21 tests) 47ms
40
67
 
41
-  ❯ src/__tests__/utils.test.ts 0/27
68
+  ❯ src/__tests__/state-tools.test.ts 0/10
69
+  ❯ src/__tests__/utils.test.ts 1/27
42
70
 
43
-  Test Files 3 passed (4)
44
-  Tests 45 passed (72)
45
-  Start at 10:25:21
46
-  Duration 1.52s
47
- [?2026l ✓ src/__tests__/utils.test.ts (27 tests) 6ms
71
+  Test Files 2 passed (4)
72
+  Tests 36 passed (72)
73
+  Start at 15:45:20
74
+  Duration 1.90s
75
+ [?2026l ✓ src/__tests__/utils.test.ts (27 tests) 9ms
76
+ ✓ src/__tests__/state-tools.test.ts (10 tests) 13ms
48
77
 
49
78
   Test Files  4 passed (4)
50
79
   Tests  72 passed (72)
51
-  Start at  10:25:21
52
-  Duration  1.62s (transform 252ms, setup 0ms, collect 4.44s, tests 69ms, environment 0ms, prepare 712ms)
80
+  Start at  15:45:20
81
+  Duration  2.09s (transform 922ms, setup 0ms, collect 5.13s, tests 84ms, environment 1ms, prepare 669ms)
53
82
 
54
83
  [?25h
package/dist/index.d.mts CHANGED
@@ -68,18 +68,21 @@ interface ToolDefinition<TParameters extends z.ZodTypeAny = z.ZodTypeAny> {
68
68
  name: string;
69
69
  description: string;
70
70
  parameters: TParameters;
71
+ execute: (args: z.infer<TParameters>) => Promise<unknown>;
71
72
  }
72
73
  /**
73
74
  * Define a tool for use with BasicAgent
74
75
  * @param name - The name of the tool
75
76
  * @param description - Description of what the tool does
76
77
  * @param parameters - Zod schema for the tool's input parameters
78
+ * @param execute - Function to execute the tool server-side
77
79
  * @returns Tool definition
78
80
  */
79
81
  declare function defineTool<TParameters extends z.ZodTypeAny>(config: {
80
82
  name: string;
81
83
  description: string;
82
84
  parameters: TParameters;
85
+ execute: (args: z.infer<TParameters>) => Promise<unknown>;
83
86
  }): ToolDefinition<TParameters>;
84
87
  /**
85
88
  * Converts AG-UI messages to Vercel AI SDK ModelMessage format
package/dist/index.d.ts CHANGED
@@ -68,18 +68,21 @@ interface ToolDefinition<TParameters extends z.ZodTypeAny = z.ZodTypeAny> {
68
68
  name: string;
69
69
  description: string;
70
70
  parameters: TParameters;
71
+ execute: (args: z.infer<TParameters>) => Promise<unknown>;
71
72
  }
72
73
  /**
73
74
  * Define a tool for use with BasicAgent
74
75
  * @param name - The name of the tool
75
76
  * @param description - Description of what the tool does
76
77
  * @param parameters - Zod schema for the tool's input parameters
78
+ * @param execute - Function to execute the tool server-side
77
79
  * @returns Tool definition
78
80
  */
79
81
  declare function defineTool<TParameters extends z.ZodTypeAny>(config: {
80
82
  name: string;
81
83
  description: string;
82
84
  parameters: TParameters;
85
+ execute: (args: z.infer<TParameters>) => Promise<unknown>;
83
86
  }): ToolDefinition<TParameters>;
84
87
  /**
85
88
  * Converts AG-UI messages to Vercel AI SDK ModelMessage format
package/dist/index.js CHANGED
@@ -89,7 +89,8 @@ function defineTool(config) {
89
89
  return {
90
90
  name: config.name,
91
91
  description: config.description,
92
- parameters: config.parameters
92
+ parameters: config.parameters,
93
+ execute: config.execute
93
94
  };
94
95
  }
95
96
  function flattenUserMessageContent(content) {
@@ -215,7 +216,8 @@ function convertToolDefinitionsToVercelAITools(tools) {
215
216
  for (const tool of tools) {
216
217
  result[tool.name] = (0, import_ai.tool)({
217
218
  description: tool.description,
218
- inputSchema: tool.parameters
219
+ inputSchema: tool.parameters,
220
+ execute: tool.execute
219
221
  });
220
222
  }
221
223
  return result;
@@ -288,6 +290,7 @@ ${JSON.stringify(input.state, null, 2)}
288
290
  messages,
289
291
  tools: allTools,
290
292
  toolChoice: this.config.toolChoice,
293
+ stopWhen: this.config.maxSteps ? (0, import_ai.stepCountIs)(this.config.maxSteps) : void 0,
291
294
  maxOutputTokens: this.config.maxOutputTokens,
292
295
  temperature: this.config.temperature,
293
296
  topP: this.config.topP,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n AbstractAgent,\n BaseEvent,\n RunAgentInput,\n EventType,\n Message,\n RunFinishedEvent,\n RunStartedEvent,\n TextMessageChunkEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ToolCallResultEvent,\n RunErrorEvent,\n StateSnapshotEvent,\n StateDeltaEvent,\n} from \"@ag-ui/client\";\nimport {\n streamText,\n LanguageModel,\n ModelMessage,\n AssistantModelMessage,\n UserModelMessage,\n ToolModelMessage,\n ToolCallPart,\n ToolResultPart,\n TextPart,\n tool as createVercelAISDKTool,\n ToolChoice,\n ToolSet,\n} from \"ai\";\nimport { experimental_createMCPClient as createMCPClient } from \"@ai-sdk/mcp\";\nimport { Observable } from \"rxjs\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { randomUUID } from \"crypto\";\nimport { z } from \"zod\";\nimport {\n StreamableHTTPClientTransport,\n StreamableHTTPClientTransportOptions,\n} from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { u } from \"vitest/dist/chunks/reporters.d.BFLkQcL6.js\";\n\n/**\n * Properties that can be overridden by forwardedProps\n * These match the exact parameter names in streamText\n */\nexport type OverridableProperty =\n | \"model\"\n | \"toolChoice\"\n | \"maxOutputTokens\"\n | \"temperature\"\n | \"topP\"\n | \"topK\"\n | \"presencePenalty\"\n | \"frequencyPenalty\"\n | \"stopSequences\"\n | \"seed\"\n | \"maxRetries\"\n | \"prompt\";\n\n/**\n * Supported model identifiers for BasicAgent\n */\nexport type BasicAgentModel =\n // OpenAI models\n | \"openai/gpt-5\"\n | \"openai/gpt-5-mini\"\n | \"openai/gpt-4.1\"\n | \"openai/gpt-4.1-mini\"\n | \"openai/gpt-4.1-nano\"\n | \"openai/gpt-4o\"\n | \"openai/gpt-4o-mini\"\n // OpenAI reasoning series\n | \"openai/o3\"\n | \"openai/o3-mini\"\n | \"openai/o4-mini\"\n // Anthropic (Claude) models\n | \"anthropic/claude-sonnet-4.5\"\n | \"anthropic/claude-sonnet-4\"\n | \"anthropic/claude-3.7-sonnet\"\n | \"anthropic/claude-opus-4.1\"\n | \"anthropic/claude-opus-4\"\n | \"anthropic/claude-3.5-haiku\"\n // Google (Gemini) models\n | \"google/gemini-2.5-pro\"\n | \"google/gemini-2.5-flash\"\n | \"google/gemini-2.5-flash-lite\"\n // Allow any LanguageModel instance\n | (string & {});\n\n/**\n * Model specifier - can be a string like \"openai/gpt-4o\" or a LanguageModel instance\n */\nexport type ModelSpecifier = string | LanguageModel;\n\n/**\n * MCP Client configuration for HTTP transport\n */\nexport interface MCPClientConfigHTTP {\n /**\n * Type of MCP client\n */\n type: \"http\";\n /**\n * URL of the MCP server\n */\n url: string;\n /**\n * Optional transport options for HTTP client\n */\n options?: StreamableHTTPClientTransportOptions;\n}\n\n/**\n * MCP Client configuration for SSE transport\n */\nexport interface MCPClientConfigSSE {\n /**\n * Type of MCP client\n */\n type: \"sse\";\n /**\n * URL of the MCP server\n */\n url: string;\n /**\n * Optional HTTP headers (e.g., for authentication)\n */\n headers?: Record<string, string>;\n}\n\n/**\n * MCP Client configuration\n */\nexport type MCPClientConfig = MCPClientConfigHTTP | MCPClientConfigSSE;\n\n/**\n * Resolves a model specifier to a LanguageModel instance\n * @param spec - Model string (e.g., \"openai/gpt-4o\") or LanguageModel instance\n * @returns LanguageModel instance\n */\nexport function resolveModel(spec: ModelSpecifier): LanguageModel {\n // If already a LanguageModel instance, pass through\n if (typeof spec !== \"string\") {\n return spec;\n }\n\n // Normalize \"provider/model\" or \"provider:model\" format\n const normalized = spec.replace(\"/\", \":\").trim();\n const parts = normalized.split(\":\");\n const rawProvider = parts[0];\n const rest = parts.slice(1);\n\n if (!rawProvider) {\n throw new Error(\n `Invalid model string \"${spec}\". Use \"openai/gpt-5\", \"anthropic/claude-sonnet-4.5\", or \"google/gemini-2.5-pro\".`,\n );\n }\n\n const provider = rawProvider.toLowerCase();\n const model = rest.join(\":\").trim();\n\n if (!model) {\n throw new Error(\n `Invalid model string \"${spec}\". Use \"openai/gpt-5\", \"anthropic/claude-sonnet-4.5\", or \"google/gemini-2.5-pro\".`,\n );\n }\n\n switch (provider) {\n case \"openai\": {\n // Lazily create OpenAI provider\n const openai = createOpenAI({\n apiKey: process.env.OPENAI_API_KEY!,\n });\n // Accepts any OpenAI model id, e.g. \"gpt-4o\", \"gpt-4.1-mini\", \"o3-mini\"\n return openai(model);\n }\n\n case \"anthropic\": {\n // Lazily create Anthropic provider\n const anthropic = createAnthropic({\n apiKey: process.env.ANTHROPIC_API_KEY!,\n });\n // Accepts any Claude id, e.g. \"claude-3.7-sonnet\", \"claude-3.5-haiku\"\n return anthropic(model);\n }\n\n case \"google\":\n case \"gemini\":\n case \"google-gemini\": {\n // Lazily create Google provider\n const google = createGoogleGenerativeAI({\n apiKey: process.env.GOOGLE_API_KEY!,\n });\n // Accepts any Gemini id, e.g. \"gemini-2.5-pro\", \"gemini-2.5-flash\"\n return google(model);\n }\n\n default:\n throw new Error(`Unknown provider \"${provider}\" in \"${spec}\". Supported: openai, anthropic, google (gemini).`);\n }\n}\n\n/**\n * Tool definition for BasicAgent\n */\nexport interface ToolDefinition<TParameters extends z.ZodTypeAny = z.ZodTypeAny> {\n name: string;\n description: string;\n parameters: TParameters;\n}\n\n/**\n * Define a tool for use with BasicAgent\n * @param name - The name of the tool\n * @param description - Description of what the tool does\n * @param parameters - Zod schema for the tool's input parameters\n * @returns Tool definition\n */\nexport function defineTool<TParameters extends z.ZodTypeAny>(config: {\n name: string;\n description: string;\n parameters: TParameters;\n}): ToolDefinition<TParameters> {\n return {\n name: config.name,\n description: config.description,\n parameters: config.parameters,\n };\n}\n\ntype AGUIUserMessage = Extract<Message, { role: \"user\" }>;\n\nfunction flattenUserMessageContent(content?: AGUIUserMessage[\"content\"]): string {\n if (!content) {\n return \"\";\n }\n\n if (typeof content === \"string\") {\n return content;\n }\n\n return content\n .map((part) => {\n if (\n part &&\n typeof part === \"object\" &&\n \"type\" in part &&\n (part as { type?: unknown }).type === \"text\" &&\n typeof (part as { text?: unknown }).text === \"string\"\n ) {\n return (part as { text: string }).text;\n }\n return \"\";\n })\n .filter((text) => text.length > 0)\n .join(\"\\n\");\n}\n\n/**\n * Converts AG-UI messages to Vercel AI SDK ModelMessage format\n */\nexport function convertMessagesToVercelAISDKMessages(messages: Message[]): ModelMessage[] {\n const result: ModelMessage[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\") {\n const parts: Array<TextPart | ToolCallPart> = message.content ? [{ type: \"text\", text: message.content }] : [];\n\n for (const toolCall of message.toolCalls ?? []) {\n const toolCallPart: ToolCallPart = {\n type: \"tool-call\",\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments),\n };\n parts.push(toolCallPart);\n }\n\n const assistantMsg: AssistantModelMessage = {\n role: \"assistant\",\n content: parts,\n };\n result.push(assistantMsg);\n } else if (message.role === \"user\") {\n const userMsg: UserModelMessage = {\n role: \"user\",\n content: flattenUserMessageContent(message.content),\n };\n result.push(userMsg);\n } else if (message.role === \"tool\") {\n let toolName = \"unknown\";\n // Find the tool name from the corresponding tool call\n for (const msg of messages) {\n if (msg.role === \"assistant\") {\n for (const toolCall of msg.toolCalls ?? []) {\n if (toolCall.id === message.toolCallId) {\n toolName = toolCall.function.name;\n break;\n }\n }\n }\n }\n\n const toolResultPart: ToolResultPart = {\n type: \"tool-result\",\n toolCallId: message.toolCallId,\n toolName: toolName,\n output: {\n type: \"text\",\n value: message.content,\n },\n };\n\n const toolMsg: ToolModelMessage = {\n role: \"tool\",\n content: [toolResultPart],\n };\n result.push(toolMsg);\n }\n }\n\n return result;\n}\n\n/**\n * JSON Schema type definition\n */\ninterface JsonSchema {\n type: \"object\" | \"string\" | \"number\" | \"boolean\" | \"array\";\n description?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n items?: JsonSchema;\n}\n\n/**\n * Converts JSON Schema to Zod schema\n */\nexport function convertJsonSchemaToZodSchema(jsonSchema: JsonSchema, required: boolean): z.ZodSchema {\n if (jsonSchema.type === \"object\") {\n const spec: { [key: string]: z.ZodSchema } = {};\n\n if (!jsonSchema.properties || !Object.keys(jsonSchema.properties).length) {\n return !required ? z.object(spec).optional() : z.object(spec);\n }\n\n for (const [key, value] of Object.entries(jsonSchema.properties)) {\n spec[key] = convertJsonSchemaToZodSchema(value, jsonSchema.required ? jsonSchema.required.includes(key) : false);\n }\n let schema = z.object(spec).describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"string\") {\n let schema = z.string().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"number\") {\n let schema = z.number().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"boolean\") {\n let schema = z.boolean().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"array\") {\n if (!jsonSchema.items) {\n throw new Error(\"Array type must have items property\");\n }\n let itemSchema = convertJsonSchemaToZodSchema(jsonSchema.items, true);\n let schema = z.array(itemSchema).describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n }\n throw new Error(\"Invalid JSON schema\");\n}\n\n/**\n * Converts AG-UI tools to Vercel AI SDK ToolSet\n */\nfunction isJsonSchema(obj: unknown): obj is JsonSchema {\n if (typeof obj !== \"object\" || obj === null) return false;\n const schema = obj as Record<string, unknown>;\n return typeof schema.type === \"string\" && [\"object\", \"string\", \"number\", \"boolean\", \"array\"].includes(schema.type);\n}\n\nexport function convertToolsToVercelAITools(tools: RunAgentInput[\"tools\"]): ToolSet {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: Record<string, any> = {};\n\n for (const tool of tools) {\n if (!isJsonSchema(tool.parameters)) {\n throw new Error(`Invalid JSON schema for tool ${tool.name}`);\n }\n const zodSchema = convertJsonSchemaToZodSchema(tool.parameters, true);\n result[tool.name] = createVercelAISDKTool({\n description: tool.description,\n inputSchema: zodSchema,\n });\n }\n\n return result;\n}\n\n/**\n * Converts ToolDefinition array to Vercel AI SDK ToolSet\n */\nexport function convertToolDefinitionsToVercelAITools(tools: ToolDefinition[]): ToolSet {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: Record<string, any> = {};\n\n for (const tool of tools) {\n result[tool.name] = createVercelAISDKTool({\n description: tool.description,\n inputSchema: tool.parameters,\n });\n }\n\n return result;\n}\n\n/**\n * Configuration for BasicAgent\n */\nexport interface BasicAgentConfiguration {\n /**\n * The model to use\n */\n model: BasicAgentModel | LanguageModel;\n /**\n * Maximum number of steps/iterations for tool calling (default: 1)\n */\n maxSteps?: number;\n /**\n * Tool choice setting - how tools are selected for execution (default: \"auto\")\n */\n toolChoice?: ToolChoice<Record<string, unknown>>;\n /**\n * Maximum number of tokens to generate\n */\n maxOutputTokens?: number;\n /**\n * Temperature setting (range depends on provider)\n */\n temperature?: number;\n /**\n * Nucleus sampling (topP)\n */\n topP?: number;\n /**\n * Top K sampling\n */\n topK?: number;\n /**\n * Presence penalty\n */\n presencePenalty?: number;\n /**\n * Frequency penalty\n */\n frequencyPenalty?: number;\n /**\n * Sequences that will stop the generation\n */\n stopSequences?: string[];\n /**\n * Seed for deterministic results\n */\n seed?: number;\n /**\n * Maximum number of retries\n */\n maxRetries?: number;\n /**\n * Prompt for the agent\n */\n prompt?: string;\n /**\n * List of properties that can be overridden by forwardedProps.\n */\n overridableProperties?: OverridableProperty[];\n /**\n * Optional list of MCP server configurations\n */\n mcpServers?: MCPClientConfig[];\n /**\n * Optional tools available to the agent\n */\n tools?: ToolDefinition[];\n}\n\nexport class BasicAgent extends AbstractAgent {\n private abortController?: AbortController;\n\n constructor(private config: BasicAgentConfiguration) {\n super();\n }\n\n /**\n * Check if a property can be overridden by forwardedProps\n */\n canOverride(property: OverridableProperty): boolean {\n return this.config?.overridableProperties?.includes(property) ?? false;\n }\n\n run(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((subscriber) => {\n // Emit RUN_STARTED event\n const startEvent: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(startEvent);\n\n // Resolve the model\n const model = resolveModel(this.config.model);\n\n // Build prompt based on conditions\n let systemPrompt: string | undefined = undefined;\n\n // Check if we should build a prompt:\n // - config.prompt is set, OR\n // - input.context is non-empty, OR\n // - input.state is non-empty and not an empty object\n const hasPrompt = !!this.config.prompt;\n const hasContext = input.context && input.context.length > 0;\n const hasState =\n input.state !== undefined &&\n input.state !== null &&\n !(typeof input.state === \"object\" && Object.keys(input.state).length === 0);\n\n if (hasPrompt || hasContext || hasState) {\n const parts: string[] = [];\n\n // First: the prompt if any\n if (hasPrompt) {\n parts.push(this.config.prompt!);\n }\n\n // Second: context from the application\n if (hasContext) {\n parts.push(\"\\n## Context from the application\\n\");\n for (const ctx of input.context) {\n parts.push(`${ctx.description}:\\n${ctx.value}\\n`);\n }\n }\n\n // Third: state from the application that can be edited\n if (hasState) {\n parts.push(\n \"\\n## Application State\\n\" +\n \"This is state from the application that you can edit by calling AGUISendStateSnapshot or AGUISendStateDelta.\\n\" +\n `\\`\\`\\`json\\n${JSON.stringify(input.state, null, 2)}\\n\\`\\`\\`\\n`,\n );\n }\n\n systemPrompt = parts.join(\"\");\n }\n\n // Convert messages and prepend system message if we have a prompt\n const messages = convertMessagesToVercelAISDKMessages(input.messages);\n if (systemPrompt) {\n messages.unshift({\n role: \"system\",\n content: systemPrompt,\n });\n }\n\n // Merge tools from input and config\n let allTools: ToolSet = convertToolsToVercelAITools(input.tools);\n if (this.config.tools && this.config.tools.length > 0) {\n const configTools = convertToolDefinitionsToVercelAITools(this.config.tools);\n allTools = { ...allTools, ...configTools };\n }\n\n const streamTextParams: Parameters<typeof streamText>[0] = {\n model,\n messages,\n tools: allTools,\n toolChoice: this.config.toolChoice,\n maxOutputTokens: this.config.maxOutputTokens,\n temperature: this.config.temperature,\n topP: this.config.topP,\n topK: this.config.topK,\n presencePenalty: this.config.presencePenalty,\n frequencyPenalty: this.config.frequencyPenalty,\n stopSequences: this.config.stopSequences,\n seed: this.config.seed,\n maxRetries: this.config.maxRetries,\n };\n\n // Apply forwardedProps overrides (if allowed)\n if (input.forwardedProps && typeof input.forwardedProps === \"object\") {\n const props = input.forwardedProps as Record<string, unknown>;\n\n // Check and apply each overridable property\n if (props.model !== undefined && this.canOverride(\"model\")) {\n if (typeof props.model === \"string\" || typeof props.model === \"object\") {\n // Accept any string or LanguageModel instance for model override\n streamTextParams.model = resolveModel(props.model as string | LanguageModel);\n }\n }\n if (props.toolChoice !== undefined && this.canOverride(\"toolChoice\")) {\n // ToolChoice can be 'auto', 'required', 'none', or { type: 'tool', toolName: string }\n const toolChoice = props.toolChoice;\n if (\n toolChoice === \"auto\" ||\n toolChoice === \"required\" ||\n toolChoice === \"none\" ||\n (typeof toolChoice === \"object\" &&\n toolChoice !== null &&\n \"type\" in toolChoice &&\n toolChoice.type === \"tool\")\n ) {\n streamTextParams.toolChoice = toolChoice as ToolChoice<Record<string, unknown>>;\n }\n }\n if (typeof props.maxOutputTokens === \"number\" && this.canOverride(\"maxOutputTokens\")) {\n streamTextParams.maxOutputTokens = props.maxOutputTokens;\n }\n if (typeof props.temperature === \"number\" && this.canOverride(\"temperature\")) {\n streamTextParams.temperature = props.temperature;\n }\n if (typeof props.topP === \"number\" && this.canOverride(\"topP\")) {\n streamTextParams.topP = props.topP;\n }\n if (typeof props.topK === \"number\" && this.canOverride(\"topK\")) {\n streamTextParams.topK = props.topK;\n }\n if (typeof props.presencePenalty === \"number\" && this.canOverride(\"presencePenalty\")) {\n streamTextParams.presencePenalty = props.presencePenalty;\n }\n if (typeof props.frequencyPenalty === \"number\" && this.canOverride(\"frequencyPenalty\")) {\n streamTextParams.frequencyPenalty = props.frequencyPenalty;\n }\n if (Array.isArray(props.stopSequences) && this.canOverride(\"stopSequences\")) {\n // Validate all elements are strings\n if (props.stopSequences.every((item): item is string => typeof item === \"string\")) {\n streamTextParams.stopSequences = props.stopSequences;\n }\n }\n if (typeof props.seed === \"number\" && this.canOverride(\"seed\")) {\n streamTextParams.seed = props.seed;\n }\n if (typeof props.maxRetries === \"number\" && this.canOverride(\"maxRetries\")) {\n streamTextParams.maxRetries = props.maxRetries;\n }\n }\n\n // Set up MCP clients if configured and process the stream\n const mcpClients: Array<{ close: () => Promise<void> }> = [];\n\n (async () => {\n const abortController = new AbortController();\n this.abortController = abortController;\n let terminalEventEmitted = false;\n\n try {\n // Add AG-UI state update tools\n streamTextParams.tools = {\n ...streamTextParams.tools,\n AGUISendStateSnapshot: createVercelAISDKTool({\n description: \"Replace the entire application state with a new snapshot\",\n inputSchema: z.object({\n snapshot: z.any().describe(\"The complete new state object\"),\n }),\n execute: async ({ snapshot }) => {\n return { success: true, snapshot };\n },\n }),\n AGUISendStateDelta: createVercelAISDKTool({\n description: \"Apply incremental updates to application state using JSON Patch operations\",\n inputSchema: z.object({\n delta: z\n .array(\n z.object({\n op: z.enum([\"add\", \"replace\", \"remove\"]).describe(\"The operation to perform\"),\n path: z.string().describe(\"JSON Pointer path (e.g., '/foo/bar')\"),\n value: z\n .any()\n .optional()\n .describe(\n \"The value to set. Required for 'add' and 'replace' operations, ignored for 'remove'.\",\n ),\n }),\n )\n .describe(\"Array of JSON Patch operations\"),\n }),\n execute: async ({ delta }) => {\n return { success: true, delta };\n },\n }),\n };\n\n // Initialize MCP clients and get their tools\n if (this.config.mcpServers && this.config.mcpServers.length > 0) {\n for (const serverConfig of this.config.mcpServers) {\n let transport;\n\n if (serverConfig.type === \"http\") {\n const url = new URL(serverConfig.url);\n transport = new StreamableHTTPClientTransport(url, serverConfig.options);\n } else if (serverConfig.type === \"sse\") {\n transport = new SSEClientTransport(new URL(serverConfig.url), serverConfig.headers);\n }\n\n if (transport) {\n const mcpClient = await createMCPClient({ transport });\n mcpClients.push(mcpClient);\n\n // Get tools from this MCP server and merge with existing tools\n const mcpTools = await mcpClient.tools();\n streamTextParams.tools = { ...streamTextParams.tools, ...mcpTools };\n }\n }\n }\n\n // Call streamText and process the stream\n const response = streamText({ ...streamTextParams, abortSignal: abortController.signal });\n\n let messageId = randomUUID();\n\n const toolCallStates = new Map<\n string,\n {\n started: boolean;\n hasArgsDelta: boolean;\n ended: boolean;\n toolName?: string;\n }\n >();\n\n const ensureToolCallState = (toolCallId: string) => {\n let state = toolCallStates.get(toolCallId);\n if (!state) {\n state = { started: false, hasArgsDelta: false, ended: false };\n toolCallStates.set(toolCallId, state);\n }\n return state;\n };\n\n // Process fullStream events\n for await (const part of response.fullStream) {\n switch (part.type) {\n case \"tool-input-start\": {\n const toolCallId = part.id;\n const state = ensureToolCallState(toolCallId);\n state.toolName = part.toolName;\n if (!state.started) {\n state.started = true;\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n parentMessageId: messageId,\n toolCallId,\n toolCallName: part.toolName,\n };\n subscriber.next(startEvent);\n }\n break;\n }\n\n case \"tool-input-delta\": {\n const toolCallId = part.id;\n const state = ensureToolCallState(toolCallId);\n state.hasArgsDelta = true;\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: part.delta,\n };\n subscriber.next(argsEvent);\n break;\n }\n\n case \"tool-input-end\": {\n // No direct event – the subsequent \"tool-call\" part marks completion.\n break;\n }\n\n case \"text-delta\": {\n // Accumulate text content - in AI SDK 5.0, the property is 'text'\n const textDelta = \"text\" in part ? part.text : \"\";\n // Emit text chunk event\n const textEvent: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n role: \"assistant\",\n messageId,\n delta: textDelta,\n };\n subscriber.next(textEvent);\n break;\n }\n\n case \"tool-call\": {\n const toolCallId = part.toolCallId;\n const state = ensureToolCallState(toolCallId);\n state.toolName = part.toolName ?? state.toolName;\n\n if (!state.started) {\n state.started = true;\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n parentMessageId: messageId,\n toolCallId,\n toolCallName: part.toolName,\n };\n subscriber.next(startEvent);\n }\n\n if (!state.hasArgsDelta && \"input\" in part && part.input !== undefined) {\n let serializedInput = \"\";\n if (typeof part.input === \"string\") {\n serializedInput = part.input;\n } else {\n try {\n serializedInput = JSON.stringify(part.input);\n } catch {\n serializedInput = String(part.input);\n }\n }\n\n if (serializedInput.length > 0) {\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: serializedInput,\n };\n subscriber.next(argsEvent);\n state.hasArgsDelta = true;\n }\n }\n\n if (!state.ended) {\n state.ended = true;\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId,\n };\n subscriber.next(endEvent);\n }\n break;\n }\n\n case \"tool-result\": {\n const toolResult = \"output\" in part ? part.output : null;\n const toolName = \"toolName\" in part ? part.toolName : \"\";\n toolCallStates.delete(part.toolCallId);\n\n // Check if this is a state update tool\n if (toolName === \"AGUISendStateSnapshot\" && toolResult && typeof toolResult === \"object\") {\n // Emit StateSnapshotEvent\n const stateSnapshotEvent: StateSnapshotEvent = {\n type: EventType.STATE_SNAPSHOT,\n snapshot: toolResult.snapshot,\n };\n subscriber.next(stateSnapshotEvent);\n } else if (toolName === \"AGUISendStateDelta\" && toolResult && typeof toolResult === \"object\") {\n // Emit StateDeltaEvent\n const stateDeltaEvent: StateDeltaEvent = {\n type: EventType.STATE_DELTA,\n delta: toolResult.delta,\n };\n subscriber.next(stateDeltaEvent);\n }\n\n // Always emit the tool result event for the LLM\n const resultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n role: \"tool\",\n messageId: randomUUID(),\n toolCallId: part.toolCallId,\n content: JSON.stringify(toolResult),\n };\n subscriber.next(resultEvent);\n break;\n }\n\n case \"finish\":\n // Emit run finished event\n const finishedEvent: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finishedEvent);\n terminalEventEmitted = true;\n\n // Complete the observable\n subscriber.complete();\n break;\n\n case \"error\": {\n if (abortController.signal.aborted) {\n break;\n }\n const runErrorEvent: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: part.error + \"\",\n };\n subscriber.next(runErrorEvent);\n terminalEventEmitted = true;\n\n // Handle error\n subscriber.error(part.error);\n break;\n }\n }\n }\n\n if (!terminalEventEmitted) {\n if (abortController.signal.aborted) {\n // Let the runner finalize the stream on stop requests so it can\n // inject consistent closing events and a RUN_FINISHED marker.\n } else {\n const finishedEvent: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finishedEvent);\n }\n\n terminalEventEmitted = true;\n subscriber.complete();\n }\n } catch (error) {\n if (abortController.signal.aborted) {\n subscriber.complete();\n } else {\n const runErrorEvent: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: error + \"\",\n };\n subscriber.next(runErrorEvent);\n terminalEventEmitted = true;\n subscriber.error(error);\n }\n } finally {\n this.abortController = undefined;\n await Promise.all(mcpClients.map((client) => client.close()));\n }\n })();\n\n // Cleanup function\n return () => {\n // Cleanup MCP clients if stream is unsubscribed\n Promise.all(mcpClients.map((client) => client.close())).catch(() => {\n // Ignore cleanup errors\n });\n };\n });\n }\n\n clone() {\n return new BasicAgent(this.config);\n }\n\n abortRun(): void {\n this.abortController?.abort();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAgBO;AACP,gBAaO;AACP,iBAAgE;AAChE,kBAA2B;AAC3B,oBAA6B;AAC7B,uBAAgC;AAChC,oBAAyC;AACzC,oBAA2B;AAC3B,iBAAkB;AAClB,4BAGO;AACP,iBAAmC;AAsG5B,SAAS,aAAa,MAAqC;AAEhE,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,KAAK,QAAQ,KAAK,GAAG,EAAE,KAAK;AAC/C,QAAM,QAAQ,WAAW,MAAM,GAAG;AAClC,QAAM,cAAc,MAAM,CAAC;AAC3B,QAAM,OAAO,MAAM,MAAM,CAAC;AAE1B,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI;AAAA,MACR,yBAAyB,IAAI;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,WAAW,YAAY,YAAY;AACzC,QAAM,QAAQ,KAAK,KAAK,GAAG,EAAE,KAAK;AAElC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,yBAAyB,IAAI;AAAA,IAC/B;AAAA,EACF;AAEA,UAAQ,UAAU;AAAA,IAChB,KAAK,UAAU;AAEb,YAAM,aAAS,4BAAa;AAAA,QAC1B,QAAQ,QAAQ,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,IAEA,KAAK,aAAa;AAEhB,YAAM,gBAAY,kCAAgB;AAAA,QAChC,QAAQ,QAAQ,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,UAAU,KAAK;AAAA,IACxB;AAAA,IAEA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,iBAAiB;AAEpB,YAAM,aAAS,wCAAyB;AAAA,QACtC,QAAQ,QAAQ,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,KAAK;AAAA,IACrB;AAAA,IAEA;AACE,YAAM,IAAI,MAAM,qBAAqB,QAAQ,SAAS,IAAI,mDAAmD;AAAA,EACjH;AACF;AAkBO,SAAS,WAA6C,QAI7B;AAC9B,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,IACpB,YAAY,OAAO;AAAA,EACrB;AACF;AAIA,SAAS,0BAA0B,SAA8C;AAC/E,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO,QACJ,IAAI,CAAC,SAAS;AACb,QACE,QACA,OAAO,SAAS,YAChB,UAAU,QACT,KAA4B,SAAS,UACtC,OAAQ,KAA4B,SAAS,UAC7C;AACA,aAAQ,KAA0B;AAAA,IACpC;AACA,WAAO;AAAA,EACT,CAAC,EACA,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAChC,KAAK,IAAI;AACd;AAKO,SAAS,qCAAqC,UAAqC;AACxF,QAAM,SAAyB,CAAC;AAEhC,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,aAAa;AAChC,YAAM,QAAwC,QAAQ,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,CAAC,IAAI,CAAC;AAE7G,iBAAW,YAAY,QAAQ,aAAa,CAAC,GAAG;AAC9C,cAAM,eAA6B;AAAA,UACjC,MAAM;AAAA,UACN,YAAY,SAAS;AAAA,UACrB,UAAU,SAAS,SAAS;AAAA,UAC5B,OAAO,KAAK,MAAM,SAAS,SAAS,SAAS;AAAA,QAC/C;AACA,cAAM,KAAK,YAAY;AAAA,MACzB;AAEA,YAAM,eAAsC;AAAA,QAC1C,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AACA,aAAO,KAAK,YAAY;AAAA,IAC1B,WAAW,QAAQ,SAAS,QAAQ;AAClC,YAAM,UAA4B;AAAA,QAChC,MAAM;AAAA,QACN,SAAS,0BAA0B,QAAQ,OAAO;AAAA,MACpD;AACA,aAAO,KAAK,OAAO;AAAA,IACrB,WAAW,QAAQ,SAAS,QAAQ;AAClC,UAAI,WAAW;AAEf,iBAAW,OAAO,UAAU;AAC1B,YAAI,IAAI,SAAS,aAAa;AAC5B,qBAAW,YAAY,IAAI,aAAa,CAAC,GAAG;AAC1C,gBAAI,SAAS,OAAO,QAAQ,YAAY;AACtC,yBAAW,SAAS,SAAS;AAC7B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,iBAAiC;AAAA,QACrC,MAAM;AAAA,QACN,YAAY,QAAQ;AAAA,QACpB;AAAA,QACA,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,OAAO,QAAQ;AAAA,QACjB;AAAA,MACF;AAEA,YAAM,UAA4B;AAAA,QAChC,MAAM;AAAA,QACN,SAAS,CAAC,cAAc;AAAA,MAC1B;AACA,aAAO,KAAK,OAAO;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAgBO,SAAS,6BAA6B,YAAwB,UAAgC;AACnG,MAAI,WAAW,SAAS,UAAU;AAChC,UAAM,OAAuC,CAAC;AAE9C,QAAI,CAAC,WAAW,cAAc,CAAC,OAAO,KAAK,WAAW,UAAU,EAAE,QAAQ;AACxE,aAAO,CAAC,WAAW,aAAE,OAAO,IAAI,EAAE,SAAS,IAAI,aAAE,OAAO,IAAI;AAAA,IAC9D;AAEA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,UAAU,GAAG;AAChE,WAAK,GAAG,IAAI,6BAA6B,OAAO,WAAW,WAAW,WAAW,SAAS,SAAS,GAAG,IAAI,KAAK;AAAA,IACjH;AACA,QAAI,SAAS,aAAE,OAAO,IAAI,EAAE,SAAS,WAAW,eAAe,EAAE;AACjE,WAAO,WAAW,SAAS,OAAO,SAAS;AAAA,EAC7C,WAAW,WAAW,SAAS,UAAU;AACvC,QAAI,SAAS,aAAE,OAAO,EAAE,SAAS,WAAW,eAAe,EAAE;AAC7D,WAAO,WAAW,SAAS,OAAO,SAAS;AAAA,EAC7C,WAAW,WAAW,SAAS,UAAU;AACvC,QAAI,SAAS,aAAE,OAAO,EAAE,SAAS,WAAW,eAAe,EAAE;AAC7D,WAAO,WAAW,SAAS,OAAO,SAAS;AAAA,EAC7C,WAAW,WAAW,SAAS,WAAW;AACxC,QAAI,SAAS,aAAE,QAAQ,EAAE,SAAS,WAAW,eAAe,EAAE;AAC9D,WAAO,WAAW,SAAS,OAAO,SAAS;AAAA,EAC7C,WAAW,WAAW,SAAS,SAAS;AACtC,QAAI,CAAC,WAAW,OAAO;AACrB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AACA,QAAI,aAAa,6BAA6B,WAAW,OAAO,IAAI;AACpE,QAAI,SAAS,aAAE,MAAM,UAAU,EAAE,SAAS,WAAW,eAAe,EAAE;AACtE,WAAO,WAAW,SAAS,OAAO,SAAS;AAAA,EAC7C;AACA,QAAM,IAAI,MAAM,qBAAqB;AACvC;AAKA,SAAS,aAAa,KAAiC;AACrD,MAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM,QAAO;AACpD,QAAM,SAAS;AACf,SAAO,OAAO,OAAO,SAAS,YAAY,CAAC,UAAU,UAAU,UAAU,WAAW,OAAO,EAAE,SAAS,OAAO,IAAI;AACnH;AAEO,SAAS,4BAA4B,OAAwC;AAElF,QAAM,SAA8B,CAAC;AAErC,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,aAAa,KAAK,UAAU,GAAG;AAClC,YAAM,IAAI,MAAM,gCAAgC,KAAK,IAAI,EAAE;AAAA,IAC7D;AACA,UAAM,YAAY,6BAA6B,KAAK,YAAY,IAAI;AACpE,WAAO,KAAK,IAAI,QAAI,UAAAA,MAAsB;AAAA,MACxC,aAAa,KAAK;AAAA,MAClB,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKO,SAAS,sCAAsC,OAAkC;AAEtF,QAAM,SAA8B,CAAC;AAErC,aAAW,QAAQ,OAAO;AACxB,WAAO,KAAK,IAAI,QAAI,UAAAA,MAAsB;AAAA,MACxC,aAAa,KAAK;AAAA,MAClB,aAAa,KAAK;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAwEO,IAAM,aAAN,MAAM,oBAAmB,4BAAc;AAAA,EAG5C,YAAoB,QAAiC;AACnD,UAAM;AADY;AAAA,EAEpB;AAAA,EAJQ;AAAA;AAAA;AAAA;AAAA,EASR,YAAY,UAAwC;AAClD,WAAO,KAAK,QAAQ,uBAAuB,SAAS,QAAQ,KAAK;AAAA,EACnE;AAAA,EAEA,IAAI,OAA6C;AAC/C,WAAO,IAAI,uBAAsB,CAAC,eAAe;AAE/C,YAAM,aAA8B;AAAA,QAClC,MAAM,wBAAU;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,MACf;AACA,iBAAW,KAAK,UAAU;AAG1B,YAAM,QAAQ,aAAa,KAAK,OAAO,KAAK;AAG5C,UAAI,eAAmC;AAMvC,YAAM,YAAY,CAAC,CAAC,KAAK,OAAO;AAChC,YAAM,aAAa,MAAM,WAAW,MAAM,QAAQ,SAAS;AAC3D,YAAM,WACJ,MAAM,UAAU,UAChB,MAAM,UAAU,QAChB,EAAE,OAAO,MAAM,UAAU,YAAY,OAAO,KAAK,MAAM,KAAK,EAAE,WAAW;AAE3E,UAAI,aAAa,cAAc,UAAU;AACvC,cAAM,QAAkB,CAAC;AAGzB,YAAI,WAAW;AACb,gBAAM,KAAK,KAAK,OAAO,MAAO;AAAA,QAChC;AAGA,YAAI,YAAY;AACd,gBAAM,KAAK,qCAAqC;AAChD,qBAAW,OAAO,MAAM,SAAS;AAC/B,kBAAM,KAAK,GAAG,IAAI,WAAW;AAAA,EAAM,IAAI,KAAK;AAAA,CAAI;AAAA,UAClD;AAAA,QACF;AAGA,YAAI,UAAU;AACZ,gBAAM;AAAA,YACJ;AAAA;AAAA;AAAA;AAAA,EAEiB,KAAK,UAAU,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,UACvD;AAAA,QACF;AAEA,uBAAe,MAAM,KAAK,EAAE;AAAA,MAC9B;AAGA,YAAM,WAAW,qCAAqC,MAAM,QAAQ;AACpE,UAAI,cAAc;AAChB,iBAAS,QAAQ;AAAA,UACf,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAGA,UAAI,WAAoB,4BAA4B,MAAM,KAAK;AAC/D,UAAI,KAAK,OAAO,SAAS,KAAK,OAAO,MAAM,SAAS,GAAG;AACrD,cAAM,cAAc,sCAAsC,KAAK,OAAO,KAAK;AAC3E,mBAAW,EAAE,GAAG,UAAU,GAAG,YAAY;AAAA,MAC3C;AAEA,YAAM,mBAAqD;AAAA,QACzD;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,YAAY,KAAK,OAAO;AAAA,QACxB,iBAAiB,KAAK,OAAO;AAAA,QAC7B,aAAa,KAAK,OAAO;AAAA,QACzB,MAAM,KAAK,OAAO;AAAA,QAClB,MAAM,KAAK,OAAO;AAAA,QAClB,iBAAiB,KAAK,OAAO;AAAA,QAC7B,kBAAkB,KAAK,OAAO;AAAA,QAC9B,eAAe,KAAK,OAAO;AAAA,QAC3B,MAAM,KAAK,OAAO;AAAA,QAClB,YAAY,KAAK,OAAO;AAAA,MAC1B;AAGA,UAAI,MAAM,kBAAkB,OAAO,MAAM,mBAAmB,UAAU;AACpE,cAAM,QAAQ,MAAM;AAGpB,YAAI,MAAM,UAAU,UAAa,KAAK,YAAY,OAAO,GAAG;AAC1D,cAAI,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,UAAU,UAAU;AAEtE,6BAAiB,QAAQ,aAAa,MAAM,KAA+B;AAAA,UAC7E;AAAA,QACF;AACA,YAAI,MAAM,eAAe,UAAa,KAAK,YAAY,YAAY,GAAG;AAEpE,gBAAM,aAAa,MAAM;AACzB,cACE,eAAe,UACf,eAAe,cACf,eAAe,UACd,OAAO,eAAe,YACrB,eAAe,QACf,UAAU,cACV,WAAW,SAAS,QACtB;AACA,6BAAiB,aAAa;AAAA,UAChC;AAAA,QACF;AACA,YAAI,OAAO,MAAM,oBAAoB,YAAY,KAAK,YAAY,iBAAiB,GAAG;AACpF,2BAAiB,kBAAkB,MAAM;AAAA,QAC3C;AACA,YAAI,OAAO,MAAM,gBAAgB,YAAY,KAAK,YAAY,aAAa,GAAG;AAC5E,2BAAiB,cAAc,MAAM;AAAA,QACvC;AACA,YAAI,OAAO,MAAM,SAAS,YAAY,KAAK,YAAY,MAAM,GAAG;AAC9D,2BAAiB,OAAO,MAAM;AAAA,QAChC;AACA,YAAI,OAAO,MAAM,SAAS,YAAY,KAAK,YAAY,MAAM,GAAG;AAC9D,2BAAiB,OAAO,MAAM;AAAA,QAChC;AACA,YAAI,OAAO,MAAM,oBAAoB,YAAY,KAAK,YAAY,iBAAiB,GAAG;AACpF,2BAAiB,kBAAkB,MAAM;AAAA,QAC3C;AACA,YAAI,OAAO,MAAM,qBAAqB,YAAY,KAAK,YAAY,kBAAkB,GAAG;AACtF,2BAAiB,mBAAmB,MAAM;AAAA,QAC5C;AACA,YAAI,MAAM,QAAQ,MAAM,aAAa,KAAK,KAAK,YAAY,eAAe,GAAG;AAE3E,cAAI,MAAM,cAAc,MAAM,CAAC,SAAyB,OAAO,SAAS,QAAQ,GAAG;AACjF,6BAAiB,gBAAgB,MAAM;AAAA,UACzC;AAAA,QACF;AACA,YAAI,OAAO,MAAM,SAAS,YAAY,KAAK,YAAY,MAAM,GAAG;AAC9D,2BAAiB,OAAO,MAAM;AAAA,QAChC;AACA,YAAI,OAAO,MAAM,eAAe,YAAY,KAAK,YAAY,YAAY,GAAG;AAC1E,2BAAiB,aAAa,MAAM;AAAA,QACtC;AAAA,MACF;AAGA,YAAM,aAAoD,CAAC;AAE3D,OAAC,YAAY;AACX,cAAM,kBAAkB,IAAI,gBAAgB;AAC5C,aAAK,kBAAkB;AACvB,YAAI,uBAAuB;AAE3B,YAAI;AAEF,2BAAiB,QAAQ;AAAA,YACvB,GAAG,iBAAiB;AAAA,YACpB,2BAAuB,UAAAA,MAAsB;AAAA,cAC3C,aAAa;AAAA,cACb,aAAa,aAAE,OAAO;AAAA,gBACpB,UAAU,aAAE,IAAI,EAAE,SAAS,+BAA+B;AAAA,cAC5D,CAAC;AAAA,cACD,SAAS,OAAO,EAAE,SAAS,MAAM;AAC/B,uBAAO,EAAE,SAAS,MAAM,SAAS;AAAA,cACnC;AAAA,YACF,CAAC;AAAA,YACD,wBAAoB,UAAAA,MAAsB;AAAA,cACxC,aAAa;AAAA,cACb,aAAa,aAAE,OAAO;AAAA,gBACpB,OAAO,aACJ;AAAA,kBACC,aAAE,OAAO;AAAA,oBACP,IAAI,aAAE,KAAK,CAAC,OAAO,WAAW,QAAQ,CAAC,EAAE,SAAS,0BAA0B;AAAA,oBAC5E,MAAM,aAAE,OAAO,EAAE,SAAS,sCAAsC;AAAA,oBAChE,OAAO,aACJ,IAAI,EACJ,SAAS,EACT;AAAA,sBACC;AAAA,oBACF;AAAA,kBACJ,CAAC;AAAA,gBACH,EACC,SAAS,gCAAgC;AAAA,cAC9C,CAAC;AAAA,cACD,SAAS,OAAO,EAAE,MAAM,MAAM;AAC5B,uBAAO,EAAE,SAAS,MAAM,MAAM;AAAA,cAChC;AAAA,YACF,CAAC;AAAA,UACH;AAGA,cAAI,KAAK,OAAO,cAAc,KAAK,OAAO,WAAW,SAAS,GAAG;AAC/D,uBAAW,gBAAgB,KAAK,OAAO,YAAY;AACjD,kBAAI;AAEJ,kBAAI,aAAa,SAAS,QAAQ;AAChC,sBAAM,MAAM,IAAI,IAAI,aAAa,GAAG;AACpC,4BAAY,IAAI,oDAA8B,KAAK,aAAa,OAAO;AAAA,cACzE,WAAW,aAAa,SAAS,OAAO;AACtC,4BAAY,IAAI,8BAAmB,IAAI,IAAI,aAAa,GAAG,GAAG,aAAa,OAAO;AAAA,cACpF;AAEA,kBAAI,WAAW;AACb,sBAAM,YAAY,UAAM,WAAAC,8BAAgB,EAAE,UAAU,CAAC;AACrD,2BAAW,KAAK,SAAS;AAGzB,sBAAM,WAAW,MAAM,UAAU,MAAM;AACvC,iCAAiB,QAAQ,EAAE,GAAG,iBAAiB,OAAO,GAAG,SAAS;AAAA,cACpE;AAAA,YACF;AAAA,UACF;AAGA,gBAAM,eAAW,sBAAW,EAAE,GAAG,kBAAkB,aAAa,gBAAgB,OAAO,CAAC;AAExF,cAAI,gBAAY,0BAAW;AAE3B,gBAAM,iBAAiB,oBAAI,IAQzB;AAEF,gBAAM,sBAAsB,CAAC,eAAuB;AAClD,gBAAI,QAAQ,eAAe,IAAI,UAAU;AACzC,gBAAI,CAAC,OAAO;AACV,sBAAQ,EAAE,SAAS,OAAO,cAAc,OAAO,OAAO,MAAM;AAC5D,6BAAe,IAAI,YAAY,KAAK;AAAA,YACtC;AACA,mBAAO;AAAA,UACT;AAGA,2BAAiB,QAAQ,SAAS,YAAY;AAC5C,oBAAQ,KAAK,MAAM;AAAA,cACjB,KAAK,oBAAoB;AACvB,sBAAM,aAAa,KAAK;AACxB,sBAAM,QAAQ,oBAAoB,UAAU;AAC5C,sBAAM,WAAW,KAAK;AACtB,oBAAI,CAAC,MAAM,SAAS;AAClB,wBAAM,UAAU;AAChB,wBAAMC,cAAiC;AAAA,oBACrC,MAAM,wBAAU;AAAA,oBAChB,iBAAiB;AAAA,oBACjB;AAAA,oBACA,cAAc,KAAK;AAAA,kBACrB;AACA,6BAAW,KAAKA,WAAU;AAAA,gBAC5B;AACA;AAAA,cACF;AAAA,cAEA,KAAK,oBAAoB;AACvB,sBAAM,aAAa,KAAK;AACxB,sBAAM,QAAQ,oBAAoB,UAAU;AAC5C,sBAAM,eAAe;AACrB,sBAAM,YAA+B;AAAA,kBACnC,MAAM,wBAAU;AAAA,kBAChB;AAAA,kBACA,OAAO,KAAK;AAAA,gBACd;AACA,2BAAW,KAAK,SAAS;AACzB;AAAA,cACF;AAAA,cAEA,KAAK,kBAAkB;AAErB;AAAA,cACF;AAAA,cAEA,KAAK,cAAc;AAEjB,sBAAM,YAAY,UAAU,OAAO,KAAK,OAAO;AAE/C,sBAAM,YAAmC;AAAA,kBACvC,MAAM,wBAAU;AAAA,kBAChB,MAAM;AAAA,kBACN;AAAA,kBACA,OAAO;AAAA,gBACT;AACA,2BAAW,KAAK,SAAS;AACzB;AAAA,cACF;AAAA,cAEA,KAAK,aAAa;AAChB,sBAAM,aAAa,KAAK;AACxB,sBAAM,QAAQ,oBAAoB,UAAU;AAC5C,sBAAM,WAAW,KAAK,YAAY,MAAM;AAExC,oBAAI,CAAC,MAAM,SAAS;AAClB,wBAAM,UAAU;AAChB,wBAAMA,cAAiC;AAAA,oBACrC,MAAM,wBAAU;AAAA,oBAChB,iBAAiB;AAAA,oBACjB;AAAA,oBACA,cAAc,KAAK;AAAA,kBACrB;AACA,6BAAW,KAAKA,WAAU;AAAA,gBAC5B;AAEA,oBAAI,CAAC,MAAM,gBAAgB,WAAW,QAAQ,KAAK,UAAU,QAAW;AACtE,sBAAI,kBAAkB;AACtB,sBAAI,OAAO,KAAK,UAAU,UAAU;AAClC,sCAAkB,KAAK;AAAA,kBACzB,OAAO;AACL,wBAAI;AACF,wCAAkB,KAAK,UAAU,KAAK,KAAK;AAAA,oBAC7C,QAAQ;AACN,wCAAkB,OAAO,KAAK,KAAK;AAAA,oBACrC;AAAA,kBACF;AAEA,sBAAI,gBAAgB,SAAS,GAAG;AAC9B,0BAAM,YAA+B;AAAA,sBACnC,MAAM,wBAAU;AAAA,sBAChB;AAAA,sBACA,OAAO;AAAA,oBACT;AACA,+BAAW,KAAK,SAAS;AACzB,0BAAM,eAAe;AAAA,kBACvB;AAAA,gBACF;AAEA,oBAAI,CAAC,MAAM,OAAO;AAChB,wBAAM,QAAQ;AACd,wBAAM,WAA6B;AAAA,oBACjC,MAAM,wBAAU;AAAA,oBAChB;AAAA,kBACF;AACA,6BAAW,KAAK,QAAQ;AAAA,gBAC1B;AACA;AAAA,cACF;AAAA,cAEA,KAAK,eAAe;AAClB,sBAAM,aAAa,YAAY,OAAO,KAAK,SAAS;AACpD,sBAAM,WAAW,cAAc,OAAO,KAAK,WAAW;AACtD,+BAAe,OAAO,KAAK,UAAU;AAGrC,oBAAI,aAAa,2BAA2B,cAAc,OAAO,eAAe,UAAU;AAExF,wBAAM,qBAAyC;AAAA,oBAC7C,MAAM,wBAAU;AAAA,oBAChB,UAAU,WAAW;AAAA,kBACvB;AACA,6BAAW,KAAK,kBAAkB;AAAA,gBACpC,WAAW,aAAa,wBAAwB,cAAc,OAAO,eAAe,UAAU;AAE5F,wBAAM,kBAAmC;AAAA,oBACvC,MAAM,wBAAU;AAAA,oBAChB,OAAO,WAAW;AAAA,kBACpB;AACA,6BAAW,KAAK,eAAe;AAAA,gBACjC;AAGA,sBAAM,cAAmC;AAAA,kBACvC,MAAM,wBAAU;AAAA,kBAChB,MAAM;AAAA,kBACN,eAAW,0BAAW;AAAA,kBACtB,YAAY,KAAK;AAAA,kBACjB,SAAS,KAAK,UAAU,UAAU;AAAA,gBACpC;AACA,2BAAW,KAAK,WAAW;AAC3B;AAAA,cACF;AAAA,cAEA,KAAK;AAEH,sBAAM,gBAAkC;AAAA,kBACtC,MAAM,wBAAU;AAAA,kBAChB,UAAU,MAAM;AAAA,kBAChB,OAAO,MAAM;AAAA,gBACf;AACA,2BAAW,KAAK,aAAa;AAC7B,uCAAuB;AAGvB,2BAAW,SAAS;AACpB;AAAA,cAEF,KAAK,SAAS;AACZ,oBAAI,gBAAgB,OAAO,SAAS;AAClC;AAAA,gBACF;AACA,sBAAM,gBAA+B;AAAA,kBACnC,MAAM,wBAAU;AAAA,kBAChB,SAAS,KAAK,QAAQ;AAAA,gBACxB;AACA,2BAAW,KAAK,aAAa;AAC7B,uCAAuB;AAGvB,2BAAW,MAAM,KAAK,KAAK;AAC3B;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,cAAI,CAAC,sBAAsB;AACzB,gBAAI,gBAAgB,OAAO,SAAS;AAAA,YAGpC,OAAO;AACL,oBAAM,gBAAkC;AAAA,gBACtC,MAAM,wBAAU;AAAA,gBAChB,UAAU,MAAM;AAAA,gBAChB,OAAO,MAAM;AAAA,cACf;AACA,yBAAW,KAAK,aAAa;AAAA,YAC/B;AAEA,mCAAuB;AACvB,uBAAW,SAAS;AAAA,UACtB;AAAA,QACF,SAAS,OAAO;AACd,cAAI,gBAAgB,OAAO,SAAS;AAClC,uBAAW,SAAS;AAAA,UACtB,OAAO;AACL,kBAAM,gBAA+B;AAAA,cACnC,MAAM,wBAAU;AAAA,cAChB,SAAS,QAAQ;AAAA,YACnB;AACA,uBAAW,KAAK,aAAa;AAC7B,mCAAuB;AACvB,uBAAW,MAAM,KAAK;AAAA,UACxB;AAAA,QACF,UAAE;AACA,eAAK,kBAAkB;AACvB,gBAAM,QAAQ,IAAI,WAAW,IAAI,CAAC,WAAW,OAAO,MAAM,CAAC,CAAC;AAAA,QAC9D;AAAA,MACF,GAAG;AAGH,aAAO,MAAM;AAEX,gBAAQ,IAAI,WAAW,IAAI,CAAC,WAAW,OAAO,MAAM,CAAC,CAAC,EAAE,MAAM,MAAM;AAAA,QAEpE,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ;AACN,WAAO,IAAI,YAAW,KAAK,MAAM;AAAA,EACnC;AAAA,EAEA,WAAiB;AACf,SAAK,iBAAiB,MAAM;AAAA,EAC9B;AACF;","names":["createVercelAISDKTool","createMCPClient","startEvent"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n AbstractAgent,\n BaseEvent,\n RunAgentInput,\n EventType,\n Message,\n RunFinishedEvent,\n RunStartedEvent,\n TextMessageChunkEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ToolCallResultEvent,\n RunErrorEvent,\n StateSnapshotEvent,\n StateDeltaEvent,\n} from \"@ag-ui/client\";\nimport {\n streamText,\n LanguageModel,\n ModelMessage,\n AssistantModelMessage,\n UserModelMessage,\n ToolModelMessage,\n ToolCallPart,\n ToolResultPart,\n TextPart,\n tool as createVercelAISDKTool,\n ToolChoice,\n ToolSet,\n stepCountIs,\n} from \"ai\";\nimport { experimental_createMCPClient as createMCPClient } from \"@ai-sdk/mcp\";\nimport { Observable } from \"rxjs\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { randomUUID } from \"crypto\";\nimport { z } from \"zod\";\nimport {\n StreamableHTTPClientTransport,\n StreamableHTTPClientTransportOptions,\n} from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\n\n/**\n * Properties that can be overridden by forwardedProps\n * These match the exact parameter names in streamText\n */\nexport type OverridableProperty =\n | \"model\"\n | \"toolChoice\"\n | \"maxOutputTokens\"\n | \"temperature\"\n | \"topP\"\n | \"topK\"\n | \"presencePenalty\"\n | \"frequencyPenalty\"\n | \"stopSequences\"\n | \"seed\"\n | \"maxRetries\"\n | \"prompt\";\n\n/**\n * Supported model identifiers for BasicAgent\n */\nexport type BasicAgentModel =\n // OpenAI models\n | \"openai/gpt-5\"\n | \"openai/gpt-5-mini\"\n | \"openai/gpt-4.1\"\n | \"openai/gpt-4.1-mini\"\n | \"openai/gpt-4.1-nano\"\n | \"openai/gpt-4o\"\n | \"openai/gpt-4o-mini\"\n // OpenAI reasoning series\n | \"openai/o3\"\n | \"openai/o3-mini\"\n | \"openai/o4-mini\"\n // Anthropic (Claude) models\n | \"anthropic/claude-sonnet-4.5\"\n | \"anthropic/claude-sonnet-4\"\n | \"anthropic/claude-3.7-sonnet\"\n | \"anthropic/claude-opus-4.1\"\n | \"anthropic/claude-opus-4\"\n | \"anthropic/claude-3.5-haiku\"\n // Google (Gemini) models\n | \"google/gemini-2.5-pro\"\n | \"google/gemini-2.5-flash\"\n | \"google/gemini-2.5-flash-lite\"\n // Allow any LanguageModel instance\n | (string & {});\n\n/**\n * Model specifier - can be a string like \"openai/gpt-4o\" or a LanguageModel instance\n */\nexport type ModelSpecifier = string | LanguageModel;\n\n/**\n * MCP Client configuration for HTTP transport\n */\nexport interface MCPClientConfigHTTP {\n /**\n * Type of MCP client\n */\n type: \"http\";\n /**\n * URL of the MCP server\n */\n url: string;\n /**\n * Optional transport options for HTTP client\n */\n options?: StreamableHTTPClientTransportOptions;\n}\n\n/**\n * MCP Client configuration for SSE transport\n */\nexport interface MCPClientConfigSSE {\n /**\n * Type of MCP client\n */\n type: \"sse\";\n /**\n * URL of the MCP server\n */\n url: string;\n /**\n * Optional HTTP headers (e.g., for authentication)\n */\n headers?: Record<string, string>;\n}\n\n/**\n * MCP Client configuration\n */\nexport type MCPClientConfig = MCPClientConfigHTTP | MCPClientConfigSSE;\n\n/**\n * Resolves a model specifier to a LanguageModel instance\n * @param spec - Model string (e.g., \"openai/gpt-4o\") or LanguageModel instance\n * @returns LanguageModel instance\n */\nexport function resolveModel(spec: ModelSpecifier): LanguageModel {\n // If already a LanguageModel instance, pass through\n if (typeof spec !== \"string\") {\n return spec;\n }\n\n // Normalize \"provider/model\" or \"provider:model\" format\n const normalized = spec.replace(\"/\", \":\").trim();\n const parts = normalized.split(\":\");\n const rawProvider = parts[0];\n const rest = parts.slice(1);\n\n if (!rawProvider) {\n throw new Error(\n `Invalid model string \"${spec}\". Use \"openai/gpt-5\", \"anthropic/claude-sonnet-4.5\", or \"google/gemini-2.5-pro\".`,\n );\n }\n\n const provider = rawProvider.toLowerCase();\n const model = rest.join(\":\").trim();\n\n if (!model) {\n throw new Error(\n `Invalid model string \"${spec}\". Use \"openai/gpt-5\", \"anthropic/claude-sonnet-4.5\", or \"google/gemini-2.5-pro\".`,\n );\n }\n\n switch (provider) {\n case \"openai\": {\n // Lazily create OpenAI provider\n const openai = createOpenAI({\n apiKey: process.env.OPENAI_API_KEY!,\n });\n // Accepts any OpenAI model id, e.g. \"gpt-4o\", \"gpt-4.1-mini\", \"o3-mini\"\n return openai(model);\n }\n\n case \"anthropic\": {\n // Lazily create Anthropic provider\n const anthropic = createAnthropic({\n apiKey: process.env.ANTHROPIC_API_KEY!,\n });\n // Accepts any Claude id, e.g. \"claude-3.7-sonnet\", \"claude-3.5-haiku\"\n return anthropic(model);\n }\n\n case \"google\":\n case \"gemini\":\n case \"google-gemini\": {\n // Lazily create Google provider\n const google = createGoogleGenerativeAI({\n apiKey: process.env.GOOGLE_API_KEY!,\n });\n // Accepts any Gemini id, e.g. \"gemini-2.5-pro\", \"gemini-2.5-flash\"\n return google(model);\n }\n\n default:\n throw new Error(`Unknown provider \"${provider}\" in \"${spec}\". Supported: openai, anthropic, google (gemini).`);\n }\n}\n\n/**\n * Tool definition for BasicAgent\n */\nexport interface ToolDefinition<TParameters extends z.ZodTypeAny = z.ZodTypeAny> {\n name: string;\n description: string;\n parameters: TParameters;\n execute: (args: z.infer<TParameters>) => Promise<unknown>;\n}\n\n/**\n * Define a tool for use with BasicAgent\n * @param name - The name of the tool\n * @param description - Description of what the tool does\n * @param parameters - Zod schema for the tool's input parameters\n * @param execute - Function to execute the tool server-side\n * @returns Tool definition\n */\nexport function defineTool<TParameters extends z.ZodTypeAny>(config: {\n name: string;\n description: string;\n parameters: TParameters;\n execute: (args: z.infer<TParameters>) => Promise<unknown>;\n}): ToolDefinition<TParameters> {\n return {\n name: config.name,\n description: config.description,\n parameters: config.parameters,\n execute: config.execute,\n };\n}\n\ntype AGUIUserMessage = Extract<Message, { role: \"user\" }>;\n\nfunction flattenUserMessageContent(content?: AGUIUserMessage[\"content\"]): string {\n if (!content) {\n return \"\";\n }\n\n if (typeof content === \"string\") {\n return content;\n }\n\n return content\n .map((part) => {\n if (\n part &&\n typeof part === \"object\" &&\n \"type\" in part &&\n (part as { type?: unknown }).type === \"text\" &&\n typeof (part as { text?: unknown }).text === \"string\"\n ) {\n return (part as { text: string }).text;\n }\n return \"\";\n })\n .filter((text) => text.length > 0)\n .join(\"\\n\");\n}\n\n/**\n * Converts AG-UI messages to Vercel AI SDK ModelMessage format\n */\nexport function convertMessagesToVercelAISDKMessages(messages: Message[]): ModelMessage[] {\n const result: ModelMessage[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\") {\n const parts: Array<TextPart | ToolCallPart> = message.content ? [{ type: \"text\", text: message.content }] : [];\n\n for (const toolCall of message.toolCalls ?? []) {\n const toolCallPart: ToolCallPart = {\n type: \"tool-call\",\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments),\n };\n parts.push(toolCallPart);\n }\n\n const assistantMsg: AssistantModelMessage = {\n role: \"assistant\",\n content: parts,\n };\n result.push(assistantMsg);\n } else if (message.role === \"user\") {\n const userMsg: UserModelMessage = {\n role: \"user\",\n content: flattenUserMessageContent(message.content),\n };\n result.push(userMsg);\n } else if (message.role === \"tool\") {\n let toolName = \"unknown\";\n // Find the tool name from the corresponding tool call\n for (const msg of messages) {\n if (msg.role === \"assistant\") {\n for (const toolCall of msg.toolCalls ?? []) {\n if (toolCall.id === message.toolCallId) {\n toolName = toolCall.function.name;\n break;\n }\n }\n }\n }\n\n const toolResultPart: ToolResultPart = {\n type: \"tool-result\",\n toolCallId: message.toolCallId,\n toolName: toolName,\n output: {\n type: \"text\",\n value: message.content,\n },\n };\n\n const toolMsg: ToolModelMessage = {\n role: \"tool\",\n content: [toolResultPart],\n };\n result.push(toolMsg);\n }\n }\n\n return result;\n}\n\n/**\n * JSON Schema type definition\n */\ninterface JsonSchema {\n type: \"object\" | \"string\" | \"number\" | \"boolean\" | \"array\";\n description?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n items?: JsonSchema;\n}\n\n/**\n * Converts JSON Schema to Zod schema\n */\nexport function convertJsonSchemaToZodSchema(jsonSchema: JsonSchema, required: boolean): z.ZodSchema {\n if (jsonSchema.type === \"object\") {\n const spec: { [key: string]: z.ZodSchema } = {};\n\n if (!jsonSchema.properties || !Object.keys(jsonSchema.properties).length) {\n return !required ? z.object(spec).optional() : z.object(spec);\n }\n\n for (const [key, value] of Object.entries(jsonSchema.properties)) {\n spec[key] = convertJsonSchemaToZodSchema(value, jsonSchema.required ? jsonSchema.required.includes(key) : false);\n }\n let schema = z.object(spec).describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"string\") {\n let schema = z.string().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"number\") {\n let schema = z.number().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"boolean\") {\n let schema = z.boolean().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"array\") {\n if (!jsonSchema.items) {\n throw new Error(\"Array type must have items property\");\n }\n let itemSchema = convertJsonSchemaToZodSchema(jsonSchema.items, true);\n let schema = z.array(itemSchema).describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n }\n throw new Error(\"Invalid JSON schema\");\n}\n\n/**\n * Converts AG-UI tools to Vercel AI SDK ToolSet\n */\nfunction isJsonSchema(obj: unknown): obj is JsonSchema {\n if (typeof obj !== \"object\" || obj === null) return false;\n const schema = obj as Record<string, unknown>;\n return typeof schema.type === \"string\" && [\"object\", \"string\", \"number\", \"boolean\", \"array\"].includes(schema.type);\n}\n\nexport function convertToolsToVercelAITools(tools: RunAgentInput[\"tools\"]): ToolSet {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: Record<string, any> = {};\n\n for (const tool of tools) {\n if (!isJsonSchema(tool.parameters)) {\n throw new Error(`Invalid JSON schema for tool ${tool.name}`);\n }\n const zodSchema = convertJsonSchemaToZodSchema(tool.parameters, true);\n result[tool.name] = createVercelAISDKTool({\n description: tool.description,\n inputSchema: zodSchema,\n });\n }\n\n return result;\n}\n\n/**\n * Converts ToolDefinition array to Vercel AI SDK ToolSet\n */\nexport function convertToolDefinitionsToVercelAITools(tools: ToolDefinition[]): ToolSet {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: Record<string, any> = {};\n\n for (const tool of tools) {\n result[tool.name] = createVercelAISDKTool({\n description: tool.description,\n inputSchema: tool.parameters,\n execute: tool.execute,\n });\n }\n\n return result;\n}\n\n/**\n * Configuration for BasicAgent\n */\nexport interface BasicAgentConfiguration {\n /**\n * The model to use\n */\n model: BasicAgentModel | LanguageModel;\n /**\n * Maximum number of steps/iterations for tool calling (default: 1)\n */\n maxSteps?: number;\n /**\n * Tool choice setting - how tools are selected for execution (default: \"auto\")\n */\n toolChoice?: ToolChoice<Record<string, unknown>>;\n /**\n * Maximum number of tokens to generate\n */\n maxOutputTokens?: number;\n /**\n * Temperature setting (range depends on provider)\n */\n temperature?: number;\n /**\n * Nucleus sampling (topP)\n */\n topP?: number;\n /**\n * Top K sampling\n */\n topK?: number;\n /**\n * Presence penalty\n */\n presencePenalty?: number;\n /**\n * Frequency penalty\n */\n frequencyPenalty?: number;\n /**\n * Sequences that will stop the generation\n */\n stopSequences?: string[];\n /**\n * Seed for deterministic results\n */\n seed?: number;\n /**\n * Maximum number of retries\n */\n maxRetries?: number;\n /**\n * Prompt for the agent\n */\n prompt?: string;\n /**\n * List of properties that can be overridden by forwardedProps.\n */\n overridableProperties?: OverridableProperty[];\n /**\n * Optional list of MCP server configurations\n */\n mcpServers?: MCPClientConfig[];\n /**\n * Optional tools available to the agent\n */\n tools?: ToolDefinition[];\n}\n\nexport class BasicAgent extends AbstractAgent {\n private abortController?: AbortController;\n\n constructor(private config: BasicAgentConfiguration) {\n super();\n }\n\n /**\n * Check if a property can be overridden by forwardedProps\n */\n canOverride(property: OverridableProperty): boolean {\n return this.config?.overridableProperties?.includes(property) ?? false;\n }\n\n run(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((subscriber) => {\n // Emit RUN_STARTED event\n const startEvent: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(startEvent);\n\n // Resolve the model\n const model = resolveModel(this.config.model);\n\n // Build prompt based on conditions\n let systemPrompt: string | undefined = undefined;\n\n // Check if we should build a prompt:\n // - config.prompt is set, OR\n // - input.context is non-empty, OR\n // - input.state is non-empty and not an empty object\n const hasPrompt = !!this.config.prompt;\n const hasContext = input.context && input.context.length > 0;\n const hasState =\n input.state !== undefined &&\n input.state !== null &&\n !(typeof input.state === \"object\" && Object.keys(input.state).length === 0);\n\n if (hasPrompt || hasContext || hasState) {\n const parts: string[] = [];\n\n // First: the prompt if any\n if (hasPrompt) {\n parts.push(this.config.prompt!);\n }\n\n // Second: context from the application\n if (hasContext) {\n parts.push(\"\\n## Context from the application\\n\");\n for (const ctx of input.context) {\n parts.push(`${ctx.description}:\\n${ctx.value}\\n`);\n }\n }\n\n // Third: state from the application that can be edited\n if (hasState) {\n parts.push(\n \"\\n## Application State\\n\" +\n \"This is state from the application that you can edit by calling AGUISendStateSnapshot or AGUISendStateDelta.\\n\" +\n `\\`\\`\\`json\\n${JSON.stringify(input.state, null, 2)}\\n\\`\\`\\`\\n`,\n );\n }\n\n systemPrompt = parts.join(\"\");\n }\n\n // Convert messages and prepend system message if we have a prompt\n const messages = convertMessagesToVercelAISDKMessages(input.messages);\n if (systemPrompt) {\n messages.unshift({\n role: \"system\",\n content: systemPrompt,\n });\n }\n\n // Merge tools from input and config\n let allTools: ToolSet = convertToolsToVercelAITools(input.tools);\n if (this.config.tools && this.config.tools.length > 0) {\n const configTools = convertToolDefinitionsToVercelAITools(this.config.tools);\n allTools = { ...allTools, ...configTools };\n }\n\n const streamTextParams: Parameters<typeof streamText>[0] = {\n model,\n messages,\n tools: allTools,\n toolChoice: this.config.toolChoice,\n stopWhen: this.config.maxSteps ? stepCountIs(this.config.maxSteps) : undefined,\n maxOutputTokens: this.config.maxOutputTokens,\n temperature: this.config.temperature,\n topP: this.config.topP,\n topK: this.config.topK,\n presencePenalty: this.config.presencePenalty,\n frequencyPenalty: this.config.frequencyPenalty,\n stopSequences: this.config.stopSequences,\n seed: this.config.seed,\n maxRetries: this.config.maxRetries,\n };\n\n // Apply forwardedProps overrides (if allowed)\n if (input.forwardedProps && typeof input.forwardedProps === \"object\") {\n const props = input.forwardedProps as Record<string, unknown>;\n\n // Check and apply each overridable property\n if (props.model !== undefined && this.canOverride(\"model\")) {\n if (typeof props.model === \"string\" || typeof props.model === \"object\") {\n // Accept any string or LanguageModel instance for model override\n streamTextParams.model = resolveModel(props.model as string | LanguageModel);\n }\n }\n if (props.toolChoice !== undefined && this.canOverride(\"toolChoice\")) {\n // ToolChoice can be 'auto', 'required', 'none', or { type: 'tool', toolName: string }\n const toolChoice = props.toolChoice;\n if (\n toolChoice === \"auto\" ||\n toolChoice === \"required\" ||\n toolChoice === \"none\" ||\n (typeof toolChoice === \"object\" &&\n toolChoice !== null &&\n \"type\" in toolChoice &&\n toolChoice.type === \"tool\")\n ) {\n streamTextParams.toolChoice = toolChoice as ToolChoice<Record<string, unknown>>;\n }\n }\n if (typeof props.maxOutputTokens === \"number\" && this.canOverride(\"maxOutputTokens\")) {\n streamTextParams.maxOutputTokens = props.maxOutputTokens;\n }\n if (typeof props.temperature === \"number\" && this.canOverride(\"temperature\")) {\n streamTextParams.temperature = props.temperature;\n }\n if (typeof props.topP === \"number\" && this.canOverride(\"topP\")) {\n streamTextParams.topP = props.topP;\n }\n if (typeof props.topK === \"number\" && this.canOverride(\"topK\")) {\n streamTextParams.topK = props.topK;\n }\n if (typeof props.presencePenalty === \"number\" && this.canOverride(\"presencePenalty\")) {\n streamTextParams.presencePenalty = props.presencePenalty;\n }\n if (typeof props.frequencyPenalty === \"number\" && this.canOverride(\"frequencyPenalty\")) {\n streamTextParams.frequencyPenalty = props.frequencyPenalty;\n }\n if (Array.isArray(props.stopSequences) && this.canOverride(\"stopSequences\")) {\n // Validate all elements are strings\n if (props.stopSequences.every((item): item is string => typeof item === \"string\")) {\n streamTextParams.stopSequences = props.stopSequences;\n }\n }\n if (typeof props.seed === \"number\" && this.canOverride(\"seed\")) {\n streamTextParams.seed = props.seed;\n }\n if (typeof props.maxRetries === \"number\" && this.canOverride(\"maxRetries\")) {\n streamTextParams.maxRetries = props.maxRetries;\n }\n }\n\n // Set up MCP clients if configured and process the stream\n const mcpClients: Array<{ close: () => Promise<void> }> = [];\n\n (async () => {\n const abortController = new AbortController();\n this.abortController = abortController;\n let terminalEventEmitted = false;\n\n try {\n // Add AG-UI state update tools\n streamTextParams.tools = {\n ...streamTextParams.tools,\n AGUISendStateSnapshot: createVercelAISDKTool({\n description: \"Replace the entire application state with a new snapshot\",\n inputSchema: z.object({\n snapshot: z.any().describe(\"The complete new state object\"),\n }),\n execute: async ({ snapshot }) => {\n return { success: true, snapshot };\n },\n }),\n AGUISendStateDelta: createVercelAISDKTool({\n description: \"Apply incremental updates to application state using JSON Patch operations\",\n inputSchema: z.object({\n delta: z\n .array(\n z.object({\n op: z.enum([\"add\", \"replace\", \"remove\"]).describe(\"The operation to perform\"),\n path: z.string().describe(\"JSON Pointer path (e.g., '/foo/bar')\"),\n value: z\n .any()\n .optional()\n .describe(\n \"The value to set. Required for 'add' and 'replace' operations, ignored for 'remove'.\",\n ),\n }),\n )\n .describe(\"Array of JSON Patch operations\"),\n }),\n execute: async ({ delta }) => {\n return { success: true, delta };\n },\n }),\n };\n\n // Initialize MCP clients and get their tools\n if (this.config.mcpServers && this.config.mcpServers.length > 0) {\n for (const serverConfig of this.config.mcpServers) {\n let transport;\n\n if (serverConfig.type === \"http\") {\n const url = new URL(serverConfig.url);\n transport = new StreamableHTTPClientTransport(url, serverConfig.options);\n } else if (serverConfig.type === \"sse\") {\n transport = new SSEClientTransport(new URL(serverConfig.url), serverConfig.headers);\n }\n\n if (transport) {\n const mcpClient = await createMCPClient({ transport });\n mcpClients.push(mcpClient);\n\n // Get tools from this MCP server and merge with existing tools\n const mcpTools = await mcpClient.tools();\n streamTextParams.tools = { ...streamTextParams.tools, ...mcpTools };\n }\n }\n }\n\n // Call streamText and process the stream\n const response = streamText({ ...streamTextParams, abortSignal: abortController.signal });\n\n let messageId = randomUUID();\n\n const toolCallStates = new Map<\n string,\n {\n started: boolean;\n hasArgsDelta: boolean;\n ended: boolean;\n toolName?: string;\n }\n >();\n\n const ensureToolCallState = (toolCallId: string) => {\n let state = toolCallStates.get(toolCallId);\n if (!state) {\n state = { started: false, hasArgsDelta: false, ended: false };\n toolCallStates.set(toolCallId, state);\n }\n return state;\n };\n\n // Process fullStream events\n for await (const part of response.fullStream) {\n switch (part.type) {\n case \"tool-input-start\": {\n const toolCallId = part.id;\n const state = ensureToolCallState(toolCallId);\n state.toolName = part.toolName;\n if (!state.started) {\n state.started = true;\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n parentMessageId: messageId,\n toolCallId,\n toolCallName: part.toolName,\n };\n subscriber.next(startEvent);\n }\n break;\n }\n\n case \"tool-input-delta\": {\n const toolCallId = part.id;\n const state = ensureToolCallState(toolCallId);\n state.hasArgsDelta = true;\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: part.delta,\n };\n subscriber.next(argsEvent);\n break;\n }\n\n case \"tool-input-end\": {\n // No direct event – the subsequent \"tool-call\" part marks completion.\n break;\n }\n\n case \"text-delta\": {\n // Accumulate text content - in AI SDK 5.0, the property is 'text'\n const textDelta = \"text\" in part ? part.text : \"\";\n // Emit text chunk event\n const textEvent: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n role: \"assistant\",\n messageId,\n delta: textDelta,\n };\n subscriber.next(textEvent);\n break;\n }\n\n case \"tool-call\": {\n const toolCallId = part.toolCallId;\n const state = ensureToolCallState(toolCallId);\n state.toolName = part.toolName ?? state.toolName;\n\n if (!state.started) {\n state.started = true;\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n parentMessageId: messageId,\n toolCallId,\n toolCallName: part.toolName,\n };\n subscriber.next(startEvent);\n }\n\n if (!state.hasArgsDelta && \"input\" in part && part.input !== undefined) {\n let serializedInput = \"\";\n if (typeof part.input === \"string\") {\n serializedInput = part.input;\n } else {\n try {\n serializedInput = JSON.stringify(part.input);\n } catch {\n serializedInput = String(part.input);\n }\n }\n\n if (serializedInput.length > 0) {\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: serializedInput,\n };\n subscriber.next(argsEvent);\n state.hasArgsDelta = true;\n }\n }\n\n if (!state.ended) {\n state.ended = true;\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId,\n };\n subscriber.next(endEvent);\n }\n break;\n }\n\n case \"tool-result\": {\n const toolResult = \"output\" in part ? part.output : null;\n const toolName = \"toolName\" in part ? part.toolName : \"\";\n toolCallStates.delete(part.toolCallId);\n\n // Check if this is a state update tool\n if (toolName === \"AGUISendStateSnapshot\" && toolResult && typeof toolResult === \"object\") {\n // Emit StateSnapshotEvent\n const stateSnapshotEvent: StateSnapshotEvent = {\n type: EventType.STATE_SNAPSHOT,\n snapshot: toolResult.snapshot,\n };\n subscriber.next(stateSnapshotEvent);\n } else if (toolName === \"AGUISendStateDelta\" && toolResult && typeof toolResult === \"object\") {\n // Emit StateDeltaEvent\n const stateDeltaEvent: StateDeltaEvent = {\n type: EventType.STATE_DELTA,\n delta: toolResult.delta,\n };\n subscriber.next(stateDeltaEvent);\n }\n\n // Always emit the tool result event for the LLM\n const resultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n role: \"tool\",\n messageId: randomUUID(),\n toolCallId: part.toolCallId,\n content: JSON.stringify(toolResult),\n };\n subscriber.next(resultEvent);\n break;\n }\n\n case \"finish\":\n // Emit run finished event\n const finishedEvent: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finishedEvent);\n terminalEventEmitted = true;\n\n // Complete the observable\n subscriber.complete();\n break;\n\n case \"error\": {\n if (abortController.signal.aborted) {\n break;\n }\n const runErrorEvent: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: part.error + \"\",\n };\n subscriber.next(runErrorEvent);\n terminalEventEmitted = true;\n\n // Handle error\n subscriber.error(part.error);\n break;\n }\n }\n }\n\n if (!terminalEventEmitted) {\n if (abortController.signal.aborted) {\n // Let the runner finalize the stream on stop requests so it can\n // inject consistent closing events and a RUN_FINISHED marker.\n } else {\n const finishedEvent: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finishedEvent);\n }\n\n terminalEventEmitted = true;\n subscriber.complete();\n }\n } catch (error) {\n if (abortController.signal.aborted) {\n subscriber.complete();\n } else {\n const runErrorEvent: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: error + \"\",\n };\n subscriber.next(runErrorEvent);\n terminalEventEmitted = true;\n subscriber.error(error);\n }\n } finally {\n this.abortController = undefined;\n await Promise.all(mcpClients.map((client) => client.close()));\n }\n })();\n\n // Cleanup function\n return () => {\n // Cleanup MCP clients if stream is unsubscribed\n Promise.all(mcpClients.map((client) => client.close())).catch(() => {\n // Ignore cleanup errors\n });\n };\n });\n }\n\n clone() {\n return new BasicAgent(this.config);\n }\n\n abortRun(): void {\n this.abortController?.abort();\n }\n}\n"],"mappings":"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","names":["createVercelAISDKTool","createMCPClient","startEvent"]}
package/dist/index.mjs CHANGED
@@ -5,7 +5,8 @@ import {
5
5
  } from "@ag-ui/client";
6
6
  import {
7
7
  streamText,
8
- tool as createVercelAISDKTool
8
+ tool as createVercelAISDKTool,
9
+ stepCountIs
9
10
  } from "ai";
10
11
  import { experimental_createMCPClient as createMCPClient } from "@ai-sdk/mcp";
11
12
  import { Observable } from "rxjs";
@@ -67,7 +68,8 @@ function defineTool(config) {
67
68
  return {
68
69
  name: config.name,
69
70
  description: config.description,
70
- parameters: config.parameters
71
+ parameters: config.parameters,
72
+ execute: config.execute
71
73
  };
72
74
  }
73
75
  function flattenUserMessageContent(content) {
@@ -193,7 +195,8 @@ function convertToolDefinitionsToVercelAITools(tools) {
193
195
  for (const tool of tools) {
194
196
  result[tool.name] = createVercelAISDKTool({
195
197
  description: tool.description,
196
- inputSchema: tool.parameters
198
+ inputSchema: tool.parameters,
199
+ execute: tool.execute
197
200
  });
198
201
  }
199
202
  return result;
@@ -266,6 +269,7 @@ ${JSON.stringify(input.state, null, 2)}
266
269
  messages,
267
270
  tools: allTools,
268
271
  toolChoice: this.config.toolChoice,
272
+ stopWhen: this.config.maxSteps ? stepCountIs(this.config.maxSteps) : void 0,
269
273
  maxOutputTokens: this.config.maxOutputTokens,
270
274
  temperature: this.config.temperature,
271
275
  topP: this.config.topP,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n AbstractAgent,\n BaseEvent,\n RunAgentInput,\n EventType,\n Message,\n RunFinishedEvent,\n RunStartedEvent,\n TextMessageChunkEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ToolCallResultEvent,\n RunErrorEvent,\n StateSnapshotEvent,\n StateDeltaEvent,\n} from \"@ag-ui/client\";\nimport {\n streamText,\n LanguageModel,\n ModelMessage,\n AssistantModelMessage,\n UserModelMessage,\n ToolModelMessage,\n ToolCallPart,\n ToolResultPart,\n TextPart,\n tool as createVercelAISDKTool,\n ToolChoice,\n ToolSet,\n} from \"ai\";\nimport { experimental_createMCPClient as createMCPClient } from \"@ai-sdk/mcp\";\nimport { Observable } from \"rxjs\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { randomUUID } from \"crypto\";\nimport { z } from \"zod\";\nimport {\n StreamableHTTPClientTransport,\n StreamableHTTPClientTransportOptions,\n} from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { u } from \"vitest/dist/chunks/reporters.d.BFLkQcL6.js\";\n\n/**\n * Properties that can be overridden by forwardedProps\n * These match the exact parameter names in streamText\n */\nexport type OverridableProperty =\n | \"model\"\n | \"toolChoice\"\n | \"maxOutputTokens\"\n | \"temperature\"\n | \"topP\"\n | \"topK\"\n | \"presencePenalty\"\n | \"frequencyPenalty\"\n | \"stopSequences\"\n | \"seed\"\n | \"maxRetries\"\n | \"prompt\";\n\n/**\n * Supported model identifiers for BasicAgent\n */\nexport type BasicAgentModel =\n // OpenAI models\n | \"openai/gpt-5\"\n | \"openai/gpt-5-mini\"\n | \"openai/gpt-4.1\"\n | \"openai/gpt-4.1-mini\"\n | \"openai/gpt-4.1-nano\"\n | \"openai/gpt-4o\"\n | \"openai/gpt-4o-mini\"\n // OpenAI reasoning series\n | \"openai/o3\"\n | \"openai/o3-mini\"\n | \"openai/o4-mini\"\n // Anthropic (Claude) models\n | \"anthropic/claude-sonnet-4.5\"\n | \"anthropic/claude-sonnet-4\"\n | \"anthropic/claude-3.7-sonnet\"\n | \"anthropic/claude-opus-4.1\"\n | \"anthropic/claude-opus-4\"\n | \"anthropic/claude-3.5-haiku\"\n // Google (Gemini) models\n | \"google/gemini-2.5-pro\"\n | \"google/gemini-2.5-flash\"\n | \"google/gemini-2.5-flash-lite\"\n // Allow any LanguageModel instance\n | (string & {});\n\n/**\n * Model specifier - can be a string like \"openai/gpt-4o\" or a LanguageModel instance\n */\nexport type ModelSpecifier = string | LanguageModel;\n\n/**\n * MCP Client configuration for HTTP transport\n */\nexport interface MCPClientConfigHTTP {\n /**\n * Type of MCP client\n */\n type: \"http\";\n /**\n * URL of the MCP server\n */\n url: string;\n /**\n * Optional transport options for HTTP client\n */\n options?: StreamableHTTPClientTransportOptions;\n}\n\n/**\n * MCP Client configuration for SSE transport\n */\nexport interface MCPClientConfigSSE {\n /**\n * Type of MCP client\n */\n type: \"sse\";\n /**\n * URL of the MCP server\n */\n url: string;\n /**\n * Optional HTTP headers (e.g., for authentication)\n */\n headers?: Record<string, string>;\n}\n\n/**\n * MCP Client configuration\n */\nexport type MCPClientConfig = MCPClientConfigHTTP | MCPClientConfigSSE;\n\n/**\n * Resolves a model specifier to a LanguageModel instance\n * @param spec - Model string (e.g., \"openai/gpt-4o\") or LanguageModel instance\n * @returns LanguageModel instance\n */\nexport function resolveModel(spec: ModelSpecifier): LanguageModel {\n // If already a LanguageModel instance, pass through\n if (typeof spec !== \"string\") {\n return spec;\n }\n\n // Normalize \"provider/model\" or \"provider:model\" format\n const normalized = spec.replace(\"/\", \":\").trim();\n const parts = normalized.split(\":\");\n const rawProvider = parts[0];\n const rest = parts.slice(1);\n\n if (!rawProvider) {\n throw new Error(\n `Invalid model string \"${spec}\". Use \"openai/gpt-5\", \"anthropic/claude-sonnet-4.5\", or \"google/gemini-2.5-pro\".`,\n );\n }\n\n const provider = rawProvider.toLowerCase();\n const model = rest.join(\":\").trim();\n\n if (!model) {\n throw new Error(\n `Invalid model string \"${spec}\". Use \"openai/gpt-5\", \"anthropic/claude-sonnet-4.5\", or \"google/gemini-2.5-pro\".`,\n );\n }\n\n switch (provider) {\n case \"openai\": {\n // Lazily create OpenAI provider\n const openai = createOpenAI({\n apiKey: process.env.OPENAI_API_KEY!,\n });\n // Accepts any OpenAI model id, e.g. \"gpt-4o\", \"gpt-4.1-mini\", \"o3-mini\"\n return openai(model);\n }\n\n case \"anthropic\": {\n // Lazily create Anthropic provider\n const anthropic = createAnthropic({\n apiKey: process.env.ANTHROPIC_API_KEY!,\n });\n // Accepts any Claude id, e.g. \"claude-3.7-sonnet\", \"claude-3.5-haiku\"\n return anthropic(model);\n }\n\n case \"google\":\n case \"gemini\":\n case \"google-gemini\": {\n // Lazily create Google provider\n const google = createGoogleGenerativeAI({\n apiKey: process.env.GOOGLE_API_KEY!,\n });\n // Accepts any Gemini id, e.g. \"gemini-2.5-pro\", \"gemini-2.5-flash\"\n return google(model);\n }\n\n default:\n throw new Error(`Unknown provider \"${provider}\" in \"${spec}\". Supported: openai, anthropic, google (gemini).`);\n }\n}\n\n/**\n * Tool definition for BasicAgent\n */\nexport interface ToolDefinition<TParameters extends z.ZodTypeAny = z.ZodTypeAny> {\n name: string;\n description: string;\n parameters: TParameters;\n}\n\n/**\n * Define a tool for use with BasicAgent\n * @param name - The name of the tool\n * @param description - Description of what the tool does\n * @param parameters - Zod schema for the tool's input parameters\n * @returns Tool definition\n */\nexport function defineTool<TParameters extends z.ZodTypeAny>(config: {\n name: string;\n description: string;\n parameters: TParameters;\n}): ToolDefinition<TParameters> {\n return {\n name: config.name,\n description: config.description,\n parameters: config.parameters,\n };\n}\n\ntype AGUIUserMessage = Extract<Message, { role: \"user\" }>;\n\nfunction flattenUserMessageContent(content?: AGUIUserMessage[\"content\"]): string {\n if (!content) {\n return \"\";\n }\n\n if (typeof content === \"string\") {\n return content;\n }\n\n return content\n .map((part) => {\n if (\n part &&\n typeof part === \"object\" &&\n \"type\" in part &&\n (part as { type?: unknown }).type === \"text\" &&\n typeof (part as { text?: unknown }).text === \"string\"\n ) {\n return (part as { text: string }).text;\n }\n return \"\";\n })\n .filter((text) => text.length > 0)\n .join(\"\\n\");\n}\n\n/**\n * Converts AG-UI messages to Vercel AI SDK ModelMessage format\n */\nexport function convertMessagesToVercelAISDKMessages(messages: Message[]): ModelMessage[] {\n const result: ModelMessage[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\") {\n const parts: Array<TextPart | ToolCallPart> = message.content ? [{ type: \"text\", text: message.content }] : [];\n\n for (const toolCall of message.toolCalls ?? []) {\n const toolCallPart: ToolCallPart = {\n type: \"tool-call\",\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments),\n };\n parts.push(toolCallPart);\n }\n\n const assistantMsg: AssistantModelMessage = {\n role: \"assistant\",\n content: parts,\n };\n result.push(assistantMsg);\n } else if (message.role === \"user\") {\n const userMsg: UserModelMessage = {\n role: \"user\",\n content: flattenUserMessageContent(message.content),\n };\n result.push(userMsg);\n } else if (message.role === \"tool\") {\n let toolName = \"unknown\";\n // Find the tool name from the corresponding tool call\n for (const msg of messages) {\n if (msg.role === \"assistant\") {\n for (const toolCall of msg.toolCalls ?? []) {\n if (toolCall.id === message.toolCallId) {\n toolName = toolCall.function.name;\n break;\n }\n }\n }\n }\n\n const toolResultPart: ToolResultPart = {\n type: \"tool-result\",\n toolCallId: message.toolCallId,\n toolName: toolName,\n output: {\n type: \"text\",\n value: message.content,\n },\n };\n\n const toolMsg: ToolModelMessage = {\n role: \"tool\",\n content: [toolResultPart],\n };\n result.push(toolMsg);\n }\n }\n\n return result;\n}\n\n/**\n * JSON Schema type definition\n */\ninterface JsonSchema {\n type: \"object\" | \"string\" | \"number\" | \"boolean\" | \"array\";\n description?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n items?: JsonSchema;\n}\n\n/**\n * Converts JSON Schema to Zod schema\n */\nexport function convertJsonSchemaToZodSchema(jsonSchema: JsonSchema, required: boolean): z.ZodSchema {\n if (jsonSchema.type === \"object\") {\n const spec: { [key: string]: z.ZodSchema } = {};\n\n if (!jsonSchema.properties || !Object.keys(jsonSchema.properties).length) {\n return !required ? z.object(spec).optional() : z.object(spec);\n }\n\n for (const [key, value] of Object.entries(jsonSchema.properties)) {\n spec[key] = convertJsonSchemaToZodSchema(value, jsonSchema.required ? jsonSchema.required.includes(key) : false);\n }\n let schema = z.object(spec).describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"string\") {\n let schema = z.string().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"number\") {\n let schema = z.number().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"boolean\") {\n let schema = z.boolean().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"array\") {\n if (!jsonSchema.items) {\n throw new Error(\"Array type must have items property\");\n }\n let itemSchema = convertJsonSchemaToZodSchema(jsonSchema.items, true);\n let schema = z.array(itemSchema).describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n }\n throw new Error(\"Invalid JSON schema\");\n}\n\n/**\n * Converts AG-UI tools to Vercel AI SDK ToolSet\n */\nfunction isJsonSchema(obj: unknown): obj is JsonSchema {\n if (typeof obj !== \"object\" || obj === null) return false;\n const schema = obj as Record<string, unknown>;\n return typeof schema.type === \"string\" && [\"object\", \"string\", \"number\", \"boolean\", \"array\"].includes(schema.type);\n}\n\nexport function convertToolsToVercelAITools(tools: RunAgentInput[\"tools\"]): ToolSet {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: Record<string, any> = {};\n\n for (const tool of tools) {\n if (!isJsonSchema(tool.parameters)) {\n throw new Error(`Invalid JSON schema for tool ${tool.name}`);\n }\n const zodSchema = convertJsonSchemaToZodSchema(tool.parameters, true);\n result[tool.name] = createVercelAISDKTool({\n description: tool.description,\n inputSchema: zodSchema,\n });\n }\n\n return result;\n}\n\n/**\n * Converts ToolDefinition array to Vercel AI SDK ToolSet\n */\nexport function convertToolDefinitionsToVercelAITools(tools: ToolDefinition[]): ToolSet {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: Record<string, any> = {};\n\n for (const tool of tools) {\n result[tool.name] = createVercelAISDKTool({\n description: tool.description,\n inputSchema: tool.parameters,\n });\n }\n\n return result;\n}\n\n/**\n * Configuration for BasicAgent\n */\nexport interface BasicAgentConfiguration {\n /**\n * The model to use\n */\n model: BasicAgentModel | LanguageModel;\n /**\n * Maximum number of steps/iterations for tool calling (default: 1)\n */\n maxSteps?: number;\n /**\n * Tool choice setting - how tools are selected for execution (default: \"auto\")\n */\n toolChoice?: ToolChoice<Record<string, unknown>>;\n /**\n * Maximum number of tokens to generate\n */\n maxOutputTokens?: number;\n /**\n * Temperature setting (range depends on provider)\n */\n temperature?: number;\n /**\n * Nucleus sampling (topP)\n */\n topP?: number;\n /**\n * Top K sampling\n */\n topK?: number;\n /**\n * Presence penalty\n */\n presencePenalty?: number;\n /**\n * Frequency penalty\n */\n frequencyPenalty?: number;\n /**\n * Sequences that will stop the generation\n */\n stopSequences?: string[];\n /**\n * Seed for deterministic results\n */\n seed?: number;\n /**\n * Maximum number of retries\n */\n maxRetries?: number;\n /**\n * Prompt for the agent\n */\n prompt?: string;\n /**\n * List of properties that can be overridden by forwardedProps.\n */\n overridableProperties?: OverridableProperty[];\n /**\n * Optional list of MCP server configurations\n */\n mcpServers?: MCPClientConfig[];\n /**\n * Optional tools available to the agent\n */\n tools?: ToolDefinition[];\n}\n\nexport class BasicAgent extends AbstractAgent {\n private abortController?: AbortController;\n\n constructor(private config: BasicAgentConfiguration) {\n super();\n }\n\n /**\n * Check if a property can be overridden by forwardedProps\n */\n canOverride(property: OverridableProperty): boolean {\n return this.config?.overridableProperties?.includes(property) ?? false;\n }\n\n run(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((subscriber) => {\n // Emit RUN_STARTED event\n const startEvent: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(startEvent);\n\n // Resolve the model\n const model = resolveModel(this.config.model);\n\n // Build prompt based on conditions\n let systemPrompt: string | undefined = undefined;\n\n // Check if we should build a prompt:\n // - config.prompt is set, OR\n // - input.context is non-empty, OR\n // - input.state is non-empty and not an empty object\n const hasPrompt = !!this.config.prompt;\n const hasContext = input.context && input.context.length > 0;\n const hasState =\n input.state !== undefined &&\n input.state !== null &&\n !(typeof input.state === \"object\" && Object.keys(input.state).length === 0);\n\n if (hasPrompt || hasContext || hasState) {\n const parts: string[] = [];\n\n // First: the prompt if any\n if (hasPrompt) {\n parts.push(this.config.prompt!);\n }\n\n // Second: context from the application\n if (hasContext) {\n parts.push(\"\\n## Context from the application\\n\");\n for (const ctx of input.context) {\n parts.push(`${ctx.description}:\\n${ctx.value}\\n`);\n }\n }\n\n // Third: state from the application that can be edited\n if (hasState) {\n parts.push(\n \"\\n## Application State\\n\" +\n \"This is state from the application that you can edit by calling AGUISendStateSnapshot or AGUISendStateDelta.\\n\" +\n `\\`\\`\\`json\\n${JSON.stringify(input.state, null, 2)}\\n\\`\\`\\`\\n`,\n );\n }\n\n systemPrompt = parts.join(\"\");\n }\n\n // Convert messages and prepend system message if we have a prompt\n const messages = convertMessagesToVercelAISDKMessages(input.messages);\n if (systemPrompt) {\n messages.unshift({\n role: \"system\",\n content: systemPrompt,\n });\n }\n\n // Merge tools from input and config\n let allTools: ToolSet = convertToolsToVercelAITools(input.tools);\n if (this.config.tools && this.config.tools.length > 0) {\n const configTools = convertToolDefinitionsToVercelAITools(this.config.tools);\n allTools = { ...allTools, ...configTools };\n }\n\n const streamTextParams: Parameters<typeof streamText>[0] = {\n model,\n messages,\n tools: allTools,\n toolChoice: this.config.toolChoice,\n maxOutputTokens: this.config.maxOutputTokens,\n temperature: this.config.temperature,\n topP: this.config.topP,\n topK: this.config.topK,\n presencePenalty: this.config.presencePenalty,\n frequencyPenalty: this.config.frequencyPenalty,\n stopSequences: this.config.stopSequences,\n seed: this.config.seed,\n maxRetries: this.config.maxRetries,\n };\n\n // Apply forwardedProps overrides (if allowed)\n if (input.forwardedProps && typeof input.forwardedProps === \"object\") {\n const props = input.forwardedProps as Record<string, unknown>;\n\n // Check and apply each overridable property\n if (props.model !== undefined && this.canOverride(\"model\")) {\n if (typeof props.model === \"string\" || typeof props.model === \"object\") {\n // Accept any string or LanguageModel instance for model override\n streamTextParams.model = resolveModel(props.model as string | LanguageModel);\n }\n }\n if (props.toolChoice !== undefined && this.canOverride(\"toolChoice\")) {\n // ToolChoice can be 'auto', 'required', 'none', or { type: 'tool', toolName: string }\n const toolChoice = props.toolChoice;\n if (\n toolChoice === \"auto\" ||\n toolChoice === \"required\" ||\n toolChoice === \"none\" ||\n (typeof toolChoice === \"object\" &&\n toolChoice !== null &&\n \"type\" in toolChoice &&\n toolChoice.type === \"tool\")\n ) {\n streamTextParams.toolChoice = toolChoice as ToolChoice<Record<string, unknown>>;\n }\n }\n if (typeof props.maxOutputTokens === \"number\" && this.canOverride(\"maxOutputTokens\")) {\n streamTextParams.maxOutputTokens = props.maxOutputTokens;\n }\n if (typeof props.temperature === \"number\" && this.canOverride(\"temperature\")) {\n streamTextParams.temperature = props.temperature;\n }\n if (typeof props.topP === \"number\" && this.canOverride(\"topP\")) {\n streamTextParams.topP = props.topP;\n }\n if (typeof props.topK === \"number\" && this.canOverride(\"topK\")) {\n streamTextParams.topK = props.topK;\n }\n if (typeof props.presencePenalty === \"number\" && this.canOverride(\"presencePenalty\")) {\n streamTextParams.presencePenalty = props.presencePenalty;\n }\n if (typeof props.frequencyPenalty === \"number\" && this.canOverride(\"frequencyPenalty\")) {\n streamTextParams.frequencyPenalty = props.frequencyPenalty;\n }\n if (Array.isArray(props.stopSequences) && this.canOverride(\"stopSequences\")) {\n // Validate all elements are strings\n if (props.stopSequences.every((item): item is string => typeof item === \"string\")) {\n streamTextParams.stopSequences = props.stopSequences;\n }\n }\n if (typeof props.seed === \"number\" && this.canOverride(\"seed\")) {\n streamTextParams.seed = props.seed;\n }\n if (typeof props.maxRetries === \"number\" && this.canOverride(\"maxRetries\")) {\n streamTextParams.maxRetries = props.maxRetries;\n }\n }\n\n // Set up MCP clients if configured and process the stream\n const mcpClients: Array<{ close: () => Promise<void> }> = [];\n\n (async () => {\n const abortController = new AbortController();\n this.abortController = abortController;\n let terminalEventEmitted = false;\n\n try {\n // Add AG-UI state update tools\n streamTextParams.tools = {\n ...streamTextParams.tools,\n AGUISendStateSnapshot: createVercelAISDKTool({\n description: \"Replace the entire application state with a new snapshot\",\n inputSchema: z.object({\n snapshot: z.any().describe(\"The complete new state object\"),\n }),\n execute: async ({ snapshot }) => {\n return { success: true, snapshot };\n },\n }),\n AGUISendStateDelta: createVercelAISDKTool({\n description: \"Apply incremental updates to application state using JSON Patch operations\",\n inputSchema: z.object({\n delta: z\n .array(\n z.object({\n op: z.enum([\"add\", \"replace\", \"remove\"]).describe(\"The operation to perform\"),\n path: z.string().describe(\"JSON Pointer path (e.g., '/foo/bar')\"),\n value: z\n .any()\n .optional()\n .describe(\n \"The value to set. Required for 'add' and 'replace' operations, ignored for 'remove'.\",\n ),\n }),\n )\n .describe(\"Array of JSON Patch operations\"),\n }),\n execute: async ({ delta }) => {\n return { success: true, delta };\n },\n }),\n };\n\n // Initialize MCP clients and get their tools\n if (this.config.mcpServers && this.config.mcpServers.length > 0) {\n for (const serverConfig of this.config.mcpServers) {\n let transport;\n\n if (serverConfig.type === \"http\") {\n const url = new URL(serverConfig.url);\n transport = new StreamableHTTPClientTransport(url, serverConfig.options);\n } else if (serverConfig.type === \"sse\") {\n transport = new SSEClientTransport(new URL(serverConfig.url), serverConfig.headers);\n }\n\n if (transport) {\n const mcpClient = await createMCPClient({ transport });\n mcpClients.push(mcpClient);\n\n // Get tools from this MCP server and merge with existing tools\n const mcpTools = await mcpClient.tools();\n streamTextParams.tools = { ...streamTextParams.tools, ...mcpTools };\n }\n }\n }\n\n // Call streamText and process the stream\n const response = streamText({ ...streamTextParams, abortSignal: abortController.signal });\n\n let messageId = randomUUID();\n\n const toolCallStates = new Map<\n string,\n {\n started: boolean;\n hasArgsDelta: boolean;\n ended: boolean;\n toolName?: string;\n }\n >();\n\n const ensureToolCallState = (toolCallId: string) => {\n let state = toolCallStates.get(toolCallId);\n if (!state) {\n state = { started: false, hasArgsDelta: false, ended: false };\n toolCallStates.set(toolCallId, state);\n }\n return state;\n };\n\n // Process fullStream events\n for await (const part of response.fullStream) {\n switch (part.type) {\n case \"tool-input-start\": {\n const toolCallId = part.id;\n const state = ensureToolCallState(toolCallId);\n state.toolName = part.toolName;\n if (!state.started) {\n state.started = true;\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n parentMessageId: messageId,\n toolCallId,\n toolCallName: part.toolName,\n };\n subscriber.next(startEvent);\n }\n break;\n }\n\n case \"tool-input-delta\": {\n const toolCallId = part.id;\n const state = ensureToolCallState(toolCallId);\n state.hasArgsDelta = true;\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: part.delta,\n };\n subscriber.next(argsEvent);\n break;\n }\n\n case \"tool-input-end\": {\n // No direct event – the subsequent \"tool-call\" part marks completion.\n break;\n }\n\n case \"text-delta\": {\n // Accumulate text content - in AI SDK 5.0, the property is 'text'\n const textDelta = \"text\" in part ? part.text : \"\";\n // Emit text chunk event\n const textEvent: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n role: \"assistant\",\n messageId,\n delta: textDelta,\n };\n subscriber.next(textEvent);\n break;\n }\n\n case \"tool-call\": {\n const toolCallId = part.toolCallId;\n const state = ensureToolCallState(toolCallId);\n state.toolName = part.toolName ?? state.toolName;\n\n if (!state.started) {\n state.started = true;\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n parentMessageId: messageId,\n toolCallId,\n toolCallName: part.toolName,\n };\n subscriber.next(startEvent);\n }\n\n if (!state.hasArgsDelta && \"input\" in part && part.input !== undefined) {\n let serializedInput = \"\";\n if (typeof part.input === \"string\") {\n serializedInput = part.input;\n } else {\n try {\n serializedInput = JSON.stringify(part.input);\n } catch {\n serializedInput = String(part.input);\n }\n }\n\n if (serializedInput.length > 0) {\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: serializedInput,\n };\n subscriber.next(argsEvent);\n state.hasArgsDelta = true;\n }\n }\n\n if (!state.ended) {\n state.ended = true;\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId,\n };\n subscriber.next(endEvent);\n }\n break;\n }\n\n case \"tool-result\": {\n const toolResult = \"output\" in part ? part.output : null;\n const toolName = \"toolName\" in part ? part.toolName : \"\";\n toolCallStates.delete(part.toolCallId);\n\n // Check if this is a state update tool\n if (toolName === \"AGUISendStateSnapshot\" && toolResult && typeof toolResult === \"object\") {\n // Emit StateSnapshotEvent\n const stateSnapshotEvent: StateSnapshotEvent = {\n type: EventType.STATE_SNAPSHOT,\n snapshot: toolResult.snapshot,\n };\n subscriber.next(stateSnapshotEvent);\n } else if (toolName === \"AGUISendStateDelta\" && toolResult && typeof toolResult === \"object\") {\n // Emit StateDeltaEvent\n const stateDeltaEvent: StateDeltaEvent = {\n type: EventType.STATE_DELTA,\n delta: toolResult.delta,\n };\n subscriber.next(stateDeltaEvent);\n }\n\n // Always emit the tool result event for the LLM\n const resultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n role: \"tool\",\n messageId: randomUUID(),\n toolCallId: part.toolCallId,\n content: JSON.stringify(toolResult),\n };\n subscriber.next(resultEvent);\n break;\n }\n\n case \"finish\":\n // Emit run finished event\n const finishedEvent: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finishedEvent);\n terminalEventEmitted = true;\n\n // Complete the observable\n subscriber.complete();\n break;\n\n case \"error\": {\n if (abortController.signal.aborted) {\n break;\n }\n const runErrorEvent: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: part.error + \"\",\n };\n subscriber.next(runErrorEvent);\n terminalEventEmitted = true;\n\n // Handle error\n subscriber.error(part.error);\n break;\n }\n }\n }\n\n if (!terminalEventEmitted) {\n if (abortController.signal.aborted) {\n // Let the runner finalize the stream on stop requests so it can\n // inject consistent closing events and a RUN_FINISHED marker.\n } else {\n const finishedEvent: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finishedEvent);\n }\n\n terminalEventEmitted = true;\n subscriber.complete();\n }\n } catch (error) {\n if (abortController.signal.aborted) {\n subscriber.complete();\n } else {\n const runErrorEvent: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: error + \"\",\n };\n subscriber.next(runErrorEvent);\n terminalEventEmitted = true;\n subscriber.error(error);\n }\n } finally {\n this.abortController = undefined;\n await Promise.all(mcpClients.map((client) => client.close()));\n }\n })();\n\n // Cleanup function\n return () => {\n // Cleanup MCP clients if stream is unsubscribed\n Promise.all(mcpClients.map((client) => client.close())).catch(() => {\n // Ignore cleanup errors\n });\n };\n });\n }\n\n clone() {\n return new BasicAgent(this.config);\n }\n\n abortRun(): void {\n this.abortController?.abort();\n }\n}\n"],"mappings":"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","names":["startEvent"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n AbstractAgent,\n BaseEvent,\n RunAgentInput,\n EventType,\n Message,\n RunFinishedEvent,\n RunStartedEvent,\n TextMessageChunkEvent,\n ToolCallArgsEvent,\n ToolCallEndEvent,\n ToolCallStartEvent,\n ToolCallResultEvent,\n RunErrorEvent,\n StateSnapshotEvent,\n StateDeltaEvent,\n} from \"@ag-ui/client\";\nimport {\n streamText,\n LanguageModel,\n ModelMessage,\n AssistantModelMessage,\n UserModelMessage,\n ToolModelMessage,\n ToolCallPart,\n ToolResultPart,\n TextPart,\n tool as createVercelAISDKTool,\n ToolChoice,\n ToolSet,\n stepCountIs,\n} from \"ai\";\nimport { experimental_createMCPClient as createMCPClient } from \"@ai-sdk/mcp\";\nimport { Observable } from \"rxjs\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { randomUUID } from \"crypto\";\nimport { z } from \"zod\";\nimport {\n StreamableHTTPClientTransport,\n StreamableHTTPClientTransportOptions,\n} from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\n\n/**\n * Properties that can be overridden by forwardedProps\n * These match the exact parameter names in streamText\n */\nexport type OverridableProperty =\n | \"model\"\n | \"toolChoice\"\n | \"maxOutputTokens\"\n | \"temperature\"\n | \"topP\"\n | \"topK\"\n | \"presencePenalty\"\n | \"frequencyPenalty\"\n | \"stopSequences\"\n | \"seed\"\n | \"maxRetries\"\n | \"prompt\";\n\n/**\n * Supported model identifiers for BasicAgent\n */\nexport type BasicAgentModel =\n // OpenAI models\n | \"openai/gpt-5\"\n | \"openai/gpt-5-mini\"\n | \"openai/gpt-4.1\"\n | \"openai/gpt-4.1-mini\"\n | \"openai/gpt-4.1-nano\"\n | \"openai/gpt-4o\"\n | \"openai/gpt-4o-mini\"\n // OpenAI reasoning series\n | \"openai/o3\"\n | \"openai/o3-mini\"\n | \"openai/o4-mini\"\n // Anthropic (Claude) models\n | \"anthropic/claude-sonnet-4.5\"\n | \"anthropic/claude-sonnet-4\"\n | \"anthropic/claude-3.7-sonnet\"\n | \"anthropic/claude-opus-4.1\"\n | \"anthropic/claude-opus-4\"\n | \"anthropic/claude-3.5-haiku\"\n // Google (Gemini) models\n | \"google/gemini-2.5-pro\"\n | \"google/gemini-2.5-flash\"\n | \"google/gemini-2.5-flash-lite\"\n // Allow any LanguageModel instance\n | (string & {});\n\n/**\n * Model specifier - can be a string like \"openai/gpt-4o\" or a LanguageModel instance\n */\nexport type ModelSpecifier = string | LanguageModel;\n\n/**\n * MCP Client configuration for HTTP transport\n */\nexport interface MCPClientConfigHTTP {\n /**\n * Type of MCP client\n */\n type: \"http\";\n /**\n * URL of the MCP server\n */\n url: string;\n /**\n * Optional transport options for HTTP client\n */\n options?: StreamableHTTPClientTransportOptions;\n}\n\n/**\n * MCP Client configuration for SSE transport\n */\nexport interface MCPClientConfigSSE {\n /**\n * Type of MCP client\n */\n type: \"sse\";\n /**\n * URL of the MCP server\n */\n url: string;\n /**\n * Optional HTTP headers (e.g., for authentication)\n */\n headers?: Record<string, string>;\n}\n\n/**\n * MCP Client configuration\n */\nexport type MCPClientConfig = MCPClientConfigHTTP | MCPClientConfigSSE;\n\n/**\n * Resolves a model specifier to a LanguageModel instance\n * @param spec - Model string (e.g., \"openai/gpt-4o\") or LanguageModel instance\n * @returns LanguageModel instance\n */\nexport function resolveModel(spec: ModelSpecifier): LanguageModel {\n // If already a LanguageModel instance, pass through\n if (typeof spec !== \"string\") {\n return spec;\n }\n\n // Normalize \"provider/model\" or \"provider:model\" format\n const normalized = spec.replace(\"/\", \":\").trim();\n const parts = normalized.split(\":\");\n const rawProvider = parts[0];\n const rest = parts.slice(1);\n\n if (!rawProvider) {\n throw new Error(\n `Invalid model string \"${spec}\". Use \"openai/gpt-5\", \"anthropic/claude-sonnet-4.5\", or \"google/gemini-2.5-pro\".`,\n );\n }\n\n const provider = rawProvider.toLowerCase();\n const model = rest.join(\":\").trim();\n\n if (!model) {\n throw new Error(\n `Invalid model string \"${spec}\". Use \"openai/gpt-5\", \"anthropic/claude-sonnet-4.5\", or \"google/gemini-2.5-pro\".`,\n );\n }\n\n switch (provider) {\n case \"openai\": {\n // Lazily create OpenAI provider\n const openai = createOpenAI({\n apiKey: process.env.OPENAI_API_KEY!,\n });\n // Accepts any OpenAI model id, e.g. \"gpt-4o\", \"gpt-4.1-mini\", \"o3-mini\"\n return openai(model);\n }\n\n case \"anthropic\": {\n // Lazily create Anthropic provider\n const anthropic = createAnthropic({\n apiKey: process.env.ANTHROPIC_API_KEY!,\n });\n // Accepts any Claude id, e.g. \"claude-3.7-sonnet\", \"claude-3.5-haiku\"\n return anthropic(model);\n }\n\n case \"google\":\n case \"gemini\":\n case \"google-gemini\": {\n // Lazily create Google provider\n const google = createGoogleGenerativeAI({\n apiKey: process.env.GOOGLE_API_KEY!,\n });\n // Accepts any Gemini id, e.g. \"gemini-2.5-pro\", \"gemini-2.5-flash\"\n return google(model);\n }\n\n default:\n throw new Error(`Unknown provider \"${provider}\" in \"${spec}\". Supported: openai, anthropic, google (gemini).`);\n }\n}\n\n/**\n * Tool definition for BasicAgent\n */\nexport interface ToolDefinition<TParameters extends z.ZodTypeAny = z.ZodTypeAny> {\n name: string;\n description: string;\n parameters: TParameters;\n execute: (args: z.infer<TParameters>) => Promise<unknown>;\n}\n\n/**\n * Define a tool for use with BasicAgent\n * @param name - The name of the tool\n * @param description - Description of what the tool does\n * @param parameters - Zod schema for the tool's input parameters\n * @param execute - Function to execute the tool server-side\n * @returns Tool definition\n */\nexport function defineTool<TParameters extends z.ZodTypeAny>(config: {\n name: string;\n description: string;\n parameters: TParameters;\n execute: (args: z.infer<TParameters>) => Promise<unknown>;\n}): ToolDefinition<TParameters> {\n return {\n name: config.name,\n description: config.description,\n parameters: config.parameters,\n execute: config.execute,\n };\n}\n\ntype AGUIUserMessage = Extract<Message, { role: \"user\" }>;\n\nfunction flattenUserMessageContent(content?: AGUIUserMessage[\"content\"]): string {\n if (!content) {\n return \"\";\n }\n\n if (typeof content === \"string\") {\n return content;\n }\n\n return content\n .map((part) => {\n if (\n part &&\n typeof part === \"object\" &&\n \"type\" in part &&\n (part as { type?: unknown }).type === \"text\" &&\n typeof (part as { text?: unknown }).text === \"string\"\n ) {\n return (part as { text: string }).text;\n }\n return \"\";\n })\n .filter((text) => text.length > 0)\n .join(\"\\n\");\n}\n\n/**\n * Converts AG-UI messages to Vercel AI SDK ModelMessage format\n */\nexport function convertMessagesToVercelAISDKMessages(messages: Message[]): ModelMessage[] {\n const result: ModelMessage[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\") {\n const parts: Array<TextPart | ToolCallPart> = message.content ? [{ type: \"text\", text: message.content }] : [];\n\n for (const toolCall of message.toolCalls ?? []) {\n const toolCallPart: ToolCallPart = {\n type: \"tool-call\",\n toolCallId: toolCall.id,\n toolName: toolCall.function.name,\n input: JSON.parse(toolCall.function.arguments),\n };\n parts.push(toolCallPart);\n }\n\n const assistantMsg: AssistantModelMessage = {\n role: \"assistant\",\n content: parts,\n };\n result.push(assistantMsg);\n } else if (message.role === \"user\") {\n const userMsg: UserModelMessage = {\n role: \"user\",\n content: flattenUserMessageContent(message.content),\n };\n result.push(userMsg);\n } else if (message.role === \"tool\") {\n let toolName = \"unknown\";\n // Find the tool name from the corresponding tool call\n for (const msg of messages) {\n if (msg.role === \"assistant\") {\n for (const toolCall of msg.toolCalls ?? []) {\n if (toolCall.id === message.toolCallId) {\n toolName = toolCall.function.name;\n break;\n }\n }\n }\n }\n\n const toolResultPart: ToolResultPart = {\n type: \"tool-result\",\n toolCallId: message.toolCallId,\n toolName: toolName,\n output: {\n type: \"text\",\n value: message.content,\n },\n };\n\n const toolMsg: ToolModelMessage = {\n role: \"tool\",\n content: [toolResultPart],\n };\n result.push(toolMsg);\n }\n }\n\n return result;\n}\n\n/**\n * JSON Schema type definition\n */\ninterface JsonSchema {\n type: \"object\" | \"string\" | \"number\" | \"boolean\" | \"array\";\n description?: string;\n properties?: Record<string, JsonSchema>;\n required?: string[];\n items?: JsonSchema;\n}\n\n/**\n * Converts JSON Schema to Zod schema\n */\nexport function convertJsonSchemaToZodSchema(jsonSchema: JsonSchema, required: boolean): z.ZodSchema {\n if (jsonSchema.type === \"object\") {\n const spec: { [key: string]: z.ZodSchema } = {};\n\n if (!jsonSchema.properties || !Object.keys(jsonSchema.properties).length) {\n return !required ? z.object(spec).optional() : z.object(spec);\n }\n\n for (const [key, value] of Object.entries(jsonSchema.properties)) {\n spec[key] = convertJsonSchemaToZodSchema(value, jsonSchema.required ? jsonSchema.required.includes(key) : false);\n }\n let schema = z.object(spec).describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"string\") {\n let schema = z.string().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"number\") {\n let schema = z.number().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"boolean\") {\n let schema = z.boolean().describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n } else if (jsonSchema.type === \"array\") {\n if (!jsonSchema.items) {\n throw new Error(\"Array type must have items property\");\n }\n let itemSchema = convertJsonSchemaToZodSchema(jsonSchema.items, true);\n let schema = z.array(itemSchema).describe(jsonSchema.description ?? \"\");\n return required ? schema : schema.optional();\n }\n throw new Error(\"Invalid JSON schema\");\n}\n\n/**\n * Converts AG-UI tools to Vercel AI SDK ToolSet\n */\nfunction isJsonSchema(obj: unknown): obj is JsonSchema {\n if (typeof obj !== \"object\" || obj === null) return false;\n const schema = obj as Record<string, unknown>;\n return typeof schema.type === \"string\" && [\"object\", \"string\", \"number\", \"boolean\", \"array\"].includes(schema.type);\n}\n\nexport function convertToolsToVercelAITools(tools: RunAgentInput[\"tools\"]): ToolSet {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: Record<string, any> = {};\n\n for (const tool of tools) {\n if (!isJsonSchema(tool.parameters)) {\n throw new Error(`Invalid JSON schema for tool ${tool.name}`);\n }\n const zodSchema = convertJsonSchemaToZodSchema(tool.parameters, true);\n result[tool.name] = createVercelAISDKTool({\n description: tool.description,\n inputSchema: zodSchema,\n });\n }\n\n return result;\n}\n\n/**\n * Converts ToolDefinition array to Vercel AI SDK ToolSet\n */\nexport function convertToolDefinitionsToVercelAITools(tools: ToolDefinition[]): ToolSet {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: Record<string, any> = {};\n\n for (const tool of tools) {\n result[tool.name] = createVercelAISDKTool({\n description: tool.description,\n inputSchema: tool.parameters,\n execute: tool.execute,\n });\n }\n\n return result;\n}\n\n/**\n * Configuration for BasicAgent\n */\nexport interface BasicAgentConfiguration {\n /**\n * The model to use\n */\n model: BasicAgentModel | LanguageModel;\n /**\n * Maximum number of steps/iterations for tool calling (default: 1)\n */\n maxSteps?: number;\n /**\n * Tool choice setting - how tools are selected for execution (default: \"auto\")\n */\n toolChoice?: ToolChoice<Record<string, unknown>>;\n /**\n * Maximum number of tokens to generate\n */\n maxOutputTokens?: number;\n /**\n * Temperature setting (range depends on provider)\n */\n temperature?: number;\n /**\n * Nucleus sampling (topP)\n */\n topP?: number;\n /**\n * Top K sampling\n */\n topK?: number;\n /**\n * Presence penalty\n */\n presencePenalty?: number;\n /**\n * Frequency penalty\n */\n frequencyPenalty?: number;\n /**\n * Sequences that will stop the generation\n */\n stopSequences?: string[];\n /**\n * Seed for deterministic results\n */\n seed?: number;\n /**\n * Maximum number of retries\n */\n maxRetries?: number;\n /**\n * Prompt for the agent\n */\n prompt?: string;\n /**\n * List of properties that can be overridden by forwardedProps.\n */\n overridableProperties?: OverridableProperty[];\n /**\n * Optional list of MCP server configurations\n */\n mcpServers?: MCPClientConfig[];\n /**\n * Optional tools available to the agent\n */\n tools?: ToolDefinition[];\n}\n\nexport class BasicAgent extends AbstractAgent {\n private abortController?: AbortController;\n\n constructor(private config: BasicAgentConfiguration) {\n super();\n }\n\n /**\n * Check if a property can be overridden by forwardedProps\n */\n canOverride(property: OverridableProperty): boolean {\n return this.config?.overridableProperties?.includes(property) ?? false;\n }\n\n run(input: RunAgentInput): Observable<BaseEvent> {\n return new Observable<BaseEvent>((subscriber) => {\n // Emit RUN_STARTED event\n const startEvent: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(startEvent);\n\n // Resolve the model\n const model = resolveModel(this.config.model);\n\n // Build prompt based on conditions\n let systemPrompt: string | undefined = undefined;\n\n // Check if we should build a prompt:\n // - config.prompt is set, OR\n // - input.context is non-empty, OR\n // - input.state is non-empty and not an empty object\n const hasPrompt = !!this.config.prompt;\n const hasContext = input.context && input.context.length > 0;\n const hasState =\n input.state !== undefined &&\n input.state !== null &&\n !(typeof input.state === \"object\" && Object.keys(input.state).length === 0);\n\n if (hasPrompt || hasContext || hasState) {\n const parts: string[] = [];\n\n // First: the prompt if any\n if (hasPrompt) {\n parts.push(this.config.prompt!);\n }\n\n // Second: context from the application\n if (hasContext) {\n parts.push(\"\\n## Context from the application\\n\");\n for (const ctx of input.context) {\n parts.push(`${ctx.description}:\\n${ctx.value}\\n`);\n }\n }\n\n // Third: state from the application that can be edited\n if (hasState) {\n parts.push(\n \"\\n## Application State\\n\" +\n \"This is state from the application that you can edit by calling AGUISendStateSnapshot or AGUISendStateDelta.\\n\" +\n `\\`\\`\\`json\\n${JSON.stringify(input.state, null, 2)}\\n\\`\\`\\`\\n`,\n );\n }\n\n systemPrompt = parts.join(\"\");\n }\n\n // Convert messages and prepend system message if we have a prompt\n const messages = convertMessagesToVercelAISDKMessages(input.messages);\n if (systemPrompt) {\n messages.unshift({\n role: \"system\",\n content: systemPrompt,\n });\n }\n\n // Merge tools from input and config\n let allTools: ToolSet = convertToolsToVercelAITools(input.tools);\n if (this.config.tools && this.config.tools.length > 0) {\n const configTools = convertToolDefinitionsToVercelAITools(this.config.tools);\n allTools = { ...allTools, ...configTools };\n }\n\n const streamTextParams: Parameters<typeof streamText>[0] = {\n model,\n messages,\n tools: allTools,\n toolChoice: this.config.toolChoice,\n stopWhen: this.config.maxSteps ? stepCountIs(this.config.maxSteps) : undefined,\n maxOutputTokens: this.config.maxOutputTokens,\n temperature: this.config.temperature,\n topP: this.config.topP,\n topK: this.config.topK,\n presencePenalty: this.config.presencePenalty,\n frequencyPenalty: this.config.frequencyPenalty,\n stopSequences: this.config.stopSequences,\n seed: this.config.seed,\n maxRetries: this.config.maxRetries,\n };\n\n // Apply forwardedProps overrides (if allowed)\n if (input.forwardedProps && typeof input.forwardedProps === \"object\") {\n const props = input.forwardedProps as Record<string, unknown>;\n\n // Check and apply each overridable property\n if (props.model !== undefined && this.canOverride(\"model\")) {\n if (typeof props.model === \"string\" || typeof props.model === \"object\") {\n // Accept any string or LanguageModel instance for model override\n streamTextParams.model = resolveModel(props.model as string | LanguageModel);\n }\n }\n if (props.toolChoice !== undefined && this.canOverride(\"toolChoice\")) {\n // ToolChoice can be 'auto', 'required', 'none', or { type: 'tool', toolName: string }\n const toolChoice = props.toolChoice;\n if (\n toolChoice === \"auto\" ||\n toolChoice === \"required\" ||\n toolChoice === \"none\" ||\n (typeof toolChoice === \"object\" &&\n toolChoice !== null &&\n \"type\" in toolChoice &&\n toolChoice.type === \"tool\")\n ) {\n streamTextParams.toolChoice = toolChoice as ToolChoice<Record<string, unknown>>;\n }\n }\n if (typeof props.maxOutputTokens === \"number\" && this.canOverride(\"maxOutputTokens\")) {\n streamTextParams.maxOutputTokens = props.maxOutputTokens;\n }\n if (typeof props.temperature === \"number\" && this.canOverride(\"temperature\")) {\n streamTextParams.temperature = props.temperature;\n }\n if (typeof props.topP === \"number\" && this.canOverride(\"topP\")) {\n streamTextParams.topP = props.topP;\n }\n if (typeof props.topK === \"number\" && this.canOverride(\"topK\")) {\n streamTextParams.topK = props.topK;\n }\n if (typeof props.presencePenalty === \"number\" && this.canOverride(\"presencePenalty\")) {\n streamTextParams.presencePenalty = props.presencePenalty;\n }\n if (typeof props.frequencyPenalty === \"number\" && this.canOverride(\"frequencyPenalty\")) {\n streamTextParams.frequencyPenalty = props.frequencyPenalty;\n }\n if (Array.isArray(props.stopSequences) && this.canOverride(\"stopSequences\")) {\n // Validate all elements are strings\n if (props.stopSequences.every((item): item is string => typeof item === \"string\")) {\n streamTextParams.stopSequences = props.stopSequences;\n }\n }\n if (typeof props.seed === \"number\" && this.canOverride(\"seed\")) {\n streamTextParams.seed = props.seed;\n }\n if (typeof props.maxRetries === \"number\" && this.canOverride(\"maxRetries\")) {\n streamTextParams.maxRetries = props.maxRetries;\n }\n }\n\n // Set up MCP clients if configured and process the stream\n const mcpClients: Array<{ close: () => Promise<void> }> = [];\n\n (async () => {\n const abortController = new AbortController();\n this.abortController = abortController;\n let terminalEventEmitted = false;\n\n try {\n // Add AG-UI state update tools\n streamTextParams.tools = {\n ...streamTextParams.tools,\n AGUISendStateSnapshot: createVercelAISDKTool({\n description: \"Replace the entire application state with a new snapshot\",\n inputSchema: z.object({\n snapshot: z.any().describe(\"The complete new state object\"),\n }),\n execute: async ({ snapshot }) => {\n return { success: true, snapshot };\n },\n }),\n AGUISendStateDelta: createVercelAISDKTool({\n description: \"Apply incremental updates to application state using JSON Patch operations\",\n inputSchema: z.object({\n delta: z\n .array(\n z.object({\n op: z.enum([\"add\", \"replace\", \"remove\"]).describe(\"The operation to perform\"),\n path: z.string().describe(\"JSON Pointer path (e.g., '/foo/bar')\"),\n value: z\n .any()\n .optional()\n .describe(\n \"The value to set. Required for 'add' and 'replace' operations, ignored for 'remove'.\",\n ),\n }),\n )\n .describe(\"Array of JSON Patch operations\"),\n }),\n execute: async ({ delta }) => {\n return { success: true, delta };\n },\n }),\n };\n\n // Initialize MCP clients and get their tools\n if (this.config.mcpServers && this.config.mcpServers.length > 0) {\n for (const serverConfig of this.config.mcpServers) {\n let transport;\n\n if (serverConfig.type === \"http\") {\n const url = new URL(serverConfig.url);\n transport = new StreamableHTTPClientTransport(url, serverConfig.options);\n } else if (serverConfig.type === \"sse\") {\n transport = new SSEClientTransport(new URL(serverConfig.url), serverConfig.headers);\n }\n\n if (transport) {\n const mcpClient = await createMCPClient({ transport });\n mcpClients.push(mcpClient);\n\n // Get tools from this MCP server and merge with existing tools\n const mcpTools = await mcpClient.tools();\n streamTextParams.tools = { ...streamTextParams.tools, ...mcpTools };\n }\n }\n }\n\n // Call streamText and process the stream\n const response = streamText({ ...streamTextParams, abortSignal: abortController.signal });\n\n let messageId = randomUUID();\n\n const toolCallStates = new Map<\n string,\n {\n started: boolean;\n hasArgsDelta: boolean;\n ended: boolean;\n toolName?: string;\n }\n >();\n\n const ensureToolCallState = (toolCallId: string) => {\n let state = toolCallStates.get(toolCallId);\n if (!state) {\n state = { started: false, hasArgsDelta: false, ended: false };\n toolCallStates.set(toolCallId, state);\n }\n return state;\n };\n\n // Process fullStream events\n for await (const part of response.fullStream) {\n switch (part.type) {\n case \"tool-input-start\": {\n const toolCallId = part.id;\n const state = ensureToolCallState(toolCallId);\n state.toolName = part.toolName;\n if (!state.started) {\n state.started = true;\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n parentMessageId: messageId,\n toolCallId,\n toolCallName: part.toolName,\n };\n subscriber.next(startEvent);\n }\n break;\n }\n\n case \"tool-input-delta\": {\n const toolCallId = part.id;\n const state = ensureToolCallState(toolCallId);\n state.hasArgsDelta = true;\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: part.delta,\n };\n subscriber.next(argsEvent);\n break;\n }\n\n case \"tool-input-end\": {\n // No direct event – the subsequent \"tool-call\" part marks completion.\n break;\n }\n\n case \"text-delta\": {\n // Accumulate text content - in AI SDK 5.0, the property is 'text'\n const textDelta = \"text\" in part ? part.text : \"\";\n // Emit text chunk event\n const textEvent: TextMessageChunkEvent = {\n type: EventType.TEXT_MESSAGE_CHUNK,\n role: \"assistant\",\n messageId,\n delta: textDelta,\n };\n subscriber.next(textEvent);\n break;\n }\n\n case \"tool-call\": {\n const toolCallId = part.toolCallId;\n const state = ensureToolCallState(toolCallId);\n state.toolName = part.toolName ?? state.toolName;\n\n if (!state.started) {\n state.started = true;\n const startEvent: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n parentMessageId: messageId,\n toolCallId,\n toolCallName: part.toolName,\n };\n subscriber.next(startEvent);\n }\n\n if (!state.hasArgsDelta && \"input\" in part && part.input !== undefined) {\n let serializedInput = \"\";\n if (typeof part.input === \"string\") {\n serializedInput = part.input;\n } else {\n try {\n serializedInput = JSON.stringify(part.input);\n } catch {\n serializedInput = String(part.input);\n }\n }\n\n if (serializedInput.length > 0) {\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId,\n delta: serializedInput,\n };\n subscriber.next(argsEvent);\n state.hasArgsDelta = true;\n }\n }\n\n if (!state.ended) {\n state.ended = true;\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId,\n };\n subscriber.next(endEvent);\n }\n break;\n }\n\n case \"tool-result\": {\n const toolResult = \"output\" in part ? part.output : null;\n const toolName = \"toolName\" in part ? part.toolName : \"\";\n toolCallStates.delete(part.toolCallId);\n\n // Check if this is a state update tool\n if (toolName === \"AGUISendStateSnapshot\" && toolResult && typeof toolResult === \"object\") {\n // Emit StateSnapshotEvent\n const stateSnapshotEvent: StateSnapshotEvent = {\n type: EventType.STATE_SNAPSHOT,\n snapshot: toolResult.snapshot,\n };\n subscriber.next(stateSnapshotEvent);\n } else if (toolName === \"AGUISendStateDelta\" && toolResult && typeof toolResult === \"object\") {\n // Emit StateDeltaEvent\n const stateDeltaEvent: StateDeltaEvent = {\n type: EventType.STATE_DELTA,\n delta: toolResult.delta,\n };\n subscriber.next(stateDeltaEvent);\n }\n\n // Always emit the tool result event for the LLM\n const resultEvent: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n role: \"tool\",\n messageId: randomUUID(),\n toolCallId: part.toolCallId,\n content: JSON.stringify(toolResult),\n };\n subscriber.next(resultEvent);\n break;\n }\n\n case \"finish\":\n // Emit run finished event\n const finishedEvent: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finishedEvent);\n terminalEventEmitted = true;\n\n // Complete the observable\n subscriber.complete();\n break;\n\n case \"error\": {\n if (abortController.signal.aborted) {\n break;\n }\n const runErrorEvent: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: part.error + \"\",\n };\n subscriber.next(runErrorEvent);\n terminalEventEmitted = true;\n\n // Handle error\n subscriber.error(part.error);\n break;\n }\n }\n }\n\n if (!terminalEventEmitted) {\n if (abortController.signal.aborted) {\n // Let the runner finalize the stream on stop requests so it can\n // inject consistent closing events and a RUN_FINISHED marker.\n } else {\n const finishedEvent: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n threadId: input.threadId,\n runId: input.runId,\n };\n subscriber.next(finishedEvent);\n }\n\n terminalEventEmitted = true;\n subscriber.complete();\n }\n } catch (error) {\n if (abortController.signal.aborted) {\n subscriber.complete();\n } else {\n const runErrorEvent: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: error + \"\",\n };\n subscriber.next(runErrorEvent);\n terminalEventEmitted = true;\n subscriber.error(error);\n }\n } finally {\n this.abortController = undefined;\n await Promise.all(mcpClients.map((client) => client.close()));\n }\n })();\n\n // Cleanup function\n return () => {\n // Cleanup MCP clients if stream is unsubscribed\n Promise.all(mcpClients.map((client) => client.close())).catch(() => {\n // Ignore cleanup errors\n });\n };\n });\n }\n\n clone() {\n return new BasicAgent(this.config);\n }\n\n abortRun(): void {\n this.abortController?.abort();\n }\n}\n"],"mappings":"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","names":["startEvent"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@copilotkitnext/agent",
3
- "version": "0.0.24",
3
+ "version": "0.0.26",
4
4
  "description": "Basic Agent for CopilotKit",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -21,11 +21,11 @@
21
21
  "tsup": "^8.5.0",
22
22
  "typescript": "5.8.2",
23
23
  "vitest": "^3.0.5",
24
- "@copilotkitnext/eslint-config": "0.0.0",
25
- "@copilotkitnext/typescript-config": "0.0.0"
24
+ "@copilotkitnext/typescript-config": "0.0.0",
25
+ "@copilotkitnext/eslint-config": "0.0.0"
26
26
  },
27
27
  "dependencies": {
28
- "@ag-ui/client": "0.0.42-alpha.1",
28
+ "@ag-ui/client": "0.0.42",
29
29
  "@ai-sdk/anthropic": "^2.0.22",
30
30
  "@ai-sdk/google": "^2.0.17",
31
31
  "@ai-sdk/mcp": "^0.0.8",
@@ -331,6 +331,7 @@ describe("BasicAgent", () => {
331
331
  name: "configTool",
332
332
  description: "A config tool",
333
333
  parameters: z.object({ input: z.string() }),
334
+ execute: async () => ({ result: "ok" }),
334
335
  });
335
336
 
336
337
  const agent = new BasicAgent({
@@ -360,6 +361,7 @@ describe("BasicAgent", () => {
360
361
  name: "configTool",
361
362
  description: "From config",
362
363
  parameters: z.object({}),
364
+ execute: async () => ({ result: "ok" }),
363
365
  });
364
366
 
365
367
  const agent = new BasicAgent({
@@ -0,0 +1,449 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { z } from "zod";
3
+ import { BasicAgent, defineTool } from "../index";
4
+ import { EventType, type RunAgentInput } from "@ag-ui/client";
5
+ import { streamText } from "ai";
6
+ import {
7
+ mockStreamTextResponse,
8
+ toolCallStreamingStart,
9
+ toolCall,
10
+ toolResult,
11
+ finish,
12
+ collectEvents,
13
+ } from "./test-helpers";
14
+
15
+ // Mock the ai module
16
+ vi.mock("ai", () => ({
17
+ streamText: vi.fn(),
18
+ tool: vi.fn((config) => config),
19
+ stepCountIs: vi.fn((count: number) => ({ type: "stepCount", count })),
20
+ }));
21
+
22
+ // Mock the SDK clients
23
+ vi.mock("@ai-sdk/openai", () => ({
24
+ createOpenAI: vi.fn(() => (modelId: string) => ({
25
+ modelId,
26
+ provider: "openai",
27
+ })),
28
+ }));
29
+
30
+ describe("Config Tools Server-Side Execution", () => {
31
+ const originalEnv = process.env;
32
+
33
+ beforeEach(() => {
34
+ vi.clearAllMocks();
35
+ process.env = { ...originalEnv };
36
+ process.env.OPENAI_API_KEY = "test-key";
37
+ });
38
+
39
+ afterEach(() => {
40
+ process.env = originalEnv;
41
+ });
42
+
43
+ describe("Tool Definition with Execute", () => {
44
+ it("should pass execute function to streamText tools", async () => {
45
+ const executeFn = vi.fn().mockResolvedValue({ result: "executed" });
46
+
47
+ const weatherTool = defineTool({
48
+ name: "getWeather",
49
+ description: "Get weather for a city",
50
+ parameters: z.object({
51
+ city: z.string().describe("The city name"),
52
+ }),
53
+ execute: executeFn,
54
+ });
55
+
56
+ const agent = new BasicAgent({
57
+ model: "openai/gpt-4o",
58
+ tools: [weatherTool],
59
+ });
60
+
61
+ vi.mocked(streamText).mockReturnValue(
62
+ mockStreamTextResponse([finish()]) as any,
63
+ );
64
+
65
+ const input: RunAgentInput = {
66
+ threadId: "thread1",
67
+ runId: "run1",
68
+ messages: [],
69
+ tools: [],
70
+ context: [],
71
+ state: {},
72
+ };
73
+
74
+ await collectEvents(agent["run"](input));
75
+
76
+ // Verify streamText was called with tools that have execute functions
77
+ const callArgs = vi.mocked(streamText).mock.calls[0][0];
78
+ expect(callArgs.tools).toHaveProperty("getWeather");
79
+ expect(callArgs.tools.getWeather).toHaveProperty("execute");
80
+ expect(typeof callArgs.tools.getWeather.execute).toBe("function");
81
+ });
82
+
83
+ it("should include all tool properties in the Vercel AI SDK tool", async () => {
84
+ const executeFn = vi.fn().mockResolvedValue({ temperature: 72 });
85
+
86
+ const weatherTool = defineTool({
87
+ name: "getWeather",
88
+ description: "Get weather for a city",
89
+ parameters: z.object({
90
+ city: z.string(),
91
+ units: z.enum(["celsius", "fahrenheit"]).optional(),
92
+ }),
93
+ execute: executeFn,
94
+ });
95
+
96
+ const agent = new BasicAgent({
97
+ model: "openai/gpt-4o",
98
+ tools: [weatherTool],
99
+ });
100
+
101
+ vi.mocked(streamText).mockReturnValue(
102
+ mockStreamTextResponse([finish()]) as any,
103
+ );
104
+
105
+ const input: RunAgentInput = {
106
+ threadId: "thread1",
107
+ runId: "run1",
108
+ messages: [],
109
+ tools: [],
110
+ context: [],
111
+ state: {},
112
+ };
113
+
114
+ await collectEvents(agent["run"](input));
115
+
116
+ const callArgs = vi.mocked(streamText).mock.calls[0][0];
117
+ const tool = callArgs.tools.getWeather;
118
+
119
+ expect(tool.description).toBe("Get weather for a city");
120
+ expect(tool.inputSchema).toBeDefined();
121
+ expect(tool.execute).toBe(executeFn);
122
+ });
123
+
124
+ it("should handle multiple config tools with execute functions", async () => {
125
+ const weatherExecute = vi.fn().mockResolvedValue({ temp: 72 });
126
+ const searchExecute = vi.fn().mockResolvedValue({ results: [] });
127
+
128
+ const weatherTool = defineTool({
129
+ name: "getWeather",
130
+ description: "Get weather",
131
+ parameters: z.object({ city: z.string() }),
132
+ execute: weatherExecute,
133
+ });
134
+
135
+ const searchTool = defineTool({
136
+ name: "search",
137
+ description: "Search the web",
138
+ parameters: z.object({ query: z.string() }),
139
+ execute: searchExecute,
140
+ });
141
+
142
+ const agent = new BasicAgent({
143
+ model: "openai/gpt-4o",
144
+ tools: [weatherTool, searchTool],
145
+ });
146
+
147
+ vi.mocked(streamText).mockReturnValue(
148
+ mockStreamTextResponse([finish()]) as any,
149
+ );
150
+
151
+ const input: RunAgentInput = {
152
+ threadId: "thread1",
153
+ runId: "run1",
154
+ messages: [],
155
+ tools: [],
156
+ context: [],
157
+ state: {},
158
+ };
159
+
160
+ await collectEvents(agent["run"](input));
161
+
162
+ const callArgs = vi.mocked(streamText).mock.calls[0][0];
163
+
164
+ expect(callArgs.tools.getWeather.execute).toBe(weatherExecute);
165
+ expect(callArgs.tools.search.execute).toBe(searchExecute);
166
+ });
167
+ });
168
+
169
+ describe("Config Tools vs Input Tools", () => {
170
+ it("config tools should have execute, input tools should not", async () => {
171
+ const configExecute = vi.fn().mockResolvedValue({ result: "server" });
172
+
173
+ const configTool = defineTool({
174
+ name: "serverTool",
175
+ description: "Runs on server",
176
+ parameters: z.object({ data: z.string() }),
177
+ execute: configExecute,
178
+ });
179
+
180
+ const agent = new BasicAgent({
181
+ model: "openai/gpt-4o",
182
+ tools: [configTool],
183
+ });
184
+
185
+ vi.mocked(streamText).mockReturnValue(
186
+ mockStreamTextResponse([finish()]) as any,
187
+ );
188
+
189
+ const input: RunAgentInput = {
190
+ threadId: "thread1",
191
+ runId: "run1",
192
+ messages: [],
193
+ tools: [
194
+ {
195
+ name: "clientTool",
196
+ description: "Runs on client",
197
+ parameters: { type: "object", properties: { input: { type: "string" } } },
198
+ },
199
+ ],
200
+ context: [],
201
+ state: {},
202
+ };
203
+
204
+ await collectEvents(agent["run"](input));
205
+
206
+ const callArgs = vi.mocked(streamText).mock.calls[0][0];
207
+
208
+ // Config tool has execute
209
+ expect(callArgs.tools.serverTool.execute).toBe(configExecute);
210
+
211
+ // Input tool does NOT have execute (client-side execution)
212
+ expect(callArgs.tools.clientTool.execute).toBeUndefined();
213
+ });
214
+ });
215
+
216
+ describe("Execute Function Invocation", () => {
217
+ it("execute function can be called with correct arguments", async () => {
218
+ const executeFn = vi.fn().mockResolvedValue({ weather: "sunny", temp: 72 });
219
+
220
+ const weatherTool = defineTool({
221
+ name: "getWeather",
222
+ description: "Get weather",
223
+ parameters: z.object({
224
+ city: z.string(),
225
+ units: z.enum(["celsius", "fahrenheit"]),
226
+ }),
227
+ execute: executeFn,
228
+ });
229
+
230
+ const agent = new BasicAgent({
231
+ model: "openai/gpt-4o",
232
+ tools: [weatherTool],
233
+ });
234
+
235
+ vi.mocked(streamText).mockReturnValue(
236
+ mockStreamTextResponse([finish()]) as any,
237
+ );
238
+
239
+ const input: RunAgentInput = {
240
+ threadId: "thread1",
241
+ runId: "run1",
242
+ messages: [],
243
+ tools: [],
244
+ context: [],
245
+ state: {},
246
+ };
247
+
248
+ await collectEvents(agent["run"](input));
249
+
250
+ // Get the execute function that was passed to streamText
251
+ const callArgs = vi.mocked(streamText).mock.calls[0][0];
252
+ const passedExecute = callArgs.tools.getWeather.execute;
253
+
254
+ // Manually invoke it to verify it works correctly
255
+ const result = await passedExecute({ city: "New York", units: "fahrenheit" });
256
+
257
+ expect(executeFn).toHaveBeenCalledWith({ city: "New York", units: "fahrenheit" });
258
+ expect(result).toEqual({ weather: "sunny", temp: 72 });
259
+ });
260
+
261
+ it("execute function errors are propagated", async () => {
262
+ const executeFn = vi.fn().mockRejectedValue(new Error("API unavailable"));
263
+
264
+ const failingTool = defineTool({
265
+ name: "failingTool",
266
+ description: "A tool that fails",
267
+ parameters: z.object({}),
268
+ execute: executeFn,
269
+ });
270
+
271
+ const agent = new BasicAgent({
272
+ model: "openai/gpt-4o",
273
+ tools: [failingTool],
274
+ });
275
+
276
+ vi.mocked(streamText).mockReturnValue(
277
+ mockStreamTextResponse([finish()]) as any,
278
+ );
279
+
280
+ const input: RunAgentInput = {
281
+ threadId: "thread1",
282
+ runId: "run1",
283
+ messages: [],
284
+ tools: [],
285
+ context: [],
286
+ state: {},
287
+ };
288
+
289
+ await collectEvents(agent["run"](input));
290
+
291
+ const callArgs = vi.mocked(streamText).mock.calls[0][0];
292
+ const passedExecute = callArgs.tools.failingTool.execute;
293
+
294
+ await expect(passedExecute({})).rejects.toThrow("API unavailable");
295
+ });
296
+ });
297
+
298
+ describe("Built-in State Tools Still Work", () => {
299
+ it("AGUISendStateSnapshot should have execute alongside config tools", async () => {
300
+ const configExecute = vi.fn().mockResolvedValue({});
301
+
302
+ const configTool = defineTool({
303
+ name: "myTool",
304
+ description: "My tool",
305
+ parameters: z.object({}),
306
+ execute: configExecute,
307
+ });
308
+
309
+ const agent = new BasicAgent({
310
+ model: "openai/gpt-4o",
311
+ tools: [configTool],
312
+ });
313
+
314
+ vi.mocked(streamText).mockReturnValue(
315
+ mockStreamTextResponse([finish()]) as any,
316
+ );
317
+
318
+ const input: RunAgentInput = {
319
+ threadId: "thread1",
320
+ runId: "run1",
321
+ messages: [],
322
+ tools: [],
323
+ context: [],
324
+ state: { value: 1 },
325
+ };
326
+
327
+ await collectEvents(agent["run"](input));
328
+
329
+ const callArgs = vi.mocked(streamText).mock.calls[0][0];
330
+
331
+ // Both config tool and state tools should have execute
332
+ expect(callArgs.tools.myTool.execute).toBe(configExecute);
333
+ expect(callArgs.tools.AGUISendStateSnapshot.execute).toBeDefined();
334
+ expect(callArgs.tools.AGUISendStateDelta.execute).toBeDefined();
335
+ });
336
+ });
337
+
338
+ describe("Multi-Step Execution (maxSteps)", () => {
339
+ it("should pass stopWhen with stepCountIs when maxSteps is configured", async () => {
340
+ const executeFn = vi.fn().mockResolvedValue({ result: "ok" });
341
+
342
+ const tool = defineTool({
343
+ name: "myTool",
344
+ description: "My tool",
345
+ parameters: z.object({}),
346
+ execute: executeFn,
347
+ });
348
+
349
+ const agent = new BasicAgent({
350
+ model: "openai/gpt-4o",
351
+ maxSteps: 5,
352
+ tools: [tool],
353
+ });
354
+
355
+ vi.mocked(streamText).mockReturnValue(
356
+ mockStreamTextResponse([finish()]) as any,
357
+ );
358
+
359
+ const input: RunAgentInput = {
360
+ threadId: "thread1",
361
+ runId: "run1",
362
+ messages: [],
363
+ tools: [],
364
+ context: [],
365
+ state: {},
366
+ };
367
+
368
+ await collectEvents(agent["run"](input));
369
+
370
+ const callArgs = vi.mocked(streamText).mock.calls[0][0];
371
+
372
+ // stopWhen should be set with stepCountIs(5)
373
+ expect(callArgs.stopWhen).toEqual({ type: "stepCount", count: 5 });
374
+ });
375
+
376
+ it("should not set stopWhen when maxSteps is not configured", async () => {
377
+ const executeFn = vi.fn().mockResolvedValue({ result: "ok" });
378
+
379
+ const tool = defineTool({
380
+ name: "myTool",
381
+ description: "My tool",
382
+ parameters: z.object({}),
383
+ execute: executeFn,
384
+ });
385
+
386
+ const agent = new BasicAgent({
387
+ model: "openai/gpt-4o",
388
+ // maxSteps not set
389
+ tools: [tool],
390
+ });
391
+
392
+ vi.mocked(streamText).mockReturnValue(
393
+ mockStreamTextResponse([finish()]) as any,
394
+ );
395
+
396
+ const input: RunAgentInput = {
397
+ threadId: "thread1",
398
+ runId: "run1",
399
+ messages: [],
400
+ tools: [],
401
+ context: [],
402
+ state: {},
403
+ };
404
+
405
+ await collectEvents(agent["run"](input));
406
+
407
+ const callArgs = vi.mocked(streamText).mock.calls[0][0];
408
+
409
+ // stopWhen should be undefined (defaults to stepCountIs(1) in SDK)
410
+ expect(callArgs.stopWhen).toBeUndefined();
411
+ });
412
+
413
+ it("should allow high maxSteps for complex tool chains", async () => {
414
+ const executeFn = vi.fn().mockResolvedValue({});
415
+
416
+ const tool = defineTool({
417
+ name: "chainTool",
418
+ description: "Tool for chaining",
419
+ parameters: z.object({}),
420
+ execute: executeFn,
421
+ });
422
+
423
+ const agent = new BasicAgent({
424
+ model: "openai/gpt-4o",
425
+ maxSteps: 10,
426
+ tools: [tool],
427
+ });
428
+
429
+ vi.mocked(streamText).mockReturnValue(
430
+ mockStreamTextResponse([finish()]) as any,
431
+ );
432
+
433
+ const input: RunAgentInput = {
434
+ threadId: "thread1",
435
+ runId: "run1",
436
+ messages: [],
437
+ tools: [],
438
+ context: [],
439
+ state: {},
440
+ };
441
+
442
+ await collectEvents(agent["run"](input));
443
+
444
+ const callArgs = vi.mocked(streamText).mock.calls[0][0];
445
+
446
+ expect(callArgs.stopWhen).toEqual({ type: "stepCount", count: 10 });
447
+ });
448
+ });
449
+ });
package/src/index.ts CHANGED
@@ -28,6 +28,7 @@ import {
28
28
  tool as createVercelAISDKTool,
29
29
  ToolChoice,
30
30
  ToolSet,
31
+ stepCountIs,
31
32
  } from "ai";
32
33
  import { experimental_createMCPClient as createMCPClient } from "@ai-sdk/mcp";
33
34
  import { Observable } from "rxjs";
@@ -41,7 +42,6 @@ import {
41
42
  StreamableHTTPClientTransportOptions,
42
43
  } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
43
44
  import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
44
- import { u } from "vitest/dist/chunks/reporters.d.BFLkQcL6.js";
45
45
 
46
46
  /**
47
47
  * Properties that can be overridden by forwardedProps
@@ -211,6 +211,7 @@ export interface ToolDefinition<TParameters extends z.ZodTypeAny = z.ZodTypeAny>
211
211
  name: string;
212
212
  description: string;
213
213
  parameters: TParameters;
214
+ execute: (args: z.infer<TParameters>) => Promise<unknown>;
214
215
  }
215
216
 
216
217
  /**
@@ -218,17 +219,20 @@ export interface ToolDefinition<TParameters extends z.ZodTypeAny = z.ZodTypeAny>
218
219
  * @param name - The name of the tool
219
220
  * @param description - Description of what the tool does
220
221
  * @param parameters - Zod schema for the tool's input parameters
222
+ * @param execute - Function to execute the tool server-side
221
223
  * @returns Tool definition
222
224
  */
223
225
  export function defineTool<TParameters extends z.ZodTypeAny>(config: {
224
226
  name: string;
225
227
  description: string;
226
228
  parameters: TParameters;
229
+ execute: (args: z.infer<TParameters>) => Promise<unknown>;
227
230
  }): ToolDefinition<TParameters> {
228
231
  return {
229
232
  name: config.name,
230
233
  description: config.description,
231
234
  parameters: config.parameters,
235
+ execute: config.execute,
232
236
  };
233
237
  }
234
238
 
@@ -411,6 +415,7 @@ export function convertToolDefinitionsToVercelAITools(tools: ToolDefinition[]):
411
415
  result[tool.name] = createVercelAISDKTool({
412
416
  description: tool.description,
413
417
  inputSchema: tool.parameters,
418
+ execute: tool.execute,
414
419
  });
415
420
  }
416
421
 
@@ -577,6 +582,7 @@ export class BasicAgent extends AbstractAgent {
577
582
  messages,
578
583
  tools: allTools,
579
584
  toolChoice: this.config.toolChoice,
585
+ stopWhen: this.config.maxSteps ? stepCountIs(this.config.maxSteps) : undefined,
580
586
  maxOutputTokens: this.config.maxOutputTokens,
581
587
  temperature: this.config.temperature,
582
588
  topP: this.config.topP,