| """Utility functions for displaying messages and prompts in Jupyter notebooks.""" |
|
|
| import json |
|
|
| from rich.console import Console |
| from rich.panel import Panel |
| from rich.text import Text |
|
|
| console = Console() |
|
|
|
|
| def format_message_content(message): |
| """Convert message content to displayable string.""" |
| parts = [] |
| tool_calls_processed = False |
|
|
| |
| if isinstance(message.content, str): |
| parts.append(message.content) |
| elif isinstance(message.content, list): |
| |
| for item in message.content: |
| if item.get("type") == "text": |
| parts.append(item["text"]) |
| elif item.get("type") == "tool_use": |
| parts.append(f"\nπ§ Tool Call: {item['name']}") |
| parts.append(f" Args: {json.dumps(item['input'], indent=2)}") |
| parts.append(f" ID: {item.get('id', 'N/A')}") |
| tool_calls_processed = True |
| else: |
| parts.append(str(message.content)) |
|
|
| |
| if ( |
| not tool_calls_processed |
| and hasattr(message, "tool_calls") |
| and message.tool_calls |
| ): |
| for tool_call in message.tool_calls: |
| parts.append(f"\nπ§ Tool Call: {tool_call['name']}") |
| parts.append(f" Args: {json.dumps(tool_call['args'], indent=2)}") |
| parts.append(f" ID: {tool_call['id']}") |
|
|
| return "\n".join(parts) |
|
|
|
|
| def format_messages(messages): |
| """Format and display a list of messages with Rich formatting.""" |
| for m in messages: |
| msg_type = m.__class__.__name__.replace("Message", "") |
| content = format_message_content(m) |
|
|
| if msg_type == "Human": |
| console.print(Panel(content, title="π§ Human", border_style="blue")) |
| elif msg_type == "Ai": |
| console.print(Panel(content, title="π€ Assistant", border_style="green")) |
| elif msg_type == "Tool": |
| console.print(Panel(content, title="π§ Tool Output", border_style="yellow")) |
| else: |
| console.print(Panel(content, title=f"π {msg_type}", border_style="white")) |
|
|
|
|
| def format_message(messages): |
| """Alias for format_messages for backward compatibility.""" |
| return format_messages(messages) |
|
|
|
|
| def show_prompt(prompt_text: str, title: str = "Prompt", border_style: str = "blue"): |
| """Display a prompt with rich formatting and XML tag highlighting. |
| |
| Args: |
| prompt_text: The prompt string to display |
| title: Title for the panel (default: "Prompt") |
| border_style: Border color style (default: "blue") |
| """ |
| |
| formatted_text = Text(prompt_text) |
| formatted_text.highlight_regex(r"<[^>]+>", style="bold blue") |
| formatted_text.highlight_regex( |
| r"##[^#\n]+", style="bold magenta" |
| ) |
| formatted_text.highlight_regex( |
| r"###[^#\n]+", style="bold cyan" |
| ) |
|
|
| |
| console.print( |
| Panel( |
| formatted_text, |
| title=f"[bold green]{title}[/bold green]", |
| border_style=border_style, |
| padding=(1, 2), |
| ) |
| ) |
|
|