Workflows

Testing & Debugging

Run a workflow straight from the editor — the Test panel's Request, Chat and Test cases tabs, per-node trace inspection, dry runs, and the iterate loop.

You never need to deploy to find out whether a workflow works. The Test button runs the current canvas directly — unsaved changes included — and returns a full execution trace you can inspect node by node: resolved inputs, outputs, rendered prompts, errors, and timing. This page covers the panel, the trace, and the debugging loop.

Open the Test panel

Click Test in the editor header. The editor validates the canvas first — nodes with configuration errors are outlined in red and the panel shows "Your workflow has errors. You need to fix them before saving." until they're fixed.

The panel fills the screen: your workflow graph on the left, and a tabbed pane on the right with three tabs — Request, Chat and Test cases. A Reset button in the header clears the form, attached files, and chat history.

The Test panel with the workflow graph on the left and the Request tab's input form on the right

Test is disabled when the workflow uses end-user requirements: "Testing is not available when workflow nodes use requirements. Deploy the workflow to test with requirements." Requirements are fulfilled per end user, so they only exist on a deployed App.

The Request tab

The form is generated from your Input node's fields — one control per field, exactly what a caller would send. Below the fields:

  • File upload — attach files for workflows whose Input node takes them.
  • Dry run toggle — on by default. The workflow still runs for real, tools included; a dry run deletes afterwards what the run wrote into a vector store — the documents a writer ingested and a collection it created, inside a Sub-workflow node's callee too — so a test leaves no data behind there, and nothing else a node did is undone. Turn it off when you want the writers' data to stay.
  • Run — executes the workflow and streams the run into the trace view.

When the run finishes, a Duration label shows the end-to-end time, and Save run as test case keeps the request together with the output it produced as a test case.

Inspect the trace

After a run, the left side switches from the plain canvas to the execution trace: every node that ran, with its status. Click any node to inspect it on the right:

  • Status and timing — whether the node succeeded, failed, or was skipped, and how long it took.
  • Error banner — for failed nodes, the exact error message.
  • Input / Output — the node's resolved input (after selectors were applied) and its produced output. This is where mapping bugs become obvious: a null where you expected text means a selector matched nothing.
  • Prompt — for LLM and Agent nodes, the final rendered prompt after Jinja templating.
  • Configuration — the configuration values the node ran with.
The test trace with a node selected, showing its status, input, output, and rendered prompt

Reading order for a broken run: find the first failed node, read its error, then check its input — most failures are caused by what arrived, not by the node itself. Walk one node upstream and check its output to see which side of the mapping is wrong.

The Chat tab

For conversational workflows, switch to Chat and talk to the workflow turn by turn instead of composing request payloads. The chat view exercises the same graph with the same trace behind it — use it to feel out agent behavior, then return to Request when you need to inspect a specific exchange.

The Test panel's Chat tab with a conversation against the workflow

The Test cases tab

Saved requests with the output they must produce. Run all replays every case against the canvas and marks each one Passed, Failed (with the mismatches by path) or Error; the By rule view shows which rules of the Decision Tables and Rules nodes on the canvas the cases fired. It is the regression loop for rule-based workflows — see Test cases.

The iterate loop

The panel stays open while you debug, but edits happen on the canvas:

  1. Run on the Request tab.
  2. Find the first failing or surprising node in the trace; read error → input → upstream output.
  3. Close the panel, fix the node (mapping, prompt, configuration), and Test again. Every run uses the canvas as-is — no save required between iterations.
  4. When the run is right, Save to create a version. See Versions and releases.

You can also test previous versions: open one from the version history (read-only preview) and click Test there — useful to confirm whether a regression came from your latest edits.

Test via the API

The same capability is exposed on the management API as a multipart request (authenticate with a Personal Access Token). The editor uses exactly this endpoint:

curl -X POST "https://api.getdynamiq.ai/v1/workflows/test" \
  -H "Authorization: Bearer $DYNAMIQ_PERSONAL_ACCESS_TOKEN" \
  -F 'flow={"id":"<uuid>","nodes":[...your flow JSON...]}' \
  -F 'input={"input":"What can you do?"}' \
  -F 'dry_run=true'
Form fieldTypeDescription
flowJSON string, requiredThe flow definition — id plus the nodes array, as saved by the editor.
inputJSON stringThe workflow input, matching the Input node's fields.
filesfile partsAttachments for file inputs. Repeat the part per file.
dry_runbooleanDelete afterwards what the run wrote into a vector store. Defaults to true.
streambooleanStream execution events back instead of a single response.
last_node_outputbooleanReturn only the final node's output.
error_on_node_failurebooleanTreat any node failure as a request error.

The response includes the run's tracing data — the same structure the trace view renders.

After deployment

Once a workflow is deployed as an App, every production run is recorded with the same per-node trace — see Monitoring, history and traces. The skills transfer directly: a production trace reads exactly like a test trace.

Next steps

On this page