88 lines
2.6 KiB
Python
88 lines
2.6 KiB
Python
|
|
"""
|
|||
|
|
公司组织班底预设包 API — 一键创建全套 AI 数字员工
|
|||
|
|
"""
|
|||
|
|
from __future__ import annotations
|
|||
|
|
|
|||
|
|
import logging
|
|||
|
|
from typing import Any, Dict, List, Optional
|
|||
|
|
|
|||
|
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|||
|
|
from pydantic import BaseModel, Field
|
|||
|
|
from sqlalchemy.orm import Session
|
|||
|
|
|
|||
|
|
from app.api.auth import get_current_user
|
|||
|
|
from app.core.database import get_db
|
|||
|
|
from app.models.user import User
|
|||
|
|
from app.services.company_presets import (
|
|||
|
|
list_company_presets,
|
|||
|
|
get_company_preset,
|
|||
|
|
create_company_preset,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
logger = logging.getLogger(__name__)
|
|||
|
|
|
|||
|
|
router = APIRouter(
|
|||
|
|
prefix="/api/v1/company-presets",
|
|||
|
|
tags=["company-presets"],
|
|||
|
|
responses={
|
|||
|
|
401: {"description": "未授权"},
|
|||
|
|
400: {"description": "请求参数错误"},
|
|||
|
|
404: {"description": "预设包不存在"},
|
|||
|
|
},
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
|
|||
|
|
class CreateCompanyPresetRequest(BaseModel):
|
|||
|
|
workspace_id: Optional[str] = Field(None, description="工作区 ID")
|
|||
|
|
selected_roles: Optional[List[str]] = Field(None, description="要创建的角色 role key 列表,不传则创建全部")
|
|||
|
|
|
|||
|
|
|
|||
|
|
@router.get("")
|
|||
|
|
def list_presets(
|
|||
|
|
_current_user: User = Depends(get_current_user),
|
|||
|
|
):
|
|||
|
|
"""获取所有可用行业预设包列表(含角色预览,不含完整 prompt)。"""
|
|||
|
|
presets = list_company_presets()
|
|||
|
|
return {"presets": presets, "total": len(presets)}
|
|||
|
|
|
|||
|
|
|
|||
|
|
@router.get("/{preset_type}")
|
|||
|
|
def get_preset(
|
|||
|
|
preset_type: str,
|
|||
|
|
_current_user: User = Depends(get_current_user),
|
|||
|
|
):
|
|||
|
|
"""获取单个行业预设包的详细信息(含全部角色配置)。"""
|
|||
|
|
preset = get_company_preset(preset_type)
|
|||
|
|
if not preset:
|
|||
|
|
raise HTTPException(status_code=404, detail=f"预设包 '{preset_type}' 不存在")
|
|||
|
|
return preset
|
|||
|
|
|
|||
|
|
|
|||
|
|
@router.post("/{preset_type}", status_code=201)
|
|||
|
|
def create_preset(
|
|||
|
|
preset_type: str,
|
|||
|
|
body: CreateCompanyPresetRequest = CreateCompanyPresetRequest(),
|
|||
|
|
db: Session = Depends(get_db),
|
|||
|
|
current_user: User = Depends(get_current_user),
|
|||
|
|
):
|
|||
|
|
"""一键创建全套公司 AI 数字员工。
|
|||
|
|
|
|||
|
|
支持通过 `selected_roles` 字段筛选要创建的角色,不传则创建预设包的全部角色。
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
result = create_company_preset(
|
|||
|
|
db=db,
|
|||
|
|
preset_type=preset_type,
|
|||
|
|
user_id=current_user.id,
|
|||
|
|
workspace_id=body.workspace_id,
|
|||
|
|
selected_roles=body.selected_roles,
|
|||
|
|
)
|
|||
|
|
except ValueError as e:
|
|||
|
|
raise HTTPException(status_code=400, detail=str(e))
|
|||
|
|
|
|||
|
|
logger.info(
|
|||
|
|
"用户 %s 创建公司预设包 %s: 新建=%d 复用=%d",
|
|||
|
|
current_user.id, preset_type, result["created"], result["reused"],
|
|||
|
|
)
|
|||
|
|
return result
|