protocols.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. """
  2. Trace Storage Protocol - Trace 存储接口定义
  3. 使用 Protocol 定义接口,允许不同的存储实现(内存、PostgreSQL、Neo4j 等)
  4. """
  5. from typing import Protocol, List, Optional, Dict, Any, runtime_checkable
  6. from .models import Trace, Message
  7. from .goal_models import GoalTree, Goal
  8. @runtime_checkable
  9. class TraceStore(Protocol):
  10. """Trace + Message + GoalTree 存储接口"""
  11. # ===== Trace 操作 =====
  12. async def create_trace(self, trace: Trace) -> str:
  13. """
  14. 创建新的 Trace
  15. Args:
  16. trace: Trace 对象
  17. Returns:
  18. trace_id
  19. """
  20. ...
  21. async def get_trace(self, trace_id: str) -> Optional[Trace]:
  22. """获取 Trace"""
  23. ...
  24. async def update_trace(self, trace_id: str, **updates) -> None:
  25. """
  26. 更新 Trace
  27. Args:
  28. trace_id: Trace ID
  29. **updates: 要更新的字段
  30. """
  31. ...
  32. async def list_traces(
  33. self,
  34. mode: Optional[str] = None,
  35. agent_type: Optional[str] = None,
  36. uid: Optional[str] = None,
  37. status: Optional[str] = None,
  38. limit: int = 50,
  39. parent_trace_id: Optional[str] = None,
  40. created_by_tool: Optional[str] = None,
  41. ) -> List[Trace]:
  42. """列出 Traces"""
  43. ...
  44. # ===== Recursive 树级资源用量 =====
  45. async def get_resource_usage(
  46. self,
  47. root_trace_id: str,
  48. ) -> Optional[Dict[str, Any]]:
  49. """读取 Recursive 根 Trace 的树级累计用量。"""
  50. ...
  51. async def replace_resource_usage(
  52. self,
  53. root_trace_id: str,
  54. usage: Dict[str, Any],
  55. ) -> None:
  56. """原子替换 Recursive 根 Trace 的树级累计用量。"""
  57. ...
  58. # ===== GoalTree 操作 =====
  59. async def get_goal_tree(self, trace_id: str) -> Optional[GoalTree]:
  60. """
  61. 获取 GoalTree
  62. Args:
  63. trace_id: Trace ID
  64. Returns:
  65. GoalTree 对象,如果不存在返回 None
  66. """
  67. ...
  68. async def update_goal_tree(self, trace_id: str, tree: GoalTree) -> None:
  69. """
  70. 更新完整 GoalTree
  71. Args:
  72. trace_id: Trace ID
  73. tree: GoalTree 对象
  74. """
  75. ...
  76. async def add_goal(self, trace_id: str, goal: Goal) -> None:
  77. """
  78. 添加 Goal 到 GoalTree
  79. Args:
  80. trace_id: Trace ID
  81. goal: Goal 对象
  82. """
  83. ...
  84. async def update_goal(self, trace_id: str, goal_id: str, **updates) -> None:
  85. """
  86. 更新 Goal 字段
  87. Args:
  88. trace_id: Trace ID
  89. goal_id: Goal ID
  90. **updates: 要更新的字段(如 status, summary, self_stats, cumulative_stats)
  91. """
  92. ...
  93. # ===== Message 操作 =====
  94. async def add_message(self, message: Message) -> str:
  95. """
  96. 添加 Message
  97. 自动更新关联 Goal 的 stats(self_stats 和祖先的 cumulative_stats)
  98. Args:
  99. message: Message 对象
  100. Returns:
  101. message_id
  102. """
  103. ...
  104. async def get_message(self, message_id: str) -> Optional[Message]:
  105. """获取 Message"""
  106. ...
  107. async def get_trace_messages(
  108. self,
  109. trace_id: str,
  110. ) -> List[Message]:
  111. """
  112. 获取 Trace 的所有 Messages(按 sequence 排序)
  113. 返回该 Trace 下所有消息(包含所有分支)。
  114. 如需获取特定主路径的消息,使用 get_main_path_messages()。
  115. Args:
  116. trace_id: Trace ID
  117. Returns:
  118. Message 列表
  119. """
  120. ...
  121. async def get_main_path_messages(
  122. self,
  123. trace_id: str,
  124. head_sequence: int
  125. ) -> List[Message]:
  126. """
  127. 获取主路径上的消息(从 head_sequence 沿 parent_sequence 链回溯到 root)
  128. Args:
  129. trace_id: Trace ID
  130. head_sequence: 主路径头节点的 sequence
  131. Returns:
  132. 按 sequence 正序排列的主路径 Message 列表
  133. """
  134. ...
  135. async def get_messages_by_goal(
  136. self,
  137. trace_id: str,
  138. goal_id: str
  139. ) -> List[Message]:
  140. """
  141. 获取指定 Goal 关联的所有 Messages
  142. Args:
  143. trace_id: Trace ID
  144. goal_id: Goal ID
  145. Returns:
  146. Message 列表
  147. """
  148. ...
  149. async def update_message(self, message_id: str, **updates) -> None:
  150. """
  151. 更新 Message 字段(用于状态变更、错误记录等)
  152. Args:
  153. message_id: Message ID
  154. **updates: 要更新的字段
  155. """
  156. ...
  157. async def abandon_messages_after(self, trace_id: str, cutoff_sequence: int) -> List[str]:
  158. """
  159. 将 cutoff_sequence 之后的所有 active 消息标记为 abandoned(回溯专用)
  160. Args:
  161. trace_id: Trace ID
  162. cutoff_sequence: 截断点(该 sequence 及之前的消息保留)
  163. Returns:
  164. 被标记为 abandoned 的 message_id 列表
  165. """
  166. ...
  167. # ===== 事件流操作(用于 WebSocket 断线续传)=====
  168. async def get_events(
  169. self,
  170. trace_id: str,
  171. since_event_id: int = 0
  172. ) -> List[Dict[str, Any]]:
  173. """
  174. 获取事件流(用于 WS 断线续传)
  175. Args:
  176. trace_id: Trace ID
  177. since_event_id: 从哪个事件 ID 开始(0 表示全部)
  178. Returns:
  179. 事件列表(按 event_id 排序)
  180. """
  181. ...
  182. async def append_event(
  183. self,
  184. trace_id: str,
  185. event_type: str,
  186. payload: Dict[str, Any]
  187. ) -> int:
  188. """
  189. 追加事件,返回 event_id
  190. Args:
  191. trace_id: Trace ID
  192. event_type: 事件类型
  193. payload: 事件数据
  194. Returns:
  195. event_id: 新事件的 ID
  196. """
  197. ...