Achei legal a proposta de manter o roteador pequeno e local. Para uso individual isso parece bem mais fácil de adotar do que subir uma stack completa de gateway.
Uma dúvida que eu teria ao usar em projetos reais é como classificar a falha antes de trocar de provedor. 429 e 5xx parecem bons candidatos para fallback, mas erro de auth, erro de contexto grande demais ou resposta bloqueada por política talvez não deveriam cair automaticamente no próximo modelo.
Você pretende tratar esses tipos de erro de forma diferente? Acho que essa distinção pode evitar um caso chato: o app “funciona”, mas muda de provedor em situações em que o comportamento esperado não era exatamente equivalente.