diff --git a/lib/ai_writers/keywords_to_blog_streamlit.py b/lib/ai_writers/keywords_to_blog_streamlit.py
index 5e009722..2b40e6e5 100644
--- a/lib/ai_writers/keywords_to_blog_streamlit.py
+++ b/lib/ai_writers/keywords_to_blog_streamlit.py
@@ -20,6 +20,7 @@ from .blog_from_google_serp import write_blog_google_serp, blog_with_research
from ..ai_web_researcher.you_web_reseacher import get_rag_results, search_ydc_index
from ..blog_metadata.get_blog_metadata import blog_metadata
from ..blog_postprocessing.save_blog_to_file import save_blog_to_file
+from ..gpt_providers.text_to_image_generation.main_generate_image_from_prompt import generate_image
def write_blog_from_keywords(search_keywords, url=None):
@@ -80,22 +81,29 @@ def write_blog_from_keywords(search_keywords, url=None):
logger.error(f"Failed to do Tavily AI research: {err}")
status.update(label="🙎 Generating - Title, Meta Description, Tags, Categories for the content.")
- blog_title, blog_meta_desc, blog_tags, blog_categories = blog_metadata(blog_markdown_str,
- search_keywords, example_blog_titles)
-
- generated_image_filepath = None
+ try:
+ blog_title, blog_meta_desc, blog_tags, blog_categories = blog_metadata(blog_markdown_str)
+ except Exception as err:
+ st.error(f"Failed to get blog metadata: {err}")
+
+ try:
+ generated_image_filepath = generate_image(f"{blog_title} + ' ' + {blog_meta_desc}")
+ except Exception as err:
+ st.error(f"Failed in Image generation: {err}")
saved_blog_to_file = save_blog_to_file(blog_markdown_str, blog_title, blog_meta_desc,
blog_tags, blog_categories, generated_image_filepath)
status.update(label=f"Saved the content in this file: {saved_blog_to_file}")
blog_frontmatter = dedent(f"""
\n---------------------------------------------------------------------
- title: {blog_title.strip()}\n
- categories: [{blog_categories.strip()}]\n
- tags: [{blog_tags.strip()}]\n
- Meta description: {blog_meta_desc.replace(":", "-").strip()}\n
+ title: {blog_title}\n
+ categories: [{blog_categories}]\n
+ tags: [{blog_tags}]\n
+ Meta description: {blog_meta_desc.replace(":", "-")}\n
---------------------------------------------------------------------\n
""")
logger.info(f"\n\n --------- Finished writing Blog for : {search_keywords} -------------- \n")
- st.markdown(f"{blog_frontmatter}\n\n{blog_markdown_str}")
+ st.markdown(f"{blog_frontmatter"}
+ st.image(generated_image_filepath)
+ st.markdown(f"{blog_markdown_str}")
status.update(label=f"Finished, Review & Use your Original Content Below: {saved_blog_to_file}")
diff --git a/lib/blog_metadata/get_blog_metadata.py b/lib/blog_metadata/get_blog_metadata.py
index 65ee63bf..eccca68c 100644
--- a/lib/blog_metadata/get_blog_metadata.py
+++ b/lib/blog_metadata/get_blog_metadata.py
@@ -1,26 +1,58 @@
import sys
-
-from .get_blog_meta_desc import generate_blog_description
-from .get_tags import get_blog_tags
-from .get_blog_category import get_blog_categories
-from .get_blog_title import generate_blog_title
+import configparser
+import json
from loguru import logger
logger.remove()
logger.add(sys.stdout,
colorize=True,
format="{level}|{file}:{line}:{function}| {message}"
- )
+ )
+
+from ..gpt_providers.text_generation.main_text_generation import llm_text_gen
-def blog_metadata(blog_content, search_keywords=None, blog_titles=None):
+def blog_metadata(blog_content):
""" Common function to get blog metadata """
- blog_title = generate_blog_title(blog_content, search_keywords, blog_titles)
- blog_meta_desc = generate_blog_description(blog_content)
- logger.info(f"The blog meta description is: {blog_meta_desc}\n")
- blog_tags = get_blog_tags(blog_content)
- logger.info(f"Blog tags for generated content: {blog_tags}")
- blog_categories = get_blog_categories(blog_content)
- logger.info(f"Generated blog categories: {blog_categories}\n")
+ logger.info(f"Generating Content MetaData\n")
- return(blog_title, blog_meta_desc, blog_tags, blog_categories)
+ blog_metadata_prompt = """
+ As an expert SEO and content writer, I will provide you with blog content.
+
+ 1. Suggest only 2 blog categories which are most relevant to the provided blog content, by identifying the main topic.
+ Also consider the target audience and the blog's category taxonomy. Only reply with comma-separated values.
+ 2. Compose a compelling meta description for the given blog content, adhering to SEO best practices.
+ Keep it between 150-160 characters. Provide a glimpse of the content's value to entice readers.
+ Respond with only one of your best efforts and do not include your explanations.
+ 3. Write 1 blog title following SEO best practices. Please keep the title concise, not exceeding 60 words.
+ Respond with only 1 title and no explanations. Negative Keywords: Unveiling, unleash, power of. Don't use such words in your title.
+ 4. Suggest only 2 relevant and specific blog tags for the given blog content. Only reply with comma-separated values.
+
+ The blog content is: '{blog_article}'
+
+ Please provide the result in the following JSON format:
+
+ {
+ "title": "Your generated blog title",
+ "meta_description": "Your generated meta description",
+ "tags": ["tag1", "tag2"],
+ "categories": ["category1", "category2"]
+ }
+ """
+ try:
+ response = llm_text_gen(blog_metadata_prompt)
+ """ Cleans the response by removing ``` and 'json' strings """
+ result_json = response.replace("```", "").replace("json", "").strip()
+ # Convert the cleaned response to JSON
+ result_json = json.loads(result_json)
+ except Exception as err:
+ logger.error(f"Failed to get response from LLM: {err}")
+ raise err
+
+ # Extract the data from the JSON response
+ blog_title = result_json.get("title")
+ blog_meta_desc = result_json.get("meta_description")
+ blog_tags = result_json.get("tags")
+ blog_categories = result_json.get("categories")
+
+ return blog_title, blog_meta_desc, blog_tags, blog_categories
diff --git a/lib/gpt_providers/text_to_image_generation/gen_stabl_diff_img.py b/lib/gpt_providers/text_to_image_generation/gen_stabl_diff_img.py
index 0f801035..9e1a0576 100644
--- a/lib/gpt_providers/text_to_image_generation/gen_stabl_diff_img.py
+++ b/lib/gpt_providers/text_to_image_generation/gen_stabl_diff_img.py
@@ -45,7 +45,7 @@ def generate_stable_diffusion_image(prompt):
raise Exception("Non-200 response: " + str(response.text))
data = response.json()
- save_generated_image(data)
+ img_path = save_generated_image(data)
for i, image in enumerate(data["artifacts"]):
# Decode base64 image data
@@ -53,4 +53,6 @@ def generate_stable_diffusion_image(prompt):
# Open image using PIL
img = Image.open(BytesIO(img_data))
# Display the image
- img.show()
+ img.show()
+
+ return img_path
diff --git a/lib/gpt_providers/text_to_image_generation/main_generate_image_from_prompt.py b/lib/gpt_providers/text_to_image_generation/main_generate_image_from_prompt.py
index 602cf01d..8d357b0d 100644
--- a/lib/gpt_providers/text_to_image_generation/main_generate_image_from_prompt.py
+++ b/lib/gpt_providers/text_to_image_generation/main_generate_image_from_prompt.py
@@ -26,7 +26,7 @@ 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):
+def generate_image(user_prompt):
"""
The generation API endpoint creates an image based on a text prompt.
@@ -42,12 +42,15 @@ def generate_image(user_prompt, image_engine):
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.
"""
+ # FIXME: Need to remove default value to match sidebar input.
+ image_engine = 'Stability-AI'
+
try:
img_prompt = generate_img_prompt(user_prompt)
if 'Dalle3' in image_engine:
logger.info(f"Calling Dalle3 text-to-image with prompt: {img_prompt}")
image_stored_at = generate_dalle3_images(img_prompt)
- elif 'Stability-Stable-Diffusion' in image_engine:
+ elif 'Stability-AI' in image_engine:
logger.info(f"Calling Stable diffusion text-to-image with prompt: \n{img_prompt}")
print("\n\n")
image_stored_at = generate_stable_diffusion_image(img_prompt)