Skip to Content
We are live but in Staging 🎉
DSL ReferenceSteps: Core Actions

Steps: Core Actions

Last validated: 2026-05-14

This page covers step primitives that perform actions, assign values, and emit outputs.

do

Executes a tool call.

do "Fetch source data" with llm prompt = "Analyze {project}" system = "You are a research synthesizer." -> source_analysis

Syntax:

do "Label" with tool_name input_name = expr input_name2 = expr on error: retry 3 -- or: on error: fallback other_tool { key = expr } -- or: on error: ignore -> binding_name

Streaming binding is also supported:

do "Stream chunks" with stream_tool query = topic ->> chunk_stream

Notes:

  • Tool name can be identifier or llm.
  • Inputs are free-form key/value expressions.
  • mode = "local" / mode = "cloud" is treated as normal input key.

Error Recovery In do

Supported on error: forms:

do "Primary call" with http_request url = url on error: retry 5 -> result
do "Primary call" with llm prompt = prompt on error: fallback echo { message = "fallback path" } -> result
do "Best effort" with optional_tool payload = data on error: ignore -> maybe_result

let

Assigns expression result into context.

let counter = counter + 1 let is_ready = status == "ready" and retries < 3

emit

Produces final (or intermediate) structured output record for thread results.

emit "Done" status = "ok" summary = report.text

Multiple emit steps are allowed; terminal result shape depends on runtime accumulation behavior and latest outputs.

yield

Emits stream records during execution, typically used with stream schema and pipe/each loops.

yield "Embedding Batch" embedding = embedding.message batch_index = file

Use yield for incremental consumption; use emit for final summary payload.

send

Dispatches payload to a named channel.

send "Notify Ops" via "slack" channel = "#alerts" text = "Pipeline completed"

Syntax:

send "Label" via "channel_name" field = expr field2 = expr

Section Markers

Section separators improve readability and are parsed as section steps:

### Phase 1: Discovery ###

You can use them to make long scripts easier to scan without changing data behavior.

Binding Arrows

Bindings attach step outputs into context.

  • -> name: collect output to variable
  • ->> name: stream-forward binding (supported on do and pipe)

Example:

do "Call API" with http_request url = url -> response