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() |