🔧 Workflow Designer

Build AI agent workflows visually with drag-and-drop. No coding required.

Open Workflow Designer

Ctrl+Shift+P → "Agent OS: Open Workflow Designer"

Node Types

Action

Execute operations

🔀 Condition

Branch logic

🔄 Loop

Repeat actions

⚔️ Parallel

Concurrent execution

Action Types

When you place an Action node, configure its type in the properties panel:

TypeDescription
file_readRead a file from disk
file_writeWrite data to a file
http_requestMake HTTP API call
database_queryQuery database
database_writeWrite to database
llm_callCall LLM API
send_emailSend email notification
code_executionExecute code snippet

Building a Workflow

1 Drag nodes from the left panel onto the canvas

2 Connect nodes by dragging from output port (right) to input port (left)

3 Configure nodes by clicking them and editing properties

4 Attach policies to individual nodes for fine-grained control

5 Export code by selecting Python, TypeScript, or Go

Example: Data Processing Pipeline

Build a workflow that reads data, processes with LLM, and writes output:

  1. Drag Action → Set type: file_read
  2. Drag Action → Set type: llm_call
  3. Drag Action → Set type: file_write
  4. Connect: file_read → llm_call → file_write
  5. Attach "strict" policy to file_write
  6. Click "Export" → "Python"

Generated Python Code

from agent_os import KernelSpace, Policy
from agent_os.tools import create_safe_toolkit

kernel = KernelSpace(policy="strict")
toolkit = create_safe_toolkit("standard")

async def file_read(context):
    """Read input file"""
    return await toolkit.file.read(context["input_path"])

async def llm_call(context):
    """Process with LLM"""
    return await toolkit.llm.call(model="gpt-4", prompt=context["data"])

async def file_write(context):
    """Write output file"""
    # Policy: strict
    return await toolkit.file.write("/tmp/output.json", context["result"])

@kernel.register
async def run_workflow(task: str):
    context = {"task": task, "input_path": "/data/input.csv"}
    context["data"] = await file_read(context)
    context["result"] = await llm_call(context)
    await file_write(context)
    return {"status": "success"}

Toolbar Actions

ButtonAction
▶️ SimulateDry-run the workflow
💾 SaveSave workflow to JSON
📂 LoadLoad existing workflow
📤 ExportGenerate code in selected language