import traceback import gradio as gr from chatClient import ChatClient from apps.components import chat_accordion BOT_NAME = "ChatGLM2-6B" TITLE = """

🤗 ChatGLM2-6B 预设指令对话

""" RETRY_COMMAND = "/retry" DEFAULT_INSTRUCTIONS = "你是一个爱笑的机器人,名字叫小莫,在回答问题的时候会添加合适的emoji来表达情绪。" def chat(client: ChatClient): with gr.Row(): with gr.Column(elem_id="chat_container", scale=3): with gr.Row(): chatbot = gr.Chatbot(elem_id="chatbot") with gr.Row(): inputs = gr.Textbox( placeholder=f"你好 {BOT_NAME} !", label="输入内容后点击回车", max_lines=3, ) with gr.Row(elem_id="button_container"): with gr.Column(): retry_button = gr.Button("♻️ 重试上一轮对话") with gr.Column(): delete_turn_button = gr.Button("🧽 删除上一轮对话") with gr.Column(): clear_chat_button = gr.Button("✨ 删除全部对话历史") with gr.Column(elem_id="param_container", scale=1): with gr.Row(): with gr.Accordion("对话预设指令", open=True): instructions = gr.Textbox( placeholder="LLM instructions", value=DEFAULT_INSTRUCTIONS, lines=10, interactive=True, label="指令", max_lines=16, show_label=False, ) with gr.Row(): temperature, top_p = chat_accordion() def run_chat(message: str, chat_history, instructions: str, temperature: float, top_p: float): if not message or (message == RETRY_COMMAND and len(chat_history) == 0): yield chat_history return if message == RETRY_COMMAND and chat_history: prev_turn = chat_history.pop(-1) user_message, _ = prev_turn message = user_message # chat_history = chat_history + [[message, ""]] try: stream = client.instruct_chat( message, chat_history, instructions, temperature=temperature, top_p=top_p, ) for resp, history in stream: chat_history = history yield chat_history except Exception as e: if not chat_history: chat_history = [] chat_history += [["有错误了", traceback.format_exc()]] yield chat_history def delete_last_turn(chat_history): if chat_history: chat_history.pop(-1) return {chatbot: gr.update(value=chat_history)} def run_retry(message: str, chat_history, instructions, temperature: float, top_p: float): yield from run_chat(RETRY_COMMAND, chat_history, instructions, temperature, top_p) def clear_chat(): return [] inputs.submit( run_chat, [inputs, chatbot, instructions, temperature, top_p], outputs=[chatbot], show_progress=False, ) inputs.submit(lambda: "", inputs=None, outputs=inputs) delete_turn_button.click(delete_last_turn, inputs=[chatbot], outputs=[chatbot]) retry_button.click( run_retry, [inputs, chatbot, instructions, temperature, top_p], outputs=[chatbot], show_progress=False, ) clear_chat_button.click(clear_chat, [], chatbot) def instruction_chat_demo(client: ChatClient): gr.HTML(TITLE) chat(client)