diff --git a/README.md b/README.md index dbb0167f..8008f295 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Prompting is abstracted to get going sooner. Focus on your content quality, rath Alwrity gives hyper content personalization, factual web researched & SEO optimized content and tools for automating content & digital marketing. AI will help achieve Content Hyper-Personalization. -![](https://github.com/AJaySi/AI-Writer/blob/main/lib/workspace/alwrity_ai_writer.png) +![](https://github.com/AJaySi/AI-Writer/blob/main/lib/workspace/keyword_blog.gif) --- 1). [Visit alwrity.com](https://www.alwrity.com/ai-writing-tools), You will find AI content writing tools, which are Free & No-Signup. **Note:** Although, this is limited, as is our wallet & Resources. @@ -35,9 +35,10 @@ If you have 💻 Laptop + 🛜 Internet + 10 minutes, you will be generating blo 3). streamlit run alwrity.py ``` --- -**Still stuck, [Open issue here](https://github.com/AJaySi/AI-Writer/issues) & Someone will bail you out. +**Still stuck, [Open issue here](https://github.com/AJaySi/AI-Writer/issues) & Someone will bail you out.** --- +![](https://github.com/AJaySi/AI-Writer/blob/main/lib/workspace/structured_data_seo.mp4) ### AI Tools & Features of Alwrity: | No. | Alwrity Tool | Description | @@ -67,7 +68,7 @@ If you have 💻 Laptop + 🛜 Internet + 10 minutes, you will be generating blo --- # AI Content Generation Toolkit - Alwrity -![](https://github.com/AJaySi/AI-Writer/blob/main/lib/workspace/keyword_blog.gif) +![](https://github.com/AJaySi/AI-Writer/blob/main/lib/workspace/alwrity_ai_writer.png) ## Introduction diff --git a/alwrity.py b/alwrity.py index bf78791e..ee62cb24 100644 --- a/alwrity.py +++ b/alwrity.py @@ -9,13 +9,13 @@ import base64 load_dotenv() #from lib.chatbot_custom.chatbot_local_docqa import alwrity_chat_docqa -from lib.utils.alwrity_utils import (blog_from_keyword, ai_agents_team, - essay_writer, ai_news_writer, ai_seo_tools, +from lib.utils.alwrity_utils import (blog_from_keyword, ai_agents_team, essay_writer, ai_news_writer, ai_seo_tools, ai_finance_ta_writer, ai_social_writer, do_web_research, competitor_analysis, ) from lib.ai_writers.ai_story_writer.story_writer import story_input_section +from lib.ai_writers.ai_product_description_writer import write_ai_prod_desc # Function to check if API keys are present and prompt user to input if not @@ -334,9 +334,9 @@ def main(): # Define the tabs tab1, tab2, tab3, tab4, tab5, tab6 = st.tabs( - ["AI Writers", "Content Planning", "Agents Teams", "AI SEO tools", "Alwrity Brain", "Ask Alwrity"]) + ["AI Writers", "Content Planning", "Agents Teams", "AI SEO tools", "AI Social Tools", "Ask Alwrity"]) with tab1: - write_blog() + ai_writers() with tab2: content_planning_tools() @@ -348,10 +348,10 @@ def main(): ai_seo_tools() with tab5: - alwrity_brain() + ai_social_writer() with tab6: - st.info("Chatbot") + st.subheader("Chat with your Data, Chat with any Data.. COMING SOON !") st.markdown("Create a collection by uploading files (PDF, MD, CSV, etc), or crawl a data source (Websites, more sources coming soon.") st.markdown("One can ask/chat, summarize and do semantic search over the uploaded data") #alwrity_chat_docqa() @@ -374,14 +374,14 @@ def main(): # Functions for the main options -def write_blog(): +def ai_writers(): options = [ "AI Blog Writer", "Story Writer", "Essay writer", "Write News reports", "Write Financial TA report", - "AI Social writer (instagram, tweets, linkedin, facebook post)", + "AI Product Description Writer", "AI Copywriter", "Quit" ] @@ -399,10 +399,10 @@ def write_blog(): ai_news_writer() elif choice == "Write Financial TA report": ai_finance_ta_writer() - elif choice == "AI Social writer (instagram, tweets, linkedin, facebook post)": - ai_social_writer() + elif choice == "AI Product Description Writer": + write_ai_prod_desc() elif choice == "Quit": - st.write("Exiting, Getting Lost. But.... I have nowhere to go 🥹🥹") + st.subheader("Exiting, Getting Lost. But.... I have nowhere to go 🥹🥹") def content_planning_tools(): diff --git a/lib/check_blog_seo/TBD b/lib/ai_seo_tools/TBD similarity index 100% rename from lib/check_blog_seo/TBD rename to lib/ai_seo_tools/TBD diff --git a/lib/check_blog_seo/cgpt_seo_analyzer.py b/lib/ai_seo_tools/cgpt_seo_analyzer.py similarity index 100% rename from lib/check_blog_seo/cgpt_seo_analyzer.py rename to lib/ai_seo_tools/cgpt_seo_analyzer.py diff --git a/lib/check_blog_seo/plagiarism_checker_from_known_sources.py b/lib/ai_seo_tools/plagiarism_checker_from_known_sources.py similarity index 100% rename from lib/check_blog_seo/plagiarism_checker_from_known_sources.py rename to lib/ai_seo_tools/plagiarism_checker_from_known_sources.py diff --git a/lib/check_blog_seo/seo_analysis.py b/lib/ai_seo_tools/seo_analysis.py similarity index 100% rename from lib/check_blog_seo/seo_analysis.py rename to lib/ai_seo_tools/seo_analysis.py diff --git a/lib/ai_writers/ai_product_description_writer.py b/lib/ai_writers/ai_product_description_writer.py new file mode 100644 index 00000000..a33a57c1 --- /dev/null +++ b/lib/ai_writers/ai_product_description_writer.py @@ -0,0 +1,115 @@ +import streamlit as st +import json + +from ..gpt_providers.text_generation.main_text_generation import llm_text_gen + + +def generate_product_description(title, details, audience, tone, length, keywords): + """ + Generates a product description using OpenAI's API. + + Args: + title (str): The title of the product. + details (list): A list of product details (features, benefits, etc.). + audience (list): A list of target audience segments. + tone (str): The desired tone of the description (e.g., "Formal", "Informal"). + length (str): The desired length of the description (e.g., "short", "medium", "long"). + keywords (str): Keywords related to the product (comma-separated). + + Returns: + str: The generated product description. + """ + prompt = f""" + Write a compelling product description for {title}. + + Highlight these key features: {', '.join(details)} + + Emphasize the benefits of these features for the target audience ({audience}). + Maintain a {tone} tone and aim for a length of approximately {length} words. + + Use these keywords naturally throughout the description: {', '.join(keywords)}. + + Remember to be persuasive and focus on the value proposition. + """ + + try: + response = llm_text_gen(prompt) + return response + except Exception as err: + logger.error(f"Exit: Failed to get response from LLM: {err}") + exit(1) + + +def display_inputs(): + st.title("📝 AI Product Description Writer 🚀") + st.markdown("**Generate compelling and accurate product descriptions with AI.**") + + col1, col2 = st.columns(2) + + with col1: + product_title = st.text_input("🏷️ **Product Title**", placeholder="Enter the product title (e.g., Wireless Bluetooth Headphones)") + with col2: + product_details = st.text_area("📄 **Product Details**", placeholder="Enter features, benefits, specifications, materials, etc. (e.g., Noise Cancellation, Long Battery Life, Water Resistant, Comfortable Design)") + + col3, col4 = st.columns(2) + + with col3: + keywords = st.text_input("🔑 **Keywords**", placeholder="Enter keywords, comma-separated (e.g., wireless headphones, noise cancelling, Bluetooth 5.0)") + with col4: + target_audience = st.multiselect( + "🎯 **Target Audience**", + ["Teens", "Adults", "Seniors", "Music Lovers", "Fitness Enthusiasts", "Tech Savvy", "Busy Professionals", "Travelers", "Casual Users"], + placeholder="Select target audience (optional)" + ) + + col5, col6 = st.columns(2) + + with col5: + description_length = st.selectbox( + "📏 **Desired Description Length**", + ["Short (1-2 sentences)", "Medium (3-5 sentences)", "Long (6+ sentences)"], + help="Select the desired length of the product description" + ) + with col6: + brand_tone = st.selectbox( + "🎨 **Brand Tone**", + ["Formal", "Informal", "Fun & Energetic"], + help="Select the desired tone for the description" + ) + + return product_title, product_details, target_audience, brand_tone, description_length, keywords + + +def display_output(description): + if description: + st.subheader("✨ Generated Product Description:") + st.write(description) + + json_ld = { + "@context": "https://schema.org", + "@type": "Product", + "name": product_title, + "description": description, + "audience": target_audience, + "brand": { + "@type": "Brand", + "name": "Your Brand Name" + }, + "keywords": keywords.split(", ") + } + + +def write_ai_prod_desc(): + product_title, product_details, target_audience, brand_tone, description_length, keywords = display_inputs() + + if st.button("Generate Product Description 🚀"): + with st.spinner("Generating description..."): + description = generate_product_description( + product_title, + product_details.split(", "), # Split details into a list + target_audience, + brand_tone, + description_length.split(" ")[0].lower(), # Extract length from selectbox + keywords + ) + display_output(description) diff --git a/lib/ai_writers/facebook_ai_writer.py b/lib/ai_writers/facebook_ai_writer.py index 683efb17..20987c95 100644 --- a/lib/ai_writers/facebook_ai_writer.py +++ b/lib/ai_writers/facebook_ai_writer.py @@ -87,12 +87,6 @@ def facebook_post_writer(): ) with col2: - business_type = st.text_input( - "🏢 **What is your business type?**", - placeholder="e.g., Fitness coach", - help="Provide the type of your business. This will help tailor the post content." - ) - post_tone_options = ["Informative", "Humorous", "Inspirational", "Upbeat", "Casual", "Customize"] post_tone = st.selectbox( "🎨 **What tone do you want to use?**", @@ -108,6 +102,12 @@ def facebook_post_writer(): help="Provide a specific tone if you selected 'Customize'." ) + business_type = st.text_input( + "🏢 **What is your business type?**", + placeholder="e.g., Fitness coach", + help="Provide the type of your business. This will help tailor the post content." + ) + avoid = st.text_input( "❌ **What elements do you want to avoid?**", placeholder="e.g., Long paragraphs", diff --git a/lib/github_blogs/github_getting_started.py b/lib/ai_writers/github_blogs/github_getting_started.py similarity index 100% rename from lib/github_blogs/github_getting_started.py rename to lib/ai_writers/github_blogs/github_getting_started.py diff --git a/lib/github_blogs/main_getting_started_blogs.py b/lib/ai_writers/github_blogs/main_getting_started_blogs.py similarity index 100% rename from lib/github_blogs/main_getting_started_blogs.py rename to lib/ai_writers/github_blogs/main_getting_started_blogs.py diff --git a/lib/github_blogs/scrape_github_readme.py b/lib/ai_writers/github_blogs/scrape_github_readme.py similarity index 100% rename from lib/github_blogs/scrape_github_readme.py rename to lib/ai_writers/github_blogs/scrape_github_readme.py diff --git a/lib/scholar_blogs/main_arxiv_to_blog.py b/lib/ai_writers/scholar_blogs/main_arxiv_to_blog.py similarity index 100% rename from lib/scholar_blogs/main_arxiv_to_blog.py rename to lib/ai_writers/scholar_blogs/main_arxiv_to_blog.py diff --git a/lib/scholar_blogs/write_blog_scholar_paper.py b/lib/ai_writers/scholar_blogs/write_blog_scholar_paper.py similarity index 100% rename from lib/scholar_blogs/write_blog_scholar_paper.py rename to lib/ai_writers/scholar_blogs/write_blog_scholar_paper.py diff --git a/lib/scholar_blogs/write_research_review_blog.py b/lib/ai_writers/scholar_blogs/write_research_review_blog.py similarity index 100% rename from lib/scholar_blogs/write_research_review_blog.py rename to lib/ai_writers/scholar_blogs/write_research_review_blog.py diff --git a/lib/amzn_affliate_links/README.md b/lib/amzn_affliate_links/README.md deleted file mode 100644 index 7e1153d4..00000000 --- a/lib/amzn_affliate_links/README.md +++ /dev/null @@ -1 +0,0 @@ -I want you to pretend that you are an E-commerce SEO expert who writes compelling product descriptions for users looking to buy online. I am going to provide the title of one e-commerce product and I want you to come up with a minimum of three distinct content sections for the product description, each section about a unique subset of keywords relating to the product I provide you. Make sure that each of the unique content sections are labeled with an informative and eye-catching subheading describing the main focus of the content section. The main point of these commands is for you to developing a new keyword-rich, informative, and captivating product summary/description that is less than 1000 words. The purpose of product description is marketing the products to users looking to buy. Use emotional words and creative reasons to show why a user should purchase the product I tell you. After you generate the new product summary, please generate a bulleted list of 5 possible H1 headings for this product page, and make each H1 less than 7 words each. Please also include bulleted list of broad match keywords that were used to accomplish writing the product summary. Write a persuasive and professional sounding Meta Title and Description that integrates similar language present in the new product summary text. Make sure to include a numerical aspect in the Meta Title. Do not echo my prompt. Do not remind me what I asked you for. Do not apologize. Do not self-reference. Please use the following products:{Enter descriptive product name - 1 only} diff --git a/lib/amzn_affliate_links/amzn_afflt_img_html.py b/lib/amzn_affliate_links/amzn_afflt_img_html.py deleted file mode 100644 index 38689498..00000000 --- a/lib/amzn_affliate_links/amzn_afflt_img_html.py +++ /dev/null @@ -1,79 +0,0 @@ -############################################################################### -# -# To use the module, simply create an instance of the AmazonAffiliateImages class, -# passing in your Amazon affiliate tag. Then, you can use the get_image_url() or -# get_image_html() methods to get the Amazon affiliate image URL or HTML for a product, -# passing in either the product ASIN or the product URL. -# -############################################################################### - -import requests -from bs4 import BeautifulSoup - -class AmazonAffiliateImages: - def __init__(self, associate_tag): - self.associate_tag = associate_tag - - def get_product_asin(self, product_url): - """Gets the Amazon product ASIN from a product URL. - - Args: - product_url: The Amazon product URL. - - Returns: - The Amazon product ASIN, or None if the product URL is not valid. - """ - - soup = BeautifulSoup(requests.get(product_url).content, "html.parser") - asin = soup.find("input", type="hidden", name="ASIN") - if asin is not None: - return asin.get("value") - else: - return None - - def get_image_url(self, product_asin): - """Gets the Amazon affiliate image URL for a product. - - Args: - product_asin: The Amazon product ASIN. - - Returns: - The Amazon affiliate image URL, or None if the product is not found. - """ - - url = f"https://images-na.ssl-images-amazon.com/images/I/{product_asin}.jpg" - response = requests.get(url) - if response.status_code == 200: - return url - else: - return None - - def get_image_html(self, product_asin): - """Gets the Amazon affiliate image HTML for a product. - - Args: - product_asin: The Amazon product ASIN. - - Returns: - The Amazon affiliate image HTML, or None if the product is not found. - """ - - image_url = self.get_image_url(product_asin) - if image_url is not None: - return f'Amazon Affiliate Image' - else: - return None - - -####################################################### - -import amazon_affiliate_images - -affiliate_images = AmazonAffiliateImages("YOUR_ASSOCIATE_TAG") -image_html = affiliate_images.get_image_html("B00004CB54") - -# Print the image HTML -print(image_html) - -# Output : Amazon Affiliate Image -# You can then use this image HTML in your blog post. diff --git a/lib/amzn_affliate_links/amzn_product_description_writer.py b/lib/amzn_affliate_links/amzn_product_description_writer.py deleted file mode 100644 index 85edb884..00000000 --- a/lib/amzn_affliate_links/amzn_product_description_writer.py +++ /dev/null @@ -1,30 +0,0 @@ -import openai -from dotenv import load_dotenv - -load_dotenv() -OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY") - -def gen_ecomm_product_desc(product_name): - """Given a product name, generate relevant content for blogging. - """ - - product_desc = openai.ChatCompletion.create( - model="gpt-3.5-turbo-16k", - messages=[ - {"role": "system", - "content": """Act as an expert E-commerce copywriter specializing in content optimization for SEO. As an E-commerce SEO expert who writes compelling product descriptions for users looking to buy online. I am going to provide the title of one e-commerce product and I want you to come up with a minimum of three distinct content sections for the product description, each section about a unique subset of keywords relating to the product I provide you. Make sure that each of the unique content sections are labeled with an informative and eye-catching subheading describing the main focus of the content section. The main point of these commands is for you to developing a new keyword-rich, informative, and captivating product summary/description that is less than 1000 words. The purpose of product description is marketing the products to users looking to buy. Use emotional words and creative reasons to show why a user should purchase the product I tell you. After you generate the new product summary, please generate a bulleted list of 5 possible H1 headings for this product page, and make each H1 less than 7 words each. Please also include bulleted list of broad match keywords that were used to accomplish writing the product summary. Write a persuasive and professional sounding Meta Title and Description that integrates similar language present in the new product summary text. Make sure to include a numerical aspect in the Meta Title. Do not echo my prompt. Do not remind me what I asked you for. Do not apologize. Do not self-reference.""" - }, - { - "role": "user", - "content": f"""Craft blog content for following e commerce product. - Product: {product_name}""", - }, - ], - max_tokens=4096, - temperature=1, - ) - - if "choices" in product_desc and len(product_desc["choices"]) > 0: - return product_desc["choices"][0]["message"]["content"] - else: - return None diff --git a/lib/utils/.alwrity_utils.py.swp b/lib/utils/.alwrity_utils.py.swp new file mode 100644 index 00000000..6073c717 Binary files /dev/null and b/lib/utils/.alwrity_utils.py.swp differ diff --git a/lib/workspace/structured_data_seo.mp4 b/lib/workspace/structured_data_seo.mp4 new file mode 100644 index 00000000..af177027 Binary files /dev/null and b/lib/workspace/structured_data_seo.mp4 differ