Single session aiohttp all the stuff for real this time

This commit is contained in:
phixxy 2023-07-19 22:05:56 -07:00
parent 5aa35c48ee
commit d259ee4228

View file

@ -142,11 +142,10 @@ async def answer_question(topic, model="gpt-3.5-turbo"):
url = "https://api.openai.com/v1/chat/completions" url = "https://api.openai.com/v1/chat/completions"
try: try:
async with aiohttp.ClientSession() as session: async with bot.http_session.post(url, headers=headers, json=data) as resp:
async with session.post(url, headers=headers, json=data) as resp: response_data = await resp.json()
response_data = await resp.json() response = response_data['choices'][0]['message']['content']
response = response_data['choices'][0]['message']['content'] return response
return response
except Exception as error: except Exception as error:
return await handle_error(error) return await handle_error(error)
@ -189,34 +188,33 @@ async def look_at(ctx, look=False):
url = os.getenv('stablediffusion_url') url = os.getenv('stablediffusion_url')
if url == "disabled": if url == "disabled":
return return
async with aiohttp.ClientSession() as session: for attachment in ctx.attachments:
for attachment in ctx.attachments: if attachment.url.endswith(('.jpg', '.png')):
if attachment.url.endswith(('.jpg', '.png')): print("image seen")
print("image seen")
async with session.get(attachment.url) as response: async with bot.http_session.get(attachment.url) as response:
imageName = "tmp/" + str(len(os.listdir('tmp/'))) + '.png' imageName = "tmp/" + str(len(os.listdir('tmp/'))) + '.png'
with open(imageName, 'wb') as out_file: with open(imageName, 'wb') as out_file:
print('Saving image: ' + imageName) print('Saving image: ' + imageName)
while True: while True:
chunk = await response.content.read(1024) chunk = await response.content.read(1024)
if not chunk: if not chunk:
break break
out_file.write(chunk) out_file.write(chunk)
img_link = my_open_img_file(imageName) img_link = my_open_img_file(imageName)
try: try:
payload = {"image": img_link} payload = {"image": img_link}
async with session.post(f'{url}/sdapi/v1/interrogate', json=payload) as response: async with bot.http_session.post(f'{url}/sdapi/v1/interrogate', json=payload) as response:
data = await response.json() data = await response.json()
description = data.get("caption") description = data.get("caption")
description = description.split(',')[0] description = description.split(',')[0]
metadata += f"<image:{description}>\n" metadata += f"<image:{description}>\n"
except aiohttp.ClientError as error: except aiohttp.ClientError as error:
await handle_error(error) await handle_error(error)
return "ERROR: CLIP may not be running. Could not look at image." return "ERROR: CLIP may not be running. Could not look at image."
return metadata return metadata
@ -250,10 +248,9 @@ async def react_to_msg(ctx, react):
url = "https://api.openai.com/v1/chat/completions" url = "https://api.openai.com/v1/chat/completions"
try: try:
async with aiohttp.ClientSession() as session: async with bot.http_session.post(url, headers=headers, json=data) as resp:
async with session.post(url, headers=headers, json=data) as resp: response_data = await resp.json()
response_data = await resp.json() reaction = response_data['choices'][0]['message']['content']
reaction = response_data['choices'][0]['message']['content']
await ctx.add_reaction(reaction.strip()) await ctx.add_reaction(reaction.strip())
except Exception as error: except Exception as error:
print("Some error happened while trying to react to a message") print("Some error happened while trying to react to a message")
@ -291,19 +288,18 @@ async def chat_response(ctx, channel_vars, chat_history_string):
url = "https://api.openai.com/v1/chat/completions" url = "https://api.openai.com/v1/chat/completions"
try: try:
async with aiohttp.ClientSession() as session: async with bot.http_session.post(url, headers=headers, json=data) as resp:
async with session.post(url, headers=headers, json=data) as resp: response_data = await resp.json()
response_data = await resp.json() response = response_data['choices'][0]['message']['content']
response = response_data['choices'][0]['message']['content'] if "Sparkytron 3000:" in response[0:17]:
if "Sparkytron 3000:" in response[0:17]: response = response.replace("Sparkytron 3000:", "")
response = response.replace("Sparkytron 3000:", "") max_len = 1999
max_len = 1999 if len(response) > max_len:
if len(response) > max_len: messages=[response[y-max_len:y] for y in range(max_len, len(response)+max_len,max_len)]
messages=[response[y-max_len:y] for y in range(max_len, len(response)+max_len,max_len)] else:
else: messages=[response]
messages=[response] for message in messages:
for message in messages: await ctx.channel.send(message)
await ctx.channel.send(message)
except Exception as error: except Exception as error:
await handle_error(error) await handle_error(error)
@ -352,7 +348,8 @@ async def task_loop():
await bot_stuff.send("All daily tasks successfully ran!") await bot_stuff.send("All daily tasks successfully ran!")
async def create_session(): async def create_session():
return aiohttp.ClientSession() timeout = aiohttp.ClientTimeout(total=30)
return aiohttp.ClientSession(timeout=timeout)
async def close_session(http_session): async def close_session(http_session):
await http_session.close() await http_session.close()
@ -628,10 +625,9 @@ async def meme(ctx):
async def generate_random_meme(topic): async def generate_random_meme(topic):
async with aiohttp.ClientSession() as session: async with bot.http_session.get('https://api.imgflip.com/get_memes') as resp:
async with session.get('https://api.imgflip.com/get_memes') as resp: response_data = await resp.json()
response_data = await resp.json() response = response_data['data']['memes']
response = response_data['data']['memes']
memepics = [{'name':image['name'],'url':image['url'],'id':image['id']} for image in response] memepics = [{'name':image['name'],'url':image['url'],'id':image['id']} for image in response]
#Pick a meme format #Pick a meme format
@ -665,9 +661,8 @@ async def meme(ctx):
URL = 'https://api.imgflip.com/caption_image' URL = 'https://api.imgflip.com/caption_image'
try: try:
async with aiohttp.ClientSession() as session: async with bot.http_session.post(URL, params=params) as resp:
async with session.post(URL, params=params) as resp: response = await resp.json()
response = await resp.json()
print(f"Generated Meme = {response['success']}\nImage Link = {response['data']['url']}\nPage Link = {response['data']['page_url']}") print(f"Generated Meme = {response['success']}\nImage Link = {response['data']['url']}\nPage Link = {response['data']['page_url']}")
image_link = response['data']['url'] image_link = response['data']['url']
except Exception as error: except Exception as error:
@ -983,21 +978,20 @@ async def website(ctx):
if url == "disabled": if url == "disabled":
return return
file_list = [] file_list = []
async with aiohttp.ClientSession() as session: for image in image_list:
for image in image_list: filename = image.replace(" ", "").lower() + ".png"
filename = image.replace(" ", "").lower() + ".png" payload = {"prompt": image, "steps": 25}
payload = {"prompt": image, "steps": 25} response = await bot.http_session.post(url=f'{url}/sdapi/v1/txt2img', json=payload)
response = await session.post(url=f'{url}/sdapi/v1/txt2img', json=payload) r = await response.json()
r = await response.json() for i in r['images']:
for i in r['images']: image = Image.open(io.BytesIO(base64.b64decode(i.split(",", 1)[0])))
image = Image.open(io.BytesIO(base64.b64decode(i.split(",", 1)[0]))) png_payload = {"image": "data:image/png;base64," + i}
png_payload = {"image": "data:image/png;base64," + i} response2 = await bot.http_session.post(url=f'{url}/sdapi/v1/png-info', json=png_payload)
response2 = await session.post(url=f'{url}/sdapi/v1/png-info', json=png_payload) pnginfo = PngImagePlugin.PngInfo()
pnginfo = PngImagePlugin.PngInfo() json_response = await response2.json()
json_response = await response2.json() pnginfo.add_text("parameters", json_response.get("info"))
pnginfo.add_text("parameters", json_response.get("info")) image.save(local_folder + filename, pnginfo=pnginfo)
image.save(local_folder + filename, pnginfo=pnginfo) file_list.append(filename)
file_list.append(filename)
return file_list return file_list
async def add_image_filenames(code, file_list): async def add_image_filenames(code, file_list):
@ -1085,7 +1079,7 @@ async def feature(ctx):
help="Generates a picture using stable diffusion and gpt 3.5. It generates a list of 10 random artistic words and feeds them into stable diffusion. Usage: !draw (amount of pictures)", help="Generates a picture using stable diffusion and gpt 3.5. It generates a list of 10 random artistic words and feeds them into stable diffusion. Usage: !draw (amount of pictures)",
brief="Generate a random image" brief="Generate a random image"
) )
async def draw(ctx, http_session = bot.http_session): async def draw(ctx):
url = os.getenv('stablediffusion_url') url = os.getenv('stablediffusion_url')
if url == "disabled": if url == "disabled":
return return
@ -1115,14 +1109,12 @@ async def draw(ctx, http_session = bot.http_session):
negative_prompt = "easynegative verybadimagenegative_v1.3" negative_prompt = "easynegative verybadimagenegative_v1.3"
payload = {"prompt": prompt,"steps": 25, "negative_prompt": negative_prompt,"batch_size": amount} payload = {"prompt": prompt,"steps": 25, "negative_prompt": negative_prompt,"batch_size": amount}
try: try:
#async with aiohttp.ClientSession() as session: async with bot.http_session.post(url=f'{url}/sdapi/v1/txt2img', json=payload) as resp:
async with http_session.post(url=f'{url}/sdapi/v1/txt2img', json=payload) as resp:
r = await resp.json() r = await resp.json()
for i in r['images']: for i in r['images']:
image = Image.open(io.BytesIO(base64.b64decode(i.split(",",1)[0]))) image = Image.open(io.BytesIO(base64.b64decode(i.split(",",1)[0])))
png_payload = {"image": "data:image/png;base64," + i} png_payload = {"image": "data:image/png;base64," + i}
#async with aiohttp.ClientSession() as session: async with bot.http_session.post(url=f'{url}/sdapi/v1/png-info', json=png_payload) as resp2:
async with http_session.post(url=f'{url}/sdapi/v1/png-info', json=png_payload) as resp2:
response2 = await resp2.json() response2 = await resp2.json()
pnginfo = PngImagePlugin.PngInfo() pnginfo = PngImagePlugin.PngInfo()
pnginfo.add_text("parameters", response2.get("info")) pnginfo.add_text("parameters", response2.get("info"))
@ -1296,9 +1288,8 @@ async def change_model(ctx, model_choice='0'):
await ctx.send("This command is currently disabled") await ctx.send("This command is currently disabled")
return return
async with aiohttp.ClientSession() as session: async with bot.http_session.get(url=f'{url}/sdapi/v1/options') as response:
async with session.get(url=f'{url}/sdapi/v1/options') as response: config_json = await response.json()
config_json = await response.json()
current_model = config_json["sd_model_checkpoint"] current_model = config_json["sd_model_checkpoint"]
output = 'Current Model: ' + current_model + '\n' output = 'Current Model: ' + current_model + '\n'
@ -1307,11 +1298,10 @@ async def change_model(ctx, model_choice='0'):
model_id, model_name = model_choices[model_choice] model_id, model_name = model_choices[model_choice]
if current_model != model_id: if current_model != model_id:
payload = {"sd_model_checkpoint": model_id} payload = {"sd_model_checkpoint": model_id}
async with aiohttp.ClientSession() as session: async with bot.http_session.post(url=f'{url}/sdapi/v1/options', json=payload) as response:
async with session.post(url=f'{url}/sdapi/v1/options', json=payload) as response: output = "Changed model to: " + model_name
output = "Changed model to: " + model_name await ctx.send(output)
await ctx.send(output) return
return
else: else:
await ctx.send(f"Already set to use {model_name}") await ctx.send(f"Already set to use {model_name}")
return return
@ -1350,9 +1340,8 @@ async def imagine(ctx):
payload = combine_dicts(payload, key_value_pairs) payload = combine_dicts(payload, key_value_pairs)
try: try:
async with aiohttp.ClientSession() as session: async with bot.http_session.post(url, headers=headers, json=payload) as resp:
async with session.post(url, headers=headers, json=payload) as resp: r = await resp.json()
r = await resp.json()
except Exception as error: except Exception as error:
await ctx.send("My image generation service may not be running.") await ctx.send("My image generation service may not be running.")
await handle_error(error) await handle_error(error)
@ -1365,9 +1354,8 @@ async def imagine(ctx):
png_payload = {"image": "data:image/png;base64," + i} png_payload = {"image": "data:image/png;base64," + i}
try: try:
async with aiohttp.ClientSession() as session: async with bot.http_session.post(url, json=png_payload) as resp:
async with session.post(url, json=png_payload) as resp: response2 = await resp.json()
response2 = await resp.json()
except Exception as error: except Exception as error:
await ctx.send("My image generation service may not be running.") await ctx.send("My image generation service may not be running.")
await handle_error(error) await handle_error(error)
@ -1413,23 +1401,21 @@ async def describe(ctx):
print("Couldn't find image.") print("Couldn't find image.")
return return
async with aiohttp.ClientSession() as session: async with bot.http_session.get(file_url) as response:
async with session.get(file_url) as response: imageName = "tmp/" + str(len(os.listdir("tmp/"))) + ".png"
imageName = "tmp/" + str(len(os.listdir("tmp/"))) + ".png" with open(imageName, 'wb') as out_file:
with open(imageName, 'wb') as out_file: print(f"Saving image: {imageName}")
print(f"Saving image: {imageName}") while True:
while True: chunk = await response.content.read(1024)
chunk = await response.content.read(1024) if not chunk:
if not chunk: break
break out_file.write(chunk)
out_file.write(chunk)
img_link = my_open_img_file(imageName) img_link = my_open_img_file(imageName)
try: try:
payload = {"image": img_link} payload = {"image": img_link}
async with aiohttp.ClientSession() as session: async with bot.http_session.post(url, json=payload) as response:
async with session.post(url, json=payload) as response: r = await response.json()
r = await response.json()
print(r) print(r)
await ctx.send(r.get("caption")) await ctx.send(r.get("caption"))
except Exception as error: except Exception as error:
@ -1464,16 +1450,15 @@ async def reimagine(ctx):
key_value_pairs, prompt = extract_key_value_pairs(prompt) key_value_pairs, prompt = extract_key_value_pairs(prompt)
try: try:
async with aiohttp.ClientSession() as session: async with bot.http_session.get(file_url) as response:
async with session.get(file_url) as response: imageName = "tmp/" + str(len(os.listdir("tmp/"))) + ".png"
imageName = "tmp/" + str(len(os.listdir("tmp/"))) + ".png" with open(imageName, 'wb') as out_file:
with open(imageName, 'wb') as out_file: print(f"Saving image: {imageName}")
print(f"Saving image: {imageName}") while True:
while True: chunk = await response.content.read(1024)
chunk = await response.content.read(1024) if not chunk:
if not chunk: break
break out_file.write(chunk)
out_file.write(chunk)
except Exception as error: except Exception as error:
await ctx.send("My image generation service may not be running.") await ctx.send("My image generation service may not be running.")
@ -1490,23 +1475,22 @@ async def reimagine(ctx):
payload = combine_dicts(payload, key_value_pairs) payload = combine_dicts(payload, key_value_pairs)
try: try:
async with aiohttp.ClientSession() as session: async with bot.http_session.post(url=f'{url}/sdapi/v1/img2img', json=payload) as response:
async with session.post(url=f'{url}/sdapi/v1/img2img', json=payload) as response: data = await response.json()
data = await response.json() for i in data['images']:
for i in data['images']: if not os.path.isdir("tmp/reimagined/"+ str(ctx.author.id)):
if not os.path.isdir("tmp/reimagined/"+ str(ctx.author.id)): os.makedirs("tmp/reimagined/"+ str(ctx.author.id))
os.makedirs("tmp/reimagined/"+ str(ctx.author.id)) image = Image.open(io.BytesIO(base64.b64decode(i.split(",",1)[0])))
image = Image.open(io.BytesIO(base64.b64decode(i.split(",",1)[0]))) png_payload = {"image": "data:image/png;base64," + i}
png_payload = {"image": "data:image/png;base64," + i} async with bot.http_session.post(url=f'{url}/sdapi/v1/png-info', json=png_payload) as resp2:
async with session.post(url=f'{url}/sdapi/v1/png-info', json=png_payload) as resp2: response2 = await resp2.json()
response2 = await resp2.json() pnginfo = PngImagePlugin.PngInfo()
pnginfo = PngImagePlugin.PngInfo() pnginfo.add_text("parameters", response2.get("info"))
pnginfo.add_text("parameters", response2.get("info")) my_filename = "tmp/" + str(len(os.listdir("tmp/"))) + ".png"
my_filename = "tmp/" + str(len(os.listdir("tmp/"))) + ".png" image.save(my_filename, pnginfo=pnginfo)
image.save(my_filename, pnginfo=pnginfo) with open(my_filename, "rb") as fh:
with open(my_filename, "rb") as fh: f = discord.File(fh, filename=my_filename)
f = discord.File(fh, filename=my_filename) await ctx.send(file=f)
await ctx.send(file=f)
except Exception as error: except Exception as error:
await ctx.send("My image generation service may not be running.") await ctx.send("My image generation service may not be running.")
await handle_error(error) await handle_error(error)