78 lines
2.1 KiB
Python
78 lines
2.1 KiB
Python
"""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
|