File size: 2,313 Bytes
883cccb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations

from typing import Any, Literal, Optional

from pydantic import BaseModel, Field, field_validator

from openenv.core.env_server.types import Action, Observation, State


class OrigamiFold(BaseModel):
    """Single fold action payload for step-level execution."""

    from_point: list[float] = Field(..., description="Fold line start [x, y]")
    to_point: list[float] = Field(..., description="Fold line end [x, y]")
    assignment: Literal["M", "V"] = Field(..., description="Mountain or valley")
    instruction: str = Field(default="", description="Optional natural language instruction")

    @field_validator("from_point", "to_point")
    @classmethod
    def _validate_point(cls, point: list[float]) -> list[float]:
        if len(point) != 2:
            raise ValueError("Point must contain exactly 2 coordinates")
        return [float(point[0]), float(point[1])]


class OrigamiAction(Action):
    """
    OpenEnv action for Optigami.

    Modes:
    - single: execute one fold (pass `fold` or JSON `completion` for a single-fold object)
    - sequence: execute a full <folds>[...]</folds> completion in one step
    """

    mode: Literal["single", "sequence"] = Field(default="single")
    fold: Optional[OrigamiFold] = Field(default=None)
    completion: Optional[str] = Field(default=None)
    target_name: Optional[str] = Field(
        default=None,
        description="Optional target override; reset to this target before stepping",
    )


class OrigamiObservation(Observation):
    """OpenEnv observation payload returned by Optigami."""

    prompt: str = Field(default="")
    target_name: Optional[str] = Field(default=None)
    step: int = Field(default=0)
    paper_state: dict[str, Any] = Field(default_factory=dict)
    info: dict[str, Any] = Field(default_factory=dict)
    reward_components: dict[str, float | int | str] = Field(default_factory=dict)
    error: Optional[str] = Field(default=None)


class OrigamiState(State):
    """OpenEnv state payload for Optigami."""

    mode: str = Field(default="step")
    target_name: Optional[str] = Field(default=None)
    paper: dict[str, Any] = Field(default_factory=dict)
    last_reward: dict[str, Any] = Field(default_factory=dict)
    available_targets: list[str] = Field(default_factory=list)