from fastapi import APIRouter, HTTPException, status, Depends from pydantic import BaseModel from typing import Optional, Annotated from datetime import datetime from ..db.ai_config import ( get_config_by_app_name, create_config, update_config, delete_config, get_all_configs ) from ..dependencies.auth import resolve_user_id router = APIRouter() class AIConfigCreate(BaseModel): appName: str knowledgeId: str apiKey: str baseUrl: str class AIConfigUpdate(BaseModel): knowledgeId: Optional[str] = None apiKey: Optional[str] = None baseUrl: Optional[str] = None status: Optional[int] = None class AIConfigResponse(BaseModel): id: str appName: str knowledgeId: str apiKey: str baseUrl: str status: int deleted: int createdAt: datetime updatedAt: datetime @router.post("/", response_model=dict, summary="创建AI配置", description="创建新的AI应用配置映射") async def create_ai_config( config: AIConfigCreate ) -> dict: """创建新的AI配置""" existing = get_config_by_app_name(config.appName) if existing: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=f"appName '{config.appName}' 已存在" ) config_id = create_config(config.model_dump()) if not config_id: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="创建配置失败" ) return { "message": "配置创建成功", "id": config_id, "appName": config.appName } @router.get("/{app_name}", response_model=dict, summary="获取AI配置", description="根据appName获取AI配置") async def get_ai_config( app_name: str ) -> dict: """获取指定appName的配置""" config = get_config_by_app_name(app_name) if not config: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"appName '{app_name}' 的配置不存在" ) return config @router.put("/{app_name}", response_model=dict, summary="更新AI配置", description="更新指定appName的AI配置") async def update_ai_config( app_name: str, config_update: AIConfigUpdate ) -> dict: """更新指定appName的配置""" existing = get_config_by_app_name(app_name) if not existing: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"appName '{app_name}' 的配置不存在" ) update_data = {k: v for k, v in config_update.model_dump().items() if v is not None} if not update_data: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="没有要更新的字段" ) matched = update_config(app_name, update_data) if matched == 0: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="更新配置失败" ) return { "message": "配置更新成功", "appName": app_name } @router.delete("/{app_name}", response_model=dict, summary="删除AI配置", description="删除指定appName的AI配置") async def delete_ai_config( app_name: str ) -> dict: """删除指定appName的配置""" existing = get_config_by_app_name(app_name) if not existing: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"appName '{app_name}' 的配置不存在" ) matched = delete_config(app_name) if matched == 0: raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="删除配置失败" ) return { "message": "配置删除成功", "appName": app_name } @router.get("/", response_model=dict, summary="获取所有AI配置", description="获取所有启用的AI配置") async def list_ai_configs( ) -> dict: """获取所有启用的配置""" configs = get_all_configs() return { "total": len(configs), "configs": configs }