"""AI 角色 Prompt 配置 API。""" from __future__ import annotations from typing import Optional from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, Field from sqlalchemy.ext.asyncio import AsyncSession from ..core.response import success_response from ..core.database import get_db from ..dependencies.auth import get_current_user from ..dependencies.tenant import get_tenant_id from ..models import User from ..services.auth import has_any_role from ..services.prompt_profile import prompt_profile_service router = APIRouter(prefix="/ai-steward/prompt-profiles", tags=["AI Steward"]) class PromptRoleItem(BaseModel): role_key: str = Field(..., min_length=2, max_length=32, pattern=r"^[a-z0-9][a-z0-9_-]{1,31}$") role_name: str = Field(..., min_length=1, max_length=32) role_description: Optional[str] = Field(default="", max_length=300) system_prompt: str = Field(..., min_length=20, max_length=8000) enabled: bool = True class PromptProfileUpdateRequest(BaseModel): active_role_key: Optional[str] = Field(default=None, min_length=2, max_length=32) roles: list[PromptRoleItem] = Field(..., min_length=1, max_length=12) def _require_manager(user: User) -> None: if not has_any_role(str(user.role or ""), ["BOSS", "ADMIN"]): raise HTTPException(status_code=403, detail="仅管理员可修改 Prompt 配置") @router.get("") async def get_prompt_profiles( current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), tenant_id: int = Depends(get_tenant_id), ): _ = current_user data = await prompt_profile_service.get_profiles(db, tenant_id=tenant_id) return success_response(data) @router.get("/active") async def get_active_prompt_profile( current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), tenant_id: int = Depends(get_tenant_id), ): _ = current_user data = await prompt_profile_service.get_active_role(db, tenant_id=tenant_id) return success_response(data) @router.put("") async def update_prompt_profiles( body: PromptProfileUpdateRequest, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), tenant_id: int = Depends(get_tenant_id), ): _require_manager(current_user) try: data = await prompt_profile_service.update_profiles( db, tenant_id=tenant_id, roles=[item.model_dump() for item in body.roles], active_role_key=body.active_role_key, ) return success_response(data) except ValueError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc