|
import gradio as gr |
|
import random |
|
from game_manager import games, new_game |
|
import uuid |
|
|
|
with gr.Blocks(css="style.css") as app: |
|
game_var = gr.Variable() |
|
last_update = gr.Variable(0) |
|
|
|
with gr.Column() as opening: |
|
gr.Markdown("# GPT Who?") |
|
gr.Markdown( |
|
""" |
|
Welcome to 'GPT Who?', a game played with multiple humans and one AI. Here are the rules: |
|
|
|
- Every player in a room will submit a prompt. |
|
- For every prompt, there will be a round. Every player submits a response to the prompt of the round. |
|
- GPT will also respond to the prompt. |
|
- Every player will vote on which response they think is the AI's response. |
|
- Player's get 2 points for guessing which response was GPT, as well 1 point for every player that thought they were GPT. |
|
|
|
That's it! |
|
""" |
|
) |
|
|
|
player_name = gr.Text(label="Player Name") |
|
player_prompt = gr.Text(label="Prompt", info="Pick something fun, like 'Write a joke involving a banana.' or 'Why are children so dumb?'.") |
|
random_room_btn = gr.Button("Join Random Room!") |
|
with gr.Row(): |
|
room_name = gr.Text(label="Room Name") |
|
open_room_btn = gr.Button("Create / Join Room!") |
|
|
|
with gr.Column(visible=False) as game_col: |
|
chat_history = gr.Chatbot(label="Game") |
|
start_game_btn = gr.Button("Start Game", visible=False) |
|
with gr.Row(visible=False) as text_row: |
|
text_input = gr.Textbox(label="Input") |
|
with gr.Row(): |
|
player_states = gr.DataFrame( |
|
label="Players", headers=["Player", "Status", "Score"] |
|
) |
|
time_remaining = gr.Label(label="Time Remaining", elem_id="time_remaining") |
|
|
|
def add_submission(player, text, game): |
|
game.add_chat(player, text) |
|
return { |
|
text_input: gr.Textbox.update(value=""), |
|
} |
|
|
|
text_input.submit(add_submission, [player_name, text_input, game_var], [text_input]) |
|
|
|
def select_ai_response(game, player, selected: gr.SelectData): |
|
if selected.index[0] != 0 and selected.index[1] == 1: |
|
game.select_chat(player, selected.index[0]) |
|
|
|
chat_history.select(select_ai_response, [game_var, player_name], None) |
|
|
|
def open_room(data): |
|
game = new_game(data[room_name]) |
|
game.add_player(data[player_name], data[player_prompt]) |
|
return { |
|
opening: gr.Column.update(visible=False), |
|
game_col: gr.Column.update(visible=True), |
|
game_var: game, |
|
chat_history: gr.Chatbot.update(label=data[room_name]), |
|
start_game_btn: gr.Button.update(visible=len(game.players) == 1), |
|
} |
|
|
|
def random_room(): |
|
for game in random.sample(list(games.values()), len(games)): |
|
if not game.started: |
|
return game.room_name |
|
return "room_" + str(uuid.uuid4())[:8] |
|
|
|
def update_game(data): |
|
game = data[game_var] |
|
if data[last_update] == game.last_update_index: |
|
return {chat_history: gr.skip()} |
|
else: |
|
return { |
|
chat_history: game.format_chat(data[player_name]), |
|
text_row: gr.Row.update(visible=game.input_allowed), |
|
player_states: game.get_player_state(), |
|
time_remaining: game.stage_time_remaining, |
|
} |
|
|
|
def start_game_on(evt): |
|
evt( |
|
open_room, |
|
{room_name, player_name, player_prompt}, |
|
{opening, game_col, game_var, chat_history, start_game_btn}, |
|
).then( |
|
update_game, |
|
{game_var, last_update, player_name}, |
|
{chat_history, text_row, player_states, time_remaining}, |
|
every=1, |
|
) |
|
|
|
start_game_on(open_room_btn.click) |
|
start_game_on(random_room_btn.click(random_room, None, room_name).success) |
|
|
|
def start_game_click(data): |
|
game = data[game_var] |
|
game.start() |
|
return { |
|
start_game_btn: gr.Button.update(visible=False), |
|
} |
|
|
|
start_game_btn.click(start_game_click, {game_var}, {start_game_btn, text_input}) |
|
|
|
|
|
app.queue().launch() |
|
|