Merge pull request 'stable-diffuse-api' (#2) from stable-diffuse-api into master
Reviewed-on: #2
This commit was merged in pull request #2.
This commit is contained in:
commit
04b9b0ed8d
8 files changed
+357
-9
No files matched your search
@@ -1,3 +1,5 @@
|
||||
.vscode/
|
||||
venv/
|
||||
*.secret
|
||||
__pycache__/
|
||||
jmh/
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 78 KiB |
Whitespace-only changes.
@@ -0,0 +1,142 @@
|
||||
import aiohttp
|
||||
from base64 import b64decode
|
||||
from sys import exit
|
||||
from pprint import pprint
|
||||
|
||||
class DiffuseAPI():
|
||||
def __init__(self, url, styles, nsfw_enabled=True, num_steps=28):
|
||||
|
||||
self.nsfw_enabled = nsfw_enabled
|
||||
self.num_steps = num_steps
|
||||
self.url = url
|
||||
self.styles = styles
|
||||
self.seed = -1
|
||||
self.width = 512
|
||||
self.height = 1024
|
||||
self.cfg_scale = 12
|
||||
|
||||
def set_steps(self, steps):
|
||||
try:
|
||||
new_steps = int(steps)
|
||||
if 0 > new_steps < 50:
|
||||
self.num_steps = new_steps
|
||||
return True
|
||||
return False
|
||||
except:
|
||||
return False
|
||||
|
||||
def set_seed(self, seed):
|
||||
try:
|
||||
new_seed = int(seed)
|
||||
self.seed = new_seed
|
||||
return True
|
||||
except:
|
||||
return False
|
||||
|
||||
def set_cfg_scale(self, scale):
|
||||
try:
|
||||
new_scale = int(scale)
|
||||
if 0 > new_scale < 30:
|
||||
self.cfg_scale = new_scale
|
||||
return True
|
||||
return False
|
||||
except:
|
||||
return False
|
||||
|
||||
def set_styles(self, styles):
|
||||
if type(styles) == list:
|
||||
self.styles = styles
|
||||
return True
|
||||
return False
|
||||
|
||||
def set_orientation(self, orientation):
|
||||
new_orientation = str(orientation)
|
||||
match new_orientation:
|
||||
case "portrait":
|
||||
self.width = 512
|
||||
self.height = 1024
|
||||
return True
|
||||
case "landscape":
|
||||
self.width = 1024
|
||||
self.height = 512
|
||||
return True
|
||||
case "square":
|
||||
self.width = 512
|
||||
self.height = 512
|
||||
return True
|
||||
case _:
|
||||
return False
|
||||
|
||||
def get_orientation(self):
|
||||
if self.width == 512 and self.height == 512:
|
||||
return ("square", self.width, self.height)
|
||||
elif self.width == 1024:
|
||||
return ("landscape", self.width, self.height)
|
||||
return ("portrait", self.width, self.height)
|
||||
|
||||
def set_nsfw_filter(self, filter_state):
|
||||
if type(filter_state) == bool:
|
||||
self.nsfw_enabled = filter_state
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_nsfw_filter(self):
|
||||
return self.nsfw_enabled
|
||||
|
||||
async def generate_image(self, prompt, neg_prompt=""):
|
||||
payload = {
|
||||
"prompt": prompt,
|
||||
"styles": self.styles,
|
||||
"steps": self.num_steps,
|
||||
"seed": self.seed,
|
||||
"n_iter": 1,
|
||||
"height": self.height,
|
||||
"width": self.width,
|
||||
"negative_prompts": neg_prompt,
|
||||
"cfg_scale": self.cfg_scale
|
||||
}
|
||||
|
||||
settings = {
|
||||
"filter_nsfw": not self.nsfw_enabled,
|
||||
"enable_pnginfo": False
|
||||
}
|
||||
|
||||
override_payload = {
|
||||
"override_settings": settings
|
||||
}
|
||||
|
||||
payload.update(override_payload)
|
||||
|
||||
async with aiohttp.ClientSession(self.url) as session:
|
||||
async with session.head('/') as alive:
|
||||
if alive.status != 200:
|
||||
return None
|
||||
async with session.post("/sdapi/v1/txt2img", json=payload) as image_json:
|
||||
image_data = await image_json.json()
|
||||
return image_data["images"][0]
|
||||
|
||||
async def generate_upscale(self, image):
|
||||
payload = {
|
||||
"resize_mode": 0,
|
||||
"show_extras_results": True,
|
||||
"gfpgan_visibility": 0,
|
||||
"codeformer_visibility": 0,
|
||||
"codeformer_weight": 0,
|
||||
"upscaling_resize": 4,
|
||||
"upscaling_resize_w": 512,
|
||||
"upscaling_resize_h": 1024,
|
||||
"upscaling_crop": True,
|
||||
"upscaler_1": "R-ESRGAN 4x+ Anime6B",
|
||||
"upscaler_2": "None",
|
||||
"extras_upscaler_2_visibility": 0,
|
||||
"upscale_first": False,
|
||||
"image": image
|
||||
}
|
||||
|
||||
async with aiohttp.ClientSession(self.url) as session:
|
||||
async with session.head('/') as alive:
|
||||
if alive.status != 200:
|
||||
return None
|
||||
async with session.post("/sdapi/v1/extra-single-image", json=payload) as image_json:
|
||||
image_data = await image_json.json()
|
||||
return image_data["image"]
|
||||
@@ -0,0 +1,41 @@
|
||||
import aiohttp
|
||||
import asyncio
|
||||
|
||||
class DiffuseAPI:
|
||||
def __init__(self, url, nsfw_enabled, styles, steps):
|
||||
self.url = url
|
||||
self.nsfw_enabled = nsfw_enabled
|
||||
self.styles = styles
|
||||
self.steps = steps
|
||||
self.seed = -1
|
||||
|
||||
def _generate_payload(self):
|
||||
payload = {
|
||||
"prompt": "",
|
||||
"negative_prompt": "",
|
||||
"steps": self.steps,
|
||||
"seed": self.seed,
|
||||
"styles": self.styles,
|
||||
"height": 1024,
|
||||
"width": 512
|
||||
}
|
||||
settings = {
|
||||
"filter_nsfw": not self.nsfw_enabled,
|
||||
"samples_save": True,
|
||||
}
|
||||
|
||||
override_payload = {
|
||||
"override_settings": settings
|
||||
}
|
||||
payload.update(override_payload)
|
||||
return payload
|
||||
|
||||
async def generate_image(self, prompt, negative_prompt=""):
|
||||
async with aiohttp.ClientSession(self.url) as session:
|
||||
payload = self._generate_payload()
|
||||
payload.update({"prompt": prompt, "negative_prompt": negative_prompt})
|
||||
print(payload)
|
||||
async with session.post('/sdapi/v1/txt2img', json=payload) as image_handler:
|
||||
image_data = await image_handler.json()
|
||||
|
||||
print(image_data)
|
||||
@@ -0,0 +1,2 @@
|
||||
discord.py
|
||||
aiohttp
|
||||
+9
-9
@@ -2,7 +2,7 @@
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 32,
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -13,7 +13,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 57,
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -40,24 +40,24 @@
|
||||
"payload.update(override_payload)\n",
|
||||
"\n",
|
||||
"# url = \"https://art.jurydoak.com/sdapi/v1\"\n",
|
||||
"url = \"http://localhost:7860/sdapi/v1\""
|
||||
"url = \"http://10.6.9.69:7860/sdapi/v1\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 58,
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
"<img src=\"data:image/png;base64,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 truncated
|
||||
],
|
||||
"text/plain": [
|
||||
"<IPython.core.display.HTML object>"
|
||||
]
|
||||
},
|
||||
"execution_count": 58,
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -81,7 +81,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3.10.8 64-bit",
|
||||
"display_name": "Python 3.11.0 ('venv': venv)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
@@ -95,12 +95,12 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.10.8"
|
||||
"version": "3.11.0"
|
||||
},
|
||||
"orig_nbformat": 4,
|
||||
"vscode": {
|
||||
"interpreter": {
|
||||
"hash": "e7370f93d1d0cde622a1f8e1c04877d8463912d04d973331ad4851f04de6915a"
|
||||
"hash": "aa19d1669203bff990bc2820f3654fa686baacd13bba0cbe075930f54e624f06"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
+161
@@ -0,0 +1,161 @@
|
||||
import discord
|
||||
from discord.ext import commands
|
||||
import aiohttp
|
||||
from base64 import b64decode, b64encode
|
||||
from sys import exit
|
||||
from modules import diffuseapi
|
||||
import io
|
||||
import hashlib
|
||||
|
||||
try:
|
||||
with open("token.secret", 'r') as f:
|
||||
discord_client_token = f.read()
|
||||
except FileNotFoundError:
|
||||
print("Cannot locate token.secret please generate a token")
|
||||
exit(69)
|
||||
|
||||
intents = discord.Intents.default()
|
||||
intents.message_content = True
|
||||
|
||||
api = diffuseapi.DiffuseAPI("https://art.jurydoak.com", ["Bot"], False, 28)
|
||||
|
||||
# client = discord.Client(intents=intents)
|
||||
|
||||
class Confirm(discord.ui.View):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.value = None
|
||||
|
||||
async def callback(self, interaction: discord.Interaction):
|
||||
await interaction.response.send_message("You wish to upscale this image!")
|
||||
|
||||
# When the confirm button is pressed, set the inner value to `True` and
|
||||
# stop the View from listening to more input.
|
||||
# We also send the user an ephemeral message that we're confirming their choice.
|
||||
@discord.ui.button(label='Upscale', style=discord.ButtonStyle.green)
|
||||
async def confirm(self, interaction: discord.Interaction, button: discord.ui.Button):
|
||||
image_data = await interaction.message.attachments[0].read()
|
||||
await interaction.response.defer()
|
||||
upscaled_image = await api.generate_upscale(b64encode(image_data).decode('utf-8'))
|
||||
data = io.BytesIO(b64decode(upscaled_image))
|
||||
|
||||
await interaction.followup.send("", file=discord.File(data, "upscaled.png"))
|
||||
self.stop()
|
||||
|
||||
|
||||
# This one is similar to the confirmation button except sets the inner value to `False`
|
||||
@discord.ui.button(label='Delete', style=discord.ButtonStyle.grey)
|
||||
async def cancel(self, interaction: discord.Interaction, button: discord.ui.Button):
|
||||
await interaction.message.delete()
|
||||
|
||||
self.stop()
|
||||
|
||||
class Settings:
|
||||
def __init__(self, nsfw_enabled=True, num_steps=28, ai_seed=-1, url="https://art.jurydoak.com", styles=["Bot"]):
|
||||
|
||||
self.nsfw_enabled = nsfw_enabled
|
||||
self.num_steps = num_steps
|
||||
self.ai_seed = ai_seed
|
||||
self.url = url
|
||||
self.styles = styles
|
||||
|
||||
|
||||
main_settings = Settings()
|
||||
activity = discord.Activity(type=discord.ActivityType.listening, name="!help main")
|
||||
|
||||
|
||||
bot = commands.Bot(intents=intents, command_prefix="!", activity=activity, help_command=commands.DefaultHelpCommand())
|
||||
|
||||
@bot.command()
|
||||
async def prompt(ctx, *args):
|
||||
'''Generate an image with the provided prompt'''
|
||||
prompt = " ".join(args)
|
||||
await ctx.reply("Generating your image boo")
|
||||
image_data = await api.generate_image(prompt)
|
||||
view = Confirm()
|
||||
if image_data is None:
|
||||
await ctx.reply("Something went wrong, please report this to the admin so it can be ignored")
|
||||
return
|
||||
decoded_image = b64decode(image_data)
|
||||
h = hashlib.md5()
|
||||
h.update(decoded_image)
|
||||
digest = h.digest()
|
||||
|
||||
if digest == b'i\xac`\xde\xbak\xba\xab{2Z\xcc\tK\xc2~':
|
||||
await ctx.reply("Were no stranger to lewds, but you know the rules, and so do I", file=discord.File("images/404.jpg", "404.jpg"))
|
||||
return
|
||||
print(h.digest())
|
||||
data = io.BytesIO(decoded_image)
|
||||
await ctx.reply("", file=discord.File(data, "_".join(args) + ".png"), view=view)
|
||||
|
||||
|
||||
@bot.command()
|
||||
async def seed(ctx, arg):
|
||||
'''Set the seed for the image generation'''
|
||||
try:
|
||||
arg = int(arg)
|
||||
except:
|
||||
pass
|
||||
|
||||
# global ai_seed
|
||||
api.set_seed(arg)
|
||||
|
||||
await ctx.reply(f"I have updated the seed to {api.seed} for you my master.")
|
||||
|
||||
@bot.command()
|
||||
async def steps(ctx, arg):
|
||||
'''Set how many steps the AI will run (max 50)'''
|
||||
try:
|
||||
arg = int(arg)
|
||||
except:
|
||||
pass
|
||||
|
||||
if arg > 50:
|
||||
await ctx.reply("I'm sorry Dave, I can't do that")
|
||||
return
|
||||
|
||||
# global num_steps
|
||||
api.set_steps(arg)
|
||||
|
||||
await ctx.reply(f"I have updated the steps to {api.num_steps} for you my master.")
|
||||
|
||||
@bot.command()
|
||||
async def settings(ctx):
|
||||
'''See the currently configured settings (BROKEN)'''
|
||||
global ai_seed, steps
|
||||
settings = f"""
|
||||
```
|
||||
seed: {api.seed}
|
||||
steps: {api.steps}
|
||||
```
|
||||
"""
|
||||
await ctx.message.channel.send(settings)
|
||||
|
||||
@bot.command()
|
||||
async def upscale(ctx):
|
||||
"""Upscale the attached image"""
|
||||
orig_image_data = await ctx.message.attachments[0].read()
|
||||
new_data = await api.generate_upscale(b64encode(orig_image_data).decode('utf-8'))
|
||||
data = io.BytesIO(b64decode(new_data))
|
||||
await ctx.reply("", file=discord.File(data, "upscaled_img.png"))
|
||||
|
||||
@bot.command()
|
||||
async def test(ctx):
|
||||
'''Test function, currently changes the URL and bot settings'''
|
||||
if api.url != "http://localhost:7860":
|
||||
api.url = "http://localhost:7860"
|
||||
api.styles = ["default"]
|
||||
activity = discord.Activity(type=discord.ActivityType.listening, name="!help fast")
|
||||
await bot.change_presence(activity=activity)
|
||||
await ctx.reply("Set to fastboi")
|
||||
else:
|
||||
api.url = "https://art.jurydoak.com"
|
||||
api.styles = ["Bot"]
|
||||
activity = discord.Activity(type=discord.ActivityType.listening, name="!help main")
|
||||
await bot.change_presence(activity=activity)
|
||||
await ctx.reply("Set to main api")
|
||||
|
||||
|
||||
|
||||
|
||||
bot.run(discord_client_token)
|
||||
Reference in new issue
Block a user