Skip to content

feat(eval): add OSWorld 2.1 subset evaluation - #2

Merged
two-tiger merged 1 commit into
AI45Lab:mainfrom
xxxyxun:feature/osworld21-subset-eval
Oct 22, 2026
Merged

two-tiger merged 1 commit into
AI45Lab:mainfrom
xxxyxun:feature/osworld21-subset-eval

Conversation

@xxxyxun

@xxxyxun xxxyxun commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator

改动

接入 OSWorld 2.1 的 56 题子集,复用现有测评链路。

  • CLI、任务清单:增加 osworld21 选项、56 题清单及任务筛选,沿用现有分片逻辑。
  • entry、环境适配:复用 OsWorldEnv,传入 2.1 环境配置及可选磁盘容量;精简部分注释以满足模块行数约束。
  • 配置模板、job spec、worker:增加 2.1 runtime、VM、资产、共享环境、代理及固定镜像配置。
  • 批量脚本:支持 BENCHMARK、TASKS、ROUTE_POLICY,默认保持 osworld2。
  • 测试:补充配置、任务清单、环境导入及原生任务接口测试。
  • 文档:更新 benchmark 选项、worker 行为及真实基准范围。

未新增仓库文件,未修改 src/tandem/ 主体和协议。
环境依赖及 setup 兼容由共享 runtime 负责,不在 harness 中增加单题修补。
不包含通用 rjob 生命周期修复。

验证

  • ruff check src tests demo:通过。
  • pytest -q:223 passed。
  • 协议自检:16 个样例通过。
  • Shell 语法检查:通过。
  • 当前代码通过 scripts/run_osw2_20x5.sh 真实运行 Task004:
    VM 启动、截图及 A11y 获取、Kimi 调用、JEV 看图选动作、
    GUI 执行回执和官方评分均已验证。
  • 本次预算为 1 步,结果 scored=1、failed_unscored=0,
    score=0、stop_reason=max_steps,仅验证启动链路。

运行记录:osw21-current-startup-20261022-1802-s1。

@two-tiger two-tiger left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@two-tiger
two-tiger merged commit 9caace1 into AI45Lab:main Oct 22, 2026
2 checks passed
two-tiger pushed a commit to two-tiger/Tandem that referenced this pull request Oct 22, 2026
PR AI45Lab#2 added the 56-task OSWorld 2.1 subset on the old flat config
(kimi / jev_endpoint / osw21_root at the top level). That layout is
gone - the config is now harness / eval / log, with the benchmarks under
eval.benchmarks.<name>. This commit moves the OSW2.1 support onto the
new schema and fixes what the review of PR AI45Lab#2 turned up.

Config:
  eval.benchmarks.osworld21.{root,vm,asset_root,shared_env,proxy,
                             volume_size,inner_image}
  eval.mounts gains the canonical view
    gpfs://gpfs2/evobox-share-gpfs2 -> /mnt/shared-storage-gpfs2/evobox-share-gpfs2
    the prepared/runtime symlink layer only resolves there; the dev
    machine has no canonical mount, so those paths are worker-only.

The inner image must be release-pinned (<repo>@sha256:...). The schema
rejects a "latest" tag, and build_job_spec refuses to build an osworld21
run without a pinned image, so a wrong image cannot be picked up
silently.

Fixes from the review:
- the osworld21 paths are part of the required-key validation now, so an
  outdated config fails with "missing keys" instead of a bare KeyError;
- the 56-task subset records where it comes from (the environment's
  validation/coverage.json, passed tasks) and a new test checks that
  every id in the list still has a task file in the runtime, so the
  snapshot cannot rot unnoticed (skipped when the runtime is not mounted);
- worker.sh reads the spec through one spec_get helper instead of three
  inline python one-liners;
- the anchor comments PR AI45Lab#2 dropped from osworld.py are back: the
  DEVIATIONS references, the "task_001 answered 404 because the asset URL
  was baked in at import time" diagnosis, the setup-cache seeding
  rationale and the receipt discipline;
- the batch script documents BENCHMARK / TASKS / ROUTE_POLICY next to the
  model switches.

osworld.py is back to 311 lines: the comments are worth more than the
line budget, and the module split is left to the discipline rework.

Verification: ruff check src tests demo, pytest (235 passed) and tandem
check are green; a mock run through infra/worker.sh still works, and the
osworld21 job spec builds with the expected env section.
two-tiger pushed a commit to two-tiger/Tandem that referenced this pull request Oct 22, 2026
The osworld21 run died before it did anything: the job spec carried an
empty secrets section, so worker.sh had no registry auth to write to
~/.docker/config.json and exited at the pull step ("缺少 registry 凭据").

Root cause was mine: the rebase conflict resolution took rjob_spec.py
wholesale from the config-refactor side, which dropped the "osworld21"
that PR AI45Lab#2 had added to the credentials whitelist. The env section and
the inner-image guard were ported back, this whitelist was not.

A regression test now checks that every real benchmark produces a spec
with credentials (slow_model, fast_model, registry), so a benchmark
missing from a whitelist fails in the test suite instead of on the
cluster.

worker.sh also stops swallowing the reason: the registry failure path
ran `cat` on an entry log that does not exist yet, and errexit killed
the shell before it could print the message - the platform log only
showed the python error and exit status 1 instead of 3. The docker pull
and dependency check failures now echo the tail of their log files.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants