File size: 4,009 Bytes
a7caaff 85b7ac8 c8f3b98 85b7ac8 c8f3b98 85b7ac8 c8f3b98 85b7ac8 a7caaff 85b7ac8 a7caaff 85b7ac8 c8f3b98 85b7ac8 c8f3b98 85b7ac8 2794920 85b7ac8 2794920 85b7ac8 | 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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | """Pydantic models for the API."""
from enum import Enum
from typing import Any, Dict, List, Optional, Union
from pydantic import BaseModel, Field
class TaskDifficulty(str, Enum):
EASY = "easy"
MEDIUM = "medium"
HARD = "hard"
class ActionType(str, Enum):
EDIT_FILE = "edit_file"
ADD_LINE = "add_line"
DELETE_LINE = "delete_line"
REPLACE_LINE = "replace_line"
ADD_BLOCK = "add_block"
DELETE_BLOCK = "delete_block"
SUBMIT = "submit"
REQUEST_HINT = "request_hint"
class TaskDifficultyExtended(str, Enum):
EASY = "easy"
MEDIUM = "medium"
MEDIUM_HARD = "medium-hard"
HARD = "hard"
EXPERT = "expert"
class FileType(str, Enum):
DOCKERFILE = "dockerfile"
WORKFLOW = "workflow"
DOCKER_COMPOSE = "docker_compose"
REQUIREMENTS = "requirements"
KUBERNETES = "kubernetes"
OTHER = "other"
class ErrorPhase(str, Enum):
WORKFLOW_PARSE = "workflow_parse"
DOCKER_BUILD = "docker_build"
DOCKER_RUN = "docker_run"
TEST = "test"
PUSH = "push"
DEPLOY = "deploy"
K8S_VALIDATION = "k8s_validation"
K8S_RUNTIME = "k8s_runtime"
K8S_NETWORKING = "k8s_networking"
PIPELINE_BUILD = "pipeline_build"
PIPELINE_DEPLOY = "pipeline_deploy"
class FileContent(BaseModel):
path: str
content: str
file_type: FileType
line_count: int
class ErrorInfo(BaseModel):
phase: ErrorPhase
error_message: str
exit_code: Optional[int] = None
failed_step: Optional[str] = None
line_hint: Optional[int] = None
class Observation(BaseModel):
task_id: str
task_description: str
difficulty: TaskDifficulty
files: List[FileContent]
error: ErrorInfo
available_secrets: List[str] = Field(default_factory=list)
runner_os: str = "ubuntu-latest"
step_number: int
max_steps: int
hints_used: int = 0
hints_available: int = 3
last_action_success: Optional[bool] = None
last_action_feedback: Optional[str] = None
issues_found: int = 0
issues_fixed: int = 0
total_issues: int
class FileEdit(BaseModel):
file_path: str
line_number: Optional[int] = None
old_content: Optional[str] = None
new_content: Optional[str] = None
class Action(BaseModel):
action_type: ActionType
edits: Optional[List[FileEdit]] = None
reasoning: Optional[str] = None
class TaskInfo(BaseModel):
id: str
name: str
description: str
difficulty: TaskDifficulty
num_scenarios: int
class EnvironmentInfo(BaseModel):
name: str = "cloud-native-devops-env"
version: str = "1.0.0"
description: str = "Debug cloud-native deployment pipeline issues"
tasks: List[TaskInfo]
max_steps: int = 10
action_space: Dict[str, Any]
observation_space: Dict[str, Any]
class GraderResult(BaseModel):
task_id: str
score: float = Field(..., gt=0.0, lt=1.0)
max_score: float = 1.0
breakdown: Dict[str, float] = Field(default_factory=dict)
feedback: str = ""
steps_taken: int
hints_used: int = 0
class ResetRequest(BaseModel):
task_id: Optional[Union[str, int]] = None
scenario_id: Optional[str] = None
seed: Optional[int] = None
class ResetResponse(BaseModel):
observation: Observation
info: Dict[str, Any] = Field(default_factory=dict)
class StepRequest(BaseModel):
action: Action
class StepResponse(BaseModel):
observation: Observation
reward: float
done: bool
info: Dict[str, Any] = Field(default_factory=dict)
class StateResponse(BaseModel):
observation: Observation
episode_reward: float
steps_taken: int
done: bool
class GraderRequest(BaseModel):
task_id: str
trajectory: List[Dict[str, Any]]
class GraderResponse(BaseModel):
result: GraderResult
class BaselineRequest(BaseModel):
task_id: Optional[str] = None
num_episodes: Optional[int] = None # None = run ALL scenarios
class BaselineResponse(BaseModel):
results: List[GraderResult]
aggregate_score: float
|