Spaces:
Running on Zero
Running on Zero
| from __future__ import annotations | |
| import logging | |
| from dataclasses import asdict | |
| from core.events import Event, EventBus, EventType | |
| from tracking.trackio_client import TrackingClient | |
| class AppState: | |
| """Shared in-process state for UI events and lightweight traces.""" | |
| def __init__( | |
| self, | |
| event_bus: EventBus | None = None, | |
| tracking_client: TrackingClient | None = None, | |
| ) -> None: | |
| self.event_bus = event_bus or EventBus() | |
| self.events: list[Event] = [] | |
| self.logger = logging.getLogger("openbmb_workbench") | |
| self.tracking_client = tracking_client or TrackingClient() | |
| self.tracking_client.init() | |
| def emit(self, event: Event) -> None: | |
| self.events.append(event) | |
| self.logger.info("event=%s payload=%s", event.type.value, event.payload) | |
| self.tracking_client.log(event.type.value, event.payload) | |
| self.event_bus.emit(event) | |
| def recent_events(self, limit: int = 20) -> list[dict]: | |
| recent = self.events[-limit:] | |
| return [asdict(event) for event in recent] | |
| def emit_inference_response( | |
| mode: str, | |
| model_id: str, | |
| backend: str, | |
| response: str, | |
| state: AppState | None = None, | |
| ) -> None: | |
| target_state = state or APP_STATE | |
| target_state.emit( | |
| Event( | |
| EventType.INFERENCE_RESPONSE, | |
| { | |
| "mode": mode, | |
| "model_id": model_id, | |
| "backend": backend, | |
| "response_chars": len(response), | |
| }, | |
| ) | |
| ) | |
| APP_STATE = AppState() | |