Visual agentic workflow builder — design, run, and debug LLM-powered agent pipelines with a drag-and-drop canvas.
- Visual DAG editor — drag LLM, Tool, Condition, and Output nodes onto the canvas, wire them with edges
- Multi-provider LLM — routes to OpenAI (gpt-4o, gpt-4o-mini, etc.) or local Ollama (llama3, qwen2.5, gemma2) based on model name
- Real-time execution — hit Run and watch nodes light up as the DAG executes via SSE streaming
- Tool registry — web search, HTTP requests, code runner, file I/O
- Save & load — persist workflows to SQLite, pick from saved workflows via the modal
┌─────────────────────────────────────────────┐
│ Frontend │
│ SolidJS + @dschz/solid-flow + Tailwind v4 │
│ Vite dev server (:5173) → proxies /api │
└─────────────────┬───────────────────────────┘
│ HTTP + SSE
┌─────────────────▼───────────────────────────┐
│ Backend │
│ FastAPI + SQLAlchemy + aiosqlite │
│ • Workflow CRUD • DAG executor │
│ • LLM router (OpenAI / Ollama) │
│ • Tool registry • SSE execution stream │
│ Uvicorn (:8000) │
└─────────────────┬───────────────────────────┘
│
┌──────▼──────┐
│ SQLite │
│ (default) │
└─────────────┘
- Python 3.12+
- Node.js 20+
- (Optional) OpenAI API key for GPT models
- (Optional) Ollama running locally for local models
cd backend
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# Set your LLM keys (optional — Ollama works without an API key)
export OPENAI_API_KEY=sk-...
python -m uvicorn app.main:app --host 127.0.0.1 --port 8000cd frontend
npm install
npm run dev -- --port 5173 --host 127.0.0.1Open http://localhost:5173 — the frontend proxies /api requests to the backend.
docker compose upBackend on :8000, frontend on :3000.
- Drag nodes from the left palette onto the canvas (LLM Call, Tool, Condition, Output)
- Wire edges by dragging from a node's output handle to another node's input handle
- Edit properties — click a node to configure model, prompt, temperature, tool, etc.
- Save your workflow to the database
- Run — the DAG executor processes nodes in topological order, streaming status updates via SSE
- Monitor execution progress in real-time in the bottom-right Execution panel
Three pre-built workflows are seeded into the database:
| Workflow | Nodes | Description |
|---|---|---|
| Research Agent | LLM → Tool → LLM → Output | Research a topic via web search, then summarize findings |
| Code Reviewer | LLM → Condition → LLM/Output | Analyze code, branch on whether issues were found |
| Data Pipeline | Tool → LLM+LLM → LLM → Output | Fetch data, extract insights + flag anomalies, generate report |
Backend: Python 3.12 · FastAPI · SQLAlchemy 2.0 (async) · aiosqlite · Pydantic v2 · httpx · openai · sse-starlette
Frontend: SolidJS · @dschz/solid-flow (xyflow for Solid) · Tailwind CSS v4 · Vite · TypeScript
Database: SQLite (upgrade path to PostgreSQL)
agentpad/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI app + CORS
│ │ ├── config.py # Settings (DB path, API keys)
│ │ ├── db/
│ │ │ ├── models.py # SQLAlchemy models
│ │ │ └── session.py # Async session factory
│ │ ├── routers/
│ │ │ ├── workflows.py # CRUD endpoints
│ │ │ ├── execute.py # SSE execution stream
│ │ │ └── tools.py # Tool registry
│ │ ├── engine/
│ │ │ ├── dag.py # Topological sort + cycle detection
│ │ │ ├── context.py # Execution context (node I/O passing)
│ │ │ └── executor.py # DAG executor (async generator)
│ │ └── llm/
│ │ ├── router.py # Model → provider routing
│ │ ├── openai_provider.py
│ │ └── ollama_provider.py
│ └── pyproject.toml
├── frontend/
│ ├── src/
│ │ ├── App.tsx
│ │ ├── api/client.ts # Fetch wrapper
│ │ ├── components/
│ │ │ ├── Canvas.tsx # SolidFlow canvas + drag-drop
│ │ │ ├── NodePalette.tsx # Draggable node list
│ │ │ ├── NodeEditor.tsx # Property editor panel
│ │ │ ├── ExecutionMonitor.tsx
│ │ │ ├── Toolbar.tsx
│ │ │ └── WorkflowPicker.tsx # Load modal
│ │ ├── nodes/
│ │ │ ├── LLMNode.tsx
│ │ │ ├── ToolNode.tsx
│ │ │ ├── ConditionNode.tsx
│ │ │ └── OutputNode.tsx
│ │ └── stores/
│ │ ├── workflow.ts # SolidJS reactive store
│ │ └── execution.ts # SSE execution state
│ └── package.json
├── docker-compose.yml
└── LICENSE
MIT
