From ac62057035e2286f6c6409e40e12284e4829103b Mon Sep 17 00:00:00 2001 From: ModerRAS Date: Thu, 23 Apr 2026 21:19:47 +0800 Subject: [PATCH] fix: collapse intermediate output to summary Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Helper/MessageFormatHelperTests.cs | 15 +++++------- .../Helper/MessageFormatHelper.cs | 24 +++++-------------- 2 files changed, 12 insertions(+), 27 deletions(-) diff --git a/TelegramSearchBot.Test/Helper/MessageFormatHelperTests.cs b/TelegramSearchBot.Test/Helper/MessageFormatHelperTests.cs index a83d20d0..0cdd03e0 100644 --- a/TelegramSearchBot.Test/Helper/MessageFormatHelperTests.cs +++ b/TelegramSearchBot.Test/Helper/MessageFormatHelperTests.cs @@ -33,30 +33,27 @@ public void CollapseLlmIntermediateIterations_WithFinalIteration_CollapsesPrefix var result = MessageFormatHelper.CollapseLlmIntermediateIterations(input); - Assert.Contains(":::tg-expandable-blockquote", result); - Assert.Contains("第一轮分析", result); + Assert.Contains("已折叠前面的中间过程和 1 次工具调用", result); Assert.Contains("🔧 `search_messages` [query: telegram collapse]", result); + Assert.DoesNotContain("第一轮分析", result); Assert.EndsWith("最终回答:可以把中间过程折叠起来。", result); } [Fact] - public void ConvertMarkdownToTelegramHtml_WithCollapsedIterations_EmitsSpoiler() { + public void ConvertMarkdownToTelegramHtml_WithCollapsedIterations_EmitsCompactSummary() { var markdown = """ -:::tg-expandable-blockquote -第一轮分析 - -🔧 `search_messages` [query: telegram collapse] -::: +💭 已折叠前面的中间过程和 1 次工具调用(最近一次:🔧 `search_messages` [query: telegram collapse])。 最终回答:可以把中间过程折叠起来。 """; var html = MessageFormatHelper.ConvertMarkdownToTelegramHtml(markdown); - Assert.Contains("", html); + Assert.Contains("已折叠前面的中间过程和 1 次工具调用", html); Assert.Contains("search_messages", html); Assert.Contains("最终回答:可以把中间过程折叠起来。", html); Assert.DoesNotContain("", html); } [Fact] diff --git a/TelegramSearchBot/Helper/MessageFormatHelper.cs b/TelegramSearchBot/Helper/MessageFormatHelper.cs index ff047a27..6c47be39 100644 --- a/TelegramSearchBot/Helper/MessageFormatHelper.cs +++ b/TelegramSearchBot/Helper/MessageFormatHelper.cs @@ -61,18 +61,14 @@ private static void ProcessHtmlNode(HtmlNode node, StringBuilder builder) { case "h1": case "h2": case "h3": case "h4": case "h5": case "h6": builder.Append(""); ProcessChildren(node, builder); builder.Append("\n"); break; case "ul": case "ol": ProcessList(node, builder, tagName == "ol" ? 1 : 0); builder.Append("\n"); break; case "blockquote": - if (node.Attributes["expandable"] != null) { - AppendSpoilerBlock(node, builder); - } else { - AppendQuotedBlock(node, builder); - } + AppendQuotedBlock(node, builder); break; case "span": case "div": case "font": case "img": if (tagName == "div" && HasCssClass(node, ExpandableBlockquoteContainerClass)) { - AppendSpoilerBlock(node, builder); + AppendQuotedBlock(node, builder); break; } if (tagName == "img") { @@ -104,12 +100,6 @@ private static bool HasCssClass(HtmlNode node, string cssClass) { .Any(x => string.Equals(x, cssClass, StringComparison.Ordinal)); } - private static void AppendSpoilerBlock(HtmlNode node, StringBuilder builder) { - builder.Append(""); - ProcessChildren(node, builder); - builder.Append(""); - } - private static void AppendQuotedBlock(HtmlNode node, StringBuilder builder) { var quotedContent = new StringBuilder(); ProcessChildren(node, quotedContent); @@ -293,13 +283,11 @@ public static string CollapseLlmIntermediateIterations(string markdown) { return markdown; } - return $""" -:::{ExpandableBlockquoteContainerClass} -{collapsedPrefix} -::: + var lastToolCall = lastMatch.Value.Trim(); + var toolCallCountText = matches.Count == 1 ? "1 次工具调用" : $"{matches.Count} 次工具调用"; + var collapsedSummary = $"💭 已折叠前面的中间过程和 {toolCallCountText}(最近一次:{lastToolCall})。"; -{visibleSuffix} -"""; + return $"{collapsedSummary}\n\n{visibleSuffix}"; } public static string EscapeMarkdownV2(string text) {