41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
from rich.console import Console
|
|
from rich.markdown import Markdown
|
|
from rich.panel import Panel
|
|
from rich.live import Live
|
|
from rich.text import Text
|
|
from rich.syntax import Syntax
|
|
from typing import Optional
|
|
|
|
console = Console()
|
|
|
|
def print_markdown(text: str):
|
|
console.print(Markdown(text))
|
|
|
|
def print_panel(text: str, title: Optional[str] = None, style: str = "blue"):
|
|
console.print(Panel(text, title=title, border_style=style))
|
|
|
|
def print_error(text: str):
|
|
console.print(f"[bold red]Error:[/bold red] {text}")
|
|
|
|
def print_status(text: str):
|
|
console.print(f"[bold blue]>>>[/bold blue] {text}")
|
|
|
|
class StreamingDisplay:
|
|
def __init__(self, title: Optional[str] = None):
|
|
self.text = ""
|
|
self.live = Live(Text(self.text), refresh_per_second=10)
|
|
self.title = title
|
|
|
|
def __enter__(self):
|
|
self.live.start()
|
|
return self
|
|
|
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
self.live.stop()
|
|
|
|
def update(self, chunk: str):
|
|
self.text += chunk
|
|
# Try to parse markdown if it looks complete-ish, otherwise just show text
|
|
# For performance, we might just show raw text during streaming
|
|
self.live.update(Markdown(self.text) if "```" in self.text else Text(self.text))
|