From fb811c7cf4bb0f3bff82ac6884a2e44efa0a9658 Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 6 Feb 2026 08:58:11 -0800 Subject: [PATCH] fix(agents): prevent usage events from emitting stream_end to frontend The mapEventToStreamChunk was mapping both 'usage' (per-turn) and 'end' (final) events to type 'end', causing the gateway to emit multiple stream_end events. This made the frontend create a separate message bubble (with its own bot avatar) for each agent loop turn. Co-Authored-By: Claude Opus 4.6 --- .../agents/coordinator/coordinator-agent.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/services/conversation-service/src/infrastructure/agents/coordinator/coordinator-agent.service.ts b/packages/services/conversation-service/src/infrastructure/agents/coordinator/coordinator-agent.service.ts index 73b0455..774f594 100644 --- a/packages/services/conversation-service/src/infrastructure/agents/coordinator/coordinator-agent.service.ts +++ b/packages/services/conversation-service/src/infrastructure/agents/coordinator/coordinator-agent.service.ts @@ -61,7 +61,7 @@ export interface FileAttachment { /** 兼容旧版 StreamChunk 格式 */ export interface StreamChunk { - type: 'text' | 'tool_use' | 'tool_result' | 'end' | 'stage_change' | 'state_update' | 'error' + type: 'text' | 'tool_use' | 'tool_result' | 'end' | 'usage' | 'stage_change' | 'state_update' | 'error' | 'agent_start' | 'agent_progress' | 'agent_complete' | 'coordinator_thinking'; content?: string; toolName?: string; @@ -511,7 +511,7 @@ export class CoordinatorAgentService implements OnModuleInit { case 'usage': return { - type: 'end', + type: 'usage', inputTokens: event.usage.inputTokens, outputTokens: event.usage.outputTokens, };