""" 公司组织班底预设包 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