evaluations.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. from typing import Optional
  2. from fastapi import APIRouter, Depends, HTTPException, status, Request
  3. from pydantic import BaseModel
  4. from open_webui.apps.webui.models.users import Users, UserModel
  5. from open_webui.apps.webui.models.feedbacks import (
  6. FeedbackModel,
  7. FeedbackForm,
  8. Feedbacks,
  9. )
  10. from open_webui.constants import ERROR_MESSAGES
  11. from open_webui.utils.utils import get_admin_user, get_verified_user
  12. router = APIRouter()
  13. ############################
  14. # GetConfig
  15. ############################
  16. @router.get("/config")
  17. async def get_config(request: Request, user=Depends(get_admin_user)):
  18. return {
  19. "ENABLE_EVALUATION_ARENA_MODELS": request.app.state.config.ENABLE_EVALUATION_ARENA_MODELS,
  20. "EVALUATION_ARENA_MODELS": request.app.state.config.EVALUATION_ARENA_MODELS,
  21. }
  22. ############################
  23. # UpdateConfig
  24. ############################
  25. class UpdateConfigForm(BaseModel):
  26. ENABLE_EVALUATION_ARENA_MODELS: Optional[bool] = None
  27. EVALUATION_ARENA_MODELS: Optional[list[dict]] = None
  28. @router.post("/config")
  29. async def update_config(
  30. request: Request,
  31. form_data: UpdateConfigForm,
  32. user=Depends(get_admin_user),
  33. ):
  34. config = request.app.state.config
  35. if form_data.ENABLE_EVALUATION_ARENA_MODELS is not None:
  36. config.ENABLE_EVALUATION_ARENA_MODELS = form_data.ENABLE_EVALUATION_ARENA_MODELS
  37. if form_data.EVALUATION_ARENA_MODELS is not None:
  38. config.EVALUATION_ARENA_MODELS = form_data.EVALUATION_ARENA_MODELS
  39. return {
  40. "ENABLE_EVALUATION_ARENA_MODELS": config.ENABLE_EVALUATION_ARENA_MODELS,
  41. "EVALUATION_ARENA_MODELS": config.EVALUATION_ARENA_MODELS,
  42. }
  43. @router.get("/feedbacks", response_model=list[FeedbackModel])
  44. async def get_feedbacks(user=Depends(get_verified_user)):
  45. feedbacks = Feedbacks.get_feedbacks_by_user_id(user.id)
  46. return feedbacks
  47. @router.delete("/feedbacks", response_model=bool)
  48. async def delete_feedbacks(user=Depends(get_verified_user)):
  49. success = Feedbacks.delete_feedbacks_by_user_id(user.id)
  50. return success
  51. class FeedbackUserModel(FeedbackModel):
  52. user: Optional[UserModel] = None
  53. @router.get("/feedbacks/all", response_model=list[FeedbackUserModel])
  54. async def get_all_feedbacks(user=Depends(get_admin_user)):
  55. feedbacks = Feedbacks.get_all_feedbacks()
  56. return [
  57. FeedbackUserModel(
  58. **feedback.model_dump(), user=Users.get_user_by_id(feedback.user_id)
  59. )
  60. for feedback in feedbacks
  61. ]
  62. @router.delete("/feedbacks/all")
  63. async def delete_all_feedbacks(user=Depends(get_admin_user)):
  64. success = Feedbacks.delete_all_feedbacks()
  65. return success
  66. @router.post("/feedback", response_model=FeedbackModel)
  67. async def create_feedback(
  68. request: Request,
  69. form_data: FeedbackForm,
  70. user=Depends(get_verified_user),
  71. ):
  72. feedback = Feedbacks.insert_new_feedback(user_id=user.id, form_data=form_data)
  73. if not feedback:
  74. raise HTTPException(
  75. status_code=status.HTTP_400_BAD_REQUEST,
  76. detail=ERROR_MESSAGES.DEFAULT(),
  77. )
  78. return feedback
  79. @router.get("/feedback/{id}", response_model=FeedbackModel)
  80. async def get_feedback_by_id(id: str, user=Depends(get_verified_user)):
  81. feedback = Feedbacks.get_feedback_by_id_and_user_id(id=id, user_id=user.id)
  82. if not feedback:
  83. raise HTTPException(
  84. status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
  85. )
  86. return feedback
  87. @router.post("/feedback/{id}", response_model=FeedbackModel)
  88. async def update_feedback_by_id(
  89. id: str, form_data: FeedbackForm, user=Depends(get_verified_user)
  90. ):
  91. feedback = Feedbacks.update_feedback_by_id_and_user_id(
  92. id=id, user_id=user.id, form_data=form_data
  93. )
  94. if not feedback:
  95. raise HTTPException(
  96. status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
  97. )
  98. return feedback
  99. @router.delete("/feedback/{id}")
  100. async def delete_feedback_by_id(id: str, user=Depends(get_verified_user)):
  101. if user.role == "admin":
  102. success = Feedbacks.delete_feedback_by_id(id=id)
  103. else:
  104. success = Feedbacks.delete_feedback_by_id_and_user_id(id=id, user_id=user.id)
  105. if not success:
  106. raise HTTPException(
  107. status_code=status.HTTP_404_NOT_FOUND, detail=ERROR_MESSAGES.NOT_FOUND
  108. )
  109. return success