Same record, different reads: four AI models given an opponent's history instead of memory

Observation 01 · games played October 16, 2026; decisions re-asked October 17, 2026

Summary

An AI model called through an API remembers nothing between requests. In heads-up poker, we give it a memory in writing instead: at every decision it gets a briefing with the hand so far and a count of everything the opponent has done. We tested whether four models actually use that record, and how.

Terms used here

Poker.

AI.

Setup

Models. Four models were tested:

No model got a persona or strategy advice.

One request per decision. Every decision is a new request with no chat history. The request holds a state written in JSON: the seats and stacks, the hand street by street, what Hero's cards make and which hands beat them, and the opponent's record. It then asks two questions:

The model answers with a probability for every option, for example check 85%, bet 12%, all-in 3%. The server then picks one option to play. It keeps the options weighted at least half as much as the top one and draws among them in proportion to the square of their weight; in that example, it would always check. Every percentage in sections 1 and 2 is the model's own stated probability. Only section 3 counts actions actually played.

The record. The opponent's actions are counted as "x of n" (times out of chances). The counts cover all hands and the last 30, broken down by situation and bet size, and the record also lists the hands the opponent showed at showdown. A briefing is about 2,100–3,600 tokens, depending on the model.

Opponents. Six bots, each following a one-line rule:

Each model played each bot for 200 hands with 100 BB stacks, 4,800 hands in all. When one side loses all its chips, a new match starts at 100 BB; the record carries over.

An excerpt from one briefing (Haiku, river, against station; abridged):

state.hand        … river: board 5d As 6d 9s Th, opponent checks
state.hero_hand   Ks 7c: "No pair, no card above the board's ace"
state.opponent_tendencies.all_matches (160 hands)
  "Facing a river bet: fold 0, call 35, raise 0 (of 35)"
  "Went to showdown: 156 of 156 (100%)"
  "Aggression after the flop: 0 of 258 (0%)"
  … about 20 more counted lines, then a shorter set for the last 30 hands
questions.action  check | bet (size asked separately) | all-in

Haiku answered check 85%, bet 12%, all-in 3%. It held king-high with no pair, and the record said this opponent had called every river bet, 35 of 35. A bluff here would lose chips, so checking is the sound answer.

1. Does the record change the answer?

We took 60 stored decisions per model, ten against each bot, from the later part of each run, when the record was already full. Each decision was asked three ways:

To compare two answers, we group the options into four kinds (fold, check or call, bet or raise, all-in) and measure how much probability moves between them. This is the total variation distance. For example, "call 80%, fold 20%" against "call 50%, fold 50%" is 30%: thirty points of probability moved from call to fold. 0% means the same answer; 100% means no overlap.

ModelChange when asked again (noise)Change when the record is removedDecisions where removal beat noise
Jev3%49% [42–56]58 of 60
Gemini12%43% [35–51]41 of 60
luna9%30% [21–38]29 of 60
Haiku9%27% [21–35]35 of 60

The last column counts decisions where removing the record moved the answer more than the biggest difference among the three answers to the same briefing. The October 16 answer differed from the October 17 asks about as much as the two October 17 asks differed from each other, so the day made no difference.

Jev gives almost the same probabilities every time it is asked, so nearly every change it shows comes from the record. The three language models answer the same briefing about 10% differently from one request to the next. That spread is the noise floor under every comparison below.

With these bots as opponents, the record made every model more aggressive. Its total weight on betting, raising and going all-in rose by 7 percentage points for luna, 12 for Haiku, 16 for Gemini and 28 for Jev. These bots are extreme, and the direction may differ against real players.

2. Which part do they read? Two contrasts

A contrast asks the same decisions twice. The two records it uses differ in one thing only. Neither record is written by hand. A scripted player with a fixed style plays 300 hands, and its play is counted the same way a person's is. Its opponent in those hands is a simple house player that bets every size equally often, so the record contains the style's answer to every size. We asked 40 decisions per model under each of the two records.

Bet sizes

Modelvs folds to big betsvs folds to small betsDifference (percentage points)
Jev28%82%−54 [−58, −49]
Gemini35%68%−33 [−47, −19]
luna58%42%+16 [+8, +24]
Haiku52%51%+1 [−5, +6]

The Gemini row covers the 21 of its 40 decisions where it gave betting any weight. How often a model bets at all barely changed for any of them; only the size moved.

None of the four changed its size with its own hand. Each applied one rule to every hand.

Bluffs

Modelvs bets any handvs bets only a pair or betterDifference (percentage points)
Jev80%79%+2 [0, +3]
Gemini85%84%+1 [−8, +10]
luna53%54%−2 [−11, +8]
Haiku93%75%+18 [+9, +27]

Only Haiku adjusted. With air, it continued 91% of the time against the player who bets any hand and 69% against the one who bets only made hands.

The briefing states this difference as a counted line. Among the hands shown down after the opponent's large bets, about four in ten held less than a pair for the player who bets any hand, and none did for the other. Jev, Gemini and luna had that line and did not act on it.

3. Over the hands: as the record fills

This section counts actions actually played, block by block, through each 200-hand run.

Against shove: all-ins called, out of all-ins faced, per 40 hands.

HandslunaGemini
1–4012 of 3013 of 22
41–8022 of 2522 of 25
81–12017 of 2518 of 22
121–16027 of 3016 of 19
161–20025 of 2620 of 22

luna's calls rose from 40% [25–58] to 96% [81–99]. Jev and Haiku called every all-in from the first block on.

Against switch: hands opened all-in, out of hands opened, per 50-hand phase.

PhaseGeminiJev
1–50 (station)1 of 2722 of 28
51–100 (raise)12 of 2527 of 28
101–150 (station)4 of 2628 of 28
151–200 (raise)11 of 2430 of 31

Gemini's all-in opens rose, fell and rose again with its opponent: 4%, 48%, 15%, 46%. That matches how it played the stand-alone bots, 11 of 104 against station and 63 of 102 against raise. Jev opened all-in in every phase. luna and Haiku opened all-in under 5% of the time in every phase; whether they answered the switch in another way was not measured.

4. Using the record is not using it well

One answer for nearly everyone. When first to act before the flop, Jev went all-in:

The exception was stab, the only bot that folds: 2 of 100. Against a player who calls everything, an all-in with a random hand wins about half the time, so it gains about nothing. Betting good hands and checking bad ones would win chips steadily. The record told Jev the opponent never folds; Jev answered with the one move that gets no value from knowing it.

Betting into a wall. Against station, the record showed every river bet called. In the river spots where Hero acted first holding air:

Jev reached that spot only 3 times. A bluff against a player who always calls only loses chips.

5. Speed and cost of one decision

ModelResponse time (typical / slow case)Input tokensCost per decision
Jev0.19 s / 0.23 s2,150≈ $0.00009
Gemini1.28 s / 1.52 s2,909≈ $0.0009
luna2.02 s / 2.63 s2,388≈ $0.0003
Haiku1.42 s / 1.95 s3,619≈ $0.0004

Limits

Where this ran

The games, the briefings and the bots come from QUANT.POKER, where people play these models heads-up. The record in this study is the one a person's own play builds.