File size: 3,837 Bytes
8a0016a
e061ff7
 
 
8a0016a
e061ff7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8a0016a
 
e061ff7
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import gradio as gr
import os
import uuid
from chat_3 import Chat

# Function to initialize a new session and create chatbot instance for that session
def initialize_session():
    session_id = str(uuid.uuid4())[:8]  # Generate unique session ID
    chatbot = Chat()  # Create a new Chat instance for this session
    # chatbot = Chat("gemini-2.0-flash")
    history = []  # Initialize history for this session
    return "", session_id, chatbot, history  # "" for clearing input

# Function to handle user input and chatbot response
def chat_function(prompt, history, session_id, chatbot):
    if chatbot is None:
        return history, "", session_id, chatbot  # Skip if chatbot not ready

    # Append the user's input to the message history
    history.append({"role": "user", "content": prompt})

    # Get the response from the chatbot
    response = chatbot.chat(prompt)

    # Append the assistant's response to the message history
    history.append({"role": "assistant", "content": response})

    return history, "", session_id, chatbot  # Clear input

# Function to save feedback with chat history
def send_feedback(feedback, history, session_id, chatbot):
    os.makedirs("app/feedback", exist_ok=True)  # Create folder if not exists
    filename = f"app/feedback/feedback_{session_id}.txt"
    with open(filename, "a", encoding="utf-8") as f:
        f.write("=== Feedback Received ===\n")
        f.write(f"Session ID: {session_id}\n")
        f.write(f"Feedback: {feedback}\n")
        f.write("Chat History:\n")
        for msg in history:
            f.write(f"{msg['role']}: {msg['content']}\n")
        f.write("\n--------------------------\n\n")
    return ""  # Clear feedback input

# Create the Gradio interface
with gr.Blocks(theme=gr.themes.Soft(primary_hue="pink")) as demo:
    gr.Markdown("# Hey Beauty Chatbot 🧖🏻‍♀️✨🌿")
    gr.Markdown("สวัสดีค่ะ Hey Beauty ยินดีให้บริการค่ะ")

    # Initialize State
    session_state = gr.State()
    chatbot_instance = gr.State()
    chatbot_history = gr.State([])

    # Chat UI
    chatbot_interface = gr.Chatbot(type="messages", label="Chat History")
    user_input = gr.Textbox(placeholder="Type your message here...", elem_id="user_input", lines=1)

    submit_button = gr.Button("Send")
    clear_button = gr.Button("Delete Chat History")

    # Submit actions
    submit_button.click(
        fn=chat_function,
        inputs=[user_input, chatbot_history, session_state, chatbot_instance],
        outputs=[chatbot_interface, user_input, session_state, chatbot_instance]
    )

    user_input.submit(
        fn=chat_function,
        inputs=[user_input, chatbot_history, session_state, chatbot_instance],
        outputs=[chatbot_interface, user_input, session_state, chatbot_instance]
    )

    # # Clear history
    # clear_button.click(lambda: [], outputs=chatbot_interface)
    clear_button.click(
        fn=initialize_session,
        inputs=[],
        outputs=[user_input, session_state, chatbot_instance, chatbot_history]
    ).then(
        fn=lambda: gr.update(value=[]),
        inputs=[],
        outputs=chatbot_interface
    )


    # Feedback section
    with gr.Row():
        feedback_input = gr.Textbox(placeholder="Send us feedback...", label="💬 Feedback")
        send_feedback_button = gr.Button("Send Feedback")

    send_feedback_button.click(
        fn=send_feedback,
        inputs=[feedback_input, chatbot_history, session_state, chatbot_instance],
        outputs=[feedback_input]
    )

    # Initialize session on load
    demo.load(
        fn=initialize_session,
        inputs=[],
        outputs=[user_input, session_state, chatbot_instance, chatbot_history]
    )

if __name__ == "__main__":
    # Launch
    demo.launch(share=True)
    # demo.launch()