From f4245812a18b6ab614d1d986c8c2ac4e642e04f5 Mon Sep 17 00:00:00 2001 From: huangzhuang_3rd Date: Wed, 12 Aug 2026 13:30:58 +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/worker.py | 72 +++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 backend/app/schemas/worker.py diff --git a/backend/app/schemas/worker.py b/backend/app/schemas/worker.py new file mode 100644 index 0000000..bdf1a91 --- /dev/null +++ b/backend/app/schemas/worker.py @@ -0,0 +1,72 @@ +"""AI Worker schemas.""" +from pydantic import BaseModel, Field +from typing import Optional +from datetime import datetime + + +class WorkerCreate(BaseModel): + name: str = Field(..., min_length=1, max_length=200) + description: str = "" + provider: str = "openai" + model_name: str = "gpt-4o-mini" + api_key: Optional[str] = None # If None, uses platform default + base_url: Optional[str] = None + temperature: float = 0.7 + system_prompt: str = "You are a helpful AI assistant." + tools: str = "[]" + max_cost_per_task_cents: Optional[int] = None + max_cost_per_month_cents: Optional[int] = None + available_hours: str = '{"start": "00:00", "end": "23:59"}' + max_concurrent_tasks: int = 1 + + +class WorkerUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + provider: Optional[str] = None + model_name: Optional[str] = None + api_key: Optional[str] = None + base_url: Optional[str] = None + temperature: Optional[float] = None + system_prompt: Optional[str] = None + tools: Optional[str] = None + max_cost_per_task_cents: Optional[int] = None + max_cost_per_month_cents: Optional[int] = None + is_active: Optional[bool] = None + available_hours: Optional[str] = None + max_concurrent_tasks: Optional[int] = None + status: Optional[str] = None + + +class WorkerResponse(BaseModel): + id: int + name: str + description: str + provider: str + model_name: str + base_url: Optional[str] = None + temperature: float + system_prompt: str + tools: str + max_cost_per_task_cents: Optional[int] = None + max_cost_per_month_cents: Optional[int] = None + status: str + is_active: bool + current_task_count: int + max_concurrent_tasks: int + tenant_id: int + created_at: datetime + updated_at: datetime + + model_config = {"from_attributes": True} + + +class WorkerTestRequest(BaseModel): + test_prompt: str = "Hello, respond with 'OK' if you can hear me." + + +class WorkerTestResult(BaseModel): + success: bool + response: str = "" + latency_ms: int = 0 + error: Optional[str] = None