Test the live runtime.
The assistant embedded here is Flow Support, an AiFlow agent whose knowledge index is AiFlow's own technical manual. It is embedded using the exact same script snippet customers ship to production.
The live widget is active in your browser.
Replaying a real conversation.
The widget is docked in the lower corner
Open it and type, or click the mic to switch to full-duplex WebRTC audio and interrupt the agent mid-sentence.
- Instant WebRTC voice or text with seamless mid-session switching
- Sub-second interruptibility with instantaneous audio playback halt
- Camera and screen sharing frame analysis via Gemini multimodal streaming
- Deterministic knowledge grounding from your own uploaded documents
- Strict domain and CORS origin restriction enforcement
<script
src="https://agents.yourdomain.com/widget/aiflow-widget.js"
data-agent="flow-support"
data-api-base="https://agents.yourdomain.com"
></script>There is no command line tool to install.
Install it
One command provisions Docker, generates a secret, obtains a certificate, creates the first admin, and prints the widget snippet. Run it with --env-help instead of the rest of the flags to see every variable that can go in .env first.
curl -fsSL https://meridflow.com/downloads/install-aiflow.sh | \
sudo bash -s -- \
--version 8.2.0 \
--option caddy \
--license-tier pro \
--license-key AIFLOW1.K1.... \
--api-domain api.yourcompany.com \
--admin-domain admin.yourcompany.com \
--admin-email you@example.com \
--install-dockerOperate it
The operational scripts run inside the backend container. There is no separate command line tool to install or keep in step with the deployment.
# Docker Compose (the first admin is always created as Owner, the most
# privileged role; see the documentation for adding
# others with a specific role once this one can log in).
docker compose exec backend \
python -m scripts.create_admin owner@example.com 'a-strong-password'Create an agent
Everything in the dashboard is also in the API. Authenticate once, then configure agents, knowledge, and tools programmatically.
curl -X POST https://agents.example.com/api/v1/agents \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-d '{
"slug": "support-bot",
"name": "Support Bot",
"voice_name": "Kore",
"base_system_prompt": "You are a support agent for Acme.",
"greeting_instruction": "Greet the caller and ask how you can help."
}'Make it call someone
Post an event from any system that speaks HTTP. Conditions you configure decide whether it becomes a call, a message, or a silent task.
curl -X POST https://agents.example.com/api/v1/agents/1/events \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $EVENTS_KEY" \
-d '{
"event_type": "cart_abandoned",
"payload": {
"phone": "+15555550123",
"cart_value": 240.00,
"items": 3
}
}'
# => 201 {"event_id": 42, "matched": true, "call_ids": [17]}Put it on your site
One script tag. It mounts into a shadow root, so your page styles cannot reach into it and its styles cannot escape.
<script
src="https://agents.example.com/widget/aiflow-widget.js"
data-agent="support-bot"
data-api-base="https://agents.example.com"
data-position="bottom-right"
></script>
Connect it to your other tools
AiFlow is an MCP server as well as a client, so a client such as Claude Desktop can place a call, search a knowledge base, or read back a transcript. Note the trailing slash.
{
"mcpServers": {
"aiflow": {
"url": "https://agents.example.com/api/v1/mcp/",
"headers": {
"Authorization": "Bearer $AIFLOW_API_KEY"
}
}
}
}Let another deployment delegate to this one
Register the remote instance as a parent, child, or peer. Delegation carries a hop count and a trace across the boundary, so a loop is refused rather than forwarded. Enterprise only.
# The remote base URL is validated before it is ever called.
# Binding an api_key_id restricts inbound federated work to that key.
curl -X POST https://agents.example.com/api/v1/federation-links \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Retail brand",
"relationship": "child",
"base_url": "https://agents.retail.example.com",
"enabled": true
}'