Aura Bot

Aura Bot 是嵌入即时通讯通道的 AuraBoot AI Agent。它运行在 DM 中,响应群聊中的 @AI 提及,并支持与 Web Copilot 面板相同的流式聊天管道。在幕后,每一次 Aura Bot 回合都是一次 ConversationTurnService 执行,因此它继承了与其他每个 Agent 入口相同的持久化、审计与审批行为。
概念
Aura Bot 不是独立的 AI 运行时,而是共享 Agent 运行时的一个交付入口。这个区分很重要:路由到 Aura Bot 的消息在运行时层面与 Copilot 或 ACP 回合无法区分,只有 ResponseSink 不同。
| 入口 | 触发 | Sink |
|---|---|---|
/chat/stream | Web / 移动端聊天会话 | SseResponseSink |
| IM DM | 私聊机器人 | BroadcastResponseSink |
IM 群组 @AI | 群聊提及 | BroadcastResponseSink |
| 群聊自动回复 | 频道规则触发 | BroadcastResponseSink |
何时使用
- 用户希望停留在 IM 客户端中,不打开管理后台。
- 团队希望在频道中保留 Agent 交互的共享、可回溯记录。
- 运维希望从聊天中被告警或查询记录(例如"订单 X 的状态如何")。
- 群聊回复规则在分类事件上分派 Agent。
Aura Bot 不适合长耗时的批量 Agent 工作,那属于 ACP 的范畴。
架构
IM channel (DM or group)
|
v
+--------------------+ +---------------------------+
| Bot inbound adapter|----->| ConversationTurnService |
| (DM | @mention | | | runTurn / resumeTurn |
| group rule) | +-------------+-------------+
+--------------------+ |
v
+-----------+-----------+
| Agent Runtime |
| - tool selection |
| - LLM call |
| - command pipeline |
+-----------+-----------+
|
+---------------v---------------+
| BroadcastResponseSink |
| - chunked streaming |
| - final message persisted |
+---------------+---------------+
|
IM channel reply
入站适配器将 IM 载荷(发送者、频道、线程、提及列表)归一化为 Web 聊天使用的同一份输入信封。从该点开始,只存在一条代码路径。
Chokepoint 规则
所有会话回合必须经过 ConversationTurnService.runTurn(或恢复暂停审批时的 resumeTurn)。不要在聊天实现内部直接向 IM 频道写入;不要手写 SSE 或 WebSocket 帧;不要在 turn 服务之外持久化消息。详见 conversation turn chokepoint 纪律。
一次回合会产出:
- 一条持久化的用户消息和一条助手消息
- 一个 trace span,包含 prompt、Tool 调用、延迟、成本
- 可选的事件发布供下游监听者使用
- 一个或多个流式 chunk 输出到所选 sink
示例:群聊 @AI 处理器
@Component
public class GroupMentionHandler {
private final ConversationTurnService turns;
public void onMention(GroupMessageEvent event) {
// TurnRequest 是一个 record,使用位置参数直接构造(无 builder)。
TurnRequest req = new TurnRequest(
event.tenantId(),
event.senderUserId(),
/*humanMemberId=*/ null,
"im_group", // channel
"aura-bot", // agentCode
event.conversationId(),
/*clientMsgId=*/ null,
event.cleanedText(), // userMessage
/*pageContext=*/ null,
/*options=*/ null,
InboundMode.EXISTING_MESSAGE_ID, // 群聊消息已先行落库
/*precomputedBucket=*/ null,
event.messageId(), // inboundMessageId
/*parentTaskPid=*/ null,
/*overrides=*/ null,
/*legacyRequest=*/ null);
ResponseSink sink = new BroadcastResponseSink(/* broadcaster, members, ... */);
turns.runTurn(req, sink);
}
}需要审批的回复(例如"删除此客户")会挂起回合。当审批人点击同意时,恢复回调会调用 turns.resumeTurn(turnId, decision, sink),同一个 sink 将流式输出后续内容。
权限
Aura Bot 以 IM 用户身份运行,而不是服务账号。标准权限模型同样适用:
- 用户必须对 Agent 调用的每个 Tool 拥有
<module>.<resource>.<action>Permission。 - 用户手动无法运行的 Tool,也不能通过机器人调用。
- 群聊规则自动回复仍会解析为具体用户身份,通常是频道所有者或配置的机器人操作者。
验证清单
- 入站适配器调用
runTurn,绝不直接持久化或广播。 - 恢复路径调用
resumeTurn,而非新建runTurn。 - IM 使用
BroadcastResponseSink,而非SseResponseSink。 - Tool 调用继承 IM 用户的 Permission。
- 在 AI trace 查看器中可见来自 IM 的回合的 trace span。
相关
