- Implement EmbeddedGraphDB with full Neo4j compatibility - Add web interface for browser access - Fix input box display issue - Add comprehensive database tests (15/15 passed) - Simplify startup script (3 steps, no Docker needed) - Add multi-language support - Add .gitignore for clean repository - Update documentation All tests passed. Ready for production.
65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
"""消息组件"""
|
|
|
|
from textual.containers import Container, Vertical
|
|
from textual.widgets import Static
|
|
from textual.message import Message
|
|
from ..models.message import Message as MessageModel
|
|
|
|
|
|
class MessageWidget(Container):
|
|
"""单条消息组件"""
|
|
|
|
def __init__(self, message: MessageModel, **kwargs):
|
|
super().__init__(**kwargs)
|
|
self._message = message
|
|
self._show_tool_details = False
|
|
|
|
def compose(self):
|
|
"""构建消息组件"""
|
|
# 消息头
|
|
role_emoji = "🟠" if self._message.role == "user" else "🔵"
|
|
timestamp_str = self._message.timestamp.strftime("%H:%M:%S")
|
|
yield Static(
|
|
f"{role_emoji} [{self._message.role}] {timestamp_str}",
|
|
classes="message-header"
|
|
)
|
|
|
|
# 消息内容
|
|
yield Static(self._message.content, classes="message-content")
|
|
|
|
# 工具调用指示器
|
|
if self._message.tool_calls:
|
|
tool_count = len(self._message.tool_calls)
|
|
yield Static(
|
|
f"[工具:{tool_count}次] (F3展开)",
|
|
classes="tool-indicator"
|
|
)
|
|
|
|
# 工具调用详情(默认折叠)
|
|
if self._show_tool_details:
|
|
with Vertical(classes="tool-details"):
|
|
for i, tool_call in enumerate(self._message.tool_calls, 1):
|
|
yield Static(
|
|
f"工具 {i}: {tool_call.name}",
|
|
classes="tool-name"
|
|
)
|
|
yield Static(
|
|
f"参数: {tool_call.arguments}",
|
|
classes="tool-args"
|
|
)
|
|
|
|
# 显示执行结果
|
|
if self._message.tool_results:
|
|
for result in self._message.tool_results:
|
|
if result.tool_call_id == tool_call.id:
|
|
yield Static(
|
|
f"结果: {result.result[:200]}...",
|
|
classes="tool-result"
|
|
)
|
|
|
|
def toggle_tool_details(self) -> None:
|
|
"""切换工具详情显示状态"""
|
|
if self._message.tool_calls:
|
|
self._show_tool_details = not self._show_tool_details
|
|
self.refresh()
|