File size: 4,496 Bytes
c066489 fcb8a34 c066489 bddc184 13b2053 36c3163 9e98957 fcb8a34 5e20594 3b0d04c 67d820b c054bb7 c066489 afb4c93 fddab77 3b0d04c 633a011 174a913 3b0d04c afb4c93 f2aae0d 451c271 633a011 f2aae0d afb4c93 b5330a0 45be55d c054bb7 45be55d c054bb7 40d7c11 fcb8a34 f2d869f c054bb7 8a859a1 c054bb7 c066489 8a859a1 c066489 87521b4 d97d398 fcb8a34 5b79bde 27916c5 c054bb7 5733138 45be55d 8a859a1 c054bb7 8a859a1 c066489 9e98957 c066489 b5330a0 c054bb7 8a859a1 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 94 95 96 97 98 99 100 101 102 103 |
import openai
import gradio as gr
import os
import logging
import json
import re
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 contains_chinese(text):
pattern = re.compile(r'[\u4e00-\u9fff]+')
return bool(pattern.search(text))
def localRace(race):
race = race
return race
def localClass(cls):
cls = cls
return cls
def getStatus(msg):
new_content = 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 contains_chinese(input):
return "Chinese input is not supported! Please reinput!\n"+messages[-1]["content"], printMessages(messages), localvar
if input:
message = {"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=[init, message],#messages[-2:]
max_tokens=2048,n=1,temperature=0.5,
)
reply = chat.choices[0].message.content
logging.info("AI Reply:"+reply)
if " ai " in input.lower():
reply = "As the DM, my purpose is to create an enjoyable and inclusive experience for all players. While I understand that you seek a more realistic and diverse adventure, my duty requires me to guide you through this world while adhering to the guidelines. Instead of "+input+",consider exploring options within the world.\n" + messages[-2]["content"]
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) |