How Wavo works — what it can and can't do
Last updated: May 19, 2026
How Wavo works — what it can and can't do
Wavo orchestrates each turn in three phases: reads conversation history (MAX_HISTORY=20 messages), calls tools to fetch real data or take actions (MAX_TOOL_ROUNDS=5 per turn), then streams response back. Constants verified in apps/backend/src/services/chat/chat.service.ts.
Who is this for
Anyone trying to understand Wavo's capability limits before relying on it for important decisions.
The orchestration loop
For each user message:
1. Load conversation history (last 20 messages of context)
2. Read system prompt: Wavo persona + platform knowledge + project instructions + user preferences + memory facts
3. Pick model (per-session or workspace default)
4. Tool round loop (up to 5 rounds per turn):
a. Model decides: respond directly OR call a tool
b. If tool call: execute tool (read data, take action, or request approval)
c. Tool result fed back into context
d. Loop (until model responds OR MAX_TOOL_ROUNDS=5)
5. Stream final response word-by-word (UIMessage)
6. Extract follow-ups (up to 3, max 80 chars each)
7. Save message + token usage + credits charged
What Wavo CAN do
Read your team's data
Tools fetch live data from your campaigns, audiences, metrics, rules. Always cited (Wavo says "I checked..."). Read-only by default. See ai-104 data grounded.
Query analytics
"What's my ROAS for X?"
"Compare Meta vs Google CPC this month."
"Which adset has worst CPA?"
Tools: get_performance_data, campaign_performance_summary, compare_tracker_meta, get_audience_insights, etc.
Create + manage rules
"Create a rule that pauses adsets with CPA > 30."
"List my active rules."
"Turn off rule X."
Tools: create_automation_rule, list_automation_rules, toggle_automation_rule, update_automation_rule, delete_automation_rule. Most require approval (see ai-105).
Draft + manage campaigns
"Draft a new campaign for ClientA targeting Italy."
"Get my latest campaign draft."
Tools: create_campaign_draft, draft_get, draft_validate, duplicate_entity, update_entity_budget, toggle_entity_status.
Generate creative
"Draft 3 ad copy variants."
"Generate an image of [description]."
"Remove background from this product photo."
Tools: generate_copy, generate_image, generate_video, remove_background, resize_image, analyze_existing_ad, analyze_landing_page.
Search + external info
"Look up best practices for Reels ads in 2026."
Tool: web_search.
Open support tickets
"I'm having trouble with X, can you escalate?"
Tool: create_support_ticket — creates Pylon ticket on your behalf.
What Wavo CANNOT do
Speak back via voice
Voice input is transcribe-only (apps/backend/src/routes/api/chat-voice.route.ts via Whisper). Wavo doesn't generate audio output. No TTS provider wired.
See other teams' data
Hard team isolation via team_id scoping. Wavo cannot see, query, or modify data outside your team.
Bypass approval for HIGH-risk actions
Some actions require explicit user approval:
HIGH risk:
delete_automation_rule,duplicate_entity,update_entity_budgetMEDIUM risk:
create_automation_rule,toggle_automation_rule,update_automation_rule,toggle_entity_statusLOW risk:
create_campaign_draft
Wavo presents an approval card; you click Execute or Reject. Approval cards expire after 30 minutes (ACTION_TTL_MS=1800000). See ai-105.
Expose secrets
Output sanitization (chat-security.ts sanitizeToolOutput()) redacts:
Meta tokens starting with
EAA...JWT tokens
AWS keys starting with
AKIA...Stripe keys
sk_.../pk_...Google API keys
Database connection strings
Both directions: secrets are stripped before being sent to the model AND before being displayed.
Ignore RBAC
Tool-level RBAC via chat-tool-rbac.ts: each tool checks user role. Viewer can't trigger write tools. Mediabuyer can't trigger admin-only actions. Role hierarchy enforced.
Run unbounded tool chains
Hard cap: MAX_TOOL_ROUNDS=5 per user turn. If Wavo needs > 5 tool calls to answer, it'll respond with what it has + recommend a follow-up query.
Keep infinite memory
MAX_HISTORY=20 messages. Older messages drop from context (still saved in DB for audit + review). For long-running projects: use ai-106 projects memory facts (max 20 per project).
Hard constants (verified)
Constant | Value | What it controls |
|---|---|---|
| 20 | Messages in context per turn |
| 5 | Tool calls per turn |
| 3 | Suggested next-question chips |
| 80 chars | Per follow-up text length |
| 20 | Per-project memory facts |
| 20 | Default result rows per tool query |
| 50 | Maximum result rows per tool query |
| 1800000 (30 min) | Approval expiry |
| 300000 (5 min) | Strategic context cache |
| 1.1× | Model cost markup |
| $0.001 | Credit-to-USD rate |
| 10 MB | File upload size cap |
| 25 MB | Voice transcription file cap |
Streaming behavior
Wavo streams responses as UIMessage parts (text, tool calls, follow-ups, structured data). The UI renders incrementally:
First: thinking indicator
Tool calls appear as they execute (with status pending → success / fail)
Final text streams word-by-word
Follow-up chips appear at end
If your connection drops mid-stream: chat-resume.ts reconnects + replays missing parts. No data loss.
Error handling
If a tool fails (API error, permission denied, validation):
Tool output includes error message
Wavo explains what failed + offers alternatives or asks for clarification
Hard failures (model crash, network) surface via
chat-stream-errors.ts→ user-friendly message
Common surprises
"Why did Wavo only check 20 items?" —
DEFAULT_TOOL_LIMIT=20. Ask "show all" or "top 50" to widen."Why did Wavo stop after 5 tool calls?" —
MAX_TOOL_ROUNDS=5cap. Continue with a follow-up question."Why did the approval card disappear?" — 30-min ACTION_TTL expired. Re-trigger the action.
"Why doesn't Wavo remember last week's chat?" —
MAX_HISTORY=20messages; older context drops. Use project memory facts for persistent context.
Related
Data grounded — what Wavo sees
Actions Wavo takes — approval workflow
Privacy + data usage — security + RBAC