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_budget

  • MEDIUM risk: create_automation_rule, toggle_automation_rule, update_automation_rule, toggle_entity_status

  • LOW 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

MAX_HISTORY

20

Messages in context per turn

MAX_TOOL_ROUNDS

5

Tool calls per turn

MAX_FOLLOW_UPS

3

Suggested next-question chips

MAX_FOLLOW_UP_LENGTH

80 chars

Per follow-up text length

MAX_PROJECT_MEMORY_FACTS

20

Per-project memory facts

DEFAULT_TOOL_LIMIT

20

Default result rows per tool query

MAX_TOOL_LIMIT

50

Maximum result rows per tool query

ACTION_TTL_MS

1800000 (30 min)

Approval expiry

STRATEGIC_CONTEXT_CACHE_TTL_MS

300000 (5 min)

Strategic context cache

MARKUP

1.1×

Model cost markup

1 credit

$0.001

Credit-to-USD rate

CHAT_UPLOAD_MAX

10 MB

File upload size cap

VOICE_MAX

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=5 cap. 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.

Related