-
Notifications
You must be signed in to change notification settings - Fork 10k
Add release notes for Agents SDK + AI SDK v5 update #24889
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
188fd18
a0e1c32
327bb7e
7b60f59
e5665e1
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,272 @@ | ||
| --- | ||
| title: Agents SDK v0.1.0-beta and workers-ai-provider v2.0.0 add AI SDK v5 support | ||
| description: The latest release updates the Agents SDK with full AI SDK v5 compatibility, updated workers-ai-provider v2.0.0 with enhanced streaming and tool support, seamless legacy message migration, tool confirmation detection, and React hooks for building production-ready AI chat interfaces. | ||
| products: | ||
| - agents | ||
| - workers | ||
| date: 2025-09-04 | ||
| --- | ||
|
|
||
| We've shipped a major release for the [Agents SDK](https://github.com/cloudflare/agents) and [workers-ai-provider](https://github.com/cloudflare/ai), bringing full compatibility with [AI SDK v5](https://ai-sdk.dev/docs/introduction) and introducing automatic message migration that handles all legacy formats transparently. | ||
|
|
||
| This update includes workers-ai-provider v2.0.0 with improved streaming and tool support, tool confirmation detection, enhanced React hooks with automatic tool resolution, improved error handling for streaming responses, and seamless migration utilities that work behind the scenes. | ||
|
|
||
| This makes it ideal for building production AI chat interfaces with Cloudflare Workers AI models, agent workflows, human-in-the-loop systems, or any application requiring reliable message handling across SDK versions — all while maintaining backward compatibility. | ||
|
|
||
| #### useAgentChat(options) | ||
whoiskatrin marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| Creates a new chat interface with enhanced v5 capabilities. | ||
|
|
||
| ```ts | ||
| // Basic chat setup | ||
| const { messages, sendMessage, addToolResult } = useAgentChat({ | ||
| agent, | ||
| experimental_automaticToolResolution: true, | ||
| tools, | ||
| }); | ||
|
|
||
| // With custom tool confirmation | ||
| const chat = useAgentChat({ | ||
| agent, | ||
| experimental_automaticToolResolution: true, | ||
| toolsRequiringConfirmation: ["dangerousOperation"], | ||
whoiskatrin marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| }); | ||
| ``` | ||
|
|
||
| #### Automatic Tool Resolution | ||
|
|
||
| Tools are automatically categorized based on their configuration: | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. link somewhere in here to this? it's once I read ^ that that I understood this, put it in context for me
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. do you think the link in the end isn't visible enough?
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I usually read things starting at the top of the page 😛 😄 dont know that I should expect there to be a link at the bottom, more we can put in context seems helpful to the reader? |
||
|
|
||
| ```ts | ||
| const tools = { | ||
| // Auto-executes (has execute function) | ||
| getLocalTime: { | ||
| description: "Get current local time", | ||
| inputSchema: z.object({}), | ||
| execute: async () => new Date().toLocaleString(), | ||
| }, | ||
|
|
||
| // Requires confirmation (no execute function) | ||
| deleteFile: { | ||
| description: "Delete a file from the system", | ||
| inputSchema: z.object({ | ||
| filename: z.string(), | ||
| }), | ||
| }, | ||
|
|
||
| // Server-executed (no client confirmation) | ||
| analyzeData: { | ||
| description: "Analyze dataset on server", | ||
| inputSchema: z.object({ data: z.array(z.number()) }), | ||
| serverExecuted: true, | ||
| }, | ||
| } satisfies Record<string, AITool>; | ||
| ``` | ||
|
|
||
| #### Message Handling | ||
|
|
||
| Send messages using the new v5 format with parts array: | ||
|
|
||
| ```ts | ||
| // Text message | ||
| sendMessage({ | ||
| role: "user", | ||
| parts: [{ type: "text", text: "Hello, assistant!" }], | ||
| }); | ||
|
|
||
| // Multi-part message with file | ||
| sendMessage({ | ||
| role: "user", | ||
| parts: [ | ||
| { type: "text", text: "Analyze this image:" }, | ||
| { type: "image", image: imageData }, | ||
| ], | ||
| }); | ||
| ``` | ||
|
|
||
| #### Tool Confirmation Detection | ||
|
|
||
| Simplified logic for detecting pending tool confirmations: | ||
|
|
||
| ```ts | ||
| const pendingToolCallConfirmation = messages.some((m) => | ||
| m.parts?.some( | ||
| (part) => isToolUIPart(part) && part.state === "input-available", | ||
| ), | ||
| ); | ||
|
|
||
| // Handle tool confirmation | ||
| if (pendingToolCallConfirmation) { | ||
| await addToolResult({ | ||
| toolCallId: part.toolCallId, | ||
| tool: getToolName(part), | ||
| output: "User approved the action", | ||
| }); | ||
| } | ||
| ``` | ||
|
|
||
| ### Automatic Message Migration | ||
|
|
||
| Seamlessly handle legacy message formats without code changes. | ||
|
|
||
| ```ts | ||
| // All these formats are automatically converted: | ||
|
|
||
| // Legacy v4 string content | ||
| const legacyMessage = { | ||
| role: "user", | ||
| content: "Hello world", | ||
| }; | ||
|
|
||
| // Legacy v4 with tool calls | ||
| const legacyWithTools = { | ||
| role: "assistant", | ||
| content: "", | ||
| toolInvocations: [ | ||
| { | ||
| toolCallId: "123", | ||
| toolName: "weather", | ||
| args: { city: "SF" }, | ||
| state: "result", | ||
| result: "Sunny, 72°F", | ||
| }, | ||
| ], | ||
| }; | ||
|
|
||
| // Automatically becomes v5 format: | ||
| // { | ||
| // role: "assistant", | ||
| // parts: [{ | ||
| // type: "tool-call", | ||
| // toolCallId: "123", | ||
| // toolName: "weather", | ||
| // args: { city: "SF" }, | ||
| // state: "result", | ||
| // result: "Sunny, 72°F" | ||
| // }] | ||
| // } | ||
| ``` | ||
|
|
||
| ### Tool Definition Updates | ||
|
|
||
| Migrate tool definitions to use the new `inputSchema` property. | ||
|
|
||
| ```ts | ||
| // Before (AI SDK v4) | ||
| const tools = { | ||
| weather: { | ||
| description: "Get weather information", | ||
| parameters: z.object({ | ||
| city: z.string(), | ||
| }), | ||
| execute: async (args) => { | ||
| return await getWeather(args.city); | ||
| }, | ||
| }, | ||
| }; | ||
|
|
||
| // After (AI SDK v5) | ||
| const tools = { | ||
| weather: { | ||
| description: "Get weather information", | ||
| inputSchema: z.object({ | ||
| city: z.string(), | ||
| }), | ||
| execute: async (args) => { | ||
| return await getWeather(args.city); | ||
| }, | ||
| }, | ||
| }; | ||
| ``` | ||
|
|
||
| ### Cloudflare Workers AI Integration | ||
|
|
||
| Seamless integration with Cloudflare Workers AI models through the updated workers-ai-provider v2.0.0. | ||
|
|
||
| #### Model Setup with Workers AI | ||
|
|
||
| Use Cloudflare Workers AI models directly in your agent workflows: | ||
|
|
||
| ```ts | ||
| import { createWorkersAI } from "workers-ai-provider"; | ||
| import { useAgentChat } from "agents/ai-react"; | ||
|
|
||
| // Create Workers AI model (v2.0.0 - same API, enhanced v5 internals) | ||
| const model = createWorkersAI({ | ||
| binding: env.AI, | ||
| })("@cf/meta/llama-3.2-3b-instruct"); | ||
|
|
||
| // Use with agent chat | ||
| const { messages, sendMessage } = useAgentChat({ | ||
| agent, | ||
| experimental_automaticToolResolution: true, | ||
| tools, | ||
| }); | ||
| ``` | ||
|
|
||
| #### Enhanced File and Image Support | ||
|
|
||
| Workers AI models now support v5 file handling with automatic conversion: | ||
|
|
||
| ```ts | ||
| // Send images and files to Workers AI models | ||
| sendMessage({ | ||
| role: "user", | ||
| parts: [ | ||
| { type: "text", text: "Analyze this image:" }, | ||
| { | ||
| type: "file", | ||
| data: imageBuffer, | ||
| mediaType: "image/jpeg", | ||
| }, | ||
| ], | ||
| }); | ||
|
|
||
| // Workers AI provider automatically converts to proper format | ||
| ``` | ||
|
|
||
| #### Streaming with Workers AI | ||
|
|
||
| Enhanced streaming support with automatic warning detection: | ||
|
|
||
| ```ts | ||
| // Streaming with Workers AI models | ||
| const result = await streamText({ | ||
| model: createWorkersAI({ binding: env.AI })("@cf/meta/llama-3.2-3b-instruct"), | ||
| messages, | ||
| onChunk: (chunk) => { | ||
| // Enhanced streaming with warning handling | ||
| console.log(chunk); | ||
| }, | ||
| }); | ||
| ``` | ||
|
|
||
| ### Import Updates | ||
|
|
||
| Update your imports to use the new v5 types: | ||
|
|
||
| ```ts | ||
| // Before (AI SDK v4) | ||
| import type { Message } from "ai"; | ||
| import { useChat } from "ai/react"; | ||
|
|
||
| // After (AI SDK v5) | ||
| import type { UIMessage } from "ai"; | ||
| // or alias for compatibility | ||
| import type { UIMessage as Message } from "ai"; | ||
| import { useChat } from "@ai-sdk/react"; | ||
| ``` | ||
|
|
||
| ## Resources | ||
|
|
||
| - [Migration Guide](https://github.com/cloudflare/agents/blob/main/docs/migration-to-ai-sdk-v5.md) - Comprehensive migration documentation | ||
| - [AI SDK v5 Documentation](https://ai-sdk.dev/docs/migration-guides/migration-guide-5-0) - Official AI SDK migration guide | ||
| - [GitHub Issues](https://github.com/cloudflare/agents/issues) - Report bugs or request features | ||
|
|
||
| ## Feedback Welcome | ||
|
|
||
| We'd love your feedback! We're particularly interested in feedback on: | ||
|
|
||
| - **Migration experience** - How smooth was the upgrade process? | ||
| - **Tool confirmation workflow** - Does the new automatic detection work as expected? | ||
| - **Message format handling** - Any edge cases with legacy message conversion? | ||
Uh oh!
There was an error while loading. Please reload this page.