send_ui_<key> tool on the agent node. When the conversation matches the instructions, the agent calls the tool with the message content. Kapso validates it and sends it to the current conversation.
Add a skill
- Open an AI Agent node and go to the Tools tab.
- Under UI Skills, click Add skill.
- Fill in the fields and click Save skill.
- Save the workflow.
The key defaults to a random
skill_... value. The agent sees the tool name, so a descriptive key like choose_service helps.
Use the switch next to a skill to enable or disable it. Disabled skills are not given to the agent. A node can have up to 20 skills.
The Format preview in the dialog is illustrative. The agent writes the real message when it runs.
Message formats
The agent fills in these fields when it calls the tool. If a required field is missing or a limit is exceeded, nothing is sent and the agent gets the error back.
Limits:
bodyandcaption: up to 1,024 characters. Cardbody: up to 160 characters and 2 line breaks.buttonlabels and reply buttontitle: up to 20 characters. List rowtitle: 24. Rowdescription: 72.id: up to 188 characters for buttons and list rows, 256 for carousel cards. IDs must be unique within a message, and so must reply button titles.urlandimage_url: HTTPS only, no credentials in the URL. Up to 2,048 characters, or 256 for a carousel cardurl.latitude: -90 to 90.longitude: -180 to 180.name: up to 256 characters.address: up to 1,024.
Write instructions
The agent sees each skill as a tool described by its name and instructions. When a node has UI skills, Kapso also tells the agent to use them when their instructions apply, not to repeat the message as text, and to treat reply data as customer input. Instructions should say:- When to send the message.
- Where the content comes from. Name the tool that returns the IDs, labels, URLs, image URLs, or coordinates, or write the fixed values. The agent should not make them up.
- What the message says, if the wording matters.
- List: When the customer wants to book, call
list_servicesand offer up to 10 services. Use each service’sidas the row ID and its name as the title. Put the price in the description. - Reply buttons: After summarizing the booking, ask the customer to confirm. Use the buttons
confirm(“Confirm”) andchange(“Change”). - URL button: When
create_payment_linkreturns a link, send it with the button “Pay now”. Never write the URL yourself. - Location: When the customer asks where a store is, call
find_storeand send that store’s coordinates, name, and address. - Request location: When the customer asks for the nearest store and hasn’t shared a location, ask them to share it.
list_services, create_payment_link, and find_store stand for your own function, webhook, or MCP tools.
Selections come back with the IDs the agent sent, so prefer stable IDs from your own data.
Wait for a reply
With Wait for a reply on, a successful send pauses the agent, the same asenter_waiting. Other tool calls from the same model turn don’t run. The customer’s next message resumes the same execution at the same node, with the conversation context intact.
It’s on by default for reply buttons, lists, WhatsApp Flows, location requests, and carousels with replies. With it off, the agent keeps working after the send.
The tool call is the whole message. Text the agent writes alongside it, or later in the same turn, is not sent separately.
What the agent receives
When the node has UI skills, replies that carry structured data reach the agent with a<whatsapp_reply> JSON block after the message text:
If the customer types instead of tapping, the agent gets their text as usual.
WhatsApp Flow skills
Pick the Flow under Published WhatsApp Flow. It must be:- Published and synced in Kapso. Use Sync flows in WhatsApp > Flows to import Flows created elsewhere. See Flows in Kapso.
- On the same WhatsApp Business Account as the conversation’s number. Otherwise the send fails.
flow_action: navigate in published mode, with a new random flow_token on every send.
The agent can prefill the opening screen through data. It only accepts keys declared in that screen’s data, with matching types. Say in the instructions which known values to prefill:
flow_response. See What the agent receives.
If the Flow is unpublished later, or its synced JSON no longer has the opening screen, Kapso leaves the skill out of the agent’s tools.
Test
Open Test workflow and chat with the agent. UI skill messages show up in the test chat. Nothing is sent to WhatsApp.- Click reply buttons, list rows, and carousel replies to answer.
- URL buttons and carousel links open their destination. Images show inline.
- For a Flow, enter the submitted fields as a JSON object, like
{"service_id": "haircut"}, and click Submit form results. - For a location request, enter a latitude and longitude and click Share test location.
<whatsapp_reply> block, like a real reply.
The test chat doesn’t render the real Flow or check that Meta accepts the message. Test Flows on a real phone before going live.
Definition JSON
In workflow definitions (Platform API, ordefinition.json with the CLI), skills live in config.ui_skills on the agent node:
- Up to 20 skills per node. camelCase keys like
componentTypeandwaitForReplyare also accepted. - Saving rejects an enabled skill whose
send_ui_<key>name matches a function, app integration, or webhook tool on the same node. MCP tool names are only known at runtime, so a match there stops the agent with an error naming the tool. Rename the tool or the skill key. - Saving a
flowskill checks that the Flow is published in the project and synced, and thatflow_screenexists. - Skills are kept when you export, import, or duplicate a workflow. A
flowskill imported into another project needs the same Flow published there.
Limitations
- Workflows in observer mode can’t send UI skills.
- The workflow needs a WhatsApp conversation. The tool always sends to the current conversation from its number. It can’t choose another recipient or number.
- Sends follow the same outbound permissions, billing, and 24-hour customer service window as any other non-template message. See Meta message billing.
- When validation or the send fails, the agent gets a tool error and the workflow doesn’t pause.
- Delivery is not exactly-once. Kapso won’t resend a tool call it already recorded as sent, but a failure right after Meta accepts a message can leave the outcome unknown.

