Krishna1107's picture
fixed inference
2794920
"""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