file_conversation_store.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. from __future__ import annotations
  2. import json
  3. from dataclasses import dataclass
  4. from openhands.core.config.app_config import AppConfig
  5. from openhands.storage import get_file_store
  6. from openhands.storage.conversation.conversation_store import ConversationStore
  7. from openhands.server.data_models.conversation_metadata import ConversationMetadata
  8. from openhands.storage.files import FileStore
  9. from openhands.storage.locations import get_conversation_metadata_filename
  10. from openhands.utils.async_utils import call_sync_from_async
  11. @dataclass
  12. class FileConversationStore(ConversationStore):
  13. file_store: FileStore
  14. async def save_metadata(self, metadata: ConversationMetadata):
  15. json_str = json.dumps(metadata.__dict__)
  16. path = get_conversation_metadata_filename(metadata.conversation_id)
  17. await call_sync_from_async(self.file_store.write, path, json_str)
  18. async def get_metadata(self, conversation_id: str) -> ConversationMetadata:
  19. path = get_conversation_metadata_filename(conversation_id)
  20. json_str = await call_sync_from_async(self.file_store.read, path)
  21. return ConversationMetadata(**json.loads(json_str))
  22. async def exists(self, conversation_id: str) -> bool:
  23. path = get_conversation_metadata_filename(conversation_id)
  24. try:
  25. await call_sync_from_async(self.file_store.read, path)
  26. return True
  27. except FileNotFoundError:
  28. return False
  29. @classmethod
  30. async def get_instance(cls, config: AppConfig, token: str | None):
  31. file_store = get_file_store(config.file_store, config.file_store_path)
  32. return FileConversationStore(file_store)