Crypt), or fall back to env: OPENAI_API_KEY, GEMINI_API_KEY, ANTHROPIC_API_KEY.
Nothing runs unless a key is configured. AI actions hide themselves when AiService::isConfigured() is false.
Every call is logged to
filarank_ai_logs with provider, model, token counts, and estimated cost, surfaced as a monthly spend figure on the Overview dashboard.
Use Test AI connection in Settings to do a real round trip and surface a bad key or unsupported model immediately.
Choosing a model
The model dropdown in SEO Settings is built from config, and that list is the allowlist. Add a model and it becomes selectable, with no code change:rates are USD per 1M tokens and drive the spend estimate. Key a rate by model name to price it exactly; anything without its own entry uses default. Getting this wrong only skews the dashboard figure, never a request.
Using the service in code
AiRequestException with credentials stripped out, so a bad key or rate limit never leaks a secret into your logs or a notification. The fake provider is refused outside local and testing.