ac380050ea
OpenRouter returns 429 in two shapes: an account-level throttle on the user's key, and an upstream-provider throttle (DeepSeek/Anthropic/etc. rate-limiting OpenRouter's aggregate traffic). The classifier treated both identically and rotated/exhausted OPENROUTER_API_KEY on every 429 — burning the key for ~24min and silently disabling auxiliary features (compression, summarization, vision) on an upstream throttle where the key was healthy. Add a FailoverReason.upstream_rate_limit classified from OpenRouter's unambiguous wrapper message "Provider returned error" (the same signal the metadata-raw parser already trusts). Recovery skips credential rotation and defers to the fallback chain to switch models instead. Co-authored-by: Hermes Agent <127238744+teknium1@users.noreply.github.com>