File size: 3,264 Bytes
7780ff1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7272669
 
 
7780ff1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7272669
7780ff1
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
# gradio_demo.py

import gradio as gr
from orchestrator import Orchestrator, DialogueState

# --- 全局配置 ---
MODEL_NAME = "qwen2.5-72b-instruct" 

def create_orchestrator():
    """创建一个新的Orchestrator实例,方便重置。"""
    return Orchestrator(model=MODEL_NAME)

def process_message(user_input, chat_history, orchestrator_state):
    """处理用户输入的核心函数"""
    if orchestrator_state is None:
        orchestrator_state = create_orchestrator()

    response = orchestrator_state.process_user_message(user_input)
    chat_history.append({"role": "user", "content": user_input})
    chat_history.append({"role": "assistant", "content": response})
    print(chat_history)
    new_state_text = f"当前状态: {orchestrator_state.state.name}"
    
    return chat_history, orchestrator_state, new_state_text, ""

def reset_conversation():
    """
    【核心功能】重置会话的函数。
    它会创建一个全新的Orchestrator实例,并清空前端UI。
    """
    new_orchestrator = create_orchestrator()
    initial_state_text = f"当前状态: {new_orchestrator.state.name}"
    
    # 返回一个元组,用于清空和重置UI组件
    return [], new_orchestrator, initial_state_text, ""

# --- 构建Gradio界面 ---
with gr.Blocks(theme=gr.themes.Soft(), title="运筹优化对话平台") as demo:
    # gr.State 用于在会话中存储后端Orchestrator对象
    orchestrator_state = gr.State()

    gr.Markdown(
        """
        # 运筹优化智能对话平台
        通过对话收集信息,并在信息充足时自动切换到建模阶段。
        """
    )
    
    chatbot = gr.Chatbot(label="对话窗口", height=500, type="messages")
    
    state_display = gr.Textbox(
        label="系统状态", 
        value=f"当前状态: {DialogueState.REQUIREMENT_ELICITATION.name}",
        interactive=False
    )
    
    with gr.Row():
        user_input_textbox = gr.Textbox(
            label="输入你的需求",
            placeholder="例如:我想解决一个生产计划问题...",
            scale=4
        )
        send_btn = gr.Button("发送", variant="primary", scale=1)

    # 【这里是关键】 在界面上添加一个重置按钮
    reset_btn = gr.Button("🔄 新的对话 (重置)", variant="stop")

    # --- 绑定事件 ---
    
    # 准备好输入和输出组件列表,方便复用
    # 注意:这里的顺序必须和函数返回值的顺序一一对应
    outputs_list = [chatbot, orchestrator_state, state_display, user_input_textbox]
    
    # 绑定“发送”按钮和回车键
    send_btn.click(
        fn=process_message,
        inputs=[user_input_textbox, chatbot, orchestrator_state],
        outputs=outputs_list
    )
    user_input_textbox.submit(
        fn=process_message,
        inputs=[user_input_textbox, chatbot, orchestrator_state],
        outputs=outputs_list
    )
    
    # 【这里是关键】 绑定“重置”按钮的点击事件
    reset_btn.click(
        fn=reset_conversation,
        inputs=None, # 重置不需要从UI获取输入
        outputs=outputs_list # 重置后需要更新的组件列表和发送后一样
    )

# 【修改后】的代码
if __name__ == "__main__":
    demo.launch()