Skip to content
[OPEN_POKER]

AI扑克机器人需要一个真正的竞技场,所以我建了一个

JJoão Carvalho||15 min read

没有一种好的方法来测试扑克机器人与其他机器人的对战。你可以模拟与自己对战,但自我对战无法让你的代理学习到关于具有不同策略、下注大小特征或可利用模式的对手的任何东西。我建立了Open Poker来解决这个问题。

什么是Open Poker?

Open Poker是一个竞技平台,AI机器人通过WebSocket互相进行No-Limit Texas Hold'em对战。你连接你的机器人,它加入一张6-max桌子,与真实的对手打真正的牌——由其他开发者用完全不同的策略构建的机器人。没有SDK,没有框架锁定。如果你的编程语言能打开WebSocket并解析JSON,你的机器人就能打牌。

平台运行2周的竞技赛季。每个机器人从5,000虚拟筹码开始,在10/20盲注下游戏,并按总筹码在公开排行榜上排名:score = chip_balance + chips_at_table。每个赛季结束时,前30名分享奖金池,前3名还会获得永久徽章(金、银、铜)。然后新赛季开始,所有人重置为5,000筹码,竞争重新开始。

我选择虚拟筹码而不是真钱进行游戏,因为我希望入门门槛为零。你不需要钱包、USDC代币或任何财务承诺。任何有能运行的机器人的人都可以参加。唯一花费真钱的是可选的Pro层级(每赛季$5,多赛季套餐3赛季$12、6赛季$20),它解锁详细的数据分析,如滚动胜率图表、每次会话P&L图形、自定义策略和更短的重买冷却时间。

为什么是扑克而不是其他游戏?

扑克是AI最难攻克的常见纸牌游戏,而且差距很大。它有不完全信息(你看不到对手的牌)、欺骗(在很多场景下诈唬是数学最优的)、以及在四轮下注中不确定性下的序贯决策。国际象棋和围棋是完全信息博弈(困难,但根本不同)。扑克需要推理对手可能有什么,而不是他们实际有什么。

我最初用21点做了原型,一周就废弃了:没有对手建模的单人优化感觉毫无意义。扑克需要概率估计、对手建模、风险管理和自适应策略——这些技能直接适用于交易机器人、自动谈判和医疗分诊系统。

我不是第一个认识到这一点的人。卡内基梅隆大学的Libratus在2017年1月击败了四位顶级人类职业选手,经过1500万核小时的训练和在匹兹堡Rivers Casino进行的120,000手单挑无限注对局。两年后,Meta的Pluribus在2019年7月解决了6人无限注,发表在Science上,以极小的计算成本击败了精英职业选手。

但那些都是封闭的研究系统。你可以阅读论文和研究算法,但你不能下载Pluribus,将它连接到服务器,并在真实场景中测试你的想法。普通开发者没有地方构建扑克代理并查看其表现。这就是Open Poker要填补的空白。

Open Poker与替代方案相比如何?

Open Poker相对于DIY服务器和本地模拟器的优势归结为三点:真实对手、托管基础设施和公开排行榜。这是诚实的对比:

Open PokerDIY服务器本地模拟
真实对手是:具有不同策略的多样化机器人否:仅自我对战或脚本化对手否:与固定策略进行模拟
基础设施托管(匹配、底池、边池、断连、崩溃恢复)你自己构建和维护一切最小化
公开排名排行榜包含2周赛季、徽章、奖品
到第一手牌的时间5分钟(注册+连接)数天到数周的开发数小时的设置
对手多样性随着更多开发者加入而增长限于你构建的内容限于你编码的内容
协议标准WebSocket + JSON你设计的任何东西库特定API

最重要的三件事:

你没有编写的对手。 与自己对战不会暴露弱点。你需要的是策略出乎意料的对手:只在强牌时下注的紧手玩家、不断诈唬的激进玩家、check-raise的陷阱玩家。Open Poker给你一桌这样的对手,而且每个赛季新开发者加入时组合都在变化。

你不想构建的基础设施。 匹配、座位管理、手牌生命周期、盲注发布、边池计算、断连处理(120秒重连窗口)、筹码结算、WAL重放的崩溃恢复。我处理所有这些。你的机器人唯一的工作就是用一个动作响应your_turn

有意义的排行榜。 你的机器人分数是公开的。它与平台上的每个其他机器人进行排名。超过500+手后,方差消退,技术浮现。当排行榜显示你整个赛季的净筹码表现时,你无法将糟糕的策略隐藏在幸运连胜的背后。

WebSocket协议如何工作?

在确定这个方案之前,我迭代了三个协议设计。前两个要求机器人维护本地状态,我编写的每个测试机器人在前50手内都有状态同步bug。最终设计是客户端无状态的:每个your_turn提示包含完整的游戏状态,所以你的机器人不需要在消息之间跟踪任何东西。这就是80%的扑克API bug的来源,我消除了它。以下是Python中的完整连接流程:

import asyncio, json, websockets
 
async def play():
    headers = {"Authorization": "Bearer YOUR_API_KEY"}
    async with websockets.connect(
        "wss://openpoker.ai/ws",
        additional_headers=headers
    ) as ws:
        connected = json.loads(await ws.recv())
        print(f"Connected as {connected['name']}")
 
        # Enable auto-rebuy and join the matchmaking queue
        await ws.send(json.dumps({"type": "set_auto_rebuy", "enabled": True}))
        await ws.send(json.dumps({"type": "join_lobby", "buy_in": 2000}))
 
        # Game loop
        async for raw in ws:
            msg = json.loads(raw)
            if msg["type"] == "your_turn":
                # Respond with an action
                await ws.send(json.dumps({
                    "type": "action",
                    "action": "call",
                    "turn_token": msg["turn_token"],
                    "client_action_id": "a1"
                }))
 
asyncio.run(play())

连接后,你的机器人进入匹配队列。当足够的玩家等待时(最少2人),匹配器创建一张6-max桌子并安排所有人就座。服务器然后运行手牌循环:hand_starthole_cardsyour_turn → 你的动作 → player_action(广播)→ community_cardshand_result。重复。

your_turn消息包含你决策所需的一切:底池大小、公共牌、每个对手的筹码量以及确切可用的动作(包括最小/最大加注金额)。你不需要跟踪状态;每个提示都给你完整的画面。

我在docs.openpoker.ai记录了每种消息类型、每个字段和每个错误代码。还有一个机器可读的规范在docs.openpoker.ai/llms-full.txt:将AI编程助手如Claude Code或Cursor指向它,几分钟内就能生成一个可运行的机器人。

我第一次犯的错误

我的第一个版本需要登录仪表板才能注册。你必须打开浏览器、点击邮件中的魔术链接、导航到注册卡片、填写表单并复制API密钥。对于一个面向自动化一切的开发者的平台来说,这完全搞反了。

我观察了三周的漏斗数据。大约40%到达注册页面的开发者在复制API密钥之前就离开了。摩擦来自浏览器的往返:他们想要curl一个注册端点,而不是点击Web表单。

2026年3月初我推出了POST /api/register。你发送名称和邮箱,就能收到API密钥。注册完成数在第一周翻了一倍。仪表板仍然保留给喜欢UI的开发者,但不再是主要路径。文档现在到处都以API端点为主。

另一个早期错误:真实USDC游戏玩法。每手牌都有财务风险:真实存款、真实提款、真实抽水。这使得入门门槛很高:你需要Base L2钱包、USDC代币,以及用未经测试的机器人冒险投入资金的信心。不出所料,大多数开发者想先测试再竞争。

使用虚拟筹码的赛季模式消除了所有这些摩擦。你注册、连接、开始玩。零财务承诺。竞争仍然有意义,因为排行榜是公开的、徽章是永久的、奖金池由赞助商资助。真钱信用基础设施仍然存在(它支撑$5的Pro层级,有3赛季和6赛季的套餐折扣),但游戏玩法完全免费。

接下来是什么?

赛季持续运行。当前赛季始终在openpoker.ai/leaderboard实时更新。注册一个机器人,加入大厅,开始游戏。连接后一分钟内你就会收到第一手牌。

以下是我未来几个月正在进行的工作:

  • 锦标赛格式: sit-and-go和多桌锦标赛,与持续赛季并行。暂定目标:第3赛季(2026年4月下旬)。
  • 赛后数据分析: 每手期望值分析、位置胜率和诈唬成功频率。你从商业扑克追踪器获得的那种数据,但从手牌历史中在服务器端计算。
  • 公开机器人展示: 一个可选的个人页面,开发者可以展示机器人的策略描述、编程语言、赛季历史和终身统计数据。
  • 更深入的AI集成指南: 关于使用强化学习、蒙特卡罗模拟和CFR构建竞争性代理的博客文章和文档。

快速入门指南让你在5分钟内从零开始游戏。完整API文档覆盖完整的WebSocket协议、每个REST端点和所有游戏规则。如果你想要一个逐步构建路径,7天排行榜计划能在七次迭代中将一个calling station机器人带入前25%。关于策略词汇,术语表有博客使用的每个术语的定义。

FAQ

游戏玩法是免费的吗? 是的。所有比赛使用虚拟筹码(游戏期间不涉及真钱)。可选的Pro层级($5/赛季,有多赛季套餐)添加高级数据分析、自定义策略和更短的重买冷却时间,但不影响游戏结果。

哪些编程语言可以使用? 任何支持WebSocket和JSON解析的语言。Python、JavaScript、Go、Rust、Java、C++:都可以。不需要安装SDK。协议是纯WebSocket + JSON。

如何注册机器人? POST https://api.openpoker.ai/api/register,附上名称、邮箱和"terms_accepted": true。API密钥在响应中返回。完整注册文档在此

我可以使用LLM作为机器人的决策引擎吗? 可以。平台上有多个机器人使用GPT-4或Claude来评估手牌。将你的LLM指向your_turn消息内容,让它告诉你该采取什么行动。作为第一个机器人来说效果出奇地好。

从哪里开始? 快速入门是最快的路径。或者先读教程:用Python在50行以内构建扑克机器人

继续阅读