diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..3c373a9
--- /dev/null
+++ b/__init__.py
@@ -0,0 +1,13 @@
+from .shortdeck_arena import Simulation, Agent, HumanAgent, Card, HandEvaluator, HandRanking
+from .shortdeck_server import ArenaGame
+
+
+__all__ = [
+ "Simulation",
+ "Agent",
+ "HumanAgent",
+ "Card",
+ "HandEvaluator",
+ "HandRanking",
+ "ArenaGame"
+]
\ No newline at end of file
diff --git a/__pycache__/__init__.cpython-313.pyc b/__pycache__/__init__.cpython-313.pyc
new file mode 100644
index 0000000..ffb240a
Binary files /dev/null and b/__pycache__/__init__.cpython-313.pyc differ
diff --git a/__pycache__/demo_server.cpython-313.pyc b/__pycache__/demo_server.cpython-313.pyc
new file mode 100644
index 0000000..96e92f2
Binary files /dev/null and b/__pycache__/demo_server.cpython-313.pyc differ
diff --git a/__pycache__/simple_test_server.cpython-313.pyc b/__pycache__/simple_test_server.cpython-313.pyc
new file mode 100644
index 0000000..6701791
Binary files /dev/null and b/__pycache__/simple_test_server.cpython-313.pyc differ
diff --git a/client/index.html b/client/index.html
new file mode 100644
index 0000000..0e2df1e
--- /dev/null
+++ b/client/index.html
@@ -0,0 +1,856 @@
+
+
+
+
+
+ ShortDeck Poker - Professional Client
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/client/simple.html b/client/simple.html
new file mode 100644
index 0000000..c62e230
--- /dev/null
+++ b/client/simple.html
@@ -0,0 +1,585 @@
+
+
+
+
+
+ ShortDeck Poker - Professional Client
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/client2_random_agent.py b/client2_random_agent.py
new file mode 100644
index 0000000..6bef483
--- /dev/null
+++ b/client2_random_agent.py
@@ -0,0 +1,243 @@
+#!/usr/bin/env python3
+import requests
+import time
+import random
+import json
+import sys
+from typing import Dict, List, Optional
+
+class RandomAgentClient:
+ def __init__(self, server_url: str = "http://localhost:8001", player_name: str = "RandomBot"):
+ self.server_url = server_url.rstrip('/')
+ self.player_name = player_name
+ self.player_id: Optional[int] = None
+ self.game_active = False
+
+ def join_game(self) -> bool:
+ response = requests.post(
+ f"{self.server_url}/join",
+ json={"name": self.player_name},
+ timeout=5
+ )
+
+ if response.status_code == 200:
+ data = response.json()
+ self.player_id = data["player_id"]
+ print(f" {self.player_name} 成功加入游戏,玩家ID: {self.player_id}")
+ return True
+ else:
+ print(f" 加入游戏失败: {response.status_code} - {response.text}")
+ return False
+
+
+ def get_game_info(self) -> Optional[Dict]:
+ if self.player_id is None:
+ return None
+
+ try:
+ response = requests.get(
+ f"{self.server_url}/info/{self.player_id}",
+ timeout=5
+ )
+
+ if response.status_code == 200:
+ return response.json()
+ else:
+ print(f" 获取游戏信息失败: {response.status_code}")
+ return None
+
+ except requests.RequestException as e:
+ print(f" 获取游戏信息时连接失败: {e}")
+ return None
+
+ def get_valid_actions(self) -> List[str]:
+ if self.player_id is None:
+ return []
+
+ try:
+ response = requests.get(
+ f"{self.server_url}/valid_actions/{self.player_id}",
+ timeout=5
+ )
+
+ if response.status_code == 200:
+ data = response.json()
+ return data.get("valid_actions", [])
+ else:
+ return []
+
+ except requests.RequestException:
+ return []
+
+ def make_random_action(self, valid_actions, game_info) -> bool:
+ if not valid_actions:
+ print(" 没有可用动作")
+ return False
+
+ # 随机选择一个动作, 弃牌率高, todo
+ action = random.choice(valid_actions)
+ amount = 10
+
+ if action in ["raise", "bet"]:
+ player_stack = game_info.get("stacks", [1000])[self.player_id] if self.player_id < len(game_info.get("stacks", [])) else 1000
+ min_bet = max(game_info.get("current_pot", [0])) if game_info.get("current_pot") else 10
+ max_bet = min(player_stack, player_stack // 2) # 最多下注一半筹码
+
+ if max_bet > min_bet:
+ amount = random.randint(min_bet, max_bet)
+ else:
+ amount = min_bet
+
+
+ payload = {
+ "player_id": self.player_id,
+ "action": action,
+ "amount": amount
+ }
+
+ response = requests.post(
+ f"{self.server_url}/apply_action",
+ json=payload,
+ timeout=5
+ )
+
+ if response.status_code == 200:
+ action_str = f"{action}" + (f" {amount}" if amount else "")
+ print(f" {self.player_name} 执行动作: {action_str}")
+ return True
+ else:
+ print(f" 动作执行失败: {response.status_code} - {response.text}")
+ return False
+
+
+
+ def is_my_turn(self, game_info: Dict) -> bool:
+ if not game_info or self.player_id is None:
+ return False
+
+ current_turn = game_info.get("current_turn", -1)
+
+ return current_turn == self.player_id
+
+ def display_game_state(self, game_info: Dict):
+ if not game_info:
+ return
+
+ print(f"\n游戏状态:")
+ print(f" 阶段: {game_info.get('stage', 'unknown')}")
+ print(f" 总奖池: {game_info.get('total_pot', 0)}")
+ print(f" 当前轮到: 玩家 {game_info.get('current_turn', -1)}")
+ print(f" 我的ID: {self.player_id}")
+ print(f" 我的手牌: {game_info.get('player_cards', [])}")
+ print(f" 公共牌: {game_info.get('board_cards', [])}")
+
+ stacks = game_info.get('stacks', [])
+ if stacks and self.player_id is not None and self.player_id < len(stacks):
+ print(f" 我的筹码: {stacks[self.player_id]}")
+
+ def wait_for_players(self) -> bool:
+ print(" 等待其他玩家加入游戏...")
+
+ for _ in range(60): #60S
+ game_info = self.get_game_info()
+ if game_info:
+ players = game_info.get("players", [])
+ if len(players) >= 2:
+ print(f" 游戏开始!玩家列表: {players}")
+ return True
+
+ time.sleep(1)
+
+ print(" 等待超时,未能开始游戏......")
+ return False
+
+ def game_loop(self):
+ print(f" {self.player_name} 开始游戏循环......")
+
+ consecutive_errors = 0
+
+ while self.game_active and consecutive_errors < 5:
+ try:
+ game_info = self.get_game_info()
+ if not game_info:
+ consecutive_errors += 1
+ time.sleep(2)
+ continue
+
+ consecutive_errors = 0
+
+ self.display_game_state(game_info)
+
+ if self.is_my_turn(game_info):
+ print(f" 轮到 {self.player_name} 行动...")
+
+ valid_actions = self.get_valid_actions()
+ if valid_actions:
+ print(f"可用动作: {valid_actions}")
+ self.make_random_action(valid_actions, game_info)
+ else:
+ print(" 没有可用动作")
+
+ stage = game_info.get("stage", "")
+ if stage in ["game_over", "showdown", "finished"]:
+ print(" 游戏结束")
+ self.show_final_results(game_info)
+ time.sleep(3)
+ print(" 准备下一轮游戏...")
+ continue
+
+ time.sleep(2)
+ except Exception as e:
+ print(f" 游戏循环出错: {e}")
+ consecutive_errors += 1
+ time.sleep(2)
+
+ if consecutive_errors >= 5:
+ print(" 连续错误过多,退出游戏")
+
+ def show_final_results(self, game_info):
+ print("\n 游戏结果:")
+ # todo
+ response = requests.get(f"{self.server_url}/showdown", timeout=5)
+ if response.status_code == 200:
+ showdown_data = response.json()
+ print(json.dumps(showdown_data, indent=2))
+
+
+ def run(self):
+ print(f" 启动 RandomAgent 客户端: {self.player_name}")
+ print(f" 连接服务器: {self.server_url}")
+
+ if not self.join_game():
+ return False
+
+ if not self.wait_for_players():
+ return False
+
+ self.game_active = True
+ self.game_loop()
+
+ return True
+
+
+def main():
+ import argparse
+
+ parser = argparse.ArgumentParser(description="RandomAgent")
+ parser.add_argument("--server", default="http://localhost:8001")
+ parser.add_argument("--name", default="RandomBot")
+ parser.add_argument("--seed", type=int)
+
+ args = parser.parse_args()
+
+ if args.seed:
+ random.seed(args.seed)
+ print(f" 设置随机种子: {args.seed}")
+
+ client = RandomAgentClient(args.server, args.name)
+
+ success = client.run()
+ sys.exit(0 if success else 1)
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/shortdeck_arena/__init__.py b/shortdeck_arena/__init__.py
new file mode 100644
index 0000000..543e9bd
--- /dev/null
+++ b/shortdeck_arena/__init__.py
@@ -0,0 +1,19 @@
+from .simulation import Simulation
+from .agent import Agent, HumanAgent
+from .game_stage import GameStage, BlindConfig
+from .hand_evaluator import HandEvaluator
+from .hand_ranking import HandRanking
+from .card import Card
+from .side_pot import SidePot
+
+__all__ = [
+ "Simulation",
+ "Agent",
+ "HumanAgent",
+ "GameStage",
+ "BlindConfig",
+ "HandEvaluator",
+ "HandRanking",
+ "Card",
+ "SidePot"
+]
\ No newline at end of file
diff --git a/shortdeck_arena/__pycache__/__init__.cpython-313.pyc b/shortdeck_arena/__pycache__/__init__.cpython-313.pyc
new file mode 100644
index 0000000..f322709
Binary files /dev/null and b/shortdeck_arena/__pycache__/__init__.cpython-313.pyc differ
diff --git a/shortdeck_arena/__pycache__/card.cpython-313.pyc b/shortdeck_arena/__pycache__/card.cpython-313.pyc
index 0949e26..4556eb4 100644
Binary files a/shortdeck_arena/__pycache__/card.cpython-313.pyc and b/shortdeck_arena/__pycache__/card.cpython-313.pyc differ
diff --git a/shortdeck_arena/__pycache__/game_stage.cpython-313.pyc b/shortdeck_arena/__pycache__/game_stage.cpython-313.pyc
index 75546cd..b879fc9 100644
Binary files a/shortdeck_arena/__pycache__/game_stage.cpython-313.pyc and b/shortdeck_arena/__pycache__/game_stage.cpython-313.pyc differ
diff --git a/shortdeck_arena/__pycache__/hand_evaluator.cpython-313.pyc b/shortdeck_arena/__pycache__/hand_evaluator.cpython-313.pyc
index 6b61c53..fd917b9 100644
Binary files a/shortdeck_arena/__pycache__/hand_evaluator.cpython-313.pyc and b/shortdeck_arena/__pycache__/hand_evaluator.cpython-313.pyc differ
diff --git a/shortdeck_arena/__pycache__/hand_ranking.cpython-313.pyc b/shortdeck_arena/__pycache__/hand_ranking.cpython-313.pyc
index ddce3d1..885a8ac 100644
Binary files a/shortdeck_arena/__pycache__/hand_ranking.cpython-313.pyc and b/shortdeck_arena/__pycache__/hand_ranking.cpython-313.pyc differ
diff --git a/shortdeck_arena/__pycache__/side_pot.cpython-313.pyc b/shortdeck_arena/__pycache__/side_pot.cpython-313.pyc
index 6db3e82..e9f87f4 100644
Binary files a/shortdeck_arena/__pycache__/side_pot.cpython-313.pyc and b/shortdeck_arena/__pycache__/side_pot.cpython-313.pyc differ
diff --git a/shortdeck_arena/__pycache__/simulation.cpython-313.pyc b/shortdeck_arena/__pycache__/simulation.cpython-313.pyc
index 1747fda..e710493 100644
Binary files a/shortdeck_arena/__pycache__/simulation.cpython-313.pyc and b/shortdeck_arena/__pycache__/simulation.cpython-313.pyc differ
diff --git a/shortdeck_arena/card.py b/shortdeck_arena/card.py
index eb4ba5c..de52533 100644
--- a/shortdeck_arena/card.py
+++ b/shortdeck_arena/card.py
@@ -1,4 +1,3 @@
-"""ShortDeck card model (6-A, 36 cards)."""
from __future__ import annotations
from enum import IntEnum
diff --git a/shortdeck_arena/hand_ranking.py b/shortdeck_arena/hand_ranking.py
index c6cd0d5..093faea 100644
--- a/shortdeck_arena/hand_ranking.py
+++ b/shortdeck_arena/hand_ranking.py
@@ -73,6 +73,7 @@ class HandRanking:
def get_strength(self) -> int:
# 返回牌力 还是 牌型+点数
# 基础强度 = 牌型强度 * 1000000
+ # todo
strength = self.hand_type.strength * 1000000
for i, rank in enumerate(self.key_ranks):
diff --git a/shortdeck_arena/side_pot.py b/shortdeck_arena/side_pot.py
index bad36a6..3630b6f 100644
--- a/shortdeck_arena/side_pot.py
+++ b/shortdeck_arena/side_pot.py
@@ -99,6 +99,5 @@ class SidePotManager:
return winnings
def reset(self):
- """重置边池管理器"""
self.pots.clear()
self.player_total_investment.clear()
\ No newline at end of file
diff --git a/shortdeck_arena/simulation.py b/shortdeck_arena/simulation.py
index ca48dc7..1416818 100644
--- a/shortdeck_arena/simulation.py
+++ b/shortdeck_arena/simulation.py
@@ -42,6 +42,9 @@ class Simulation:
self.side_pot_manager = SidePotManager()
self.stacks: List[int] = [1000] * len(agents) # 默认筹码
+ # 用于结算
+ self.hand_completed = False
+
self.new_round()
def new_round(self):
@@ -54,6 +57,7 @@ class Simulation:
self.current_stage = GameStage.PREFLOP
self.player_states = [PlayerState.ACTIVE] * len(self.agents)
self.betting_round_complete = False
+ self.hand_completed = False # 重置完成标志
# 重置下注状态
self.pot = [0] * len(self.agents)
@@ -141,25 +145,19 @@ class Simulation:
return max(0, max_pot - self.pot[pid])
def get_min_raise_amount(self, pid) -> int:
- """最小加注金额"""
call_amount = self.get_call_amount(pid)
min_raise = call_amount + max(self.last_raise_amount, self.blind_config.big_blind)
return min_raise
def get_max_bet_amount(self, pid) -> int:
- """最大下注金额(剩余筹码)"""
if pid >= len(self.stacks):
return 0
return self.stacks[pid]
def is_all_in_amount(self, pid, amount) -> bool:
- """检查是否为allin"""
return amount >= self.stacks[pid]
def validate_bet_amount(self, pid, action, amount) -> tuple[bool, str, int]:
- """
- 验证下注金额合法性
- """
if pid >= len(self.stacks):
return False, "无效玩家", amount
@@ -178,12 +176,16 @@ class Simulation:
if call_amount == 0:
return False, "不需要跟注", 0
- # All-in call
if call_amount >= available_stack:
return True, "", available_stack
return True, "", call_amount
+ elif action == "allin":
+ if available_stack <= 0:
+ return False, "没有筹码进行 all-in", 0
+ return True, "", available_stack
+
elif action in ["bet", "raise"]:
if amount <= 0:
return False, "无效下注金额", amount
@@ -207,6 +209,9 @@ class Simulation:
return False, "无效行为", amount
def get_available_actions(self, pid: int) -> dict:
+ if self.current_stage in [GameStage.FINISHED, GameStage.SHOWDOWN]:
+ return {"can_act": False, "reason": "游戏已结束" if self.current_stage == GameStage.FINISHED else "摊牌阶段"}
+
if pid != self.current_turn:
return {"can_act": False, "reason": "不是你的回合"}
@@ -214,7 +219,7 @@ class Simulation:
return {"can_act": False, "reason": "无效玩家"}
state = self.player_states[pid]
- if state in [PlayerState.FOLDED, PlayerState.ALLIN, PlayerState.OUT]:
+ if state in [PlayerState.FOLDED, PlayerState.ALLIN]:
return {"can_act": False, "reason": f"Player state: {state}"}
call_amount = self.get_call_amount(pid)
@@ -225,7 +230,7 @@ class Simulation:
"can_fold": True,
"can_check": call_amount == 0,
"can_call": call_amount > 0 and call_amount < available_stack,
- "can_bet": max(self.pot) == 0 and available_stack > 0,
+ "can_bet": call_amount == 0 and available_stack > 0,
"can_raise": call_amount > 0 and available_stack > call_amount,
"can_allin": available_stack > 0,
"call_amount": call_amount,
@@ -241,27 +246,33 @@ class Simulation:
"""
检查当前下注轮是否完成
"""
- active_players = [i for i, state in enumerate(self.player_states)
- if state in (PlayerState.ACTIVE, PlayerState.CALLED)]
+ # 首先检查是否只剩一个未弃牌的玩家
+ non_folded_players = [i for i, state in enumerate(self.player_states)
+ if state != PlayerState.FOLDED]
- if len(active_players) <= 1:
+ if len(non_folded_players) <= 1:
+ return True
+
+ active_or_allin_players = [i for i, state in enumerate(self.player_states)
+ if state in (PlayerState.ACTIVE, PlayerState.CALLED, PlayerState.ALLIN)]
+
+ all_allin_or_folded = all(state in (PlayerState.ALLIN, PlayerState.FOLDED)
+ for state in self.player_states)
+ if all_allin_or_folded:
return True
- # 检查所有active玩家是否都已投入相同金额,且所有人都已经行动过
max_pot = self.get_current_max_bet()
# 统计还需要行动的玩家
players_need_action = []
- for i in active_players:
+ for i in active_or_allin_players:
# allin
if self.player_states[i] == PlayerState.ALLIN:
- continue
- # 投入金额不足的玩家需要行动
+ continue
if self.pot[i] < max_pot:
players_need_action.append(i)
- # Active状态的玩家如果还没有在本轮行动过,也需要行动
elif self.player_states[i] == PlayerState.ACTIVE:
- # 在翻前,大盲玩家即使投入了足够金额,也有权行动一次
+
if (self.current_stage == GameStage.PREFLOP and
i == self.blind_config.get_bb_position(len(self.agents), self.dealer_position)):
# 检查大盲是否已经行动过(除了盲注)
@@ -289,6 +300,12 @@ class Simulation:
self.complete_hand()
return
+
+ if self.current_stage == GameStage.SHOWDOWN:
+ self.current_stage = GameStage.FINISHED
+ self.complete_hand()
+ return
+
# 重置下注轮状态
self.betting_round_complete = False
@@ -306,6 +323,7 @@ class Simulation:
def get_next_active_player(self, start_pos) -> Optional[int]:
for i in range(len(self.agents)):
pos = (start_pos + i) % len(self.agents)
+ # 只有ACTIVE状态的玩家可以行动,ALLIN和FOLDED的玩家不能行动
if self.player_states[pos] == PlayerState.ACTIVE:
return pos
return None
@@ -313,7 +331,7 @@ class Simulation:
def get_side_pots(self) -> List:
active_players = [
i for i, state in enumerate(self.player_states)
- if state not in [PlayerState.FOLDED, PlayerState.OUT]
+ if state not in [PlayerState.FOLDED]
]
return self.side_pot_manager.create_side_pots(active_players)
@@ -375,6 +393,29 @@ class Simulation:
raise ValueError("跟注金额>0, 无法过牌,需要跟注或弃牌")
self.player_states[pid] = PlayerState.CALLED
+ elif action == "allin":
+ # all-in
+ actual_amount = self.stacks[pid]
+ if actual_amount <= 0:
+ raise ValueError("没有可用筹码进行 all-in")
+
+ self.player_states[pid] = PlayerState.ALLIN
+ self.pot[pid] += actual_amount
+ self.stacks[pid] = 0
+ self.total_pot += actual_amount
+ self.side_pot_manager.add_investment(pid, actual_amount)
+
+ # 更新最后加注金额(如果 all-in 金额超过跟注金额)
+ call_amount = self.get_call_amount(pid)
+ raise_amount = actual_amount - call_amount
+ if raise_amount > 0:
+ self.last_raise_amount = raise_amount
+ self.min_raise = raise_amount
+
+ for i, state in enumerate(self.player_states):
+ if i != pid and state == PlayerState.CALLED:
+ self.player_states[i] = PlayerState.ACTIVE
+
elif action in ("bet", "raise"):
if amount is None:
raise ValueError(f"{action} 需要指定金额")
@@ -446,7 +487,6 @@ class Simulation:
def evaluate_player_hand(self, pid: int) -> Optional[HandRanking]:
- """评估玩家手牌强度"""
if pid >= len(self.agents):
return None
@@ -454,22 +494,17 @@ class Simulation:
return None
try:
- # 获取玩家手牌
player_cards = self.player_cards(pid)
- # 获取公共牌
board_cards = self.board_cards(self.current_stage.value)
- # 至少需要5张牌才能评估
all_cards = player_cards + board_cards
if len(all_cards) < 5:
return None
-
- # 如果正好5张牌,直接评估
+
if len(all_cards) == 5:
return HandEvaluator.evaluate5Cards(all_cards)
-
- # 如果超过5张牌,找最佳组合
+
return HandEvaluator.evaluateHand(all_cards)
except Exception as e:
@@ -478,7 +513,7 @@ class Simulation:
def get_active_players(self) -> List[int]:
return [i for i, state in enumerate(self.player_states)
- if state not in [PlayerState.FOLDED, PlayerState.OUT]]
+ if state not in [PlayerState.FOLDED]]
def is_hand_complete(self) -> bool:
active_players = self.get_active_players()
@@ -522,9 +557,8 @@ class Simulation:
winner_id = list(winners.keys())[0]
return {winner_id: self.total_pot}
- # 多人摊牌,使用边池分配
+ # 多人摊牌
if len(winners) > 1:
- #转换HandRanking为数值强度
hand_strengths = {}
for pid, ranking in winners.items():
if ranking is not None:
@@ -539,16 +573,31 @@ class Simulation:
def complete_hand(self) -> Dict:
if not self.is_hand_complete():
return {"complete": False, "message": "牌局未结束"}
+
+ if self.hand_completed:
+ return {
+ "complete": True,
+ "winners": [],
+ "winnings": {},
+ "final_stacks": self.stacks.copy(),
+ "showdown_hands": {},
+ "message": "手牌已完成"
+ }
winners = self.determine_winners()
winnings = self.distribute_pot()
- # 更新筹码
for pid, amount in winnings.items():
if pid < len(self.stacks):
self.stacks[pid] += amount
+
+ self.total_pot = 0
+ self.pot = [0] * len(self.agents)
+ self.side_pot_manager.reset()
+
self.current_stage = GameStage.FINISHED
+ self.hand_completed = True
result = {
"complete": True,
@@ -557,14 +606,22 @@ class Simulation:
"final_stacks": self.stacks.copy(),
"showdown_hands": {}
}
+
+ active_players = [i for i, state in enumerate(self.player_states)
+ if state != PlayerState.FOLDED]
- # 摊牌信息
- for pid, ranking in winners.items():
- if ranking is not None:
+ for pid in active_players:
+ player_hand = self.player_cards(pid)
+ if len(player_hand) >= 2:
+ evaluator = HandEvaluator()
+ board_cards = self.board_cards()
+ ranking = evaluator.evaluate(player_hand, board_cards)
+
result["showdown_hands"][pid] = {
- "cards": [str(card) for card in self.player_cards(pid)],
- "hand_type": ranking.hand_type.type_name,
- "description": str(ranking)
+ "cards": [str(card) for card in player_hand],
+ "hand_type": ranking.hand_type.type_name if ranking else "无牌型",
+ "description": str(ranking) if ranking else "无效手牌",
+ "is_winner": pid in winners
}
return result
\ No newline at end of file
diff --git a/shortdeck_arena_history.jsonl b/shortdeck_arena_history.jsonl
index 68383b6..1b4ab7b 100644
--- a/shortdeck_arena_history.jsonl
+++ b/shortdeck_arena_history.jsonl
@@ -4,3 +4,121 @@
{"history": [{"pid": 0, "action": "check", "amount": null}], "players": ["Agent0", "Agent1"], "player_cards": ["Ac6s", "8hQs"], "board": "9s8s9h7cJh"}
{"history": [{"pid": 0, "action": "check", "amount": null}], "players": ["Agent0", "Agent1"], "player_cards": ["Kc6c", "9hKs"], "board": "8dJs7h7dTs"}
{"history": [{"pid": 0, "action": "check", "amount": null}], "players": ["Agent0", "Agent1"], "player_cards": ["AhTd", "QcTc"], "board": "9hKdKcQh7h"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "bet", "amount": 269}], "players": ["Agent0", "Agent1"], "player_cards": ["AsAd", "8dJc"], "board": "7s8cKcJdTh"}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "bet", "amount": 474}], "players": ["Agent0", "Agent1", "Agent2", "Agent3"], "player_cards": ["6s9s", "Ks7c", "6hQs", "6cAd"], "board": "7hQh7d8dAs"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 3, "action": "bet", "amount": 486}], "players": ["Agent0", "Agent1", "Agent2", "Agent3"], "player_cards": ["QsAs", "6sAc", "6hKd", "Tc7c"], "board": "7dTdQcKsKc"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["AhTc", "As9c"], "board": "9hKd8sJc7d"}
+{"history": [{"pid": 0, "action": "bet", "amount": 123}], "players": ["Agent0"], "player_cards": ["TdKs"], "board": "AhQs7c9hQc"}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 4}], "players": ["Agent0", "Agent1", "Agent2"], "player_cards": ["AdKd", "JhQc", "7d7c"], "board": "Kh9c7hTc8h"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}], "players": ["Agent0", "Agent1"], "player_cards": ["Qh6s", "Ac9c"], "board": "QdKcKdQs7h"}
+{"history": [{"pid": 0, "action": "bet", "amount": 477}], "players": ["Agent0"], "player_cards": ["9d6d"], "board": "KdKsQdKhJs"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}], "players": ["Agent0", "Agent1"], "player_cards": ["TcJs", "KcAd"], "board": "Qh6s7dTd8h"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}], "players": ["Agent0", "Agent1", "Agent2"], "player_cards": ["As9d", "AhQs", "Ad6d"], "board": "6s6h9hAc8h"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["ThAh", "KsJd"], "board": "Js8sTc6hTd"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}], "players": ["Agent0", "Agent1", "Agent2"], "player_cards": ["TcAh", "Kh8d", "TdKc"], "board": "Jd8hJs9h7h"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}], "players": ["Agent0", "Agent1"], "player_cards": ["7hTh", "QsTd"], "board": "JcKc9cAh9s"}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 2}], "players": ["Agent0", "Agent1", "Agent2"], "player_cards": ["8s6h", "7sKd", "TdJs"], "board": "QhJdJh7d7c"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["KhQh", "7cJc"], "board": "AdAh7sQsTc"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["8c9d", "Ah8d"], "board": "6c6dTsQsJs"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["TdJs", "9cQd"], "board": "8cTc8sAs9s"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}], "players": ["Agent0", "Agent1"], "player_cards": ["Qc7h", "QsAc"], "board": "Jc8hQhJh6s"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 299}], "players": ["Agent0", "Agent1"], "player_cards": ["Th7s", "Ac6c"], "board": "QcKc7dQs8d"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}], "players": ["Agent0", "Agent1"], "player_cards": ["Kc6s", "JdAc"], "board": "Th8s7c9h9c"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 3}], "players": ["Agent0", "Agent1"], "player_cards": ["7sTh", "Kh6c"], "board": "7cKdKcAcJd"}
+{"history": [{"pid": 3, "action": "small_blind", "amount": 1}, {"pid": 4, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}], "players": ["Agent0", "Agent1", "Agent2", "Agent3", "Agent4"], "player_cards": ["Ts8c", "9dJs", "As6d", "Kd8s", "Tc8d"], "board": "QdThQcAdTd"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Qc7s", "7hJh"], "board": "Jd9sTcQh6h"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 276}], "players": ["Agent0", "Agent1", "Agent2"], "player_cards": ["7dTc", "9d6d", "7cAs"], "board": "Qc6h8c9sTs"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 310}], "players": ["Agent0", "Agent1"], "player_cards": ["Td6s", "9h9d"], "board": "QcKs6dKh9s"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Td7c", "Qh7s"], "board": "8dKs9dTsJs"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["8cKc", "7d6h"], "board": "9dTcJh6d7h"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 66}], "players": ["Agent0", "Agent1"], "player_cards": ["Ad6h", "8h7s"], "board": "Ts6c8cThAs"}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}], "players": ["Agent0", "Agent1", "Agent2", "Agent3"], "player_cards": ["9s9d", "AsTh", "7d9h", "Kh7s"], "board": "7c6dKd6hJh"}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 4, "action": "call", "amount": 2}], "players": ["Agent0", "Agent1", "Agent2", "Agent3", "Agent4"], "player_cards": ["9cKc", "AhQc", "7hQd", "Ac8h", "JsTd"], "board": "QhQsTcTsKh"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 382}], "players": ["Agent0", "Agent1"], "player_cards": ["Qh8c", "6sAd"], "board": "9s9h7h6h7c"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Tc8c", "As8s"], "board": "Qs7cJd7dQh"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Ah7d", "KcKd"], "board": "6cQdQhTh8c"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 13}], "players": ["Agent0", "Agent1"], "player_cards": ["KdTs", "8s6h"], "board": "ThKhJsAc8d"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Ac7c", "Jc9h"], "board": "JdAsQh6hKh"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Ks8s", "Qh9h"], "board": "8cTd7cJdAs"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 15}], "players": ["Agent0", "Agent1"], "player_cards": ["8s6h", "9dTh"], "board": "JdJh9c8cTc"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 33}], "players": ["Agent0", "Agent1"], "player_cards": ["Qh8c", "TcAd"], "board": "9dTdJdJh6s"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 22}], "players": ["Agent0", "Agent1"], "player_cards": ["8cTd", "9sKd"], "board": "8h6d7cTsKc"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}], "players": ["Agent0", "Agent1", "Agent2"], "player_cards": ["KdKc", "Td7s", "TsQd"], "board": "9hAh7dAsAd"}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}], "players": ["Agent0", "Agent1", "Agent2", "Agent3"], "player_cards": ["8sAs", "Ac6d", "8d9s", "Kh7s"], "board": "6cJdTs8cTh"}
+{"history": [{"pid": 3, "action": "small_blind", "amount": 1}, {"pid": 4, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}], "players": ["Agent0", "Agent1", "Agent2", "Agent3", "Agent4"], "player_cards": ["7c6d", "8d9d", "JdQs", "KsAs", "JsAd"], "board": "Td9c9sQhQd"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["9cQs", "8cQc"], "board": "9h9sThAhJs"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["6d6s", "9s8d"], "board": "7hJdAhTd6h"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Tc9h", "AsKs"], "board": "ThKdKc8cAd"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Kc9d", "8h7c"], "board": "Jc7hJhQsJs"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}], "players": ["Agent0", "Agent1"], "player_cards": ["6cAd", "JcJh"], "board": "QcQh9cQd8c"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Qc9s", "9cTh"], "board": "Ac8sKhTd6s"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 108}], "players": ["Agent0", "Agent1"], "player_cards": ["KhTc", "9cQs"], "board": "7sTdAs8d9h"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["6dQd", "AhTd"], "board": "9dJh7sAsQh"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["6hQc", "JcJh"], "board": "Qh6c7c9c6s"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 101}], "players": ["Agent0", "Agent1"], "player_cards": ["8cTs", "KdTd"], "board": "8dJc9s9cQd"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 46}], "players": ["Agent0", "Agent1"], "player_cards": ["Ad9d", "Ah7d"], "board": "8dTsJc9s7c"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}], "players": ["Agent0", "Agent1"], "player_cards": ["TsQh", "7dQd"], "board": "8h6sTcJdQs"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "bet", "amount": 224}], "players": ["Agent0", "Agent1"], "player_cards": ["TcTd", "AhKc"], "board": "6s9cAcJs7s"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "bet", "amount": 224}], "players": ["Agent0", "Agent1"], "player_cards": ["Ts8d", "QdQs"], "board": "TcJdKhJs7c"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "bet", "amount": 224}], "players": ["Agent0", "Agent1"], "player_cards": ["Qc7h", "Jd7s"], "board": "8c9sAhQdQh"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 205}], "players": ["Agent0", "Agent1"], "player_cards": ["8d9h", "6s8c"], "board": "Tc9d6dQsKs"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["7hAs", "JdTc"], "board": "6sTd8cQdKh"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 118}], "players": ["Agent0", "Agent1"], "player_cards": ["JdTh", "TdJh"], "board": "Qh7dKc8sAs"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["8dKs", "Qh9h"], "board": "Td7c8h9cKd"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 131}], "players": ["Agent0", "Agent1"], "player_cards": ["Qh6h", "Qc9d"], "board": "7hJsTd7cKh"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["7hTs", "As9h"], "board": "6d6c8cJs7d"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}], "players": ["Agent0", "Agent1"], "player_cards": ["9hTh", "7c6h"], "board": "8h8d6cQh7d"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "bet", "amount": 108}], "players": ["Agent0", "Agent1"], "player_cards": ["TcAh", "9h9c"], "board": "Qc6hJc7hAc"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 61}], "players": ["Agent0", "Agent1"], "player_cards": ["7cKd", "8s9c"], "board": "6dQsTs8dTc"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "allin", "amount": 937}], "players": ["Agent0", "Agent1"], "player_cards": ["JhTd", "Qs6s"], "board": "Qd7c9cQc7d"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["TdAh", "JdAd"], "board": "Js9cTc8h7c"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["8c8h", "Jh7d"], "board": "7cAs9hKdTs"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["TsJs", "Kd7c"], "board": "8dKs6h8h9d"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 404}], "players": ["Agent0", "Agent1"], "player_cards": ["KhJh", "8cTc"], "board": "Qh7d8sQs6s"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Qh6s", "9s7d"], "board": "6h8cKh8hJh"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["AsKc", "QsJc"], "board": "KsQcAd9cTh"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "allin", "amount": 1404}], "players": ["Agent0", "Agent1"], "player_cards": ["AsTc", "KhJd"], "board": "9d6h9cQhKs"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["JcQh", "8hQc"], "board": "As6h7sTc6c"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}], "players": ["Agent0", "Agent1"], "player_cards": ["Ac6s", "9dAh"], "board": "AsTs8h8c7d"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 247}], "players": ["Agent0", "Agent1"], "player_cards": ["As7d", "Kh9h"], "board": "Jh6sJc7h6c"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["AsQs", "Qd6d"], "board": "Tc8c8dTdQc"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 663}], "players": ["Agent0", "Agent1"], "player_cards": ["9sQs", "7d6s"], "board": "7cKh7h9d7s"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 554}], "players": ["Agent0", "Agent1"], "player_cards": ["7d9h", "8s7s"], "board": "TsAh8cQdJs"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 509}], "players": ["Agent0", "Agent1"], "player_cards": ["Ah8d", "AsKh"], "board": "7h6h7sKc6s"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Kh6h", "9cAs"], "board": "9dQs8dKsAd"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 644}], "players": ["Agent0", "Agent1"], "player_cards": ["Kc6s", "Tc8h"], "board": "AsTs6h7hJh"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "allin", "amount": 1254}], "players": ["Agent0", "Agent1"], "player_cards": ["AdKs", "Ac7s"], "board": "Td8h7d6h6c"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "allin", "amount": 1257}], "players": ["Agent0", "Agent1"], "player_cards": ["8h6s", "KsTc"], "board": "Qc8d8sKh6c"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["7cAd", "6dJh"], "board": "QdQh7hTd8s"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["6d7d", "TdAh"], "board": "Ad7s8s9cKd"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Kc9s", "TcJc"], "board": "Ad7c6c8s9c"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["9s9c", "QcQs"], "board": "JsJh8h6dTh"}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}], "players": ["Agent0", "Agent1", "Agent2", "Agent3"], "player_cards": ["TsQd", "Ad6s", "8s9d", "6h9s"], "board": "TcKd8dJs7h"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["TdAd", "6h8d"], "board": "9h6c9cKdJs"}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 2}], "players": ["Agent0", "Agent1", "Agent2"], "player_cards": ["QdJc", "9c6s", "9s9h"], "board": "KdAsTsKh7d"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["9h8d", "9d9s"], "board": "7sQsAdKd9c"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["QsJd", "KsAd"], "board": "8d6sJs7cKh"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["8dQh", "ThQc"], "board": "Ks9cAdTd8h"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["6hTh", "QcKs"], "board": "As6sJh9c9d"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["QhJd", "9s7s"], "board": "Td9d9c8d9h"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Ah6s", "6h7d"], "board": "AdQdQhTs8d"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["7hKh", "8dJh"], "board": "TsKcQsKd7d"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["8s6d", "9sAd"], "board": "Qh8h9c8dTs"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["KhQs", "Ah9h"], "board": "Qc8dQhKcAd"}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}], "players": ["Agent0", "Agent1", "Agent2", "Agent3"], "player_cards": ["9h7c", "JdQc", "Tc7d", "8c9c"], "board": "Kc6cKs7h7s"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 384}], "players": ["Agent0", "Agent1"], "player_cards": ["7sAd", "KsAs"], "board": "QhAcKhTc6d"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 4}], "players": ["Agent0", "Agent1"], "player_cards": ["Ts7c", "Td8d"], "board": "KcTh6cAc6d"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 93}], "players": ["Agent0", "Agent1", "Agent2"], "player_cards": ["JhQd", "ThAc", "9cAd"], "board": "Qs6h8cAh7s"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["9dJd", "Ad7c"], "board": "KsTdJcAc8h"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["Qs9c", "8hKc"], "board": "QdQhJs6sTh"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["QsKd", "As7d"], "board": "9s8c7c9c8s"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 75}], "players": ["Agent0", "Agent1"], "player_cards": ["Ks6h", "9s7s"], "board": "9d7d6cJd6d"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["6cAh", "9cKc"], "board": "6dTcTsAsQs"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}], "players": ["Agent0", "Agent1", "Agent2"], "player_cards": ["9c9d", "Kh6d", "9hTc"], "board": "KcJhJcKd7h"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 296}], "players": ["Agent0", "Agent1"], "player_cards": ["Js8c", "Tc9d"], "board": "AdAsJhQhTs"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["8cJd", "6dAs"], "board": "9d6s9s6hKh"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["6h7d", "6dAh"], "board": "KcKh8sThKs"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["6cTh", "QdJc"], "board": "8hQcKsJhJs"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["8dQc", "JsQd"], "board": "TsTcJdAdKh"}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["6dQd", "Jd6c"], "board": "AdJhThQs8s"}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}], "players": ["Agent0", "Agent1"], "player_cards": ["KsQs", "7sTh"], "board": "9c9dQh6sJs"}
diff --git a/shortdeck_server/__init__.py b/shortdeck_server/__init__.py
new file mode 100644
index 0000000..948a8db
--- /dev/null
+++ b/shortdeck_server/__init__.py
@@ -0,0 +1,7 @@
+from .arena_adapter import ArenaGame
+from .persistence import append_game_history
+
+__all__ = [
+ "ArenaGame",
+ "append_game_history"
+]
\ No newline at end of file
diff --git a/shortdeck_server/__pycache__/__init__.cpython-313.pyc b/shortdeck_server/__pycache__/__init__.cpython-313.pyc
new file mode 100644
index 0000000..3065b3f
Binary files /dev/null and b/shortdeck_server/__pycache__/__init__.cpython-313.pyc differ
diff --git a/shortdeck_server/__pycache__/arena_adapter.cpython-313.pyc b/shortdeck_server/__pycache__/arena_adapter.cpython-313.pyc
index 210aab3..1554c4a 100644
Binary files a/shortdeck_server/__pycache__/arena_adapter.cpython-313.pyc and b/shortdeck_server/__pycache__/arena_adapter.cpython-313.pyc differ
diff --git a/shortdeck_server/__pycache__/main.cpython-313.pyc b/shortdeck_server/__pycache__/main.cpython-313.pyc
index 206c5ed..0311354 100644
Binary files a/shortdeck_server/__pycache__/main.cpython-313.pyc and b/shortdeck_server/__pycache__/main.cpython-313.pyc differ
diff --git a/shortdeck_server/__pycache__/main_package.cpython-313.pyc b/shortdeck_server/__pycache__/main_package.cpython-313.pyc
new file mode 100644
index 0000000..5f0ebec
Binary files /dev/null and b/shortdeck_server/__pycache__/main_package.cpython-313.pyc differ
diff --git a/shortdeck_server/arena_adapter.py b/shortdeck_server/arena_adapter.py
index 4b92947..5f505a8 100644
--- a/shortdeck_server/arena_adapter.py
+++ b/shortdeck_server/arena_adapter.py
@@ -1,8 +1,8 @@
import uuid
+import random
from typing import List, Optional, Dict
-from shortdeck_arena.simulation import Simulation
-from shortdeck_arena.agent import Agent, HumanAgent
-from shortdeck_arena.game_stage import BlindConfig
+
+from shortdeck_arena import Simulation, Agent, HumanAgent, BlindConfig
class ArenaGame:
@@ -42,6 +42,51 @@ class ArenaGame:
self.sim.new_round()
return player_id
+
+ def get_valid_actions(self, player_id) -> List[str]:
+ if not self.sim:
+ return []
+
+ try:
+ actions_info = self.sim.get_available_actions(player_id)
+ if isinstance(actions_info, dict) and actions_info.get("can_act", False):
+ valid_actions = []
+
+ if actions_info.get("can_fold", False):
+ valid_actions.append("fold")
+ if actions_info.get("can_check", False):
+ valid_actions.append("check")
+ if actions_info.get("can_call", False):
+ valid_actions.append("call")
+ if actions_info.get("can_bet", False):
+ valid_actions.append("bet")
+ if actions_info.get("can_raise", False):
+ valid_actions.append("raise")
+
+ return valid_actions
+ else:
+ return []
+ # 是否需要添加日志
+ except Exception as e:
+ print(f"Error getting valid actions: {e}")
+ valid_actions = ["fold"]
+
+ try:
+ if hasattr(self.sim, 'current_bet') and self.sim.current_bet > 0:
+ valid_actions.append("call")
+ else:
+ valid_actions.append("check")
+
+ if hasattr(self.sim, 'stacks') and player_id < len(self.sim.stacks):
+ if self.sim.stacks[player_id] > getattr(self.sim, 'current_bet', 0):
+ if getattr(self.sim, 'current_bet', 0) > 0:
+ valid_actions.append("raise")
+ else:
+ valid_actions.append("bet")
+ except Exception:
+ pass
+
+ return valid_actions
def apply_action(self, player_id, action, amount: Optional[int] = None) -> dict:
if not self.sim:
@@ -50,6 +95,16 @@ class ArenaGame:
try:
self.sim.apply_action(player_id, action, amount)
+ if (hasattr(self.sim, 'current_stage') and
+ getattr(self.sim.current_stage, 'value', '') == 'finished' and
+ hasattr(self.sim, 'hand_completed') and
+ self.sim.hand_completed):
+
+ import time
+ time.sleep(10)
+ print("游戏结束,自动开始新一轮...")
+ self.reset_hand_keep_chips()
+
self.sim.dump_data()
return {"success": True, "message": f"Applied {action}"}
@@ -59,41 +114,100 @@ class ArenaGame:
def info(self, player_id: Optional[int] = None) -> Dict:
if not self.sim:
- return {"error": "游戏未初始化"}
+ return {
+ "game_id": self.game_id,
+ "players": self.player_names,
+ "dealer_index": 0,
+ "current_turn": 0,
+ "stage": "waiting",
+ "total_pot": 0,
+ "side_pots": [],
+ "player_cards": [],
+ "board_cards": [],
+ "stacks": [self.starting_stack] * len(self.agents),
+ "player_states": ["WAITING"] * len(self.agents),
+ "current_pot": [0] * len(self.agents),
+ "actions": {"can_act": False, "reason": "游戏未开始"}
+ }
info_data = {
"game_id": self.game_id,
"players": self.player_names,
- "dealer_index": self.sim.dealer_position,
- "current_turn": self.sim.current_turn,
- "stage": self.sim.current_stage.value,
- "total_pot": self.sim.total_pot,
- "side_pots": [{"amount": pot.amount, "eligible_players": list(pot.eligible_players)}
- for pot in self.sim.get_side_pots()],
+ "dealer_index": getattr(self.sim, 'dealer_position', 0),
+ "current_turn": getattr(self.sim, 'current_turn', 0),
+ "stage": getattr(self.sim.current_stage, 'value', 'pre_flop') if hasattr(self.sim, 'current_stage') else 'pre_flop',
+ "total_pot": getattr(self.sim, 'total_pot', 0),
+ "side_pots": [],
}
+
+ try:
+ side_pots = self.sim.get_side_pots()
+ info_data["side_pots"] = [{"amount": pot.amount, "eligible_players": list(pot.eligible_players)}
+ for pot in side_pots]
+ except Exception:
+ info_data["side_pots"] = []
+
if player_id is not None and 0 <= player_id < len(self.sim.stacks):
try:
player_cards = self.sim.player_cards(player_id)
info_data["player_cards"] = [str(card) for card in player_cards]
- except Exception:
+ print(f"DEBUG - Player {player_id} cards: {info_data['player_cards']} (raw: {player_cards})")
+ except Exception as e:
+ print(f"DEBUG - Error getting player {player_id} cards: {e}")
info_data["player_cards"] = []
- info_data["actions"] = self.sim.get_available_actions(player_id)
+ try:
+ actions_result = self.sim.get_available_actions(player_id)
+ info_data["actions"] = actions_result
+ except Exception as e:
+ info_data["actions"] = {"can_act": False, "reason": f"Error getting actions: {str(e)}"}
else:
info_data["player_cards"] = []
info_data["actions"] = {"can_act": False, "reason": "Invalid player"}
try:
- board_cards = self.sim.board_cards(self.sim.current_stage.value)
+ stage_value = getattr(self.sim.current_stage, 'value', 'pre_flop') if hasattr(self.sim, 'current_stage') else 'pre_flop'
+ board_cards = self.sim.board_cards(stage_value)
info_data["board_cards"] = [str(card) for card in board_cards]
except Exception:
info_data["board_cards"] = []
- info_data["stacks"] = self.sim.stacks.copy()
- info_data["player_states"] = [state.value for state in self.sim.player_states]
- info_data["current_pot"] = self.sim.pot.copy()
+ try:
+ info_data["stacks"] = self.sim.stacks.copy() if hasattr(self.sim, 'stacks') else []
+ except Exception:
+ info_data["stacks"] = []
+
+ try:
+ info_data["player_states"] = [state.value for state in self.sim.player_states] if hasattr(self.sim, 'player_states') else []
+ except Exception:
+ info_data["player_states"] = []
+
+ try:
+ info_data["current_pot"] = self.sim.pot.copy() if hasattr(self.sim, 'pot') else []
+ except Exception:
+ info_data["current_pot"] = []
+ if (hasattr(self.sim, 'current_stage') and
+ getattr(self.sim.current_stage, 'value', '') == 'finished' and
+ self.sim.is_hand_complete()):
+
+ result = self.sim.complete_hand()
+ if result.get("complete", False):
+ info_data["showdown_hands"] = result.get("showdown_hands", {})
+ info_data["winnings"] = result.get("winnings", {})
+ info_data["winners"] = result.get("winners", [])
+
+ if not hasattr(self, '_result_shown_count'):
+ self._result_shown_count = 0
+ self._result_shown_count += 1
+
+ if self._result_shown_count >= 3:
+ print(" 自动开始新一轮游戏...")
+ self.sim.new_round()
+ self._result_shown_count = 0
+ info_data["stage"] = "preflop"
+ ## todo
return info_data
@@ -163,4 +277,26 @@ class ArenaGame:
@property
def history(self) -> List[Dict]:
- return self.sim.history if self.sim else []
\ No newline at end of file
+ return self.sim.history if self.sim else []
+
+ def reset_hand_keep_chips(self):
+ if not self.sim or len(self.agents) < 2:
+ return
+
+ if hasattr(self.sim, 'hand_completed') and not self.sim.hand_completed:
+ if self.sim.is_hand_complete():
+ self.sim.complete_hand()
+
+ current_stacks = self.sim.stacks.copy()
+
+ self.sim = Simulation(self.agents, blind_config=self.blind_config)
+
+ self.sim.stacks = current_stacks
+
+ self.sim.new_round()
+
+ def full_reset(self):
+ self.agents = []
+ self.player_names = []
+ self.sim = None
+ self.game_id = str(uuid.uuid4())
\ No newline at end of file
diff --git a/shortdeck_server/data/0f9dbc71-050b-445b-bd3c-8ff31baec1fc.jsonl b/shortdeck_server/data/0f9dbc71-050b-445b-bd3c-8ff31baec1fc.jsonl
new file mode 100644
index 0000000..728c5c4
--- /dev/null
+++ b/shortdeck_server/data/0f9dbc71-050b-445b-bd3c-8ff31baec1fc.jsonl
@@ -0,0 +1,68 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 404}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 404}, {"pid": 1, "action": "call", "amount": 403}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 404}, {"pid": 1, "action": "call", "amount": 403}, {"pid": 1, "action": "allin", "amount": 595}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 404}, {"pid": 1, "action": "call", "amount": 403}, {"pid": 1, "action": "allin", "amount": 595}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "allin", "amount": 1403}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "allin", "amount": 1403}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "allin", "amount": 1404}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "allin", "amount": 1404}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 492}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 492}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 492}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 247}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 247}, {"pid": 1, "action": "call", "amount": 246}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 247}, {"pid": 1, "action": "call", "amount": 246}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 247}, {"pid": 1, "action": "call", "amount": 246}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 247}, {"pid": 1, "action": "call", "amount": 246}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 78}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 78}, {"pid": 1, "action": "raise", "amount": 156}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 78}, {"pid": 1, "action": "raise", "amount": 156}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 663}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 663}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 554}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 554}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 509}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 509}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 509}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 509}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 644}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 644}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "allin", "amount": 1254}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "allin", "amount": 1254}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "allin", "amount": 1257}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "allin", "amount": 1257}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 3}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "raise", "amount": 55}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "raise", "amount": 55}, {"pid": 1, "action": "call", "amount": 52}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "raise", "amount": 55}, {"pid": 1, "action": "call", "amount": 52}, {"pid": 1, "action": "bet", "amount": 107}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "raise", "amount": 55}, {"pid": 1, "action": "call", "amount": 52}, {"pid": 1, "action": "bet", "amount": 107}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}]}
diff --git a/shortdeck_server/data/106221b0-6463-4598-842b-008ce3900934.jsonl b/shortdeck_server/data/106221b0-6463-4598-842b-008ce3900934.jsonl
new file mode 100644
index 0000000..8061e20
--- /dev/null
+++ b/shortdeck_server/data/106221b0-6463-4598-842b-008ce3900934.jsonl
@@ -0,0 +1,36 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 205}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 205}, {"pid": 1, "action": "call", "amount": 204}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 205}, {"pid": 1, "action": "call", "amount": 204}, {"pid": 0, "action": "bet", "amount": 257}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 205}, {"pid": 1, "action": "call", "amount": 204}, {"pid": 0, "action": "bet", "amount": 257}, {"pid": 1, "action": "call", "amount": 257}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 205}, {"pid": 1, "action": "call", "amount": 204}, {"pid": 0, "action": "bet", "amount": 257}, {"pid": 1, "action": "call", "amount": 257}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 34}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 34}, {"pid": 1, "action": "call", "amount": 34}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 118}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 118}, {"pid": 1, "action": "call", "amount": 117}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 118}, {"pid": 1, "action": "call", "amount": 117}, {"pid": 1, "action": "bet", "amount": 235}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 118}, {"pid": 1, "action": "call", "amount": 117}, {"pid": 1, "action": "bet", "amount": 235}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 113}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 113}, {"pid": 1, "action": "call", "amount": 113}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 113}, {"pid": 1, "action": "call", "amount": 113}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 131}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 131}, {"pid": 1, "action": "call", "amount": 130}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 131}, {"pid": 1, "action": "call", "amount": 130}, {"pid": 0, "action": "bet", "amount": 132}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 131}, {"pid": 1, "action": "call", "amount": 130}, {"pid": 0, "action": "bet", "amount": 132}, {"pid": 1, "action": "call", "amount": 132}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 131}, {"pid": 1, "action": "call", "amount": 130}, {"pid": 0, "action": "bet", "amount": 132}, {"pid": 1, "action": "call", "amount": 132}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 131}, {"pid": 1, "action": "call", "amount": 130}, {"pid": 0, "action": "bet", "amount": 132}, {"pid": 1, "action": "call", "amount": 132}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}, {"pid": 0, "action": "raise", "amount": 4}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}, {"pid": 0, "action": "raise", "amount": 4}, {"pid": 1, "action": "raise", "amount": 603}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}, {"pid": 0, "action": "raise", "amount": 4}, {"pid": 1, "action": "raise", "amount": 603}, {"pid": 1, "action": "bet", "amount": 603}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}, {"pid": 0, "action": "raise", "amount": 4}, {"pid": 1, "action": "raise", "amount": 603}, {"pid": 1, "action": "bet", "amount": 603}, {"pid": 1, "action": "bet", "amount": 603}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "bet", "amount": 108}]}
diff --git a/shortdeck_server/data/19bdd797-0603-45d9-934d-f7abdb30ca71.jsonl b/shortdeck_server/data/19bdd797-0603-45d9-934d-f7abdb30ca71.jsonl
new file mode 100644
index 0000000..eecad02
--- /dev/null
+++ b/shortdeck_server/data/19bdd797-0603-45d9-934d-f7abdb30ca71.jsonl
@@ -0,0 +1,7 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 3}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 3}, {"pid": 1, "action": "call", "amount": 2}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 3}, {"pid": 1, "action": "call", "amount": 2}, {"pid": 1, "action": "bet", "amount": 5}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 3}, {"pid": 1, "action": "call", "amount": 2}, {"pid": 1, "action": "bet", "amount": 5}, {"pid": 0, "action": "call", "amount": 5}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 3}, {"pid": 1, "action": "call", "amount": 2}, {"pid": 1, "action": "bet", "amount": 5}, {"pid": 0, "action": "call", "amount": 5}, {"pid": 1, "action": "bet", "amount": 5}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 3}, {"pid": 1, "action": "call", "amount": 2}, {"pid": 1, "action": "bet", "amount": 5}, {"pid": 0, "action": "call", "amount": 5}, {"pid": 1, "action": "bet", "amount": 5}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 3, "action": "small_blind", "amount": 1}, {"pid": 4, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
diff --git a/shortdeck_server/data/2c24ddb9-581f-44df-b14e-0bb904d918e1.jsonl b/shortdeck_server/data/2c24ddb9-581f-44df-b14e-0bb904d918e1.jsonl
new file mode 100644
index 0000000..2ea8a8f
--- /dev/null
+++ b/shortdeck_server/data/2c24ddb9-581f-44df-b14e-0bb904d918e1.jsonl
@@ -0,0 +1,9 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 18}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 18}, {"pid": 0, "action": "call", "amount": 18}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 18}, {"pid": 0, "action": "call", "amount": 18}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 18}, {"pid": 0, "action": "call", "amount": 18}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 400}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 18}, {"pid": 0, "action": "call", "amount": 18}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 400}, {"pid": 1, "action": "call", "amount": 400}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 18}, {"pid": 0, "action": "call", "amount": 18}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 400}, {"pid": 1, "action": "call", "amount": 400}, {"pid": 0, "action": "bet", "amount": 420}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 18}, {"pid": 0, "action": "call", "amount": 18}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 400}, {"pid": 1, "action": "call", "amount": 400}, {"pid": 0, "action": "bet", "amount": 420}, {"pid": 1, "action": "raise", "amount": 580}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 18}, {"pid": 0, "action": "call", "amount": 18}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 400}, {"pid": 1, "action": "call", "amount": 400}, {"pid": 0, "action": "bet", "amount": 420}, {"pid": 1, "action": "raise", "amount": 580}, {"pid": 0, "action": "fold", "amount": 0}]}
diff --git a/shortdeck_server/data/39f51229-8c0a-4a53-b6cf-e21d9e9e49b2.jsonl b/shortdeck_server/data/39f51229-8c0a-4a53-b6cf-e21d9e9e49b2.jsonl
new file mode 100644
index 0000000..6ce3e42
--- /dev/null
+++ b/shortdeck_server/data/39f51229-8c0a-4a53-b6cf-e21d9e9e49b2.jsonl
@@ -0,0 +1,5 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 2}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 2}, {"pid": 2, "action": "call", "amount": 1}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 2}, {"pid": 2, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 4}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 2}, {"pid": 2, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 4}, {"pid": 2, "action": "call", "amount": 4}]}
diff --git a/shortdeck_server/data/49705745-32f4-4161-bc02-4d65fc4a6081.jsonl b/shortdeck_server/data/49705745-32f4-4161-bc02-4d65fc4a6081.jsonl
new file mode 100644
index 0000000..0086142
--- /dev/null
+++ b/shortdeck_server/data/49705745-32f4-4161-bc02-4d65fc4a6081.jsonl
@@ -0,0 +1,9 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
diff --git a/shortdeck_server/data/519ef99d-edd2-4d31-956b-c39e7bc72506.jsonl b/shortdeck_server/data/519ef99d-edd2-4d31-956b-c39e7bc72506.jsonl
new file mode 100644
index 0000000..7edba19
--- /dev/null
+++ b/shortdeck_server/data/519ef99d-edd2-4d31-956b-c39e7bc72506.jsonl
@@ -0,0 +1,20 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 299}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 299}, {"pid": 1, "action": "call", "amount": 298}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 299}, {"pid": 1, "action": "call", "amount": 298}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 299}, {"pid": 1, "action": "call", "amount": 298}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 320}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 299}, {"pid": 1, "action": "call", "amount": 298}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 320}, {"pid": 1, "action": "call", "amount": 320}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 299}, {"pid": 1, "action": "call", "amount": 298}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 320}, {"pid": 1, "action": "call", "amount": 320}, {"pid": 0, "action": "bet", "amount": 376}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 0}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 0}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 0}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 0}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 0}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 0}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
diff --git a/shortdeck_server/data/52482f92-1af8-4b20-8efc-3ca2188350c1.jsonl b/shortdeck_server/data/52482f92-1af8-4b20-8efc-3ca2188350c1.jsonl
new file mode 100644
index 0000000..d4c4129
--- /dev/null
+++ b/shortdeck_server/data/52482f92-1af8-4b20-8efc-3ca2188350c1.jsonl
@@ -0,0 +1 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
diff --git a/shortdeck_server/data/5be4fc33-5c99-41cf-a51e-02614f8b8365.jsonl b/shortdeck_server/data/5be4fc33-5c99-41cf-a51e-02614f8b8365.jsonl
new file mode 100644
index 0000000..2cc5efe
--- /dev/null
+++ b/shortdeck_server/data/5be4fc33-5c99-41cf-a51e-02614f8b8365.jsonl
@@ -0,0 +1,7 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 384}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 384}, {"pid": 1, "action": "call", "amount": 383}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 384}, {"pid": 1, "action": "call", "amount": 383}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 4}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 4}, {"pid": 1, "action": "call", "amount": 3}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 4}, {"pid": 1, "action": "call", "amount": 3}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 93}]}
diff --git a/shortdeck_server/data/6b5b7218-e5d4-4616-b902-f2fee6552578.jsonl b/shortdeck_server/data/6b5b7218-e5d4-4616-b902-f2fee6552578.jsonl
new file mode 100644
index 0000000..27d4dc8
--- /dev/null
+++ b/shortdeck_server/data/6b5b7218-e5d4-4616-b902-f2fee6552578.jsonl
@@ -0,0 +1,4 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 310}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 310}, {"pid": 1, "action": "call", "amount": 309}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 310}, {"pid": 1, "action": "call", "amount": 309}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
diff --git a/shortdeck_server/data/6efc8ba0-e9b5-40a9-af79-863f92e2619d.jsonl b/shortdeck_server/data/6efc8ba0-e9b5-40a9-af79-863f92e2619d.jsonl
new file mode 100644
index 0000000..4d11beb
--- /dev/null
+++ b/shortdeck_server/data/6efc8ba0-e9b5-40a9-af79-863f92e2619d.jsonl
@@ -0,0 +1,32 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 340}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 340}, {"pid": 1, "action": "allin", "amount": 999}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 340}, {"pid": 1, "action": "allin", "amount": 999}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 207}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 207}, {"pid": 1, "action": "call", "amount": 207}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 207}, {"pid": 1, "action": "call", "amount": 207}, {"pid": 0, "action": "bet", "amount": 217}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 207}, {"pid": 1, "action": "call", "amount": 207}, {"pid": 0, "action": "bet", "amount": 217}, {"pid": 1, "action": "call", "amount": 217}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 207}, {"pid": 1, "action": "call", "amount": 207}, {"pid": 0, "action": "bet", "amount": 217}, {"pid": 1, "action": "call", "amount": 217}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 6}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 6}, {"pid": 1, "action": "call", "amount": 6}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 22}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 22}, {"pid": 1, "action": "call", "amount": 22}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 22}, {"pid": 1, "action": "call", "amount": 22}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
diff --git a/shortdeck_server/data/6fecc21b-5614-4dae-ab2a-d179772350e9.jsonl b/shortdeck_server/data/6fecc21b-5614-4dae-ab2a-d179772350e9.jsonl
new file mode 100644
index 0000000..360c626
--- /dev/null
+++ b/shortdeck_server/data/6fecc21b-5614-4dae-ab2a-d179772350e9.jsonl
@@ -0,0 +1,6 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 61}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 61}, {"pid": 1, "action": "call", "amount": 60}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 61}, {"pid": 1, "action": "call", "amount": 60}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 61}, {"pid": 1, "action": "call", "amount": 60}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 61}, {"pid": 1, "action": "call", "amount": 60}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "allin", "amount": 937}]}
diff --git a/shortdeck_server/data/720fe666-fa9c-4d73-a4b1-247d49e8e2a3.jsonl b/shortdeck_server/data/720fe666-fa9c-4d73-a4b1-247d49e8e2a3.jsonl
new file mode 100644
index 0000000..92a1a57
--- /dev/null
+++ b/shortdeck_server/data/720fe666-fa9c-4d73-a4b1-247d49e8e2a3.jsonl
@@ -0,0 +1 @@
+{"history": [{"pid": 0, "action": "bet", "amount": 682}]}
diff --git a/shortdeck_server/data/78b6abaf-75a7-4f14-85f0-f27f49ed9a6d.jsonl b/shortdeck_server/data/78b6abaf-75a7-4f14-85f0-f27f49ed9a6d.jsonl
new file mode 100644
index 0000000..e37c90d
--- /dev/null
+++ b/shortdeck_server/data/78b6abaf-75a7-4f14-85f0-f27f49ed9a6d.jsonl
@@ -0,0 +1,5 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 3}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "raise", "amount": 486}]}
diff --git a/shortdeck_server/data/7cfd6443-9bb3-4a7f-b71f-6d21a601ecd9.jsonl b/shortdeck_server/data/7cfd6443-9bb3-4a7f-b71f-6d21a601ecd9.jsonl
new file mode 100644
index 0000000..a495444
--- /dev/null
+++ b/shortdeck_server/data/7cfd6443-9bb3-4a7f-b71f-6d21a601ecd9.jsonl
@@ -0,0 +1,6 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 203}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 203}, {"pid": 1, "action": "call", "amount": 203}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 203}, {"pid": 1, "action": "call", "amount": 203}, {"pid": 0, "action": "check", "amount": 0}]}
diff --git a/shortdeck_server/data/7f2989fa-63f3-4a0c-ab1e-1262af568162.jsonl b/shortdeck_server/data/7f2989fa-63f3-4a0c-ab1e-1262af568162.jsonl
new file mode 100644
index 0000000..b7ce757
--- /dev/null
+++ b/shortdeck_server/data/7f2989fa-63f3-4a0c-ab1e-1262af568162.jsonl
@@ -0,0 +1,3 @@
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 3, "action": "bet", "amount": 486}]}
diff --git a/shortdeck_server/data/7f2c27d4-4f40-4056-9cc9-7b9a41c8b440.jsonl b/shortdeck_server/data/7f2c27d4-4f40-4056-9cc9-7b9a41c8b440.jsonl
new file mode 100644
index 0000000..76761d4
--- /dev/null
+++ b/shortdeck_server/data/7f2c27d4-4f40-4056-9cc9-7b9a41c8b440.jsonl
@@ -0,0 +1,22 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 3}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}, {"pid": 0, "action": "raise", "amount": 215}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}, {"pid": 0, "action": "raise", "amount": 215}, {"pid": 1, "action": "call", "amount": 213}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}, {"pid": 0, "action": "raise", "amount": 215}, {"pid": 1, "action": "call", "amount": 213}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}, {"pid": 0, "action": "raise", "amount": 215}, {"pid": 1, "action": "call", "amount": 213}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 3}, {"pid": 0, "action": "raise", "amount": 215}, {"pid": 1, "action": "call", "amount": 213}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 40}]}
diff --git a/shortdeck_server/data/847df1f7-0470-4086-b3a1-7680ad190f3d.jsonl b/shortdeck_server/data/847df1f7-0470-4086-b3a1-7680ad190f3d.jsonl
new file mode 100644
index 0000000..3c2421b
--- /dev/null
+++ b/shortdeck_server/data/847df1f7-0470-4086-b3a1-7680ad190f3d.jsonl
@@ -0,0 +1,6 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 393}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 393}, {"pid": 1, "action": "call", "amount": 393}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 393}, {"pid": 1, "action": "call", "amount": 393}, {"pid": 0, "action": "bet", "amount": 395}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 393}, {"pid": 1, "action": "call", "amount": 393}, {"pid": 0, "action": "bet", "amount": 395}, {"pid": 1, "action": "fold", "amount": 0}]}
diff --git a/shortdeck_server/data/925d78a3-d647-458a-9a74-2200b4199e13.jsonl b/shortdeck_server/data/925d78a3-d647-458a-9a74-2200b4199e13.jsonl
new file mode 100644
index 0000000..f5b7594
--- /dev/null
+++ b/shortdeck_server/data/925d78a3-d647-458a-9a74-2200b4199e13.jsonl
@@ -0,0 +1,3 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}]}
diff --git a/shortdeck_server/data/97e7ded5-0930-43e0-b99e-ec1253db0b00.jsonl b/shortdeck_server/data/97e7ded5-0930-43e0-b99e-ec1253db0b00.jsonl
new file mode 100644
index 0000000..8d2e7d2
--- /dev/null
+++ b/shortdeck_server/data/97e7ded5-0930-43e0-b99e-ec1253db0b00.jsonl
@@ -0,0 +1,5 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "bet", "amount": 269}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "bet", "amount": 474}]}
diff --git a/shortdeck_server/data/9876a5c4-152a-4e8c-9130-e8d035bf62b5.jsonl b/shortdeck_server/data/9876a5c4-152a-4e8c-9130-e8d035bf62b5.jsonl
new file mode 100644
index 0000000..526c036
--- /dev/null
+++ b/shortdeck_server/data/9876a5c4-152a-4e8c-9130-e8d035bf62b5.jsonl
@@ -0,0 +1,3 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
diff --git a/shortdeck_server/data/9d4ef610-012e-48e6-93b0-95344a2b9ab8.jsonl b/shortdeck_server/data/9d4ef610-012e-48e6-93b0-95344a2b9ab8.jsonl
new file mode 100644
index 0000000..0d71638
--- /dev/null
+++ b/shortdeck_server/data/9d4ef610-012e-48e6-93b0-95344a2b9ab8.jsonl
@@ -0,0 +1,48 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 382}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 382}, {"pid": 1, "action": "call", "amount": 381}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 382}, {"pid": 1, "action": "call", "amount": 381}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 382}, {"pid": 1, "action": "call", "amount": 381}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 382}, {"pid": 1, "action": "call", "amount": 381}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 3}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "raise", "amount": 95}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "raise", "amount": 95}, {"pid": 1, "action": "call", "amount": 92}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "raise", "amount": 95}, {"pid": 1, "action": "call", "amount": 92}, {"pid": 0, "action": "bet", "amount": 224}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "raise", "amount": 95}, {"pid": 1, "action": "call", "amount": 92}, {"pid": 0, "action": "bet", "amount": 224}, {"pid": 1, "action": "call", "amount": 224}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "raise", "amount": 95}, {"pid": 1, "action": "call", "amount": 92}, {"pid": 0, "action": "bet", "amount": 224}, {"pid": 1, "action": "call", "amount": 224}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 3}, {"pid": 0, "action": "raise", "amount": 95}, {"pid": 1, "action": "call", "amount": 92}, {"pid": 0, "action": "bet", "amount": 224}, {"pid": 1, "action": "call", "amount": 224}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 13}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 13}, {"pid": 1, "action": "call", "amount": 12}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 13}, {"pid": 1, "action": "call", "amount": 12}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 25}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 25}, {"pid": 0, "action": "call", "amount": 25}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 25}, {"pid": 0, "action": "call", "amount": 25}, {"pid": 1, "action": "bet", "amount": 25}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 25}, {"pid": 0, "action": "call", "amount": 25}, {"pid": 1, "action": "bet", "amount": 25}, {"pid": 0, "action": "raise", "amount": 118}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 25}, {"pid": 0, "action": "call", "amount": 25}, {"pid": 1, "action": "bet", "amount": 25}, {"pid": 0, "action": "raise", "amount": 118}, {"pid": 1, "action": "call", "amount": 93}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "bet", "amount": 25}, {"pid": 0, "action": "call", "amount": 25}, {"pid": 1, "action": "bet", "amount": 25}, {"pid": 0, "action": "raise", "amount": 118}, {"pid": 1, "action": "call", "amount": 93}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 15}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 15}, {"pid": 1, "action": "call", "amount": 14}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 15}, {"pid": 1, "action": "call", "amount": 14}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 33}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 33}, {"pid": 1, "action": "call", "amount": 32}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 33}, {"pid": 1, "action": "call", "amount": 32}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 22}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 22}, {"pid": 1, "action": "call", "amount": 21}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 22}, {"pid": 1, "action": "call", "amount": 21}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 22}, {"pid": 1, "action": "call", "amount": 21}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}, {"pid": 1, "action": "call", "amount": 2}]}
+{"history": [{"pid": 3, "action": "small_blind", "amount": 1}, {"pid": 4, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}]}
diff --git a/shortdeck_server/data/9fd090b6-acfd-4483-8bd2-f5565aa466ac.jsonl b/shortdeck_server/data/9fd090b6-acfd-4483-8bd2-f5565aa466ac.jsonl
new file mode 100644
index 0000000..189089c
--- /dev/null
+++ b/shortdeck_server/data/9fd090b6-acfd-4483-8bd2-f5565aa466ac.jsonl
@@ -0,0 +1,4 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 296}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 296}, {"pid": 1, "action": "call", "amount": 295}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 296}, {"pid": 1, "action": "call", "amount": 295}, {"pid": 1, "action": "allin", "amount": 703}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 296}, {"pid": 1, "action": "call", "amount": 295}, {"pid": 1, "action": "allin", "amount": 703}, {"pid": 0, "action": "fold", "amount": 0}]}
diff --git a/shortdeck_server/data/a0fe4e18-ef0b-4426-be59-ef0ed794ce71.jsonl b/shortdeck_server/data/a0fe4e18-ef0b-4426-be59-ef0ed794ce71.jsonl
new file mode 100644
index 0000000..77a9530
--- /dev/null
+++ b/shortdeck_server/data/a0fe4e18-ef0b-4426-be59-ef0ed794ce71.jsonl
@@ -0,0 +1,7 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "allin", "amount": 1001}]}
diff --git a/shortdeck_server/data/a2f1f761-f709-4aa7-8ca7-d73b6eec394c.jsonl b/shortdeck_server/data/a2f1f761-f709-4aa7-8ca7-d73b6eec394c.jsonl
new file mode 100644
index 0000000..d1bb673
--- /dev/null
+++ b/shortdeck_server/data/a2f1f761-f709-4aa7-8ca7-d73b6eec394c.jsonl
@@ -0,0 +1,21 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 360}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 360}, {"pid": 1, "action": "call", "amount": 360}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 360}, {"pid": 1, "action": "call", "amount": 360}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 360}, {"pid": 1, "action": "call", "amount": 360}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 360}, {"pid": 1, "action": "call", "amount": 360}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 157}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 157}, {"pid": 1, "action": "call", "amount": 157}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 157}, {"pid": 1, "action": "call", "amount": 157}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 157}, {"pid": 1, "action": "call", "amount": 157}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 157}, {"pid": 1, "action": "call", "amount": 157}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
diff --git a/shortdeck_server/data/a49bf62c-0133-4041-a5af-008ed7a6e365.jsonl b/shortdeck_server/data/a49bf62c-0133-4041-a5af-008ed7a6e365.jsonl
new file mode 100644
index 0000000..7862bdb
--- /dev/null
+++ b/shortdeck_server/data/a49bf62c-0133-4041-a5af-008ed7a6e365.jsonl
@@ -0,0 +1 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 75}]}
diff --git a/shortdeck_server/data/a5cce7d5-7828-4cb1-9731-0d43664cd2e7.jsonl b/shortdeck_server/data/a5cce7d5-7828-4cb1-9731-0d43664cd2e7.jsonl
new file mode 100644
index 0000000..31a3f69
--- /dev/null
+++ b/shortdeck_server/data/a5cce7d5-7828-4cb1-9731-0d43664cd2e7.jsonl
@@ -0,0 +1,2 @@
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 2}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 2}, {"pid": 2, "action": "fold", "amount": 0}]}
diff --git a/shortdeck_server/data/aa241ea0-f0e7-4dd6-8f8e-0a74fcb24d25.jsonl b/shortdeck_server/data/aa241ea0-f0e7-4dd6-8f8e-0a74fcb24d25.jsonl
new file mode 100644
index 0000000..979e9a6
--- /dev/null
+++ b/shortdeck_server/data/aa241ea0-f0e7-4dd6-8f8e-0a74fcb24d25.jsonl
@@ -0,0 +1,12 @@
+{"history": [{"pid": 0, "action": "bet", "amount": 477}]}
+{"history": [{"pid": 0, "action": "bet", "amount": 477}]}
+{"history": [{"pid": 0, "action": "bet", "amount": 477}]}
+{"history": [{"pid": 0, "action": "bet", "amount": 477}]}
+{"history": [{"pid": 0, "action": "bet", "amount": 477}]}
+{"history": [{"pid": 0, "action": "bet", "amount": 477}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 2, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 2, "action": "check", "amount": 0}, {"pid": 2, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 2, "action": "check", "amount": 0}, {"pid": 2, "action": "check", "amount": 0}, {"pid": 2, "action": "fold", "amount": 0}]}
diff --git a/shortdeck_server/data/ab93c6e8-10a4-4032-8a4d-2e44d2fcb2c7.jsonl b/shortdeck_server/data/ab93c6e8-10a4-4032-8a4d-2e44d2fcb2c7.jsonl
new file mode 100644
index 0000000..6673887
--- /dev/null
+++ b/shortdeck_server/data/ab93c6e8-10a4-4032-8a4d-2e44d2fcb2c7.jsonl
@@ -0,0 +1,3 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 276}]}
diff --git a/shortdeck_server/data/bc07666b-6ae1-4721-82a1-637c102f88cf.jsonl b/shortdeck_server/data/bc07666b-6ae1-4721-82a1-637c102f88cf.jsonl
new file mode 100644
index 0000000..e7c9b39
--- /dev/null
+++ b/shortdeck_server/data/bc07666b-6ae1-4721-82a1-637c102f88cf.jsonl
@@ -0,0 +1,2 @@
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "raise", "amount": 4}]}
diff --git a/shortdeck_server/data/c0990ec7-faa1-44a7-9135-be9c1159a55f.jsonl b/shortdeck_server/data/c0990ec7-faa1-44a7-9135-be9c1159a55f.jsonl
new file mode 100644
index 0000000..af90d46
--- /dev/null
+++ b/shortdeck_server/data/c0990ec7-faa1-44a7-9135-be9c1159a55f.jsonl
@@ -0,0 +1,40 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 108}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 108}, {"pid": 1, "action": "call", "amount": 107}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 108}, {"pid": 1, "action": "call", "amount": 107}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 108}, {"pid": 1, "action": "call", "amount": 107}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 108}, {"pid": 1, "action": "call", "amount": 107}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 62}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 62}, {"pid": 1, "action": "call", "amount": 62}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 62}, {"pid": 1, "action": "call", "amount": 62}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 62}, {"pid": 1, "action": "call", "amount": 62}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 124}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 62}, {"pid": 1, "action": "call", "amount": 62}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 124}, {"pid": 0, "action": "raise", "amount": 341}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 62}, {"pid": 1, "action": "call", "amount": 62}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 124}, {"pid": 0, "action": "raise", "amount": 341}, {"pid": 1, "action": "call", "amount": 217}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "bet", "amount": 62}, {"pid": 1, "action": "call", "amount": 62}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "bet", "amount": 124}, {"pid": 0, "action": "raise", "amount": 341}, {"pid": 1, "action": "call", "amount": 217}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 101}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 101}, {"pid": 1, "action": "call", "amount": 100}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 101}, {"pid": 1, "action": "call", "amount": 100}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 101}, {"pid": 1, "action": "call", "amount": 100}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 157}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 101}, {"pid": 1, "action": "call", "amount": 100}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 157}, {"pid": 1, "action": "call", "amount": 157}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 101}, {"pid": 1, "action": "call", "amount": 100}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 157}, {"pid": 1, "action": "call", "amount": 157}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 46}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 46}, {"pid": 1, "action": "call", "amount": 45}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 46}, {"pid": 1, "action": "call", "amount": 45}, {"pid": 0, "action": "bet", "amount": 65}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 46}, {"pid": 1, "action": "call", "amount": 45}, {"pid": 0, "action": "bet", "amount": 65}, {"pid": 1, "action": "call", "amount": 65}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 46}, {"pid": 1, "action": "call", "amount": 45}, {"pid": 0, "action": "bet", "amount": 65}, {"pid": 1, "action": "call", "amount": 65}, {"pid": 0, "action": "bet", "amount": 112}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 46}, {"pid": 1, "action": "call", "amount": 45}, {"pid": 0, "action": "bet", "amount": 65}, {"pid": 1, "action": "call", "amount": 65}, {"pid": 0, "action": "bet", "amount": 112}, {"pid": 1, "action": "call", "amount": 112}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 46}, {"pid": 1, "action": "call", "amount": 45}, {"pid": 0, "action": "bet", "amount": 65}, {"pid": 1, "action": "call", "amount": 65}, {"pid": 0, "action": "bet", "amount": 112}, {"pid": 1, "action": "call", "amount": 112}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 0}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 0}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 0}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "bet", "amount": 224}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "bet", "amount": 224}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "bet", "amount": 224}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "bet", "amount": 224}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "bet", "amount": 224}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 0}, {"pid": 1, "action": "bet", "amount": 224}, {"pid": 0, "action": "fold", "amount": 0}]}
diff --git a/shortdeck_server/data/c5182b9b-2e3c-4652-a48e-d7e276b384d2.jsonl b/shortdeck_server/data/c5182b9b-2e3c-4652-a48e-d7e276b384d2.jsonl
new file mode 100644
index 0000000..112d29d
--- /dev/null
+++ b/shortdeck_server/data/c5182b9b-2e3c-4652-a48e-d7e276b384d2.jsonl
@@ -0,0 +1,2 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 2, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}]}
diff --git a/shortdeck_server/data/c5431574-a9e1-4366-ad33-534acf1e9875.jsonl b/shortdeck_server/data/c5431574-a9e1-4366-ad33-534acf1e9875.jsonl
new file mode 100644
index 0000000..9da98ae
--- /dev/null
+++ b/shortdeck_server/data/c5431574-a9e1-4366-ad33-534acf1e9875.jsonl
@@ -0,0 +1,17 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 142}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 142}, {"pid": 1, "action": "call", "amount": 142}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 142}, {"pid": 1, "action": "call", "amount": 142}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 142}, {"pid": 1, "action": "call", "amount": 142}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 2}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 2}, {"pid": 1, "action": "call", "amount": 2}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 2}, {"pid": 1, "action": "call", "amount": 2}, {"pid": 0, "action": "bet", "amount": 325}]}
+{"history": [{"pid": 3, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}]}
diff --git a/shortdeck_server/data/d7545cff-76d5-4261-93a3-d3400a7dc4a5.jsonl b/shortdeck_server/data/d7545cff-76d5-4261-93a3-d3400a7dc4a5.jsonl
new file mode 100644
index 0000000..b1ff3c9
--- /dev/null
+++ b/shortdeck_server/data/d7545cff-76d5-4261-93a3-d3400a7dc4a5.jsonl
@@ -0,0 +1,2 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "allin", "amount": 998}]}
diff --git a/shortdeck_server/data/de5172b9-c67e-45ff-a16c-4a2a5be772ec.jsonl b/shortdeck_server/data/de5172b9-c67e-45ff-a16c-4a2a5be772ec.jsonl
new file mode 100644
index 0000000..9620291
--- /dev/null
+++ b/shortdeck_server/data/de5172b9-c67e-45ff-a16c-4a2a5be772ec.jsonl
@@ -0,0 +1,5 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}]}
+{"history": [{"pid": 1, "action": "small_blind", "amount": 1}, {"pid": 0, "action": "big_blind", "amount": 2}, {"pid": 1, "action": "call", "amount": 1}, {"pid": 0, "action": "fold", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}]}
diff --git a/shortdeck_server/data/dedb9c5f-4727-4089-8966-624d78fcd7da.jsonl b/shortdeck_server/data/dedb9c5f-4727-4089-8966-624d78fcd7da.jsonl
new file mode 100644
index 0000000..a6025a6
--- /dev/null
+++ b/shortdeck_server/data/dedb9c5f-4727-4089-8966-624d78fcd7da.jsonl
@@ -0,0 +1 @@
+{"history": [{"pid": 0, "action": "bet", "amount": 123}]}
diff --git a/shortdeck_server/data/e98a2fdd-8578-4771-9caf-bdf140de9c2e.jsonl b/shortdeck_server/data/e98a2fdd-8578-4771-9caf-bdf140de9c2e.jsonl
new file mode 100644
index 0000000..bb2eb19
--- /dev/null
+++ b/shortdeck_server/data/e98a2fdd-8578-4771-9caf-bdf140de9c2e.jsonl
@@ -0,0 +1,7 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 66}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 66}, {"pid": 1, "action": "call", "amount": 65}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 66}, {"pid": 1, "action": "call", "amount": 65}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 66}, {"pid": 1, "action": "call", "amount": 65}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "raise", "amount": 66}, {"pid": 1, "action": "call", "amount": 65}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 2}]}
+{"history": [{"pid": 2, "action": "small_blind", "amount": 1}, {"pid": 3, "action": "big_blind", "amount": 2}, {"pid": 4, "action": "call", "amount": 2}]}
diff --git a/shortdeck_server/data/ee73daeb-1377-486d-9bdb-fbe8254ca8d9.jsonl b/shortdeck_server/data/ee73daeb-1377-486d-9bdb-fbe8254ca8d9.jsonl
new file mode 100644
index 0000000..ca020da
--- /dev/null
+++ b/shortdeck_server/data/ee73daeb-1377-486d-9bdb-fbe8254ca8d9.jsonl
@@ -0,0 +1,7 @@
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 332}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 332}, {"pid": 1, "action": "call", "amount": 332}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 332}, {"pid": 1, "action": "call", "amount": 332}, {"pid": 0, "action": "bet", "amount": 334}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 332}, {"pid": 1, "action": "call", "amount": 332}, {"pid": 0, "action": "bet", "amount": 334}, {"pid": 1, "action": "call", "amount": 334}]}
+{"history": [{"pid": 0, "action": "small_blind", "amount": 1}, {"pid": 1, "action": "big_blind", "amount": 2}, {"pid": 0, "action": "call", "amount": 1}, {"pid": 1, "action": "check", "amount": 0}, {"pid": 0, "action": "bet", "amount": 332}, {"pid": 1, "action": "call", "amount": 332}, {"pid": 0, "action": "bet", "amount": 334}, {"pid": 1, "action": "call", "amount": 334}, {"pid": 0, "action": "fold", "amount": 0}]}
diff --git a/shortdeck_server/main.py b/shortdeck_server/main.py
index 5ee71bb..5aaa0e9 100644
--- a/shortdeck_server/main.py
+++ b/shortdeck_server/main.py
@@ -1,12 +1,35 @@
+import sys
+import os
+from pathlib import Path
+project_root = Path(__file__).resolve().parent.parent
+if str(project_root) not in sys.path:
+ sys.path.insert(0, str(project_root))
+
from fastapi import FastAPI, HTTPException
+from fastapi.middleware.cors import CORSMiddleware
+from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel
+from typing import List, Optional, Dict, Any
-from .persistence import append_game_history
-from .arena_adapter import ArenaGame
+from shortdeck_server.persistence import append_game_history
+from shortdeck_server.arena_adapter import ArenaGame
+
+app = FastAPI(title="ShortDeck Poker Server", version="1.0.0")
+
+app.add_middleware(
+ CORSMiddleware,
+ allow_origins=["*"],
+ allow_credentials=True,
+ allow_methods=["*"],
+ allow_headers=["*"],
+)
-app = FastAPI(title="shortdeck-server")
GAME = ArenaGame()
+client_path = project_root / "client"
+if client_path.exists():
+ app.mount("/client", StaticFiles(directory=str(client_path)), name="client")
+
class JoinRequest(BaseModel):
name: str
@@ -19,16 +42,67 @@ class JoinResponse(BaseModel):
class ActionRequest(BaseModel):
player_id: int
action: str # "fold", "call", "raise", "check", "bet"
- amount: int | None = None
+ amount: Optional[int] = None
+class ApiResponse(BaseModel):
+ success: bool = True
+ message: Optional[str] = None
+ data: Optional[Dict[str, Any]] = None
+ error: Optional[str] = None
+
+class GameInfo(BaseModel):
+ game_id: str
+ players: List[str]
+ dealer_index: int
+ current_turn: int
+ stage: str
+ total_pot: int
+ side_pots: List[Dict[str, Any]]
+ player_cards: List[str]
+ board_cards: List[str]
+ stacks: List[int]
+ player_states: List[str]
+ current_pot: List[int]
+ actions: Dict[str, Any]
+
+class HandStrength(BaseModel):
+ hand_type: str
+ description: str
+ strength: float
+ cards: List[str]
+
+class Game1v1Response(BaseModel):
+ success: bool
+ message: str
+ human_player_id: Optional[int] = None
+ ai_player_id: Optional[int] = None
+ game_id: Optional[str] = None
+
+
+@app.post("/reset_game")
+def reset_game():
+ global GAME
+ try:
+ GAME = ArenaGame()
+ return {"success": True, "message": "游戏已重置"}
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=str(e)) from e
@app.post("/join", response_model=JoinResponse)
def join(req: JoinRequest):
try:
+ print(f"收到加入请求: {req.name}")
player_id = GAME.join_game(req.name)
+ print(f"玩家 {req.name} 成功加入,ID: {player_id}")
+ return JoinResponse(player_id=player_id, name=req.name)
except ValueError as e:
+ print(f"加入游戏失败 - ValueError: {e}")
raise HTTPException(status_code=400, detail=str(e)) from e
- return JoinResponse(player_id=player_id, name=req.name)
+ except Exception as e:
+ print(f"加入游戏失败 - Exception: {e}")
+ import traceback
+ traceback.print_exc()
+ raise HTTPException(status_code=500, detail=str(e)) from e
@app.get("/get_game_state")
@@ -40,11 +114,78 @@ def get_game_state(player_id):
return state
-@app.post("/apply_action")
+@app.post("/apply_action", response_model=Dict[str, Any])
def apply_action(req: ActionRequest):
try:
- GAME.apply_action(req.player_id, req.action, req.amount)
+ result = GAME.apply_action(req.player_id, req.action, req.amount)
append_game_history(GAME.game_id, {"history": GAME.history})
+ return result
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e)) from e
- return {"ok": True}
+
+@app.get("/valid_actions/{player_id}")
+def get_valid_actions(player_id: int):
+ try:
+ actions = GAME.get_valid_actions(player_id)
+ return {"valid_actions": actions}
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=str(e)) from e
+
+@app.get("/hand_strength/{player_id}")
+def get_hand_strength(player_id: int):
+ try:
+ strength = GAME.get_hand_strength(player_id)
+ return strength
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=str(e)) from e
+
+
+@app.get("/winners")
+def get_winners():
+ try:
+ winners = GAME.get_winners()
+ return winners
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=str(e)) from e
+
+@app.post("/reset")
+def reset_game(request: dict = None):
+ try:
+ global GAME
+ keep_chips = False
+
+ if request and isinstance(request, dict):
+ keep_chips = request.get("keep_chips", False)
+
+ if keep_chips and GAME and len(GAME.agents) >= 2:
+ GAME.reset_hand_keep_chips()
+ message = "游戏重置,筹码保持"
+ else:
+ GAME = ArenaGame()
+ message = "游戏完全重置"
+ return {"ok": True, "message": message}
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=str(e)) from e
+
+@app.get("/hand_complete")
+def check_hand_complete():
+ try:
+ is_complete = GAME.check_hand_complete()
+ return {"hand_complete": is_complete}
+ except Exception as e:
+ raise HTTPException(status_code=500, detail=str(e)) from e
+
+
+if __name__ == "__main__":
+ import uvicorn
+
+ print(" Starting ShortDeck Poker Server...")
+ print(" Server will run on http://localhost:8001")
+ print(" API docs available at http://localhost:8001/docs")
+
+ uvicorn.run(
+ app,
+ host="127.0.0.1",
+ port=8001,
+ reload=False
+ )
diff --git a/shortdeck_server/random_cli.py b/shortdeck_server/random_cli.py
index 94032ed..4a1841c 100644
--- a/shortdeck_server/random_cli.py
+++ b/shortdeck_server/random_cli.py
@@ -7,6 +7,7 @@ from typing import Any, Dict, Optional
import requests
+## 注掉
BASE_PATH = "/get_game_state"
APPLY_PATH = "/apply_action"
diff --git a/shortdeck_server/tests/__pycache__/test_game.cpython-313-pytest-8.4.2.pyc b/shortdeck_server/tests/__pycache__/test_game.cpython-313-pytest-8.4.2.pyc
deleted file mode 100644
index 8b018d6..0000000
Binary files a/shortdeck_server/tests/__pycache__/test_game.cpython-313-pytest-8.4.2.pyc and /dev/null differ
diff --git a/shortdeck_server/tests/test_game.py b/shortdeck_server/tests/test_game.py
deleted file mode 100644
index 14d5603..0000000
--- a/shortdeck_server/tests/test_game.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from __future__ import annotations
-
-from shortdeck_server.arena_adapter import ArenaGame
-
-
-def test_join_and_actions():
- g = ArenaGame(starting_stack=100, max_players=3, small_blind=1, big_blind=2)
- pid0 = g.join_game("aa")
- pid1 = g.join_game("bb")
- assert pid0 == 0
- assert pid1 == 1
-
- state = g.info()
- # 在短牌扑克中,玩家加入后盲注已自动扣除
- # 小盲(pid0): 100-1=99, 大盲(pid1): 100-2=98
- assert state["stacks"] == [99, 98]
-
- # 验证轮次管理:heads-up时小盲先行动
- assert g.current_turn == 0
-
- # 测试错误的玩家尝试行动
- result = g.apply_action(1, "fold")
- assert result["success"] == False
- assert "不是玩家" in result["message"] or "turn" in result["message"].lower()
-
- # 小盲玩家call (跟注到大盲)
- g.apply_action(0, "call")
- assert g.current_turn == 1
-
- # 大盲玩家加注
- g.apply_action(1, "bet", 10)
- assert g.pot >= 10 # 底池至少包含加注金额
- assert g.history[-1]["action"] == "bet"
diff --git a/waitress_server.py b/waitress_server.py
new file mode 100644
index 0000000..e99e5ed
--- /dev/null
+++ b/waitress_server.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+
+import sys
+import os
+from pathlib import Path
+project_root = Path(__file__).parent
+sys.path.insert(0, str(project_root))
+
+if __name__ == "__main__":
+ print("🚀 使用Waitress启动原始FastAPI扑克服务器...")
+ print("📍 服务器地址: http://127.0.0.1:8005")
+ print("🎮 游戏界面: http://127.0.0.1:8005/client/index.html")
+ print("✅ 使用原始ArenaGame实现")
+ print("🪟 Windows优化版本")
+
+ try:
+ from shortdeck_server.main import app
+ from waitress import serve
+
+ def wsgi_app(environ, start_response):
+ import asyncio
+ import json
+ from urllib.parse import parse_qs
+
+ method = environ['REQUEST_METHOD']
+ path = environ['PATH_INFO']
+ query_string = environ.get('QUERY_STRING', '')
+
+ scope = {
+ 'type': 'http',
+ 'method': method,
+ 'path': path,
+ 'query_string': query_string.encode(),
+ 'headers': [(k.lower().replace('_', '-').encode(), v.encode())
+ for k, v in environ.items() if k.startswith('HTTP_')],
+ }
+
+ response_data = {'status': 500, 'headers': [], 'body': b''}
+
+ async def receive():
+ content_length = int(environ.get('CONTENT_LENGTH', 0))
+ if content_length > 0:
+ body = environ['wsgi.input'].read(content_length)
+ return {'type': 'http.request', 'body': body}
+ return {'type': 'http.request', 'body': b''}
+
+ async def send(message):
+ if message['type'] == 'http.response.start':
+ response_data['status'] = message['status']
+ response_data['headers'] = message.get('headers', [])
+ elif message['type'] == 'http.response.body':
+ response_data['body'] += message.get('body', b'')
+
+ try:
+ loop = asyncio.new_event_loop()
+ asyncio.set_event_loop(loop)
+ loop.run_until_complete(app(scope, receive, send))
+ loop.close()
+ except Exception as e:
+ response_data['status'] = 500
+ response_data['body'] = f"Server Error: {str(e)}".encode()
+
+ status = f"{response_data['status']} OK"
+ headers = [(h[0].decode(), h[1].decode()) for h in response_data['headers']]
+ start_response(status, headers)
+ return [response_data['body']]
+
+ serve(wsgi_app, host='127.0.0.1', port=8005, threads=4)
+
+ except KeyboardInterrupt:
+ print("\n 服务器停止")
+ except Exception as e:
+ print(f" 服务器错误: {e}")
+ import traceback
+ traceback.print_exc()
\ No newline at end of file