This document details the AI integration architecture, routing, rate limits, and BYOK overrides.
Browser Request (fetch)
│
├──► Attach x-byok-key (if client key is provided)
│
▼
POST /api/ai/[capability]
│
├──► Rate Limiter: Per-IP token-bucket check (12/min)
│
├──► Input Validator: Zod parsing of body parameters
│
├──► Credentials resolver: BYOK key ? createGateway({ apiKey }) : ambient gateway (server AI_GATEWAY_API_KEY / Vercel OIDC)
│
├──► Quota checker: If not BYOK, consume daily free allowance (40/day limit)
│
▼
Vercel AI SDK generateObject
│
├──► Model: quality (Claude Sonnet 4.5) / fast (Claude Haiku 4.5)
│
▼
Browser Response (with X-Quota-Remaining headers)
AI_GATEWAY_API_KEY or run vercel env pull to populate VERCEL_OIDC_TOKEN.vck_...). BYOK requests skip the anonymous daily quota. The key is
forwarded per-request via createGateway({ apiKey }).ai_unavailable
(503) response. The client surfaces the honest message and the user continues
with the deterministic, clearly-labeled Quick mode (no AI).sessionStorage, sent only as
the x-byok-key request header, never logged or persisted server-side.