From 44ab3792d231c1b9d65dd1c051c3e393f1b21ef3 Mon Sep 17 00:00:00 2001 From: Acbox Date: Mon, 23 Feb 2026 00:31:59 +0800 Subject: [PATCH] fix(channel): create new message when tool calling --- internal/channel/adapters/feishu/stream.go | 20 +++++++++--- internal/channel/adapters/telegram/stream.go | 33 +++++++++++++++----- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/internal/channel/adapters/feishu/stream.go b/internal/channel/adapters/feishu/stream.go index 9986eb92..705c7102 100644 --- a/internal/channel/adapters/feishu/stream.go +++ b/internal/channel/adapters/feishu/stream.go @@ -70,11 +70,20 @@ func (s *feishuOutboundStream) Push(ctx context.Context, event channel.StreamEve } return s.patchCard(ctx, s.textBuffer.String()) case channel.StreamEventToolCallStart: - if err := s.ensureCard(ctx, feishuStreamToolHintText); err != nil { - return err + bufText := strings.TrimSpace(s.textBuffer.String()) + if s.cardMessageID != "" && bufText != "" { + _ = s.patchCard(ctx, bufText) } - return s.patchCard(ctx, feishuStreamToolHintText) + s.cardMessageID = "" + s.lastPatched = "" + s.lastPatchedAt = time.Time{} + s.textBuffer.Reset() + return nil case channel.StreamEventToolCallEnd: + s.cardMessageID = "" + s.lastPatched = "" + s.lastPatchedAt = time.Time{} + s.textBuffer.Reset() return nil case channel.StreamEventAttachment: if len(event.Attachments) == 0 { @@ -94,9 +103,10 @@ func (s *feishuOutboundStream) Push(ctx context.Context, event channel.StreamEve return nil } msg := event.Final.Message - finalText := strings.TrimSpace(msg.PlainText()) + bufText := strings.TrimSpace(s.textBuffer.String()) + finalText := bufText if finalText == "" { - finalText = strings.TrimSpace(s.textBuffer.String()) + finalText = strings.TrimSpace(msg.PlainText()) } if finalText != "" { if err := s.ensureCard(ctx, feishuStreamThinkingText); err != nil { diff --git a/internal/channel/adapters/telegram/stream.go b/internal/channel/adapters/telegram/stream.go index e941c411..3b0f60f0 100644 --- a/internal/channel/adapters/telegram/stream.go +++ b/internal/channel/adapters/telegram/stream.go @@ -217,11 +217,29 @@ func (s *telegramOutboundStream) Push(ctx context.Context, event channel.StreamE case channel.StreamEventStatus: return nil case channel.StreamEventToolCallStart: - if err := s.ensureStreamMessage(ctx, telegramStreamToolHintText); err != nil { - return err + s.mu.Lock() + bufText := strings.TrimSpace(s.buf.String()) + hasMsg := s.streamMsgID != 0 + s.mu.Unlock() + if hasMsg && bufText != "" { + _ = s.editStreamMessageFinal(ctx, bufText) } - return s.editStreamMessageFinal(ctx, telegramStreamToolHintText) + s.mu.Lock() + s.streamMsgID = 0 + s.streamChatID = 0 + s.lastEdited = "" + s.lastEditedAt = time.Time{} + s.buf.Reset() + s.mu.Unlock() + return nil case channel.StreamEventToolCallEnd: + s.mu.Lock() + s.streamMsgID = 0 + s.streamChatID = 0 + s.lastEdited = "" + s.lastEditedAt = time.Time{} + s.buf.Reset() + s.mu.Unlock() return nil case channel.StreamEventAttachment: if len(event.Attachments) == 0 { @@ -271,12 +289,13 @@ func (s *telegramOutboundStream) Push(ctx context.Context, event channel.StreamE return nil } msg := event.Final.Message - finalText := strings.TrimSpace(msg.PlainText()) s.mu.Lock() - if finalText == "" { - finalText = strings.TrimSpace(s.buf.String()) - } + bufText := strings.TrimSpace(s.buf.String()) s.mu.Unlock() + finalText := bufText + if finalText == "" { + finalText = strings.TrimSpace(msg.PlainText()) + } // Convert markdown to Telegram HTML for the final message. formatted, pm := formatTelegramOutput(finalText, msg.Format) if pm != "" {