ForcePilot/backend/package/yuxi/channel/routing/models.py
Kris 231166cde8 feat(channel/routing): 新增消息路由相关模块
实现了完整的消息路由匹配系统,包含数据模型、会话密钥生成和路由匹配逻辑,提供了从消息上下文到代理配置的路由能力
2026-05-21 10:32:25 +08:00

86 lines
1.7 KiB
Python

from dataclasses import dataclass, field
from enum import StrEnum
from types import MappingProxyType
class PeerKind(StrEnum):
DIRECT = "direct"
GROUP = "group"
CHANNEL = "channel"
_PEER_KIND_ALIASES: MappingProxyType[str, set[str]] = MappingProxyType({
"direct": {"direct", "dm"},
"group": {"group", "channel"},
"channel": {"channel", "group"},
})
@dataclass
class PeerConstraint:
kind: PeerKind
peer_id: str | None = None
class PeerConstraintState(StrEnum):
VALID = "valid"
WILDCARD = "wildcard"
NONE = "none"
INVALID = "invalid"
@dataclass
class NormalizedPeer:
kind: PeerKind
kind_lookup: set[str]
peer_id: str
@dataclass
class BindingMatch:
channel: str
channel_config_id: str | None = None
account_id: str | None = None
peer: PeerConstraint | None = None
guild_id: str | None = None
team_id: str | None = None
roles: list[str] = field(default_factory=list)
@dataclass
class RouteBinding:
agent_config_id: int
match: BindingMatch
dm_scope: str = "per-channel-peer"
priority: int = 0
session_dm_scope: str | None = None
@dataclass
class RouteResult:
agent_config_id: int
channel: str
account_id: str
session_key: str
main_session_key: str
matched_by: str
matched_priority: int
dm_scope: str = "per-channel-peer"
last_route_policy: str = "session"
@dataclass
class EvaluatedBinding:
agent_config_id: int
dm_scope: str
session_dm_scope: str | None
normalized_peer: NormalizedPeer | None
peer_state: PeerConstraintState
guild_id: str | None
roles: list[str]
team_id: str | None
account_id: str | None
channel: str
channel_config_id: str | None = None
priority: int = 0