File size: 7,573 Bytes
ce1e006
 
 
 
 
 
 
bca6c3c
ce1e006
 
 
ad4d7e3
ce1e006
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a6fe15
ce1e006
 
227cc8d
 
 
 
 
1a6fe15
227cc8d
 
 
 
 
 
 
7d12d67
 
 
 
 
 
 
 
 
 
 
 
 
227cc8d
 
 
ce1e006
 
 
 
 
 
 
de34c46
bca6c3c
 
 
9eec015
bca6c3c
9eec015
 
 
 
ce1e006
 
 
 
 
 
5fa2c5d
de34c46
ce1e006
 
5fa2c5d
ce1e006
 
de34c46
ce1e006
 
de34c46
ce1e006
 
bca6c3c
 
ce1e006
 
 
5d7ee3a
de34c46
ce1e006
9fb94d8
ce1e006
 
292531e
49fadfc
 
5fa2c5d
0e83748
8468805
 
ce1e006
49fadfc
0e83748
 
 
ce1e006
0e83748
 
 
 
 
ce1e006
1a6fe15
ce1e006
de34c46
ce1e006
 
 
 
6c375d8
 
 
1a6fe15
ce1e006
 
 
de34c46
ce1e006
5fa2c5d
ce1e006
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
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})
        finish = False
        # 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点击“再来一局”按钮开始下一局游戏。'
        #     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 reset_state(request: gr.Request):
    global host_cnt
    host = request.client.host
    if not host in host_cnt:
        host_cnt[host] = time.time()
    else:
        elapse = time.time()-host_cnt[host]
        if elapse < 10:
            time.sleep(10-elapse)
        host_cnt[host] = time.time()
    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="显示答案"), 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_ans
    else:
        show_ans = True
        return gr.update(value=answer), gr.update(value="隐藏答案"), show_ans


host_cnt = {}

with gr.Blocks() as demo:
    gr.HTML("""<h1 align="center">海龟汤</h1>""")

    with gr.Row():
        rule = gr.Textbox(label='规则', value='海龟汤是一个推理类游戏,游戏开始时会给出一段隐去关键信息的叙述,即汤面,玩家根据汤面推理,提出能够通过“是”或“否”来回答的问题,通过提问不同可能性,缩小真相的范围,直到最终猜到真相(即汤底)的关键信息。玩家可以点击“再来一局”按钮随机一场新的游戏,点击“显示答案”可查看汤底。', lines=1, max_lines=3).style(container=False)
    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([(None, '点击“再来一局”开始游戏')])
    answer = gr.State('点击“再来一局”开始游戏')
    idx = gr.State(0)
    show_ans = gr.State(False)
    

    with gr.Row():
        with gr.Column(scale=4):
            question = gr.Textbox(label='汤面', value='点击“再来一局”开始游戏', 
                                lines=1, max_lines=3).style(container=False)
            with gr.Row():
                user_input = gr.Textbox(show_label=False, placeholder="请输入你的猜测...", lines=1, max_lines=3).style(
                    container=False)
            with gr.Row():
                with gr.Column(scale=2):
                    submitBtn = gr.Button("发送", variant="primary")
                with gr.Column(scale=2):
                    emptyBtn = gr.Button("再来一局")
        with gr.Column(scale=1):
            answer_output = gr.Textbox(show_label=False, lines=6, max_lines=6).style(
                container=False)
            answerBtn = gr.Button("显示答案")

    messages = gr.State(data['messages'])

    # submitBtn.click(showInput, [user_input, chatbot], [chatbot])
    user_input.submit(predict, [user_input, chatbot, messages, idx, answer], [chatbot, messages],
                    show_progress=True)
    user_input.submit(reset_user_input, [], [user_input])
    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_ans], show_progress=True)

    answerBtn.click(show_hide_answer, [answer, show_ans], outputs=[answer_output, answerBtn, show_ans])

demo.queue().launch()