File size: 3,654 Bytes
8e5a9dd
 
 
2991e79
8e5a9dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
109
110
111
import os
os.environ["OTEL_TRACES_EXPORTER"] = "none"

import gradio as gr
import uuid
from utils.chat import ChatLaborLaw


# Function to initialize a new session and create chatbot instance for that session
async def initialize_session():
    session_id = str(uuid.uuid4())[:8]
    chatbot = ChatLaborLaw()
    # chatbot = Chat("gemini-2.0-flash")
    history = []
    return "", session_id, chatbot, history


# Function to handle user input and chatbot response
async 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 = await chatbot.chat(prompt)  # ใช้ await ได้แล้ว
    
    # Append the assistant's response to the message history
    history.append({"role": "assistant", "content": response})
    
    return history, "", session_id, chatbot


# Function to save feedback with chat history
async def send_feedback(feedback, history, session_id, chatbot):
    os.makedirs("app/feedback", exist_ok=True)
    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="amber")) as demo:
    gr.Markdown("# สอบถามเรื่องกฎหมายแรงงาน")

    # 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]
    )

# Launch
demo.launch(share=True)