What it does
Server-side fair-use limits on every AI call. Multiple layers stacked.
Layers (in order)
- Admin bypass — if
profiles.is_admin = true, skip ALL checks below - Burst limit — 20 requests / 60s per user (in-process, resets on function cold start)
- User status —
ai_usage_limits.statuscan bebanned(403),paused(403),throttled(cap halved) - Feature kill switch —
feature_flags.{ai_assistant_enabled,ai_planner_enabled,ai_email_import_enabled} - Per-user daily cap —
ai_budget_config.per_user_capsJSON; default 50/day for chat & smart-fill, 5/day for planner - Global daily USD budget —
ai_budget_config.global_daily_usd_cap(default $25) - Input size cap — 8000 chars per request
Admin controls
/admin/ai-usage— live usage chart, per-user limits, reset/admin/feature-flags— kill switches- DB direct:
ai_budget_configrow id=default for caps and costs
Audit trail
Every blocked call writes to audit_logs with action=ai_blocked and the reason.
Related files
supabase/functions/ai-assistant/index.ts, tables: ai_usage_daily, ai_usage_limits, ai_budget_config, ai_global_budget