admin_local_model_router.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. """
  2. 管理员本地模型管理API路由
  3. """
  4. from typing import Optional
  5. from fastapi import APIRouter, Depends, HTTPException, status, Query, Request
  6. from sqlalchemy.orm import Session
  7. from sqlalchemy import or_, desc
  8. from app.database import get_db
  9. from app.models.model import ModelNew
  10. from app.models.user import User
  11. from app.schemas.admin_schema import LocalModelListItem, LocalModelVisibilityRequest
  12. from app.schemas.model_schema import PaginatedResponse
  13. from app.services.operation_log_service import OperationLogService
  14. from app.dependencies.admin_auth import get_current_admin
  15. from app.models.admin import AdminUser
  16. router = APIRouter(prefix="/api/admin/local-models", tags=["本地模型管理"])
  17. @router.get("", response_model=PaginatedResponse)
  18. def list_local_models(
  19. keyword: Optional[str] = Query(None),
  20. user_id: Optional[str] = Query(None),
  21. visibility: Optional[str] = Query(None),
  22. page: int = Query(1, ge=1),
  23. size: int = Query(20, ge=1, le=100),
  24. current_admin: AdminUser = Depends(get_current_admin),
  25. db: Session = Depends(get_db),
  26. ):
  27. query = db.query(ModelNew).filter(ModelNew.is_local == True)
  28. mapped_user_id = None
  29. try:
  30. if getattr(current_admin, "username", None):
  31. mapped_user = db.query(User).filter(User.username == current_admin.username).first()
  32. if mapped_user:
  33. mapped_user_id = mapped_user.id
  34. except Exception:
  35. pass
  36. if keyword:
  37. kw = f"%{keyword}%"
  38. query = query.filter(
  39. or_(ModelNew.model_code.ilike(kw), ModelNew.display_name.ilike(kw))
  40. )
  41. if visibility:
  42. if visibility == "user" and not user_id:
  43. uid = mapped_user_id or str(getattr(current_admin, "id", ""))
  44. query = query.filter(ModelNew.visibility == "user", ModelNew.user_id == uid)
  45. else:
  46. query = query.filter(ModelNew.visibility == visibility)
  47. if user_id:
  48. query = query.filter(ModelNew.user_id == user_id)
  49. total = query.count()
  50. models = query.order_by(desc(ModelNew.created_at)).offset((page - 1) * size).limit(size).all()
  51. user_ids = list(set(m.user_id for m in models if m.user_id))
  52. users = db.query(User).filter(User.id.in_(user_ids)).all() if user_ids else []
  53. user_map = {u.id: u.username or u.nickname for u in users}
  54. result = [
  55. LocalModelListItem(
  56. id=m.id,
  57. title=m.model_code,
  58. name=m.display_name or m.model_code,
  59. supplier=m.supplier or "Custom",
  60. user_id=m.user_id or "",
  61. username=user_map.get(m.user_id, ""),
  62. base_url=(m.base_url[:30] + "...") if m.base_url and len(m.base_url) > 30 else (m.base_url or ""),
  63. visibility=m.visibility or "user",
  64. category=m.category or 0,
  65. created_at=m.created_at,
  66. updated_at=m.updated_at,
  67. )
  68. for m in models
  69. ]
  70. return PaginatedResponse(items=[r.model_dump() for r in result], total=total, page=page, page_size=size)
  71. @router.put("/{model_id}/visibility")
  72. def update_local_model_visibility(
  73. model_id: int,
  74. data: LocalModelVisibilityRequest,
  75. request: Request,
  76. current_admin: AdminUser = Depends(get_current_admin),
  77. db: Session = Depends(get_db),
  78. ):
  79. model = db.query(ModelNew).filter(ModelNew.id == model_id, ModelNew.is_local == True).first()
  80. if not model:
  81. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="本地模型不存在")
  82. old_visibility = model.visibility
  83. model.visibility = data.visibility
  84. db.commit()
  85. OperationLogService(db).create_log(
  86. admin_id=current_admin.id,
  87. operation_type="update",
  88. module="local_model",
  89. target_id=str(model_id),
  90. detail={"action": "update_visibility", "old": old_visibility, "new": data.visibility},
  91. ip_address=request.client.host if request.client else None,
  92. )
  93. return {"message": "可见性更新成功", "model_id": model_id, "visibility": data.visibility}
  94. @router.delete("/{model_id}")
  95. def delete_local_model(
  96. model_id: int,
  97. request: Request,
  98. current_admin: AdminUser = Depends(get_current_admin),
  99. db: Session = Depends(get_db),
  100. ):
  101. model = db.query(ModelNew).filter(ModelNew.id == model_id, ModelNew.is_local == True).first()
  102. if not model:
  103. raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="本地模型不存在")
  104. model_code = model.model_code
  105. db.delete(model)
  106. db.commit()
  107. OperationLogService(db).create_log(
  108. admin_id=current_admin.id,
  109. operation_type="delete",
  110. module="local_model",
  111. target_id=str(model_id),
  112. detail={"model_code": model_code},
  113. ip_address=request.client.host if request.client else None,
  114. )
  115. return {"message": "本地模型已删除", "model_id": model_id}