Python SDK for Render Workflows
Project description
Render Workflows Python SDK
A Python SDK for defining and executing tasks in the Render Workflows system.
⚠️ Early Access: This SDK is in early access and subject to breaking changes without notice.
Installation
pip install render_sdk
Usage
Defining Tasks
Use the Workflows class to define and register tasks:
from render_sdk import Workflows
app = Workflows()
@app.task
def square(a: int) -> int:
"""Square a number."""
return a * a
@app.task
async def add_squares(a: int, b: int) -> int:
"""Add the squares of two numbers."""
result1 = await square(a)
result2 = await square(b)
return result1 + result2
You can also specify task parameters like retry, timeout, and plan:
from render_sdk import Retry, Workflows
app = Workflows(
default_retry=Retry(max_retries=3, wait_duration_ms=1000),
default_timeout=300,
default_plan="standard",
)
@app.task(timeout=60, plan="starter")
def quick_task(x: int) -> int:
return x + 1
@app.task(retry=Retry(max_retries=5, wait_duration_ms=2000, backoff_scaling=2.0))
def retryable_task(x: int) -> int:
return x * 2
You can combine tasks from multiple modules using Workflows.from_workflows():
from tasks_a import app as app_a
from tasks_b import app as app_b
combined = Workflows.from_workflows(app_a, app_b)
Running the Task Server
For local development, use the Render CLI:
render ea tasks dev -- render-workflows main:app
The render-workflows CLI takes a module:app argument pointing to your Workflows instance. You can also call app.start() directly if needed.
Running Tasks
Use the Render client to run tasks and monitor their status:
from render_sdk import Render
from render_sdk.client import ListTaskRunsParams
from render_sdk.client.errors import TaskRunError
render = Render() # Uses RENDER_API_KEY from environment
# run_task() starts a task and waits for completion in one call.
try:
result = render.workflows.run_task("my-workflow/my-task", [3, 4])
print(result.results)
except TaskRunError as e:
print(f"Task failed: {e}")
# start_task() starts a task without waiting for the result.
task_run = render.workflows.start_task("my-workflow/my-task", [3, 4])
print(f"Task started: {task_run.id}")
# Get task run details by ID
details = render.workflows.get_task_run(task_run.id)
print(f"Status: {details.status}")
# Cancel a running task
render.workflows.cancel_task_run(task_run.id)
# Stream task run events
for event in render.workflows.task_run_events([task_run.id]):
print(f"{event.id} status={event.status}")
# List recent task runs
runs = render.workflows.list_task_runs(ListTaskRunsParams(limit=10))
Async Usage
For async contexts (e.g. FastAPI), use RenderAsync:
import asyncio
from render_sdk import RenderAsync
async def main():
render = RenderAsync()
result = await render.workflows.run_task("my-workflow/my-task", [3, 4])
print(result.results)
# start_task() returns an awaitable task run
task_run = await render.workflows.start_task("my-workflow/my-task", [3, 4])
result = await task_run # wait when ready
# Stream task run events
async for event in render.workflows.task_run_events([task_run.id]):
print(f"{event.id} status={event.status}")
asyncio.run(main())
Object Storage
from render_sdk import Render
render = Render() # Uses RENDER_API_KEY, RENDER_WORKSPACE_ID, RENDER_REGION from environment
# Upload an object (no need to pass owner_id/region when env vars are set)
render.experimental.storage.objects.put(
key="path/to/file.png",
data=b"binary content",
content_type="image/png",
)
# Download
obj = render.experimental.storage.objects.get(key="path/to/file.png")
# List
response = render.experimental.storage.objects.list()
Environment Variables
RENDER_API_KEY- Your Render API key (required)RENDER_WORKSPACE_ID- Default owner ID for object storage (workspace team ID, e.g.tea-xxxxx)RENDER_REGION- Default region for object storage (e.g.oregon,frankfurt)
Features
- REST API Client: Run, monitor, cancel, and list task runs
- Task Definition: Decorator-based task registration with the
Workflowsclass - Server-Sent Events: Real-time streaming of task run events
- Sync & Async: Synchronous
Renderclient (default) and asyncRenderAsyncvariant - Retry Configuration: Configurable retry behavior with exponential backoff
- Subtask Execution: Execute tasks from within other tasks
- Task Composition: Combine tasks from multiple modules with
Workflows.from_workflows() - Object Storage: Experimental object storage API with upload, download, and list
Development
This project uses uv for dependency management and tox for testing across multiple Python versions.
Setup
# Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# Install dependencies
uv sync
# Activate virtual environment
source .venv/bin/activate
Testing
# Run tests
uv run pytest
# Run tests with coverage
uv run tox -e coverage
# Run tests across all Python versions
uv run tox
# Run specific Python version
uv run tox -e py313
Code Quality
# Check formatting and linting
uv run tox -e format
uv run tox -e lint
# Fix formatting issues
uv run tox -e format-fix
uv run tox -e lint-fix
# Run all quality checks
uv run tox -e format,lint
Supported Python Versions
- Python 3.10+
- Tested on Python 3.10, 3.11, 3.12, 3.13, 3.14
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file render_sdk-0.5.0.tar.gz.
File metadata
- Download URL: render_sdk-0.5.0.tar.gz
- Upload date:
- Size: 347.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
418fb80866994ba5247f0c5f12cec66a0711bf07440fd9033458f4f527e354dd
|
|
| MD5 |
3c8f364b6003047f76fdeda18cddc054
|
|
| BLAKE2b-256 |
b865d96bbaec878e30695d05603bb4b9b45ea86821b83d3df16e911cc75ff356
|
File details
Details for the file render_sdk-0.5.0-py3-none-any.whl.
File metadata
- Download URL: render_sdk-0.5.0-py3-none-any.whl
- Upload date:
- Size: 706.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6a20444f06fa764acf9e2ae0ccb52958fc01be2874ecdcdc43ac43855a261ae1
|
|
| MD5 |
71379cbaa63b49fe104f3a371e98934f
|
|
| BLAKE2b-256 |
357c4abd1431f7ce306eb57fbcc6004ff0e6e84ca53ab45f3f7e9b15f6751a49
|