cloudsense / env /models.py
Jaswanth1210's picture
Add client SDK, fix openenv.yaml format, add model aliases
e8f5d33
"""CloudSense Pydantic models — all data structures for the RL environment."""
from enum import Enum
from typing import Optional
from pydantic import BaseModel, Field
class ResourceType(str, Enum):
ec2 = "ec2"
rds = "rds"
s3 = "s3"
load_balancer = "load_balancer"
kubernetes = "kubernetes"
nat_gateway = "nat_gateway"
elasticsearch = "elasticsearch"
ebs = "ebs"
eip = "eip"
class Environment(str, Enum):
prod = "prod"
staging = "staging"
dev = "dev"
class ActionType(str, Enum):
rightsize_resource = "rightsize_resource"
terminate_resource = "terminate_resource"
add_lifecycle_policy = "add_lifecycle_policy"
enable_autoscaling = "enable_autoscaling"
purchase_reservation = "purchase_reservation"
change_storage_class = "change_storage_class"
schedule_uptime = "schedule_uptime"
request_more_info = "request_more_info"
skip_resource = "skip_resource"
class CloudResource(BaseModel):
resource_id: str
resource_type: ResourceType
name: str
environment: Environment
region: str = "us-east-1"
current_config: dict
utilization: dict
monthly_cost: float
tags: dict = Field(default_factory=dict)
has_backups: bool = False
is_critical: bool = False
dependencies: list[str] = Field(default_factory=list)
usage_pattern: str = "always_on"
subnet: Optional[str] = None
class CloudAction(BaseModel):
action_type: ActionType
resource_id: str
new_config: Optional[dict] = None
reasoning: str = ""
class CloudObservation(BaseModel):
task_id: str
goal: str
account_id: str
resources: list[dict]
monthly_cost_current: float
monthly_cost_optimized: float
total_possible_savings: float
actions_taken: list[dict] = Field(default_factory=list)
warnings: list[str] = Field(default_factory=list)
step_number: int = 0
max_steps: int = 10
last_reward: float = 0.0
last_action_error: Optional[str] = None
info: dict = Field(default_factory=dict)
class CloudReward(BaseModel):
value: float = Field(ge=0.0, le=1.0)
cost_saved: float = 0.0
cost_reduction_pct: float = 0.0
actions_correct: int = 0
actions_dangerous: int = 0
breakdown: dict = Field(default_factory=dict)
done: bool = False
class StepResult(BaseModel):
observation: CloudObservation
reward: float
done: bool
info: dict = Field(default_factory=dict)
# Aliases following OpenEnv naming convention
CloudSenseAction = CloudAction
CloudSenseObservation = CloudObservation