import gradio as gr import logging import modelscope_studio.components.pro as pro from modelscope_studio.components.pro.chatbot import ( ChatbotBotConfig, ChatbotDataMessage, ChatbotPromptsConfig, ChatbotUserConfig, ChatbotWelcomeConfig, ChatbotActionConfig ) from modelscope_studio.components.pro.multimodal_input import MultimodalInputUploadConfig logger = logging.getLogger(__name__) def create_header(): """Create the header markdown component and content""" return gr.Markdown( """ # 🏥 Trợ Lý Sức Khỏe AI ### Sức khỏe của bạn cũng là sức khỏe của chúng tôi ⚠️ **Lưu ý:** Đây là tư vấn tham khảo. Hãy gặp bác sĩ cho các vấn đề nghiêm trọng. """ ) def create_chatbot(): """Create the chatbot component with welcome config and prompts""" return pro.Chatbot( value=[], # Start with empty history height=800, # Use flex=1 to fill remaining space elem_style=dict(flex=1, border="1px solid #eee", borderRadius="8px", padding="10px"), welcome_config=ChatbotWelcomeConfig( variant="borderless", icon="https://photoavatarmaker.com/wp-content/uploads/2025/04/doctor-avatar-sample.jpeg", title="Xin chào, tôi là Trợ Lý Sức Khỏe AI", description="Bạn có thể upload hình ảnh và nhập text để bắt đầu.", prompts=ChatbotPromptsConfig( title="Tôi có thể giúp bạn gì hôm nay?", styles={ "list": { "width": '100%', }, "item": { "flex": 1, }, }, items=[{ "label": "📅 Lập kế hoạch", "children": [{ "description": "Giúp tôi lập kế hoạch chế độ ăn uống" }, { "description": "Giúp tôi lập kế hoạch tập luyện" }, { "description": "Giúp tôi lập kế hoạch sức khỏe toàn diện" }] }, { "label": "🏥 Tư vấn sức khỏe", "children": [{ "description": "Tôi bị đau đầu thường xuyên, nên làm gì?" }, { "description": "Làm thế nào để cải thiện giấc ngủ?" }, { "description": "Tôi nên ăn gì để tăng cường miễn dịch?" }] }])), user_config=ChatbotUserConfig( actions=["copy", "edit"], avatar="https://api.dicebear.com/7.x/miniavs/svg?seed=3" ), bot_config=ChatbotBotConfig( header="Trợ Lý Sức Khỏe AI", actions=["copy", "like", "dislike", "retry", ChatbotActionConfig( action="delete", popconfirm=dict( title="Delete the message", description="Are you sure to delete this message?", okButtonProps=dict(danger=True)) ) ], avatar="https://mdn.alipayobjects.com/huamei_iwk9zp/afts/img/A*s5sNRo5LjfQAAAAAAAAAAAAADgCCAQ/fmt.webp" ), ) def create_input_row(): """Create the input block with textbox and submit button inside same container""" with gr.Group(elem_classes=["input-block"]) as block: gr.Markdown("💡 Mô tả chi tiết vấn đề của bạn để nhận được lời khuyên phù hợp nhất", elem_classes=["input-label"]) with gr.Row(elem_classes=["input-row"]): message = gr.Textbox( label="Nhập tin nhắn của bạn", placeholder="Ví dụ: Tôi bị đau đầu thường xuyên, nên làm gì?", elem_classes=["message-input"], scale=9, show_label=False, container=False ) submit_btn = gr.Button("Gửi", variant="primary", scale=1, size="sm") return block, message, submit_btn def create_clear_button(): """Create the clear button as a badge overlay""" clear_btn = gr.Button("Xóa lịch sử", variant="secondary", size="sm", elem_classes=["clear-badge"]) return clear_btn def create_top_header(): """Create the top header""" with gr.Row() as row: welcome_text = gr.Markdown("") login_btn = gr.Button("🔐 Đăng nhập", scale=1, elem_classes=["small-button"]) logout_btn = gr.Button("🔐 Đăng xuất", visible=False, scale=1, elem_classes=["small-button"]) return row, welcome_text, login_btn, logout_btn def create_login_form(): with gr.Column(visible=False, elem_id="login-form", elem_classes=["login-form-container"]) as column: gr.Markdown("## 🔐 Đăng nhập để lưu lịch sử", elem_id="login-title", elem_classes=["login-title"]) username = gr.Textbox( label="👤 Tên đăng nhập", placeholder="Nhập tên đăng nhập...", lines=1, elem_classes=["login-input"]) password = gr.Textbox(label="🔑 Mật khẩu", placeholder="Nhập mật khẩu...", type="password", lines=1, elem_classes=["login-input"]) with gr.Row(elem_classes=["login-buttons"]): login_submit = gr.Button( "Đăng nhập", variant="primary", elem_classes=["login-btn"]) register_btn = gr.Button( "Đăng ký", variant="secondary", elem_classes=["register-btn"]) back_btn = gr.Button("Trở lại", variant="primary", elem_classes=["back-btn"]) status = gr.Textbox(label="Trạng thái", interactive=False, elem_classes=["login-status"]) return column, username, password, login_submit, register_btn, back_btn, status