stable-diffuse-api #2

Merged
benjamyn merged 20 commits from stable-diffuse-api into master 2022-12-11 05:01:12 -05:00
8 changed files with 357 additions and 9 deletions

No files matched your search

+2
View File
@@ -1,3 +1,5 @@
.vscode/
venv/
*.secret
__pycache__/
jmh/
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View File
Whitespace-only changes.
+142
View File
@@ -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"]
+41
View File
@@ -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)
+2
View File
@@ -0,0 +1,2 @@
discord.py
aiohttp
+9 -9
View File
@@ -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
View File
@@ -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)