Spaces:
Running on CPU Upgrade
Running on CPU Upgrade
Commit ·
331c683
1
Parent(s): 3d9f156
Buffer streamed chunks and render full markdown on completion
Browse files- agent/main.py +5 -17
- agent/utils/terminal_display.py +8 -12
agent/main.py
CHANGED
|
@@ -212,35 +212,23 @@ class _ThinkingShimmer:
|
|
| 212 |
|
| 213 |
|
| 214 |
class _StreamBuffer:
|
| 215 |
-
"""
|
| 216 |
|
| 217 |
def __init__(self, console):
|
| 218 |
self._console = console
|
| 219 |
self._buffer = ""
|
| 220 |
-
self._started = False
|
| 221 |
|
| 222 |
def add_chunk(self, text: str):
|
| 223 |
self._buffer += text
|
| 224 |
-
# Flush every complete line
|
| 225 |
-
while "\n" in self._buffer:
|
| 226 |
-
line, self._buffer = self._buffer.split("\n", 1)
|
| 227 |
-
if not self._started:
|
| 228 |
-
self._console.print() # blank line before first output
|
| 229 |
-
self._started = True
|
| 230 |
-
self._console.print(line)
|
| 231 |
|
| 232 |
def finish(self):
|
| 233 |
-
"""
|
| 234 |
if self._buffer.strip():
|
| 235 |
-
|
| 236 |
-
self._console.print()
|
| 237 |
-
self._console.print(self._buffer)
|
| 238 |
self._buffer = ""
|
| 239 |
-
self._started = False
|
| 240 |
|
| 241 |
def discard(self):
|
| 242 |
self._buffer = ""
|
| 243 |
-
self._started = False
|
| 244 |
|
| 245 |
|
| 246 |
async def event_listener(
|
|
@@ -271,11 +259,11 @@ async def event_listener(
|
|
| 271 |
if content:
|
| 272 |
print_markdown(content)
|
| 273 |
elif event.event_type == "assistant_chunk":
|
| 274 |
-
shimmer.stop()
|
| 275 |
content = event.data.get("content", "") if event.data else ""
|
| 276 |
if content:
|
| 277 |
stream_buf.add_chunk(content)
|
| 278 |
elif event.event_type == "assistant_stream_end":
|
|
|
|
| 279 |
stream_buf.finish()
|
| 280 |
elif event.event_type == "tool_call":
|
| 281 |
shimmer.stop()
|
|
@@ -942,11 +930,11 @@ async def headless_main(prompt: str, model: str | None = None) -> None:
|
|
| 942 |
event = await event_queue.get()
|
| 943 |
|
| 944 |
if event.event_type == "assistant_chunk":
|
| 945 |
-
shimmer.stop()
|
| 946 |
content = event.data.get("content", "") if event.data else ""
|
| 947 |
if content:
|
| 948 |
stream_buf.add_chunk(content)
|
| 949 |
elif event.event_type == "assistant_stream_end":
|
|
|
|
| 950 |
stream_buf.finish()
|
| 951 |
elif event.event_type == "assistant_message":
|
| 952 |
shimmer.stop()
|
|
|
|
| 212 |
|
| 213 |
|
| 214 |
class _StreamBuffer:
|
| 215 |
+
"""Accumulates streamed tokens, renders full markdown on finish."""
|
| 216 |
|
| 217 |
def __init__(self, console):
|
| 218 |
self._console = console
|
| 219 |
self._buffer = ""
|
|
|
|
| 220 |
|
| 221 |
def add_chunk(self, text: str):
|
| 222 |
self._buffer += text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 223 |
|
| 224 |
def finish(self):
|
| 225 |
+
"""Render the accumulated text as markdown, then reset."""
|
| 226 |
if self._buffer.strip():
|
| 227 |
+
print_markdown(self._buffer)
|
|
|
|
|
|
|
| 228 |
self._buffer = ""
|
|
|
|
| 229 |
|
| 230 |
def discard(self):
|
| 231 |
self._buffer = ""
|
|
|
|
| 232 |
|
| 233 |
|
| 234 |
async def event_listener(
|
|
|
|
| 259 |
if content:
|
| 260 |
print_markdown(content)
|
| 261 |
elif event.event_type == "assistant_chunk":
|
|
|
|
| 262 |
content = event.data.get("content", "") if event.data else ""
|
| 263 |
if content:
|
| 264 |
stream_buf.add_chunk(content)
|
| 265 |
elif event.event_type == "assistant_stream_end":
|
| 266 |
+
shimmer.stop()
|
| 267 |
stream_buf.finish()
|
| 268 |
elif event.event_type == "tool_call":
|
| 269 |
shimmer.stop()
|
|
|
|
| 930 |
event = await event_queue.get()
|
| 931 |
|
| 932 |
if event.event_type == "assistant_chunk":
|
|
|
|
| 933 |
content = event.data.get("content", "") if event.data else ""
|
| 934 |
if content:
|
| 935 |
stream_buf.add_chunk(content)
|
| 936 |
elif event.event_type == "assistant_stream_end":
|
| 937 |
+
shimmer.stop()
|
| 938 |
stream_buf.finish()
|
| 939 |
elif event.event_type == "assistant_message":
|
| 940 |
shimmer.stop()
|
agent/utils/terminal_display.py
CHANGED
|
@@ -29,19 +29,15 @@ def print_banner() -> None:
|
|
| 29 |
Y = "\033[38;2;255;200;50m" # HF yellow
|
| 30 |
D = "\033[38;2;180;140;40m" # dimmer gold for accents
|
| 31 |
R = "\033[0m"
|
| 32 |
-
art =
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
f"{D} __/ | __/ | __/ | __/ | {R}\n"
|
| 40 |
-
f"{D} |___/ |___/ |___/ |___/ {R}"
|
| 41 |
-
)
|
| 42 |
-
_console.print()
|
| 43 |
_console.print(art, highlight=False)
|
| 44 |
-
_console.print(
|
| 45 |
|
| 46 |
|
| 47 |
# ── Init progress ──────────────────────────────────────────────────────
|
|
|
|
| 29 |
Y = "\033[38;2;255;200;50m" # HF yellow
|
| 30 |
D = "\033[38;2;180;140;40m" # dimmer gold for accents
|
| 31 |
R = "\033[0m"
|
| 32 |
+
art = f"""
|
| 33 |
+
{Y} _ _ _ ___ _ _ {R}
|
| 34 |
+
{Y}| || |_ _ __ _ __ _(_)_ _ __ _ | __|_ _ __ ___ /_\\ __ _ ___ _ _| |_ {R}
|
| 35 |
+
{Y}| __ | || / _` / _` | | ' \\/ _` | | _/ _` / _/ -_) / _ \\/ _` / -_) ' \\ _|{R}
|
| 36 |
+
{Y}|_||_|\\_,_\\__, \\__, |_|_||_\\__, | |_|\\__,_\\__\\___| /_/ \\_\\__, \\___|_||_\\__|{R}
|
| 37 |
+
{D} |___/|___/ |___/ |___/ {R}
|
| 38 |
+
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
_console.print(art, highlight=False)
|
| 40 |
+
_console.print(" [dim]🤗 /help for commands · /quit to exit[/dim]\n")
|
| 41 |
|
| 42 |
|
| 43 |
# ── Init progress ──────────────────────────────────────────────────────
|