log-center/app/models.py
zyc b178d24e73
Some checks failed
Build and Deploy Log Center / build-and-deploy (push) Failing after 5m9s
fix pr
2026-02-25 16:35:28 +08:00

152 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from datetime import datetime
from typing import Optional, Dict, List
from sqlmodel import SQLModel, Field, Column, JSON, Text
from enum import Enum
class LogSource(str, Enum):
RUNTIME = "runtime"
CICD = "cicd"
DEPLOYMENT = "deployment"
class LogStatus(str, Enum):
NEW = "NEW"
VERIFYING = "VERIFYING"
CANNOT_REPRODUCE = "CANNOT_REPRODUCE"
PENDING_FIX = "PENDING_FIX"
FIXING = "FIXING"
FIXED = "FIXED"
VERIFIED = "VERIFIED"
DEPLOYED = "DEPLOYED"
FIX_FAILED = "FIX_FAILED"
class Project(SQLModel, table=True):
"""项目信息"""
id: Optional[int] = Field(default=None, primary_key=True)
project_id: str = Field(unique=True, index=True)
name: Optional[str] = Field(default=None)
repo_url: Optional[str] = Field(default=None)
local_path: Optional[str] = Field(default=None)
description: Optional[str] = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
class ProjectUpdate(SQLModel):
"""项目编辑 schema"""
name: Optional[str] = None
repo_url: Optional[str] = None
local_path: Optional[str] = None
description: Optional[str] = None
class ErrorLog(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
project_id: str = Field(index=True)
environment: str
level: str
# Source
source: str = Field(default="runtime", index=True)
# Error Details
error_type: str
error_message: str
file_path: Optional[str] = None
line_number: Optional[int] = None
stack_trace: str = Field(sa_column=Column(JSON)) # Store full stack trace
# Context
context: Dict = Field(default={}, sa_column=Column(JSON))
# Versioning
version: Optional[str] = None
commit_hash: Optional[str] = None
# Meta
timestamp: datetime = Field(default_factory=datetime.utcnow)
fingerprint: str = Field(unique=True, index=True) # project_id + error_type + file_path + line_number
# Severity (1-10, AI 评估的严重等级8+ 需人工审核)
severity: Optional[int] = Field(default=None)
severity_reason: Optional[str] = Field(default=None, sa_column=Column(Text, nullable=True))
# Status Tracking
status: LogStatus = Field(default=LogStatus.NEW)
retry_count: int = Field(default=0)
# Repair Tracking
failure_reason: Optional[str] = Field(default=None, sa_column=Column(Text, nullable=True))
# PR Tracking
pr_number: Optional[int] = Field(default=None)
pr_url: Optional[str] = Field(default=None)
branch_name: Optional[str] = Field(default=None)
# Rejection Tracking
rejection_reason: Optional[str] = Field(default=None, sa_column=Column(Text, nullable=True))
rejection_count: int = Field(default=0)
last_rejected_at: Optional[datetime] = None
merged_at: Optional[datetime] = None
# Pydantic Models for API
class ErrorLogCreate(SQLModel):
project_id: str
environment: str
level: str
timestamp: Optional[datetime] = None
version: Optional[str] = None
commit_hash: Optional[str] = None
repo_url: Optional[str] = None
source: str = "runtime"
error: Dict # {type, message, file_path, line_number, stack_trace}
context: Optional[Dict] = {}
class TaskStatusUpdate(SQLModel):
status: LogStatus
message: Optional[str] = None
class RepairTask(SQLModel, table=True):
"""Record of a repair attempt (one per batch, may cover multiple bugs)"""
id: Optional[int] = Field(default=None, primary_key=True)
error_log_ids: List[int] = Field(sa_column=Column(JSON)) # 关联的 Bug ID 列表
status: LogStatus
project_id: str
# Repair Details
ai_analysis: str = Field(sa_column=Column(Text))
fix_plan: str = Field(sa_column=Column(Text))
code_diff: str = Field(sa_column=Column(Text))
modified_files: List[str] = Field(sa_column=Column(JSON))
# Test Results
test_output: str = Field(sa_column=Column(Text))
test_passed: bool
# Repair Round Tracking
repair_round: int = Field(default=1)
failure_reason: Optional[str] = Field(default=None, sa_column=Column(Text, nullable=True))
# PR Info
pr_url: Optional[str] = Field(default=None)
pr_number: Optional[int] = Field(default=None)
branch_name: Optional[str] = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow)
class RepairTaskCreate(SQLModel):
"""Schema for creating a repair report via API"""
error_log_ids: List[int]
status: LogStatus
project_id: str
ai_analysis: str
fix_plan: str
code_diff: str
modified_files: List[str]
test_output: str
test_passed: bool
repair_round: int = 1
failure_reason: Optional[str] = None
pr_url: Optional[str] = None
pr_number: Optional[int] = None
branch_name: Optional[str] = None