Deploying a Workflow
Deploying with WorkflowServer
Section titled “Deploying with WorkflowServer”The workflows
library includes a WorkflowServer
class that allows you to easily expose your workflows over an HTTP
API. This provides a flexible way to run and manage workflows from any HTTP-capable client.
Programmatic Usage
Section titled “Programmatic Usage”You can create a server, add your workflows, and run it programmatically. This is useful when you want to embed the workflow server in a larger application.
First, create a Python file (e.g., my_server.py
):
from workflows import Workflow, stepfrom workflows.context import Contextfrom workflows.events import Event, StartEvent, StopEventfrom workflows.server import WorkflowServer
class StreamEvent(Event): sequence: int
# Define a simple workflowclass GreetingWorkflow(Workflow): @step async def greet(self, ctx: Context, ev: StartEvent) -> StopEvent: for i in range(3): ctx.write_event_to_stream(StreamEvent(sequence=i)) await asyncio.sleep(0.3)
name = getattr(ev, "name", "World") return StopEvent(result=f"Hello, {name}!")greet_wf = GreetingWorkflow()
# Create a server instanceserver = WorkflowServer()
# Add the workflow to the serverserver.add_workflow("greet", greet_wf)
# To run the server programmatically (e.g., from your own script)# import asyncio## async def main():# await server.serve(host="0.0.0.0", port=8080)## if __name__ == "__main__":# asyncio.run(main())
Command-Line Interface (CLI)
Section titled “Command-Line Interface (CLI)”The library also provides a convenient CLI to run a server from a file containing a WorkflowServer
instance.
Given the my_server.py
file from the example above, you can start the server with the following command:
python -m workflows.server my_server.py
The server will start on 0.0.0.0:8080
by default. You can configure the host and port using the
WORKFLOWS_PY_SERVER_HOST
and WORKFLOWS_PY_SERVER_PORT
environment variables.
API Endpoints
Section titled “API Endpoints”The WorkflowServer
exposes the following RESTful endpoints:
Method | Path | Description |
---|---|---|
GET | /health | Returns a health check response ({"status": "healthy"} ). |
GET | /workflows | Lists the names of all registered workflows. |
POST | /workflows/{name}/run | Runs the specified workflow synchronously and returns the final result. |
POST | /workflows/{name}/run-nowait | Starts the specified workflow asynchronously and returns a handler_id . |
GET | /results/{handler_id} | Retrieves the result of an asynchronously run workflow. Returns 202 Accepted if still running. |
GET | /events/{handler_id} | Streams all events from a running workflow as newline-delimited JSON (application/x-ndjson ). |
Running a Workflow (/run
)
Section titled “Running a Workflow (/run)”To run a workflow and wait for its completion, send a POST
request to /workflows/{name}/run
.
Request Body:
{ "kwargs": { "a": 5, "b": 10 }}
Successful Response (200 OK
):
{ "result": 15}
Running a Workflow Asynchronously (/run-nowait
)
Section titled “Running a Workflow Asynchronously (/run-nowait)”To start a workflow without waiting for it to finish, use the /run-nowait
endpoint.
Request Body:
{ "kwargs": { "a": 5, "b": 10 }}
Successful Response (200 OK
):
{ "handler_id": "someUniqueId123", "status": "started"}
You can then use the handler_id
to check for the result or stream events.