Spaces:
Sleeping
Sleeping
import gradio as gr | |
import openai | |
openai.api_key = "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" | |
theme = gr.themes.Monochrome() | |
css = "@import url(https://fonts.googleapis.com/css2?family=Silkscreen&display=swap);.gradio-container{" \ | |
"background-color:#f3e8ff;font-family:Silkscreen}.tabitem,button{background-color:#002366}" | |
with gr.Blocks(theme=theme, css=css) as iface: | |
chatbot = [] | |
msg = [] | |
accusationButtons = [] | |
culpritId = 1 | |
roles = ["Security Guard", "Curator", "Researcher", "Conservationist", "Tour Guide"] | |
initText = ["You are Steve Binner, 31, a security guard for a museum of medieval " | |
"history. You're absolutely sure that this place is haunted. A month ago, " | |
"before the spooky stuff started, you were really happy with your job, " | |
"but that changed real fast. The ghost is a french nobleman named Baron " | |
"Hugo Antoine the Third. You've been trying to tell other people about " | |
"this, but you've only been laughed at so far. But you've got evidence! " | |
"Every thursday, around 10pm, the broom closet gets locked from the inside and " | |
"the interior gets wrecked. We're talking pushed over tables, " | |
"broken containers, the whole shebang. When it comes to the murder of " | |
"director Eisenholz last thursday, that has to have been the ghost, " | |
"no question. You even have the door card records for the room he was in: " | |
"After the museum closed at 5pm, nobody entered that room till the next " | |
"morning. Now you're being interrogated by a detective. You don't use " | |
"uptight language, and you're not super well educated on most stuff, " | |
"but when it comes to the paranormal, you're an ace. ", | |
"You are a Curator. ", | |
"You are a Researcher. ", | |
"You are a Conservationist. ", | |
"You are Lyanne Brimes, 27, a tour guide for a medieval history museum. You graduated from university " | |
"a few years ago and have a degree in history. You work here part-time. You know director Eisenholz " | |
"very well because you had a secret relationship. You'd prefer not to disclose any info about it " | |
"unless pressed. You met every Thursday in the broom cupboard for your private meeting. You thought " | |
"no one knew, but you are not sure anymore. Lately Eisenholz has been behaving very strangely. " | |
"Something was troubling him. You tried to talk to him about it the" | |
"night of the murder, but he never showed up. After waiting in the closet for 2 hours, you decided to " | |
"go home. On your way out, you noticed the door to the room with all the weapons was open, " | |
"but you thought Steve, the security guard, might be lurking around. Some might think Steve could be " | |
"the murderer because he's been going crazy lately with the whole ghost thing and because he has " | |
"access to every room, but you don't think he could have done it because he's kind-hearted. You are " | |
"not the murderer, but if you had to guess who it was, you would say it was the curator. The curator " | |
"and Eisenholz have been arguing recently about a medallion that has been in his family for " | |
"centuries, but he doesn't want to give it to the museum because it's too valuable. You think you " | |
"have a good nose for murder because you read detective novels. Now you're being questioned by a " | |
"detective. You use formal language and are very well educated in history, especially medieval " | |
"history. You have a bubbly personality. "] | |
with gr.Row() as chatRow: | |
with gr.Column(scale=2): | |
questionCounter = gr.Label(label="Remaining Questions", value="24") | |
mapButton = gr.Button("Show Floor Plan") | |
finishButton = gr.Button("Try to Solve") | |
with gr.Column(scale=10): | |
i = 0 | |
while i < len(roles): | |
with gr.Tab(roles[i]): | |
with gr.Row(): | |
with gr.Column(scale=9): | |
chatbot.append(gr.Chatbot(label=roles[i])) | |
msg.append(gr.Textbox(label="")) | |
with gr.Column(scale=3): | |
characterImage = gr.Label(label="", elem_classes="character-image-" + str(i)) | |
i += 1 | |
with gr.Row(visible=False, elem_classes="abs-window") as mapRow: | |
with gr.Column(): | |
closeMapButton = gr.Button("X", elem_classes="close-button") | |
with gr.Row(visible=False, elem_classes="abs-window") as solvingRow: | |
i = 0 | |
while i < len(roles): | |
with gr.Column(): | |
accusationButtons.append(gr.Button(roles[i])) | |
i += 1 | |
closeSolvingButton = gr.Button("X", elem_classes="close-button") | |
with gr.Row(visible=False) as resultRow: | |
with gr.Column(): | |
resultLabel = gr.Label(label="Result") | |
def user(user_message, history): | |
return "", history + [[user_message, None]] | |
# this is an ugly workaround, you cannot pass regular integers to gradio functions, so i had to do it this way | |
def bot0(history, questionCounterText): | |
bot_message = generateAIMessage(history, questionCounterText, 0) | |
history[-1][1] = bot_message | |
return history | |
def bot1(history, questionCounterText): | |
bot_message = generateAIMessage(history, questionCounterText, 1) | |
history[-1][1] = bot_message | |
return history | |
def bot2(history, questionCounterText): | |
bot_message = generateAIMessage(history, questionCounterText, 2) | |
history[-1][1] = bot_message | |
return history | |
def bot3(history, questionCounterText): | |
bot_message = generateAIMessage(history, questionCounterText, 3) | |
history[-1][1] = bot_message | |
return history | |
def bot4(history, questionCounterText): | |
bot_message = generateAIMessage(history, questionCounterText, 4) | |
history[-1][1] = bot_message | |
return history | |
def generateAIMessage(history, questionCounterText, characterId): | |
if checkIfQuestionsLeft(questionCounterText): | |
initSysMessage = initText[characterId] + "Stay in character. Use natural language. Don't reveal all of " \ | |
"the information in a single message, and leave hints." | |
message_history = [ | |
{"role": "system", "content": initSysMessage} | |
] | |
for pair in history: | |
message_history.append({"role": "user", "content": pair[0]}) | |
print() | |
if pair[1] is not None: | |
message_history.append({"role": "assistant", "content": pair[1]}) | |
completion = openai.ChatCompletion.create( | |
model="gpt-3.5-turbo", | |
messages=message_history | |
) | |
return completion.choices[0].message.content | |
else: | |
return "--- YOU'VE RUN OUT OF QUESTIONS, MAKE YOUR CHOICE ---" | |
def updateQuestions(questionCounterText): | |
remainingQuestions = int(questionCounterText["label"]) | |
if remainingQuestions > 0: | |
remainingQuestions -= 1 | |
return str(remainingQuestions) | |
def checkIfQuestionsLeft(questionCounterText): | |
remainingQuestions = int(questionCounterText["label"]) | |
return remainingQuestions > 0 | |
def tryToSolve(): | |
return {solvingRow: gr.update(visible=True)} | |
def showMap(): | |
return {mapRow: gr.update(visible=True)} | |
def hideSolveBox(): | |
return {solvingRow: gr.update(visible=False)} | |
def hideMap(): | |
return {mapRow: gr.update(visible=False)} | |
def showResult(): | |
return {chatRow: gr.update(visible=False), solvingRow: gr.update(visible=False), resultRow: gr.update(visible=True)} | |
def declareLoss(): | |
return "You failed! The real culprit got away... " | |
def declareVictory(): | |
return "Congratulations, you found the killer! " | |
botfunctions = [bot0, bot1, bot2, bot3, bot4] | |
i = 0 | |
while i < len(roles): | |
msg[i].submit(user, [msg[i], chatbot[i]], [msg[i], chatbot[i]], queue=False).then( | |
botfunctions[i], [chatbot[i], questionCounter], chatbot[i] | |
).then( | |
updateQuestions, questionCounter, questionCounter | |
) | |
i += 1 | |
mapButton.click(showMap, None, mapRow) | |
closeMapButton.click(hideMap, None, mapRow) | |
finishButton.click(tryToSolve, None, solvingRow) | |
closeSolvingButton.click(hideSolveBox, None, solvingRow) | |
i = 0 | |
while i < len(roles): | |
if i == culpritId: | |
accusationButtons[i].click(showResult, None, [chatRow, solvingRow, resultRow]).then(declareVictory, None, resultLabel) | |
else: | |
accusationButtons[i].click(showResult, None, [chatRow, solvingRow, resultRow]).then(declareLoss, None, resultLabel) | |
i += 1 | |
iface.launch() | |