Spaces:
Sleeping
Sleeping
import streamlit as st | |
from langchain.prompts import PromptTemplate | |
import requests | |
from langchain.llms import HuggingFaceHub | |
from langchain.chains import LLMChain | |
import io | |
from PIL import Image | |
import json | |
from model import model,tokenizer | |
API = st.secrets("API") | |
# Load existing ideas from a file | |
def load_ideas(): | |
try: | |
with open("ideas.json", "r") as file: | |
ideas = json.load(file) | |
except FileNotFoundError: | |
ideas = [] | |
return ideas | |
# Save ideas to a file | |
def save_ideas(ideas): | |
with open("ideas.json", "w") as file: | |
json.dump(ideas, file) | |
# Save image to a file | |
def save_image(image, image_path): | |
image.save(image_path) | |
# content generation | |
def generate_content(topic): | |
keyword=topic | |
prompt = [{'role': 'user', 'content': f'''Write a comprehensive article about {keyword} covering the following aspects: | |
Introduction, History and Background, Key Concepts and Terminology, Use Cases and Applications, Benefits and Drawbacks, Future Outlook, Conclusion | |
Ensure that the article is well-structured, informative, and at least 2000 words long. Use SEO best practices for content optimization. | |
Add ## before section headers | |
'''}] | |
inputs = tokenizer.apply_chat_template( | |
prompt, | |
add_generation_prompt=True, | |
return_tensors='pt' | |
) | |
tokens = model.generate( | |
inputs.to(model.device), | |
max_new_tokens=10024, | |
temperature=0.8, | |
do_sample=True | |
) | |
content = tokenizer.decode(tokens[0], skip_special_tokens=False) | |
# print(content) | |
return content | |
def divide_content(text): | |
sections = {} | |
lines = text.split('\n') | |
current_section = None | |
for line in lines: | |
line = line.strip() # Remove leading and trailing whitespaces | |
if line.startswith("##"): | |
# Found a new section marker | |
current_section = line[2:] | |
sections[current_section] = "" | |
elif current_section is not None and line: | |
# Append the line to the current section if it's not empty | |
sections[current_section] += line + " " | |
# Remove trailing whitespaces from each section | |
for section_name, section_content in sections.items(): | |
sections[section_name] = section_content.rstrip() | |
return sections | |
# Image Generation | |
API_URL = "https://api-inference.huggingface.co/models/goofyai/3d_render_style_xl" | |
headers = {"Authorization": "Bearer API"} | |
def query(payload): | |
response = requests.post(API_URL, headers=headers, json=payload) | |
return response.content | |
def generat_image(image_prompt,name): | |
image_bytes = query({ | |
"inputs": image_prompt, | |
}) | |
image = Image.open(io.BytesIO(image_bytes)) | |
image.save(f"{name}.png") | |
return image | |
def display_content_with_images(blog): | |
blog_images = [key for key in list(blog.keys()) if "_image" in key] | |
# Streamlit Display | |
st.header(blog['title']) | |
i = 0 | |
# Introduction | |
col1, col2 = st.columns(2, gap='medium') | |
with col1: | |
st.header('Introduction') | |
st.write(blog['Introduction']) | |
with col2: | |
st.image(blog[blog_images[i]], use_column_width=True) | |
i+=1 | |
# History | |
st.header('History and Background') | |
st.write(blog['History and Background']) | |
st.image(blog[blog_images[i]], use_column_width=True) | |
i+=1 | |
# Content | |
col1, col2 = st.columns(2, gap='medium') | |
with col1: | |
st.header('Key Concepts and Terminology') | |
st.write(blog['Key Concepts and Terminology']) | |
with col2: | |
st.image(blog[blog_images[i]], use_column_width=True) | |
i+=1 | |
# Use Cases and Applications | |
st.header('Use Cases and Applications') | |
st.write(blog['Use Cases and Applications']) | |
# Benefits and Drawbacks | |
st.header('Benefits and Drawbacks') | |
st.write(blog['Benefits and Drawbacks']) | |
# Future Outlook | |
st.header('Future Outlook') | |
st.write(blog['Future Outlook']) | |
# Conclusion | |
col1, col2 = st.columns(2, gap='medium') | |
with col1: | |
st.header('Conclusion') | |
st.write(blog['Conclusion']) | |
with col2: | |
st.image(blog[blog_images[i]], use_column_width=True) | |
i+=1 | |
# Streamlit App | |
# Title | |
st.sidebar.title('📝 Previous Ideas') | |
st.title("AI Blog Content Generator 😊") | |
# Main Page | |
col1, col2, col3 = st.columns((1, 3, 1), gap='large') | |
existing_ideas = load_ideas() | |
# Input and button | |
topic = st.text_input("Enter Title for the blog") | |
button_clicked = st.button("Create blog!❤️") | |
# Display existing ideas in the sidebar | |
keys = list(set([key for idea in existing_ideas for key in idea.keys()])) | |
if topic in keys: | |
index = keys.index(topic) | |
selected_idea = st.sidebar.selectbox("Select Idea", keys, key=f"selectbox{topic}", index=index) | |
# Display content and image for the selected idea | |
selected_idea_from_list = next((idea for idea in existing_ideas if selected_idea in idea), None) | |
st.subheader(topic) | |
display_content_with_images(selected_idea_from_list[selected_idea]) | |
else: | |
index = 0 | |
# Check if the topic exists in previous ideas before generating | |
if button_clicked and topic not in keys: | |
st.write('Generating blog post about', topic, '...') | |
st.write('This may take a few minutes.') | |
topic_query = topic | |
content = generate_content(topic) | |
# st.write(content) | |
blog = divide_content(content) | |
st.write(blog) | |
st.header(topic) | |
keyss = list(blog.keys()) | |
image_prompts = [] | |
i=0 | |
while len(image_prompts)<4: | |
try: | |
image_prompts.append((keyss[i],blog[keyss[i]].splitlines()[0])) | |
i+=1 | |
except Exception as e: | |
print(e) | |
i+=1 | |
# Blog Data | |
blog_data = { | |
'title': topic, | |
'Introduction': blog[' Introduction'], | |
'History and Background': blog[' History and Background'], | |
'Key Concepts and Terminology': blog[' Key Concepts and Terminology'], | |
'Use Cases and Applications': blog[' Use Cases and Applications'], | |
'Benefits and Drawbacks': blog[' Benefits and Drawbacks'], | |
'Future Outlook': blog[' Future Outlook'], | |
'Conclusion': blog[' Conclusion'], | |
} | |
for k,image in image_prompts: | |
img = generat_image(image,f" {k}{topic}") | |
blog_data[f'{k}_image'] = f" {k}{topic}.png" | |
display_content_with_images(blog_data) | |
# Save blog with images | |
existing_ideas.append({topic: blog_data}) | |
# Update keys and selected idea in the sidebar | |
keys = list(set([key for idea in existing_ideas for key in idea.keys()])) | |
selected_idea = st.sidebar.selectbox("Select Idea", keys, key=f"selectbox{topic}", index=keys.index(topic)) | |
save_ideas(existing_ideas) | |