菜单

WebSocket 通信

相关源文件

WebSocket 通信系统通过 Socket.IO 实现,支持 React 前端和 FastAPI 后端之间的实时双向通信。它负责在 AI Agent 执行会话期间处理 Agent 行动、观察和状态更新的事件流。

有关通用的 API 通信模式,请参阅 服务器 API 和通信

架构概述

OpenHands 使用 Socket.IO 实现 React 前端和 FastAPI 后端之间的实时 WebSocket 通信。该系统通过与会话绑定的持久连接来流式传输 Agent 事件、用户操作和状态更新。

WebSocket 系统架构

来源

前端 WebSocket 实现

WsClientProvider React Context 管理 Socket.IO 连接并提供与后端的实时通信。

WsClientProvider Context

来源

连接管理和事件处理

WsClientProvider 通过特定于会话的连接以及事件重放功能管理 Socket.IO 连接。

连接初始化流程

来源

事件处理和类型守卫

Provider 使用类型守卫来对不同事件类型进行分类和处理

类型守卫函数目的触发的操作
isOpenHandsEvent验证基本事件结构基本事件处理
isOpenHandsAction / isOpenHandsObservation对事件进行分类添加到 parsedEvents 数组
isFileWriteAction / isFileEditAction检测文件操作使 React Query 缓存失效
isCommandAction检测命令执行使文件更改缓存失效
isUserMessage / isAssistantMessage识别消息事件移除乐观更新
isErrorObservation处理错误事件触发错误跟踪

来源

React Query 缓存集成

WebSocket 客户端与 React Query 集成,以便在相关事件发生时使缓存的数据失效

来源

连接生命周期

连接状态管理

WsClientProvider 通过 WsClientProviderStatus 枚举和 React state 来管理连接状态

来源

事件流模式

客户端遵循特定的模式来发送用户操作和接收 Agent 事件

来源

事件类型和处理

Socket.IO 事件协议

WebSocket 通信使用特定的 Socket.IO 事件名称来表示不同的消息方向

方向事件名称目的实现
客户端 → 服务器oh_user_action用户消息和操作socket.emit('oh_user_action', event)
服务器 → 客户端oh_eventAgent 操作、观察、状态handleMessage(event) 回调
连接事件connect, disconnect, connect_error连接生命周期内置 Socket.IO 事件

来源

事件类型分类

客户端使用类型守卫的层次结构来处理传入事件

核心事件结构验证

来源

操作和观察分类

来源

错误处理和恢复

错误检测和用户反馈

WebSocket 系统通过多个检测点实现全面的错误处理

错误来源分类

来源

Agent 状态错误处理

该系统通过事件观察来检测和处理 Agent 级别的错误

来源

重连和状态恢复

客户端实现了具有事件重放功能的有状态重连

用于重连的事件 ID 跟踪

来源

状态可视化

WebSocket 连接状态在 UI 中可视化,为用户提供当前通信状态的反馈。

代理状态栏

AgentStatusBar 组件显示连接状态,使用

  • 颜色编码指示器
  • 状态文本
  • 重要状态更改的视觉通知

来源

状态指示器根据连接状态和代理状态使用颜色和文本

来源

浏览器标签页通知

对于重要的状态更改,即使标签页未处于焦点状态,系统也会提供通知。

  • 标签页标题闪烁
  • 浏览器通知(如果允许)
  • 声音通知

来源

结论

OpenHands 中的 WebSocket 通信系统提供了前端和后端之间实时双向通信的强大机制。它支持有效 AI 代理交互所需的响应式、交互式体验,并能妥善处理连接、断开连接、错误和用户反馈。