Files
elizaos--eliza/packages/benchmarks/webshop/scripts/fetch_data.py
T
wehub-resource-sync 426e9eeabd
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
Chat shell gestures / Chat shell gesture + parity e2e (push) Has been cancelled
Cloud Gateway Discord / Test (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Has been cancelled
Build Agent Image / build-and-push (push) Has been cancelled
Dev Smoke / bun run dev onboarding chat (push) Has been cancelled
Dev Smoke / Vite HMR dependency-level smoke (push) Has been cancelled
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Has been cancelled
Publish @elizaos/example-code / check_npm (push) Has been cancelled
Publish @elizaos/example-code / publish_npm (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / verify_version (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / publish_npm (push) Has been cancelled
Sandbox Live Smoke / Sandbox live smoke (push) Has been cancelled
Snap Build & Test / Build Snap (amd64) (push) Has been cancelled
Snap Build & Test / Build Snap (arm64) (push) Has been cancelled
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Has been cancelled
Cloud Gateway Webhook / Test (push) Has been cancelled
Cloud Tests / lint-and-types (push) Has been cancelled
Cloud Tests / unit-tests (push) Has been cancelled
Cloud Tests / integration-tests (push) Has been cancelled
Cloud Tests / e2e-tests (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Apps Worker (Product 2) / Determine environment (push) Has been cancelled
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Has been cancelled
Deploy Eliza Provisioning Worker / Determine environment (push) Has been cancelled
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Has been cancelled
Dev Smoke / Classify changed paths (push) Has been cancelled
supply-chain / sbom (push) Has been cancelled
supply-chain / vulnerability-scan (push) Has been cancelled
Build, Push & Deploy to Phala Cloud / build-and-push (push) Has been cancelled
Test Packaging / Validate Packaging Configs (push) Has been cancelled
Test Packaging / Build & Test PyPI Package (push) Has been cancelled
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Has been cancelled
Test Packaging / Pack & Test JS Tarballs (push) Has been cancelled
UI Fixture E2E / ui-fixture-e2e (push) Has been cancelled
UI Fixture E2E / fixture-e2e (push) Has been cancelled
UI Story Gate / story-gate (push) Has been cancelled
vault-ci / test (macos-latest) (push) Has been cancelled
vault-ci / test (ubuntu-latest) (push) Has been cancelled
vault-ci / test (windows-latest) (push) Has been cancelled
vault-ci / app-core wiring tests (push) Has been cancelled
verify-patches / verify patches/CHECKSUMS.sha256 (push) Has been cancelled
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Has been cancelled
Voice Benchmark Smoke / voice bench smoke summary (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Has been cancelled
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

163 lines
5.6 KiB
Python

#!/usr/bin/env python3
"""
Fetch the Princeton-NLP WebShop datasets used by the benchmark.
The upstream ``setup.sh`` lists three Google Drive file IDs:
items_shuffle_1000 1EgHdxQ_YxqIQlvvq5iKlCrkEKR6-j0Ib ~6 MB (1k products)
items_ins_v2_1000 1IduG0xl544V_A_jv3tHXC0kyFi7PnyBu ~2 MB (1k product attrs)
items_shuffle 1A2whVgOO0euk5O13n2iYDM0bQRkkRduB ~1.6 GB (~1.18M products)
items_ins_v2 1s2j6NgHljiZzQNL3veZaAiyW_qDEgBNi ~600 MB (~1.18M attrs)
items_human_ins 14Kb5SPBk_jfdLZ_CDBNitW98QLDlKR5O ~5 MB (12,087 human instructions)
We expose the same five files through three named profiles:
--profile small -> items_shuffle_1000 + items_ins_v2_1000 + items_human_ins
(default; matches upstream ``setup.sh -d small``)
--profile full -> items_shuffle + items_ins_v2 + items_human_ins
(the full 1.18M-product catalog used in the published
benchmark; gigabytes of download).
--profile goals -> items_human_ins only (smallest; lets you inspect the
12,087 instruction list without product catalog).
Files are saved into ``packages/benchmarks/webshop/data/`` and skipped if a
matching file already exists with non-zero size.
Java/Lucene/pyserini are *not* fetched here; the WebShop search engine is
optional (we degrade to BM25 in-process when pyserini is unavailable).
"""
from __future__ import annotations
import argparse
import os
import shutil
import sys
from pathlib import Path
# Maps logical file name -> (Google Drive file id, expected output basename)
GDRIVE_FILES: dict[str, tuple[str, str]] = {
"items_shuffle_1000": (
"1EgHdxQ_YxqIQlvvq5iKlCrkEKR6-j0Ib",
"items_shuffle_1000.json",
),
"items_ins_v2_1000": (
"1IduG0xl544V_A_jv3tHXC0kyFi7PnyBu",
"items_ins_v2_1000.json",
),
"items_shuffle": (
"1A2whVgOO0euk5O13n2iYDM0bQRkkRduB",
"items_shuffle.json",
),
"items_ins_v2": (
"1s2j6NgHljiZzQNL3veZaAiyW_qDEgBNi",
"items_ins_v2.json",
),
"items_human_ins": (
"14Kb5SPBk_jfdLZ_CDBNitW98QLDlKR5O",
"items_human_ins.json",
),
}
PROFILES: dict[str, tuple[str, ...]] = {
"small": ("items_shuffle_1000", "items_ins_v2_1000", "items_human_ins"),
"full": ("items_shuffle", "items_ins_v2", "items_human_ins"),
"goals": ("items_human_ins",),
}
REPO_DATA_DIR = Path(__file__).resolve().parent.parent / "data"
def _download_via_gdown(file_id: str, dest: Path) -> None:
try:
import gdown # type: ignore[import-not-found]
except ImportError as exc:
raise SystemExit(
"gdown is required to fetch WebShop datasets. "
"Install it with: pip install gdown"
) from exc
url = f"https://drive.google.com/uc?id={file_id}"
dest.parent.mkdir(parents=True, exist_ok=True)
tmp = dest.with_suffix(dest.suffix + ".part")
gdown.download(url, str(tmp), quiet=False)
tmp.replace(dest)
def fetch_profile(profile: str, *, data_dir: Path, force: bool = False) -> list[Path]:
if profile not in PROFILES:
raise SystemExit(
f"Unknown profile {profile!r}; expected one of {sorted(PROFILES)}"
)
fetched: list[Path] = []
for logical_name in PROFILES[profile]:
file_id, basename = GDRIVE_FILES[logical_name]
dest = data_dir / basename
if dest.exists() and dest.stat().st_size > 0 and not force:
print(f"[fetch_data] {basename}: already present "
f"({dest.stat().st_size:,} bytes), skipping")
fetched.append(dest)
continue
print(f"[fetch_data] Downloading {logical_name} -> {dest}")
_download_via_gdown(file_id, dest)
fetched.append(dest)
return fetched
def download_profile(profile: str, dest: Path, force: bool = False) -> list[Path]:
return fetch_profile(profile, data_dir=dest, force=force)
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument(
"--profile",
choices=sorted(PROFILES),
default="small",
help="Data profile (default: small).",
)
parser.add_argument(
"--data-dir",
type=Path,
default=REPO_DATA_DIR,
help=f"Output directory (default: {REPO_DATA_DIR}).",
)
parser.add_argument(
"--force",
action="store_true",
help="Re-download even if the target file already exists.",
)
parser.add_argument(
"--also-link-into-upstream",
action="store_true",
help=(
"Symlink (or copy) the fetched files into "
"``upstream/data/`` so that upstream code that uses "
"``DEFAULT_FILE_PATH`` resolves correctly."
),
)
args = parser.parse_args(argv)
fetched = fetch_profile(args.profile, data_dir=args.data_dir, force=args.force)
if args.also_link_into_upstream:
upstream_data = Path(__file__).resolve().parent.parent / "upstream" / "data"
upstream_data.mkdir(parents=True, exist_ok=True)
for src in fetched:
dst = upstream_data / src.name
if dst.exists():
dst.unlink()
try:
os.symlink(src, dst)
except (OSError, NotImplementedError):
# Windows without symlink permissions: fall back to copy.
shutil.copy2(src, dst)
print(f"[fetch_data] Linked {dst} -> {src}")
print(f"[fetch_data] Done. {len(fetched)} file(s) in {args.data_dir}.")
return 0
if __name__ == "__main__":
sys.exit(main())