fix: wrap telegram reasoning italics per line (#2181)

Landed PR #2181.

Thanks @YuriNachos!

Co-authored-by: YuriNachos <YuriNachos@users.noreply.github.com>
This commit is contained in:
Yuri Chukhlib
2026-01-26 16:05:06 +01:00
committed by GitHub
parent 961b4adc1c
commit 300cda5d7d
4 changed files with 48 additions and 3 deletions

View File

@@ -1,6 +1,6 @@
import type { AssistantMessage } from "@mariozechner/pi-ai";
import { describe, expect, it } from "vitest";
import { extractAssistantText } from "./pi-embedded-utils.js";
import { extractAssistantText, formatReasoningMessage } from "./pi-embedded-utils.js";
describe("extractAssistantText", () => {
it("strips Minimax tool invocation XML from text", () => {
@@ -508,3 +508,41 @@ File contents here`,
expect(result).toBe("StartMiddleEnd");
});
});
describe("formatReasoningMessage", () => {
it("returns empty string for empty input", () => {
expect(formatReasoningMessage("")).toBe("");
});
it("returns empty string for whitespace-only input", () => {
expect(formatReasoningMessage(" \n \t ")).toBe("");
});
it("wraps single line in italics", () => {
expect(formatReasoningMessage("Single line of reasoning")).toBe(
"Reasoning:\n_Single line of reasoning_",
);
});
it("wraps each line separately for multiline text (Telegram fix)", () => {
expect(formatReasoningMessage("Line one\nLine two\nLine three")).toBe(
"Reasoning:\n_Line one_\n_Line two_\n_Line three_",
);
});
it("preserves empty lines between reasoning text", () => {
expect(formatReasoningMessage("First block\n\nSecond block")).toBe(
"Reasoning:\n_First block_\n\n_Second block_",
);
});
it("handles mixed empty and non-empty lines", () => {
expect(formatReasoningMessage("A\n\nB\nC")).toBe("Reasoning:\n_A_\n\n_B_\n_C_");
});
it("trims leading/trailing whitespace", () => {
expect(formatReasoningMessage(" \n Reasoning here \n ")).toBe(
"Reasoning:\n_Reasoning here_",
);
});
});