When to use it
Support / sales chat
A chat bubble on your marketing site or app that greets visitors, answers
with an AI text agent, and escalates to a human when needed.
One flow, phone + chat
Reuse the announcements, forms, and skill queues you already built for voice.
The step engine is shared; chat is just a text-mode surface over it.
Lead capture
Present a form mid-conversation and block until the visitor returns a
validated result — structured intake without leaving the chat.
Concurrent human agents
One human agent handles several conversations at once from the console,
with skill-based routing and re-offer if they miss one.
Files & reactions
Visitors and agents attach files (images, docs) and react to messages with
emoji or quote-reply. The AI text agent sees uploaded files as context.
Embed the widget
The web component tag is your brand name, lowercased, plus-chat — so the
element you place on the page is <telequick-chat>.
Load the widget script
Add the loader
<script type="module"> from your workspace’s widget URL to
the page <head>. It registers the custom element and defines
<telequick-chat>.Place the element
Drop
<telequick-chat org="…" flow="…"> anywhere in the body. The
widget renders a launcher bubble and, on open, a chat panel.Your workspace / organization id. Scopes the conversation namespace and the
minted token.
The published flow (step-engine graph) that drives the conversation —
announcements, forms, and the queue-to-skill step. Authored in the flow
builder, the same one voice uses.
light, dark, or auto. Cosmetic; does not affect routing.The widget subscribes to exactly one track (
server) and publishes to
one (client). Everything the visitor sees — AI replies, human replies,
system announcements, forms — arrives on that single server subscription, so
the UI never has to reconcile multiple streams. See Tracks.The three tracks
Each conversation is addressed aschat/<org>/<conv> and carries three MoQT
tracks. The split keeps the widget’s job trivial (publish one, subscribe one)
while letting a human agent join without the widget knowing or caring.
| Track | Direction | Who publishes | Who subscribes |
|---|---|---|---|
client | visitor → engine | the widget | the engine |
server | engine → visitor | the engine | the widget (only this one) |
agent | human agent → engine | the agent console | the engine |
agent; the engine relays those envelopes onto
server. That is why the widget only ever needs one subscription — AI-generated
and human-generated replies both surface on server, indistinguishable to the
transport layer and tagged by role in the envelope.
The envelope protocol
Every MoQT object on a chat track is one JSON envelope. This is the wire contract a custom client speaks if you build your own UI over raw MoQT instead of the widget.Envelope version. Currently
1.Monotonic per-track sequence number, for ordering and gap detection.
Millisecond epoch timestamp set by the sender.
One of
message · typing · form · form_result · reaction · event.Who authored it — e.g.
user, agent (AI or human), system.Kind-specific payload — message text, a form schema, a submitted result, or an
event body.
kind | Meaning | Typical data |
|---|---|---|
message | A chat message (optionally with attachments / a quoted reply) | { mid, text, attachments?, reply_to? } |
typing | Typing indicator | { active } |
form | Engine presents a form and awaits a result | a field schema |
form_result | Visitor’s submitted, to-be-validated answers | the field values |
reaction | Add or remove an emoji reaction on a message | { op, emoji, target_mid } |
event | Lifecycle / control signal | e.g. queued, assigned, closed, file uploaded |
Message ids, attachments, and replies
Amessage envelope’s data carries a few more fields beyond text:
An author-owned message id, unique within the conversation. The engine
stamps and relays it. Reactions and quoted replies both address a message by
its
mid.Zero or more attachment metas —
{ id, name, size, mime, url } — for files
sent with this message. An attachment-only message may have empty text. See
File uploads.A quoted reply:
{ mid, preview } pointing at the message being replied to.File uploads
Visitors and agents can attach images and documents to a message. The file bytes travel out-of-band — not through MoQT. You upload the bytes over HTTPS, get back an attachment meta, then publish a normalmessage envelope that
references it.
POST the bytes
Send the raw file bytes to the control-plane API with the session token. The
server enforces an allowed set of MIME types and a max size, and rejects
anything outside them.
Read the attachment meta
The response is the attachment meta — store the whole object; you attach it
to the message verbatim.
GET /v1/chat/attachment/<conv>/<id>/<name>, served from object storage.
On upload the engine emits a
chat.file.uploaded event { role, count } and the
transcript records "[file: <names>]", so an AI text agent has context about
the file even though the bytes never crossed the AI’s text channel.Reactions
Emoji reactions and quoted replies let either side annotate a specific message — addressed by itsmid. A reaction is its
own envelope kind:
add or remove.The emoji being applied.
The
mid of the message being reacted to.chat.reaction
event { role }.
On the widget these work with no code. The built-in UX includes a paperclip
attach button, drag-and-drop, a multi-file picker (with
accept filtering), an
emoji picker, a hover quick-reaction strip, and reaction pills that show counts.
The envelope and upload details above are for custom clients and for
understanding the wire — see Widget & API and
the Cookbook for the how.Same flow engine as voice IVR
Every conversation runs through the same visual flow builder and step engine as voice — you are not learning a second product. The steps you already know from IVR apply directly to text:- Announcements — send a scripted
message(a greeting, business hours, a policy notice). - Waits + queue position — hold the visitor and surface their position while
they wait for an agent, delivered as
eventenvelopes. - Present a form — emit a
formand block on a validatedform_resultbefore continuing (lead capture, structured intake). - Queue to a skill — route the conversation to a skill queue, exactly like an ACD queue on the voice side.
- AI text agent
- Human agent
The conversation is handed to a text conversation DAG — the same agent
runtime as voice, running in text mode instead of speech. It answers,
can call tools, and can itself decide to escalate by queueing to a human
skill.
Honest limits
Related
Widget & API
Embed the widget, configure its attributes, and speak the envelope protocol
from a custom client.
Cookbook
Task snippets: embed on a page, present a form, route to a skill, hand off to
a human.
Recipes
End-to-end: a support widget with AI-to-human handoff and a lead-capture form.
Agent runtime
The same runtime the AI text agent uses — here in text mode.
Human handoff
How escalation to a human works across modalities.
Skill queues (ACD)
The skill-based routing model the queue-to-skill step shares with voice.