diff --git a/backend/app/schemas/task.py b/backend/app/schemas/task.py new file mode 100644 index 0000000..7051578 --- /dev/null +++ b/backend/app/schemas/task.py @@ -0,0 +1,77 @@ +"""Task schemas.""" +from pydantic import BaseModel, Field +from typing import Optional, Any +from datetime import datetime + + +class TaskCreate(BaseModel): + title: str = Field(..., min_length=1, max_length=500) + description: str = "" + priority: str = "medium" + task_type: str = "single_call" + input_data: str = "" # JSON string: {prompt, context, parameters} + requires_review: bool = True + assignee_id: Optional[int] = None + worker_id: Optional[int] = None + due_date: Optional[datetime] = None + depends_on: str = "[]" + + +class TaskUpdate(BaseModel): + title: Optional[str] = None + description: Optional[str] = None + status: Optional[str] = None + priority: Optional[str] = None + assignee_id: Optional[int] = None + worker_id: Optional[int] = None + input_data: Optional[str] = None + requires_review: Optional[bool] = None + due_date: Optional[datetime] = None + depends_on: Optional[str] = None + + +class TaskAssign(BaseModel): + assignee_id: Optional[int] = None + worker_id: Optional[int] = None + + +class TaskExecute(BaseModel): + """Trigger task execution.""" + override_input: Optional[str] = None # override task input_data + max_retries: int = 3 + + +class TaskResponse(BaseModel): + id: int + project_id: int + title: str + description: str + status: str + priority: str + assignee_id: Optional[int] = None + worker_id: Optional[int] = None + task_type: str + input_data: str + output_data: Optional[str] = None + requires_review: bool + review_status: Optional[str] = None + due_date: Optional[datetime] = None + started_at: Optional[datetime] = None + completed_at: Optional[datetime] = None + tenant_id: int + created_at: datetime + updated_at: datetime + + model_config = {"from_attributes": True} + + +class TaskExecutionResult(BaseModel): + """Result of executing a task via AI Worker.""" + task_id: int + status: str # success, error, needs_review + output: str = "" + token_usage: int = 0 + cost_cents: int = 0 + duration_ms: int = 0 + error: Optional[str] = None + artifact_id: Optional[int] = None