Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 6 additions & 9 deletions TelegramSearchBot.Test/Helper/MessageFormatHelperTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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("<tg-spoiler>", html);
Assert.Contains("已折叠前面的中间过程和 1 次工具调用", html);
Assert.Contains("<code>search_messages</code>", html);
Assert.Contains("最终回答:可以把中间过程折叠起来。", html);
Assert.DoesNotContain("<blockquote", html);
Assert.DoesNotContain("<tg-spoiler>", html);
}

[Fact]
Expand Down
24 changes: 6 additions & 18 deletions TelegramSearchBot/Helper/MessageFormatHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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("<b>"); ProcessChildren(node, builder); builder.Append("</b>\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") {
Expand Down Expand Up @@ -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("<tg-spoiler>");
ProcessChildren(node, builder);
builder.Append("</tg-spoiler>");
}

private static void AppendQuotedBlock(HtmlNode node, StringBuilder builder) {
var quotedContent = new StringBuilder();
ProcessChildren(node, quotedContent);
Expand Down Expand Up @@ -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) {
Expand Down
Loading