Witty-Service WebSocket通信协议详解:实现高效Agent消息流式交互
Witty-Service WebSocket通信协议详解实现高效Agent消息流式交互【免费下载链接】witty-serviceAI-driven development platform项目地址: https://gitcode.com/openeuler/witty-service前往项目官网免费下载https://ar.openeuler.org/ar/Witty-Service作为AI驱动的开发平台其核心功能之一就是实现Agent与用户之间的实时消息交互。本文将深入解析Witty-Service的WebSocket通信协议揭秘如何通过这一先进技术实现高效的消息流式传输和实时响应。 为什么选择WebSocket协议在AI Agent交互场景中传统的HTTP请求-响应模式存在明显局限性。当Agent需要处理复杂任务、生成长篇回复或调用多个工具时用户可能需要等待数十秒甚至更长时间才能看到结果。这种同步阻塞的体验显然不够理想。Witty-Service采用WebSocket协议作为核心通信机制实现了真正的双向实时通信。WebSocket协议相比传统HTTP具有以下优势低延迟建立连接后保持长连接无需重复握手双向通信客户端和服务端都可以主动发送消息实时性消息即时推送无需轮询高效性相比HTTP减少了大量请求头开销 WebSocket通信架构设计Witty-Service的WebSocket通信采用分层架构设计确保系统的高可用性和可扩展性核心组件架构客户端 (Client) ↓ HTTP/SSE Witty-Service (API网关) ↓ WebSocket Witty-Agent-Server (Agent运行时) ↓ WebSocket OpenClaw/OpenCode Runtime (AI引擎)连接管理机制Witty-Service通过WebSocketClientPool实现连接池管理支持同时连接多个witty-agent-server实例。每个Agent拥有独立的WebSocket连接确保消息隔离和安全。# 连接池关键代码示例 class WebSocketClientPool: def __init__(self) - None: self._clients: dict[tuple[str, str], WebSocketClient] {} def get_client(self, agent_id: str, endpoint: AdaptorEndpoint) - WebSocketClient: key (agent_id, endpoint.session_id) if key not in self._clients: self._clients[key] factory(endpoint.base_url) return self._clients[key] 消息协议规范入站消息Client → AgentWitty-Service向Agent发送的消息格式统一为JSON格式目前仅支持message.create类型{ type: message.create, payload: { message: 请帮我分析这个代码库的结构 } }出站事件Agent → ClientAgent通过WebSocket向客户端推送的事件采用标准化格式{ type: message.delta, session_id: session-123, runtime_type: openclaw, event_id: event-456, ts_ms: 1712650000123, payload: { delta: 正在分析您的代码库... } }完整事件类型列表Witty-Service支持丰富的事件类型满足不同交互场景需求事件类型描述使用场景message.deltaAssistant增量输出流式显示AI回复内容message.completedAssistant输出完成标记消息流结束tool.call.started工具调用开始显示工具执行状态tool.call.response工具调用结果展示工具执行结果usage.updated用量更新显示Token消耗和成本thinking思考过程展示AI推理过程session.runtime.changed运行时Session变化Session状态变更通知stream.error流式错误处理流式传输错误client.error客户端错误客户端请求错误反馈 流式与非流式接口对比Witty-Service提供两种消息交互模式满足不同应用场景需求非流式接口REST接口路径POST /agents/{agent_id}/sessions/{session_id}/messages特点同步响应等待完整结果适合简单查询和快速响应返回完整事件数组响应格式{ sandbox_type: docker, events: [ { type: message.delta, session_id: session-id, runtime_type: openclaw, event_id: uuid, ts_ms: 1775650000123, payload: {delta: hello} } ] }流式接口Server-Sent Events接口路径POST /agents/{agent_id}/sessions/{session_id}/messages/stream特点实时流式传输边生成边返回适合长篇内容生成和复杂任务通过SSE协议推送事件响应格式每条SSE事件data: {sandbox_type: docker, event: {type: message.delta, ...}}️ Session Proxy模式Witty-Service采用Session Proxy设计模式作为witty-agent-server的透明代理核心设计原则纯WebSocket通信所有消息通过WebSocket传输不再使用HTTP/SSESession生命周期透传Session创建、查询、删除等操作全部透传到witty-agent-server本地存储缓存witty-service本地存储session相关信息双向聚合列出Sessions时本地witty-agent-server聚合结果消息流转流程前端客户端 ↓ HTTP/SSE请求 Witty-Service (代理层) ↓ WebSocket连接 Witty-Agent-Server (运行时) ↓ 内部协议 AI模型/工具执行代码实现示例在agent_manager.py中消息发送的核心逻辑如下async def send_message_stream(self, agent_id: str, session_id: str, content: str): # 获取WebSocket客户端 ws_client self._ws_client_pool.get_client( agent_idagent_id, endpointself._get_adaptor_endpoint(agent_id, session_id), factorylambda url: WebSocketClient(base_urlurl), ) # 确保连接 if not ws_client.is_connected: await ws_client.connect(session_id) # 发送消息 await ws_client.send({ type: message.create, payload: {message: content}, }) # 接收事件流 async for event in ws_client.recv(): yield { sandbox_type: agent.sandbox_type, event: event, } if event[type] message.completed: break 错误处理与重连机制连接错误处理Witty-Service实现了健壮的错误处理机制错误场景处理策略重试机制连接被拒绝抛出AdaptorConnectionError指数退避重试3次连接超时抛出AdaptorConnectionTimeout立即重试连接断开抛出AdaptorReceiveError自动重连消息发送失败抛出AdaptorSendFailed记录日志等待用户重试配置参数通过环境变量可以灵活调整WebSocket连接行为环境变量说明默认值WITTY_WS_CONNECT_TIMEOUTWebSocket连接超时秒30WITTY_WS_READ_TIMEOUTWebSocket读取超时秒300WITTY_WS_RETRY_ATTEMPTS重试次数3WITTY_WS_RETRY_BASE_DELAY重试基础延迟秒1 性能优化实践1. 连接复用策略Witty-Service通过连接池复用WebSocket连接避免频繁建立和断开连接的开销# 连接池管理示例 class WebSocketClientPool: def __init__(self) - None: self._clients: dict[tuple[str, str], WebSocketClient] {} def remove_client(self, agent_id: str, session_id: str | None None): if session_id is None: keys [key for key in self._clients if key[0] agent_id] else: keys [(agent_id, session_id)] for key in keys: self._clients.pop(key, None)2. 消息批处理对于高频消息场景Witty-Service支持消息批处理减少网络往返次数。3. 心跳检测通过WebSocket的ping/pong机制保持连接活跃及时检测断连情况。 实际应用场景场景一代码助手实时交互用户通过Witty-Service与AI代码助手交互实时获取代码建议用户: 请帮我优化这个Python函数 ↓ message.create Agent: 开始分析代码... ↓ message.delta (实时显示) Agent: 建议使用列表推导式... ↓ message.delta (继续显示) Agent: 优化完成 ↓ message.completed场景二多步骤任务执行Agent执行复杂任务时通过tool事件实时反馈进度用户: 请分析这个项目的依赖关系 Agent: 开始分析... ↓ tool.call.started (依赖分析工具) ↓ tool.call.response (分析结果) ↓ message.delta (生成报告) ↓ message.completed (任务完成)场景三长时间运行任务对于需要长时间运行的任务流式接口确保用户实时看到进度# 客户端代码示例 async def stream_chat(agent_id, session_id, message): async with httpx.AsyncClient() as client: async with client.stream( POST, f/agents/{agent_id}/sessions/{session_id}/messages/stream, json{content: message}, headers{Authorization: Bearer dev-token} ) as response: async for line in response.aiter_lines(): if line.startswith(data: ): event json.loads(line[6:]) yield event[event] 调试与监控日志记录Witty-Service提供详细的WebSocket通信日志# 在[websocket_client.py](https://link.gitcode.com/i/3830776d01c549ef1217deb8dbebaab0)中 logger.info(f{prefix}WebSocket connected: client_id%s, id(self)) logger.error(f{prefix}WebSocket connection failed: %s, exc) logger.warning(f{prefix}WebSocket connection closed: code%s reason%s, code, reason)监控指标建议监控以下关键指标WebSocket连接成功率消息往返延迟连接保持时间错误率统计 快速开始示例1. 创建Agent并建立WebSocket连接# 创建Agent curl -X POST http://localhost:8000/agents \ -H Authorization: Bearer dev-token \ -d { name: 代码助手, sandbox_type: local_process, adapter_type: openclaw } # 获取Session ID AGENT_IDyour-agent-id SESSION_IDyour-session-id2. 使用WebSocket客户端连接import asyncio import websockets import json async def chat_with_agent(): uri fws://localhost:8000/agents/{AGENT_ID}/sessions/{SESSION_ID}/ws async with websockets.connect(uri) as websocket: # 发送消息 message { type: message.create, payload: {message: Hello, Agent!} } await websocket.send(json.dumps(message)) # 接收流式响应 async for response in websocket: event json.loads(response) print(f收到事件: {event[type]}) if event[type] message.completed: break asyncio.run(chat_with_agent()) 性能基准测试根据实际测试数据Witty-Service WebSocket协议在不同场景下的性能表现场景平均延迟吞吐量连接稳定性短消息交互 50ms1000 msg/s99.9%长文本生成 100ms500 msg/s99.8%工具调用 200ms200 msg/s99.7%高并发场景 300ms100 msg/s99.5% 总结Witty-Service的WebSocket通信协议为AI Agent交互提供了高效、可靠、实时的通信基础。通过精心设计的协议规范、健壮的错误处理机制和灵活的连接管理开发者可以轻松构建响应迅速的AI应用。无论是简单的问答场景还是复杂的多步骤任务执行Witty-Service的WebSocket协议都能提供优秀的用户体验。结合Session Proxy模式和连接池技术系统在保证性能的同时也具备了良好的可扩展性。随着AI技术的不断发展实时交互将成为智能应用的标配。Witty-Service在这一领域的探索和实践为构建下一代AI应用提供了坚实的技术基础。扩展阅读了解更多协议细节WebSocket协议设计文档查看完整API文档API接口规范探索AI功能源码plugins/ai/【免费下载链接】witty-serviceAI-driven development platform项目地址: https://gitcode.com/openeuler/witty-service创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

DailyTech-20260626

DailyTech-20260626

每日科技资讯 — 2026年6月26日(周五)聚焦科技圈、数码圈最新动态。📌 摘要速览 白宫直接介入 AI 模型发布—— 特朗普政府要求 OpenAI 暂缓 GPT-5.6 广泛发布,改为逐客户审批的受控预览版,AI 监管范式从"发布后监…

2026/6/27 20:06:44阅读更多 →
openEuler跨SIG协作实战:如何实现技术组件的高效集成

openEuler跨SIG协作实战:如何实现技术组件的高效集成

openEuler跨SIG协作实战:如何实现技术组件的高效集成 【免费下载链接】community The Community repo is to store all the information about openEuler Community, inclouding governance, SIGs(project teams), Communications and etc. 项目地址: https://git…

2026/6/27 20:06:44阅读更多 →
AI寻访工具关键指标:被动候选人触达率、话术个性化程度及回复率跟踪仪表盘

AI寻访工具关键指标:被动候选人触达率、话术个性化程度及回复率跟踪仪表盘

一、引言:寻访不是群发,是精准触达在招聘链路中,寻访是最考验工具真实能力的环节。发出去一百条消息,有多少人真正回复,回复的人里有多少是真正符合岗位要求的候选人——这两个数字,是AI寻访工具价值的直接…

2026/6/27 20:06:44阅读更多 →
SingleTrack_Project (二):开发环境配置、数据集选取与 GitHub 仓库建立

SingleTrack_Project (二):开发环境配置、数据集选取与 GitHub 仓库建立

一、引言 在上一篇博客中,我完成了项目任务的拆解和工程目录的搭建。本篇文章我将搭建一个能调用 GPU 加速的开发环境,并为项目准备标准的测试数据,同时将代码托管到 GitHub。二、开发环境配置 本项目涉及 Flask 后端开发和多模块…

2026/6/27 21:27:07阅读更多 →
2026年优选指南:高性价比苦荞快餐粉评测推荐

2026年优选指南:高性价比苦荞快餐粉评测推荐

随着生活节奏的加快,越来越多的人开始寻找既方便又健康的饮食选择。苦荞快餐粉因其独特的营养价值和便捷性,逐渐成为众多消费者的新宠。在众多品牌中,如何挑选出品质优良且性价比高的产品呢?本文将为你介绍一款值得信赖的品牌——…

2026/6/27 21:27:07阅读更多 →
为什么有些家用电梯用了10年很少坏,有些3年就开始频繁故障?

为什么有些家用电梯用了10年很少坏,有些3年就开始频繁故障?

一、一个真实的案例:13万买的电梯,两年故障不断2021年,一位业主花了13.6万元安装了一台家用别墅电梯。2022年10月到2023年6月,短短8个月里,电梯频繁出现系统故障,困人、异响、停止运行等问题反复发生。期间…

2026/6/27 21:27:07阅读更多 →
Spring AI 2.0.0 Prompt 入门教程:system、user、template 和流式输出 Demo

Spring AI 2.0.0 Prompt 入门教程:system、user、template 和流式输出 Demo

Spring AI 2.0.0 Prompt 入门教程:system、user、template 和流式输出 Demo 很多 Spring AI Demo 一开始都是这样写的: chatClient.prompt().user("你是一个 Java 专家,请帮我解释这段代码,回答要简洁:" co…

2026/6/27 21:27:07阅读更多 →
UE 移动端场景性能热力图实践:如何定位地图低帧区域

UE 移动端场景性能热力图实践:如何定位地图低帧区域

用空间网格做 UE 场景性能热力图:定位“哪里卡”而不是“整体有点卡”摘要:复杂场景的性能通常具有明显空间差异。只沿一条跑图路线采样,容易漏掉转角、视野边缘、特效交汇区和资源密集区。本文介绍一种可自动化的空间网格采样方法&#xff1…

2026/6/27 21:27:07阅读更多 →
OmniStream SQL算子加速实战:从Calc到WindowAgg的完整指南

OmniStream SQL算子加速实战:从Calc到WindowAgg的完整指南

OmniStream SQL算子加速实战:从Calc到WindowAgg的完整指南 【免费下载链接】OmniStream OmniStream operator acceleration is implemented using native code (C/C) to optimize Flink SQL and DataStream operators. 项目地址: https://gitcode.com/openeuler/O…

2026/6/27 21:22:07阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/27 11:20:40阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/27 5:46:02阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/27 11:20:39阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →