praveen287's picture
Rename server/ to origami_server/ to avoid module name conflict with uvicorn.server
72390e9
"""OpenEnv types for the Origami RL environment.
OrigamiAction: LLM submits a FOLD crease pattern.
OrigamiObservation: Result of simulating that pattern against a target.
OrigamiState: Internal episode state.
"""
from typing import Any, Optional
from openenv.core import Action, Observation, State
from pydantic import Field
class OrigamiAction(Action):
"""LLM submits a FOLD crease pattern as its action.
The fold_data dict must contain:
- vertices_coords: [[x, y], ...] β€” 2D vertex positions on flat paper
- edges_vertices: [[v1, v2], ...] β€” edge connectivity
- edges_assignment: ["B"|"M"|"V", ...] β€” boundary/mountain/valley
- edges_foldAngle: [angle, ...] β€” target fold angles in degrees
(optional β€” defaults from assignment: M=-180, V=+180, B=0)
"""
fold_data: dict[str, Any] = Field(
..., description="FOLD-format crease pattern JSON"
)
class OrigamiObservation(Observation):
"""Result of simulating the LLM's crease pattern.
Contains everything the viewer and reward function need:
- The submitted fold data and simulation results
- Target shape for overlay comparison
- Shape similarity score (the reward signal)
"""
task: dict[str, Any] = Field(default_factory=dict)
fold_data: dict[str, Any] = Field(default_factory=dict)
final_positions: list[list[float]] = Field(default_factory=list)
target_positions: list[list[float]] = Field(default_factory=list)
shape_similarity: float = 0.0
max_strain: float = 0.0
is_stable: bool = True
error: Optional[str] = None
class OrigamiState(State):
"""Internal state for an origami episode."""
task_name: str = ""
shape_similarity: float = 0.0
is_stable: bool = True