File size: 4,308 Bytes
a21d9ae | 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 | from typing import Optional, List, Dict, Any, Literal
from pydantic import BaseModel, Field
from enum import Enum
class ReviewActionType(str, Enum):
ADD_COMMENT = "add_comment"
SUGGEST_FIX = "suggest_fix"
APPROVE = "approve"
REQUEST_CHANGES = "request_changes"
MARK_AS_RESOLVED = "mark_as_resolved"
class Comment(BaseModel):
line_number: int = Field(..., ge=1, description="Line number in the diff")
content: str = Field(..., min_length=1, description="Comment content")
is_issue: bool = Field(True, description="Whether this is pointing out an issue")
severity: Optional[Literal["low", "medium", "high", "critical"]] = Field(
None, description="Issue severity"
)
resolved: bool = Field(False, description="Whether the comment has been addressed")
class Suggestion(BaseModel):
original_line: int = Field(..., ge=1, description="Line number with issue")
suggested_code: str = Field(..., description="Suggested replacement code")
explanation: str = Field(..., description="Explanation of the suggestion")
accepted: bool = Field(False, description="Whether the suggestion was accepted")
class ReviewAction(BaseModel):
action_type: ReviewActionType = Field(..., description="Type of action to take")
comments: List[Comment] = Field(default_factory=list, description="Comments to add")
suggestions: List[Suggestion] = Field(default_factory=list, description="Suggested fixes")
final_decision: Optional[Literal["approved", "changes_requested"]] = Field(
None, description="Final review decision"
)
class CodeContext(BaseModel):
file_path: str = Field(..., description="Path to the file being reviewed")
file_extension: str = Field(..., description="File extension")
code_diff: str = Field(..., description="Git diff of changes")
surrounding_code: str = Field(..., description="Surrounding code context")
language: str = Field(..., description="Programming language")
line_count: int = Field(..., ge=1, description="Number of lines changed")
class TaskMetadata(BaseModel):
task_id: str = Field(..., description="Unique task identifier")
task_name: str = Field(..., description="Human-readable task name")
difficulty: Literal["easy", "medium", "hard"] = Field(..., description="Task difficulty")
description: str = Field(..., description="Task description")
expected_issues: List[Dict[str, Any]] = Field(default_factory=list, description="Expected issues to find")
class ReviewState(BaseModel):
code_context: CodeContext = Field(..., description="Code being reviewed")
task_metadata: TaskMetadata = Field(..., description="Current task information")
comments_made: List[Comment] = Field(default_factory=list, description="Comments already made")
suggestions_made: List[Suggestion] = Field(default_factory=list, description="Suggestions already made")
current_step: int = Field(0, description="Current step number")
is_complete: bool = Field(False, description="Whether review is complete")
final_decision: Optional[str] = Field(None, description="Final decision if made")
last_action_valid: bool = Field(True, description="Whether last action was valid")
last_error: Optional[str] = Field(None, description="Last error message if any")
class Observation(BaseModel):
code_diff: str = Field(..., description="Current code diff")
file_context: str = Field(..., description="Surrounding file context")
file_path: str = Field(..., description="File being reviewed")
language: str = Field(..., description="Programming language")
task_description: str = Field(..., description="Description of the review task")
task_difficulty: str = Field(..., description="Task difficulty level")
current_step: int = Field(0, description="Current step number")
max_steps: int = Field(50, description="Maximum steps allowed")
previous_comments: List[Comment] = Field(default_factory=list, description="Comments made so far")
previous_suggestions: List[Suggestion] = Field(default_factory=list, description="Suggestions made so far")
review_complete: bool = Field(False, description="Whether review is complete")
final_decision_made: Optional[str] = Field(None, description="Final decision if made") |