cwc-workshops排行榜评分算法解析:钻石数与Token数的胜负判定规则
【免费下载链接】cwc-workshops项目地址: https://gitcode.com/GitHub_Trending/cw/cwc-workshops
在 cwc-workshops 的Agent Battle工作坊里,每位选手都会配置一个 Claude 托管 Agent 去驱动 Minecraft 机器人挖钻石:5 分钟一轮,钻石数多者获胜,Token 数少者赢下平局,只取最佳单轮成绩。本文带你快速看懂排行榜评分算法的完整胜负判定规则——钻石数怎么统计、Token 数从哪来、平局如何裁定、系统又如何防作弊。
一、30秒看懂核心评分规则
🎯 整个比赛的判定逻辑可以压缩成一句话:
Best single run wins. Most diamonds wins; fewest tokens breaks ties.(最佳单轮成绩有效:钻石最多者胜;钻石相同时,Token 消耗最少者胜。)
| 规则项 | 内容 | 说明 |
|---|---|---|
| 单轮时长 | 300 秒(5 分钟) | 由RUN_SECONDS = 300固定,服务器另有 5 秒宽限 |
| 获胜指标 | 钻石数(desc 降序) | 取diamond_N成就中的最大 N |
| 平局裁决 | Token 数(asc 升序) | 同钻石数时,消耗 Token 少者排名靠前 |
| 成绩累计 | 只算最佳单轮 | 多轮成绩不叠加,自由重试,刷出最高分即可 |
| 起点公平 | 固定出生点 y=-40 + 固定装备包 | 由机器人侧强制执行,无法靠改配置获得优势 |
规则定义见 agent-battle/README.md,核心代码在排行榜状态机 event/lib/board.mjs。
二、钻石数如何统计:成就系统是唯一数据真相
很多人以为"钻石数"是客户端自报的,其实不然——服务器只信任成就上报(achievements):
- 机器人每捡到一个钻石,就向排行榜 POST 一条
diamond_1、diamond_2…… 成就(见 bot/bot.js)。 - 每条成就都带有
run_elapsed_ms(自本轮开始以来的毫秒数),服务器端硬性校验:超过 305 秒的成就直接拒绝(MAX_RUN_MS = 305_000,见 board.mjs)。 - 排行榜计算时,取所有
diamond_N成就中最大的 N作为该选手的可信钻石数(见 board.mjs)。
💡 关键细节:
/cost接口里自报的diamonds字段不参与排名,因为它没有时间闸门。真正的排名数据源只有服务端时间校验过的成就流。
三、Token数从哪来:CostTracker 与每 2 回合上报
Token 数由本地 harness 统计并单独上报(因为只有它知道 API 的真实用量):
CostTracker累积input_tokens + output_tokens,每执行一次 Minecraft 动作记 1 个 turn(见 harness/leaderboard.py)。- 每 2 个回合向
/api/cost上报一次当前 tokens/turns 总量,保证直播间能看到"实时成本曲线"(REPORT_EVERY = 2)。 - 每轮开始时
reset_run()会清零钻石计数并打上时间戳runStartedAt——这就是防作弊的时间锚点(见 bot/bot.js)。
也就是说:挖得越多分越高,但每一句废话、每一次冗余轮询状态,都在悄悄扣你的 Token 余额。这正是比赛考核的"效率"维度——官方 README 直言:默认 Agent 聊天太多、重复轮询、矿脉挖完不转移,都会拖垮成绩。
四、平局怎么判:钻石降序 + Token 升序
排序逻辑集中在Board.leaderboard()里,只有两行比较函数(见 board.mjs):
先比 diamonds_count:多的排前面(降序) 再比那轮的 tokens:少的排前面(升序)注意一个容易忽略的点:Token 数取的是"最佳单轮"里那一轮的 Token 消耗,而不是历史最低 Token 数。举例:你第 1 轮挖了 10 颗钻石用了 80 万 Token,第 3 轮只挖了 8 颗但只花了 50 万 Token——排行榜按 10 颗钻石(第 1 轮)算,平局裁决也用第 1 轮的 80 万 Token。不能"高轮次的钻石 + 低轮次的 Token"混搭刷分。
此外,/cost上报的钻石数还有一道单调钳制:单轮内钻石最多每次涨 10 颗(prevD + 10),防止 curl 伪造成就时出现突兀跳变,让假分数"爬得慢"而不是"瞬间爆炸"。
五、防作弊设计:305秒时间闸门 + Top-3 回放验证
这套评分算法的防作弊分三层,对新手来说理解它们比理解排名本身更有趣:
🕐第一层:时间闸门每条成就必须满足run_elapsed_ms ≤ 305s,否则 403 拒绝。客户端改RUN_SECONDS毫无意义——机器人会给每条成就盖章,超过 5 分 05 秒的一律作废。
🔐第二层:单轮锁定与身份凭证每轮开始强制reset_run(),防止第二轮接着第一轮继续累计;写入排行榜需要参与者 JWT(PARTICIPANT_TOKEN),且只能操作自己的那一行。
🔍第三层:Top-3 人工回放前 3 名要用 harness/verify.py 回放整局 JSONL 日志,从每回合的库存快照重建"本应触发哪些成就",再和排行榜对账。它不是密码学级别的,但足以抓住"curl 假成就"这类简单作弊——因为日志里diamonds_collected计数器不会说谎。
六、新手速查:关键文件与参数地图
📌 想深入这套评分规则,按这个路径读代码最快:
| 想了解 | 看哪里 |
|---|---|
| 规则总述(最简版) | agent-battle/README.md |
| 排行榜状态机 + 排序逻辑 | event/lib/board.mjs |
| 成就上报与 305s 时间戳 | bot/bot.js |
| Token/回合统计与成本上报 | harness/leaderboard.py |
| Top-3 回放验证器 | harness/verify.py |
| 单轮 300 秒 + 200 turn 上限 | my_agent.py |
| 评分 API 路由(achievement/cost/leaderboard) | event/server.mjs |
一句话总结
这套排行榜算法的精髓是**"产出 vs 成本"的双指标设计**:钻石数衡量 Agent 干了什么,Token 数衡量它花了多少代价去干。想赢,不只需要挖得狠,还需要少说话、少轮询、挖完矿脉果断转移——这正是 Agent 配置(system prompt、skills、MCP 工具)调优的全部意义。改完配置先用--eval的 30 秒决策探针验证,再提交 5 分钟正式局,才是正确的迭代姿势。
【免费下载链接】cwc-workshops项目地址: https://gitcode.com/GitHub_Trending/cw/cwc-workshops
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考