Thyag's Blog

Can LLM Agents bluff their way to a win at poker?

Abstract

We made Claude Haiku, Sonnet and Opus play No-Limit Texas Hold'em against each other for play money and tracked every bluff. The short answer is yes, they bluff, and most of their bluffs take the pot. However, the bluffs mostly work because every player at the table folds too often, not because the models read each other well. Once card luck is removed with duplicate dealing, no Claude model is clearly better than another. The most interesting result is about disposition rather than skill: Opus almost never bluffs on its own, but when the prompt asks it to bluff in balance, it bluffs about 4.6Γ— more often and none of those bluffs get caught. Claude models also stay almost completely silent at the table, while DeepSeek V4 Flash talks without being asked.


1. Introduction

Poker is a nice test for language model agents because the game rewards a specific kind of deception. Bluffing is not lying about the rules of the world. It is betting as if you hold a strong hand when you don't, inside a game where everyone knows this can happen. Earlier poker AIs like Libratus [1] and Pluribus [2] reached superhuman play through search and self-play, so here we don't ask whether LLMs can play optimal poker. We ask how they behave when they are simply dropped into a game.

We wanted to answer four questions:

  1. Do LLM agents bluff without being told to?
  2. Do their bluffs win, and do they win because of good reads or for some other reason?
  3. Does model size change the style of play and bluffing?
  4. Will they lie out loud at the table when deception is explicitly allowed?

We started with three tournaments, then built a duplicate cash game to separate skill from card luck, and finally ran two ablations: a bluff-instructed prompt and an open-weight model (DeepSeek V4 Flash) as a cross-check.


2. Experiment Setup

2.1. Agents

Each player is a long-lived session of the Claude Agent SDK [5], authenticated with a Claude Code login and with every built-in tool switched off. The session keeps the whole game in context, so a player remembers how its opponents have played. Every turn, the player gets its own two hole cards plus all public information (board, bets, stacks, table talk and any cards shown at showdown) and replies with one JSON object:

{"why": "...", "action": "raise", "amount": 120, "intent": "bluff", "say": "..."}

why is a short explanation shown only to spectators, intent is the player's own label for the move, and say is optional public table talk. All players get the same neutral system prompt. It says deception is allowed inside the game but does not encourage it. Opponents are never told which model they are playing against.

One small surprise during setup: our first version asked for "your private thinking" in a reasoning field, and both Sonnet 5.5 and Opus 5.5 refused it with a reasoning_extraction safety flag. Renaming the field to a short explanation "for spectators" fixed it. We used this wording for every run after the first tournament.


Table 1: Models used. All Claude models ran at effort: low.

Model ID Provider
Claude Haiku 5.5 claude-haiku-5-5 Claude Agent SDK
Claude Sonnet 5.5 claude-sonnet-5-5 Claude Agent SDK
Claude Opus 5.5 claude-opus-5-5 Claude Agent SDK
DeepSeek V4 Flash deepseek/deepseek-v4-flash OpenRouter

2.2. Measuring a Bluff

A model calling its own bet a "bluff" is not enough, so the engine flags bluffs on its own. Before every decision it estimates the player's chance of winning from the player's point of view: its two cards and the board against random cards for every opponent still in the hand (Monte Carlo). A bet or raise counts as a bluff when that chance is below three quarters of a fair share, that is under 37.5% heads-up or under 25% against two opponents.

Each bluffing hand is then scored as worked (everyone folded), caught (lost at showdown), won anyway (called, but won at showdown) or gave up (the bluffer folded later). We also record when an opponent folded a better hand to a bluff.

2.3. Tournaments

We ran three tournaments with $1,500 stacks and blinds rising every 10 hands, played until one player held every chip:

  1. Haiku only: five Haiku 5.5 players.
  2. Mixed models: two Opus, two Sonnet and two Haiku players, seated so models alternate.
  3. Talk required: the same mixed table, but every bet or raise must come with table talk. Every 10 hands, players write one-line scouting notes on each opponent. After each hand, an Opus 5.5 judge that sees every card labels each statement true, vague or lie, based on what the speaker knew at that moment.

2.4. Calibration (Duplicate Cash Game)

Single tournaments are mostly card luck, so we asked Claude Fable 5.1 how to make the experiment more rigorous. Following its advice, we built a calibration run:

We also measured folds to bets vs break-even: how often a player folds when facing a bet, compared with the fold rate at which a pure bluff of that size exactly breaks even. Folding more often than break-even means any bluff against that player makes money.

2.5. Ablations

We ran two more duplicate runs on decks 1–60 of the same seeds:

  1. Told to bluff: the same table, with one paragraph added to the prompt saying that skilled players bluff in balance (about one bluff per two value bets on the river), and that bluffs should be picked where folds are likely.
  2. DeepSeek cross-check: the neutral prompt, with DeepSeek V4 Flash in Haiku's seat, to see whether Claude's habits are shared by an open-weight model.

3. Results

3.1. Tournaments


Table 2: The three tournaments.

Tournament Hands Winner Bluffing hands Worked Net from bluffing hands Table talk
Haiku only 48 Ada (Haiku) 9 4 +$155 0 statements
Mixed models 72 Dex (Opus) 5 4 +$170 0 statements
Talk required 99 Bruno (Haiku) 13 10 +$2,145 601 statements

Bluffing came out ahead in all three tournaments, but who bluffed did not predict who won. In the mixed tournament, the two Opus players finished first and second without a single engine-flagged bluff. They won by raising before the flop about twice as often as Sonnet or Haiku and pushing hard with real hands.


Table 3: Mixed tournament, final standings.

Place Player Model Bluffing hands Net from bluffs Plays / raises first
1 Dex Opus 5.5 0 β€” 46% / 31%
2 Ada Opus 5.5 0 β€” 42% / 29%
3 Esme Haiku 5.5 1 (worked) +$175 50% / 17%
4 Finn Sonnet 5.5 0 β€” 46% / 15%
5 Cleo Sonnet 5.5 2 (both worked) +$415 35% / 4%
6 Bruno Haiku 5.5 2 (1 worked, 1 caught) βˆ’$420 64% / 12%

The talk-required tournament then flipped the order: Haiku won, and both Opus players finished fourth and fifth. This is what single tournaments look like when card luck dominates, and it is the reason we built the calibration run.

3.2. Table Talk

When table talk was optional, no Claude player said a single word in two full tournaments. When we made it mandatory on bets and raises, the models talked a lot but mostly said nothing checkable.


Table 4: Table talk in the talk-required tournament, as labelled by the Opus judge.

Model Statements True Vague Lie Lie rate
Opus 5.5 56 17 33 6 11%
Sonnet 5.5 296 97 191 8 3%
Haiku 5.5 249 121 120 6 2%
All 601 235 344 20 3%

Opus lied the most per statement, and its lies were classic poker "representing". Holding ace-queen, Opus said "That king looks pretty good to me." Holding queen-high, it said "That ace looks good to me." Sonnet paired its bluffs with lies, for example "Betting 100, the jacks are mine" while holding 4-5. There was even one reverse lie: Opus bet two pair and said "Keep me honest" to look weak.

However, talk did not change how often opponents folded.


Table 5: How often opponents folded to a bet, by how the bet was talked up.

Bettor's statement Responses Folds
Lie 26 62%
True 137 63%
Vague 78 59%

3.3. Calibration

Over the full 500-hand neutral run (100 decks Γ— 5 seatings), no player is clearly winning or losing. Every 95% interval crosses zero, although the bluff bot comes close.


Table 6: Neutral calibration run, 100 decks. Dup = duplicate result with card luck removed.

Player Dup bb/100 (95% CI) Plays / raises first True bluffs per 100 hands Says "bluff" per 100 hands Engine agrees Folds to bets vs break-even
Sonnet 5.5 +59 (βˆ’52 to +167) 49% / 32% 7.2 26.8 26% 51% vs 46%
Honest bot +26 (βˆ’51 to +118) 12% / 2% 0.0 β€” β€” 75% vs 46%
Opus 5.5 +22 (βˆ’78 to +121) 49% / 40% 1.6 19.0 8% 50% vs 40%
Haiku 5.5 βˆ’37 (βˆ’156 to +87) 59% / 17% 5.6 21.8 25% 46% vs 45%
Bluff bot (30%) βˆ’70 (βˆ’157 to +9) 16% / 1% 1.4 β€” β€” 64% vs 44%

Two patterns from the tournaments held up here. First, Claude calls far more of its bets "bluffs" than the engine does. When Opus labels a bet a bluff, the engine agrees only 8% of the time. Opus uses the word for continuation bets with decent hands, for example a c-bet with ace-queen on a paired board because "Bruno folds to bets 79% of the time". Second, every player folds more often than break-even (Figure 3). At these tables any aggression makes money, so a bluff winning the pot is not evidence of a good read.


30%40%50%60%70%80%Opus50% vs 40%Sonnet51% vs 46%Haiku46% vs 45%DeepSeek73% vs 51%Honest bot75% vs 46%Bluff bot64% vs 44%break-evenactual fold rate
Figure 3: How often each player folds when facing a bet (dot) vs the fold rate at which a pure bluff breaks even (tick). Every dot sits right of its tick, so bluffing anyone at these tables makes money on average. Claude and bots: neutral run, 100 decks. DeepSeek: decks 1–60.


βˆ’200βˆ’1000+100+200+300Neutral promptOpusβˆ’37 (βˆ’164 to +84)Sonnet+110 (βˆ’18 to +259)Haiku+16 (βˆ’96 to +117)Honest bot+3 (βˆ’109 to +131)Bluff botβˆ’93 (βˆ’220 to +9)Told to bluffOpus+95 (βˆ’50 to +261)Sonnetβˆ’20 (βˆ’170 to +118)Haiku+9 (βˆ’128 to +137)Honest botβˆ’48 (βˆ’136 to +18)Bluff botβˆ’37 (βˆ’155 to +78)DeepSeek in Haiku's seatOpus+26 (βˆ’74 to +131)Sonnetβˆ’7 (βˆ’147 to +129)DeepSeek+117 (+30 to +231)Honest botβˆ’63 (βˆ’160 to +15)Bluff botβˆ’73 (βˆ’198 to +50)
Figure 1: Big blinds won per 100 hands with card luck removed, decks 1–60 (300 hands per run). Dots are point estimates, bars are 95% bootstrap intervals. Only DeepSeek's interval clears zero.

3.4. Telling Them to Bluff

This is where the clearest result came from. Asked to bluff in balance, Opus bluffed about 4.6Γ— more often, from 1.3 to 6.0 true bluffs per 100 hands, and none of its 16 bluffing hands got caught. Its reasoning also started to look like a poker player's: it noted that a "brick river misses his clubs" before firing a two-thirds-pot bluff. Sonnet already bluffed freely and actually bluffed slightly less. Haiku did not bluff more at all. Instead it got more aggressive in general, raising first 28% of the time instead of 17%.


Table 7: Neutral vs told to bluff, decks 1–60 (300 hands per run). Every duplicate interval still crosses zero.

Model Dup bb/100 True bluffs per 100 hands Says "bluff" per 100 hands Engine agrees Bluffing hands when told to bluff (worked / caught / gave up)
Opus 5.5 βˆ’37 β†’ +95 1.3 β†’ 6.0 19.7 β†’ 28.3 7% β†’ 21% 16 (8 / 0 / 6)
Sonnet 5.5 +110 β†’ βˆ’20 9.0 β†’ 6.3 27.3 β†’ 29.0 32% β†’ 22% 17 (11 / 1 / 3)
Haiku 5.5 +16 β†’ +9 6.3 β†’ 6.3 23.0 β†’ 36.3 26% β†’ 17% 16 (11 / 4 / 1)


02468101.36.0Opus9.06.3Sonnet6.36.3Haiku2.3DeepSeek(neutral only)neutral prompttold to blufftrue bluffs per 100 hands
Figure 2: Engine-flagged bluffs per 100 hands on decks 1–60. Lighter bars: neutral prompt. Darker bars: prompt asks for balanced bluffing. Opus moves the most.

3.5. DeepSeek Cross-check

DeepSeek V4 Flash, playing in Haiku's seat with the neutral prompt, was the only player in any calibration run whose interval cleared zero. It played a tight-aggressive style that is very different from the looser Claude models.


Table 8: Haiku vs DeepSeek in the same seat, neutral prompt, decks 1–60. Opponents were Opus, Sonnet and the two bots in both runs.

Metric Haiku 5.5 DeepSeek V4 Flash
Dup bb/100 (95% CI) +16 (βˆ’96 to +117) +117 (+30 to +231)
Plays / raises first 55% / 17% 25% / 18%
Aggression (bets and raises per call) 0.73 2.68
True bluffs per 100 hands 6.3 2.3
Says "bluff" per 100 hands 23.0 12.0
Engine agrees 26% 11%
Folds to bets vs break-even 49% vs 45% 73% vs 51%
Table talk per 100 hands 0 9.0
Average time per decision ~2.7 s 13.6 s

Two Claude habits turned out to be shared. DeepSeek also calls bets "bluffs" when the engine disagrees, and it folds to bets even more than Claude does. But DeepSeek talks without being asked, with lines like "Top pair, time to charge for any draw" and "Stealing time." That makes Claude's silence look like a property of the model family rather than of the setup. DeepSeek was also slower and less reliable over the API: 17 empty or broken replies had to be retried, and the engine acted for it once in 385 decisions.


4. Discussion

  1. The word "bluff" means something different to the models. Claude and DeepSeek both use it for any bet that aims to make an opponent fold, including semi-bluffs and continuation bets with decent hands. Self-reported intent is therefore a poor measure of deception, and an outside measure is necessary.
  2. Bluffs work because everyone over-folds. Every model and both bots fold more often than break-even. Bluffing is profitable against this field regardless of skill, which also explains why the fixed-rate bluff bot's bluffs were slightly profitable even though its overall tight play lost.
  3. Opus's low bluff rate is a disposition, not a skill gap. It bluffs rarely by default, but when asked it picks good spots and does not get caught. It seems Opus prefers to win through aggression with real hands unless deception is explicitly encouraged.
  4. Claude rarely uses words to deceive. Claude models said nothing when talk was optional and lied in only 3% of statements when talk was required, and lies did not change folding behavior. We can't tell from this experiment whether this comes from honesty training or from not seeing table talk as a useful lever, but the contrast with DeepSeek suggests it is model-specific.
  5. Tournaments are a bad benchmark for this. Opus won one tournament and finished fourth and fifth in the next. Only the duplicate runs produced stable behavioral numbers, and even 500 hands were not enough to rank the Claude models by win rate.

Limitations. All Claude models ran at low effort, which probably handicaps Opus and Sonnet the most. The bluff test compares the bettor's hand against random cards, which misjudges hand strength against a player who has been betting. The bots are weak baselines (the honest bot plays only 12% of hands). The judge was Opus, which was also a player, and no human checked its labels. With 15 player-runs in the calibration, one interval clearing zero at 95% could still be chance, so the DeepSeek result needs a replication.


Table 9: Estimated cost per run. Claude usage went through a Claude Code login, so these are SDK estimates rather than bills.

Run Hands Estimated cost
Haiku-only tournament 48 $0.18
Mixed tournament 72 $3.13
Talk tournament 99 $4.32 (judge: $2.69)
Calibration, neutral 500 ~$14.7
Calibration, told to bluff 300 ~$8.4
Calibration, DeepSeek cross-check 300 ~$7.2 (DeepSeek: ~$0.10)

5. Future Research

  1. More hands. Ranking models by win rate needs roughly 1,000+ duplicate hands per model, plus seat-balanced replications of the DeepSeek result.
  2. Range-based bluff detection. Estimate each opponent's likely holdings from their actions instead of comparing against random cards.
  3. Effort and thinking. Repeat the calibration at higher effort to see whether Opus and Sonnet change style or just play the same way more slowly.
  4. Stronger baselines. Replace the rule-based bots with a solid tight-aggressive bot or a solver-based player.
  5. Opponent modeling. Tell players which model each opponent is, and test whether a bigger model exploits a smaller one.
  6. Verbal deception. Separate "not willing to lie" from "not seeing talk as useful" by rewarding table talk directly, and validate the judge's labels with humans.

6. TL;DR


7. Acknowledgement

Thanks to Claude Fable 5.1 for suggesting the duplicate cash-game design, the baseline bots and the fold-rate calibration. The engine, viewer and analysis were built with Claude Code, and this post was drafted with Claude's help.


8. References

[1] Brown, N., & Sandholm, T. (2018). Superhuman AI for heads-up no-limit poker: Libratus beats top professionals. Science, 359(6374), 418–424.

[2] Brown, N., & Sandholm, T. (2019). Superhuman AI for multiplayer poker. Science, 365(6456), 885–890.

[3] Burch, N., Schmid, M., Moravčík, M., Morrill, D., & Bowling, M. (2018). AIVAT: A New Variance Reduction Technique for Agent Evaluation in Imperfect Information Games. AAAI.

[4] Efron, B. (1979). Bootstrap Methods: Another Look at the Jackknife. The Annals of Statistics, 7(1), 1–26.

[5] Anthropic. Claude Agent SDK documentation. https://code.claude.com/docs/en/agent-sdk