From 598b46bc2e78e303de0b19d92b7beee3a3dd6c66 Mon Sep 17 00:00:00 2001 From: huangzhuang_3rd Date: Wed, 12 Aug 2026 13:30:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20AI=20Worker=20=E5=B9=B3=E5=8F=B0=20MVP?= =?UTF-8?q?=20v1.0.0=20-=20=E5=A4=9A=E7=A7=9F=E6=88=B7/=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=AE=A1=E7=90=86/AI=20Worker/=E4=BB=BB=E5=8A=A1=E7=BC=96?= =?UTF-8?q?=E6=8E=92/HITL=E5=AE=A1=E6=A0=B8/=E6=88=90=E6=9C=AC=E6=B2=BB?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/schemas/task.py | 77 +++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 backend/app/schemas/task.py 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