evaluations.py 5.1 KB

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