router.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. from __future__ import annotations
  2. from gateway.core.channels.manager import TraceBackend
  3. class ChannelTraceRouter:
  4. """
  5. 与具体 IM 无关:按渠道 user_id 解析 workspace_id,并委托 TraceBackend 获取/创建 trace。
  6. 飞书等渠道的入站消息路由见 ``gateway.core.channels.feishu.router.FeishuMessageRouter``。
  7. """
  8. def __init__(
  9. self,
  10. *,
  11. trace_backend: TraceBackend,
  12. workspace_prefix: str,
  13. default_agent_type: str = "personal_assistant",
  14. ) -> None:
  15. self._trace = trace_backend
  16. self._workspace_prefix = workspace_prefix
  17. self._agent_type = default_agent_type
  18. def _workspace_id_for_user(self, user_id: str) -> str:
  19. return f"{self._workspace_prefix}:{user_id}"
  20. async def get_trace_id(self, channel: str, user_id: str, *, create_if_missing: bool = True) -> str:
  21. """获取或创建 Trace ID(对应 channels.md get_trace_id / create_trace_for_user 语义)。"""
  22. if not create_if_missing:
  23. raise NotImplementedError("仅内存后端支持 create_if_missing=False 时需扩展 TraceBackend")
  24. return await self._trace.get_or_create_trace(
  25. channel=channel,
  26. user_id=user_id,
  27. workspace_id=self._workspace_id_for_user(user_id),
  28. agent_type=self._agent_type,
  29. metadata={"source": "channels.channel_trace_router"},
  30. )
  31. async def create_trace_for_user(self, channel: str, user_id: str) -> str:
  32. return await self.get_trace_id(channel, user_id, create_if_missing=True)