akseljoonas HF Staff commited on
Commit
331c683
·
1 Parent(s): 3d9f156

Buffer streamed chunks and render full markdown on completion

Browse files
Files changed (2) hide show
  1. agent/main.py +5 -17
  2. agent/utils/terminal_display.py +8 -12
agent/main.py CHANGED
@@ -212,35 +212,23 @@ class _ThinkingShimmer:
212
 
213
 
214
  class _StreamBuffer:
215
- """Buffers streaming tokens, flushes complete lines. No flicker."""
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
- """Print any remaining partial line, then reset."""
234
  if self._buffer.strip():
235
- if not self._started:
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
- f"{Y} _ _ _ ______ ___ _ {R}\n"
34
- f"{Y}| | | | (_) | ___| / _ \\ | | {R}\n"
35
- f"{Y}| |_| |_ _ __ _ __ _ _ _ __ __ _ | |_ __ _ ___ ___ / /_\\ \\ __ _ ___ _ __ | |_ {R}\n"
36
- f"{Y}| _ | | | |/ _` |/ _` | | '_ \\ / _` | | _/ _` |/ __/ _ \\ | _ |/ _` |/ _ \\ '_ \\| __|{R}\n"
37
- f"{Y}| | | | |_| | (_| | (_| | | | | | (_| | | || (_| | (_| __/ | | | | (_| | __/ | | | |_ {R}\n"
38
- f"{Y}\\_| |_/\\__,_|\\__, |\\__, |_|_| |_|\\__, | \\_| \\__,_|\\___\\___| \\_| |_/\\__, |\\___|_| |_|\\__|{R}\n"
39
- f"{D} __/ | __/ | __/ | __/ | {R}\n"
40
- f"{D} |___/ |___/ |___/ |___/ {R}"
41
- )
42
- _console.print()
43
  _console.print(art, highlight=False)
44
- _console.print(f"\n [dim]🤗 /help for commands · /quit to exit[/dim]\n")
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 ──────────────────────────────────────────────────────