Spaces:
Build error
Build error
| from __future__ import annotations | |
| from abc import ABC, abstractmethod | |
| from typing import Iterable | |
| from openhands.core.config.openhands_config import OpenHandsConfig | |
| from openhands.storage.data_models.conversation_metadata import ConversationMetadata | |
| from openhands.storage.data_models.conversation_metadata_result_set import ( | |
| ConversationMetadataResultSet, | |
| ) | |
| from openhands.utils.async_utils import wait_all | |
| class ConversationStore(ABC): | |
| """Abstract base class for conversation metadata storage. | |
| This is an extension point in OpenHands that allows applications to customize how | |
| conversation metadata is stored. Applications can substitute their own implementation by: | |
| 1. Creating a class that inherits from ConversationStore | |
| 2. Implementing all required methods | |
| 3. Setting server_config.conversation_store_class to the fully qualified name of the class | |
| The class is instantiated via get_impl() in openhands.server.shared.py. | |
| The implementation may or may not support multiple users depending on the environment. | |
| """ | |
| async def save_metadata(self, metadata: ConversationMetadata) -> None: | |
| """Store conversation metadata.""" | |
| async def get_metadata(self, conversation_id: str) -> ConversationMetadata: | |
| """Load conversation metadata.""" | |
| async def validate_metadata(self, conversation_id: str, user_id: str) -> bool: | |
| """Validate that conversation belongs to the current user.""" | |
| metadata = await self.get_metadata(conversation_id) | |
| if not metadata.user_id or metadata.user_id != user_id: | |
| return False | |
| else: | |
| return True | |
| async def delete_metadata(self, conversation_id: str) -> None: | |
| """Delete conversation metadata.""" | |
| async def exists(self, conversation_id: str) -> bool: | |
| """Check if conversation exists.""" | |
| async def search( | |
| self, | |
| page_id: str | None = None, | |
| limit: int = 20, | |
| ) -> ConversationMetadataResultSet: | |
| """Search conversations.""" | |
| async def get_all_metadata( | |
| self, conversation_ids: Iterable[str] | |
| ) -> list[ConversationMetadata]: | |
| """Get metadata for multiple conversations in parallel.""" | |
| return await wait_all([self.get_metadata(cid) for cid in conversation_ids]) | |
| async def get_instance( | |
| cls, config: OpenHandsConfig, user_id: str | None | |
| ) -> ConversationStore: | |
| """Get a store for the user represented by the token given.""" | |