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
163 lines
5.6 KiB
Python
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())
|