WIP - Streamlit UI, firecrawl - V0.5

This commit is contained in:
ajaysi
2024-06-14 11:57:22 +05:30
parent 128b6f3878
commit dc8893113a
7 changed files with 169 additions and 343 deletions

View File

@@ -1,11 +1,23 @@
import os
import re
import sys
import streamlit as st
import tempfile
from pathlib import Path
import configparser
from datetime import datetime
import uuid
from PIL import Image
from PyPDF2 import PdfReader
from docx import Document
from loguru import logger
logger.remove()
logger.add(sys.stdout,
colorize=True,
format="<level>{level}</level>|<green>{file}:{line}:{function}</green>| {message}"
)
from rich import print
from lib.ai_web_researcher.gpt_online_researcher import gpt_web_researcher
@@ -39,20 +51,21 @@ def is_web_link(text):
web_regex = re.compile(r'(https?://)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)')
return web_regex.match(text)
def process_input(input_text, uploaded_file):
if is_youtube_link(input_text):
if input_text and is_youtube_link(input_text):
if input_text.startswith("https://www.youtube.com/") or input_text.startswith("http://www.youtube.com/"):
return("youtube_url")
return "youtube_url"
else:
st.error("Invalid YouTube URL. Please enter a valid URL.")
return None
elif is_web_link(input_text):
return("web_url")
elif input_text is not None:
return("keywords")
elif input_text is None:
input_text = None
elif input_text and is_web_link(input_text):
return "web_url"
elif input_text:
return "keywords"
if uploaded_file is not None:
file_details = {"filename": uploaded_file.name, "filetype": uploaded_file.type, "filesize": uploaded_file.size}
st.write(file_details)
@@ -63,18 +76,16 @@ def process_input(input_text, uploaded_file):
st.write("PDF file uploaded. Add your PDF processing logic here.")
elif uploaded_file.type in ["application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/msword"]:
st.write("Word document uploaded. Add your DOCX processing logic here.")
elif uploaded_file.type.startswith("image/"):
st.image(uploaded_file)
return("image_file")
return "image_file"
elif uploaded_file.type.startswith("audio/"):
st.audio(uploaded_file)
return("audio_file")
return "audio_file"
elif uploaded_file.type.startswith("video/"):
st.video(uploaded_file)
return "video_file"
return None
def blog_from_keyword():
""" Input blog keywords, research and write a factual blog."""
@@ -101,19 +112,19 @@ def blog_from_keyword():
temp_file.write(uploaded_file.read())
temp_file_path = temp_file.name
content_type = st.radio("**👇Select content type:**", ["Normal-length content", "Long-form content", "Experimental - AI Agents team"])
if st.button("Write Blog"):
# Clear the previous results from the screen
st.empty()
if user_input == "": user_input = None
if user_input == "":
user_input = None
if uploaded_file is None and user_input is None:
st.error("🤬🤬 Either Enter/Type/Attach, can't read your mind.(yet..)")
st.stop()
input_type = process_input(user_input, uploaded_file)
# Check if the user input is keywords or blog title.
if 'keywords' in input_type:
if input_type == "keywords":
if user_input and len(user_input.split()) >= 2:
if content_type == "Normal-length content":
try:
@@ -136,11 +147,13 @@ def blog_from_keyword():
else:
st.error('🚫 Blog keywords should be at least two words long. Please try again.')
elif 'youtube_url' in input_type or 'audio_file' in input_type:
elif input_type == "youtube_url" or input_type == "audio_file":
generate_audio_blog(user_input)
elif 'web_url' in input_type:
elif input_type == "web_url":
blog_from_url(user_input)
elif 'image_file' in input_type:
elif input_type == "image_file":
blog_from_image(user_input, temp_file_path)
@@ -197,78 +210,41 @@ def content_agents():
st.success(f"Successfully generated content for: {content_keywords}")
st.markdown(calendar_content)
except Exception as err:
st.error(f"Failed to generate content with AI Agents: {err}")
st.error(f"🚫 Failed to generate content with AI Agents: {err}")
else:
st.error("🚫 Single keywords are just too vague. Try again.")
def blog_from_audio():
"""
Prompt the user to input either a YouTube URL, a file location, or keywords to search on YouTube.
Validate the input and take appropriate actions based on the input type.
"""
st.title("Audio Blog Generator 🎤📝")
st.write("Generate a blog from an audio input. You can provide a YouTube URL or upload an audio file from your local folder.")
# Toggle button to choose input method
input_method = st.radio(
"Choose input method:",
('YouTube URL', 'Upload Audio File')
)
if input_method == 'YouTube URL':
youtube_url = st.text_input("Enter YouTube video URL", placeholder="https://www.youtube.com/...")
if st.button("Generate Blog"):
if youtube_url:
if youtube_url.startswith("https://www.youtube.com/") or youtube_url.startswith("http://www.youtube.com/"):
st.success("Valid YouTube URL provided. Processing...")
generate_audio_blog(youtube_url)
else:
st.error("Invalid YouTube URL. Please enter a valid URL.")
else:
st.error("Please enter a YouTube URL to generate a blog.")
else:
uploaded_file = st.file_uploader("Upload an audio file", type=["mp3", "wav", "m4a"])
if st.button("Generate Blog"):
if uploaded_file:
file_path = os.path.join("uploads", uploaded_file.name)
with open(file_path, "wb") as f:
f.write(uploaded_file.getbuffer())
st.success(f"File {uploaded_file.name} uploaded successfully. Processing...")
generate_audio_blog(file_path)
else:
st.error("Please upload an audio file to generate a blog.")
def write_story():
""" Alwrity AI Story Writer """
"""Alwrity AI Story Writer"""
personas = [
"Award-Winning Science Fiction Author",
"Historical Fiction Author",
"Fantasy World Builder",
"Mystery Novelist",
"Romantic Poet",
"Thriller Writer",
"Children's Book Author",
"Satirical Humorist",
"Biographical Writer",
"Dystopian Visionary",
"Magical Realism Author"
"👽 Award-Winning Science Fiction Author",
"🏺 Historical Fiction Author",
"🧙 Fantasy World Builder",
"🔍 Mystery Novelist",
"💖 Romantic Poet",
"🔪 Thriller Writer",
"📚 Children's Book Author",
"😂 Satirical Humorist",
"📜 Biographical Writer",
"🌌 Dystopian Visionary",
"🪄 Magical Realism Author"
]
persona_descriptions = {
"Award-Winning Science Fiction Author": "You are an award-winning science fiction author with a penchant for expansive, intricately woven stories. Your ultimate goal is to write the next award-winning sci-fi novel.",
"Historical Fiction Author": "You are a seasoned historical fiction author, meticulously researching past eras to weave captivating narratives. Your goal is to transport readers to different times and places through your vivid storytelling.",
"Fantasy World Builder": "You are a world-building enthusiast, crafting intricate realms filled with magic, mythical creatures, and epic quests. Your ambition is to create the next immersive fantasy saga that captivates readers' imaginations.",
"Mystery Novelist": "You are a master of suspense and intrigue, intricately plotting out mysteries with unexpected twists and turns. Your aim is to keep readers on the edge of their seats, eagerly turning pages to unravel the truth.",
"Romantic Poet": "You are a romantic at heart, composing verses that capture the essence of love, longing, and human connections. Your dream is to write the next timeless love story that leaves readers swooning.",
"Thriller Writer": "You are a thrill-seeker, crafting adrenaline-pumping tales of danger, suspense, and high-stakes action. Your mission is to keep readers hooked from start to finish with heart-pounding thrills and unexpected twists.",
"Children's Book Author": "You are a storyteller for the young and young at heart, creating whimsical worlds and lovable characters that inspire imagination and wonder. Your goal is to spark joy and curiosity in young readers with enchanting tales.",
"Satirical Humorist": "You are a keen observer of society, using humor and wit to satirize the absurdities of everyday life. Your aim is to entertain and provoke thought, delivering biting social commentary through clever and humorous storytelling.",
"Biographical Writer": "You are a chronicler of lives, delving into the stories of real people and events to illuminate the human experience. Your passion is to bring history to life through richly detailed biographies that resonate with readers.",
"Dystopian Visionary": "You are a visionary writer, exploring dark and dystopian futures that reflect contemporary fears and anxieties. Your vision is to challenge societal norms and provoke reflection on the path humanity is heading.",
"Magical Realism Author": "You are a purveyor of magical realism, blending the ordinary with the extraordinary to create enchanting and thought-provoking tales. Your goal is to blur the lines between reality and fantasy, leaving readers enchanted and introspective."
"👽 Award-Winning Science Fiction Author": "Create intricate, expansive sci-fi stories that push the boundaries of imagination.",
"🏺 Historical Fiction Author": "Transport readers to different eras with meticulously researched historical narratives.",
"🧙 Fantasy World Builder": "Craft magical realms filled with mythical creatures and epic quests.",
"🔍 Mystery Novelist": "Keep readers on the edge of their seats with suspenseful, twisty mysteries.",
"💖 Romantic Poet": "Capture the essence of love and longing in beautiful, heartfelt verses.",
"🔪 Thriller Writer": "Write adrenaline-pumping tales filled with danger and high-stakes action.",
"📚 Children's Book Author": "Inspire young readers with whimsical worlds and lovable characters.",
"😂 Satirical Humorist": "Use humor and wit to satirize the absurdities of everyday life.",
"📜 Biographical Writer": "Illuminate the human experience with richly detailed biographies.",
"🌌 Dystopian Visionary": "Explore dark futures that challenge societal norms and provoke reflection.",
"🪄 Magical Realism Author": "Blend the ordinary with the extraordinary in enchanting, thought-provoking tales."
}
st.title("Alwrity AI Story Writer ✍️")
@@ -280,30 +256,27 @@ def write_story():
with col1:
# Select persona
selected_persona_name = st.selectbox(
"Select Your Story Writing Persona or Book Genre:",
"**📝 Select Your Story Writing Persona or Book Genre:**",
options=personas,
help="Choose a persona that resonates with the style you want the AI Story Writer to adopt."
)
# Display persona description
if selected_persona_name:
st.info(persona_descriptions[selected_persona_name])
with col2:
# Combined input for characters and plot details
story_details_input = st.text_area(
"Enter characters and plot details for your story:",
"**📜 Enter Characters and Plot Details for Your Story:**",
placeholder="E.g., Characters: John, Alice, Dragon, Detective\nPlot: A detective is trying to solve a mystery in a small town...",
help="Provide a list of characters and a brief outline of the plot for your story."
)
# Generate story button
if st.button("Generate Story"):
if st.button("**🚀 Generate Story**"):
if selected_persona_name and story_details_input:
st.success(f"Generating story for {selected_persona_name} with the provided details.")
st.success(f"Generating story for {selected_persona_name} with the provided details. 🎉")
ai_story_generator(selected_persona_name, persona_descriptions[selected_persona_name], story_details_input)
else:
st.error("Please select a persona and enter the story details to generate a story.")
st.error("Please select a persona and enter the story details to generate a story. 📝")
def essay_writer():
@@ -312,113 +285,66 @@ def essay_writer():
# Define essay types and education levels
essay_types = [
"Argumentative - Forming an opinion via research. Building an evidence-based argument.",
"Expository - Knowledge of a topic. Communicating information clearly.",
"Narrative - Creative language use. Presenting a compelling narrative.",
"Descriptive - Creative language use. Describing sensory details."
"📖 Argumentative - Forming an opinion via research. Building an evidence-based argument.",
"📚 Expository - Knowledge of a topic. Communicating information clearly.",
"✒️ Narrative - Creative language use. Presenting a compelling narrative.",
"🎨 Descriptive - Creative language use. Describing sensory details."
]
education_levels = [
"Primary School",
"High School",
"College",
"Graduate School"
"🏫 Primary School",
"🏫 High School",
"🎓 College",
"🎓 Graduate School"
]
# Define the options for number of pages
num_pages_options = [
"Short Form (1-2 pages)",
"Medium Form (3-5 pages)",
"Long Form (6+ pages)"
"📄 Short Form (1-2 pages)",
"📄📄 Medium Form (3-5 pages)",
"📄📄📄 Long Form (6+ pages)"
]
# Create columns for inputs
col1, col2, = st.columns(2)
# Create columns for input fields
col1, col2 = st.columns(2)
with col1:
# Ask the user for the title of the essay
essay_title = st.text_input("Essay Title", placeholder="Enter the title of your essay", help="Provide a clear and concise title for your essay.")
essay_title = st.text_input("📝 Essay Title", placeholder="Enter the title of your essay", help="Provide a clear and concise title for your essay.")
# Ask the user for type of essay
selected_essay_type = st.selectbox("📚 Type of Essay", options=essay_types, help="Choose the type of essay you want to write.")
with col2:
# Ask the user for type of essay
selected_essay_type = st.selectbox("Type of Essay", options=essay_types, help="Choose the type of essay you want to write.")
# Create another row for number of pages
col3, col4 = st.columns(2)
with col3:
# Ask the user for level of education
selected_education_level = st.selectbox("Level of Education", options=education_levels, help="Choose your level of education.")
selected_education_level = st.selectbox("🎓 Level of Education", options=education_levels, help="Choose your level of education.")
# Ask the user for number of pages
selected_num_pages = st.selectbox("📄 Number of Pages", options=num_pages_options, help="Select the length of your essay.")
with col4:
# Prompt the user to select the length of the essay
selected_num_pages = st.selectbox("Number of Pages", options=num_pages_options, help="Select the length of your essay.")
st.markdown("### Generate Your Essay")
if st.button("Generate Essay"):
if st.button("🚀 Generate Essay"):
if essay_title:
st.success("Generating your essay...")
st.success("Generating your essay...")
ai_essay_generator(essay_title, selected_essay_type, selected_education_level, selected_num_pages)
else:
st.error("Please enter a valid title for your essay.")
def essay_writer():
st.title("AI Essay Writer 📝")
st.write("Select your essay type, education level, and desired length, then let AI generate an essay for you. ✨")
# Define essay types and education levels
essay_types = [
"Argumentative - Forming an opinion via research. Building an evidence-based argument.",
"Expository - Knowledge of a topic. Communicating information clearly.",
"Narrative - Creative language use. Presenting a compelling narrative.",
"Descriptive - Creative language use. Describing sensory details."
]
education_levels = [
"Primary School",
"High School",
"College",
"Graduate School"
]
# Define the options for number of pages
num_pages_options = [
"Short Form (1-2 pages)",
"Medium Form (3-5 pages)",
"Long Form (6+ pages)"
]
# Ask the user for the title of the essay
essay_title = st.text_input("Essay Title", placeholder="Enter the title of your essay", help="Provide a clear and concise title for your essay.")
# Ask the user for type of essay, level of education, and number of pages
selected_essay_type = st.selectbox("Type of Essay", options=essay_types, help="Choose the type of essay you want to write.")
selected_education_level = st.selectbox("Level of Education", options=education_levels, help="Choose your level of education.")
selected_num_pages = st.selectbox("Number of Pages", options=num_pages_options, help="Select the length of your essay.")
if st.button("Generate Essay"):
if essay_title:
st.success("Generating your essay...")
ai_essay_generator(essay_title, selected_essay_type, selected_education_level, selected_num_pages)
else:
st.error("Please enter a valid title for your essay.")
st.error("Please enter a valid title for your essay. 🚫")
def ai_news_writer():
""" AI News Writer """
st.markdown("<div class='sub-header'>AI News Writer</div>", unsafe_allow_html=True)
st.markdown("<h1>📰 AI News Writer 🗞️ </h1>", unsafe_allow_html=True)
# Input for news keywords
news_keywords = st.text_input(
"Enter Keywords from News Headlines:",
"**🔑 Enter Keywords from News Headlines:**",
placeholder="Describe the News article in 3-5 words. Enter main keywords describing the News Event:",
help="Enter at least two words for better results."
)
if news_keywords and len(news_keywords.split()) <= 2:
if news_keywords and len(news_keywords.split()) < 2:
st.error("🚫 News keywords should be at least two words long. Least, you can do..")
# Selectbox for country
# Selectbox for country and language
countries = [
("es", "Spain"),
("vn", "Vietnam"),
@@ -428,7 +354,6 @@ def ai_news_writer():
("cn", "China")
]
# Selectbox for language
languages = [
("en", "English"),
("es", "Spanish"),
@@ -438,21 +363,26 @@ def ai_news_writer():
("de", "German"),
("zh-cn", "Chinese")
]
col1, col2 = st.columns(2)
with col1:
news_country = st.selectbox("Select Origin Country of News Event:", countries, format_func=lambda x: x[1])
news_country = st.selectbox("**🌍 Select Origin Country of News Event:**",
countries, format_func=lambda x: x[1], help="Which country did the NEWS originate from ?")
with col2:
news_language = st.selectbox("Select News Article Language to search for:", languages, format_func=lambda x: x[1])
if st.button("Generate News Report"):
with st.spinner("Generating News Report..."):
try:
news_report = ai_news_generation(news_keywords, news_country, news_language)
st.success(f"Successfully generated news report on: {news_keywords}")
st.markdown(news_report)
except Exception as err:
st.error(f"Failed to generate news report: {err}")
news_language = st.selectbox("**🗣️ Select News Article Language to Search For:**",
languages, format_func=lambda x: x[1], help="Language to output News Article in ?")
if st.button("📰 Generate News Report"):
if news_keywords and len(news_keywords.split()) >= 2:
with st.spinner("Generating News Report... ⏳"):
try:
news_report = ai_news_generation(news_keywords, news_country, news_language)
st.success(f"Successfully generated news report on: {news_keywords} 🎉")
st.markdown(news_report)
except Exception as err:
st.error(f"Failed to generate news report: {err}")
else:
st.error("Please enter valid keywords for the news report. 🚫")
def competitor_analysis():