Snail / app.py
MrOvkill's picture
Upload folder using huggingface_hub
1de5e48 verified
raw
history blame
3.34 kB
import base64
import hashlib
import json
import time
import gradio as gr
import os
import queue
import zstandard as zstd
q = queue.Queue()
"""
Format:
{
"status": "queue" | "progress" | "done"
"prompt": "Some ducks..."
"id": "abc123"
}
"""
models = []
WORKERS = []
def enqueue(prompt: str):
tm = time.time()
hsh = hashlib.sha256(prompt.encode("utf-8")).hexdigest()
md = {
"status": "queue",
"prompt": prompt,
"id": f"{hsh}.{tm}"
}
models.append(md)
q.put(json.dumps(md))
def dequeue():
if not q.empty():
pr = json.loads(q.get_nowait())
return json.dumps({
"status": "ok",
"prompt": pr["prompt"],
"id": pr["id"]
})
return json.dumps({
"status": "empty"
})
def complete(data):
jsn = json.loads(data)
for i in range(len(models)):
if models[i]["id"] == jsn["_id"]:
models[i]["status"] = "done"
for fl in jsn["files"]:
rd = zstd.decompress(base64.b64decode(fl["data"]))
os.makedirs(f"files/{fl['path']}", exist_ok=True)
os.rmdir(f"files/{fl['path']}")
with open(f"files/{fl['path']}", "wb") as f:
f.write(rd)
f.flush()
f.close()
break
return json.dumps({"status": "ok"})
class ValueClass():
def __init__(self, value):
self.value = value
def worker():
while True:
if not q.empty():
pr = json.loads(q.get_nowait())
pr["status"] = "progress"
for w in WORKERS:
if w["status"] == "idle":
w["status"] = "busy"
w["prompt"] = pr["prompt"]
w["id"] = pr["id"]
break
else:
q.put(json.dumps(pr))
time.sleep(1)
with gr.Blocks() as bl:
with gr.Row("none"):
shad_out = gr.Textbox(visible=False)
shad_dequeue = gr.Button(value="Dequeue", visible=False)
shad_in = gr.Textbox(visible=False)
shad_complete = gr.Button(value="Complete", visible=False)
shad_submitted = gr.Checkbox(visible=False)
with gr.Row("panel"):
gr.Label("Enter a prompt to generate an image. This is a work-in-progress. Release 1.")
with gr.Row("panel"):
prompt_input = gr.Textbox(placeholder="Enter a prompt here", visible=shad_complete.value)
with gr.Row("panel"):
submit_button = gr.Button(value="Generate", visible=True)
with gr.Row("panel"):
image_output = gr.Image(label="Generated Image")
submit_button.click(enqueue, inputs=[prompt_input], api_name="enqueue")
shad_dequeue.click(dequeue, outputs=[shad_out], api_name="dequeue")
shad_complete.click(complete, inputs=[shad_in], outputs=[shad_out], api_name="complete")
def kill_the_noise_skrillex(btn):
prompt_input.visible = False
prompt_input.value = ""
submit_button.visible = False
return btn
prompt_input = gr.Textbox(label="Prompt")
submit_button = gr.Button("Submit")
demo = gr.Interface(fn=kill_the_noise_skrillex,
inputs=[submit_button],
outputs=[submit_button])
demo.launch()