System 7: enseñamos a una IA a explotar el póker — y lo que de verdad ganó fue otra cosa
Crónica técnica de construir un agente de póker para el Arena de dev.fun: el método heurístico, los LLM en la mesa, y los resultados honestos — incluidos los que no esperábamos.
El experimento
En dev.fun hay un sitio donde agentes de inteligencia artificial se sientan a una mesa de Texas Hold'em No Limit y juegan unos contra otros. No es una demo: hay manos reales, fichas reales, rivales reales (algunos humanos detrás de un bot, otros bots a secas) y, en los torneos, dinero on-chain en juego.
La pregunta que nos hicimos es engañosamente simple: ¿cómo construyes un agente que gane?
La respuesta corta, después de meses de código, miles de manos y un panel de control que acabó pareciendo la sala de un fondo cuantitativo, es esta: construimos una máquina sofisticadísima para explotar a los rivales… y lo que de verdad batió al adversario más duro fue una idea tonta de tan simple. Este post es la historia larga de cómo llegamos ahí, qué aprendimos del póker, de los LLM y de medir las cosas con honestidad.
dev.fun y el Arena
El Arena de dev.fun es una competición de agentes de póker. Tu agente es un programa que habla con una API en tiempo real. El bucle es siempre el mismo:
join— te sientas en una mesa.pending-actions— la API te dice "es tu turno, esta es la situación" (tus cartas, el board, las apuestas, las fichas, quién ha hecho qué).action— respondes: fold, check, call, bet, raise y cuánto.
Hay un deadline por decisión: si no contestas a tiempo, te hacen auto-fold. Es póker de verdad, con su reloj.
El Arena tiene tres "pistas", y entender la diferencia es clave porque cada una premia cosas distintas:
- Eval — tu agente juega 500 manos contra un panel fijo de cinco bots de referencia. Es un benchmark: te puntúa en bb/100 (ciegas grandes ganadas por cada 100 manos, la métrica universal del póker) y te coloca en un ranking. No reparte premio y es de una sola tirada por agente. Aquí no te enfrentas a peces: el panel es lo más cercano a un rival "perfecto" que vas a ver.
- Playground — PvP con dinero de juguete, gratis y continuo. Aquí sí hay rivales reales, con sus manías y sus fugas.
- Tournament — un MTT (torneo multi-mesa) con entrada on-chain (cadena Monad, token MON): pagas una vez, recibes un stack fijo y compites en mesas de 2 a 6 jugadores que se van fundiendo hasta que queda un campeón.
Esa distinción — un rival casi perfecto (Eval) frente a rivales con fugas (Playground/Torneo) — es el eje de todo lo que viene.
Dos formas de jugar: GTO contra explotación
En el póker moderno conviven dos filosofías.
GTO (Game Theory Optimal). Juegas el equilibrio de Nash: una estrategia inexplotable. Hagas lo que hagas, no pierdes a la larga, porque mezclas tus jugadas de forma que el rival nunca puede sacarte ventaja. Es lo que aproximan los solvers y las redes entrenadas con Counterfactual Regret Minimization (CFR/DeepCFR). El GTO no intenta ganarte mucho; intenta no perder nunca.
Explotación. Renuncias a parte de esa coraza para castigar los errores concretos del rival. ¿Foldea demasiado a las subidas? Faroleas más. ¿Paga con cualquier cosa? Dejas de farolear y subes el valor. Es la forma en que piensan los profesionales humanos: el equilibrio es la base, pero el dinero está en las fugas del de enfrente.
Nuestra tesis de partida fue la del jugador explotador: usar el GTO como suelo defensivo y, a partir de ahí, desviarse agresivamente para exprimir cada debilidad. En la jerga, node-locking: "clavas" mentalmente el error del rival en un nodo del árbol de decisión y atacas justo ahí. Construimos un motor entero alrededor de esta idea. Se llama System 7.
System 7: un motor explotador escrito a mano
Lo primero que hay que entender de System 7 es lo que no es: no es un LLM, y en el momento de decidir no llama a ninguna red ni a ningún modelo. Es Python puro y determinista —y código abierto en GitHub—. Recibe la mesa, hace cuentas y devuelve una jugada en milisegundos. Toda la "inteligencia" está codificada como reglas, destiladas de una metodología de juego explotador (la escuela de EducaPoker / "Estrategia Universidad", con la huella de jugadores como Raúl Mestre).
El motor se organiza en cuatro directivas.
D1 — Cuánto te fías de lo que ves (la muestra N). No puedes explotar a un rival del que no sabes nada. System 7 escala su agresividad según cuántas manos lleva observando al villano:
- N < 100: ceguera. Ignora las estadísticas (puro ruido) y juega rangos estándar, respetando la agresión rival.
- 100 ≤ N < 500: empieza a perfilar por el gap entre VPIP (con qué frecuencia mete fichas) y PFR (con qué frecuencia sube). De ahí salen los arquetipos: Nit (tightísimo), TAG (sólido), LAG (agresivo y suelto), Calling Station (paga todo) y Maníaco. A cada uno se le juega distinto: a la station, tolerancia cero a los faroles y subir el valor; al nit, robarle las ciegas sin parar.
- N ≥ 500: node-locking fino. Si el rival foldea a las resubidas más del 55% de las veces, le 3-beteamos cualquier mano con un As bloqueador. Si abandona el flop ante la apuesta de continuación más del 45%, le apostamos el 100% de nuestro rango con un sizing pequeño.
D2 — Qué tienes y dónde estás (la geometría). En lugar de pensar "tengo pareja de ases", System 7 clasifica la mano por su encaje relativo con el board: MMF (manos monstruo: sets, colores, escaleras), MF (manos fuertes: top pair con buen kicker, overpair), MM (manos medias), MD (manos débiles) y Aire/Proyectos. Y clasifica la mesa por textura: seca, semi-coordinada, coordinada y extremadamente coordinada (donde hasta un set baja de categoría porque el peligro es enorme). Encima añade la dinámica de las cartas que van saliendo: una carta scary (un As, un K que cierra un color) favorece al agresor y baja el umbral para farolear; una carta defensiva frena la agresión y pide control del bote.
D3 — La aritmética implacable (PME vs PER). Aquí no hay corazonadas. Calcula el PME (las pot odds: cuánto arriesgas frente a lo que puedes ganar) y lo compara con el PER (tu equity real, contando outs ajustadas por la textura — un proyecto de color vale menos si el rival puede tener uno mayor; las sobrecartas valen casi cero en una mesa muy coordinada). La regla es un mandato: si tu equity no cubre las pot odds, foldeas, salvo que el HUD certifique que el rival se va a tirar (entonces el farol tiene su propio valor).
D4 — El postflop y el "Perejil Asesino". Cuando el SPR (la relación entre el bote y las fichas que quedan) baja de 3, te comprometes con cualquier mano fuerte: el control del bote desaparece, vas con todo. Y para los faroles está el protocolo bautizado como "Perejil Asesino": un farol condicionado. Solo subes de farol si se cumplen condiciones (debilidad evidente del rival, un salvavidas de 8 a 10 outs reales que respalda la jugada por si te pagan, ajustes por número de rivales…). Nunca se farolea por impulso con basura; cada agresión va respaldada por matemática o por una fuga documentada.
Y por encima de todo, el HUD: un módulo que lee en vivo las estadísticas de los rivales (tamaño de muestra, VPIP, PFR, 3-bet, fold-to-cbet, showdown…), los clasifica en arquetipos y alimenta las desviaciones de la D1. El HUD es lo que convierte a System 7 de un robot disciplinado en un explotador.
Es, en resumen, un intento serio y completo de codificar cómo piensa un profesional explotador. Funcionaba. La pregunta era: ¿ganaba?
Meter un LLM en la mesa
El motor heurístico es rápido y barato, pero tiene un techo: las reglas, por finas que sean, no cubren todos los spots raros. Así que probamos un motor híbrido: la heurística resuelve los spots triviales (la inmensa mayoría) y, en los spots difíciles, le pasa la decisión a un LLM que razona la jugada.
Usamos MiniMax M3, un modelo de razonamiento, con el propio System Prompt del método (las cuatro directivas, traducidas a lenguaje, más un contrato de salida en JSON). El LLM recibe la situación reconstruida y devuelve una jugada justificada. ¿El coste? Unos 27 segundos por decisión y un consumo de tokens nada trivial — por eso solo entra en los spots que de verdad lo merecen (gating por dificultad).
Aquí aparece un tema que se ha vuelto central en todo el ecosistema de IA: los modelos de razonamiento. Un M3 o un DeepSeek-R1 "piensan en voz alta" antes de responder, lo que les da una ventaja real en problemas con muchas variables interdependientes — y el póker, en sus spots difíciles, es exactamente eso. Más adelante esto reaparece de forma elegante en nuestro propio coach.
Lo que pasó (y lo que no esperábamos)
Aquí viene la parte honesta, que es también la más interesante.
El panel del Eval — ese rival "casi perfecto" — resultó ser cinco clones idénticos de un bot DeepCFR: un TAG equilibrado (VPIP ~21.7, PFR ~16.4, factor de agresión ~1.95), sin fugas evidentes. Lo más parecido al GTO que íbamos a poder medir.
Medimos:
- System 7 heurístico (node-locking puro): −9.75 bb/100.
- Híbrido con M3 (razonando los spots difíciles): −1.66 bb/100.
Es decir: nuestra elaboradísima máquina de explotar perdía contra el panel. El LLM la mejoraba (de −9.75 a −1.66 — su razonamiento en spots difíciles ayudaba de verdad), pero ninguno de los dos batía al rival.
La lección, en una frase: no puedes sobre-explotar a alguien que no tiene fugas. Todo el aparato de node-locking — los arquetipos, el Perejil Asesino, las desviaciones finas — solo cobra cuando el rival comete errores sistemáticos. Contra un near-GTO sin leaks, esa maquinaria gira en el vacío e incluso te hace daño (te desvías del equilibrio sin recompensa).
Y entonces, el giro. Probamos una estrategia tonta de tan simple: rangos muy anchos y agresión de robo (abrir muchas más manos, robar ciegas sin freno). Contra el mismo panel, esa estrategia wide puntuó +119 bb/100 en las clasificatorias.
¿Por qué? Porque el panel, pese a ser "GTO", tenía una propiedad explotable: foldeaba alrededor del 78% de sus manos preflop. Hasta un bot disciplinado es, estructuralmente, demasiado tight. Y eso es una fuga — solo que no del tipo que el HUD detecta mano a mano, sino una estructural, que se castiga con la jugada más vieja del libro: robar.
Ahí está la ironía bonita del proyecto: la explotación sí ganó — pero el exploit correcto era el simple y estructural (robar), no la elaborada lectura multi-calle. Construimos un microscopio para encontrar fugas sutiles cuando lo que pagaba era un martillo.
Una nota de humildad estadística obligatoria: bb/100 sobre 500 manos tiene un intervalo de confianza de ±20. Tanto el −9.75 como el +119 son ruidosos en valor absoluto. Lo que sí fue consistente entre tiradas fue la dirección: contra este panel, anchura ≫ node-locking. Tratar un número de 500 manos como veredicto es uno de los errores más fáciles — y más caros — de cometer.
¿Y dónde brilla, entonces, toda la maquinaria explotadora? Donde hay fugas de verdad: en el Playground y el Torneo, contra rivales reales que sí pagan de más, foldean de menos y farolean mal. Ahí el HUD y el node-locking dejan de girar en el vacío.
Del laboratorio a producción: el tooling
Un agente no es nada sin la fábrica que lo produce. La mitad del proyecto es un panel de control que organiza todo el ciclo de vida del agente en tres zonas:
- LAB — donde naces una estrategia: una rejilla 13×13 (las 169 manos del póker) para pintar rangos a mano, elegir motor (heurístico / híbrido), modelo y HUD, y backtestear varios agentes a la vez (con la concurrencia capada para no reventar las APIs ni provocar rate-limits). El resultado se reporta como bb/100 agregado por estrategia, con su intervalo de confianza — no como un run suelto.
- COACH — donde el agente aprende. Un diagnóstico de tu juego frente al óptimo (VPIP, PFR, c-bet… contra las bandas de referencia) y un coach LLM que critica tus manos y propone ajustes concretos. Lo último que añadimos: un coach mano a mano — coges tus 10 manos más y menos rentables, las seleccionas, y un modelo de razonamiento (DeepSeek-R1) te dice de cada una si la jugaste bien o mal y dónde está la fuga. (Curiosidad: el modelo de razonamiento es notablemente más crítico que el normal; donde el modelo estándar aplaude un all-in, el de razonamiento detecta que ese overbet espantaba las manos peores y solo cobraba a las mejores.)
- PRODUCCIÓN — donde el agente compite: despliegue en vivo, curva de equity real frente a la EV teórica, un reproductor de manos para revisar cada jugada, y un tracker que perfila a los rivales.
Y todo esto cierra un bucle de auto-mejora: propones una versión → la testeas → la comparas contra el control → la despliegas → el coach la critica → repites. Un agente, y un entrenador para ese agente, en el mismo sitio.
El salto al torneo
El cash y el torneo no se juegan igual. En un MTT las ciegas suben y tu stack, medido en ciegas grandes, se encoge — y la estrategia tiene que cambiar con la profundidad. System 7 adapta sus rangos por tramos de stack: profundo (juegas póker normal), medio, corto, y muy corto (push/fold: o vas con todo o te tiras, sin medias tintas). En la mesa final, cuando el torneo se reduce a dos jugadores, el motor detecta el heads-up dinámicamente y cambia a un marco consciente de la posición (el botón juega último postflop, c-betea de rango, barrelea). Queda pendiente lo más fino — el ICM (que el valor de una ficha no es lineal cerca de los premios) — pero la base de torneo está.
Lo que nos llevamos
Más allá del póker, el proyecto deja unas cuantas lecciones que aplican a cualquier agente que tome decisiones bajo incertidumbre:
- GTO y explotación no son rivales, son capas. El equilibrio es tu suelo; la explotación es tu techo. Pero la explotación solo paga si el de enfrente tiene fugas — y la fuga correcta puede ser la más simple de todas.
- El LLM brilla como juicio en los spots difíciles, no como controlador total. Lo barato y determinista resuelve el 95%; el modelo caro y lento se reserva para el 5% que de verdad lo necesita. Y los modelos de razonamiento aportan donde hay muchas variables enredadas.
- Medir con honestidad es la mitad del trabajo. Un número ruidoso no es un veredicto. Los intervalos de confianza, la dirección frente al valor absoluto, y la disciplina de no auto-engañarse valen más que cualquier truco de estrategia.
- El meta-juego es construir la fábrica. El edge no estuvo en una jugada genial sino en el bucle: autoría → backtest → comparación → despliegue → coaching → repetir. Un agente es tan bueno como la maquinaria que lo itera.
Eso, al final, es de lo que va QuantArmy: agentes para decidir bajo incertidumbre. El póker resultó ser un campo de pruebas perfecto — acotado, medible y despiadado con el autoengaño. Te enseña rápido que tu modelo mental no es la realidad, y que el rival más duro no se gana con más sofisticación, sino con la idea correcta.
Recursos y enlaces
- 💻 Código (open source): github.com/quantarmyz/system7-poker-arena — el motor heurístico, el híbrido con LLM, el dashboard y todo el tooling.
- 🃏 La plataforma: dev.fun · el Arena de póker.
- 🧠 Modelos de razonamiento: DeepSeek · MiniMax.
El proyecto sigue vivo en el Arena. Si te interesa el cruce de IA, teoría de juegos y decisión bajo incertidumbre, esto no ha hecho más que empezar.