Flows
A flow is the thing you design in Workbench and call from your code. It's a directed graph of nodes wired together by links: inputs enter, data moves through the nodes you've wired, and the flow emits outputs. You build it visually on the canvas at workbench.zerowidth.ai.
The property that makes a flow worth building: its behavior is the contract, and its internals are yours to change. Your integration doesn't change as long as the inputs and outputs stay the same. Swap the model, rewrite a prompt, rewire the middle. That's the whole point of designing behind a flow instead of hard-coding one model call.
What a flow carries
- Metadata — display name, description, tags, and a long-form readme shown on its detail page.
- Nodes — the units of work.
- Links — the wires connecting one node's output port to another's input port.
- Imports — other flows it embeds as pinned, versioned building blocks.
- A stable id — every flow has a
flowUuid, the identifier used across the public API for reading, forking, and running. It's distinct from the id in the editor URL.
Start from a pattern
Most flows don't start from a blank canvas. Workbench offers guided pattern editors — each a focused form for a common shape that generates the graph for you:
- Agent — a chat assistant with a system prompt and optional tools.
- Classifier — sorts an input into one of a fixed set of categories.
- Structurer — extracts structured JSON from unstructured input against a schema.
- Judge — scores an input against a rubric (the shape that powers Caliper evals).
- Interviewer — an objective-driven conversation that gathers information over multiple turns.
- Custom — the full graph editor, every node available. Any pattern can convert to custom to take over the canvas; the conversion is one-way.
Whichever you start with, the result is the same kind of flow, runnable through the same API.
Draft and published versions
A flow has a live draft — the working copy you edit. It changes every time you save, and Workbench keeps a rolling history of snapshots so you can restore an earlier state.
When a behavior is ready to depend on, you publish a version: a named, frozen snapshot. Version labels are free-form text ("1.0.0", "production", "tone-v2"). Re-publishing a label re-points it to the new snapshot.
The publish dialog also shows the flow's eval standing — the latest score when a Caliper eval targets the flow, or a warning when nothing does. Publishing is never blocked; the button just reads "Publish anyway" when the version would ship without receipts.
Where to go next
How you feed a flow and read its results — by key.
ConceptNodesThe building blocks you compose on the canvas.
ReferenceRun a flowExecute a flow from your code.
SDKRun it yourselfExecute a flow in your own infrastructure.