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()