-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Expand file tree
/
Copy pathdataset.py
More file actions
66 lines (57 loc) · 2.48 KB
/
dataset.py
File metadata and controls
66 lines (57 loc) · 2.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
"""Scenario dataset loader for orchestrator lifecycle benchmark."""
from __future__ import annotations
import json
from pathlib import Path
from .types import Scenario, ScenarioTurn
class LifecycleDataset:
def __init__(self, scenario_dir: str) -> None:
self.scenario_dir = self._resolve_scenario_dir(Path(scenario_dir))
def load(self) -> list[Scenario]:
if not self.scenario_dir.exists():
raise FileNotFoundError(f"Scenario directory not found: {self.scenario_dir}")
scenarios: list[Scenario] = []
for path in sorted(self.scenario_dir.glob("*.json")):
if path.name == "schema.json":
continue
with open(path, encoding="utf-8") as handle:
payload = json.load(handle)
turns_payload = payload.get("turns", [])
turns: list[ScenarioTurn] = []
for turn in turns_payload:
if not isinstance(turn, dict):
continue
turns.append(
ScenarioTurn(
actor=str(turn.get("actor", "")),
message=str(turn.get("message", "")),
expected_behaviors=[
str(v) for v in turn.get("expected_behaviors", [])
],
forbidden_behaviors=[
str(v) for v in turn.get("forbidden_behaviors", [])
],
)
)
scenarios.append(
Scenario(
scenario_id=str(payload.get("scenario_id", path.stem)),
title=str(payload.get("title", path.stem)),
category=str(payload.get("category", "general")),
required_capabilities=[
str(v) for v in payload.get("required_capabilities", [])
],
turns=turns,
)
)
return scenarios
def _resolve_scenario_dir(self, scenario_dir: Path) -> Path:
if scenario_dir.exists() or scenario_dir.is_absolute():
return scenario_dir
package_dir = Path(__file__).resolve().parent
packages_root = package_dir.parents[1]
candidates = [
packages_root / scenario_dir,
package_dir / scenario_dir,
package_dir / scenario_dir.name,
]
return next((candidate for candidate in candidates if candidate.exists()), scenario_dir)