Repository navigation
feat(demo): rebuild the demo as a single-page workbench with the OSW v2.1 baseline and an official-leaderboard comparison - #7
Merged
Conversation
结果目录 → 站点数据契约的读取层,拆成 runs/episodes/events/llm/traj/paths 六个模块(老 adapter.py 一个模块同时干三件事,改口径就要动 HTML)。 - llm_calls.jsonl 单题 64MB、整批 39GB:逐行读、只取 usage 与原文, 丢弃 request 里的 base64;单行超 8MB 跳过并计数。 - 题号归一(tasks-004 / 004 → 004),否则跨批次会把同一题当两道。 - 空转口径与 tools/batch_summary 一致(gui 事件 action 为 null)。 - 测试含一条「读取层禁止整文件读」的断言(用只许逐行读的假文件罩住)。
站点的逐题数字**不自己实现**:直接委托 tools/batch_summary.collect_rows (团队已认可的聚合实现,空转口径 10-25 修正过),demo 只加题号归一与 Sai 对照列。一致性测试守着「demo == tools」这条线。 tools/batch_summary._episode_tokens 顺带补出 cached_tokens(成本轴要用, 缓存命中价差 10 倍,不能并进普通输入价)。
站点离线可开,官方数据必须 vendored: - official/leaderboard.json:官方榜 55 行快照(含 source_url/fetched_at) - official/sai_tasks.json:Sai 逐题 mean/first/best(HF 134 次干净运行) - official/sai_traj/:对比子集 12 题的 Sai 轨迹摘要 - prices.json:挂牌价(带来源与快照日期,脚本查新鲜度) - sync_official.py:刷新脚本(下载 → 校验 → 写回) 口径锚点:Sai per-task best 均值 0.7938 == 官方榜 Sai 行 partial 79.38。
- compare_summary:逐题 Δ 的聚合(共同已出分题数、均分、打平数、我们领先数、 未出分题里 Sai 拿满分的题数、成本比)。 - 满分容差:官方评测器是加权求和,会给出 0.9999999999999999 这种浮点尾差 (075 就是)——严格 >=1.0 会把一个满分漏掉,低估基础设施失败吃掉的分数。
把多页静态站(index / compare / 54 个任务页 + 6 个 player js)换成**单页工作台**: hash 路由切四视图(总览 / 官方对照 / 机制 / 轨迹),左任务轨 + 中播放器 + 右面板。 - 双主题走**单一 token 源**:颜色只在 app.css 的 CSS 变量里定义, 组件内不写色值;切换只换 data-theme。 - 总览视图:85 题矩阵、停止原因分布、成本×分数散点(虚线=官方已发布参照值)、 首屏披露条(口径差异由数据算出,不写死)。 - 数据**内联**进 index.html:file:// 下 fetch 读不到本地文件,内联才能双击打开。 - 构建脚本重写:拷 demo/web → demo/site,生成 overview/compare/episode 数据与缩放帧。 - 旧 demo 模块(adapter/pages/render/metrics/timeline + player/*.js)删除—— 它们的职责已拆进 demo/reader/ 与 demo/web/,留着就是死代码。
对照视图(本次重建的核心): - 对比子集 12 题的逐题 Δ(我们 vs Sai 最佳/均值),打平数、我们领先数如实显示; - 官方参考 run 的**同题轨迹**(vendored 自 HF 公开参考 run)逐题对照; - 三处口径声明同屏:底座不同 / 题集不同 / 未出分里有几题 Sai 拿满分。 机制视图:快慢双模各干什么(只讲事实),加失败模式解剖—— 完成却零分 / 墙钟耗尽 / 空转过多 / 异常未出分,附题号清单。
- 上轨:慢模型原文(只搬运 llm_calls.jsonl 的真实内容,截断如实标注)+ 结构化 plan 卡; - 下轨:快模型排序实况(softmax 相对强度,恒标非校准概率)+ 候选漏斗 + margin + 延迟; - 侧轨:离散帧序列(对比子集才生成缩放帧,其余题如实说明未收录); - 右面板:plan→act→verify→replan 闭环(**原生 stage_replan 事件**,不推断)、 需求逐条核验、成本流水(token 燃烧 + 美元 + 快模型 GPU 侧轴)。
发布前逐条自检 11 项,不过就**拒绝导出**(退出码非 0、不产出目标目录): 未出分不折算 0 / 无预测分 / 美元带快照日期与底座 / 快模型成本单列 / release 题集 步数差异有标注 / 慢模型原文只搬运 / softmax 标注 / 离散帧 / 失败与口径首屏披露 / 无集群路径与凭据 / 无外部资源加载。 凭据检查用正则而不是裸子串:'sk-' 裸匹配会把 026 题 TeamChat 消息里的 'task-list' 误报(真凭据形态 0 命中,已用 GitLab token 真值复核)。
首页原来是把 8 个 KPI 方块 + 网格 + 堆叠条 + 散点 + 表格堆在一起——信息密度没分层。 改成**一屏一个论点**: - Hero:结论先行(大数字 + 一句话定位),数字带滚动动画; - 战绩:按域分行的热力矩阵(不是 85 个方块的网格),悬停看详情; - 终态解剖:一条堆叠条 + 六个终态分类,未出分单独成类; - 官方对标:榜单条,我们的行插在 harness 行里; - 成本×分数:带坐标轴与网格的散点,虚线只画官方已发布值。 - 披露条改成可折叠 details,首屏展开。 对比页补上**真正的轨迹对照**:同一进度点上并排看我们的帧与 Sai 的帧、动作与 reward (此前只有一张动作文字表)。Sai 的帧从 HF 公开参考 run 的媒体包里流式解出 (跳�� mp4,只取 PNG,缩放后缓存),缓存不进 git,构建时拷进站点使其自包含。 顺手修一个真 bug:tools 的逐题行键是 run 不是 run_id,站点按 run 寻址逐题数据时 拼出了 #/task/undefined/xxx —— 现在补上 run_id。
双边轨迹播放器的左边是空的——点题时没去取我们的 episode,只渲染了 Sai 侧。 逐题行补 run_id(tools 给的键是 run),按 run 寻址逐题数据。 另补两条测试:对照行必须带 run_id;站点必须带上 views.css 与官方参考轨迹。
Sai 侧帧从 HF 公开参考 run 的媒体包流式解出(跳过 mp4,只取 PNG,缩放存缓存)。 帧映射写进 sai_traj/<task>.json,站点据此把我们第 N 帧与 Sai 第 N 帧并排。
首页崩溃:anatomy() 里把字符串当 children 传(TD.el("span", {...}, "3")),
el() 现在接受字符串 / 单节点 / 数组。
首页:
- 删掉「读数字前先看口径(6 条)」披露块(口径改在对比视图的「对比口径」面板
与首页对比表备注列);
- 整站字号放大(正文 15.5px / 大数字 46px / 表格 14.5px / h1 40px),小字说明删减;
- 新增 **OSW2.1 风格对比表**:Tandem / Sai w/ Claude Opus 5 / Darwinx w/ Opus 4.8
/ Opus 5(e2e 背景),列含 Release、步数、Binary %、Partial %、$/题、备注。
官方对照:
- 两个 harness **各自独立播放**(不做进度对齐),各带 ⏵/⏸、⏮/⏭、滑块与倍速;
- 每步显示**花费与用时**:我们侧来自 llm_calls 的真实 token(按 traj 时间窗归步);
Sai 侧官方未发布逐步成本 → 显示逐步用时与 reward,成本标注「官方未发布」;
- 子集只留**我们成功(>0 分)**的 9 题。
机制:新增**真实 case 多泳道**——慢模型输出 / 快模型排序 / 实际动作 / 核验 / 花费用时
五条泳道按步横排,可选不同 case。
数据层:新增 demo/reader/steps.py 做逐步归因(token→步、墙钟→步);
sync_official 保留帧映射不被冲掉;fetch_sai_frames 加 --reattach(不重下只重挂)。
之前泳道以事件为单位(004 有 222 条),而成本/用时按观察窗算(40 个)—— 两头错位:前 40 个事件拿到了整窗的钱,后面全空。 改成一行 = 一次观察(= 一帧 = 一次动作),口径按契约: - 事件按 step 分桶,**核验取自 s+1 桶**; - 第 i 步的耗时 = t[i] - t[i-1],该步的慢模型调用 = 落在 (t[i-1], t[i]] 窗口的调用。 校验(题 004):逐步成本合计 $0.369475 == 整题 $0.369474,逐步 token 合计 1,570,537 == 整题 token,逐行 40 == 帧数 40。
- 顶栏去掉副标题与右侧数据快照;标题改「OSWorld v2.1 测评结果」, 导语改「慢模型执行规划与纠错,快模型快速选择动作。」 - 指标去掉「对比官方 Sai」与「未出分」,新增「每题平均执行时间」; - 对比表去掉括号说明、去掉「Tandem(我们)」的括号、去掉「备注」列与表下小字; - 删掉「成本 × 分数」散点与「终态解剖」两块,首页只留结果对比表与战绩热力; - 战绩热力排版优化:域名列加宽、格子加大、每域右侧加均分列。
- 导航改名:官方对照 → 轨迹浏览(compare.js → browser.js); - 去掉子集之前的所有内容(hero、口径面板、逐题明细表),只留子集; - **左栏**:任务卡纵向排布,每张卡带首帧预览 + 域 + 组 + 得分 + 步数(选中态高亮); - **中栏**:Tandem 与 Sai 两边独立回放,各带 ⏮ Prev / ▶ Play / Next ⏭ / 进度条 / 0.5× 1× 2×, **花费与用时按步骤累计**(我们侧真实 token 归步;Sai 侧逐步成本官方未发布 → 显示累计用时); 播放框下方显示当步的动作与慢模型原文; - **右栏**:Task Instruction、模型底座(慢/快模型 + 评测器 + release)、得分对比、 逐条要求核验(Rubric),以及对比口径三点(原披露块删除后移到这里)。 新增样式:三栏工作台、任务卡、累计读数条、得分块、Rubric 卡片。
- **Tandem 轨迹不显示**:build_episodes 只把缩放帧路径写回 model['frames'], 没写回 timeline → 播放器拿到的 frame 全是 null。补上回写(顺带修了一个 index 变量名撞车的 bug:循环变量覆盖了 episode_index() 返回的字典)。 - 整页排满:.app 去掉 max-width,中间列随窗口变大;左栏 296→340px, 右栏 328→372px,预览图限高 46vh。 - 任务卡去掉「域」「组」两个标签,换成指令首句作**任务简述**(两行截断)。 - 读数条(累计花费 / 累计用时 / 本步)移到**播放器下方**。 - Sai 侧成本:官方参考 run 里没有任何 token(messages.json / protocol.jsonl 均无 usage),逐步成本**无法由 token 反推**;改为用官方每题 $14.34 的均值 按本题步数折算,标注「(折算)」。 - 去掉中栏小字说明;全站字号再放大一档。
参考 sai.work 的首页骨架(深色 hero → 粘性滚动区(内容随滚动切换)→ 分区(eyebrow + 引导句 + 编号卡)→ 数据区)重做: - 导航「总览」改「首页」,独立的「机制」页并入首页(导航只剩 首页 / 轨迹浏览); - **第一段 简介**:eyebrow + 大标题 + 导语 + 三张编号卡(慢模型 / 快模型 / 双模协同); - **第二段 机制**:粘性滚动区——往下滚,左侧固定卡片随滚动切换 (慢模型写规划 → 快模型排候选 → 执行动作 → 核验结果 → 必要时重规划), 内容全部取自真实跑批的 episode;下接真实 case 的五泳道可视化; - **第三段 结果**:原有的 OSWorld v2.1 测评结果(大数字 / 对比表 / 战绩热力)原样搬过来。 代码结构:overview.js → results.js(导出 TD.sections.results)、 mechanism.js → TD.sections.swimlane、新增 home.js 负责三段编排与滚动切换。 兜底:机制段载入失败时结果段照常渲染,首页不会少一半。
根因:路由的默认视图名还停在 'overview',而 overview 已改成
TD.sections.results —— '#/' 解析出 overview → views.overview 不存在
→ view 是 undefined → 直接抛错。
- app.js:默认视图名与回退都改成 'home';未知路由不再静默回退,
console.warn 留痕(首页永不白屏,但错路由看得见)。
- 新增 tests/demo/test_render.py:用 node + 最小 DOM stub 把
TD.views.home / TD.sections.results / TD.views.browser 与真实路由
('#/'、'#/browser') 真跑一遍,渲染期抛错就红。node 不在的环境自动跳过。
- 新增 tests/demo/test_site.py 的 view 注册检查:导航里每个 data-view
都要有对应脚本并注册 TD.views.<name>,路由默认名必须是已注册视图
(这条能抓住本次的 bug)。
- 顺手修 stub 的 removeChild/replaceChild 不真删导致 clear() 死循环。
**吸顶失效**:.mech-layout 是 grid,.mech-sticky 默认 align-items:stretch → 被拉成和右栏一样高(2600px)→ sticky 形同虚设,往下滚卡片跟着滚走, 左栏看着是空的(截图一在段顶能看到卡片、截图二滚下去就空了,完全吻合)。 修:.mech-layout 加 align-items:start。 **规划原文取不到**:机制第一步按 entry.kind === 'planner' 找规划事件, 但 timeline 里的 kind 存的是「这一步执行了什么」(gui/cli),永远不是 planner → 卡片正文一直显示「这一题没有记录到规划原文」。 修:改从 slow.text 取(该步窗口里慢模型吐出来的内容)。 另外把这条教训写成测试(.mech-layout 必须 align-items:start), 并修 stub 的 textContent 不聚合子节点的问题。
数据源换成全量:c10(stage_memory 批次)+ c20(dual_api 批次,2 key×6 并发补跑), 两批配置一致(stage 模式 / 500 动作 / 4h 墙钟 / reasoning_effort=max / 原生官方评测器)。 **合并口径以环境侧为准**:demo/sync_merged.py 把环境侧 merged_progress.json 压成 精简清单(demo/data/merged_manifest.json),逐题核对磁盘后再落盘;demo 按清单挑 run, 所以站点数字与环境侧、磁盘三方一致(一致性测试守着)。 全量结果(vs c10 的 85 题口径): - 已出分 69 → **104**(056/075/090/098 两批都没跑出结果) - Partial(108 分母) 0.1911 → **0.2928**;Partial(仅已出分) 0.2993 → **0.3040** - Binary 4/85 → **11/108 = 10.19%**(满分题 4 → 11,c20 新增 076/092/045/072/073/082/100) - 成本 $0.756 → **$0.815/题**(多出的 19 道已出分题 + 4 道跑满 4 小时仍无产出的题) - 停止原因:done 45 / wall_time_limit 56 / no_action_limit 2 / 其它 1 **修 tools/batch_summary.run_timestamp 的正则**:批次时间戳有 4 位(20261025-0450)和 6 位(20261024-235014)两种格式,只认 6 位会让 c10/c20 排不出新旧 → 合并时挑错批次。 (这条建议也带回 main,团队自己的合并工具同样受益。) 对比扩到全量 108 题:打平 **16** 题、我们领先 **1** 题(093:我们 0.8 vs Sai 0.554)、 未出分但官方拿满分 1 题(075,Sai 分 0.9999999999999999 —— 又一处浮点尾差, 按 1.0-1e-6 容差判定)。对比子集扩到 23 题,官方参考帧补到 5966 张。 新增 demo/sync_merged.py(刷新合并清单 + 逐题校验)、demo/render_merged_report.py (出 docs/baseline-osw21-108-merged.md 汇总报告)。
首页机制段原来只有文字卡片 + 文字步骤列表,现在是一套图: - **概念流程图**(新增 demo/web/assets/views/flow.js,纯 SVG 无依赖): 观察 → 慢模型规划 → 候选空间 → 快模型排序 → 执行动作 → 核验, 外加「核验不通过 → 重规划 → 回到慢模型」的回环(虚线 + 流动光点)。 节点上写的是**这条真实 case 的数字**(帧数 / token / 候选数 / 排序延迟 / 核验结论 / 重规划原因),不是文案。节点可 hover 高亮、点击切到对应环节。 - **每步的迷你图**:候选空间漏斗(a11y 节点 → 候选 → 赢家)、两阶段 softmax 排序条、逐条要求达成条;卡片另附本步花费/用时/token。 - **步骤列表改成流程链**(圆点 + 连线 + 卡片),当前环节高亮并自动居中; ← / → 键可切换环节。 - 图例说明配色(慢模型紫 / 快模型橙 / 动作蓝 / 核验绿 / 重规划黄)。 修掉两个真问题: 1. 键盘监听挂在 document 上且每次重渲染都叠加一个 → 会劫持别的页面的方向键。 改成可清理(TD._mechCleanup),重渲染前先摘掉旧的。 2. 机制段的载入失败分支吞掉错误信息 → 现在把真实错误显示出来。 渲染冒烟测试同步加固:stub 补齐 createElementNS / document 事件 / SVG 的 class 查询, 并**断言流程图真的画出来了**(1 图 / 6 节点 / 迷你图 / 5 卡片)—— 这轮里它抓出了 4 个真 bug(回调漏接 error、buildFacts 少返回 concept、 SVG 节点在 stub 里没有 createElementNS、document 没有 addEventListener)。
**故障**:我手动把**源** index.html 拷进站点产物,把构建时注入的内联数据冲掉了, 首页于是报「没有内联的总览数据」。两处修正: - build_site.py 新增 --site-only:改了前端就只重建前端(复用已有的 assets/data/*.json 并重新注入内联数据),不用等几分钟重扫 39GB 结果目录。 实现要点:**先读出要复用的数据再覆盖文件**——第一版把清理放在读取前面, 直接把站点清空了(这坑刚踩过一次,已在代码注释里写明)。 - 补回被我重写 main() 时漏掉的「拷贝官方参考轨迹文本」那一步(对照页要读它; 这条是 tests/demo/test_site.py 抓出来的)。 另加一条防回归断言:构建产物的 index.html 必须带**非空且可解析**的内联数据 (症状就是这次的首页报错)。
用户对首页机制段提了 7 条修改,逐条落地: 1. 简介导语改为「慢模型负责拆解、规划与纠错;快模型负责在候选空间里挑选动作。 两者用同一份状态接力,跑在真实的 OSWorld v2.1 任务上。」 2. 删掉 01 慢模型·大脑 / 02 快模型·小脑 / 03 双模协同 三个框(introCard 移除) 3. 机制段导语改为「下面是OSWorld v2.1真实的一条链路:慢模型写规划,快模型排候选, 动作执行后由核验判定要不要重规划。点流程图节点或用 ← / → 切换环节。」 4. 流程图重写为子任务循环:去掉「观察」首块,直接「慢模型·规划」并把规划内容 总结上框;规划 → 快模型·完成子任务(接 a11y tree 解析 + 慢模型给出的候选空间) → 快模型·排序(循环直到选出 done)→ 慢模型·验证 → 达成则「下一个子任务」回到 完成子任务,不符预期则「重规划·纠错」回到规划。带连线标签与流动光点。 5. 流程图保持简洁,细节下沉到粘性卡片:规划子任务拆解图 / 快模型选择方块(赢家高亮) / 执行动作截图条(帧+花费用时)/ 重规划·纠错;去掉「核验结果」卡 6. 真实 case 泳道融进粘性卡片(swimlaneNode),不再单列一块 7. 渲染冒烟断言同步:1 流程图 / ≥6 节点 / ≥1 选择方块 / ≥4 环节卡 / ≥1 泳道 附带:test_render.py 改为自建合成夹具站点再渲染,不再依赖预构建站点产物 (原先会因站点缺失而假绿/假红)。 验证:pytest 288 passed / ruff 全绿 / tandem check 16 样例通过 / 站点产物已重建(--site-only)+ 渲染冒烟 ok + 发布闸门 11 条红线全 PASS。 Co-Authored-By: MiniMax-M3.1-Flash <noreply@minimax.io>
AGENTS.md 纪律 3:单模块 ≤300 行。demo 前端有两处超了: - views/browser.js 344 行 → 拆出 views/browser_player.js(播放器状态机 + 「episode/sai 轨迹 → 逐步条目」两件事),browser.js 只剩页面骨架(195 行) - assets/views.css 397 行 → 拆出 assets/browser.css(轨迹浏览页)与 assets/mechanism.css(机制段:流程图 / 流程链 / 吸顶卡片 / 候选方块 / 截图条) CSS 拆分是纯重构:按原顺序拼回后 235 条规则的顺序与内容完全一致,层叠不变 (已用脚本逐条比对断言)。index.html 的 link/script 顺序也保持原样。 新增测试 test_web_assets_stay_under_300_lines —— 把这条纪律钉在 CI 里, 以后再超就直接红。 验证:pytest 289 passed / ruff 全绿 / tandem check 通过 / 站点已重建(--site-only)+ 渲染冒烟 ok + 发布闸门 11 条红线全 PASS / http 冒烟:首页与 4 份样式、2 个视图脚本均 200。 Co-Authored-By: MiniMax-M3.1-Flash <noreply@minimax.io>
用户对首页机制段提了 5 条,逐条落地:
1. 流程图文字出框、标签压字
- 根因一:标签胶囊宽度按 `text.length * 7` 估,中文是 1em → 胶囊比字窄,
文字直接溢出。改成按真实字宽算(中文 1em / 西文 0.56em),并加
`fitText()` 兜底截断。
- 根因二:两条回环都在中带走线,互相压字。改成「不符合预期」绕最下面的
下带、「下一个子任务」走中带,两条通道互不交叉;标签位置全部重排。
- 根因三(真 bug):`TD.flow.concept(steps, facts.concept, cb)` 给 2 参函数
传了 3 个参数 → onSelect 拿到的是对象,**节点小字永远走默认值、点节点
直接抛 TypeError**。改签名后节点才真的显示这条 case 的数字。
2. 删除真实 case 泳道(mechanism.js 整个模块 + views.css/app.css 里的泳道样式
+ index.html 的 script 标签)
3. 子任务从「第一次规划的 2 个」改成**整轮累积**:Task 001 实测慢模型规划
20 次、累积 51 个子任务。卡片列前 6 个 + 「还有 45 个」,节点小字写
「拆出 51 个子任务 · 规划 20 次」
4. 候选从 3 条 operation 级改成**动作级**候选(action_ranked × 候选表 join):
画 8 条,带描述与分数,赢家高亮。operation 级分布降为正文一行
5. replan 卡片列出新计划:reason + 重规划时 stage_goal + 新计划 stage_goal +
新拆出的子任务清单
顺带:
- 新增**视觉 smoke**链路(本机没有浏览器,但版式问题能用真实字体度量判定):
tests/demo/flow_svg_dump.js 首页真实渲染的流程图 → JSON
demo/render_svg.py JSON → PNG(Noto Sans CJK + 等宽混排,
按浏览器的回退规则量字宽)
tests/demo/test_flow_svg.py CI 里跑「不出框、不重叠」
这次就是靠它抓到了上面那个 concept() 签名 bug。
- 渲染冒烟加了版式断言(节点/标签不出框、框不重叠、标签不压字)
- home.js 超 300 行 → 拆出 views/facts.js(抽事实,不碰 DOM)
- 夹具 helpers.py 补上真实的 milestones 与 action 级候选形状
- demo/render_svg.py + demo/svg_geom.py 均 ≤300 行
验证:pytest 291 passed / ruff 全绿 / 渲染冒烟 ok /
流程图 PNG 已出且版式自检通过(无出框无重叠)。
Co-Authored-By: MiniMax-M3.1-Flash <noreply@minimax.io>
Co-Authored-By: MiniMax-M3.1-Flash <noreply@minimax.io>
xxxyxun
approved these changes
Oct 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
demo/之前是「多页静态站 + 表格/散点」:数字散在几页里,没和官方 leaderboard 对齐,也没有口径说明——同一个"分数"在不同页面是不同分母,看的人很容易读错结论。这次把它重建成单页工作台:
本 PR 只碰
demo/tests/tools/docs/,src/与infra/零改动。数据:只用两批真实跑批的合并全量
c10(stage+memory 批次,59 题计入)× c20(dual_api 批次,45 题计入)合并,官方 OSWorld v2.1 全量 108 题。两批配置一致(stage 模式 / 500 动作 / 4h 墙钟 / reasoning_effort=max / max_tokens=32768 / 原生官方评测器)。
056075090098)明细见
docs/baseline-osw21-108-merged.md。与官方 leaderboard 对比
对比对象取官方榜的 harness 型条目
Sai w/ Claude Opus 5(v2.1 / 500 步 / binary 41.67 / partial 79.38 / $14.34 每题),不是 e2e 行——那是不同赛道的数字。共同已出分 104 题:我们 0.304 vs Sai best 0.797。
0.999999…浮点尾差容差)——这是 API/判分侧失败,不是能力差距诚实披露:11 条红线,导出前自动自检,不过就拒绝导出
demo/export_share.py逐条断言:未出分不折算 0 · 不生成我们的预测分 · 美元成本带快照日期与底座型号 · 快模型成本单列为第二轴 · release/题集/步数预算差异随对比显示 · 慢模型原文只搬运不编造 · 排序分数标 softmax 非校准概率 · 帧是离散帧不是录屏 · 失败与口径首屏披露 · 站点无集群路径与凭据 · 站点无外部资源引用(离线可开)。结构
几个刻意的取舍:
tandem/tandem_eval,不调模型、不碰 VM,唯一输入是结果目录契约 + 官方快照(有测试守着这条边界)tools/batch_summary(复用同一套_row_rank),站点数字与批量汇总工具同源,不各算一套merged_progress.json为准,demo/sync_merged.py逐题核对磁盘后落清单 → 站点 / 环境侧 / 磁盘三方一致index.html)验证
视觉 smoke 这套链路是本轮新加的:它把首页真实渲染出来的 SVG 导出来,用 Pillow + Noto Sans CJK 按浏览器的字体回退规则量字宽,再和框/胶囊的实际宽度比。它抓到了一个真 bug——
TD.flow.concept()参数个数对不上,导致流程图节点小字永远走默认值、点节点直接抛 TypeError(人工截图不容易发现)。给 reviewer 的两点提醒
demo/data/official/是公开来源的快照(官方 leaderboard JSON + 公开 HF 参考 runsimular-ai/sai-osworld-v21-reference-runs的逐题摘要),可用demo/sync_official.py重跑复核。demo/data/official/sai_traj/070.json里会出现AKIAINTERN001WANG这类字符串——那是 OSWorld 公开任务脚本里的假凭据(该任务本身就是"AWS 账单异常"场景),不是我们的密钥,别被 secret scanner 误报。已知限制
2026-10-27T02:49:08Z,价格表2026-10-23。docs/DEMO_REDESIGN.md的计划不并回 main;发布物走内网共享目录,站点产物不入库(demo/site/已 gitignore)。