"""CascadeDetector - 独立的级联故障检测工具(委托给 CascadeStateStore)""" from __future__ import annotations from dataclasses import dataclass from agentkit.quality.cascade_state_store import ( CascadeStateStore, InMemoryCascadeStateStore, ) @dataclass class CascadeAlert: """级联故障告警""" session_id: str alert_type: str # "interaction_limit" or "loop_depth" current_value: int threshold: int message: str class CascadeDetector: """检测多 agent 交互中的级联故障""" def __init__( self, max_interactions: int = 10, max_depth: int = 3, store: CascadeStateStore | None = None, ): self._max_interactions = max_interactions self._max_depth = max_depth self._store: CascadeStateStore = store or InMemoryCascadeStateStore() def check_interaction(self, session_id: str) -> CascadeAlert | None: """递增并检查交互计数""" count = self._store.increment_interaction(session_id) if count > self._max_interactions: return CascadeAlert( session_id=session_id, alert_type="interaction_limit", current_value=count, threshold=self._max_interactions, message=( f"Session {session_id} exceeded max interactions: " f"{count} > {self._max_interactions}" ), ) return None def check_depth(self, session_id: str, depth: int) -> CascadeAlert | None: """检查循环深度""" self._store.set_depth(session_id, depth) if depth > self._max_depth: return CascadeAlert( session_id=session_id, alert_type="loop_depth", current_value=depth, threshold=self._max_depth, message=( f"Session {session_id} exceeded max loop depth: " f"{depth} > {self._max_depth}" ), ) return None def reset(self, session_id: str) -> None: """重置某个 session 的计数器""" self._store.reset(session_id) def get_stats(self, session_id: str) -> dict[str, int]: """获取某个 session 的当前统计""" return { "interactions": self._store.get_interaction(session_id), "depth": self._store.get_depth(session_id), }