Spaces:
Build error
Build error
| from dataclasses import dataclass | |
| from typing import Iterable | |
| from urllib.parse import urlencode | |
| import httpx # type: ignore | |
| from fastapi import status | |
| from openhands.events.event import Event | |
| from openhands.events.event_filter import EventFilter | |
| from openhands.events.event_store_abc import EventStoreABC | |
| from openhands.events.serialization.event import event_from_dict | |
| class NestedEventStore(EventStoreABC): | |
| """ | |
| A stored list of events backing a conversation | |
| """ | |
| base_url: str | |
| sid: str | |
| user_id: str | None | |
| session_api_key: str | None = None | |
| def search_events( | |
| self, | |
| start_id: int = 0, | |
| end_id: int | None = None, | |
| reverse: bool = False, | |
| filter: EventFilter | None = None, | |
| limit: int | None = None, | |
| ) -> Iterable[Event]: | |
| while True: | |
| search_params = { | |
| 'start_id': start_id, | |
| 'reverse': reverse, | |
| } | |
| if limit is not None: | |
| search_params['limit'] = min(100, limit) | |
| search_str = urlencode(search_params) | |
| url = f'{self.base_url}/events?{search_str}' | |
| headers = {} | |
| if self.session_api_key: | |
| headers['X-Session-API-Key'] = self.session_api_key | |
| response = httpx.get(url, headers=headers) | |
| if response.status_code == status.HTTP_404_NOT_FOUND: | |
| # Follow pattern of event store not throwing errors on not found | |
| return | |
| result_set = response.json() | |
| for result in result_set['events']: | |
| event = event_from_dict(result) | |
| start_id = max(start_id, event.id + 1) | |
| if end_id == event.id: | |
| if not filter or filter.include(event): | |
| yield event | |
| return | |
| if filter and filter.exclude(event): | |
| continue | |
| yield event | |
| if limit is not None: | |
| limit -= 1 | |
| if limit <= 0: | |
| return | |
| if not result_set['has_more']: | |
| return | |
| def get_event(self, id: int) -> Event: | |
| events = list(self.search_events(start_id=id, limit=1)) | |
| if not events: | |
| raise FileNotFoundError('no_event') | |
| return events[0] | |
| def get_latest_event(self) -> Event: | |
| events = list(self.search_events(reverse=True, limit=1)) | |
| if not events: | |
| raise FileNotFoundError('no_event') | |
| return events[0] | |
| def get_latest_event_id(self) -> int: | |
| event = self.get_latest_event() | |
| return event.id | |