Saltar al contenido
Todos los proyectos
HackathonRuneSight4 min de lectura

RuneSight: un coach con IA para tu historial de League of Legends

Las webs de estadísticas le dan números a los jugadores de League of Legends, no consejos. RuneSight, hecho en solitario para AWS Rift Rewind, pone cinco agentes en Bedrock junto a tu historial de partidas para decirte qué corregir y cómo te comparas.

Dashboard de RuneSight en modo oscuro: partidas recientes, pestañas por cola (Ranked Solo/Duo, Flex, Normal, ARAM) y tarjetas de win rate, KDA, CS y daño

El problema

Las webs de estadísticas le dicen a un jugador de League of Legends su CS por minuto, su KDA y su win rate por campeón. No le dicen qué hacer con eso. La cuenta con la que hice las pruebas estaba en Silver I. Saber que promedia 6,5 de CS por minuto es un número. Saber que eso es normal en Silver, qué hace distinto un jugador Master y qué tres hábitos cambiar primero es un consejo. Esa segunda parte es lo que te da un coach, y la mayoría de los jugadores no tiene uno.

Qué construí

RuneSight es un coach con IA que lee tu historial real de partidas. Lo hice solo para AWS Rift Rewind 2025, un hackathon online donde Riot y AWS pedían construir algo sobre datos de partidas de League con Amazon Bedrock. Entras con tu Riot ID, carga tus últimas veinte partidas por cola, te muestra un dashboard y, al lado, un chat donde puedes preguntar "¿qué tal mi farmeo?" o "compárame con mi dúo" y recibir una respuesta basada en tus propias partidas.

Landing de RuneSight con un campeón de League de fondo y los botones Start Analysis y Watch Demo
La landing. El tema del hackathon era League, así que la página va a por todas con eso.

Qué hace

  • Dashboard por cola. Partidas recientes con win rate, KDA, CS y daño, separadas en pestañas: All, Ranked Solo/Duo, Flex, Normal y ARAM.
  • Cinco coaches en un solo chat. Un Performance Analyst, un Champion Expert, un Team Synergy Specialist, un Comparison Analyst y un Match Summarizer, cada uno con su propio prompt y sus herramientas.
  • Routing automático. En modo AUTO la pregunta llega sola al coach correcto. También puedes elegir uno a mano, y una etiqueta sobre cada respuesta dice quién contestó.
  • Referencias por rango. Las respuestas comparan tus números con lo que hacen jugadores de rangos más altos, apoyadas en una pequeña base de conocimiento que escribí: seis guías sobre fundamentos, farmeo, macro, composición de equipo y drafts profesionales. El Comparison Analyst te pone lado a lado con un amigo.
Chat en modo AUTO: una pregunta sobre farmeo respondida por el Performance Analyst con referencias de CS por rango
Modo AUTO. Una pregunta sobre farmeo llegó al Performance Analyst sin pedirle a un modelo que decidiera.
AI Analysis Chat con prompts de ejemplo agrupados en Performance, Champion Expertise y Player Comparison
El chat abre con prompts agrupados por agente, para que veas para qué sirve cada coach.

Por qué estas herramientas

Amazon Bedrock era requisito del hackathon, y me daba Claude Sonnet 4.5 para escribir los consejos. Encima va Strands Agents, porque el producto en realidad son cinco especialistas que necesitan sus propias herramientas; Strands les permite compartir una herramienta que trae las partidas del jugador sin mezclar sus prompts. La API de Riot Games es la única fuente de verdad: cada respuesta parte de las partidas reales del jugador, no de lo que un modelo cree que hacen los jugadores de Silver.

Elegir el coach no es una llamada a la IA. Lo obvio sería preguntarle primero a un modelo ("¿cuál de estos cinco debería responder?"), pero eso es un viaje extra a Bedrock antes de que empiece la respuesta de verdad. En su lugar, el router puntúa la pregunta con palabras clave: "compara", "dúo" o "compañero" apuntan al Comparison Analyst, "cómo jugar" al Champion Expert, "últimas 10 partidas" al Summarizer, y el Performance Analyst se queda con lo que no está claro. Es tosco, instantáneo y gratis, y cuando se equivoca puedes leer la regla culpable y arreglarla en una línea.

Lo difícil

El rate limit de Riot. Una key personal de desarrollo permite 20 peticiones por segundo y 100 cada dos minutos, y veinte partidas son veinte peticiones separadas. Para que el dashboard se sintiera rápido precargué todas las pestañas de cola, lo que se come el presupuesto de dos minutos en una sola carga de página. El log se llenó de 429 Too Many Requests y el dashboard mostraba tarjetas vacías.

Log de terminal lleno de errores 429 de la API de Riot y avisos de reintento
Veinte peticiones de partidas, tres reintentos cada una, esperas de 2 s → 4 s → 8 s, y la mayoría fallando igual.

La solución fue una caché que sabe cuánto tarda en caducar cada tipo de dato: un Riot ID, 24 horas; la lista de partidas recientes, cinco minutos; una partida terminada, una hora (nunca cambia). A eso se suman cinco minutos de caché en el navegador y esperas crecientes ante cada 429. Una partida que ya terminó es un hecho, así que se pide una vez. De paso aprendí que el tag de un Riot ID como Nombre#LAG no indica la región, así que ahora el backend le pregunta a Riot dónde juega realmente el jugador.

La otra lección fue más pequeña y más molesta. El frontend compilaba en mi laptop y fallaba en Amplify, siete commits seguidos, porque el .gitignore estándar de Python ignora cualquier carpeta llamada lib/, y ocho archivos de mi app de React vivían en frontend/src/lib. El arreglo fue una línea.

En qué se convirtió

Al final del 10 de noviembre RuneSight estaba online en Amplify, con el backend de FastAPI en un contenedor de Lambda detrás, todo dentro del entorno de AWS en torno al que giraba el hackathon. El chat respondía con números reales de partidas reales: tasa de muertes, CS por minuto frente a referencias por rango, un cara a cara con un amigo.

Después el modelo cambió. Todo estaba construido y ajustado sobre Claude Sonnet 4.5 en Bedrock, y el video demo se grabó con él. Luego tuve problemas con los créditos de Sonnet en mi cuenta de AWS, y el backend desplegado pasó a Amazon Nova Pro como respaldo. El último commit, del 11 de noviembre, es sobre todo una nota en el README que lo explica: la versión online es un respaldo, el tool calling no está ajustado para Nova, y si quieres verlo como se pensó, lo corres en local con Sonnet.

Me alegra haberlo dejado por escrito en vez de esconderlo. La app ya no está online, pero el repo es público y esa nota sigue siendo lo primero que se lee.