jester1177/cloud-native-debug-env
0
1"""Pydantic models for the API."""2 3from enum import Enum4from typing import Any, Dict, List, Optional, Union5 6from pydantic import BaseModel, Field7 8 9class TaskDifficulty(str, Enum):10 EASY = "easy"11 MEDIUM = "medium"12 HARD = "hard"13 14 15class ActionType(str, Enum):16 EDIT_FILE = "edit_file"17 ADD_LINE = "add_line"18 DELETE_LINE = "delete_line"19 REPLACE_LINE = "replace_line"20 ADD_BLOCK = "add_block"21 DELETE_BLOCK = "delete_block"22 SUBMIT = "submit"23 REQUEST_HINT = "request_hint"24 25 26class TaskDifficultyExtended(str, Enum):27 EASY = "easy"28 MEDIUM = "medium"29 MEDIUM_HARD = "medium-hard"30 HARD = "hard"31 EXPERT = "expert"32 33 34class FileType(str, Enum):35 DOCKERFILE = "dockerfile"36 WORKFLOW = "workflow"37 DOCKER_COMPOSE = "docker_compose"38 REQUIREMENTS = "requirements"39 KUBERNETES = "kubernetes"40 OTHER = "other"41 42 43class ErrorPhase(str, Enum):44 WORKFLOW_PARSE = "workflow_parse"45 DOCKER_BUILD = "docker_build"46 DOCKER_RUN = "docker_run"47 TEST = "test"48 PUSH = "push"49 DEPLOY = "deploy"50 K8S_VALIDATION = "k8s_validation"51 K8S_RUNTIME = "k8s_runtime"52 K8S_NETWORKING = "k8s_networking"53 PIPELINE_BUILD = "pipeline_build"54 PIPELINE_DEPLOY = "pipeline_deploy"55 56 57class FileContent(BaseModel):58 path: str59 content: str60 file_type: FileType61 line_count: int62 63 64class ErrorInfo(BaseModel):65 phase: ErrorPhase66 error_message: str67 exit_code: Optional[int] = None68 failed_step: Optional[str] = None69 line_hint: Optional[int] = None70 71 72class Observation(BaseModel):73 task_id: str74 task_description: str75 difficulty: TaskDifficulty76 files: List[FileContent]77 error: ErrorInfo78 available_secrets: List[str] = Field(default_factory=list)79 runner_os: str = "ubuntu-latest"80 step_number: int81 max_steps: int82 hints_used: int = 083 hints_available: int = 384 last_action_success: Optional[bool] = None85 last_action_feedback: Optional[str] = None86 issues_found: int = 087 issues_fixed: int = 088 total_issues: int89 90 91class FileEdit(BaseModel):92 file_path: str93 line_number: Optional[int] = None94 old_content: Optional[str] = None95 new_content: Optional[str] = None96 97 98class Action(BaseModel):99 action_type: ActionType100 edits: Optional[List[FileEdit]] = None101 reasoning: Optional[str] = None102 103 104 105class TaskInfo(BaseModel):106 id: str107 name: str108 description: str109 difficulty: TaskDifficulty110 num_scenarios: int111 112 113class EnvironmentInfo(BaseModel):114 name: str = "cloud-native-devops-env"115 version: str = "1.0.0"116 description: str = "Debug cloud-native deployment pipeline issues"117 tasks: List[TaskInfo]118 max_steps: int = 10119 action_space: Dict[str, Any]120 observation_space: Dict[str, Any]121 122 123class GraderResult(BaseModel):124 task_id: str125 score: float = Field(..., ge=0.0, le=1.0)126 max_score: float = 1.0127 breakdown: Dict[str, float] = Field(default_factory=dict)128 feedback: str = ""129 steps_taken: int130 hints_used: int = 0131 132 133class ResetRequest(BaseModel):134 task_id: Optional[Union[str, int]] = None135 scenario_id: Optional[str] = None136 seed: Optional[int] = None137 138 139class ResetResponse(BaseModel):140 observation: Observation141 info: Dict[str, Any] = Field(default_factory=dict)142 143 144class StepRequest(BaseModel):145 action: Action146 147 148class StepResponse(BaseModel):149 observation: Observation150 reward: float151 done: bool152 info: Dict[str, Any] = Field(default_factory=dict)153 154 155class StateResponse(BaseModel):156 observation: Observation157 episode_reward: float158 steps_taken: int159 done: bool160 161 162class GraderRequest(BaseModel):163 task_id: str164 trajectory: List[Dict[str, Any]]165 166 167class GraderResponse(BaseModel):168 result: GraderResult169 170 171class BaselineRequest(BaseModel):172 task_id: Optional[str] = None173 num_episodes: int = 1174 175 176class BaselineResponse(BaseModel):177 results: List[GraderResult]178 aggregate_score: float179 