debug_mixin.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from openhands.core.logger import llm_prompt_logger, llm_response_logger
  2. from openhands.core.logger import openhands_logger as logger
  3. MESSAGE_SEPARATOR = '\n\n----------\n\n'
  4. class DebugMixin:
  5. def log_prompt(self, messages):
  6. if not messages:
  7. logger.debug('No completion messages!')
  8. return
  9. messages = messages if isinstance(messages, list) else [messages]
  10. debug_message = MESSAGE_SEPARATOR.join(
  11. self._format_message_content(msg) for msg in messages if msg['content']
  12. )
  13. if debug_message:
  14. llm_prompt_logger.debug(debug_message)
  15. else:
  16. logger.debug('No completion messages!')
  17. def log_response(self, message_back):
  18. if message_back:
  19. llm_response_logger.debug(message_back)
  20. def _format_message_content(self, message):
  21. content = message['content']
  22. if isinstance(content, list):
  23. return '\n'.join(
  24. self._format_content_element(element) for element in content
  25. )
  26. return str(content)
  27. def _format_content_element(self, element):
  28. if isinstance(element, dict):
  29. if 'text' in element:
  30. return element['text']
  31. if (
  32. self.vision_is_active()
  33. and 'image_url' in element
  34. and 'url' in element['image_url']
  35. ):
  36. return element['image_url']['url']
  37. return str(element)
  38. def _log_stats(self, stats):
  39. if stats:
  40. logger.info(stats)
  41. # This method should be implemented in the class that uses DebugMixin
  42. def vision_is_active(self):
  43. raise NotImplementedError