Create images for blogs - Stability AI

This commit is contained in:
ajaysi
2024-04-22 19:02:55 +05:30
parent 357cba36e4
commit aec2d6b432
11 changed files with 108 additions and 71 deletions

6
..env Normal file
View File

@@ -0,0 +1,6 @@
STABILITY_API_KEY=sk-Jdu0BrFe4tta19PDpU1AlpVAtE3eJlmGZiAYx61bNUZkAl4d
STABILITY_API_KEY=sk-Jdu0BrFe4tta19PDpU1AlpVAtE3eJlmGZiAYx61bNUZkAl4d
STABILITY_API_KEY=asada
STABILITY_API_KEY=sk-Jdu0BrFe4tta19PDpU1AlpVAtE3eJlmGZiAYx61bNUZkAl4d
STABILITY_API_KEY=sdsa
STABILITY_API_KEY=sk-Jdu0BrFe4tta19PDpU1AlpVAtE3eJlmGZiAYx61bNUZkAl4d

View File

@@ -69,6 +69,7 @@ def start_interactive_mode():
("Competitor Analysis", "Competitor Analysis"), ("Competitor Analysis", "Competitor Analysis"),
("Create Blog Images", "Create Blog Images"), ("Create Blog Images", "Create Blog Images"),
("AI Social Media(TBD)", "AI Social Media(TBD)"), ("AI Social Media(TBD)", "AI Social Media(TBD)"),
("AI Code Writer(TBD)", "AI Code Writer(TBD)"),
("Quit", "Quit") ("Quit", "Quit")
] ]
mode = radiolist_dialog(title="Choose an option:", values=choices).run() mode = radiolist_dialog(title="Choose an option:", values=choices).run()
@@ -98,6 +99,9 @@ def start_interactive_mode():
#Linked-in posts #Linked-in posts
""") """)
raise typer.Exit() raise typer.Exit()
elif mode == 'AI Code Writer(TBD)':
print("Coming soon, TBD")
raise typer.Exit()
elif mode == 'Quit': elif mode == 'Quit':
typer.echo("Exiting, Getting Lost!") typer.echo("Exiting, Getting Lost!")
raise typer.Exit() raise typer.Exit()
@@ -178,7 +182,7 @@ def check_llm_environs():
# Load .env file # Load .env file
load_dotenv(Path('.env')) load_dotenv(Path('.env'))
gpt_provider = os.getenv("GPT_PROVIDER") gpt_provider = os.getenv("GPT_PROVIDER")
# Disable unsupported GPT providers # Disable unsupported GPT providers
supported_providers = ['google', 'openai', 'mistralai'] supported_providers = ['google', 'openai', 'mistralai']
if gpt_provider is None or gpt_provider.lower() not in map(str.lower, supported_providers): if gpt_provider is None or gpt_provider.lower() not in map(str.lower, supported_providers):
@@ -189,7 +193,7 @@ def check_llm_environs():
# Update .env file # Update .env file
os.environ["GPT_PROVIDER"] = gpt_provider os.environ["GPT_PROVIDER"] = gpt_provider
with open(".env", "a") as env_file: with open(".env", "a") as env_file:
env_file.write(f"GPT_PROVIDER=gpt_provider\n") env_file.write(f"GPT_PROVIDER={gpt_provider}\n")
print(f"✅ API Key added to .env file.") print(f"✅ API Key added to .env file.")
if gpt_provider.lower() == "google": if gpt_provider.lower() == "google":
@@ -241,7 +245,8 @@ if __name__ == "__main__":
os.system("clear" if os.name == "posix" else "cls") os.system("clear" if os.name == "posix" else "cls")
check_search_apis() check_search_apis()
check_llm_environs() check_llm_environs()
os.environ["SEARCH_SAVE_FILE"] = os.path.join(os.getcwd(), "workspace", os.environ["SEARCH_SAVE_FILE"] = os.path.join(os.getcwd(), "lib", "workspace") + "_" + datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
"web_research_report" + "_" + datetime.now().strftime("%Y-%m-%d_%H-%M-%S")) os.environ["IMG_SAVE_DIR"] = os.path.join(os.getcwd(), "lib", "workspace")
load_dotenv(Path('.env')) load_dotenv(Path('.env'))
app() app()

View File

@@ -1,41 +1,56 @@
from PIL import Image
import requests
# Ensure you sign up for an account to obtain an API key: # Ensure you sign up for an account to obtain an API key:
# https://platform.stability.ai/ # https://platform.stability.ai/
# Your API key can be found here after account creation: # Your API key can be found here after account creation:
# https://platform.stability.ai/account/keys # https://platform.stability.ai/account/keys
import base64
import os
import requests
from PIL import Image
from io import BytesIO
from .save_image import save_generated_image
def generate_stable_diffusion_image(prompt): def generate_stable_diffusion_image(prompt):
""" engine_id = "stable-diffusion-xl-1024-v1-0"
Generate images using Stable Diffusion API based on a given prompt. api_host = os.getenv('API_HOST', 'https://api.stability.ai')
api_key = os.getenv("STABILITY_API_KEY")
Args:
prompt (str): The prompt to generate the image. if api_key is None:
image_dir (str): The directory where the image will be saved. raise Exception("Missing Stability API key.")
Raises:
Warning: If the adult content classifier is triggered.
Exception: For any issues during image generation or saving.
"""
api_key = os.getenv('STABILITY_API_KEY')
response = requests.post( response = requests.post(
f"https://api.stability.ai/v2beta/stable-image/generate/sd3", f"{api_host}/v1/generation/{engine_id}/text-to-image",
headers={ headers={
"authorization": f"Bearer {api_key}", "Content-Type": "application/json",
"accept": "image/*" "Accept": "application/json",
"Authorization": f"Bearer {api_key}"
}, },
files={"none": ''}, json={
data={ "text_prompts": [
"prompt": prompt, {
"output_format": "webp", "text": prompt
}
],
"cfg_scale": 7,
"height": 1024,
"width": 1024,
"samples": 1,
"steps": 30,
}, },
) )
if response.status_code != 200:
raise Exception("Non-200 response: " + str(response.text))
data = response.json()
save_generated_image(data)
if response.status_code == 200: for i, image in enumerate(data["artifacts"]):
with open("./dog-wearing-glasses.jpeg", 'wb') as file: # Decode base64 image data
file.write(response.content) img_data = base64.b64decode(image["base64"])
else: # Open image using PIL
raise Exception(str(response.json())) img = Image.open(BytesIO(img_data))
# Display the image
img.show()

View File

@@ -23,9 +23,10 @@ logger.add(sys.stdout,
#from .gen_dali2_images #from .gen_dali2_images
from .gen_dali3_images import generate_dalle3_images from .gen_dali3_images import generate_dalle3_images
from .gen_stabl_diff_img import generate_stable_diffusion_image from .gen_stabl_diff_img import generate_stable_diffusion_image
from ..text_generation.main_text_generation import llm_text_gen
def generate_image(user_prompt, image_engine="dalle3"): def generate_image(user_prompt, image_engine):
""" """
The generation API endpoint creates an image based on a text prompt. The generation API endpoint creates an image based on a text prompt.
@@ -41,15 +42,17 @@ def generate_image(user_prompt, image_engine="dalle3"):
Must be one of "url" or "b64_json". Defaults to "url". Must be one of "url" or "b64_json". Defaults to "url".
--> user (str): A unique identifier representing your end-user, which will help OpenAI to monitor and detect abuse. --> user (str): A unique identifier representing your end-user, which will help OpenAI to monitor and detect abuse.
""" """
img_prompt = generate_img_prompt(user_prompt) try:
# call the OpenAI API to generate image from prompt. img_prompt = generate_img_prompt(user_prompt)
logger.info(f"Calling image.generate with prompt: {img_prompt}") if 'Dalle3' in image_engine:
logger.info(f"Calling Dalle3 text-to-image with prompt: {img_prompt}")
if 'Dalle3' in image_engine: image_stored_at = generate_dalle3_images(img_prompt)
image_stored_at = generate_dalle3_images(img_prompt) elif 'Stability-Stable-Diffusion' in image_engine:
elif 'Stable Diffusion' in image_engine: logger.info(f"Calling Stable diffusion text-to-image with prompt: \n{img_prompt}")
image_stored_at = generate_stable_diffusion_image(img_prompt) print("\n\n")
image_stored_at = generate_stable_diffusion_image(img_prompt)
except Exception as err:
logger.error(f"Failed to generate Image: {err}")
return image_stored_at return image_stored_at
@@ -57,17 +60,16 @@ def generate_img_prompt(user_prompt):
""" """
Given prompt, this functions generated a prompt for image generation. Given prompt, this functions generated a prompt for image generation.
""" """
# I want you to act as an artist advisor providing advice on various art styles such tips on utilizing prompt = f"""
# light & shadow effects effectively in painting, shading techniques while sculpting etc. As an expert prompt engineer and artist, I will provide you with 'text' for creating image.
# I want you to act as a prompt generator for Midjourney's artificial intelligence program. I want you to act as a prompt generator for AI text to image models(no more than 150 words).
# Your job is to provide detailed and creative descriptions that will inspire unique and interesting images from the AI. \n
# Here is your first prompt: "" Choose from various art styles, utilize light & shadow effects etc.
logger.info(f"Generate image prompt for : {user_prompt}") Make sure to avoid common image generation mistakes.
prompt = f"""As an educationist and expert infographic artist, your tasked to create prompts that will be used for image generation. Reply with only one answer, no descrition and in plaintext.
Craft prompt for Openai Dall-e image generation program. Clearly describe the given text to represent it as image. Make sure your prompt is detailed and creative descriptions that will inspire unique and interesting images from the AI.
Make sure to avoid common image generation mistakes.
Advice for creating prompt for image from the given text(no more than 150 words). \n\ntext:{user_prompt} """
Reply with only one answer and no descrition. Generate image prompt for the below text.
Text: {user_prompt}""" response = llm_text_gen(prompt)
response = (prompt)
return response return response

View File

@@ -1,35 +1,28 @@
import base64
import datetime import datetime
import os import os
import requests import requests
from PIL import Image from PIL import Image
import logging import logging
def save_generated_image(img_generation_response, image_dir): def save_generated_image(img_generation_response):
""" """
Save generated images for blog, ensuring unique names for SEO. Save generated images for blog, ensuring unique names for SEO.
""" """
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
generated_image_name = f"generated_image_{datetime.datetime.now():%Y-%m-%d-%H-%M-%S}.png" generated_image_name = f"generated_image_{datetime.datetime.now():%Y-%m-%d-%H-%M-%S}.webp"
generated_image_filepath = os.path.join(image_dir, generated_image_name) generated_image_filepath = os.path.join(os.getenv('IMG_SAVE_DIR'), generated_image_name)
generated_image_url = img_generation_response.data[0].url
logger.info(f"Fetch the image from url: {generated_image_url}")
try: try:
response = requests.get(generated_image_url, stream=True) for i, image in enumerate(img_generation_response["artifacts"]):
response.raise_for_status() with open(generated_image_filepath, "wb") as f:
with open(generated_image_filepath, "wb", encoding="utf-8") as image_file: f.write(base64.b64decode(image["base64"]))
image_file.write(response.content)
except requests.exceptions.RequestException as e: except requests.exceptions.RequestException as e:
logger.error(f"Failed to get generated image content: {e}") logger.error(f"Failed to get generated image content: {e}")
return None return None
logger.info(f"Saved image at path: {generated_image_filepath}") logger.info(f"Saved image at path: {generated_image_filepath}")
if os.environ.get('DISPLAY', ''): # Check if display is supported
img = Image.open(generated_image_filepath)
img.show()
return generated_image_filepath return generated_image_filepath

Binary file not shown.

View File

@@ -8,6 +8,8 @@ from prompt_toolkit import prompt
from prompt_toolkit.completion import WordCompleter from prompt_toolkit.completion import WordCompleter
from prompt_toolkit.validation import Validator, ValidationError from prompt_toolkit.validation import Validator, ValidationError
from prompt_toolkit.shortcuts import radiolist_dialog from prompt_toolkit.shortcuts import radiolist_dialog
import typer
from rich import print
from lib.ai_web_researcher.gpt_online_researcher import gpt_web_researcher from lib.ai_web_researcher.gpt_online_researcher import gpt_web_researcher
from lib.ai_web_researcher.metaphor_basic_neural_web_search import metaphor_find_similar from lib.ai_web_researcher.metaphor_basic_neural_web_search import metaphor_find_similar
@@ -15,7 +17,7 @@ from lib.ai_writers.keywords_to_blog import write_blog_from_keywords
from lib.ai_writers.speech_to_blog.main_audio_to_blog import generate_audio_blog from lib.ai_writers.speech_to_blog.main_audio_to_blog import generate_audio_blog
from lib.gpt_providers.text_generation.ai_story_writer import ai_story_generator from lib.gpt_providers.text_generation.ai_story_writer import ai_story_generator
from lib.gpt_providers.text_generation.ai_essay_writer import ai_essay_generator from lib.gpt_providers.text_generation.ai_essay_writer import ai_essay_generator
from lib.gpt_providers.text_to_image_generation.generate_image_from_prompt import generate_image from lib.gpt_providers.text_to_image_generation.main_generate_image_from_prompt import generate_image
def blog_from_audio(): def blog_from_audio():
@@ -270,7 +272,21 @@ def image_generator():
print("Choose between:: Stable-Diffusion, Dalle2, Dalle3") print("Choose between:: Stable-Diffusion, Dalle2, Dalle3")
img_model = prompt('Choose the image model to use for generation: ', completer=img_models, validator=ModelTypeValidator()) img_model = prompt('Choose the image model to use for generation: ', completer=img_models, validator=ModelTypeValidator())
print(f"{img_prompt}----{img_model}") if 'Stability-Stable-Diffusion' in img_model:
api_key = 'STABILITY_API_KEY'
elif 'Dalle3' in img_model:
api_key = 'OPENAI_API_KEY'
if os.getenv(api_key) is None:
print(f"\n\n[bold green] 🙋 Get {api_key} Here:https://platform.stability.ai/docs/getting-started 🙋 -- \n")
user_input = typer.prompt(f"💩 -**Please Enter(copy/paste) {api_key} Key** - Here🙋:")
os.environ[api_key] = user_input
try:
with open(".env", "a") as env_file:
env_file.write(f"{api_key}={user_input}\n")
print(f"✅ API Key added to .env file.")
except Exception as err:
print(f"Error: {err}")
try: try:
generate_image(img_prompt, img_model) generate_image(img_prompt, img_model)
except Exception as err: except Exception as err:

View File

Before

Width:  |  Height:  |  Size: 855 KiB

After

Width:  |  Height:  |  Size: 855 KiB

View File

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB