File size: 1,572 Bytes
e6ce96e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Episode data structures for HARvestGym."""

from dataclasses import dataclass, field
from typing import Any


@dataclass
class CurlCall:
    method: str
    url: str
    path: str          # normalized (IDs replaced with {id})
    headers: dict
    body: dict | str | None
    status_code: int
    response_body: Any
    response_headers: dict = field(default_factory=dict)


@dataclass
class Step:
    step_num: int
    tool: str          # browser_agent | search_endpoints | curl_exec | search_episode_data | done
    action: str        # raw tool call string
    result: Any        # tool return value
    curl_parsed: CurlCall | None = None


@dataclass
class Task:
    template_id: int                 # 1-7
    description: str                 # instantiated task string
    params: dict                     # e.g. {"product_name": "Radiant Tee", "sku": "MH01"}
    app: str                         # shopping | forum | wikipedia | shopping_admin
    base_url: str
    difficulty: str                  # easy | medium | hard


@dataclass
class Episode:
    task: Task
    steps: list[Step] = field(default_factory=list)
    session_state: dict = field(default_factory=dict)
    total_steps: int = 0
    terminated_by: str = ""          # "done_call" | "max_steps"


@dataclass
class EpisodeResult:
    task_score: float                # 0.0-1.0 from grader
    parameter_sourcing_score: float  # 0.0-1.0 from trajectory analysis
    auth_obtained: bool
    reward: float                    # final composite reward
    details: dict = field(default_factory=dict)