feedback.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from fastapi import APIRouter, Request
  2. from fastapi.responses import JSONResponse
  3. from openhands.core.logger import openhands_logger as logger
  4. from openhands.events.serialization import event_to_dict
  5. from openhands.events.stream import AsyncEventStreamWrapper
  6. from openhands.server.data_models.feedback import FeedbackDataModel, store_feedback
  7. from openhands.server.shared import config
  8. from openhands.utils.async_utils import call_sync_from_async
  9. app = APIRouter(prefix='/api')
  10. @app.post('/submit-feedback')
  11. async def submit_feedback(request: Request):
  12. """Submit user feedback.
  13. This function stores the provided feedback data.
  14. To submit feedback:
  15. ```sh
  16. curl -X POST -d '{"email": "test@example.com"}' -H "Authorization:"
  17. ```
  18. Args:
  19. request (Request): The incoming request object.
  20. feedback (FeedbackDataModel): The feedback data to be stored.
  21. Returns:
  22. dict: The stored feedback data.
  23. Raises:
  24. HTTPException: If there's an error submitting the feedback.
  25. """
  26. # Assuming the storage service is already configured in the backend
  27. # and there is a function to handle the storage.
  28. body = await request.json()
  29. async_stream = AsyncEventStreamWrapper(
  30. request.state.conversation.event_stream, filter_hidden=True
  31. )
  32. trajectory = []
  33. async for event in async_stream:
  34. trajectory.append(event_to_dict(event))
  35. feedback = FeedbackDataModel(
  36. email=body.get('email', ''),
  37. version=body.get('version', ''),
  38. permissions=body.get('permissions', 'private'),
  39. polarity=body.get('polarity', ''),
  40. feedback=body.get('polarity', ''),
  41. trajectory=trajectory,
  42. )
  43. try:
  44. feedback_data = await call_sync_from_async(store_feedback, feedback)
  45. return JSONResponse(status_code=200, content=feedback_data)
  46. except Exception as e:
  47. logger.error(f'Error submitting feedback: {e}')
  48. return JSONResponse(
  49. status_code=500, content={'error': 'Failed to submit feedback'}
  50. )
  51. @app.get('/api/defaults')
  52. async def appconfig_defaults():
  53. """Retrieve the default configuration settings.
  54. To get the default configurations:
  55. ```sh
  56. curl http://localhost:3000/api/defaults
  57. ```
  58. Returns:
  59. dict: The default configuration settings.
  60. """
  61. return config.defaults_dict