会话状态管理

📎 引用文件

本文引用的文件 - agent/src/session/service.py - agent/src/api/sessions_routes.py - agent/src/session/store.py - agent/src/session/events.py - agent/src/session/models.py - frontend/src/stores/agent.ts - frontend/src/hooks/useSSE.ts - frontend/src/pages/Agent.tsx

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向 Vibe-Trading 研究页面的“会话状态管理”,聚焦以下目标: - 会话生命周期管理(创建、运行、取消、结束) - 消息历史存储与加载(持久化、分页、恢复) - 会话切换机制(前端缓存、侧边栏 spinner 保持) - 会话缓存策略(SESSION_CACHE_MAX)、会话 ID 管理 - 消息加载与同步机制(REST + SSE) - 会话状态与后端 SSE 连接的关联(streamingSessionId 维护) - 会话持久化、恢复机制与错误处理策略 - 最佳实践与性能优化建议

项目结构

前后端围绕“会话”形成清晰分层: - 前端 - 状态管理:Zustand store 负责会话消息、活动态、SSE 连接状态、流式会话标识等 - SSE Hook:自动重连、去重、Last-Event-ID 续传 - 页面组件:组装消息分组、工具调用时间线、Swarm/Goal 事件渲染 - 后端 - API 路由:会话 CRUD、发送消息、取消、获取消息、SSE 事件流 - 会话服务:编排执行、并发控制、事件总线、指标收集 - 存储层:文件系统持久化(session.json、messages.jsonl、attempts) - 事件总线:线程安全、缓冲、回放、心跳 - 数据模型:Session、Message、Attempt、状态枚举

graph TB FE["前端 Agent.tsx<br/>useSSE.ts<br/>stores/agent.ts"] --> API["后端 sessions_routes.py"] API --> SVC["会话服务 service.py"] SVC --> STORE["存储 store.py"] SVC --> BUS["事件总线 events.py"] SVC --> MODEL["数据模型 models.py"] API --> |SSE| FE

图表来源 - frontend/src/pages/Agent.tsx:1-200 - frontend/src/hooks/useSSE.ts:1-216 - frontend/src/stores/agent.ts:1-336 - agent/src/api/sessions_routes.py:1-800 - agent/src/session/service.py:1-605 - agent/src/session/store.py:1-259 - agent/src/session/events.py:1-240 - agent/src/session/models.py:1-342

章节来源 - frontend/src/pages/Agent.tsx:1-200 - frontend/src/hooks/useSSE.ts:1-216 - frontend/src/stores/agent.ts:1-336 - agent/src/api/sessions_routes.py:1-800 - agent/src/session/service.py:1-605 - agent/src/session/store.py:1-259 - agent/src/session/events.py:1-240 - agent/src/session/models.py:1-342

核心组件

章节来源 - frontend/src/stores/agent.ts:1-336 - agent/src/session/service.py:1-605 - agent/src/session/store.py:1-259 - agent/src/session/events.py:1-240 - agent/src/session/models.py:1-342

架构总览

下图展示从用户输入到 SSE 推送的端到端流程,以及前端如何基于事件更新 UI 与状态。

sequenceDiagram participant U as "用户" participant FE as "前端 Agent.tsx" participant ST as "Zustand Store" participant API as "sessions_routes.py" participant SVC as "SessionService" participant BUS as "EventBus" participant STORE as "SessionStore" U->>FE : 输入消息 FE->>API : POST /sessions/{id}/messages API->>SVC : send_message(session_id, content) SVC->>STORE : append_message() SVC->>BUS : emit("message.received") SVC->>SVC : create_attempt() SVC->>SVC : _run_attempt() SVC->>BUS : emit("attempt.started") Note over SVC,BUS : 后台执行 AgentLoop,持续 emit 工具/结果/进度等事件 BUS-->>API : 事件流 API-->>FE : SSE text_delta/tool_call/... FE->>ST : addMessage/updateToolCall/setStatus(...) SVC->>BUS : emit("attempt.completed/cancelled/failed") BUS-->>API : 终止事件 API-->>FE : 完成事件 FE->>ST : clearStreaming()/setActivityState("done")

图表来源 - frontend/src/pages/Agent.tsx:1-200 - frontend/src/hooks/useSSE.ts:1-216 - frontend/src/stores/agent.ts:1-336 - agent/src/api/sessions_routes.py:697-800 - agent/src/session/service.py:158-345 - agent/src/session/events.py:127-240

详细组件分析

会话生命周期管理(后端)

flowchart TD Start(["send_message"]) --> Reserve["预留会话(加锁)"] Reserve --> AppendMsg["持久化用户消息"] AppendMsg --> CreateAttempt["创建 Attempt"] CreateAttempt --> RunTask["异步执行 _run_attempt"] RunTask --> Events["持续 emit 工具/进度/结果事件"] Events --> Terminal{"终止事件?"} Terminal --> |completed| MarkDone["标记完成"] Terminal --> |cancelled| MarkCancel["标记取消"] Terminal --> |failed| MarkFail["标记失败"] MarkDone --> Release["释放会话占用"] MarkCancel --> Release MarkFail --> Release Release --> End(["返回 attempt_id"])

图表来源 - agent/src/session/service.py:158-345

章节来源 - agent/src/session/service.py:118-345

消息历史存储与加载

classDiagram class Session { +string session_id +string title +SessionStatus status +string created_at +string updated_at +string last_attempt_id +dict config +Principal owner } class Message { +string message_id +string session_id +string role +string content +string created_at +string linked_attempt_id +dict metadata +list tool_trail } class Attempt { +string attempt_id +string session_id +string parent_attempt_id +AttemptStatus status +string prompt +string run_dir +string summary +list react_trace +string created_at +string completed_at +string error +dict metrics } Session "1" -- "many" Message : "包含" Session "1" -- "many" Attempt : "包含"

图表来源 - agent/src/session/models.py:140-342 - agent/src/session/store.py:16-259

章节来源 - agent/src/session/store.py:57-193 - agent/src/session/models.py:140-342

会话切换机制与前端缓存

flowchart TD Switch["switchSession(sid, msgs?)"] --> Reset["重置状态/消息/工具调用/活动态"] Reset --> RestoreSwarm{"有 msgs?"} RestoreSwarm --> |是| LoadSwarm["恢复 swarmRuns 缓存"] RestoreSwarm --> |否| Loading["设置 sessionLoading=true"] Loading --> KeepSpinner["保留 streamingSessionId"] LoadSwarm --> KeepSpinner KeepSpinner --> Done(["切换完成"])

图表来源 - frontend/src/stores/agent.ts:307-323 - frontend/src/stores/agent.ts:282-297 - frontend/src/stores/agent.ts:139-148

章节来源 - frontend/src/stores/agent.ts:4-11 - frontend/src/stores/agent.ts:57-59 - frontend/src/stores/agent.ts:139-148 - frontend/src/stores/agent.ts:282-323

SSE 连接与会话状态关联

sequenceDiagram participant FE as "前端 useSSE" participant API as "sessions_routes.events" participant BUS as "EventBus" participant SVC as "SessionService" FE->>API : GET /sessions/{id}/events?Last-Event-ID=... API->>BUS : subscribe(session_id, last_event_id, replay_all?) BUS-->>API : 回放缓冲事件(如有) loop 实时事件 SVC->>BUS : emit(tool_call/tool_result/...) BUS-->>API : 事件帧 API-->>FE : SSE text_delta/tool_call/... FE->>FE : 更新UI/状态 end

图表来源 - frontend/src/hooks/useSSE.ts:1-216 - agent/src/api/sessions_routes.py:752-800 - agent/src/session/events.py:127-240 - agent/src/session/service.py:385-416

章节来源 - frontend/src/hooks/useSSE.ts:1-216 - agent/src/api/sessions_routes.py:752-800 - agent/src/session/events.py:1-240

会话 ID 管理与错误处理

章节来源 - agent/src/session/models.py:140-166 - agent/src/session/service.py:43-117 - agent/src/api/sessions_routes.py:697-728 - frontend/src/hooks/useSSE.ts:122-174 - frontend/src/stores/agent.ts:6-13

会话持久化与恢复机制

章节来源 - agent/src/session/store.py:151-193 - agent/src/session/events.py:151-183 - frontend/src/stores/agent.ts:282-323

最佳实践与性能优化建议

[本节为通用指导,不直接分析具体文件]

依赖关系分析

graph LR FE_Agent["Agent.tsx"] --> FE_SSE["useSSE.ts"] FE_Agent --> FE_Store["stores/agent.ts"] FE_SSE --> API_Route["sessions_routes.py"] API_Route --> SVC["service.py"] SVC --> BUS["events.py"] SVC --> STORE["store.py"] SVC --> MODEL["models.py"]

图表来源 - frontend/src/pages/Agent.tsx:1-200 - frontend/src/hooks/useSSE.ts:1-216 - frontend/src/stores/agent.ts:1-336 - agent/src/api/sessions_routes.py:1-800 - agent/src/session/service.py:1-605 - agent/src/session/events.py:1-240 - agent/src/session/store.py:1-259 - agent/src/session/models.py:1-342

章节来源 - frontend/src/pages/Agent.tsx:1-200 - frontend/src/hooks/useSSE.ts:1-216 - frontend/src/stores/agent.ts:1-336 - agent/src/api/sessions_routes.py:1-800 - agent/src/session/service.py:1-605 - agent/src/session/events.py:1-240 - agent/src/session/store.py:1-259 - agent/src/session/models.py:1-342

性能考量

[本节为通用指导,不直接分析具体文件]

故障排查指南

章节来源 - agent/src/api/sessions_routes.py:697-728 - agent/src/session/store.py:174-193 - agent/src/session/events.py:104-126 - frontend/src/hooks/useSSE.ts:122-174

结论

Vibe-Trading 研究页面的会话状态管理通过前后端协作实现了完整的生命周期管理: - 后端以 SessionService 为核心,结合 EventBus 与 SessionStore,提供可靠的执行编排与持久化 - 前端以 Zustand 管理会话状态与缓存,useSSE 提供健壮的事件流连接与恢复 - 通过 streamingSessionId、会话缓存、Last-Event-ID 续传等手段,提升了用户体验与系统韧性 - 建议在大规模场景下进一步优化历史裁剪策略、事件缓冲与前端渲染节流

[本节为总结性内容,不直接分析具体文件]

附录

[本节为补充信息,不直接分析具体文件]