Mi app de finanzas FinMan VHWorx lee medidores de servicios públicos, recibos de combustible y estados de cuenta bancarios de fotos y archivos. Todo funciona con LLMs de visión/texto a través de OpenRouter —y gran parte de ello en modelos de nivel gratuito.
Los modelos gratuitos son geniales excepto por una cosa: cambian constantemente. Aparecen, desaparecen, se renombran o se deprecian silenciosamente. Codifica un id de modelo, y tu función muere silenciosamente un martes aleatorio.
Así que FinMan dejó de tratar los modelos como constantes. Los modelos son datos:
- Un trabajo diario sincroniza la lista de modelos en vivo de OpenRouter. Nuevos modelos de visión gratuitos se agregan automáticamente; los que han desaparecido se desactivan.
- Los de pago se vuelven a clasificar por precio diariamente. La familia Gemini Flash respalda el nivel gratuito, el más barato primero —así que un failover nunca sorprende la factura.
- El reconocimiento sigue la lista de prioridades. Si un modelo falla o desaparece, el siguiente toma el control. Un modelo muerto nunca rompe la foto de un usuario.
- La app se actualiza sola. Un trabajo separado fija el modelo superior de un ranking comunitario público como prioridad #1 —así que las tareas de texto se mueven silenciosamente a lo que actualmente es mejor.
- Los cambios me notifican por Telegram. Sin tableros que revisar.
El resultado después de meses en producción: no he tocado un id de modelo desde entonces. Cada ola de deprecación pasó desapercibida —por mí y por los usuarios.
Si estás construyendo sobre LLMs (especialmente en niveles gratuitos), este es el cambio pequeño de mayor impacto que conozco: modelos como datos, no constantes. Una tabla, un cron diario, un recorrido de prioridades. Ese es todo el truco.