manager.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from __future__ import annotations
  2. from typing import Protocol, runtime_checkable
  3. @runtime_checkable
  4. class TraceBackend(Protocol):
  5. """与 Lifecycle.TraceManager 对接前的抽象:按渠道用户解析 trace_id。"""
  6. async def get_or_create_trace(
  7. self,
  8. *,
  9. channel: str,
  10. user_id: str,
  11. workspace_id: str,
  12. agent_type: str,
  13. metadata: dict[str, object],
  14. ) -> str:
  15. ...
  16. @runtime_checkable
  17. class ChannelRegistration(Protocol):
  18. """注册到 ``ChannelRegistry`` 的渠道配置需至少提供 ``enabled``。"""
  19. enabled: bool
  20. class ChannelRegistry:
  21. """
  22. 与具体 IM 无关:渠道注册、启停、状态查询。
  23. """
  24. def __init__(self) -> None:
  25. self._registry: dict[str, ChannelRegistration] = {}
  26. self._running: dict[str, bool] = {}
  27. def register_channel(self, channel_id: str, cfg: ChannelRegistration) -> None:
  28. self._registry[channel_id] = cfg
  29. if channel_id not in self._running:
  30. self._running[channel_id] = cfg.enabled
  31. def start_channel(self, channel_id: str) -> None:
  32. self._running[channel_id] = True
  33. def stop_channel(self, channel_id: str) -> None:
  34. self._running[channel_id] = False
  35. def get_channel_status(self, channel_id: str) -> dict[str, str | bool]:
  36. cfg = self._registry.get(channel_id)
  37. return {
  38. "channel_id": channel_id,
  39. "registered": cfg is not None,
  40. "running": bool(self._running.get(channel_id)),
  41. "enabled": bool(cfg and cfg.enabled),
  42. }