# presentation_generator.py from crewai import Crew, LLM,, Agent from crewai.tools import Tool, SerperDevTool import streamlit as st import base64 import pypdfium2 as pdfium # Replace with your actual API keys GEMINI_API_KEY = "AIzaSyD6yZxfVOnh63GXBJjakAupk9aP4CZrgrQ" os.environ["SERPER_API_KEY"] = st.secrets["SERPER_API_KEY"] 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=SERPERDEV_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): # Generate content logic content = f"Content for {section}" 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): # Compile PDF logic doc = pdfium.PdfDocument.new() page = doc.new_page(width=612, height=792) canvas = page.get_canvas() # Add content to the page doc.save("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): plan = self.delegate("Generate a detailed plan for the presentation on {}".format(theme)) sections = plan.split("\n") content = [] for section in sections: if section: content.append(self.delegate("Generate content for the presentation section: {}".format(section))) pdf = self.delegate("Compile the following content into a PDF: {}".format("\n".join(content))) return pdf # 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'Download PDF' 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) st.success("Presentation generated successfully!") st.markdown(get_pdf_download_link(pdf_path), unsafe_allow_html=True) if __name__ == "__main__": main()