import time from typing import Any, Callable, Dict, List from rich.console import Console from rich.live import Live from rich.panel import Panel from rich.progress import Progress, SpinnerColumn, TextColumn from rich.table import Table from rich.text import Text class Formatter: """ A class for formatting and printing rich text to the console. """ def __init__(self): """ Initializes the Formatter with a Rich Console instance. """ self.console = Console() def print_panel( self, content: str, title: str = "", style: str = "bold blue" ) -> None: """ Prints a rich panel to the console with a random color. Args: content (str): The content of the panel. title (str, optional): The title of the panel. Defaults to "". style (str, optional): The style of the panel. Defaults to "bold blue". """ import random colors = [ "red", "green", "blue", "yellow", "magenta", "cyan", "white", ] random_color = random.choice(colors) panel = Panel( content, title=title, style=f"bold {random_color}" ) self.console.print(panel) def print_table( self, title: str, data: Dict[str, List[str]] ) -> None: """ Prints a rich table to the console. Args: title (str): The title of the table. data (Dict[str, List[str]]): A dictionary where keys are categories and values are lists of capabilities. """ table = Table(show_header=True, header_style="bold magenta") table.add_column("Category", style="cyan") table.add_column("Capabilities", style="green") for category, items in data.items(): table.add_row(category, "\n".join(items)) self.console.print(f"\n🔥 {title}:", style="bold yellow") self.console.print(table) def print_progress( self, description: str, task_fn: Callable, *args: Any, **kwargs: Any, ) -> Any: """ Prints a progress bar to the console and executes a task function. Args: description (str): The description of the task. task_fn (Callable): The function to execute. *args (Any): Arguments to pass to the task function. **kwargs (Any): Keyword arguments to pass to the task function. Returns: Any: The result of the task function. """ with Progress( SpinnerColumn(), TextColumn("[progress.description]{task.description}"), ) as progress: task = progress.add_task(description, total=None) result = task_fn(*args, **kwargs) progress.update(task, completed=True) return result def print_panel_token_by_token( self, tokens: str, title: str = "Output", style: str = "bold cyan", delay: float = 0.01, by_word: bool = False, ) -> None: """ Prints a string in real-time, token by token (character or word) inside a Rich panel. Args: tokens (str): The string to display in real-time. title (str): Title of the panel. style (str): Style for the text inside the panel. delay (float): Delay in seconds between displaying each token. by_word (bool): If True, display by words; otherwise, display by characters. """ text = Text(style=style) # Split tokens into characters or words token_list = tokens.split() if by_word else tokens with Live( Panel(text, title=title, border_style=style), console=self.console, refresh_per_second=10, ) as live: for token in token_list: text.append(token + (" " if by_word else "")) live.update( Panel(text, title=title, border_style=style) ) time.sleep(delay) formatter = Formatter()