50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
# models.py
|
|
from typing import List, Dict, Any, Optional, Literal
|
|
from pydantic import BaseModel, Field
|
|
from enum import Enum
|
|
|
|
class TaskStatus(str, Enum):
|
|
PENDING = "pending"
|
|
CODING = "coding"
|
|
REVIEW = "review"
|
|
REWORK = "rework"
|
|
APPROVED = "approved"
|
|
REJECTED = "rejected"
|
|
FAILED = "failed"
|
|
|
|
class ReviewComment(BaseModel):
|
|
line: Optional[int] = None
|
|
file: Optional[str] = None
|
|
severity: Literal["critical", "major", "minor", "suggestion", "warning", "info"] = "major"
|
|
text: str
|
|
|
|
class ReviewResult(BaseModel):
|
|
status: Literal["approved", "changes_requested", "rejected"]
|
|
comments: List[ReviewComment] = Field(default_factory=list)
|
|
summary: str
|
|
|
|
class CodeSolution(BaseModel):
|
|
files: Dict[str, str] = Field(default_factory=dict) # filename -> content
|
|
description: str
|
|
tests: Dict[str, str] = Field(default_factory=dict) # test_filename -> content
|
|
|
|
class IterationRecord(BaseModel):
|
|
"""Запись одной итерации"""
|
|
iteration: int
|
|
timestamp: str
|
|
agent: Literal["developer", "reviewer"]
|
|
action: str # "start", "complete", "error"
|
|
input_summary: Optional[str] = None
|
|
output_summary: Optional[str] = None
|
|
details: Dict[str, Any] = Field(default_factory=dict)
|
|
error: Optional[str] = None
|
|
|
|
class Task(BaseModel):
|
|
id: str
|
|
requirement: str
|
|
status: TaskStatus = TaskStatus.PENDING
|
|
iteration: int = 0
|
|
solution: Optional[CodeSolution] = None
|
|
last_review: Optional[ReviewResult] = None
|
|
error_log: List[str] = Field(default_factory=list)
|
|
history: List[IterationRecord] = Field(default_factory=list) # <-- новая история |