File size: 3,792 Bytes
c066489
 
 
 
 
 
 
 
 
bddc184
13b2053
 
 
 
36c3163
9e98957
5e20594
 
 
 
 
 
 
3b0d04c
c054bb7
 
 
 
 
 
c066489
afb4c93
fddab77
3b0d04c
 
633a011
 
174a913
3b0d04c
 
 
 
 
afb4c93
 
 
f2aae0d
 
 
451c271
633a011
 
f2aae0d
 
afb4c93
b5330a0
45be55d
c054bb7
 
45be55d
c054bb7
40d7c11
c054bb7
 
 
c066489
c054bb7
c066489
 
 
87521b4
5b79bde
27916c5
c054bb7
 
5733138
45be55d
 
c054bb7
 
c066489
 
 
9e98957
c066489
 
 
b5330a0
 
c054bb7
 
9e98957
c066489
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
import openai
import gradio as gr
import os
import logging
import json

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

openai.api_key = os.environ['key']
initMsg = os.environ['init']
roleAns = os.environ['roleAns']
classAsk = os.environ['classAsk']
classAns = os.environ['classAns']
defaultMsg = os.environ['defaultMsg']
defaultMsgEnd = os.environ['defaultMsgEnd']

def localRace(race):    
    race = race
    return race

def localClass(cls):    
    cls = cls
    return cls

def getStatus(msg):     
    if "Current Status:" in msg:
        start_index = msg.index("Current Status:") + len("Current Status:")
        end_index = msg.index("Description:")
        new_content = msg[start_index:] + msg[:end_index]
    return new_content

def getChooseRole(msg):
    start_index = msg.index("As a") + len("As a")
    if start_index >= 0:
        end_index = msg.index(",")
        str = msg[start_index:] + msg[:end_index]
        str = str.strip()
        if str.lower() == "dm":
            return ""
        else:
            return str
    else:
        return ""

def getChooseClass(msg):
    full = getChooseRole(msg)
    if full != "":
        start_index = full.index(" ") + len(" ")
        end_index = msg.index(",")
        str = full[start_index:] + full[:end_index]
        str = str.strip()
        return str
    else:
        return ""

def chatbot(race, cls, input, localvar): 
    #messages = messages or [{"role": "system", "content": initMsg}]
    init = {"role": "system", "content": "I choose as "+ race + " "+ cls +" in D&D world.\n" + initMsg}
    localvar = localvar or {"messages": [init], "race": race, "class": cls, "status":""}
    messages = localvar['messages']
    if len(messages) == 1:
        input = "start"
    if input:        
        message = [init, {"role": "user", "content": defaultMsg + "(I am an "+race+" "+cls+")( My Current status is as follows :" + localvar['status'] + ") " + defaultMsgEnd + ". \n" + input}]
        messages.append(message)
        chat = openai.ChatCompletion.create(
            model="gpt-3.5-turbo", messages=message,#messages[-2:]
            max_tokens=2048,n=1,temperature=0.5,
        )
        reply = chat.choices[0].message.content
        logging.info("AI Reply:"+reply)
        if len(messages) == 2:
            localvar['status'] = reply
        else:
            localvar['status'] = getStatus(reply)
        messages.append({"role": "assistant", "content": reply})
        localvar['messages'] = messages
        return reply, printMessages(messages), localvar
    else:
        return "please input words!", printMessages(messages), localvar

def printMessages(messages):
    delimiter = '\n'
    msg_string = delimiter.join([f"{obj['role']}:{obj['content']}" for obj in messages])
    logging.info("messages:"+msg_string)
    return msg_string

app = gr.Interface(fn=chatbot, inputs=[gr.Dropdown(["Orc", "Human", "Elf", "Dwarf", "Halfling", "Goliath", "Dragonborn"], value="Orc", label="Race", info="please choose your race:"), 
                                       gr.Dropdown(["Warrior", "Mage", "Priest", "Assassin", "Thief", "Paladin", "Archer", "Guardian"], value="Warrior", label="Class", info="please choose the name of the class you wish to play as:"),
                                       gr.Textbox(lines=7, label="You ask and answer questions below", placeholder="Press submit button to start game"), "state"], #Type word 'start game'
                   outputs=[gr.Textbox(label="DND Game Reply", placeholder="Waiting for you press submit button to start play..."), gr.Textbox(label="History"), "state"], title="DND Game",#, gr.Textbox(label="History"), 
                   description="DND Game",theme="compact")
app.launch(share=False)