Wiesli_Jonas / app.py
Jonas Wiesli
formatting adjustments
99d7111
raw
history blame
9.56 kB
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, question_counter_text):
bot_message = generate_ai_message(history, question_counter_text, 0)
history[-1][1] = bot_message
return history
def bot1(history, question_counter_text):
bot_message = generate_ai_message(history, question_counter_text, 1)
history[-1][1] = bot_message
return history
def bot2(history, question_counter_text):
bot_message = generate_ai_message(history, question_counter_text, 2)
history[-1][1] = bot_message
return history
def bot3(history, question_counter_text):
bot_message = generate_ai_message(history, question_counter_text, 3)
history[-1][1] = bot_message
return history
def bot4(history, question_counter_text):
bot_message = generate_ai_message(history, question_counter_text, 4)
history[-1][1] = bot_message
return history
def generate_ai_message(history, question_counter_text, character_id):
if check_if_questions_left(question_counter_text):
init_sys_message = initText[character_id] + "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": init_sys_message}
]
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 update_questions(question_counter_text):
remaining_questions = int(question_counter_text["label"])
if remaining_questions > 0:
remaining_questions -= 1
return str(remaining_questions)
def check_if_questions_left(question_counter_text):
remaining_questions = int(question_counter_text["label"])
return remaining_questions > 0
def try_to_solve():
return {solvingRow: gr.update(visible=True)}
def show_map():
return {mapRow: gr.update(visible=True)}
def hide_solve_box():
return {solvingRow: gr.update(visible=False)}
def hide_map():
return {mapRow: gr.update(visible=False)}
def show_result():
return {
chatRow: gr.update(visible=False),
solvingRow: gr.update(visible=False),
resultRow: gr.update(visible=True)
}
def declare_loss():
return "You failed! The real culprit got away... "
def declare_victory():
return "Congratulations, you found the killer! "
bot_functions = [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(
bot_functions[i], [chatbot[i], questionCounter], chatbot[i]
).then(
update_questions, questionCounter, questionCounter
)
i += 1
mapButton.click(show_map, None, mapRow)
closeMapButton.click(hide_map, None, mapRow)
finishButton.click(try_to_solve, None, solvingRow)
closeSolvingButton.click(hide_solve_box, None, solvingRow)
i = 0
while i < len(roles):
if i == culpritId:
accusationButtons[i].click(
show_result, None, [chatRow, solvingRow, resultRow]
).then(
declare_victory, None, resultLabel
)
else:
accusationButtons[i].click(
show_result, None, [chatRow, solvingRow, resultRow]
).then(
declare_loss, None, resultLabel
)
i += 1
iface.launch()