my-gradio-app / ui /handlers.py
Nguyen Trong Lap
Recreate history without binary blobs
eeb0f9c
import base64
from utils.helpers import chat_logic
import uuid
from pathlib import Path
from auth.auth import (
register_user, login_user, logout_user, load_history, save_message, clear_history
)
from health_data import HealthContext, HealthDataStore
from health_analysis import HealthAnalyzer
from fitness_tracking import FitnessTracker
from utils.speech_recognition import transcribe_speech
import gradio as gr
import logging
import threading
import time
logger = logging.getLogger(__name__)
# Dictionary to store user IDs for each agent type
user_sessions = {}
data_store = HealthDataStore()
# Global state for voice recording
voice_recording_state = {
"is_recording": False,
"lock": threading.Lock()
}
# Global state for voice recording
voice_recording_state = {
"is_recording": False,
"lock": threading.Lock()
}
def setup_handlers(message, chatbot, submit_btn, clear_btn, session, audio_input=None):
"""Setup event handlers for hybrid Gradio + ModelScope chatbot"""
def agent_chat_handler(user_input, chatbot_value):
username = session.value.get("user")
user_id = username
# Nếu chưa có dữ liệu, khởi tạo list messages
if not chatbot_value:
chatbot_value = []
# Lưu history cũ (không có user message mới)
old_history = chatbot_value.copy()
# Thêm user message dưới dạng ChatbotDataMessage để hiển thị
from modelscope_studio.components.pro.chatbot import ChatbotDataMessage
user_message = ChatbotDataMessage(
role="user",
content=user_input
)
chatbot_value.append(user_message)
# Hiện bot đang xử lý
pending_message = ChatbotDataMessage(
role="assistant",
content="",
loading=True,
status="pending"
)
chatbot_value.append(pending_message)
yield gr.update(value=""), gr.update(value=chatbot_value)
# Gọi logic backend với history cũ (không có user message mới)
try:
# chat_logic sẽ tự thêm user message vào history
_, updated_chat_history = chat_logic(
user_input, old_history, user_id=user_id)
time.sleep(0.2)
# Cập nhật toàn bộ chatbot_value với kết quả mới
if updated_chat_history and len(updated_chat_history) > 0:
last_message = updated_chat_history[-1]
# Cập nhật pending message cuối cùng thành response
chatbot_value[-1] = last_message
if username:
save_message(username, user_input)
if hasattr(last_message, 'content') and last_message.role == 'assistant':
save_message(username, last_message.content)
except Exception as e:
# Xử lý lỗi bằng cách cập nhật tin nhắn cuối
if chatbot_value and len(chatbot_value) > 0:
from modelscope_studio.components.pro.chatbot import ChatbotDataMessage
error_message = ChatbotDataMessage(
role="assistant",
content=f"❌ Lỗi xử lý: {str(e)}"
)
chatbot_value[-1] = error_message
yield gr.update(value=""), gr.update(value=chatbot_value)
def welcome_prompt_select(chatbot_value, e: gr.EventData):
prompt_text = e._data["payload"][0]["value"]["description"]
return gr.update(value=prompt_text)
# Bind submit button & textbox event
message.submit(agent_chat_handler, [message, chatbot], [message, chatbot])
submit_btn.click(agent_chat_handler, [
message, chatbot], [message, chatbot])
chatbot.welcome_prompt_select(fn=welcome_prompt_select,
inputs=[chatbot],
outputs=[message])
# Clear chat
def clear_chat():
username = session.value.get("user")
if username:
clear_history(username)
# Return sample messages to demonstrate features
from utils.helpers import create_sample_chatbot_messages
return gr.update(value=create_sample_chatbot_messages())
clear_btn.click(clear_chat, None, chatbot)
# Speech input handler (nếu có audio)
if audio_input:
def handle_speech_input(audio_filepath):
if not audio_filepath:
return gr.update()
try:
time.sleep(0.2)
transcribed_text = transcribe_speech(audio_filepath)
current_text = message.value or ""
updated_text = (current_text + " " + transcribed_text).strip()
return gr.update(value=updated_text), gr.update(value=None)
except Exception as e:
print(f"Speech transcription error: {str(e)}")
return gr.update(), gr.update(value=None)
audio_input.change(handle_speech_input,
inputs=[audio_input],
outputs=[message, audio_input])
def handle_load_history(u):
history = load_history(u)
# If no history exists, return sample messages to demonstrate features
if not history:
from utils.helpers import create_sample_chatbot_messages
return create_sample_chatbot_messages()
return history
def handle_login(u, p, state):
success, msg = login_user(u, p)
if success:
state.value["user"] = u
return True, msg, u
return False, msg, []
def handle_register(u, p, state):
success, msg = register_user(u, p)
return success, msg
def handle_logout(state):
logout_user(state)
return ""
def create_health_dashboard(user_id):
"""Create health dashboard with insights from health context"""
if not user_id:
return {
'health_score': 0,
'risks': [],
'fitness_metrics': {},
'health_history': []
}
try:
health_context = HealthContext(user_id, data_store)
analyzer = HealthAnalyzer(health_context)
tracker = FitnessTracker(health_context)
# Calculate health metrics
health_score = analyzer.calculate_health_score()
risks = analyzer.identify_health_risks()
fitness_metrics = tracker.calculate_progress_metrics()
# Get health history
health_history = health_context.get_health_history()
return {
'health_score': health_score,
'risks': risks,
'fitness_metrics': fitness_metrics,
'health_history': health_history,
'profile': health_context.get_user_profile().to_dict()
}
except Exception as e:
print(f"Error creating health dashboard: {e}")
return {
'health_score': 0,
'risks': [],
'fitness_metrics': {},
'health_history': [],
'error': str(e)
}