← All posts
Bot AI

Bots that play like humans, not robots

A novice isn't just a good player who folds more. We model the actual mistakes beginners make.


The easy way to build a "beginner" bot is to take a good bot and make it tighter — fold a bit more, raise a bit less. It is also wrong. Watch real beginners and they do not play a watered-down version of correct poker. They make specific, systematic mistakes. If you want a bot that feels like a novice — and that teaches you to beat one — you have to model the mistakes, not the timidity.

Four leaks

Each of our botscarries four "leak" knobs on top of its skill. A novice has them turned up; a shark has them at zero.

  1. Hand vanity— beginners fall in love with pretty cards: anything suited, any ace, two face cards, any pair. We add a bias to the bot's perceivedstrength for those hands, so it over-commits to them — and the delusion fades as the board fills in and reality intrudes.
  2. Pot-odds blindness— a disciplined player calls when the price is right. A calling station calls with "any piece" regardless of price. One knob slides between those two worlds.
  3. Sunk-cost stickiness— once chips are in, beginners cannot let go ("I'm already in for so much"). We discount the bot's fold threshold in proportion to what it has already committed this hand.
  4. Sizing tells — a beginner bets big with a strong hand and small with a weak one, broadcasting their strength. A pro decouples size from strength so the number gives nothing away.

The key idea: distort perception, not just thresholds

The trick that makes this feel human is that the bot does not know it is wrong. We do not just make it fold less — we change what it thinks it has. It genuinely believes its A‑4 suited is strong, and acts accordingly.

// perceived equity = real equity + a vanity bias for pretty hands,
// fading as more board cards appear
export function perceiveEquity(trueEquity, hole, board, profile) {
  if (profile.handVanity <= 0) return trueEquity;          // a pro sees straight
  const decay = board.length === 0 ? 1 : board.length <= 3 ? 0.55 : 0.4;
  return clamp01(trueEquity + profile.handVanity * holeAllure(hole) * decay);
}
The novice over-values pretty hands; the shark sees its true equity.

Novice vs. pro, side by side

  • Hand selection: novice plays too many hands; pro is positionally selective.
  • Calling: novice is a station; pro calls by the math and folds the rest.
  • Draws: novice chases ignoring the price; pro weighs pot odds and implied odds.
  • Bluffing: novice rarely bluffs (or bluffs randomly); pro bluffs at the right frequency.
  • Sizing: novice's bet size leaks strength; pro's is balanced.

Keep reading