Add Nodes
Agent
START
END
Loop
Subgraph
Note
Human Input
Agent Tool
Retriever (RAG)
Session Store
Tips
Drag nodes onto canvas.
Click ○ output port
then click input port
to connect.
Click node to edit.
Click edge to label.
Right-click node for more.
`Del` delete selected
`Esc` cancel / deselect
`Ctrl+Z` undo
`Ctrl+Y` redo
`Ctrl+C` copy node
`Ctrl+V` paste node
`Cmd+K` search nodes
`+` / `-` zoom
`Ctrl+0` reset zoom
`Space`+drag pan
`?` help
← Drag a node to start
or ✨ generate with AI
100%
Properties
Select a node or edge
to edit its properties.
Python YAML
▶ Test Run
Output History (0) 💬 AI
Execution steps
selectools builder

### Quick start

1. Drag a node from the left panel onto the canvas
2. Click an output port ○ then click an input port to connect
3. Click a node to edit its name, model, and system prompt
4. Press ▶ Run to test with a message

### Node types

START — Entry point. Every graph needs exactly one.
Receives the initial user message.
Agent — An LLM-powered node.
Configure provider, model, system prompt, and tools. Supports OpenAI, Anthropic, Gemini, Ollama.
Loop — Repeats until an exit condition is met.
Set max iterations as a safety limit. Has two output ports: body (loop continues) and done (exit).
Subgraph — Runs another workflow as a nested step.
Reference any other AgentGraph by name.
Human Input (HITL) — Pauses and waits for approval.
Shows a form with configurable options. Timeout auto-resumes. Each option becomes an output port.
Agent Tool — Wraps another agent as a callable tool.
Use an entire workflow as a tool inside another agent node.
Note — Canvas annotation. Does not execute.
Document your design. Supports Markdown, resizable, collapsible.
END — Exit point. Graph stops here.
Connect any agent to END to terminate the flow.

### Connecting nodes

Click an output port (right side), then an input port (left side)
Click an edge to add a condition label (e.g. approved, retry)
Port colors indicate type — cyan = text, purple = variable/subgraph, amber = HITL option
Incompatible port types are blocked and greyed out
Hover over an edge to preview the last output from that connection

### Header buttons

File ▼New, Load Example, Templates, Import YAML/Python, Watch File
✨ AI Describe a workflow in plain English — AI generates it
Export ▼Python / YAML download, Embed Widget <iframe>, Load Trace
▶ Run Open test panel and send a message to your workflow
▲ Code Expand the code panel — live Python/YAML updates as you build

### Testing & debugging

Output tab Streaming response from the workflow, with tool call trace
History tab All previous runs — search, replay, export as JSONL
AI tab Chat with AI copilot to modify the workflow on the canvas
📊 Timeline Gantt chart with per-node timing, token count, cost on hover
Scrubber Click any step to highlight the node — ▶ to re-run from that point
Right-click a node Re-run in isolation, pin last output, freeze/unfreeze
Freeze node Skips re-execution and reuses cached output — great for debugging
Export → Load Trace Paste `trace_to_json(result.trace)` to replay a production run

### Keyboard shortcuts

Undo / Redo Ctrl+Z / Ctrl+Y
Copy / Paste node Ctrl+C / Ctrl+V
Delete selected Del or Backspace
Cancel / deselect Esc
Search nodes Cmd+K
Zoom in / out+ / -
Reset zoom Ctrl+0
Pan canvas Space + drag or middle mouse
Mouse wheel Zoom toward cursor
Open this help?

### Auth & deployment

Start with token auth `selectools serve --builder --auth-token TOKEN`
Or set environment variable `BUILDER_AUTH_TOKEN=TOKEN`
Or save to dotfile`~/.selectools/auth_token`
Docker Compose `docker-compose up` — see docker-compose.yml
Import Graph
Paste selectools Python (AgentGraph) or YAML (type: graph)
► Wire Output

↻ Re-run in isolation
📌 Pin last output
✕ Close
🔗 Embed This Workflow
Embeds the workflow as a live interactive chat widget. The iframe loads `?embed=1` mode — full chat panel, no editor chrome. Visitors can run the agent directly.
Accent color Position
Welcome message

ⓘ Self-host: `selectools serve --builder --port 8000` — then paste this code in any web page.
📥 Load Production Trace
Paste the JSON output of `trace_to_json(result.trace)` to replay a real run in the scrubber and timeline.
Diff
Before

After

### 📂 Watch Python File

Paste an absolute path to a selectools agent .py file. Canvas updates on every save.