Spaces:
Sleeping
Sleeping
from diffusers import StableDiffusionPipeline | |
import torch | |
from langchain.chains import LLMChain | |
from langchain.llms import HuggingFaceHub | |
from langchain.prompts import PromptTemplate | |
import requests | |
import base64 | |
import streamlit as st | |
import json | |
# 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) | |
# Function to generate content | |
def generate_content(topic): | |
hub_llm = HuggingFaceHub(repo_id="HuggingFaceH4/zephyr-7b-beta") | |
prompt = PromptTemplate( | |
input_variables=['keyword'], | |
template=""" | |
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 1500 words long. Use SEO best practices for content optimization. | |
""" | |
) | |
hub_chain = LLMChain(prompt=prompt, llm=hub_llm, verbose=True) | |
content = hub_chain.run(topic) | |
subheadings = [ | |
"Introduction", | |
"History and Background", | |
"Key Concepts and Terminology", | |
"Use Cases and Applications", | |
"Benefits and Drawbacks", | |
"Future Outlook", | |
"Conclusion", | |
] | |
for subheading in subheadings: | |
if (subheading + ":") in content: | |
content = content.replace(subheading + ":", "## " + subheading + "\n") | |
elif subheading in content: | |
content = content.replace(subheading, "## " + subheading + "\n") | |
return content | |
# generate image | |
import io | |
from PIL import Image | |
# Function to generate an image using the pre-created or newly created pipeline | |
def generate_image(topic): | |
API_URL = "https://api-inference.huggingface.co/models/runwayml/stable-diffusion-v1-5" | |
headers = {"Authorization": "Bearer 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"} | |
def query(payload): | |
response = requests.post(API_URL, headers=headers, json=payload) | |
return response.content | |
image_bytes = query({ | |
"inputs": f"A blog banner about {topic}", | |
}) | |
# You can access the image with PIL.Image for example | |
image = Image.open(io.BytesIO(image_bytes)) | |
image.save(f"{topic}.png") | |
return image | |
# Streamlit app | |
st.title("Blog Generator") | |
# Input and button | |
topic = st.text_input("Enter Title for the blog") | |
button_clicked = st.button("Create blog!") | |
# Load existing ideas | |
existing_ideas = load_ideas() | |
st.sidebar.header("Previous Ideas:") | |
# 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(selected_idea) | |
st.image(selected_idea_from_list[selected_idea]["image_path"]) | |
st.markdown(selected_idea_from_list[selected_idea]["content"]) | |
else: | |
index = 0 | |
# Handle button click | |
if button_clicked: | |
# Generate content and update existing ideas | |
content, image = generate_content(topic),generate_image(topic) | |
if image: | |
image_path = f"{topic}.png" | |
existing_ideas.append({topic: {"content": content, "image_path": image_path}}) | |
save_ideas(existing_ideas) | |
# 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)) | |
st.image(image) | |
st.markdown(content) |