← 案例展示 / 案例 01

案例研究

Counterplay · 过招

一个原生 6-max、100BB 训练牌桌,五个 GTO 对手每手牌都通过开发者可使用的同一套 Pokerai API 行动。Counterplay 记录 Hero 的每个决策、根据返回频率评分、把重复偏差归入漏洞报告,并保留底层手牌供复盘或可选的依据充分的教练解释。

270行——整个 API 客户端
0缓存策略
10个正在使用的 API 端点

更新于 · 维护者 Pokerai API

Counterplay / iOS真实产品界面
Counterplay iOS 实时训练牌桌
Counterplay iOS 分析报告

01 / 架构

扑克引擎负责牌局,Pokerai API 负责策略。

Counterplay 把游戏机制、会话状态和策略真值分成清晰边界。PokerKit 推进六人桌;陪练服务保留有序行动线、有效筹码、范围与复盘上下文;Pokerai API 提供预解查询或实时求解结果。同一份响应可以驱动对手行动、Hero 评分、范围可视化和后续教练解释,应用无需嵌入私有范围表。

01 / 体验层

iOS App

SwiftUI 界面结合 PokerKit 游戏机制与决策采集。

02 / 状态层

陪练后端

FastAPI 保存当前牌局、行动线、范围与复盘上下文。

03 / 策略层

pokerai.bet

预解翻前、翻牌策略,以及排队执行的转牌和河牌求解。

02 / 产品闭环

在牌桌训练,发现模式,再回到原手牌。

这个产品不只是展示一次求解响应。它把单次决策汇总成分析报告,同时保留底层手牌,供复盘和后续针对性学习。

分析报告

查看重复偏差

把相似决策分组,展示样本数和平均偏差,并按严重程度排列重复出现的翻前和翻后模式。

Counterplay 分析报告展示重复 GTO 偏差
手牌历史

回到准确局面

按手牌、位置或牌面搜索,查看结果与净 BB,再打开报告背后的完整决策顺序。

Counterplay 最近训练手牌历史
讨论与查询

不打完整手牌也能研究局面

选择快速预解查询或精确实时求解,定义底池与位置,再把结果带入聚焦讨论。

Counterplay 快速和精确 GTO 局面查询
陪练偏好

控制语言、身份与教练模型

保持训练界面专注,同时允许玩家选择语言、牌桌身份和用于解释的可选模型。

Counterplay 语言、资料与教练模型设置

03 / 端点清单

每条街都映射到已记录的 API 能力。

取自真实客户端(方法 → 端点 → 用途):

翻前/v1/gto/preflop

对手翻前动作 + Hero 翻前决策评级

翻前/v1/gto/preflop/range

复盘里的 13×13 范围网格

翻牌/v1/gto/flop/tree

翻牌局面的翻后决策树

翻牌/v1/gto/flop/node

当前翻牌节点策略(+评级)

范围/v1/gto/flop/projected-range

沿翻牌行动线更新范围

范围/v1/gto/range

为行动线组装 solver_results

转牌/v1/gto/turn/projected-range

翻牌 → 转牌范围交接

求解器/v1/gto/solver

提交转/河牌局面实时求解

求解器/v1/gto/solver/tree

已解转/河牌局面的决策树

求解器/v1/gto/solver/node

转/河牌节点策略(+评级)

04 / 实现证据

整个策略层只需要一个文件。

客户端不嵌入范围表或求解结果。它整理当前局面、发送鉴权请求,再把标准化策略频率返回给陪练。

01一个共享鉴权请求头。
02与公开端点同名的类型化方法。
03所有街道共用一套超时和重试路径。
04应用中没有私有策略缓存。
app/gto/client.py轻量客户端摘录
class GtoClient:
    def __init__(self, settings):
        self._headers = {"Authorization": f"Bearer {settings.gto_api_key}"}

    async def preflop(self, hole_cards, hero_pos, preflop_actions):
        body = {"hole_cards": hole_cards,
                "positions": {"hero": hero_pos},
                "preflop_actions": preflop_actions}
        return _strategy_from(await self._post("/v1/gto/preflop", body))

    async def flop_node(self, node_token, hole_cards=None):
        body = {"node": node_token}
        if hole_cards: body["hole_cards"] = hole_cards
        return _strategy_from(await self._post("/v1/gto/flop/node", body))
    # … + solver_schedule / solver_tree / solver_node, all one-liners over _post()

05 / 决策闭环

从发牌到有依据的反馈。

01 / 翻前

读取行动线

发送手牌、位置与有序行动,用返回频率驱动行动和评分。

02 / 翻牌

沿树定位

加载预解树、解析当前节点,并在每次行动后投射范围。

03 / 转牌与河牌

提交求解

把范围交给实时求解器,轮询任务,再读取结果策略节点。

04 / 复盘

评分并解释

根据所选动作自身的 GTO 频率衡量偏差,再把结构化上下文交给可选教练。

范围与来源

Counterplay 是由 Pokerai API 维护的产品集成,并非第三方客户部署案例。 这份技术记录只说明 iOS 陪练工作流及该工作流使用的公开 API 端点。 当前产品面向六人桌 100BB 现金桌训练,随机 Hero 座位,使用五个策略驱动对手,并把多人翻后局面约化为单挑近似。教练功能可选;Counterplay 不提供真钱牌桌实时辅助;不主张客户采用、下载量、性能 benchmark、商业合作或外部背书。

基于同一套 API 构建

把策略变成产品。

先获取免费 Key,完成一次翻前调用,再沿用这里使用的同一组公开端点。

获取 API Key · 免费