import gradio as gr import openai import os import IPython import random import requests import json import time import math import io from stability_sdk import client as sclient from io import BytesIO from dotenv import load_dotenv from openai import OpenAI from PIL import Image import stability_sdk.interfaces.gooseai.generation.generation_pb2 as generation load_dotenv() sdurl = "https://stablediffusionapi.com/api/v3/text2img" openai.api_key = os.getenv('OPENAI_API_KEY') #print(openai.api_key) #print (os.environ.get("OPENAI_API_KEY")) client = openai.OpenAI(organization='org-eiNl8e4nk93VLQFDb4EBz9JG') #openai.api_key = os.environ['openai'] #for huggingface i think os.environ['STABILITY_HOST'] = 'grpc.stability.ai:443' stability_api = sclient.StabilityInference( key=os.getenv('STABILITY_KEY'), verbose=True, engine="stable-diffusion-xl-1024-v1-0" ) #generates an AI picture of your char def draw(thechar): thechar=thechar.split("$$$")[0].strip() moretime=50 cfg=8.0 noinit=0 r2="1" r3="1" filename="drunkgrogu"+str(r2)+".png" filenamefilter="calvin"+str(r3)+".png" #await ctx.channel.send(file=discord.File(filename)) #stable-diffusion-xl-1024-v0-9 notoldguy="bad anatomy, fuzzy, out of focus, cut off, low res" try : if noinit : print("initimg") answers = stability_api.generate( prompt=[generation.Prompt(text=thechar,parameters=generation.PromptParameters(weight=1)), generation.Prompt(text=notoldguy,parameters=generation.PromptParameters(weight=-1))], steps=moretime, # defaults to 50 if not specified ) else : print("noinitimg:"+thechar+"\nneg:"+notoldguy) answers = stability_api.generate( prompt=[generation.Prompt(text=thechar,parameters=generation.PromptParameters(weight=1)), generation.Prompt(text=notoldguy,parameters=generation.PromptParameters(weight=-1))], cfg_scale=cfg, steps=moretime, # defaults to 50 if not specified width=1024, height=1024 ) except Exception as eeeee : print(eeeee) try : # iterating over the generator produces the api response for resp in answers: #print(resp) for artifact in resp.artifacts: #print("fin rease:"+str(artifact.finish_reason)) if artifact.finish_reason == generation.FILTER: if random.randrange(0,2)==1 : print("await ctx.channel.send(file=discord.File(filenamefilter))") else : print(" await ctx.channel.send(file=discord.File(filename))") #warnings.warn("Your request activated the API's safety filters and could not be processed. Please modify the prompt and try again.") if artifact.type == generation.ARTIFACT_IMAGE: #print("we got an image") img = Image.open(io.BytesIO(artifact.binary)) #oldoldguy=oldoldguy.replace("|","--") # oldoldguy = oldoldguy.replace("*","") #metadata = PngInfo() #metadata.add_text("prompt", oldguy) thechar=thechar.replace("Character Description","") filename="dndChar"+str(math.trunc(time.time()))+thechar[:80].replace("\n","").replace(",","") filename=filename[:245]+".png" img.save(filename) ##filename="image5r"+str(math.trunc(time.time()))+".png" #print(str(img)) ##filename=filename[:245]+".png" #print(filename) ##img.save(filename) #filename="image5r"+str(math.trunc(time.time()))+".png" #img.save(filename) #display(img) except Exception as eeee : print(eeee.details) print("Error. Have a random image instead:"); #print(response.text) #print(response.output) print(filename) imageBox = gr.Image(value=Image.open(filename)) imageBox2 = img return img #generates an AI description of your character def describe(names,wis,char,str,int,dex,con): print(f"hi{names}") if (wis==0) : print(f"set some stats or roll random") exit prom=f"We're generating Dungeons and Dragons characters for a new campaign, and we need a brief character description, including race" prom+=f" and class. The character's name is {names} with the following stats: Wisdom: {wis},Charisma:{char},Strength:{str}," prom+=f"Intelligence:{int},Dexterity:{dex},Constitution:{con}. Describe the character, and then, separated by $$$ give us the " prom+=f"character's interesting backstory." completion = client.completions.create( model='gpt-3.5-turbo-instruct', prompt=prom, max_tokens=510, temperature=0.77, frequency_penalty=0.2, presence_penalty= 0.25) result =completion.choices[0].text #print(dict(completion).get('usage')) #print(completion.model_dump_json(indent=2)) if not result : result = "Could you be any more boring?" #draw(result.split("$$$")[0],outputs=imageBox2) return result#result.replace("$$$","") #generates an AI nam, def makeName(): prom=f"We're generating Dungeons and Dragons characters for a new campaign, and we need a good, original name." prom+=f" Please imagine and give me just a character name for the player to use. Be creative and fun. No duds." completion = client.completions.create( model='gpt-3.5-turbo-instruct', prompt=prom, max_tokens=50, temperature=0.97) result =completion.choices[0].text #print(dict(completion).get('usage')) #print(completion.model_dump_json(indent=2)) if not result : result = "The Doctor" return result.strip() def stat( ndice, dicerank): # return ndice + dicerank answer=[] for x in range(6) : results = [ # Generate ndice numbers between [1,dice_rank] random.randint(1, dicerank) for n in range(ndice) ] lowest = min(results) # Find the lowest roll among the results results.remove(lowest) # Remove the first instance of that lowest roll answer.append(sum(results)) # Return the sum of the remaining results. return answer with gr.Blocks() as statBlock: gr.Markdown("Your characters stats") nameBox = gr.Textbox(label="Your DND character",show_label=True) nameButt = gr.Button(value="Random Name") wisBox = gr.Number(label="Wisdom",show_label=True,precision=0,minimum=1,maximum=18) charBox = gr.Number(label="Charisma",show_label=True,precision=0) strBox =gr.Number(label="Strength",show_label=True,precision=0) intBox =gr.Number(label="Intelligence",show_label=True,precision=0) dexBox =gr.Number(label="Dexterity",show_label=True,precision=0) conBox =gr.Number(label="Constitution",show_label=True,precision=0) dice = gr.Number(value=4,precision=0,visible=False) dice.visible = False rollButt = gr.Button(value="Roll Stats") describeButt = gr.Button(value="Generate Description") imgButt = gr.Button(value="Generate Image") outputBox=gr.Textbox(label="The character",show_label=True) imageBox = gr.Image() imageBox2 = gr.Image() nameButt.click(makeName,inputs=[],outputs=[nameBox]) rollButt.click(stat, inputs=[dice,gr.Number(value=6, visible=False,precision=0)],outputs=[wisBox,charBox,strBox,intBox,dexBox,conBox]) describeButt.click(describe, outputs=[outputBox],inputs=[nameBox,wisBox,charBox,strBox,intBox,dexBox,conBox]) imgButt.click(draw,inputs=[outputBox],outputs=[imageBox2]) statBlock.launch()