---
description: The Agents SDK v0.5.0 adds per-connection protocol message control for binary clients, built-in retry utilities with exponential backoff, data parts for typed JSON in chat messages, the first stable release of `@cloudflare/ai-chat`, and several developer experience improvements.
title: "Agents SDK v0.5.0: Protocol message control, retry utilities, data parts, and @cloudflare/ai-chat v0.1.0"
image: https://developers.cloudflare.com/changelog/post/2026-02-17-agents-sdk-v0.5.0/og.png?v=6c64d1c721fe1996
---

[Skip to content](#main-content)

[View RSS feeds](https://developers.cloudflare.com/fundamentals/new-features/available-rss-feeds/) [ Subscribe to RSS](https://developers.cloudflare.com/changelog/rss/index.xml)

[Back to all posts](https://developers.cloudflare.com/changelog)

February 17, 2026

## Agents SDK v0.5.0: Protocol message control, retry utilities, data parts, and @cloudflare/ai-chat v0.1.0

[Agents](https://developers.cloudflare.com/agents/) [Workers](https://developers.cloudflare.com/workers/)

Copy as Markdown| [View as Markdown](https://developers.cloudflare.com/changelog/post/2026-02-17-agents-sdk-v0.5.0/index.md)| [Agent setup](https://developers.cloudflare.com/agent-setup/)

The latest release of the [Agents SDK ↗︎](https://github.com/cloudflare/agents) adds built-in retry utilities, per-connection protocol message control, and a fully rewritten `@cloudflare/ai-chat` with data parts, tool approval persistence, and zero breaking changes.

#### Retry utilities

A new `this.retry()` method lets you retry any async operation with exponential backoff and jitter. You can pass an optional `shouldRetry` predicate to bail early on non-retryable errors.

```js
class MyAgent extends Agent {
	async onRequest(request) {
		const data = await this.retry(() => callUnreliableService(), {
			maxAttempts: 4,
			shouldRetry: (err) => !(err instanceof PermanentError),
		});
		return Response.json(data);
	}
}
```

```ts
class MyAgent extends Agent {
	async onRequest(request: Request) {
		const data = await this.retry(() => callUnreliableService(), {
			maxAttempts: 4,
			shouldRetry: (err) => !(err instanceof PermanentError),
		});
		return Response.json(data);
	}
}
```

Retry options are also available per-task on `queue()`, `schedule()`, `scheduleEvery()`, and `addMcpServer()`:

```js
// Per-task retry configuration, persisted in SQLite alongside the task
await this.schedule(
	Date.now() + 60_000,
	"sendReport",
	{ userId: "abc" },
	{
		retry: { maxAttempts: 5 },
	},
);

// Class-level retry defaults
class MyAgent extends Agent {
	static options = {
		retry: { maxAttempts: 3 },
	};
}
```

```ts
// Per-task retry configuration, persisted in SQLite alongside the task
await this.schedule(Date.now() + 60_000, "sendReport", { userId: "abc" }, {
	retry: { maxAttempts: 5 },
});

// Class-level retry defaults
class MyAgent extends Agent {
	static options = {
		retry: { maxAttempts: 3 },
	};
}
```

Retry options are validated eagerly at enqueue/schedule time, and invalid values throw immediately. Internal retries have also been added for workflow operations (`terminateWorkflow`, `pauseWorkflow`, and others) with Durable Object-aware error detection.

#### Per-connection protocol message control

Agents automatically send JSON text frames (identity, state, MCP server lists) to every WebSocket connection. You can now suppress these per-connection for clients that cannot handle them — binary-only devices, MQTT clients, or lightweight embedded systems.

```js
class MyAgent extends Agent {
	shouldSendProtocolMessages(connection, ctx) {
		// Suppress protocol messages for MQTT clients
		const subprotocol = ctx.request.headers.get("Sec-WebSocket-Protocol");
		return subprotocol !== "mqtt";
	}
}
```

```ts
class MyAgent extends Agent {
	shouldSendProtocolMessages(connection: Connection, ctx: ConnectionContext) {
		// Suppress protocol messages for MQTT clients
		const subprotocol = ctx.request.headers.get("Sec-WebSocket-Protocol");
		return subprotocol !== "mqtt";
	}
}
```

Connections with protocol messages disabled still fully participate in RPC and regular messaging. Use `isConnectionProtocolEnabled(connection)` to check a connection's status at any time. The flag persists across Durable Object hibernation.

See [Protocol messages](https://developers.cloudflare.com/agents/runtime/communication/protocol-messages/) for full documentation.

#### `@cloudflare/ai-chat` v0.1.0

The first stable release of `@cloudflare/ai-chat` ships alongside this release with a major refactor of `AIChatAgent` internals — new `ResumableStream` class, WebSocket `ChatTransport`, and simplified SSE parsing — with zero breaking changes. Existing code using `AIChatAgent` and `useAgentChat` works as-is.

Key new features:

- **Data parts** — Attach typed JSON blobs ( `data-*`) to messages alongside text. Supports reconciliation (type+id updates in-place), append, and transient parts (ephemeral via `onData` callback). See [Data parts](https://developers.cloudflare.com/agents/communication-channels/chat/chat-agents/#data-parts).
- **Tool approval persistence** — The `needsApproval` approval UI now survives page refresh and DO hibernation. The streaming message is persisted to SQLite when a tool enters `approval-requested` state.
- **`maxPersistedMessages`** — Cap SQLite message storage with automatic oldest-message deletion.
- **`body` option on `useAgentChat`** — Send custom data with every request (static or dynamic).
- **Incremental persistence** — Hash-based cache to skip redundant SQL writes.
- **Row size guard** — Automatic two-pass compaction when messages approach the SQLite 2 MB limit.
- **`autoContinueAfterToolResult` defaults to `true`** — Client-side tool results and tool approvals now automatically trigger a server continuation, matching server-executed tool behavior. Set `autoContinueAfterToolResult: false` in `useAgentChat` to restore the previous behavior.

Notable bug fixes:

- Resolved stream resumption race conditions
- Resolved an issue where `setMessages` functional updater sent empty arrays
- Resolved an issue where client tool schemas were lost after DO hibernation
- Resolved `InvalidPromptError` after tool approval ( `approval.id` was dropped)
- Resolved an issue where message metadata was not propagated on broadcast/resume paths
- Resolved an issue where `clearAll()` did not clear in-memory chunk buffers
- Resolved an issue where `reasoning-delta` silently dropped data when `reasoning-start` was missed during stream resumption

#### Synchronous queue and schedule getters

`getQueue()`, `getQueues()`, `getSchedule()`, `dequeue()`, `dequeueAll()`, and `dequeueAllByCallback()` were unnecessarily `async` despite only performing synchronous SQL operations. They now return values directly instead of wrapping them in Promises. This is backward compatible — existing code using `await` on these methods will continue to work.

#### Other improvements

- **Fix TypeScript "excessively deep" error** — A depth counter on `CanSerialize` and `IsSerializableParam` types bails out to `true` after 10 levels of recursion, preventing the "Type instantiation is excessively deep" error with deeply nested types like AI SDK `CoreMessage[]`.
- **POST SSE keepalive** — The POST SSE handler now sends `event: ping` every 30 seconds to keep the connection alive, matching the existing GET SSE handler behavior. This prevents POST response streams from being silently dropped by proxies during long-running tool calls.
- **Widened peer dependency ranges** — Peer dependency ranges across packages have been widened to prevent cascading major bumps during 0.x minor releases. `@cloudflare/ai-chat` and `@cloudflare/codemode` are now marked as optional peer dependencies.

#### Upgrade

To update to the latest version:

```sh
npm i agents@latest @cloudflare/ai-chat@latest
```

```json
{"@context":"https://schema.org","@type":"BlogPosting","@id":"https://developers.cloudflare.com/changelog/post/2026-02-17-agents-sdk-v0.5.0/#page","headline":"Agents SDK v0.5.0: Protocol message control, retry utilities, data parts, and @cloudflare/ai-chat v0.1.0","description":"The Agents SDK v0.5.0 adds per-connection protocol message control for binary clients, built-in retry utilities with exponential backoff, data parts for typed JSON in chat messages, the first stable release of @cloudflare/ai-chat, and several developer experience improvements.","url":"https://developers.cloudflare.com/changelog/post/2026-02-17-agents-sdk-v0.5.0/","inLanguage":"en","image":"https://developers.cloudflare.com/changelog/post/2026-02-17-agents-sdk-v0.5.0/og.png?v=6c64d1c721fe1996","dateModified":"2026-02-17","datePublished":"2026-02-17","publisher":{"@type":"Organization","name":"Cloudflare","description":"One platform for your apps, agents, and workforce. Build, secure, and scale without managing infrastructure","url":"https://www.cloudflare.com/","sameAs":["https://github.com/cloudflare","https://www.linkedin.com/company/cloudflare","https://x.com/cloudflare"],"logo":{"@type":"ImageObject","url":"https://developers.cloudflare.com/logo.svg"},"address":{"@type":"PostalAddress","streetAddress":"101 Townsend St","addressLocality":"San Francisco","addressRegion":"CA","postalCode":"94107","addressCountry":"US"},"contactPoint":[{"@type":"ContactPoint","contactType":"Customer Support","url":"https://support.cloudflare.com/","availableLanguage":["English"]},{"@type":"ContactPoint","contactType":"Sales","url":"https://www.cloudflare.com/contact/","availableLanguage":["English"]}]},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"}}
```
