Skip to main content
Back to how-to guides Use this pattern when a conversation should open with a clear first message before the user asks for help.

Concept

A welcome message is the first assistant message in a session. In ABL, write it in ON_START. The runtime runs ON_START once, when it initializes the session. The user sees the welcome only when both the start type and the channel allow it. A channel that suppresses the welcome still runs the SET and CALL actions in ON_START. The trace shows a dsl_on_start_skipped event. If the agent has a FLOW, the kind of welcome decides what runs next:
  • A top-level RESPOND is a prelude. The runtime sends it, then runs the entry step in the same start.
  • A welcome chosen by BRANCHES owns the startup turn. The entry step does not run during startup.
Keep the entry step waiting for the user. A step that only responds and then moves to COMPLETE ends the session at startup. Use a GATHER step to ask the first question. Keep the welcome short. Name the service and make the first action obvious.

Minimal working example

This agent sends a welcome, then asks for a support topic and waits for the answer.

How it works

The runtime does these steps when it starts the session:
  1. Loads memory and resolves the interaction language.
  2. Runs the SET and CALL actions in ON_START.
  3. Renders the welcome and sends it when the start type and channel allow it.
  4. Writes the welcome to the assistant history, so later turns can see what the user already read.
  5. Runs the entry step.
The entry step asks the first question. Do not repeat the welcome in it. ON_START runs once per session. A second message in the same session does not run it again.

Common variations

Add buttons or rich content

Use FORMATS for rich content and ACTIONS for buttons. RICH_CONTENT is an accepted alias for FORMATS. Each button needs a handler. An ACTION_HANDLERS entry uses the button ID, which is the name after ->. In this example, each handler sets topic and moves to confirm_topic.
Use rich content only when the target channel can render it. For voice output and channel-specific copy, see the channel-specific welcome HowTo.

Send a welcome from an agent with no flow

An agent with no FLOW sends the welcome and then answers each message with reasoning. Use this form when the agent has no fixed first step.

Verification

  1. Open a web debug or Web SDK session. Confirm the welcome appears before you type.
  2. Open the trace. Confirm a dsl_on_start event, then a dsl_respond event with source: on_start.
  3. For a branch welcome, confirm responseSource: on_start_branch on the dsl_respond event.
  4. Send a message through HTTP chat. Confirm the agent answers the message and does not send the welcome.
  5. On a suppressing channel, confirm the trace shows dsl_on_start_skipped with the reason channel_contract_no_on_start_proactive_delivery.
  6. In the buttons example, select each button. Confirm the agent replies with the matching topic.
  7. Send a second message. Confirm the welcome does not repeat.

Production readiness checklist

  • Test the welcome on every channel you deploy. Use the channel table to know which channels suppress it.
  • Keep the welcome short enough for the smallest channel.
  • Include a next step, not only a greeting.
  • Keep the entry step waiting for input with GATHER, or use an agent with no flow.
  • Add an ACTION_HANDLERS entry for every button ID.
  • Keep required setup in SET and CALL, not in the visible text. Suppressing channels and lazy starts drop the text.
  • Confirm the first flow step does not repeat the welcome.

Common mistakes

Troubleshooting