# エージェント評価タスクを読み込む

[Harbor](https://harborframework.com/docs) データセットは、AI エージェントを評価するために使用される*タスク*のコレクションです。各タスクでは、エージェントに指示、作業を行うサンドボックス環境、そしてその成果を採点する検証ツールが提供されます。

表形式のデータセットとは異なり、Harborデータセットは1行が1つのサンプルに対応するファイルではなく、**各タスクがディレクトリとして構成されています**。`harbor`ビルダーはこのようなリポジトリを読み取り、タスクごとに1行ずつ生成します。これにより、ベンチマークは他のデータセットと同様に探索、フィルタリング、共有を行うことができます。

```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]
> Harborデータセットを読み込むと、タスクは*読み取り*のみが行われます。エージェントの実行、イメージのビルド、verifierの実行は行われず、Harborのインストールも不要です。タスクを実際に実行するには、[Harbor](https://harborframework.com/docs)ライブラリを使用してください。

> [!WARNING]
> Harborのタスク設定はTOMLファイルです。Python 3.11以降では標準ライブラリ(`tomllib`)で読み込むことができますが、Python 3.10ではTOMLパーサーを追加の依存関係としてインストールする必要があります。インストール方法については、[インストール](./installation#harbor)ガイドを参照してください。

## リポジトリの構造

タスクディレクトリは、`task.toml`と`instruction.md`という2つのファイルで識別され、通常は環境定義、検証器、オラクルソリューションも含まれます。

```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/
        └── ...
```

ディレクトリ内のいずれかのサブディレクトリ（深さに関係なく）がタスクディレクトリ（`task.toml`ファイルと`instruction.md`ファイルが同じ階層に存在する）である場合、そのディレクトリはHarborデータセットとして認識されます。タスクは自動的に検出されるため、ファイルを列挙する必要はありません。

## タスクの読み込み

Harbor のデータセットはデータファイルではなくディレクトリで構成されているため、*path* によって読み込まれます。`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")
```

`data_files` を明示的に渡すこともサポートされています。ただし、パターンに `task.toml` と `instruction.md` のファイルが含まれている必要があります。1つのマッチしたファイルペアが1行を生成します:

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

## カラム

各行は1つのタスクを説明しています:

| カラム | 型 | 説明 |
|--------|------|-------------|
| `name` | `string` | `task.toml` の `[task].name`（通常は `org/name`）またはタスクディレクトリ名。 |
| `description` | `string` | `task.toml` の `[task].description` |
| `instruction` | `string` | `instruction.md` の内容: エージェントが実行すべきタスク。 |
| `keywords` | `string`の`list` | `task.toml` の `[task].keywords`。 |
| `schema_version` | `string` | `task.toml` で宣言される `schema_version`。 |
| `config` | `dict` | `task.toml`全体をJSONオブジェクトとして示します: `[task]`、`[metadata]`、`[verifier]`、`[agent]`、`[environment]`、`[steps]`... |
| `metadata` | `dict` | `task.toml`の自由形式の`[metadata]`セクション。 |
| `files` | `string`の`list` | タスクディレクトリからの相対パスで指定された、タスクのすべてのファイル。 |
| `location` | `string` | データセット内のタスクディレクトリの場所。 |

```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'
```

`task.toml` の全体が `config` に含まれているため、タスクが独自のカラムに昇格されていないフィールドを使用しても、情報が失われることはありません。

```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()](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Dataset.filter)および[map()](/docs/datasets/v5.2.0/ja/package_reference/main_classes#datasets.Dataset.map)メソッドで探索できます。

```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']
```

`files` 列には、タスクに同梱されるすべてのファイルがリストされており、タスクがどのように検証されるかを確認するのに便利です。

```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
```

## タスクの他のファイルを読む

タスクの指示と設定のみがカラムとして読み込まれます。その環境、検証器、解答ファイルは、タスクディレクトリからの相対パスとして`files`カラムにリストされています。`task_id`と`files`を組み合わせることで、`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
```

## 設定

[HarborConfig](/docs/datasets/v5.2.0/ja/package_reference/loading_methods#datasets.packaged_modules.harbor.HarborConfig)は、通常の`load_dataset`の引数のほかに、いくつかの引数を受け取ります。

- `strip_canary` (デフォルトは `True`): Harbor がエージェントに送信するのと同じ方法で、指示の先頭にある "benchmark data canary" コメント行を削除します。元のファイルの内容を保持するには、`False` に設定してください。
- `include_files` (デフォルトは `True`): `files` 列に、すべてのタスクのファイルをすべてリストします。リモートファイルシステム上のデータセットや、1 つのタスクごとに数千のファイルがある場合は、タスクディレクトリの列挙をスキップするために `False` に設定すると高速になります。

タスクはストリーミングすることもでき、これによりベンチマーク全体を事前にダウンロードする必要がなくなります:

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

## 関連項目

- [Harbor](/docs/datasets/v5.2.0/ja/package_reference/loading_methods#datasets.packaged_modules.harbor.Harbor)と[HarborConfig](/docs/datasets/v5.2.0/ja/package_reference/loading_methods#datasets.packaged_modules.harbor.HarborConfig)の参照ドキュメントです。
- エージェントと検証ツールを使用してベンチマークのタスクを*実行*するための[Harborのドキュメント](https://harborframework.com/docs)。

