Hbin-Zhuang
✨ 优化app.py
fb6a933
"""
智能对话Tab组件
处理与文档内容的智能对话界面
"""
from typing import Any, Dict, List
import gradio as gr
from src.presentation.controllers.ui_controller import TabController
class ChatTabController(TabController):
"""智能对话Tab控制器
管理聊天界面、消息输入和对话历史
"""
def __init__(self, chat_service, logger):
"""初始化对话Tab控制器
Args:
chat_service: 聊天服务实例
logger: 日志服务实例
"""
super().__init__("chat_tab", "💬 智能对话")
self.chat_service = chat_service
self.logger = logger
def create_components(self) -> Dict[str, Any]:
"""创建对话Tab的UI组件"""
return {}
def setup_events(self) -> List[Dict[str, Any]]:
"""设置事件绑定配置"""
return [
{
"component": "msg",
"event": "submit",
"handler": "chat_with_documents",
"inputs": ["msg", "chatbot"],
"outputs": ["chatbot", "msg"]
},
{
"component": "send_btn",
"event": "click",
"handler": "chat_with_documents",
"inputs": ["msg", "chatbot"],
"outputs": ["chatbot", "msg"]
},
{
"component": "clear_btn",
"event": "click",
"handler": "clear_chat",
"inputs": [],
"outputs": ["chatbot"]
}
]
def _render_content(self) -> None:
"""渲染对话Tab页面内容"""
gr.Markdown("## 与文档内容对话")
gr.Markdown("提示: 请先上传并处理 PDF 文件,然后在此提问")
self.components["chatbot"] = gr.Chatbot(
label="对话历史",
height=400
)
with gr.Row():
self.components["msg"] = gr.Textbox(
label="输入您的问题",
placeholder="请输入您想要询问的问题...",
lines=3,
scale=4
)
with gr.Column(scale=1):
self.components["send_btn"] = gr.Button("发送", variant="primary")
self.components["clear_btn"] = gr.Button("清除对话")
def get_event_handlers(self):
"""获取事件处理函数"""
return {
"chat_with_documents": self._chat_with_documents,
"clear_chat": self._clear_chat
}
def _chat_with_documents(self, message, history):
"""与文档对话"""
try:
if not message.strip():
return history, ""
self.logger.info(f"处理用户问题: {message}")
# 使用正确的方法名 chat_with_pdf
response, updated_history = self.chat_service.chat_with_pdf(message, history or [])
return updated_history, ""
except Exception as e:
self.logger.error(f"对话处理失败: {e}")
error_response = f"抱歉,处理您的问题时发生错误: {str(e)}"
history = history or []
history.append([message, error_response])
return history, ""
def _clear_chat(self):
"""清空对话"""
try:
self.chat_service.clear_conversation_history()
return []
except Exception as e:
self.logger.error(f"清空对话失败: {e}")
return []