mkw18
add finish
1a6fe15
raw
history blame
6.44 kB
import gradio as gr
import mdtex2html
import pandas as pd
import random as rd
import os
import json
import time
import openai
import requests
openai.api_key = os.environ.get('APIKEY')
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'<pre><code class="language-{items[-1]}">'
else:
lines[i] = f'<br></code></pre>'
else:
if i > 0:
if count % 2 == 1:
line = line.replace("`", "\`")
line = line.replace("<", "&lt;")
line = line.replace(">", "&gt;")
line = line.replace(" ", "&nbsp;")
line = line.replace("*", "&ast;")
line = line.replace("_", "&lowbar;")
line = line.replace("-", "&#45;")
line = line.replace(".", "&#46;")
line = line.replace("!", "&#33;")
line = line.replace("(", "&#40;")
line = line.replace(")", "&#41;")
line = line.replace("$", "&#36;")
lines[i] = "<br>"+line
text = "".join(lines)
return text
def showInput(input, chatbot):
chatbot.append((parse_text(input), ""))
return chatbot
def predict(input, chatbot, messages, idx, answer):
chatbot.append((parse_text(input), ""))
messages.append({"role": 'user', "content": input})
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages,
logit_bias={42468: 10, 28938: 10}
)
response=completion.choices[0].message.content.strip()
messages.append({"role": "assistant", "content": response})
# data = {'predict': messages, 'idx': idx}
# 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})
messages1 = messages + [{"role": 'user', "content": '我猜到汤底了吗?请回答是或否。'}]
completion1 = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages1,
logit_bias={42468: 10, 28938: 10}
)
response1=completion1.choices[0].message.content.strip()
if '不' in response1 or '否' in response1 or '没' in response1:
response = response
finish = False
else:
response += f'恭喜您已经猜到汤底,汤底是:{answer}\n点击"New Game"按钮开始下一局游戏。'
finish = True
data = {'predict': messages, 'idx': idx, 'isfinished': finish}
requests.post(os.environ.get("URL"), data=json.dumps(data, ensure_ascii=False).encode('utf-8'))
chatbot[-1] = (parse_text(input), parse_text(response))
return chatbot, messages
def reset_user_input():
return gr.update(value='')
def reset_state():
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']
idx = data['idx']
return chatbot, messages, gr.update(value=""), gr.update(value="Show Answer"), answer, idx, gr.update(value=chatbot[-1][1].replace('汤面:', '').replace('你可以开始猜测汤底的内容,我会回答你的问题。请注意,我只能回答“是”或“否”。', '').replace('<p>', '').replace('</p>', ''))
def show_hide_answer(answer, show_ans):
if show_ans:
show_ans = False
return gr.update(value=""), gr.update(value="Show Answer"), show_ans
else:
show_ans = True
return gr.update(value=answer), gr.update(value="Hide Answer"), show_ans
with gr.Blocks() as demo:
gr.HTML("""<h1 align="center">海龟汤</h1>""")
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 = gr.State(data['answer'])
idx = gr.State(data['idx'])
show_ans = gr.State(False)
with gr.Row():
question = gr.Textbox(label='汤面', value=data['chatbot'][-1][1].replace('汤面:', '').replace('你可以开始猜测汤底的内容,我会回答你的问题。请注意,我只能回答“是”或“否”。', '').replace('<p>', '').replace('</p>', ''),
lines=1, max_lines=3).style(container=False)
with gr.Row():
with gr.Column(scale=4):
with gr.Column(scale=12):
user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=3, max_lines=3).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=6, max_lines=6).style(
container=False)
answerBtn = gr.Button("Show Answer")
messages = gr.State(data['messages'])
# submitBtn.click(showInput, [user_input, chatbot], [chatbot])
submitBtn.click(predict, [user_input, chatbot, messages, idx, answer], [chatbot, messages],
show_progress=True)
submitBtn.click(reset_user_input, [], [user_input])
emptyBtn.click(reset_state, outputs=[chatbot, messages, answer_output, answerBtn, answer, idx, question], show_progress=True)
answerBtn.click(show_hide_answer, [answer, show_ans], outputs=[answer_output, answerBtn, show_ans])
demo.queue().launch()