import gradio as gr
import mdtex2html
import pandas as pd
import random as rd
import os
import json
import time
import requests
rd.seed(time.time())
def postprocess(self, y):
if y is None:
return []
for i, (message, response) in enumerate(y):
y[i] = (
None if message is None else mdtex2html.convert((message)),
None if response is None else mdtex2html.convert(response),
)
return y
gr.Chatbot.postprocess = postprocess
def parse_text(text):
"""copy from https://github.com/GaiZhenbiao/ChuanhuChatGPT/"""
lines = text.split("\n")
lines = [line for line in lines if line != ""]
count = 0
for i, line in enumerate(lines):
if "```" in line:
count += 1
items = line.split('`')
if count % 2 == 1:
lines[i] = f'
'
else:
lines[i] = f'
'
else:
if i > 0:
if count % 2 == 1:
line = line.replace("`", "\`")
line = line.replace("<", "<")
line = line.replace(">", ">")
line = line.replace(" ", " ")
line = line.replace("*", "*")
line = line.replace("_", "_")
line = line.replace("-", "-")
line = line.replace(".", ".")
line = line.replace("!", "!")
line = line.replace("(", "(")
line = line.replace(")", ")")
line = line.replace("$", "$")
lines[i] = "
"+line
text = "".join(lines)
return text
def showInput(input, chatbot):
chatbot.append((parse_text(input), ""))
return chatbot
def predict(input, chatbot, messages):
chatbot.append((parse_text(input), ""))
messages.append({"role": 'user', "content": input})
data = {'predict': messages}
response=str(requests.post(os.environ.get("URL"), data=json.dumps(data, ensure_ascii=False).encode('utf-8')).content, encoding="utf-8")
chatbot[-1] = (parse_text(input), parse_text(response))
messages.append({"role": "assistant", "content": response})
return chatbot, messages
def reset_user_input():
return gr.update(value='')
def reset_state():
global answer
data = {'refresh': ''}
data=requests.post(os.environ.get("URL"), data=json.dumps(data, ensure_ascii=False).encode('utf-8')).content
data = json.loads(str(data, encoding="utf-8"))
chatbot = data['chatbot']
messages = data['messages']
answer = data['answer']
return chatbot, messages, gr.update(value=""), gr.update(value="Show Answer")
def show_hide_answer():
global show_ans
if show_ans:
show_ans = False
return gr.update(value=""), gr.update(value="Show Answer")
else:
show_ans = True
return gr.update(value=answer), gr.update(value="Hide Answer")
show_ans = False
with gr.Blocks() as demo:
gr.HTML("""海龟汤
""")
data = {'refresh': ''}
data=requests.post(os.environ.get("URL"), data=json.dumps(data, ensure_ascii=False).encode('utf-8')).content
data = json.loads(str(data, encoding="utf-8"))
chatbot = gr.Chatbot(data['chatbot'])
answer = data['answer']
with gr.Row():
with gr.Column(scale=4):
with gr.Column(scale=12):
user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=10, max_lines=10).style(
container=False)
with gr.Column(min_width=32, scale=1):
submitBtn = gr.Button("Submit", variant="primary")
emptyBtn = gr.Button("New game")
with gr.Column(scale=1):
answer_output = gr.Textbox(show_label=False, lines=13, max_lines=13).style(
container=False)
answerBtn = gr.Button("Show Answer")
messages = gr.State(data['messages'])
submitBtn.click(predict, [user_input, chatbot, messages], [chatbot, messages],
show_progress=True)
submitBtn.click(reset_user_input, [], [user_input])
emptyBtn.click(reset_state, outputs=[chatbot, messages, answer_output, answerBtn], show_progress=True)
answerBtn.click(show_hide_answer, outputs=[answer_output, answerBtn])
demo.queue().launch()