File size: 1,570 Bytes
7f9dfed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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()