Welcome to the first issue. Every week I read the release notes so you don't have to, and I tell you which ones change how you build agents. Five things this week, one thing to try, and one thing you can ignore.

The theme this week: human approval and control over tools. Four of the five releases below touch it.

Top 5 that matter

1. OpenAI Agents SDK v0.24.0 (Oct 15)

What shipped: MCP tool annotations are now exposed on converted tools, and you can format tool exceptions for the whole run in one place. Fixes include batching conversation session writes so they stay within the API limit, and putting off automatic compaction while approvals are still pending. Why care: If you have human-in-the-loop flows, the compaction fix matters most. Your context won't be compacted out from under a pending approval. Run-wide exception formatting means less error-handling code copied into every tool. Release notes

2. Google ADK v2.12.0 (Oct 13)

What shipped: Google says time to first model request is 40% faster in long sessions. Also new: after_tool_callback, which can intercept and filter tool output before the model sees it; require_confirmation, which asks a human before a workflow node runs; deploys to Agent Engine with custom service accounts; and Python 3.15 support. Why care: after_tool_callback is the right place to strip secrets, personal data and noise out of tool output. Per-node confirmation is approval gating built into the framework, so you don't have to bolt it on. Release notes

3. Cloudflare Agents 0.28 (0.28.0 Oct 9, 0.28.1 Oct 13)

What shipped: Two new tools. browser creates and drives a persistent browser session. web_fetch pulls most document formats and converts them to Markdown. Lifecycle, Scheduler, State, WebSockets and MCPClientManager are now marked stable. In 0.28.1, createAI gained AI Gateway dynamic routes, a zdr gateway option, and the MCP SDK was bumped. Why care: "Stable" is the headline. If you held off building on Cloudflare's scheduling and state APIs because they were experimental, that reason is gone. 0.28.0 notes · 0.28.1 notes

4. Pydantic AI v2.56.0 (Oct 13)

What shipped: SmolSandbox, which runs harness capabilities in a local smolvm microVM. Two new durable-execution backends: PGTaskDurability, built on pgtask, and a Render Workflows integration. Skills can now be layered from project and personal libraries. Also Python 3.15 support. Compatibility note: BrowserUse now runs on the host model by default, and browser-use telemetry is off unless you opt in. Why care: You get a local microVM sandbox and a Postgres-backed option for durable runs, without adding new infrastructure. If you use BrowserUse, read the compatibility note before you upgrade. Release notes

5. Microsoft Agent Framework Python 1.22.0 (Oct 15)

What shipped: The core framework supports Python 3.15, though not every package or extra does yet. The real story is the warning about persisted state: the 1.22 runtime writes records that older runtimes can't read. Why care: This one can break production. Don't run pre-1.22 and 1.22 workers against the same chat-history, session or checkpoint store during a rolling deploy. Don't downgrade after 1.22 has written state unless you've isolated or migrated it. (.NET 1.25.0 also shipped Oct 14. It now automatically rejects tool-approval requests that never get an answer.) Python 1.22.0 notes · .NET 1.25.0 notes

Try this

Catch crashed tools and pause for approval in OpenAI Agents SDK v0.24.0. Two trimmed snippets. Run them inside an async function, or wrap them with asyncio.run.

Install with pip install openai-agents==0.24.0. We tested both snippets with the model mocked, so they ran with no API key and no network calls. Everything else was the real SDK. Without the mock (left out below), the agent uses your normal OpenAI model and API key.

1. A run-wide formatter that catches crashed tools. When a @function_tool raises an exception, the formatter now gets called with kind == "tool_exception" and the original exception in args.error. Return a clean message for the model, or return None to keep the SDK default.

from agents import Agent, Runner, RunConfig, function_tool, ToolErrorFormatterArgs

class PaymentGatewayDown(Exception): pass

@function_tool
def charge_card(amount: int) -> str:
    """Charge a card (amount in cents)."""
    raise PaymentGatewayDown("upstream 503 token=sk-SECRET")  # must not reach the model

def formatter(args: ToolErrorFormatterArgs):
    if args.kind == "tool_exception":
        # Never forward raw exception text; it can contain secrets.
        return f"Tool '{args.tool_name}' failed ({type(args.error).__name__}). Try again later."
    return None  # keep the SDK default for other kinds

agent = Agent(name="Shop", instructions="help", tools=[charge_card])
result = await Runner.run(agent, "buy A1",
                          run_config=RunConfig(tool_error_formatter=formatter))

In our run, the model saw "Tool 'charge_card' failed (PaymentGatewayDown). Try again later." and the secret never reached it. Without a formatter, the model saw the generic "An error occurred while running the tool. Please try again." A tool that ran successfully in the same turn kept its output.

2. Pause for approval, save a checkpoint, resume later.

from agents import Agent, Runner, RunState, function_tool

@function_tool(needs_approval=True)
def delete_file(path: str) -> str:
    """Delete a file."""
    return f"deleted {path}"

@function_tool(needs_approval=True)
def send_email(to: str) -> str:
    """Send an email."""
    return f"emailed {to}"

def make_agent():
    return Agent(name="Ops", instructions="ops", tools=[delete_file, send_email])

result = await Runner.run(make_agent(), "clean up and notify")
saved = result.to_state().to_string()  # store it, e.g. in your DB

# Later, possibly in another process: restore with the same agent definition.
agent = make_agent()
state = await RunState.from_string(agent, saved)
for item in state.get_interruptions():
    if item.tool_name == "delete_file":
        state.approve(item)
    else:
        state.reject(item, rejection_message="Human declined sending email.")
result = await Runner.run(agent, state)

In our run, both calls paused for approval and the checkpoint came to about 12.6k characters. After resuming, the approved call returned "deleted /tmp/x", the rejected one returned "Human declined sending email.", and no approvals were left pending.

Upgrade gotchas: - Approval and resume aren't new in 0.24. This release fixes them: deferred approvals now survive resumes, and compaction waits for pending approvals. - Saved runs now use RunState schema 1.21, which older SDK versions can't read. Don't roll back with checkpoints in flight. - args.error can hold secrets. Clean it before anything reaches the model. - If your existing formatter treats every kind except approval_rejected as "tool not found", crashed tools will now get the wrong message. Handle "tool_exception" explicitly. A per-tool failure_error_function still overrides the run-wide formatter.

Skip the hype

Hermes Agent v0.22.0. The notes lead with huge numbers: about 24,200 commits, about 6,080 merged PRs and about 2,520 contributors since v0.21.0. Commit counts aren't features. Then v0.22.1 was built from the wrong commit and had to be replaced by v0.22.2 within hours. That release has a known issue: sessions created under the 0.22.1 gateway can't be deleted. If you run Hermes, skip 0.22.1. Go straight to 0.22.2, or wait a week. (v0.22.0 notes)

Builder.io Agent-Native. This week's releases are mostly a coordinated patch bump across packages (toolkit 0.209.1). The one change worth knowing: an "Always allow" tool approval now checks a revision, so if the action changes, the user is asked again. That's good hygiene, but not a reason to switch frameworks.

Python 3.15 support everywhere. ADK, Pydantic AI and MS Agent Framework all announced it this week. That's nice, but it doesn't make anyone's agent better. Upgrade on your own schedule.

Claude Code's daily point releases. Six releases in four days, mostly fixes. Update when it suits you; there's nothing here to chase.

"Gemini 4 ran 11 hours unattended on ADK." The runtime is the headline, but only 2 of the 6 changes it proposed were merged. Long autonomy isn't the same as useful output.

Want the template repo, weekly teardowns and early alerts? Signal Pro is $7/mo or $69/yr.

That's the signal. Reply and tell me what broke in your stack this week.

— Mounir

Keep Reading