Spaces:
Runtime error
Runtime error
import os | |
import json | |
import time | |
import enum | |
import uuid | |
import base64 | |
import requests | |
import structlog | |
import gradio as gr | |
import random | |
import functools | |
logger = structlog.getLogger() | |
replicate_api_key = os.environ.get('REPLICATE_KEY') | |
# Everyone gets the same order of words | |
random.seed(42) | |
with open('five_letter_words.txt') as f: | |
words = f.read().splitlines() | |
random.shuffle(words) | |
random.seed() | |
class Image: | |
def create(cls, prompt, n=1, response_format="url", model="fofr", size="256x256"): | |
logger.info(f'requesting Image with prompt={prompt}, n={n}, response_format={response_format}, model={model}, size={size}...') | |
width, height = size.split('x') | |
width, height = int(width), int(height) | |
resp = requests.post( | |
"https://api.replicate.com/v1/predictions", | |
headers={"Content-Type": "application/json", "Authorization": f"Token {replicate_api_key}"}, | |
json={"version": "a83d4056c205f4f62ae2d19f73b04881db59ce8b81154d314dd34ab7babaa0f1", "input": { | |
"prompt": prompt, | |
"width": width, "height": height, | |
"num_images": n, | |
}}, | |
) | |
resp = resp.json() | |
sleeps = 0 | |
while resp.get("status", "fail").lower() not in {"fail", "succeeded"}: | |
if sleeps >= 10: | |
raise Exception('Error generating image', resp) | |
logger.info(f"Sleeping 1...") | |
time.sleep(1) | |
sleeps += 1 | |
resp = requests.get(f"https://api.replicate.com/v1/predictions/{resp['id']}", headers={"Content-Type": "application/json", "Authorization": f"Token {replicate_api_key}"}) | |
resp = resp.json() | |
logger.info('received Image...') | |
url = resp['output'][0] | |
# Get the MIME type of the image (e.g., 'image/jpeg', 'image/png') | |
mime_type = f"image/{url.rsplit('.', 1)[-1]}" | |
# Encode to base64 and format as a data URI | |
return f"data:{mime_type};base64," + base64.b64encode(requests.get(url).content).decode() | |
def get_image(word_num, guess_num): | |
prompt = words[word_num] | |
return Image.create(prompt) | |
def display_images_base64(image_strings): | |
# Start of the HTML string | |
html = '<html><body><div style="display: flex; flex-wrap: wrap;">' | |
# Template for an individual image | |
img_template = '<img src="{}" style="width: 30%; margin: 1%;" />' | |
# Loop through the list of image strings and append each to the HTML string | |
for img_str in image_strings: | |
html += img_template.format(img_str) | |
# Close the div and body tags | |
html += '</div></body></html>' | |
return html | |
def guess_word(word_num, guess, history=None): | |
word_num = abs(word_num) % len(words) | |
target = words[word_num] | |
guess = guess.lower() | |
feedback = [] | |
if history is None: | |
history = {} | |
if word_num not in history: | |
history[word_num] = { | |
'guess': [], | |
'image': [], | |
} | |
if len(guess) != len(target): | |
feedback_str = "Guess must be {} letters long".format(len(target)) | |
else: | |
for i, char in enumerate(guess): | |
if char == target[i]: | |
feedback.append('π©') # Green for correct position | |
elif char in target: | |
feedback.append('π¨') # Yellow for correct letter, wrong position | |
else: | |
feedback.append('β¬') # Black for incorrect letter | |
feedback_str = "".join(feedback) | |
# Update and return the history with the current guess feedback | |
history[word_num]['guess'].append(f"{guess}: {feedback_str}") | |
# Get and update the image history | |
new_image = get_image(word_num, len(history[word_num]['guess']) + 1) | |
history[word_num]['image'].append(new_image) | |
return feedback_str, '\n'.join(history[word_num]['guess']), display_images_base64(history[word_num]['image']), history | |
interface = gr.Interface(fn=guess_word, | |
inputs=[ | |
gr.Number(value=random.randint(0, 100_000), label='Word number (Cannot be empty)'), | |
gr.Textbox(lines=1, label="Enter your guess (Cannot be empty)"), | |
gr.State()], | |
outputs=["text", gr.Textbox(label="Guess History", interactive=False, lines=10), gr.HTML(label="Guess Images"), gr.State()], | |
title="Wordle with Gradio", | |
description="A simple Wordle clone with guess history. Try to guess the word 'python'!", | |
allow_flagging="never") | |
interface.launch() | |