Spaces:
Running
Running
import gradio as gr | |
import json | |
import random | |
from transformers import pipeline | |
generator = pipeline("text-generation", model="gpt2", max_length=60) | |
with open("wordlist.json") as wordlist_json: | |
wordlist = json.load(wordlist_json) | |
def autocomplete(text): | |
end_text = " ".join(text.split(" ")[-30:-1]) | |
generated_text = generator( | |
end_text, return_full_text=False, clean_up_tokenization_spaces=True | |
)[0]["generated_text"] | |
generated_text = generated_text.replace("\n", " ") | |
return generated_text | |
with gr.Blocks() as demo: | |
gr.Markdown( | |
""" | |
# GPT Golf | |
How many turns will it take you to get GPT to say the target word? | |
Here are the rules of the game: | |
- Your goal is to get GPT to say a target word in as few turns as possible. | |
- Each turn, you add up to 5 words to its dialogue. | |
- When you click submit, your prompt will be added to the dialogue. Then GPT will also add to the dialogue. | |
- You can't say the target word, but as soon as GPT does, you win! | |
""" | |
) | |
error_box = gr.Textbox(label="Error", elem_id="error", visible=False) | |
dialogue_var = gr.Variable(value=[]) | |
start_btn = gr.Button("Start", variant="primary") | |
with gr.Column(visible=False) as game: | |
with gr.Row() as stats: | |
target_word_box = gr.Textbox( | |
label="Target Word", elem_id="target", interactive=False | |
) | |
num_turns_box = gr.Number(0, label="# of Turns so Far", elem_id="num_turns") | |
dialogue_box = gr.HighlightedText(label="Dialogue") | |
with gr.Column() as prompt_set: | |
prompt_box = gr.Textbox(label="Prompt", placeholder="Enter Next 5 Words...") | |
submit_btn = gr.Button("Submit").style(full_width=True) | |
win = gr.HTML( | |
"<div style='width: 100%; padding: 3rem; font-size: 4rem; color: green; text-align: center; font-weight: bold'>You Won!</div>", | |
visible=False, | |
) | |
def start_game(): | |
return { | |
start_btn: gr.update(visible=False), | |
game: gr.update(visible=True), | |
target_word_box: random.choice(wordlist), | |
} | |
start_btn.click(start_game, inputs=None, outputs=[start_btn, game, target_word_box]) | |
def submit(prompt, target_word, dialogue, num_turns): | |
if len(prompt.split(" ")) > 5: | |
return { | |
error_box: gr.update( | |
visible=True, value="Prompt must be a maximum of 5 words!" | |
) | |
} | |
if target_word in prompt: | |
return { | |
error_box: gr.update( | |
visible=True, value="You can't use the target word in the prompt!" | |
) | |
} | |
dialogue.append(prompt) | |
response = autocomplete(" ".join(dialogue)) | |
dialogue.append(response) | |
labeled_dialogue = [ | |
(text, None if i % 2 == 0 else "gpt") for i, text in enumerate(dialogue) | |
] | |
if target_word in response: | |
return { | |
dialogue_box: labeled_dialogue, | |
prompt_set: gr.update(visible=False), | |
win: gr.update(visible=True), | |
num_turns_box: num_turns + 1, | |
dialogue_var: dialogue, | |
error_box: gr.update(visible=False), | |
} | |
else: | |
return { | |
dialogue_box: labeled_dialogue, | |
prompt_box: "", | |
num_turns_box: num_turns + 1, | |
dialogue_var: dialogue, | |
error_box: gr.update(visible=False), | |
} | |
submit_btn.click( | |
submit, | |
inputs=[prompt_box, target_word_box, dialogue_var, num_turns_box], | |
outputs=[ | |
dialogue_var, | |
dialogue_box, | |
prompt_box, | |
num_turns_box, | |
error_box, | |
prompt_set, | |
win, | |
], | |
) | |
demo.launch() | |