rahul24raj's picture
Upload folder using huggingface_hub
a0b8672 verified
"""OpenEnv type definitions for the Fish Farm environment.
FarmAction: What the agent can do each hour
FarmObservation: What the agent sees (partial observability β€” no ground truth disease state)
FarmState: Full internal state (for grading)
"""
from typing import Any, Dict, List
from openenv.core.env_server import Action, Observation, State
from pydantic import Field
class FarmAction(Action):
"""Agent's hourly farm management decision."""
feeding_rate: float = Field(
default=0.3, ge=0.0, le=1.0,
description="Feeding intensity (0=none, 0.3=conservative, 0.5=normal, 1.0=maximum ration). "
"Higher feeding grows fish faster but produces more ammonia and consumes more oxygen."
)
aeration_rate: float = Field(
default=0.5, ge=0.0, le=1.0,
description="Aerator power (0=off, 0.5=half, 1.0=full). "
"Increases dissolved oxygen but costs electricity."
)
heater_setting: float = Field(
default=0.0, ge=-1.0, le=1.0,
description="Temperature control (-1.0=max cooling, 0=off, 1.0=max heating). "
"Adjusts water temperature toward optimal growth range."
)
water_exchange_rate: float = Field(
default=0.02, ge=0.0, le=0.10,
description="Fresh water exchange (0=none, 0.05=5%/hour, 0.10=10%/hour max). "
"Dilutes ammonia and refreshes oxygen but costs water."
)
harvest_decision: bool = Field(
default=False,
description="Set True to harvest all fish and end the episode. "
"Revenue depends on total biomass and market price."
)
treatment: str = Field(
default="none",
description="Disease treatment: 'none', 'antibiotics' (speeds recovery, harms biofilter), "
"'salt' (reduces nitrite toxicity), 'probiotics' (boosts biofilter), "
"'vaccination' ($100, prevents 80% of future infections). "
"Treatments cost money."
)
class FarmObservation(Observation):
"""What the agent observes after each step.
Note: Disease infection count is NOT directly visible β€” the agent must
infer disease from behavioral indicators (feeding response, mortality spikes).
"""
# Fish status
avg_fish_weight: float = Field(default=5.0, description="Average individual fish weight (grams)")
population: int = Field(default=10000, description="Total fish count in tank")
mortality_today: int = Field(default=0, description="Fish deaths in the last 24 hours")
cumulative_mortality: int = Field(default=0, description="Total deaths since stocking")
survival_rate: float = Field(default=1.0, description="Fraction of original population still alive")
stress_level: float = Field(default=0.0, description="Fish stress index (0.0=calm, 1.0=critical)")
feeding_response: str = Field(default="normal", description="Fish appetite: eager/normal/sluggish/refusing")
biomass_kg: float = Field(default=50.0, description="Total fish biomass in kg")
growth_rate_g_day: float = Field(default=0.0, description="Current growth rate (g/day)")
fcr: float = Field(default=0.0, description="Feed conversion ratio (kg feed / kg gain). Target <2.0")
sgr: float = Field(default=0.0, description="Specific growth rate (%/day)")
stocking_density: float = Field(default=50.0, description="Fish per cubic meter")
# Water quality
temperature: float = Field(default=28.0, description="Water temperature (Celsius)")
dissolved_oxygen: float = Field(default=7.0, description="Dissolved oxygen (mg/L). Below 3=danger, below 1=lethal")
ph: float = Field(default=7.5, description="Water pH (6.5-8.5 optimal)")
ammonia: float = Field(default=0.1, description="Total ammonia nitrogen TAN (mg/L). Above 2=dangerous")
ammonia_toxic: float = Field(default=0.005, description="Unionized ammonia UIA (mg/L). Above 0.05=toxic")
nitrite: float = Field(default=0.05, description="Nitrite NO2 (mg/L). Above 0.5=stress")
nitrate: float = Field(default=0.0, description="Nitrate NO3 (mg/L). Product of nitrification")
water_quality_score: float = Field(default=1.0, description="Composite water quality (0-1)")
algae_bloom: bool = Field(default=False, description="Is algae bloom active (DO swings)")
nighttime_do_risk: float = Field(default=0.0, description="Nighttime DO crash risk (0=safe, 1=imminent). Increase aeration if high.")
# System status
aerator_working: bool = Field(default=True, description="Is the aerator functioning?")
biofilter_working: bool = Field(default=True, description="Is the biofilter functioning?")
heater_working: bool = Field(default=True, description="Is the heater functioning?")
feed_remaining_kg: float = Field(default=500.0, description="Feed inventory remaining (kg)")
# Economics
current_fish_value: float = Field(default=0.0, description="Current market value of all fish ($)")
total_cost_so_far: float = Field(default=0.0, description="Cumulative operating cost ($)")
current_profit: float = Field(default=0.0, description="Revenue - costs if harvested now ($)")
feed_price_per_kg: float = Field(default=0.50, description="Current feed price (stochastic, $/kg)")
market_price_multiplier: float = Field(default=1.0, description="Seasonal market price factor (1.0=normal)")
marginal_cost_per_hour: float = Field(default=0.0, description="Cost of last hour of operation ($)")
roi_pct: float = Field(default=0.0, description="Return on investment (%)")
# Weather
weather_forecast: str = Field(default="", description="Current weather conditions")
is_daytime: bool = Field(default=True, description="Is it daytime (affects photosynthesis/DO)")
storm_active: bool = Field(default=False, description="Is a storm currently active")
humidity: float = Field(default=75.0, description="Relative humidity (%)")
# Context
day_in_cycle: int = Field(default=0, description="Days since stocking")
time_of_day: int = Field(default=0, description="Hour (0-23)")
day_of_year: int = Field(default=1, description="Calendar day (1-365, for seasonal context)")
alerts: List[str] = Field(default_factory=list, description="Active alerts and warnings")
# Disease signals (partial observability β€” no infection count, but behavioral indicators)
disease_suspected: bool = Field(default=False, description="Behavioral signs suggest disease (mortality+appetite)")
# Env standard
feedback: str = Field(default="", description="Narrative feedback on the current situation")
class FarmState(State):
"""Full internal state β€” used by graders, NOT visible to agent.
Contains ground truth disease status, exact biochemistry, etc.
"""
task_id: str = Field(default="", description="Current task ID")
is_complete: bool = Field(default=False)
final_score: float = Field(default=0.0)
max_hours: int = Field(default=168)
# Full simulator snapshot
sim_state: Dict[str, Any] = Field(default_factory=dict)