从 LLM-Chat 到 Agent-Chat多Agent协作入口的升级设计实战深入剖析 ooderAgent 场景组中的 Agent-Chat 模块设计涵盖 A2A/P2A/P2P 三种对话类型、待办消息整合、实时消息统一设计的完整方案实战设计文档 | 2026年3月ooderAgent Agent-Chat 设计实战目录背景为什么需要升级用户故事整理三种对话类型设计消息模型深度剖析待办消息整合设计功能页面交互设计代码实现解析总结与展望背景为什么需要升级在 ooderAgent 的场景组设计中原有的llm-chat-float.js只是一个简单的 LLM 聊天窗口用于用户与 AI 模型的单点对话。但随着场景组概念的引入这个设计已经无法满足需求核心矛盾场景组是一个多Agent协作空间包含参与者用户、协调者LLM Agent和用户 Agent。所有消息都应该汇总到统一的 Chat 窗口但原有的设计只支持单一的用户-LLM 对话模式。升级为Agent-Chat后需要解决以下问题原有设计升级需求单一用户-LLM对话多角色协作对话A2A/P2A/P2P无场景上下文场景组上下文感知无待办整合待办消息统一入口无实时推送WebSocket 实时消息无参与者选择参与者列表与定向发送用户故事整理基于对现有代码和业务需求的分析整理出以下核心用户故事用户故事 1场景组消息统一入口US-001高优先级作为场景组参与者我想要一个统一的消息入口能够看到场景组内所有的对话和通知。以便于我不需要在多个地方切换就能掌握场景组的全部动态。验收标准进入场景组详情页后Chat 窗口自动切换为场景模式显示场景组名称和状态消息列表包含所有类型的对话未读消息数量实时更新用户故事 2A2A 对话Agent-to-AgentUS-002中优先级A2A作为系统管理员我想要看到 Agent 之间的协作对话记录。以便于了解 Agent 之间的任务分配、状态同步和协作过程便于调试和优化。典型场景LLM Agent 向协调 Agent 请求资源协调 Agent 向执行 Agent 分配任务Agent 之间的心跳检测和状态同步用户故事 3P2A 对话Participant-to-AgentUS-003高优先级P2A作为场景组参与者我想要与特定的 Agent 进行对话请求它执行任务或回答问题。以便于获得针对性的帮助而不是泛泛的 AI 回答。典型场景用户向 LLM 助手提问业务问题用户向协调 Agent 请求任务状态用户向数据分析 Agent 请求报告生成用户故事 4P2P 对话Participant-to-ParticipantUS-004中优先级P2P作为场景组参与者我想要与其他参与者进行私聊或群聊。以便于在场景组内进行协作沟通讨论任务细节。典型场景团队成员讨论日报内容管理者向员工分配任务跨部门协作沟通用户故事 5待办消息整合US-005高优先级作为场景组参与者我想要在 Chat 窗口中看到我的待办事项并能直接处理。以便于不需要跳转到其他页面就能完成待办处理。待办类型邀请待办被邀请加入场景组审批待办需要审批的请求委派待办被委派的任务系统待办系统通知和提醒三种对话类型设计Agent-Chat 的核心创新在于将对话分为三种类型并有机融合对话类型枚举定义在代码中对话类型通过枚举定义Dict(code conversation_type, name 对话类型) public enum ConversationType implements DictItem { A2A(A2A, Agent-to-Agent, Agent之间的对话, ri-robot-line, #9C27B0, 1), P2A(P2A, Participant-to-Agent, 参与者与Agent的对话, ri-user-voice-line, #4CAF50, 2), P2P(P2P, Participant-to-Participant, 参与者之间的对话, ri-team-line, #FF9800, 3), SYSTEM(SYSTEM, System, 系统消息, ri-information-line, #2196F3, 4), TODO(TODO, Todo, 待办消息, ri-checkbox-line, #f44336, 5); }对话类型自动判断系统会根据消息的发送者和接收者自动判断对话类型private String determineConversationType(AgentChatMessageDTO message) { ParticipantInfo from message.getFromParticipant(); ParticipantInfo to message.getToParticipant(); if (from null || to null) { return ConversationType.SYSTEM.name(); } boolean fromIsAgent AGENT.equals(from.getType()) || SUPER_AGENT.equals(from.getType()); boolean toIsAgent AGENT.equals(to.getType()) || SUPER_AGENT.equals(to.getType()); if (fromIsAgent toIsAgent) { return ConversationType.A2A.name(); // Agent 对 Agent } else if (fromIsAgent || toIsAgent) { return ConversationType.P2A.name(); // 一方是 Agent } else { return ConversationType.P2P.name(); // 双方都是用户 } }消息模型深度剖析Agent-Chat 的消息模型设计非常丰富支持多种场景关键设计点参与者信息支持 from/to/cc 三种参与者实现定向发送和抄送⚡可执行动作消息可携带动作按钮如审批、接受、拒绝等⏰过期机制消息可设置过期时间自动清理无效消息待办消息整合设计待办消息是 Agent-Chat 的重要组成部分它与场景组的协作流程紧密关联待办数据模型public class TodoDTO { private String id; private String type; // INVITATION / APPROVAL / DELEGATION private String title; // 待办标题 private String description; // 待办描述 private String sceneGroupId; // 所属场景组 private String fromUser; // 发起人 private String toUser; // 接收人 private String priority; // 优先级 private Long deadline; // 截止时间 private Long createTime; // 创建时间 private String status; // PENDING / ACCEPTED / REJECTED / COMPLETED private String actionType; // 动作类型 }功能页面交互设计整体布局设计Agent-Chat 窗口采用三栏布局交互设计要点1. 消息类型切换左侧 Tab 栏支持快速切换消息类型全部显示所有类型的消息A2A只显示 Agent 之间的对话P2A只显示用户与 Agent 的对话P2P只显示用户之间的对话待办显示待办消息列表2. 参与者选择右侧参与者面板支持点击参与者头像定向发送消息输入框使用符号提及参与者显示在线状态绿点在线灰点离线区分 Agent 和用户不同颜色背景3. 待办快捷处理待办消息卡片内嵌操作按钮接受直接接受邀请/任务拒绝弹出拒绝原因输入框转派选择其他参与者进行转派处理结果实时更新到对话流代码实现解析前端组件初始化Agent-Chat 组件在页面加载时自动检测场景组模式async init(sceneGroupId) { const newSceneGroupId sceneGroupId || this.detectSceneGroupId(); // 检测是否进入场景组模式 const sceneModeChanged (this.sceneGroupId ! newSceneGroupId) ((this.sceneGroupId null) ! (newSceneGroupId null)); if (newSceneGroupId) { this.sceneGroupId newSceneGroupId; } else { this.sceneGroupId null; // 全局模式 } // 加载场景上下文 if (this.sceneGroupId) { await Promise.all([ this.loadSceneContext(), // 场景信息 this.loadSceneMessages(), // 历史消息 this.loadSceneTodos() // 待办事项 ]); this.connectWebSocket(); // 实时推送 } // 根据模式渲染不同UI if (this.isSceneMode()) { container.innerHTML this.renderSceneMode(); } else { container.innerHTML this.renderNormalMode(); } }场景上下文加载场景上下文包含参与者、Agent、能力绑定等信息Override public SceneChatContextDTO getChatContext(String sceneGroupId, String userId) { SceneGroupDTO sceneGroup sceneGroupService.get(sceneGroupId); SceneChatContextDTO context new SceneChatContextDTO(); context.setSceneGroupId(sceneGroupId); context.setSceneGroupName(sceneGroup.getName()); context.setSceneGroupStatus(sceneGroup.getStatus().name()); // 转换参与者信息 ListParticipantInfo participants convertParticipants(sceneGroup.getParticipants()); context.setParticipants(participants); // 提取 Agent 列表 ListAgentInfo agents extractAgents(sceneGroup.getParticipants()); context.setAgents(agents); // 计算未读消息数 MapString, Integer unreadCounts getUnreadCounts(sceneGroupId, userId); context.setUnreadMessages(unreadCounts.values().stream().mapToInt(Integer::intValue).sum()); // 获取紧急待办 ListTodoDTO pendingTodos todoService.listPendingTodos(userId); context.setPendingTodos(pendingTodos.size()); return context; }WebSocket 实时推送实时消息通过 WebSocket 推送到前端connectWebSocket() { if (!this.sceneGroupId || this.ws) return; const wsProtocol window.location.protocol https: ? wss: : ws:; const wsUrl ${wsProtocol}//${window.location.host}/ws/scene-groups/${this.sceneGroupId}/chat; this.ws new WebSocket(wsUrl); this.ws.onmessage (event) { const data JSON.parse(event.data); this.handleWebSocketMessage(data); }; } handleWebSocketMessage(data) { switch (data.type) { case message:new: this.messages.unshift(data.message); this.renderMessages(); this.updateBadge(); break; case todo:new: this.sceneTodos.unshift(data.todo); this.updateBadge(); break; } }总结与展望核心设计要点Agent-Chat 的升级设计解决了多Agent协作场景下的消息统一入口问题三种对话类型有机融合A2A/P2A/P2P 通过统一的 Chat 窗口呈现待办消息深度整合待办与对话流无缝衔接支持快捷处理场景上下文感知自动检测场景组模式加载相关上下文实时推送机制WebSocket 保证消息实时性参与者选择机制支持定向发送和提及未来优化方向方向具体内容消息搜索支持全文搜索历史消息消息分类更细粒度的消息分类和过滤富媒体支持图片、文件、代码块的展示消息引用支持引用历史消息进行回复消息统计消息量、响应时间等统计分析Agent-Chat 作为 ooderAgent 场景组的核心入口承载着多Agent协作的沟通桥梁作用。通过合理的设计和实现它能够有效地支撑复杂的协作场景为用户提供流畅的协作体验。参考代码• 前端组件e:\apex\app\src\main\resources\static\console\js\llm-chat-float.js• 后端服务e:\apex\app\src\main\java\net\ooder\mvp\skill\scene\agent\• 消息模型AgentChatMessageDTO.java• 对话类型ConversationType.java• 待办模型TodoDTO.java