protocols.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. """
  2. Trace Storage Protocol - Trace 存储接口定义
  3. 使用 Protocol 定义接口,允许不同的存储实现(内存、PostgreSQL、Neo4j 等)
  4. """
  5. from typing import Protocol, List, Optional, Dict, Any, runtime_checkable
  6. from agent.execution.models import Trace, Message
  7. from agent.goal.models import GoalTree, Goal, BranchContext
  8. @runtime_checkable
  9. class TraceStore(Protocol):
  10. """Trace + Message + GoalTree + Branch 存储接口"""
  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. ) -> List[Trace]:
  40. """列出 Traces"""
  41. ...
  42. # ===== GoalTree 操作 =====
  43. async def get_goal_tree(self, trace_id: str) -> Optional[GoalTree]:
  44. """
  45. 获取 GoalTree
  46. Args:
  47. trace_id: Trace ID
  48. Returns:
  49. GoalTree 对象,如果不存在返回 None
  50. """
  51. ...
  52. async def update_goal_tree(self, trace_id: str, tree: GoalTree) -> None:
  53. """
  54. 更新完整 GoalTree
  55. Args:
  56. trace_id: Trace ID
  57. tree: GoalTree 对象
  58. """
  59. ...
  60. async def add_goal(self, trace_id: str, goal: Goal) -> None:
  61. """
  62. 添加 Goal 到 GoalTree
  63. Args:
  64. trace_id: Trace ID
  65. goal: Goal 对象
  66. """
  67. ...
  68. async def update_goal(self, trace_id: str, goal_id: str, **updates) -> None:
  69. """
  70. 更新 Goal 字段
  71. Args:
  72. trace_id: Trace ID
  73. goal_id: Goal ID
  74. **updates: 要更新的字段(如 status, summary, self_stats, cumulative_stats)
  75. """
  76. ...
  77. # ===== Branch 操作 =====
  78. async def create_branch(self, trace_id: str, branch: BranchContext) -> None:
  79. """
  80. 创建分支上下文
  81. Args:
  82. trace_id: Trace ID
  83. branch: BranchContext 对象
  84. """
  85. ...
  86. async def get_branch(self, trace_id: str, branch_id: str) -> Optional[BranchContext]:
  87. """
  88. 获取分支元数据
  89. Args:
  90. trace_id: Trace ID
  91. branch_id: 分支 ID
  92. Returns:
  93. BranchContext 对象(不含分支内 GoalTree)
  94. """
  95. ...
  96. async def get_branch_goal_tree(self, trace_id: str, branch_id: str) -> Optional[GoalTree]:
  97. """
  98. 获取分支的 GoalTree
  99. Args:
  100. trace_id: Trace ID
  101. branch_id: 分支 ID
  102. Returns:
  103. 分支的 GoalTree 对象
  104. """
  105. ...
  106. async def update_branch_goal_tree(self, trace_id: str, branch_id: str, tree: GoalTree) -> None:
  107. """
  108. 更新分支的 GoalTree
  109. Args:
  110. trace_id: Trace ID
  111. branch_id: 分支 ID
  112. tree: GoalTree 对象
  113. """
  114. ...
  115. async def update_branch(self, trace_id: str, branch_id: str, **updates) -> None:
  116. """
  117. 更新分支元数据
  118. Args:
  119. trace_id: Trace ID
  120. branch_id: 分支 ID
  121. **updates: 要更新的字段(如 status, summary, cumulative_stats)
  122. """
  123. ...
  124. async def list_branches(self, trace_id: str) -> Dict[str, BranchContext]:
  125. """
  126. 列出所有分支元数据
  127. Args:
  128. trace_id: Trace ID
  129. Returns:
  130. Dict[branch_id, BranchContext]
  131. """
  132. ...
  133. # ===== Message 操作 =====
  134. async def add_message(self, message: Message) -> str:
  135. """
  136. 添加 Message
  137. 自动更新关联 Goal 的 stats(self_stats 和祖先的 cumulative_stats)
  138. Args:
  139. message: Message 对象
  140. Returns:
  141. message_id
  142. """
  143. ...
  144. async def get_message(self, message_id: str) -> Optional[Message]:
  145. """获取 Message"""
  146. ...
  147. async def get_trace_messages(
  148. self,
  149. trace_id: str,
  150. branch_id: Optional[str] = None
  151. ) -> List[Message]:
  152. """
  153. 获取 Trace 的所有 Messages(按 sequence 排序)
  154. Args:
  155. trace_id: Trace ID
  156. branch_id: 可选,过滤指定分支的消息
  157. Returns:
  158. Message 列表
  159. """
  160. ...
  161. async def get_messages_by_goal(
  162. self,
  163. trace_id: str,
  164. goal_id: str,
  165. branch_id: Optional[str] = None
  166. ) -> List[Message]:
  167. """
  168. 获取指定 Goal 关联的所有 Messages
  169. Args:
  170. trace_id: Trace ID
  171. goal_id: Goal ID
  172. branch_id: 可选,指定分支
  173. Returns:
  174. Message 列表
  175. """
  176. ...
  177. async def update_message(self, message_id: str, **updates) -> None:
  178. """
  179. 更新 Message 字段(用于状态变更、错误记录等)
  180. Args:
  181. message_id: Message ID
  182. **updates: 要更新的字段
  183. """
  184. ...
  185. # ===== 事件流操作(用于 WebSocket 断线续传)=====
  186. async def get_events(
  187. self,
  188. trace_id: str,
  189. since_event_id: int = 0
  190. ) -> List[Dict[str, Any]]:
  191. """
  192. 获取事件流(用于 WS 断线续传)
  193. Args:
  194. trace_id: Trace ID
  195. since_event_id: 从哪个事件 ID 开始(0 表示全部)
  196. Returns:
  197. 事件列表(按 event_id 排序)
  198. """
  199. ...
  200. async def append_event(
  201. self,
  202. trace_id: str,
  203. event_type: str,
  204. payload: Dict[str, Any]
  205. ) -> int:
  206. """
  207. 追加事件,返回 event_id
  208. Args:
  209. trace_id: Trace ID
  210. event_type: 事件类型
  211. payload: 事件数据
  212. Returns:
  213. event_id: 新事件的 ID
  214. """
  215. ...