Build Resilient AI Agents with Restate and Google ADK
Restate Team
We're excited to announce that Restate now integrates with Google's Agent Development Kit (ADK), bringing durable execution and built-in resilience to your AI agents.
Google ADK provides a popular framework for building agentic AI applications. With Restate, you get automatic recovery from failures, persistent conversation history, and observable execution, without managing complex retry logic or external state stores.
💡 Useful links:
Why Restate + Google ADK?
AI agents are long-running processes that combine LLM calls with tools and external APIs. They suffer from the same challenges as any other backend system: API rate limits, network timeouts, service outages, and the need to maintain state across requests and time.
Restate makes your agent fault-tolerant by default. If your agent crashes mid-execution or an API call times out, Restate automatically recovers it and continues from where it left off. No progress lost, no duplicate work.
Getting Started
Add the Restate SDK to your ADK project:
uv add restate_sdk[serde]Define your ADK agent and enable the Restate plugin:
agent = Agent(
model="gemini-2.5-flash",
name="weather_agent",
instruction="You are a helpful agent that provides weather updates.",
tools=[get_weather],
)
app = App(name=APP_NAME, root_agent=agent, plugins=[RestatePlugin()])
session_service = InMemorySessionService()
agent_service = restate.Service("WeatherAgent")
@agent_service.handler()
async def run(_ctx: restate.Context, req: Prompt) -> str | None:
await get_or_create_session(session_service, APP_NAME, req.user_id, req.session_id)
runner = Runner(app=app, session_service=session_service)
events = runner.run_async(user_id=req.user_id, session_id=req.session_id, new_message=req.content)
return await parse_response(events)
Invoke your agent and provide a user ID and session ID:
curl localhost:8080/WeatherAgent/run --json '{"content": "What is the weather like in San Francisco?", "user_id": "user-123", "session_id": "session-123"}'
Observe what your agent did in the Restate UI:

All you need for durable agents
Automatic Recovery from Failures
Restate logs every step your agent takes: LLM calls, steps within tool executions, state changes. If something fails, Restate replays the execution log to restore exactly where you were. Your agents become immune to rate limits, network outages, and service restarts.
Stateful Agents with Virtual Objects
Build agents that remember. Restate's Virtual Objects let you create stateful agents keyed by user ID or session ID. Conversation history, user preferences, and agent state persist across interactions without external databases or caching layers:

The agent's state lives in Restate, queryable through the UI, and automatically managed with concurrency control to prevent race conditions.
Human-in-the-Loop Workflows
Real-world agents often need human approval or input. Restate makes this straightforward with durable promises. Your agent can pause execution, wait for human feedback, and automatically resume, even if the service crashes while waiting:
# Create a durable promise for human approval
approval_id, approval_promise = ctx.awakeable(type_hint=str)
# Notify a moderator
await ctx.run_typed("notify moderator", notify_moderator, content=content, approval_id=approval_id)
# Suspend until resolved - crashes won't lose this state
return await approval_promiseObservable by Default
See everything your agents do. Restate traces every LLM call, steps within tool executions, and state change. No instrumentation required. Just open the Restate UI to inspect running agents, debug issues, and understand execution patterns.

Try It Out
Ready to build resilient agents with Google ADK? Check out our interactive tour and integration guide.
Do you like what we are doing? Star the project.
If you need help getting started, reach out to us on Discord or Slack.