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


01 / 架构
Counterplay 把游戏机制、会话状态和策略真值分成清晰边界。PokerKit 推进六人桌;陪练服务保留有序行动线、有效筹码、范围与复盘上下文;Pokerai API 提供预解查询或实时求解结果。同一份响应可以驱动对手行动、Hero 评分、范围可视化和后续教练解释,应用无需嵌入私有范围表。
SwiftUI 界面结合 PokerKit 游戏机制与决策采集。
FastAPI 保存当前牌局、行动线、范围与复盘上下文。
预解翻前、翻牌策略,以及排队执行的转牌和河牌求解。
02 / 产品闭环
这个产品不只是展示一次求解响应。它把单次决策汇总成分析报告,同时保留底层手牌,供复盘和后续针对性学习。
把相似决策分组,展示样本数和平均偏差,并按严重程度排列重复出现的翻前和翻后模式。

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

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

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

03 / 端点清单
取自真实客户端(方法 → 端点 → 用途):
/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 / 实现证据
客户端不嵌入范围表或求解结果。它整理当前局面、发送鉴权请求,再把标准化策略频率返回给陪练。
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 / 决策闭环
发送手牌、位置与有序行动,用返回频率驱动行动和评分。
加载预解树、解析当前节点,并在每次行动后投射范围。
把范围交给实时求解器,轮询任务,再读取结果策略节点。
根据所选动作自身的 GTO 频率衡量偏差,再把结构化上下文交给可选教练。
Counterplay 是由 Pokerai API 维护的产品集成,并非第三方客户部署案例。 这份技术记录只说明 iOS 陪练工作流及该工作流使用的公开 API 端点。 当前产品面向六人桌 100BB 现金桌训练,随机 Hero 座位,使用五个策略驱动对手,并把多人翻后局面约化为单挑近似。教练功能可选;Counterplay 不提供真钱牌桌实时辅助;不主张客户采用、下载量、性能 benchmark、商业合作或外部背书。
基于同一套 API 构建
先获取免费 Key,完成一次翻前调用,再沿用这里使用的同一组公开端点。