From restatedev
Design, build, run, and test Restate durable services, virtual objects, workflows, and AI agents across TypeScript, Python, Java, and Go. This skill should be used when the user mentions "restate", "durable execution", "virtual object", "restate service", "restate workflow", or "durable agent" or wants to build resilient backend services, AI agents, or workflows with automatic failure recovery. Also use when converting existing applications or migrating from workflow orchestrators to Restate. Use proactively when a project contains restate dependencies in package.json, requirements.txt, pyproject.toml, pom.xml, build.gradle, or go.mod.
npx claudepluginhub restatedev/skills --plugin restatedevThis skill uses the workspace's default tool permissions.
Restate is a durable execution runtime. It records every step of a handler in a journal, so if the process crashes, the handler replays from the journal and resumes exactly where it left off. Services are regular applications using the Restate SDK (TypeScript, Python, Java, Go) that run behind a Restate Server (a single Rust binary on ports 8080 for ingress and 9070 for admin UI).
references/debug-applications.mdreferences/design-and-architecture.mdreferences/go/api-and-pitfalls.mdreferences/invocation-lifecycle.mdreferences/java/api-and-pitfalls.mdreferences/python/api-and-pitfalls.mdreferences/python/restate-google-adk-agents.mdreferences/python/restate-openai-agents-agents.mdreferences/python/restate-pydantic-ai-agents.mdreferences/translate-to-restate.mdreferences/ts/api-and-pitfalls.mdreferences/ts/restate-vercel-ai-agents.mdMandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Restate is a durable execution runtime. It records every step of a handler in a journal, so if the process crashes, the handler replays from the journal and resumes exactly where it left off. Services are regular applications using the Restate SDK (TypeScript, Python, Java, Go) that run behind a Restate Server (a single Rust binary on ports 8080 for ingress and 9070 for admin UI).
Scan the project to determine the SDK and context:
Detect SDK:
package.json with @restatedev/restate-sdk -> TypeScriptrequirements.txt or pyproject.toml with restate-sdk -> Pythonpom.xml or build.gradle with dev.restate -> Javago.mod with github.com/restatedev/sdk-go -> GoDetect existing Restate code: Grep for @restatedev, restate-sdk, dev.restate.sdk, github.com/restatedev
Detect AI frameworks: @ai-sdk/, openai-agents, google-adk, pydantic-ai
Detect workflow orchestrators: temporalio, @temporalio, aws-cdk/aws-stepfunctions, etc.
After detecting the SDK, always load the SDK reference:
references/<sdk>/api-and-pitfalls.md - Setup, API patterns, determinism rules, error handling, and pitfalls for the detected SDK| Context | Reference |
|---|---|
| Design a new application, choose service types | references/design-and-architecture.md |
| Convert from a workflow orchestrator or existing app | references/translate-to-restate.md |
| Invoking services, interacting with invocations (cancel, attach, idempotency, sends, Kafka) | references/invocation-lifecycle.md |
| Build AI agent with Vercel AI SDK | references/ts/restate-vercel-ai-agents.md |
| Build AI agent with OpenAI Agents SDK | references/python/restate-openai-agents-agents.md |
| Build AI agent with Google ADK | references/python/restate-google-adk-agents.md |
| Build AI agent with Pydantic AI | references/python/restate-pydantic-ai-agents.md |
| Debug errors, stuck invocations, journal mismatches | references/debug-applications.md |
| Testing, deployment, server config, Kafka, advanced topics | Use the bundled restate-docs MCP server |
| Code examples and templates | github.com/restatedev/examples, github.com/restatedev/ai-examples |
Before designing any Restate service architecture, check:
| Question | Consult |
|---|---|
| Restate service types, stateful entities, keying, concurrency? | references/design-and-architecture.md |
| Non-Restate orchestrator in the project? | references/translate-to-restate.md |
| Invoking, cancelling, deduplicating, or attaching to invocations? | references/invocation-lifecycle.md |
| Error handling, compensation, sagas? | Error handling guide, Sagas guide |
| AI agent or LLM calls? | The relevant agent integration reference |
All checks below are mandatory.
ctx.run()Promise.all, asyncio.gather/wait, CompletableFuture, goroutines + channels, select)ctx.run()TerminalError raised for non-retryable failuresexcept:Any change to handler business logic (new ctx operations, reordered steps, new ctx.run() blocks, new branches) must be covered by a Testcontainers test with always-replay enabled, and that test must pass before declaring the work done. Always-replay forces every journaled step to replay on every invocation, so non-determinism fails the test instead of failing in production on retry.
alwaysReplay: true in RestateTestEnvironment.startalways_replay=True in restate.test_harnessRESTATE_WORKER__INVOKER__INACTIVITY_TIMEOUT=0m on the Restate containerSee the Testing section of references/<sdk>/api-and-pitfalls.md for the working scaffold.