@copilotkitnext/agent 0.0.20 → 0.0.21-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
 
2
2
  
3
- > @copilotkitnext/agent@0.0.18 build /Users/mme/Projects/CopilotKit2/main/packages/agent
3
+ > @copilotkitnext/agent@0.0.21-alpha.0 build /Users/mme/Projects/CopilotKit2/main/packages/agent
4
4
  > tsup
5
5
 
6
6
  CLI Building entry: src/index.ts
@@ -11,13 +11,13 @@
11
11
  CLI Cleaning output folder
12
12
  CJS Build start
13
13
  ESM Build start
14
- CJS dist/index.js 22.18 KB
15
- CJS dist/index.js.map 42.55 KB
16
- CJS ⚡️ Build success in 20ms
17
- ESM dist/index.mjs 20.41 KB
18
- ESM dist/index.mjs.map 42.51 KB
19
- ESM ⚡️ Build success in 20ms
14
+ ESM dist/index.mjs 20.82 KB
15
+ ESM dist/index.mjs.map 43.52 KB
16
+ ESM ⚡️ Build success in 13ms
17
+ CJS dist/index.js 22.58 KB
18
+ CJS dist/index.js.map 43.57 KB
19
+ CJS ⚡️ Build success in 13ms
20
20
  DTS Build start
21
- DTS ⚡️ Build success in 2138ms
21
+ DTS ⚡️ Build success in 2087ms
22
22
  DTS dist/index.d.ts 5.89 KB
23
23
  DTS dist/index.d.mts 5.89 KB
@@ -1,26 +1,26 @@
1
1
 
2
2
  
3
- > @copilotkitnext/agent@0.0.13-alpha.1 test /Users/mme/Projects/CopilotKit2/main/packages/agent
3
+ > @copilotkitnext/agent@0.0.20 test /Users/mme/Projects/CopilotKit2/main/packages/agent
4
4
  > vitest run
5
5
 
6
6
  [?25l
7
7
   RUN  v3.2.4 /Users/mme/Projects/CopilotKit2/main/packages/agent
8
8
 
9
9
  [?2026h
10
-  ❯ src/__tests__/property-overrides.test.ts [queued]
10
+  ❯ src/__tests__/state-tools.test.ts [queued]
11
11
 
12
12
   Test Files 0 passed (4)
13
13
   Tests 0 passed (0)
14
-  Start at 12:07:03
15
-  Duration 308ms
14
+  Start at 14:30:13
15
+  Duration 409ms
16
16
  [?2026l[?2026h
17
-  ❯ src/__tests__/property-overrides.test.ts [queued]
17
+  ❯ src/__tests__/basic-agent.test.ts [queued]
18
18
   ❯ src/__tests__/state-tools.test.ts [queued]
19
19
 
20
20
   Test Files 0 passed (4)
21
21
   Tests 0 passed (0)
22
-  Start at 12:07:03
23
-  Duration 525ms
22
+  Start at 14:30:13
23
+  Duration 532ms
24
24
  [?2026l[?2026h
25
25
   ❯ src/__tests__/basic-agent.test.ts [queued]
26
26
   ❯ src/__tests__/property-overrides.test.ts [queued]
@@ -29,51 +29,33 @@
29
29
 
30
30
   Test Files 0 passed (4)
31
31
   Tests 0 passed (0)
32
-  Start at 12:07:03
33
-  Duration 998ms
32
+  Start at 14:30:13
33
+  Duration 982ms
34
34
  [?2026l[?2026h
35
-  ❯ src/__tests__/basic-agent.test.ts [queued]
36
-  ❯ src/__tests__/property-overrides.test.ts 0/21
35
+  ❯ src/__tests__/basic-agent.test.ts 0/14
36
+  ❯ src/__tests__/property-overrides.test.ts [queued]
37
37
   ❯ src/__tests__/state-tools.test.ts [queued]
38
38
   ❯ src/__tests__/utils.test.ts [queued]
39
39
 
40
40
   Test Files 0 passed (4)
41
-  Tests 0 passed (21)
42
-  Start at 12:07:03
43
-  Duration 1.52s
44
- [?2026l[?2026h ✓ src/__tests__/basic-agent.test.ts (14 tests) 14ms
45
- ✓ src/__tests__/property-overrides.test.ts (21 tests) 10ms
46
-
47
-
48
-  ❯ src/__tests__/state-tools.test.ts 0/10
49
-  ❯ src/__tests__/utils.test.ts [queued]
50
-
51
-  Test Files 2 passed (4)
52
-  Tests 35 passed (45)
53
-  Start at 12:07:03
54
-  Duration 1.62s
55
- [?2026l[?2026h ✓ src/__tests__/state-tools.test.ts (10 tests) 50ms
56
-
57
-
58
-  ❯ src/__tests__/utils.test.ts 0/27
59
-
60
-  Test Files 3 passed (4)
61
-  Tests 45 passed (72)
62
-  Start at 12:07:03
63
-  Duration 1.82s
64
- [?2026l[?2026h
41
+  Tests 0 passed (14)
42
+  Start at 14:30:13
43
+  Duration 1.19s
44
+ [?2026l[?2026h ✓ src/__tests__/basic-agent.test.ts (14 tests) 19ms
45
+ ✓ src/__tests__/state-tools.test.ts (10 tests) 9ms
46
+ ✓ src/__tests__/property-overrides.test.ts (21 tests) 11ms
65
47
 
66
48
   ❯ src/__tests__/utils.test.ts 1/27
67
49
 
68
50
   Test Files 3 passed (4)
69
51
   Tests 46 passed (72)
70
-  Start at 12:07:03
71
-  Duration 1.94s
72
- [?2026l ✓ src/__tests__/utils.test.ts (27 tests) 85ms
52
+  Start at 14:30:13
53
+  Duration 1.39s
54
+ [?2026l ✓ src/__tests__/utils.test.ts (27 tests) 28ms
73
55
 
74
56
   Test Files  4 passed (4)
75
57
   Tests  72 passed (72)
76
-  Start at  12:07:03
77
-  Duration  2.01s (transform 988ms, setup 0ms, collect 4.57s, tests 159ms, environment 0ms, prepare 986ms)
58
+  Start at  14:30:13
59
+  Duration  1.61s (transform 723ms, setup 0ms, collect 3.12s, tests 67ms, environment 0ms, prepare 715ms)
78
60
 
79
61
  [?25h
package/dist/index.js CHANGED
@@ -91,6 +91,20 @@ function defineTool(config) {
91
91
  parameters: config.parameters
92
92
  };
93
93
  }
94
+ function flattenUserMessageContent(content) {
95
+ if (!content) {
96
+ return "";
97
+ }
98
+ if (typeof content === "string") {
99
+ return content;
100
+ }
101
+ return content.map((part) => {
102
+ if (part && typeof part === "object" && "type" in part && part.type === "text" && typeof part.text === "string") {
103
+ return part.text;
104
+ }
105
+ return "";
106
+ }).filter((text) => text.length > 0).join("\n");
107
+ }
94
108
  function convertMessagesToVercelAISDKMessages(messages) {
95
109
  const result = [];
96
110
  for (const message of messages) {
@@ -113,7 +127,7 @@ function convertMessagesToVercelAISDKMessages(messages) {
113
127
  } else if (message.role === "user") {
114
128
  const userMsg = {
115
129
  role: "user",
116
- content: message.content || ""
130
+ content: flattenUserMessageContent(message.content)
117
131
  };
118
132
  result.push(userMsg);
119
133
  } else if (message.role === "tool") {
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 experimental_createMCPClient as createMCPClient,\n} from \"ai\";\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\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: 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 protected 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":["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 experimental_createMCPClient as createMCPClient,\n} from \"ai\";\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 protected 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":["createVercelAISDKTool","createMCPClient","startEvent"]}
package/dist/index.mjs CHANGED
@@ -70,6 +70,20 @@ function defineTool(config) {
70
70
  parameters: config.parameters
71
71
  };
72
72
  }
73
+ function flattenUserMessageContent(content) {
74
+ if (!content) {
75
+ return "";
76
+ }
77
+ if (typeof content === "string") {
78
+ return content;
79
+ }
80
+ return content.map((part) => {
81
+ if (part && typeof part === "object" && "type" in part && part.type === "text" && typeof part.text === "string") {
82
+ return part.text;
83
+ }
84
+ return "";
85
+ }).filter((text) => text.length > 0).join("\n");
86
+ }
73
87
  function convertMessagesToVercelAISDKMessages(messages) {
74
88
  const result = [];
75
89
  for (const message of messages) {
@@ -92,7 +106,7 @@ function convertMessagesToVercelAISDKMessages(messages) {
92
106
  } else if (message.role === "user") {
93
107
  const userMsg = {
94
108
  role: "user",
95
- content: message.content || ""
109
+ content: flattenUserMessageContent(message.content)
96
110
  };
97
111
  result.push(userMsg);
98
112
  } else if (message.role === "tool") {
@@ -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 experimental_createMCPClient as createMCPClient,\n} from \"ai\";\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\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: 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 protected 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 experimental_createMCPClient as createMCPClient,\n} from \"ai\";\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 protected 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@copilotkitnext/agent",
3
- "version": "0.0.20",
3
+ "version": "0.0.21-alpha.0",
4
4
  "description": "Basic Agent for CopilotKit",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -25,7 +25,7 @@
25
25
  "@copilotkitnext/typescript-config": "0.0.0"
26
26
  },
27
27
  "dependencies": {
28
- "@ag-ui/client": "0.0.40-alpha.6",
28
+ "@ag-ui/client": "0.0.40-alpha.11",
29
29
  "@ai-sdk/anthropic": "^2.0.22",
30
30
  "@ai-sdk/google": "^2.0.17",
31
31
  "@ai-sdk/openai": "^2.0.42",
package/src/index.ts CHANGED
@@ -232,6 +232,34 @@ export function defineTool<TParameters extends z.ZodTypeAny>(config: {
232
232
  };
233
233
  }
234
234
 
235
+ type AGUIUserMessage = Extract<Message, { role: "user" }>;
236
+
237
+ function flattenUserMessageContent(content?: AGUIUserMessage["content"]): string {
238
+ if (!content) {
239
+ return "";
240
+ }
241
+
242
+ if (typeof content === "string") {
243
+ return content;
244
+ }
245
+
246
+ return content
247
+ .map((part) => {
248
+ if (
249
+ part &&
250
+ typeof part === "object" &&
251
+ "type" in part &&
252
+ (part as { type?: unknown }).type === "text" &&
253
+ typeof (part as { text?: unknown }).text === "string"
254
+ ) {
255
+ return (part as { text: string }).text;
256
+ }
257
+ return "";
258
+ })
259
+ .filter((text) => text.length > 0)
260
+ .join("\n");
261
+ }
262
+
235
263
  /**
236
264
  * Converts AG-UI messages to Vercel AI SDK ModelMessage format
237
265
  */
@@ -260,7 +288,7 @@ export function convertMessagesToVercelAISDKMessages(messages: Message[]): Model
260
288
  } else if (message.role === "user") {
261
289
  const userMsg: UserModelMessage = {
262
290
  role: "user",
263
- content: message.content || "",
291
+ content: flattenUserMessageContent(message.content),
264
292
  };
265
293
  result.push(userMsg);
266
294
  } else if (message.role === "tool") {