|
import gradio as gr |
|
from loguru import logger |
|
from V3 import call_gpt |
|
|
|
class Conversation: |
|
def __init__(self, max_history_len=10): |
|
self.max_history_len = max_history_len |
|
|
|
def pop_history(self, history): |
|
while len(history) > self.max_history_len: |
|
for item in history: |
|
if item["role"] == "user": |
|
history.remove(item) |
|
break |
|
for item in history: |
|
if item["role"] == "assistant": |
|
history.remove(item) |
|
break |
|
return history |
|
|
|
def ask(self, history, prompt): |
|
history = self.pop_history(history) |
|
logger.info(history) |
|
return call_gpt(history, prompt) |
|
|
|
conv = Conversation() |
|
|
|
def make_history(system_prompt, qa_list): |
|
history = [{"role": "system", "content": system_prompt}] |
|
for q, a in qa_list: |
|
history.append({"role": "user", "content": q}) |
|
history.append({"role": "assistant", "content": a}) |
|
return history |
|
|
|
def answer(system_prompt, prompt, history=[]): |
|
history.append(prompt) |
|
qa_list = [(u, b) for u, b in zip(history[::2], history[1::2])] |
|
message = conv.ask(make_history(system_prompt, qa_list), prompt) |
|
|
|
|
|
message = message.replace("`", "\\`") |
|
|
|
|
|
message = f"```\n{message}\n```" |
|
|
|
history.append(message) |
|
|
|
chatbot_messages = [] |
|
for q, a in qa_list: |
|
chatbot_messages.append((q, a)) |
|
|
|
chatbot_messages.append((prompt, message)) |
|
|
|
return "", chatbot_messages, history |
|
|
|
def clear_history(state): |
|
state.clear() |
|
return state, [] |
|
|
|
with gr.Blocks(css="#chatbot{height:500px} .overflow-y-auto{height:500px}") as rxbot: |
|
with gr.Row(): |
|
sys = gr.Textbox(show_label=False, value="You are open-o1, a helpful assistant.") |
|
chatbot = gr.Chatbot() |
|
state = gr.State([]) |
|
|
|
with gr.Row(): |
|
txt = gr.Textbox(show_label=False, placeholder="请输入你的问题", max_lines=8) |
|
|
|
with gr.Row(): |
|
clear_button = gr.Button("🧹Clear History") |
|
send_button = gr.Button("🚀Send") |
|
|
|
send_button.click( |
|
fn=answer, |
|
inputs=[sys, txt, state], |
|
outputs=[txt, chatbot, state] |
|
) |
|
|
|
txt.submit( |
|
fn=answer, |
|
inputs=[sys, txt, state], |
|
outputs=[txt, chatbot, state] |
|
) |
|
|
|
clear_button.click( |
|
fn=clear_history, |
|
inputs=[state], |
|
outputs=[state, chatbot] |
|
) |
|
|
|
rxbot.launch() |
|
|