# Muat tugas evaluasi agen

Dataset [Harbor](https://harborframework.com/docs) adalah kumpulan *tasks* yang digunakan untuk mengevaluasi agen AI: setiap task memberikan agen sebuah instruksi, lingkungan sandboxed untuk bekerja, dan verifier yang menilai kinerjanya.

Berbeda dengan dataset tabular, dataset Harbor bukanlah file dengan satu baris per contoh: **setiap tugas adalah sebuah direktori**. Builder `harbor` membaca repositori semacam itu dan menghasilkan satu baris per tugas, sehingga sebuah benchmark dapat dijelajahi, difilter, dan dibagikan seperti dataset lainnya:

```py
>>> from datasets import load_dataset
>>> dataset = load_dataset("harborframework/terminal-bench")
>>> dataset
DatasetDict({
    test: Dataset({
        features: ['name', 'instruction', 'description', 'keywords', 'schema_version', 'config', 'metadata', 'files', 'location'],
        num_rows: 66
    })
})
```

> [!TIP]
> Memuat dataset Harbor hanya *membaca* tugas: tidak pernah menjalankan agen, membangun image, atau mengeksekusi verifier, dan tidak memerlukan Harbor untuk diinstal. Gunakan pustaka [Harbor](https://harborframework.com/docs) untuk benar-benar menjalankan tugas.

> [!WARNING]
> Konfigurasi tugas Harbor adalah file TOML. Python 3.11 dan versi lebih baru membacanya dengan pustaka standar (`tomllib`); pada Python 3.10, Anda perlu menginstal parser TOML sebagai dependensi tambahan. Lihat panduan [instalasi](./installation#harbor) untuk mempelajari cara menginstalnya.

## Struktur repositori

Direktori tugas diidentifikasi oleh dua file, `task.toml` dan `instruction.md`, dan biasanya juga berisi definisi lingkungan, verifier, dan solusi oracle:

```text
my-harbor-dataset/
├── README.md
└── tasks/
    ├── task-a/
    │   ├── task.toml          # configuration: metadata, resources, timeouts...
    │   ├── instruction.md     # what the agent is asked to do
    │   ├── README.md          # optional human-readable description
    │   ├── environment/       # Dockerfile / docker-compose.yaml + files of the sandbox
    │   ├── tests/             # verifier
    │   └── solution/          # oracle solution
    └── task-b/
        └── ...
```

Sebuah direktori dikenali sebagai dataset Harbor begitu salah satu sub-direktornya, se dalam apa pun, merupakan direktori tugas (berisi file `task.toml` dan file `instruction.md` berdampingan): tugas-tugas ditemukan secara otomatis, tanpa perlu mencantumkan file apa pun.

## Muat tugas

Karena dataset Harbor terdiri dari direktori, bukan file data, dataset dimuat berdasarkan *path* — tanpa argumen `data_files`:

```py
>>> from datasets import load_dataset

>>> # a dataset repository on the Hub
>>> dataset = load_dataset("harborframework/terminal-bench")
>>> # a local directory of tasks
>>> dataset = load_dataset("/path/to/my-harbor-dataset")
>>> # the tasks of a repository that are in a sub-directory
>>> dataset = load_dataset("harborframework/terminal-bench", data_dir="tasks")
```

Menyampaikan `data_files` secara eksplisit juga didukung, selama pola mencakup file `task.toml` dan `instruction.md` — satu pasangan file yang cocok menghasilkan satu baris:

```py
>>> dataset = load_dataset(
...     "/path/to/my-harbor-dataset",
...     data_files={"test": ["my-tasks-dir/*/task.toml", "my-tasks-dir/*/instruction.md"]},
... )
```

## Kolom

Setiap baris menggambarkan satu tugas:

| Kolom | Tipe | Deskripsi |
|--------|------|-------------|
| `name` | `string` | `[task].name` dari `task.toml` (biasanya `org/name`), atau nama direktori tugas. |
| `description` | `string` | `[task].description` dari `task.toml`. |
| `instruction` | `string` | Isi dari `instruction.md`: apa yang harus dilakukan oleh agen. |
| `keywords` | `list` dari `string` | `[task].keywords` dari `task.toml`. |
| `schema_version` | `string` | `schema_version` yang dideklarasikan oleh `task.toml`. |
| `config` | `dict` | Seluruh `task.toml`, sebagai objek JSON: `[task]`, `[metadata]`, `[verifier]`, `[agent]`, `[environment]`, `[steps]`... |
| `metadata` | `dict` | Bagian `[metadata]` bebas format dari `task.toml`. |
| `files` | `list` dari `string` | Semua file tugas, dengan path relatif terhadap direktori tugas. |
| `location` | `string` | Lokasi direktori tugas dalam dataset. |

```py
>>> dataset = load_dataset("harborframework/terminal-bench", split="test")
>>> dataset[0]["name"]
'terminal-bench/atrx-vep-crispr'
>>> dataset[0]["instruction"][:90]
'You are provided with a region of genomic DNA representing the human ATRX locus plus sequence'
>>> dataset[0]["config"]["task"]["authors"]
[{'name': 'ScaleAI', 'email': 'tbench@scale.com'}]
>>> dataset[0]["metadata"]["category"]
'Science'
>>> dataset[0]["config"]["environment"]
{'build_timeout_sec': 1800.0, 'cpus': 2, 'memory_mb': 4096, 'storage_mb': 10240, 'gpus': 0}
>>> dataset[0]["files"][:4]
['LICENSE.md', 'README.md', 'environment/Dockerfile', 'environment/data/CDS-information.txt']
>>> dataset[0]["location"]
'tasks/atrx-vep-crispr'
```

Seluruh `task.toml` tersedia di `config`, sehingga tidak ada yang hilang ketika sebuah tugas menggunakan field yang tidak dipromosikan ke kolomnya sendiri:

```py
>>> dataset = dataset.map(lambda task: {"timeout_min": task["config"]["verifier"]["timeout_sec"] / 60})
>>> sorted(set(dataset["timeout_min"]))[:6]
[1.0, 2.0, 3.0, 4.0, 5.0, 7.0]
```

## Filter sebuah benchmark

Karena metadata tugas dimuat sebagai kamus, sebuah benchmark dapat dijelajahi dengan metode [filter()](/docs/datasets/v5.2.0/id/package_reference/main_classes#datasets.Dataset.filter) dan [map()](/docs/datasets/v5.2.0/id/package_reference/main_classes#datasets.Dataset.map) yang biasa:

```py
>>> security_tasks = dataset.filter(lambda task: task["metadata"].get("category") == "Security")
>>> [task["name"] for task in security_tasks]
['terminal-bench/formal-crypto', 'terminal-bench/html-js-filter', 'terminal-bench/interleaved-vigenere', 'terminal-bench/shadow-relay', 'terminal-bench/uefi-bootkit']
```

Kolom `files` mencantumkan semua yang disertakan oleh tugas, yang berguna untuk melihat bagaimana sebuah tugas diverifikasi:

```py
>>> pytest_verifiers = dataset.filter(lambda task: any(f.startswith("tests/") and f.endswith(".py") for f in task["files"]))
>>> pytest_verifiers.num_rows
63
```

## Baca file-file lain dari tugas

Hanya instruksi dan konfigurasi tugas yang dimuat sebagai kolom: file lingkungan, verifier, dan solusinya tercantum dalam kolom `files`, sebagai path relatif terhadap direktori tugas. Gabungkan `task_id` dan `files` untuk membuka salah satunya dengan `fsspec`:

```py
>>> from huggingface_hub import hffs
>>> dataset_path = "hf://datasets/harborframework/terminal-bench"
>>> with hffs.open(f"{dataset_path}/tasks/cumulative-layout-shift/environment/Dockerfile", "r") as f:
...     print(f.read()[:20])
'# harbor-canary GUID
```

## Konfigurasi

[HarborConfig](/docs/datasets/v5.2.0/id/package_reference/loading_methods#datasets.packaged_modules.harbor.HarborConfig) menerima beberapa argumen di samping argumen `load_dataset` yang biasa:

- `strip_canary` (default `True`): hapus baris komentar "benchmark data canary" di awal instruksi, dengan cara yang sama seperti yang dilakukan Harbor saat mengirimkannya ke agen. Atur menjadi `False` untuk mempertahankan isi file asli.
- `include_files` (default `True`): daftar semua file dari setiap tugas di kolom `files`. Atur menjadi `False` untuk melewati daftar direktori tugas, yang lebih cepat ketika dataset berada pada sistem file jarak jauh atau memiliki ribuan file per tugas.

Tugas juga dapat di-streaming, yang menghindari pengunduhan seluruh benchmark di awal:

```py
>>> from datasets import load_dataset
>>> dataset = load_dataset("harborframework/terminal-bench", streaming=True)
>>> for task in dataset["test"]:
...     print(task["name"])
```

## Lihat juga

- Dokumentasi referensi untuk [Harbor](/docs/datasets/v5.2.0/id/package_reference/loading_methods#datasets.packaged_modules.harbor.Harbor) dan [HarborConfig](/docs/datasets/v5.2.0/id/package_reference/loading_methods#datasets.packaged_modules.harbor.HarborConfig).
- Dokumentasi [Harbor](https://harborframework.com/docs) untuk *menjalankan* tugas-tugas benchmark dengan agen dan verifier.

