80 lines
2.6 KiB
Python
80 lines
2.6 KiB
Python
"""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
|