Slack and Teams cards, A2A agents, shared iMessage
New on Keiki, Oct 30 to Nov 8: native Slack Block Kit, Teams Adaptive Card and WhatsApp cards, A2A agents, shared iMessage numbers and Live Activities.

This update covers October 30 to November 8, following our October 29 Changelog. First, the changes you can use from the dashboard. Then, the tools for developers building on Keiki.
What's new
Native Slack, Teams and WhatsApp cards from one spec
Agents can now send structured cards: a title, fields, a table and buttons. The agent writes the card once and Keiki renders it the way each channel expects: Block Kit on Slack, an Adaptive Card on Teams, and reply buttons, a list or a link button on WhatsApp. When someone taps a button, the agent sees who pressed it and what they chose, on all three channels.
There's nothing to turn on. Cards are a built-in tool, offered only in Slack, Teams and WhatsApp conversations. On other channels the agent replies with text instead. Read about native cards, or start with how to add an AI agent to Slack.
Make your agent callable over A2A (Agent2Agent)
Your agent now speaks A2A, the open Agent2Agent protocol. Turn it on and any A2A client can find your agent by its Agent Card and send it messages. Every call is an ordinary turn of your agent, with the same tools and memory, stored, traced and billed like any other conversation.
Open an agent's Channels and select Turn on on the A2A row. It's off by default, and callers need an API key from your organization. Read the A2A launch post.
Put your agent on iMessage with a shared number
You no longer need a dedicated line to try your agent on iMessage. The Channels tab shows a Shared iMessage number with a join code like K-7QF2MD and a Copy link button. The link opens Messages with the code already typed. Once a contact sends it, their later messages on that number reach your agent without the code.
A shared number needs an active plan. The agent only replies to people who texted it first, and contact cards aren't sent from a shared number. When you want your own number, buy a dedicated line. The purchase dialog now asks for a line type, Instant, Standard or On request, instead of a provider. Read about shared numbers, or see how to add iMessage to your AI agent.
Agent updates as iPhone notifications and Live Activities
Keiki Vault can now show your agent's updates as notifications and Live Activities on the Lock Screen and in the Dynamic Island. A check-in that's waiting on an airline, a build that's running, an order on its way: the recipient can follow it without opening the chat.
Connecting is a Face ID tap, not a code. The agent sends a card in Messages; approve it with Face ID and Vault opens straight to that agent's consent. Each agent has its own consent, and a recipient can disconnect an agent any time from Vault. Setting up a new iPhone with the same number works the same way. Updates never approve actions or payments. Set up Keiki Vault or read Introducing Keiki Vault.
Reply to an escalation by email
When your agent escalates by email, your team can reply to the alert email and the reply reaches the customer in their original chat, whether that's iMessage, WhatsApp, Telegram or SMS. Handoff replies on email conversations now reach the customer too, from the dashboard, Slack or email.
Exact STOP opt-outs and consent webhooks
A contact opts out only when they send exactly STOP. Ordinary replies like "cancel", "end" or "stop texting me" no longer opt someone out by accident. A message that is exactly START opts them back in.
To keep your own systems in sync, add an endpoint in Settings → Webhooks and enable Consent change events. Each opt-out and opt-in arrives as a signed webhook, with retries for 72 hours. You can inspect every payload and attempt, and resend a delivery. Read the webhooks guide.
Dashboard improvements
- Conversations is easier to scan. Threads waiting on a person get a blue dot, status shows only when something is off, and every contact carries its channel.
- Logs has a new Turn events row: what came in, each tool the agent used, and how it ended. A failed turn now says "Stopped after 12 seconds" instead of "Completed".
- Add knowledge is one dialog everywhere, and it now takes PDFs and web pages, with drag and drop.
- The model picker fits one model per line, with context size and price lined up.
- A channel that needs fixing shows its steps and a Reconnect button in a popover on its status badge, instead of a red box.
- New workspaces open on a Get started page that walks you from your first agent to a working number, with or without code.
Preview your product as an iMessage agent
Paste your website on the homepage and Keiki builds a preview agent in a real Messages phone. If people use your product themselves, the preview now texts as your product, working on an example account, instead of acting as a help desk. While it builds, you see each step: reading your site, writing its instructions, writing its first text.
More reliable agent behavior
- Agents now see the date each message was sent, so an old "tomorrow is Saturday" isn't read as today.
- Agents stay on the job you gave them. Asked to run pasted code or test their own tools, they say what they can help with instead, and never explain how they run.
- When a person's connected account loses its sign-in, the agent asks them to sign in again instead of treating it as a typo.
- Agents see each connected tool's inputs up front, so they get calls right the first time instead of guessing and retrying.
For developers
Deploy Keiki agents as code with Alchemy
The new @onkeiki/alchemy package lets you declare Keiki agents and channels as Alchemy resources, next to the infrastructure your agent runs on. alchemy deploy creates or updates them, and alchemy destroy removes them. Each stage gets its own agent, and a Worker that moves updates the agent's dispatch URL on the next deploy.
export const Support = KeikiCloudflare.Agent('Support', { worker: Api })
export const Line = Keiki.IMessage('Line', { lines: 1 }).pipe(Layer.provide(Support))Underneath, partner deployments now accept an external harness config, and you can detach one channel without touching the rest of a deployment. Read the Alchemy guide.
Send and receive files from your own agent runtime
Agents running in your own app can now read the files customers send and send their own. Incoming messages list their attachments with a short-lived download link, and you can upload a file of up to 100 MB and send it with send_file. The helpers ship in @onkeiki/channels 0.1.6 as turn.downloadAttachment, turn.uploadFile and turn.sendFile. Read the turn API.
Handle WhatsApp's 24-hour window with return links
Some channels stop accepting messages until the recipient replies, like WhatsApp's 24-hour window. Those refusals now come back as recipient_reply_required, not a generic delivery failure, and they aren't retried.
To bring the person back, ask for a return link with turn.returnLink('Done') or the get_return_link tool. It opens your agent's conversation with a reply already typed, so one tap on Send reopens the chat. Show it on the completion screen of a login or checkout page. Read about return links.
Push Live Activities from your backend
Notifications and Live Activities are also in the cloud client. Call cloud.vault.notify for a one-off update, or cloud.vault.activity.start, update and end for a task with a beginning and an end. Hosted agents get the same as tools: notify, activity_start, activity_update and activity_end. Remote starts need iOS 17.2 or later. Read the Vault guide.
Long streaming turns stay open
Streaming turns on the OpenAI- and Anthropic-compatible endpoints and on A2A now send a heartbeat, so a turn that stays quiet for over a minute, say during a long tool call, isn't cut off. SDKs ignore the heartbeat, so there's nothing to change in your client. For long turns, stream. Read the agent API.
Open the dashboard to try these changes. Plan details and line costs are on the pricing page.
FAQ
Can one AI agent send native cards to Slack, Microsoft Teams and WhatsApp? Yes. On Keiki, the agent writes one card and it renders as Slack Block Kit, a Microsoft Teams Adaptive Card, or WhatsApp reply buttons, a list or a link button. Button taps come back to the agent with who pressed them and what they chose.
How do I make my AI agent callable by other agents? Turn on the A2A channel on your Keiki agent. It publishes an Agent Card that any A2A v1.0 or v0.3 client can discover and call with an API key from your organization.
How do I test an AI agent on iMessage without buying a number? Use a shared iMessage number. Your agent gets a join code, and anyone who texts it to the shared number is routed to your agent from then on. Shared numbers need an active plan.
What does recipient_reply_required mean? The channel won't deliver a message until the recipient replies, as with WhatsApp's 24-hour customer service window. Keiki returns recipient_reply_required instead of a generic delivery failure, so you can send the person a return link.