Build durable Python workflows and activities against Durable Workflow Cloud or a self-hosted Server. The SDK uses the same language-neutral runtime protocol as the first-party PHP and Rust SDKs.
pip install durable-workflowPython 3.10 or newer is required.
import asyncio
from uuid import uuid4
from durable_workflow import Client, Worker, workflow, activity
@activity.defn(name="greet")
def greet(name: str) -> str:
return f"hello, {name}"
@workflow.defn(name="greeter")
class GreeterWorkflow:
def run(self, ctx, name):
result = yield ctx.schedule_activity("greet", [name])
return result
async def main():
workflow_id = f"greet-{uuid4().hex}"
async with Client(
"http://server:8080",
token="dev-token-123",
namespace="default",
) as client:
worker = Worker(
client,
task_queue="python-workers",
workflows=[GreeterWorkflow],
activities=[greet],
)
handle = await client.start_workflow(
workflow_type="greeter",
workflow_id=workflow_id,
task_queue="python-workers",
input=["world"],
)
await worker.run_until(workflow_id=workflow_id, timeout=30.0)
result = await client.get_result(handle)
print(result) # "hello, world"
if __name__ == "__main__":
asyncio.run(main())Pass the Server origin to Client without a trailing /api. For Cloud, pass
the complete namespace runtime URL exactly as provisioned. Cloud client and
worker processes use separate runtime credentials:
client = Client(
runtime_url,
control_token=client_token,
worker_token=worker_token,
namespace=namespace,
)Keep the client token in application processes and the worker token in worker processes when deploying them separately.
- Workflows, activities, child workflows, timers, and continue-as-new
- Signals, queries, validated updates, schedules, and message streams
- Activity retries, timeouts, cancellation, and heartbeats
- Deterministic parallel work, side effects, version markers, and sagas
- Replay verification and an in-process workflow test environment
- Avro payloads, external payload storage, metrics, and interceptors
See the capability matrix for the complete cross-SDK contract.
- Python SDK portal and API reference
- Python SDK guide
- Complete SDK reference
- Runnable examples
- Symmetric SDK playground
Use Durable Workflow Cloud
for a managed namespace, or run the published
durableworkflow/server
image yourself. Workflow and activity type names, task queues, and payloads are
portable between both runtime choices.
Stable 2.x SDK releases follow semantic versioning and negotiate runtime
capabilities with Server at startup. Use stable 2.x SDK and Server channels
for new applications. The compatibility guide
documents protocol and upgrade guarantees.
pip install -e '.[dev]'
ruff check src/ tests/
mypy src/durable_workflow/
pytest tests/ -m "not integration"Integration tests use Docker:
docker compose -f docker-compose.test.yml up -d --build --wait
pytest tests/integration/ -v
docker compose -f docker-compose.test.yml down -v