The Playground at /app/agents/{id}/playground is a
full sandbox for testing your agent before publishing. Conversations here
are flagged is_playground and never count toward your billing
meter, conversation analytics, or the Inbox.
ecommerce, saas, documentation,
help_center, marketing,
internal_kb, or generic
without mutating the agent's persisted column. Useful for "what would
my agent say if treated as ecommerce vs documentation?".
lang/*.json). Useful for sanity-checking that the
agent answers in the right language and that RTL scripts mirror.
Site type override + reply language + sample prompts. The capability
badges below the site-type select show which rich blocks
(product_card, pricing_card,
case_study_card, escalation_button) the
selected vertical can emit.
Note: not every capability has a widget renderer yet.
Today the widget's RENDERABLE set in
resources/widget/src/core/capabilities.ts only
whitelists ticket_escalation (the
escalation_button block). Other blocks
(product_card, pricing_card,
case_study_card) are emitted by the server when the
LLM asks for them, but the public widget will silently drop
them until their renderer is added to the
RENDERABLE set + a Preact component in
ui/blocks.tsx. The Playground previews them
because it ships every renderer for design purposes — what you
see in Playground may be richer than what your visitors see in
the live widget.
Form-driven editor for the page_context the visitor would
send. Use the
Use template dropdown to drop in a realistic Shopify product page
or Stripe pricing page, then tweak the URL / title / og fields. JSON-LD
accepts pasted JSON.
Read-only inspection of the last turn:
product_card).
All three are session-authenticated and scoped by
AgentPolicy::update:
GET /app/agents/{agent}/playground —
Inertia render with the verticals preview map keyed by slug.
POST /app/agents/{agent}/playground/stream —
SSE stream. Body:
{message, conversation_id?, site_type_override?,
language_override?, page_context?}.
Emits start, retrieval,
prompt, token, block,
tool_call, done events.
POST /app/agents/{agent}/playground/reset —
clears the cached conversation history. Body:
{conversation_id}.