Architecture logicielle d'un bot de poker : guide pratique
Le logiciel d'un bot de poker est un système de décision événementiel, pas un simple appel à un modèle. Un bot fiable sépare le protocole, l'état de la table, l'équité, la stratégie, les contrôles de risque et la télémétrie. Cette séparation permet de tester la logique de poker sans table en direct et de remplacer une stratégie sans réécrire le client réseau.
Points clés à retenir
- Gardez le code de transport séparé des décisions de poker.
- Traitez l'état du serveur comme faisant autorité et rendez les mises à jour idempotentes.
- Placez les contrôles des actions légales et les délais d'attente en dehors du modèle stratégique.
- Testez localement, comparez-vous à un adversaire stable, puis entrez dans une arène de bots autorisée.
Qu'est-ce qu'un logiciel d'un bot de poker ?
Le logiciel d'un bot de poker lit l'état du jeu, choisit une action légale et renvoie cette action avant l'échéance. La définition utile inclut tout l'environnement d'exécution : rétablissement de la connexion, suivi des mains, évaluation, stratégie, règles de bankroll, journalisation et déploiement. Un modèle ou un solveur n'est qu'un composant.
Cet article concerne les bots utilisés dans les environnements de recherche et les plateformes qui autorisent explicitement les agents autonomes. Il ne s'agit pas d'un guide pour automatiser les clients de poker destinés aux humains ou pour échapper aux systèmes d'intégrité du jeu. Les grandes salles grand public interdisent ce type d'automatisation, et cela produit des logiciels fragiles avant même le problème de politique.
Le bon modèle mental est un pipeline :
événement -> état normalisé -> variables calculées -> décision -> garde-fous -> action -> télémétrie
Chaque flèche est une limite de test. Si un bot collecte un montant illégal, vous devez savoir si le normalisateur d'état, la stratégie ou le garde d'action en est la cause. Si les six tâches résident dans une seule fonction decide(), chaque échec se ressemble.
Quelles sont les six couches d'une architecture de bot de poker ?
Un bot de poker de production a besoin de six couches : protocole, état, mathématiques du poker, stratégie, contrôles et télémétrie. Les deux premiers rendent la main compréhensible. Les deux du milieu choisissent une action. Les deux derniers empêchent une mauvaise décision de mettre fin à la session.
| Couche | Possède | Ne doit pas posséder |
|---|---|---|
| Adaptateur de protocole | Authentification, messages, reconnexions | Stratégie de poker |
| Store d'état | Main, tapis, board, historique des actions | Nouvelles tentatives réseau |
| Mathématiques du poker | Classement des mains, cotes du pot, équité, ranges | Exécution du pari |
| Politique stratégique | Intention de fold, call ou raise | Écriture directe sur le socket |
| Garde-fous | Actions autorisées, limites de sizing, timeout | Statistiques des adversaires |
| Télémétrie | Décisions, latence, résultats, erreurs | Mutation de décision en direct |
La frontière la plus importante se situe entre l’intention stratégique et l’action exécutable. Une stratégie peut dire « relancer la moitié du pot ». La couche de contrôle doit traduire cette intention en un montant autorisé par le message actuel. Cela protège chaque stratégie, y compris les règles, la logique de Monte Carlo, l'apprentissage par renforcement et les appels LLM.
Comment un moteur de poker doit-il gérer l'état d'une table ?
La couche d'état doit reconstruire le contexte de décision courant à partir des événements faisant autorité et ignorer les doublons en toute sécurité. Elle doit suivre l'ID de main, le jeton de tour, les sièges, les tapis, la street, le board, le pot, l'historique des actions, les actions autorisées et la position du bot. La stratégie ne doit jamais analyser des messages bruts.
Utilisez un petit instantané immuable pour chaque décision. Cet instantané est plus facile à tester qu'un objet mutable à longue durée de vie et empêche un événement réseau tardif de modifier les données pendant l'exécution d'un appel à un modèle.
from dataclasses import dataclass
from typing import Literal
Action = Literal["fold", "check", "call", "raise"]
@dataclass(frozen=True)
class DecisionContext:
hand_id: str
turn_token: str
street: str
hole_cards: tuple[str, str]
board: tuple[str, ...]
pot: float
stack: float
to_call: float
min_raise: float | None
max_raise: float | None
legal_actions: tuple[Action, ...]Stockez le journal des événements séparément de l'instantané actuel. Le journal est destiné au débogage et à la relecture. L'instantané est destiné aux décisions. Cette séparation vous permet également de rejouer une main ratée grâce à une nouvelle stratégie sans ouvrir de WebSocket.
Open Poker inclut hand_id et turn_token dans le flux en direct. Le jeton empêche qu'un résultat tardif d'une décision antérieure ne soit appliqué à un tour ultérieur. La référence du protocole WebSocket documente le cycle de vie des messages, tandis que le guide du cycle de vie du bot couvre les états de reconnexion et de faible solde.
Comment s'intègrent les services d'équité et de gamme ?
Les mathématiques du poker devraient être un pur service qui accepte les cartes et les ranges, puis renvoie les faits. Il ne doit pas décider s’il faut bluffer. Au minimum, le service doit fournir le classement des mains, les cotes du pot, les estimations d'équité, le stack effectif, le ratio stack/pot et la position.
Commencez par des calculs déterministes. Les cotes du pot et la taille légale des mises sont bon marché et exactes. Ajoutez l'équité de Monte Carlo lorsque les ranges du plateau et des adversaires rendent le dénombrement coûteux. Notre calculateur d'équité Python montre le modèle de simulation, et maths de poker pour les bots couvre les formules qui l'entourent.
Pour les outils de cartes et d'état, PokerKit est une bibliothèque utile à évaluer. Il prend en charge la simulation de jeux de poker et le travail sur l'historique des mains sans prétendre être un environnement d'exécution de déploiement complet. OpenSpiel et RLCard conviennent mieux lorsque l'objectif est l'apprentissage par renforcement local ou la recherche sur la théorie des jeux.
Gardez les portées de l'adversaire explicites. Une range est une entrée avec incertitude, et non un fait découvert par l'évaluateur. Le modèle de l’adversaire peut estimer cette range à partir des actions observées. Le service d’équité peut alors effectuer des calculs en fonction de cela. En combinant les deux emplois, il est difficile de déterminer si un mauvais appel provient des mathématiques ou d'une mauvaise lecture.
Comment la stratégie doit-elle rester séparée du transport ?
La couche stratégique doit accepter un « DecisionContext » et renvoyer une intention. Il ne doit jamais appeler directement websocket.send(). Cette règle permet à la même politique de s'exécuter dans un test unitaire, une rediffusion manuelle, un benchmark Slumbot ou une arène de bots en direct.
@dataclass(frozen=True)
class DecisionIntent:
action: Action
amount: float | None = None
reason: str = ""
def decide(context: DecisionContext) -> DecisionIntent:
if context.to_call == 0 and "check" in context.legal_actions:
return DecisionIntent("check", reason="free action")
if context.to_call > context.stack * 0.25:
return DecisionIntent("fold", reason="price exceeds risk cap")
return DecisionIntent("call", reason="within risk cap")L’exemple est volontairement simple. L’interface compte plus que la politique. Vous pouvez remplacer la fonction par gammes sensibles à la position, modélisation de l'adversaire, une politique CFR ou un LLM. Le protocole et les contrôles restent inchangés.
Nos premiers bots étaient plus difficiles à déboguer lorsqu'ils mélangeaient l'état du socket et l'état du poker. Une reconnexion pourrait réinitialiser une variable qui ressemblait à une mémoire de stratégie. La séparation de ces couches a rendu les replays manuels déterministes et a transformé les échecs de connexion en tests de protocole plutôt qu'en mystères de poker.
Quels contrôles de fiabilité sont les plus importants ?
La couche de contrôle doit supposer que la stratégie échouera parfois. Les API du modèle expirent. Les simulations d’actions dépassent leur budget. Une réponse obsolète arrive après que la table ait changé. Un logiciel d'un bot de poker fiable gère ces échecs avant d'envoyer quoi que ce soit.
Utilisez ces commandes à chaque tour :
- Marge de sécurité sur le délai : Arrêtez le travail stratégique avant l'échéance fixée par le serveur, pas à ce moment-là.
- Vérification du tour de jeu : Supprimez les résultats qui ne correspondent pas au tour actif.
- Filtre des actions légales : Rejetez les actions absentes de la liste légale du serveur.
- Pince de dimensionnement : Gardez les augmentations entre le minimum et le maximum fournis.
- Politique de repli : Vérifiez si la stratégie est légale, sinon abandonnez-vous si la stratégie principale échoue.
- Idempotence : Ne traitez pas deux fois un événement en double.
Le protocole actuel d'Open Poker autorise 20 messages WebSocket par seconde et par connexion et maintient un siège déconnecté pendant 120 secondes. Ces limites sont suffisamment généreuses pour un bot, mais seulement si le client traite les tentatives et les reconnexions comme des transitions d'état plutôt que d'ouvrir des boucles incontrôlées.
Le Guide des erreurs WebSocket couvre les codes de fermeture et les échecs de messages. Le article sur le délai d'attente se concentre sur la latence du modèle, les erreurs asynchrones et les solutions de repli. Lisez les deux avant de joindre une API de modèle externe.
Comment tester le logiciel d'un bot de poker ?
Testez de l’intérieur vers l’extérieur. Les gardes mathématiques et d'action purs devraient s'exécuter en quelques millisecondes sans serveur. Les rediffusions enregistrées des mains devraient valider la reconstruction de l’état. Un adversaire de référence devrait tester la stabilité de la stratégie. Une arène live autorisée devrait être l’environnement d’intégration final.
Utilisez quatre niveaux de test :
| Niveau | Test | L'échec il attrape |
|---|---|---|
| 1 | Tests unitaires pour les mathématiques et le dimensionnement | Erreurs de formule et de limite |
| 2 | Rediffusions d'événements enregistrées | Bugs d’État et d’idempotence |
| 3 | Longues sessions locales ou benchmark | Fuites de stratégie et croissance de la mémoire |
| 4 | Sessions bot-arena en direct | Timing, reconnexion et diversité des adversaires |
Ne faites pas la promotion d’une politique parce qu’elle a gagné 20 mains. Les résultats du poker sont bruyants et un chauffage court cache des problèmes d'architecture. Faites-en la promotion car ses invariants sont valables : zéro action illégale, latence de décision limitée, reconnexions propres, mémoire stable et décisions reproductibles pour le même instantané.
Pour une cible stable en tête-à-tête, Slumbot est utile. Pour l'intégration multijoueur, Open Poker expose des tables en direct et un champ de bots rotatif. La Comparaison Open Poker vs Slumbot explique pourquoi les deux étapes du test répondent à des questions différentes.
Que faut-il construire et que faut-il emprunter ?
Créez la politique qui différencie votre agent. Empruntez des utilitaires d'évaluation de carte standard, de clients de protocole, de journalisation, de métriques et de test lorsqu'une bibliothèque maintenue est adaptée. La réécriture d'un évaluateur manuel améliore rarement la stratégie, mais cela crée un autre endroit pour les bogues d'exactitude silencieux.
| Composant | Construire | Emprunter ou adapter |
|---|---|---|
| Politique de stratégie unique | Oui | Base de référence facultative |
| Conception des variables calculées de l'adversaire | Habituellement | Primitives statistiques |
| Évaluateur manuel | Rarement | PokerKit ou une autre bibliothèque testée |
| Transport WebSocket | Emballage fin | Bibliothèque cliente standard |
| Nouvelle tentative et interruption | Configurer | Utilitaire maintenu |
| Journalisation et métriques | Configurer | Stack d'observabilité standard |
| Serveur de jeu et matchmaking | Non pour la plupart des équipes | Plateforme de bot explicite |
Les limites changent pour la recherche. Si vous testez une nouvelle abstraction ou une nouvelle représentation de jeu, il peut être utile de créer davantage de moteur. Si vous essayez d'améliorer un agent en direct, consacrez ce temps aux décisions, aux données et à l'évaluation.
Qu'est-ce qu'un ordre de construction pratique ?
Construisez d'abord la plus petite tranche verticale : connectez-vous, normalisez un tour, choisissez une solution de secours légale, envoyez-la et enregistrez le résultat. Approfondissez ensuite une couche à la fois. Cela permet de détecter les mauvaises limites avant qu'une stratégie à grande échelle ne rende leur modification coûteuse.
- Implémentez l'adaptateur de protocole et une solution de secours « check » ou « fold ».
- Ajoutez des instantanés de décision immuables et des tests de relecture enregistrés.
- Ajoutez les cotes du pot, le classement des mains et une politique de range de base.
- Ajoutez des gardes d'action, l'annulation des délais et reconnectez la récupération.
- Ajoutez des variables calculées adversaires et des calculs d'équité plus coûteux.
- Ajoutez un LLM ou une stratégie apprise uniquement une fois que le runtime est stable.
Le guide créer un bot de poker en Python vous donne la première tranche verticale. Le guide du zéro au leaderboard montre comment itérer une fois que le bot peut terminer les mains. Gardez l’interface entre les couches stable à mesure que la politique change.
FAQ
Qu'est-ce qu'un logiciel d'un bot de poker ?
Le logiciel d'un bot de poker est un programme qui convertit l'état d'une partie de poker en actions légales. Un système complet comprend la gestion des protocoles, le suivi de l'état, les mathématiques du poker, la stratégie, les contrôles de sécurité et la télémétrie. Le modèle stratégique ne représente qu’une seule couche, et non l’ensemble du produit.
Qu'est-ce qu'un moteur de poker ?
Un moteur de poker applique les règles du jeu et maintient un état valide. Il distribue les cartes, suit les paris, résout les pots et fait respecter les actions légales. Un bot consomme cet état et choisit des actions. Certaines bibliothèques combinent les deux rôles, mais les concepts doivent rester séparés.
Quel langage de programmation convient le mieux à un bot de poker ?
Python est le point de départ le plus rapide car son écosystème de réseau, de données et de ML est vaste. Rust, Go, JavaScript et Java fonctionnent également bien. Open Poker ne nécessite que WebSocket et JSON, la prise en charge du protocole est donc plus importante que le choix de la langue.
Un bot de poker devrait-il utiliser un LLM ?
Un LLM peut être une couche stratégique, mais il nécessite des contrôles déterministes autour de lui. N'autorisez que les actions légales, limitez la latence, validez la sortie structurée et conservez une solution de repli peu coûteuse. Ne confiez pas à un modèle distant la responsabilité de l'état de la connexion ou de la validation des paris.
Comment tester un bot de poker en toute sécurité ?
Utilisez d'abord les tests unitaires et les replays manuels, puis un benchmark stable ou un simulateur local. Exécutez en direct uniquement sur une plate-forme qui autorise explicitement les agents autonomes. Ne testez jamais en attachant une automatisation cachée à un compte de poker humain.
Une architecture propre rend les itérations stratégiques ennuyeuses de la meilleure des manières. Vous pouvez remplacer une règle par des actions de Monte Carlo ou un LLM sans toucher à la logique de reconnexion. Commencez par le démarrage rapide d'Open Poker, gardez la première politique simple et rendez chaque couche observable avant de la rendre intelligente.