mirror of
https://github.com/NCBM/plyngent.git
synced 2026-07-23 05:55:16 +08:00
core/cli: Rich markdown for assistant text at end of turn
Stream plain tokens; on TTY re-render with Rich. /markdown and PLYNGENT_PLAIN.
This commit is contained in:
@@ -3,7 +3,14 @@ from __future__ import annotations
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from plyngent.agent import ReasoningDeltaEvent, TextDeltaEvent, ToolResultEvent
|
||||
from plyngent.cli.display import render_events, set_verbose_tool_results
|
||||
from plyngent.cli.display import (
|
||||
get_markdown_enabled,
|
||||
markdown_render_available,
|
||||
print_markdown,
|
||||
render_events,
|
||||
set_markdown_enabled,
|
||||
set_verbose_tool_results,
|
||||
)
|
||||
from plyngent.lmproto.openai_compatible.model import ToolChatMessage
|
||||
|
||||
if TYPE_CHECKING:
|
||||
@@ -20,6 +27,7 @@ async def _aiter(events: list[AgentEvent]) -> AsyncIterator[AgentEvent]:
|
||||
|
||||
|
||||
async def test_render_reasoning_and_text(capsys: pytest.CaptureFixture[str]) -> None:
|
||||
set_markdown_enabled(False)
|
||||
await render_events(
|
||||
_aiter(
|
||||
[
|
||||
@@ -33,12 +41,14 @@ async def test_render_reasoning_and_text(capsys: pytest.CaptureFixture[str]) ->
|
||||
assert "think" in out
|
||||
assert "assistant: " in out
|
||||
assert "hello" in out
|
||||
set_markdown_enabled(True)
|
||||
|
||||
|
||||
async def test_tool_result_preview_vs_verbose(capsys: pytest.CaptureFixture[str]) -> None:
|
||||
long = "x" * 200
|
||||
msg = ToolChatMessage(content=long, tool_call_id="1")
|
||||
set_verbose_tool_results(False)
|
||||
set_markdown_enabled(False)
|
||||
await render_events(_aiter([ToolResultEvent(message=msg)]))
|
||||
out = capsys.readouterr().out
|
||||
assert "…" in out
|
||||
@@ -49,3 +59,49 @@ async def test_tool_result_preview_vs_verbose(capsys: pytest.CaptureFixture[str]
|
||||
out2 = capsys.readouterr().out
|
||||
assert long in out2
|
||||
set_verbose_tool_results(False)
|
||||
set_markdown_enabled(True)
|
||||
|
||||
|
||||
async def test_markdown_off_keeps_plain_stream(
|
||||
capsys: pytest.CaptureFixture[str],
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
monkeypatch.setattr("plyngent.cli.display.markdown_render_available", lambda: True)
|
||||
set_markdown_enabled(False)
|
||||
await render_events(_aiter([TextDeltaEvent(content="**bold**")]))
|
||||
out = capsys.readouterr().out
|
||||
assert "**bold**" in out
|
||||
set_markdown_enabled(True)
|
||||
|
||||
|
||||
async def test_markdown_on_replaces_with_rich(
|
||||
capsys: pytest.CaptureFixture[str],
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
monkeypatch.setattr("plyngent.cli.display.markdown_render_available", lambda: True)
|
||||
set_markdown_enabled(True)
|
||||
await render_events(_aiter([TextDeltaEvent(content="hello **world**")]), markdown=True)
|
||||
out = capsys.readouterr().out
|
||||
# Rich markdown renders emphasis; raw ** markers should not remain as the sole form.
|
||||
assert "assistant:" in out or "assistant: " in out
|
||||
assert "world" in out
|
||||
|
||||
|
||||
def test_print_markdown_renders(capsys: pytest.CaptureFixture[str]) -> None:
|
||||
print_markdown("# Title\n\n`code`", label="assistant: ")
|
||||
out = capsys.readouterr().out
|
||||
assert "Title" in out
|
||||
assert "code" in out
|
||||
|
||||
|
||||
def test_markdown_flags_roundtrip() -> None:
|
||||
set_markdown_enabled(False)
|
||||
assert get_markdown_enabled() is False
|
||||
set_markdown_enabled(True)
|
||||
assert get_markdown_enabled() is True
|
||||
|
||||
|
||||
def test_markdown_render_available_respects_plain_env(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
monkeypatch.setenv("PLYNGENT_PLAIN", "1")
|
||||
assert markdown_render_available() is False
|
||||
monkeypatch.delenv("PLYNGENT_PLAIN", raising=False)
|
||||
|
||||
Reference in New Issue
Block a user