mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-05-20 08:32:25 +00:00
fix(cli): handle retry-wait messages in interactive mode
This commit is contained in:
parent
3231aaf9ee
commit
4d7bf5bb8a
@ -235,22 +235,22 @@ def _print_cli_progress_line(text: str, thinking: ThinkingSpinner | None) -> Non
|
|||||||
console.print(f" [dim]↳ {text}[/dim]")
|
console.print(f" [dim]↳ {text}[/dim]")
|
||||||
|
|
||||||
|
|
||||||
async def _print_interactive_progress_line(text: str, thinking: ThinkingSpinner | None) -> None:
|
async def _print_interactive_progress_line(text: str, renderer: StreamRenderer | None) -> None:
|
||||||
"""Print an interactive progress line, pausing the spinner if needed."""
|
"""Print an interactive progress line, pausing the renderer's spinner if needed."""
|
||||||
if not text.strip():
|
if not text.strip():
|
||||||
return
|
return
|
||||||
with thinking.pause() if thinking else nullcontext():
|
with renderer.pause() if renderer else nullcontext():
|
||||||
await _print_interactive_line(text)
|
await _print_interactive_line(text)
|
||||||
|
|
||||||
|
|
||||||
async def _maybe_print_interactive_progress(
|
async def _maybe_print_interactive_progress(
|
||||||
msg: Any,
|
msg: Any,
|
||||||
thinking: ThinkingSpinner | None,
|
renderer: StreamRenderer | None,
|
||||||
channels_config: Any,
|
channels_config: Any,
|
||||||
) -> bool:
|
) -> bool:
|
||||||
metadata = msg.metadata or {}
|
metadata = msg.metadata or {}
|
||||||
if metadata.get("_retry_wait"):
|
if metadata.get("_retry_wait"):
|
||||||
await _print_interactive_progress_line(msg.content, thinking)
|
await _print_interactive_progress_line(msg.content, renderer)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
if not metadata.get("_progress"):
|
if not metadata.get("_progress"):
|
||||||
@ -262,7 +262,7 @@ async def _maybe_print_interactive_progress(
|
|||||||
if channels_config and not is_tool_hint and not channels_config.send_progress:
|
if channels_config and not is_tool_hint and not channels_config.send_progress:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
await _print_interactive_progress_line(msg.content, thinking)
|
await _print_interactive_progress_line(msg.content, renderer)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
@ -1204,7 +1204,7 @@ def agent(
|
|||||||
|
|
||||||
if await _maybe_print_interactive_progress(
|
if await _maybe_print_interactive_progress(
|
||||||
msg,
|
msg,
|
||||||
_thinking,
|
renderer,
|
||||||
agent_loop.channels_config,
|
agent_loop.channels_config,
|
||||||
):
|
):
|
||||||
continue
|
continue
|
||||||
|
|||||||
@ -134,6 +134,13 @@ class StreamRenderer:
|
|||||||
"""Stop spinner before user input to avoid prompt_toolkit conflicts."""
|
"""Stop spinner before user input to avoid prompt_toolkit conflicts."""
|
||||||
self._stop_spinner()
|
self._stop_spinner()
|
||||||
|
|
||||||
|
def pause(self):
|
||||||
|
"""Context manager: pause spinner for external output. No-op once streaming has started."""
|
||||||
|
from contextlib import nullcontext
|
||||||
|
if self._spinner:
|
||||||
|
return self._spinner.pause()
|
||||||
|
return nullcontext()
|
||||||
|
|
||||||
async def close(self) -> None:
|
async def close(self) -> None:
|
||||||
"""Stop spinner/live without rendering a final streamed round."""
|
"""Stop spinner/live without rendering a final streamed round."""
|
||||||
if self._live:
|
if self._live:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user