Agentic Workflows
Declarative, multi-step tasks that chain AI, tools, the Builder, and browser automation (Playwright + Chrome DevTools) — with verification and audit logs.
Overview
A workflow is a JSON spec with ordered steps. Each step runs a capability and can pass its output to later steps. Runs are persisted with a per-step log so you can audit or replay them. Run workflows from the Workflows page, the CLI (wf run), or the REST API.
Anatomy of a workflow
{
"id": "meeting-to-actions",
"title": "Turn a meeting into actions",
"inputs": { "notes": { "type": "string", "required": true } },
"steps": [
{ "id": "summarise", "type": "ai", "capability": "ai:chat",
"with": { "prompt": "Summarise these notes into actions:\n{{inputs.notes}}" } },
{ "id": "save", "type": "file", "capability": "file:create",
"with": { "file_name": "meeting-actions", "format": "pdf",
"content": "{{steps.summarise.output.text}}" } }
],
"outputs": ["save"]
}Interpolation uses {{inputs.x}} and {{steps.<id>.output...}}. Steps declare an error policy with on_error: stop (default),continue, or retry(n).
Step types
| Type | Purpose |
|---|---|
ai | Call the platform AI (draft, summarise, extract) |
tool | Invoke a product tool (convert, video, image…) |
builder | Create a builder record (guide, Q&A, prompt…) |
http | Outbound HTTP request (domain allow-list enforced) |
browser | Drive headless Chromium via Playwright |
file | Create a verified file (md / pdf / docx) |
data | Charts / visualisations from data |
notify | Notify the user in-app |
branch | Conditional logic |
wait_for_human | Pause for approval, then resume |
Browser automation
The browser step runs a list of actions in headless Chromium and returns results plus evidence (screenshots, console errors, failed requests).
{
"id": "check", "type": "browser", "capability": "browser:run",
"with": { "actions": [
{ "action": "goto", "url": "https://example.com" },
{ "action": "wait_for", "selector": "h1" },
{ "action": "extract", "selector": "h1", "as": "text" },
{ "action": "extract_table", "selector": "table" },
{ "action": "assert_text", "selector": "body", "contains": "Welcome" },
{ "action": "screenshot", "fullPage": true },
{ "action": "pdf", "path": "/tmp/page.pdf" }
] }
}| Action | Description |
|---|---|
goto | Navigate to a URL |
click | Click an element |
type | Fill an input |
select | Choose an option |
extract | Read text/html/attribute |
extract_table | Read a table into rows |
assert_text | Assert the page contains text |
screenshot | Capture a PNG |
record | Record a short clip |
pdf | Export the page to PDF |
Only allow-listed domains can be visited (env WORKFLOW_BROWSER_ALLOWLIST).
Capabilities
Registered capability names (usable via a step's capability field):
ai:chat · ai:image · file:create · file:convert · builder:create
browser:run · http · notify:chat · data:visualization
tool:convert · tool:video:infoRunning from the API / CLI
GET /api/v2/workflows/ # catalogue
GET /api/v2/workflows/{id}/ # spec
POST /api/v2/workflows/{id}/run/ # run { "inputs": {...}, "dry_run": false }
GET /api/v2/workflows/runs/ # recent runs
GET /api/v2/workflows/runs/{run_id}/ # step logcli-anything-thinkflyflow wf list
cli-anything-thinkflyflow wf run weekly-report --input "brief=Shipped X; no blockers"
cli-anything-thinkflyflow wf runs
cli-anything-thinkflyflow wf log <run_id>Safety & permissions
| Control | Behaviour |
|---|---|
| Domain allow-list | Browser and HTTP steps can only reach approved hosts |
| Dry-run | Simulates steps with no side effects |
| Human checkpoints | wait_for_human pauses the run until approved |
| Verification | File steps verify the artefact exists before reporting success |
| Audit | Every run is logged with per-step status and artefacts |
| No payments | Workflows never perform financial transactions |