huggingbots / app.py
lunarflu's picture
lunarflu HF Staff
deepfloyd alpha 0.2 time fix
3d72860
raw
history blame
7.58 kB
import discord
import gradio_client
from gradio_client import Client
import gradio as gr
import os
import threading
#for deepfloydif
import requests
import json
import random
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import time
#todos
#alert
# Get Gradio client
jojogan = gradio_client.Client("akhaliq/JoJoGAN")
#token update
DFIF_TOKEN = os.getenv('DFIF_TOKEN')
#deepfloydif
#df = Client("DeepFloyd/IF") #not reliable at the moment
df = Client("huggingface-projects/IF", hf_token=DFIF_TOKEN)
# Set up discord bot
class MyClient(discord.Client):
async def on_ready(self):
print('Logged on as', self.user)
#----------------------------------------------------------------------------------------------------
async def on_message(self, message):
#tldr, bot should run if
#1) it does not have @offline role
#2) user has @verified role
#3) bot is in #bot-test channel
# if the bot has this role, it won't run
OFFLINE_ROLE_ID = 1103676632667017266 # 1103676632667017266 = @offline-bot
guild = message.guild
bot_member = guild.get_member(self.user.id)
if any(role.id == OFFLINE_ROLE_ID for role in bot_member.roles):
return
# don't respond to ourselves
if message.author == self.user:
return
# if the message author doesn't have this role, the bot won't run
REQUIRED_ROLE_ID = 900063512829755413 # 900063512829755413 = @verified
if not any(role.id == REQUIRED_ROLE_ID for role in message.author.roles):
return
# channels where bot will accept commands
ALLOWED_CHANNEL_IDS = [1100458786826747945] # 1100458786826747945 = #bot-test
if message.channel.id not in ALLOWED_CHANNEL_IDS:
return
#----------------------------------------------------------------------------------------------------
#jojogan
if message.content.find("!help") != -1:
await message.reply("Use !jojo !disney !spidey or !sketch. Have fun!", mention_author=True)
style = None
if message.content.startswith('!jojo'):
style = 'JoJo'
if message.content.startswith('!disney'):
style = 'Disney'
if message.content.startswith('!spidey'):
style = 'Spider-Verse'
if message.content.startswith('!sketch'):
style = 'sketch'
if style:
if message.attachments:
attachment = message.attachments[0]
# jojogan = gradio_client.Client("akhaliq/JoJoGAN")
# predict(img, model, api_name="/predict") -> output
# im = jojogan.predict(img, model) -> output
# im = jojogan.predict(attachment.url, style) -> output
im = jojogan.predict(attachment.url, style)
await message.reply(f'Here is the {style} version of it', file=discord.File(im))
else:
await message.channel.send("No attachments to be found...Can't animify dat! Try sending me an image πŸ˜‰")
#----------------------------------------------------------------------------------------------------
#deepfloydif
'''
if message.content.startswith('!deepfloydif'):
text_input = message.content[12:].strip()
if text_input:
im = deepfloydif.predict(text_input)
im_bytes = BytesIO()
im.save(im_bytes, 'PNG')
im_bytes.seek(0)
await message.reply(f'Here is the image generated for the input "{text_input}"', file=discord.File(im_bytes, 'output.png'))
else:
await message.channel.send("No text input provided. Please provide some text after the !deepfloydif command.")
'''
#deepfloydif
# start with preset values for now
if message.content.startswith('!deepfloydif'):
#predict
#was: 1,4,7.0
#predict
#(prompt, negative_prompt, seed, number_of_images, guidance_scale,custom_timesteps_1, number_of_inference_steps, api_name="/generate64")
#-> (stage_1_results, stage_1_param_path, stage_1_result_path)
# random seed
current_time = int(time.time())
random.seed(current_time)
seed = random.randint(1, 10000)
stage_1_results, stage_1_param_path, stage_1_result_path = df.predict("llama", "blur", seed,1,7.0, 'smart100',50, api_name="/generate64")
#stage_1_results, stage_1_param_path, stage_1_result_path = df.predict("gradio written on a wall", "blur", 1,1,7.0, 'smart100',50, api_name="/generate64")
# Assuming stage_1_results contains the path to the directory
png_files = [f for f in os.listdir(stage_1_results) if f.endswith('.png')]
# Assuming png_files contains the list of all PNG files in the directory
if png_files:
first_png = png_files[0]
first_png_path = os.path.join(stage_1_results, first_png)
# Send the image file as a Discord attachment
with open(first_png_path, 'rb') as f:
await message.reply(f'Here is the first generated image', file=discord.File(f, 'first_png.png'))
'''
# stage 1
prompt = "llama"
negative_prompt = "blue"
seed = 7 # maybe random seed each time? seed = 7 seed = random.randint(0, 2**32 - 1)
number_of_images = 4
guidance_scale = 7
custom_timesteps_1 = 'smart100'
number_of_inference_steps = 100
stage_1_results, stage_1_param_path, stage_1_result_path = df.predict(prompt, negative_prompt, seed, number_of_images, guidance_scale, custom_timesteps_1, number_of_inference_steps, api_name="/generate64")
# stage 2
selected_index_for_stage_2 = -1
custom_timesteps_2 = 'smart100' # could reset to smart50 if index was the issue
seed = 362572064 # again, could randomize this seed = 362572064 seed = random.randint(0, 2**32 - 1)
# predict(stage_1_result_path, selected_index_for_stage_2, seed, guidance_scale, custom_timesteps_2, number_of_inference_steps, api_name="/upscale256") -> result
img = df.predict(stage_1_result_path, selected_index_for_stage_2, seed, guidance_scale, custom_timesteps_2, number_of_inference_steps, api_name="/upscale256")
# Save the generated image to a file
img_path = "/tmp/generated_image.png"
img.save(img_path)
# Send the image file as a Discord attachment
with open(img_path, 'rb') as f:
await message.reply(f'Here is the generated image', file=discord.File(f, 'generated_image.png'))
'''
DISCORD_TOKEN = os.environ.get("GRADIOTEST_TOKEN", None)
intents = discord.Intents.default()
intents.message_content = True
client = MyClient(intents=intents)
def run_bot():
client.run(DISCORD_TOKEN)
threading.Thread(target=run_bot).start()
def greet(name):
return "Hello " + name + "!"
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()