Skip to main content
What this means in practice: a user is half-way through an upgrade flow. They open the chat bubble and ask β€œhow do I finish this?” Without context, your bot has to ask which page they’re on. With Autoplay wired in, your bot already knows β€” and replies with the specific next click, not a walkthrough of the whole UI. This tutorial shows you exactly how to wire it together using Rasa 3.6 (open-source, self-hosted) and the Autoplay SDK. Everything stays on your infrastructure β€” your activity data, prompts, and LLM keys never leave it. Who this is for:
  • You already have (or are building) a Rasa-based support AI agent for your product.
  • You want it to give answers that adapt to where the user is in the UI, instead of canned responses.
  • You’re comfortable with Python, Docker, and a small FastAPI service.
Tech you’ll use: Rasa 3.6 (Docker), Python 3.10+ (host), PostHog (free tier), the Autoplay event connector (hosted), and any LLM with an async Python client (OpenAI, Anthropic, Gemini, local β€” your choice). SDK primitives you’ll touch: a plain httpx GET against the Autoplay live-activity REST endpoint (no client class to import β€” it’s just a URL, a Bearer token, and product_id/user_id), agent_state.v2.SessionState, ChatContextAssembly, plus (in Step 2) PredicateProactiveTrigger, ProactiveTriggerRegistry, and TourRegistry. The connector is pull-based, so there’s no connection to manage β€” the bridge fetches a user’s recent activity the moment it needs it, and the SDK still handles prompt assembly and FSM transitions.

✨ Final result

Video walkthrough β€” Open on Loom if the player does not load.

πŸ“‹ Prerequisites

Before you start, you need:
  • A web app you can edit β€” anything that can load posthog-js. The examples use Next.js but it works with any frontend.
  • A free PostHog account β€” for click capture. You’ll need your Project API Key (starts with phc_, not phx_ β€” the personal one is rejected by posthog.init()).
  • An Autoplay product ID. If you already use PostHog, you can re-use your PostHog project id (the number after /project/ in the URL) as your product_id. The tutorial covers running onboard_product to mint the rest of the credentials.
  • Docker Desktop β€” Rasa runs in a container; this also sidesteps TensorFlow ABI issues on Apple Silicon.
  • Python 3.10+ on the host β€” for the small FastAPI bridge service.
  • An OpenAI API key (or any LLM provider with an async Python client) β€” the bridge calls it directly with a plain (str) -> str async function, so swap in Anthropic, Gemini, Mistral, or a local model if you prefer.
That’s all the setup. The rest of this tutorial walks through every code file step by step β€” copy-paste runnable.
Why a separate β€œbridge” service? Rasa runs in Docker and can’t import Python objects from your host. The bridge is a small FastAPI service that owns the Autoplay SDK pipeline and exposes a tiny HTTP surface (/reply/{user_id}) that Rasa’s action server calls when a user chats. This same pattern works for any cross-process support AI agent β€” Botpress on-prem, LangChain services, Twilio webhooks β€” not just Rasa.

Architecture

Four processes: your web app, a small Python bridge, Rasa, Rasa’s action server. There is no persistent stream to manage β€” the bridge fetches a user’s recent activity synchronously, at request time, over a stateless REST call. Rasa stays a thin chat surface that calls the bridge over HTTP.

The tutorial

  1. Step 1 β€” Connect real-time events β€” Pull a user’s live activity on demand into a Rasa-aware bridge using the Autoplay SDK’s REST read, expose it to Rasa over HTTP, and wire the chat widget. Reactive answers grounded in real activity. ~45 minutes.
  2. Step 2 β€” Define proactive triggers β€” Make the bot proactive: notice when a user is on the slow path of a workflow and surface a toast with two CTAs β€” Show me (visual tour via Usertour) or Open chat (proactive bot message with an LLM-grounded auto-followup). Uses PredicateProactiveTrigger, agent_state.v2.SessionState, and TourRegistry. ~45 minutes.
Start with Step 1 β€” Step 2 builds directly on the bridge, Rasa, and widget you set up there.