mkw18
ip detect
bca6c3c
raw
history blame
7.46 kB
import gradio as gr
import mdtex2html
import pandas as pd
import random as rd
import os
import json
import time
import schedule
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})
data = {'predict': messages, 'idx': idx, 'isfinished': False, 'answer': answer}
response=str(requests.post(os.environ.get("URL"), data=json.dumps(data, ensure_ascii=False).encode('utf-8')).content, encoding="utf-8")
if not response == 'timeout':
chatbot[-1] = (parse_text(input), parse_text(response))
messages.append({"role": "assistant", "content": response})
else:
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})
messages1 = messages + [{"role": 'user', "content": '我猜到汤底了吗?请回答是或否,注意仅出现“汤底”二字或者我并没有问到汤底相关细节时不能说明我猜到了汤底。'}]
completion1 = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages1,
)
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, 'answer': answer}
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 rate_cnt():
global host_cnt
host_cnt = {}
def reset_state(chatbot, messages, answer_output, answerBtn, answer, idx, question, show_ans, request: gr.Request):
global host_cnt
host = request.client.host
if not host in host_cnt:
host_cnt[host] = 1
else:
host_cnt[host] += 1
if host_cnt[host] >= 10:
return chatbot, messages, answer_output, answerBtn, answer, idx, question, show_ans
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=data['story'].strip()), False
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
host_cnt = {}
with gr.Blocks() as demo:
gr.HTML("""<h1 align="center">海龟汤</h1>""")
with gr.Row():
rule = gr.Textbox(label='规则', value='海龟汤是一个推理类游戏,游戏开始时会给出一段隐去关键信息的叙述,即汤面,玩家根据汤面提出问题,问题需要能够通过“是”或“否”来回答。玩家通过提问不同可能性,缩小真相的范围,直到最终猜到真相(即汤底)的关键信息。玩家可以点击"New Game"按钮开始新的游戏,点击"Show Answer"可查看汤底。',
lines=1, max_lines=3).style(container=False)
data = {'refresh': ''}
schedule.every(1).minutes.do(rate_cnt)
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['story'].strip(),
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, [chatbot, messages, answer_output, answerBtn, answer, idx, question, show_ans], outputs=[chatbot, messages, answer_output, answerBtn, answer, idx, question, show_ans], show_progress=True)
answerBtn.click(show_hide_answer, [answer, show_ans], outputs=[answer_output, answerBtn, show_ans])
demo.queue().launch()