Spaces:
Sleeping
Sleeping
# presentation_generator.py | |
import os | |
from crewai import Crew, LLM, Agent | |
from crewai_tools import Tool, SerperDevTool | |
import streamlit as st | |
import base64 | |
import pypdfium2 as pdfium | |
from fpdf import FPDF | |
# Replace with your actual API keys | |
GEMINI_API_KEY = "AIzaSyD6yZxfVOnh63GXBJjakAupk9aP4CZrgrQ" | |
SERPER_API_KEY = "9b90a274d9e704ff5b21c0367f9ae1161779b573" | |
llm = LLM( | |
model="gemini/gemini-1.5-flash", | |
temperature=0.7, | |
timeout=120, | |
max_tokens=8000, | |
api_key=GEMINI_API_KEY | |
) | |
serper_tool = SerperDevTool(api_key=SERPER_API_KEY) | |
# Plan Generator Agent | |
class PlanGeneratorAgent(Agent): | |
def __init__(self): | |
super().__init__( | |
name="PlanGenerator", | |
description="Generates a detailed plan for a presentation.", | |
llm=llm, | |
tools=[serper_tool] | |
) | |
def run(self, theme): | |
# Use serper_tool to research | |
research = serper_tool.search(query=f"Best practices for {theme} presentations") | |
# Generate plan based on research | |
plan = "Introduction\nMain Points\nConclusion" | |
return plan | |
# Content Generator Agent | |
class ContentGeneratorAgent(Agent): | |
def __init__(self): | |
super().__init__( | |
name="ContentGenerator", | |
description="Generates content for a specific section of a presentation.", | |
llm=llm | |
) | |
def run(self, section, theme): | |
# Generate content logic | |
prompt = f"Generate {section} for a presentation on {theme}." | |
content = self.llm.generate(prompt) | |
return content | |
# PDF Compiler Agent | |
class PDFCompilerAgent(Agent): | |
def __init__(self): | |
super().__init__( | |
name="PDFCompiler", | |
description="Compiles presentation content into a PDF.", | |
llm=llm | |
) | |
def run(self, content_dict): | |
# Compile PDF logic | |
pdf = FPDF() | |
pdf.add_page() | |
pdf.set_font("Arial", size=12) | |
for section, content in content_dict.items(): | |
pdf.cell(0, 10, f"{section}", ln=True) | |
pdf.multi_cell(0, 10, f"{content}", ln=True) | |
pdf.output("presentation.pdf") | |
return "presentation.pdf" | |
# Main Crew | |
class PresentationCrew(Crew): | |
def __init__(self): | |
super().__init__( | |
name="PresentationGenerator", | |
description="Generates a high-quality presentation based on a given theme.", | |
llm=llm, | |
agents=[PlanGeneratorAgent(), ContentGeneratorAgent(), PDFCompilerAgent()] | |
) | |
def run(self, theme): | |
try: | |
# Generate plan | |
plan = self.delegate("Generate a detailed plan for the presentation on {}".format(theme)) | |
sections = plan.split("\n") | |
content_dict = {} | |
# Generate content for each section | |
for section in sections: | |
if section: | |
content = self.delegate("Generate content for the presentation section: {}".format(section), theme=theme) | |
content_dict[section] = content | |
# Compile PDF | |
pdf_path = self.delegate("Compile the following content into a PDF: {}".format(content_dict)) | |
return pdf_path | |
except Exception as e: | |
print(f"An error occurred: {e}") | |
return None | |
# Streamlit App | |
def get_pdf_download_link(pdf_path): | |
with open(pdf_path, "rb") as f: | |
pdf_bytes = f.read() | |
encoded = base64.b64encode(pdf_bytes).decode() | |
return f'<a href="data:application/pdf;base64,{encoded}" download="presentation.pdf">Download PDF</a>' | |
def main(): | |
st.title("Advanced Presentation Generator") | |
theme = st.text_input("Enter the presentation theme:") | |
if st.button("Generate Presentation"): | |
crew = PresentationCrew() | |
pdf_path = crew.run(theme) | |
if pdf_path: | |
st.success("Presentation generated successfully!") | |
st.markdown(get_pdf_download_link(pdf_path), unsafe_allow_html=True) | |
else: | |
st.error("Failed to generate presentation.") | |
if __name__ == "__main__": | |
main() |