"""AI Worker endpoints.""" from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from typing import List from app.database import get_db from app.schemas.worker import ( WorkerCreate, WorkerUpdate, WorkerResponse, WorkerTestRequest, WorkerTestResult, ) from app.services.worker_service import WorkerService from app.services.llm_service import LLMGateway from app.api.deps import get_current_user, require_roles from app.core.permissions import Role from app.models.user import User router = APIRouter(prefix="/workers") @router.get("", response_model=List[WorkerResponse]) def list_workers( skip: int = 0, limit: int = 100, user: User = Depends(get_current_user), db: Session = Depends(get_db), ): return WorkerService.list_workers(db, user.tenant_id, skip, limit) @router.post("", response_model=WorkerResponse, status_code=201) def create_worker( req: WorkerCreate, user: User = Depends(require_roles(Role.SUPER_ADMIN, Role.TENANT_ADMIN)), db: Session = Depends(get_db), ): return WorkerService.create_worker(db, user.tenant_id, req) @router.get("/{worker_id}", response_model=WorkerResponse) def get_worker( worker_id: int, user: User = Depends(get_current_user), db: Session = Depends(get_db), ): w = WorkerService.get_worker(db, user.tenant_id, worker_id) if not w: raise HTTPException(status_code=404, detail="Worker not found") return w @router.put("/{worker_id}", response_model=WorkerResponse) def update_worker( worker_id: int, req: WorkerUpdate, user: User = Depends(require_roles(Role.SUPER_ADMIN, Role.TENANT_ADMIN)), db: Session = Depends(get_db), ): try: return WorkerService.update_worker(db, user.tenant_id, worker_id, req) except ValueError as e: raise HTTPException(status_code=404, detail=str(e)) @router.delete("/{worker_id}") def delete_worker( worker_id: int, user: User = Depends(require_roles(Role.SUPER_ADMIN, Role.TENANT_ADMIN)), db: Session = Depends(get_db), ): if WorkerService.delete_worker(db, user.tenant_id, worker_id): return {"success": True, "message": f"Worker #{worker_id} deleted"} raise HTTPException(status_code=404, detail="Worker not found") @router.post("/{worker_id}/test", response_model=WorkerTestResult) def test_worker( worker_id: int, req: WorkerTestRequest, user: User = Depends(get_current_user), db: Session = Depends(get_db), ): worker = WorkerService.get_worker(db, user.tenant_id, worker_id) if not worker: raise HTTPException(status_code=404, detail="Worker not found") try: messages = [ {"role": "system", "content": worker.system_prompt}, {"role": "user", "content": req.test_prompt}, ] content, cost = LLMGateway.call( worker=worker, messages=messages, db=db, tenant_id=user.tenant_id, ) return WorkerTestResult( success=True, response=content, latency_ms=cost.duration_ms, ) except Exception as e: return WorkerTestResult(success=False, error=str(e))