How Wavo works — what it can and can't do

Wavo orchestrates: history (max 20) → tools (max 15 rounds, 30 calls/session) → streamed response. CAN: query, action, generate. CAN'T: voice TTS, cross-team data.

Written By Salvatore Sinigaglia

Last updated About 4 hours ago

Wavo orchestrates: history (max 20) → tools (max 15 rounds, 30 calls/session) → streamed response. CAN: query, action, generate. CAN'T: voice TTS, cross-team data.

How Wavo works — what it can and can't do

Wavo orchestrates each turn in three phases: reads bounded conversation context plus project/user memory facts, calls tools to fetch real data or take actions (MAX_TOOL_ROUNDS=15 per turn, with a cumulative MAX_TOOL_CALLS_TOTAL=30 per session), then streams response back. Verify exact context limits in apps/backend/src/services/chat/chat.service.ts and apps/backend/src/lib/wavo-config-defaults.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 bounded conversation context and saved memory facts2. Read system prompt: Wavo persona + platform knowledge + project instructions + user preferences + memory facts3. Pick model (per-session or workspace default)4. Tool round loop (up to 15 rounds per turn, capped at 30 total tool calls per session):   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=15 OR MAX_TOOL_CALLS_TOTAL=30)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 a support ticket on your behalf (requires approval). Tickets are opened in Featurebase, Wevion's support and feedback platform.

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

Every write/action tool runs in approval mode (mode: 'approval', requiresApproval: true in chat-tool-registry.ts). This includes:

  • create_automation_rule, delete_automation_rule, toggle_automation_rule, update_automation_rule
  • create_campaign_draft, duplicate_entity, update_entity_budget, toggle_entity_status
  • create_support_ticket, connect_ad_account, disconnect_ad_account, deactivate_account_user

Even a lower-risk action like create_campaign_draft requires approval — it does not run immediately. Read tools (draft_get, draft_validate, list_automation_rules, get_performance_data, etc.) run without an approval card. 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=15 per user turn, plus a cumulative MAX_TOOL_CALLS_TOTAL=30 per session. If Wavo needs more tool calls than the cap allows, 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)

ConstantValueWhat it controls
MAX_HISTORY20Messages in context per turn
MAX_TOOL_ROUNDS15Tool rounds per turn
MAX_TOOL_CALLS_TOTAL30Cumulative tool calls per session
MAX_FOLLOW_UPS3Suggested next-question chips
MAX_FOLLOW_UP_LENGTH80 charsPer follow-up text length
MAX_PROJECT_MEMORY_FACTS20Per-project memory facts
DEFAULT_TOOL_LIMIT20Default result rows per tool query
MAX_TOOL_LIMIT50Maximum result rows per tool query
ACTION_TTL_MS1800000 (30 min)Approval expiry
STRATEGIC_CONTEXT_CACHE_TTL_MS300000 (5 min)Strategic context cache
MARKUP1.1×Model cost markup
1 credit$0.001Credit-to-USD rate
CHAT_UPLOAD_MAX10 MBFile upload size cap
VOICE_MAX25 MBVoice 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: the stream manager reconnects + replays missing parts (app.streamManager.resume(sessionId) in apps/backend/src/routes/api/chat.route.ts). 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 the chat route's stream error handling → 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 calling tools?" — it hit MAX_TOOL_ROUNDS=15 for this turn or the cumulative MAX_TOOL_CALLS_TOTAL=30 for the session. 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=20 messages; older context drops. Use project memory facts for persistent context.

FAQ

How does Wavo process each message in Wevion?

Wavo orchestrates every turn in three phases: it loads bounded conversation context plus project and user memory facts, runs a tool round loop (capped at MAX_TOOL_ROUNDS=15 per turn, with a cumulative MAX_TOOL_CALLS_TOTAL=30 per session) to fetch real data or take actions, then streams the final response word-by-word as a UIMessage. It also extracts up to 3 follow-up suggestions and saves token usage and credits charged.

Why did Wavo stop after checking only 20 items?

Because Wevion sets DEFAULT_TOOL_LIMIT=20 — the default number of result rows per tool query. To widen it, ask Wavo to "show all" or "top 50" (the ceiling is MAX_TOOL_LIMIT=50). Similarly, if Wavo stops mid-task, it hit MAX_TOOL_ROUNDS=15 for the turn (or the cumulative MAX_TOOL_CALLS_TOTAL=30 for the session); continue with a follow-up question.

Why doesn't Wavo remember an earlier part of my conversation?

Wavo keeps only the last 20 messages in context (MAX_HISTORY=20); older messages drop from context but stay saved in the database for audit and review. For long-running projects, rely on project memory facts (up to 20 per project) to carry persistent context across sessions rather than expecting the full history to remain in view.

Why did my Wavo approval card disappear?

Approval cards expire after 30 minutes (ACTION_TTL_MS=1800000). If the card for a high-risk action like update_entity_budget or duplicate_entity vanished, its TTL lapsed — simply re-trigger the action to get a fresh approval card. Wavo requires this explicit confirmation and cannot bypass approval for HIGH-risk operations.

What happens if my connection drops while Wavo is streaming?

No data is lost. Wevion's stream manager reconnects and replays the missing UIMessage parts (app.streamManager.resume(sessionId)), so the response continues from where it left off. If a tool itself fails, Wavo surfaces the error, explains what went wrong, and offers alternatives or asks for clarification rather than fabricating a result.