wbench-submit
GitHub将模型评测结果打包为WBench提交包,生成meta.json和turns.json等文件,并支持上传至HuggingFace数据集。
Trigger Scenarios
Install
npx skills add meituan-longcat/WBench --skill wbench-submit -g -y
SKILL.md
Frontmatter
{
"name": "wbench-submit",
"description": "Package and submit a model's results to WBench (leaderboard). Use when the user asks to prepare a submission, build the meta.json\/turns.json package, or upload videos to the WBench-examples HF dataset (e.g. \"package kling3 for submission\", \"生成 turns.json\", \"上传到 huggingface\"). Produces the work_dirs\/<model>\/{meta.json,turns.json,videos\/} bundle."
}
WBench Submission Packaging
Assemble a submission bundle and (optionally) push it to a HuggingFace dataset.
Full spec: docs/SUBMISSION.md.
Bundle layout
<model_name>/
├── meta.json # required
├── report.json # required for path A (self-eval), omit for path B
├── turns.json # optional but recommended (non-uniform turns)
├── icon.png # required: square leaderboard logo, PNG/SVG >= 128x128
└── videos/
└── case_<id>_combined.mp4
<id> is the case's JSON id field (e.g. 1, e_5, ps_3), never the filename.
Two submission paths
- A — self-evaluation (default): include
report.json(run thewbench-evaluateskill first). We re-run a random subset to confirm reproducibility. - B — we evaluate (fallback): omit
report.json, submit videos only; we run the 22 metrics. Takes 1–2 working days; encourage path A when the user can run it.
Required case coverage
| Type | Cases | Count |
|---|---|---|
| text | all | 289 |
| camera / action | navigation only | 158 |
1. meta.json
{
"model_name": "mymodel",
"type": "text", // text | camera | action
"display_name": "My Model 1.0",
"org": "My Lab", // required: organization / company name for the leaderboard
"sampled_by": "...", // who generated the videos
"contact": "you@example.com",
"num_videos": 289,
"split": "full", // full | navi
"judge": "doubao-seed-2-0-lite-260215", // path A: required; or "Qwen/Qwen3.8-27B" — the judge behind report.json
"icon": "icon.png", // required: logo file in the bundle root
"links": { // required: at least one public link
"homepage": "https://...", "github": "https://github.com/...",
"huggingface": "https://huggingface.co/...", "paper": "https://arxiv.org/abs/..."
}
}
Ask the user for org, the icon file, at least one link and (path A) the judge if they are missing —
rows are not published without them (see docs/SUBMISSION.md).
2. turns.json (recommended)
Per-turn metrics need per-turn frame ranges. Models allot a non-uniform number of frames per turn, so provide the boundaries explicitly:
{
"fps": 24,
"cases": {
"1": { "turn_frames": [0, 57, 97, 137, 177] },
"e_5": { "turn_frames": [0, 60, 120, 180] }
}
}
turn_frames= start frame of each turn plus a final sentinel; turn i spans[turn_frames[i], turn_frames[i+1]).- N turns → N+1 boundaries, strictly increasing, start at 0, end ≤ actual frame count.
- Omitting it → uniform split (
total_frames / n_turns). Fine for equal-length turns (kling), but understates per-turn metrics for non-uniform turns (most autoregressive world models).
Generate programmatically from your model's frames-per-turn rule + the per-turn
chunk_length exposed by case_to_poses / case_to_actions in
src/models/{camera,action}. Validate before shipping:
import cv2, json
turns = json.load(open("work_dirs/<model>/turns.json"))
for cid, t in turns["cases"].items():
tf = t["turn_frames"]
assert tf[0] == 0 and tf == sorted(tf) and len(set(tf)) == len(tf), cid
nf = int(cv2.VideoCapture(f"work_dirs/<model>/videos/case_{cid}_combined.mp4").get(7))
assert tf[-1] <= nf, f"{cid}: sentinel {tf[-1]} > {nf} frames"
print("turns.json OK")
3. Upload to HuggingFace (private dataset)
The reference bundles live under meituan-longcat/WBench-examples (folders
hyworld1.5/, kling3/). If your network needs a proxy to reach huggingface.co,
export https_proxy / http_proxy first.
# export https_proxy=http://<your-proxy>:<port> http_proxy=http://<your-proxy>:<port>
export HF_TOKEN=<write-scoped token> # from https://huggingface.co/settings/tokens
REPO=meituan-longcat/WBench-examples
# create once (skip if it exists)
hf repo create "$REPO" --repo-type dataset --private
# upload a bundle (local dir → repo subfolder). Resumable: re-run to retry.
hf upload "$REPO" work_dirs/<model> <model> --repo-type dataset
Large bundles (multi-GB) — run in the background and watch the log:
mkdir -p logs
nohup bash -c 'export HF_TOKEN=<token>; \
hf upload meituan-longcat/WBench-examples work_dirs/<model> <model> --repo-type dataset' \
> logs/hf_upload_<model>.log 2>&1 &
Gotchas
meta.jsonmodel_namemust match the bundle/repo folder name (e.g.kling3,hyworld1.5).- mp4 files are auto-tracked as LFS by
hf upload— no manualgit lfs track. hf uploadis resumable: an interrupted upload re-runs and skips files already pushed.- Submissions are accepted only as a HuggingFace dataset link with this exact structure; Google Drive / Baidu Netdisk / OneDrive links are not accepted.
docs/SUBMISSION.mdmentions avalidate_submission.py— it is not yet in the repo; validateturns.jsonwith the snippet above for now.
Version History
-
edc4e80
Current 2026-11-02 14:17
新增meta.json中judge字段要求;优化路径A自评估推荐说明;明确支持仅HF提交及必填组织、图标和链接信息。
- dacf4c4 2026-07-05 14:49


