File size: 4,311 Bytes
b931367
 
 
 
 
 
 
 
 
 
 
 
439ab17
b931367
439ab17
b931367
 
 
 
 
 
 
 
 
 
 
439ab17
b931367
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
439ab17
 
 
 
 
 
 
b931367
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
112
113
114
115
116
import gradio as gr
import uuid
from datetime import datetime
import pandas as pd
from model_handler import ModelHandler
from tab_chat import create_chat_tab
from tab_code import create_code_tab
from tab_smart_writer import create_smart_writer_tab
from tab_test import run_model_handler_test, run_clear_chat_test

def get_history_df(history):
    if not history:
        return pd.DataFrame({'ID': [], '对话': []})
    df = pd.DataFrame(history)
    return df[['id', 'title']].rename(columns={'id': 'ID', 'title': '对话'})

def on_app_load(history, conv_id):
    """
    Handles the application's initial state on load.
    - If no history exists, creates a new conversation.
    - If the last conversation ID is invalid, loads the most recent one.
    - Otherwise, loads the last active conversation.
    """
    if not history:
        # First time ever loading, create a new chat
        conv_id = str(uuid.uuid4())
        new_convo = { "id": conv_id, "title": "(新对话)", "messages": [], "timestamp": datetime.now().isoformat() }
        history = [new_convo]
        return conv_id, history, gr.update(value=get_history_df(history)), []

    # Check if the last used conv_id is valid
    if conv_id and any(c["id"] == conv_id for c in history):
        # It's valid, load it
        for convo in history:
            if convo["id"] == conv_id:
                return conv_id, history, gr.update(value=get_history_df(history)), convo["messages"]
    
    # Last used conv_id is invalid or doesn't exist, load the most recent conversation
    most_recent_convo = history[0] # Assumes history is sorted by timestamp desc
    conv_id = most_recent_convo["id"]
    return conv_id, history, gr.update(value=get_history_df(history)), most_recent_convo["messages"]

    
CSS = """

#chatbot {
  height: calc(100vh - 21px - 16px);
  max-height: 1500px;
}

footer { 
    display: none !important; 
}

/* Disable transition and animation for no-transition class */
.no-transition, .no-transition * {
    transition: none !important;
    animation: none !important;
    animation-play-state: paused !important;
}
"""

if __name__ == "__main__":
    # Instantiate the model handler with the configuration
    model_handler = ModelHandler()

    with gr.Blocks(theme=gr.themes.Soft(),
                   css=CSS,
                   head="",
                   head_paths=['./static/toastify.html', './static/app.html'],
                   fill_height=True,
                   fill_width=True) as demo:
        with gr.Tabs(elem_id='indicator-space-app') as tabs:

            with gr.TabItem("文本聊天") as chat_tab:
                conversation_store, current_conversation_id, history_df, chatbot = create_chat_tab()

            chat_tab.select(
                fn=None,
                js="() => {window.dispatchEvent(new CustomEvent('tabSelect.chat')); console.log('this'); return null;}",
            )

            with gr.TabItem("代码生成") as code_tab:
                create_code_tab()

            code_tab.select(
                fn=None,
                js="() => {window.dispatchEvent(new CustomEvent('tabSelect.code')); return null;}",
            )

            with gr.TabItem("写作助手") as writer_tab:
                create_smart_writer_tab()

            writer_tab.select(
                fn=None,
                js="() => {window.dispatchEvent(new CustomEvent('tabSelect.writing')); return null;}",
            )

            with gr.TabItem("测试"):
                gr.Markdown("# 功能测试")
                with gr.Column():
                    test_log_output = gr.Textbox(label="测试日志", interactive=False, lines=10)
                    gr.Button("运行 ModelHandler 测试").click(run_model_handler_test, outputs=test_log_output)
                    gr.Button("运行 清除聊天 测试").click(run_clear_chat_test, outputs=test_log_output)

        # Bind on_app_load to demo.load
        demo.load(
            on_app_load,
            inputs=[conversation_store, current_conversation_id],
            outputs=[current_conversation_id, conversation_store, history_df, chatbot],
            js="() => {window.dispatchEvent(new CustomEvent('appStart')); console.log('appStart'); return {};}"
        )

    # Launch the Gradio application
    demo.launch()