File size: 4,109 Bytes
85e590f
d4fb052
814d355
a99cdc3
a8ead94
0a6c0de
85e590f
 
d4fb052
85e590f
 
 
75f8ce6
d4fb052
154424a
 
 
85e590f
154424a
85e590f
154424a
 
b4187b5
85e590f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d4fb052
85e590f
d4fb052
 
85e590f
 
 
 
 
 
 
 
 
 
 
d4fb052
85e590f
d4fb052
 
 
 
 
 
 
 
 
85e590f
 
 
 
 
 
 
 
 
 
 
 
 
d4fb052
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85e590f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d4fb052
 
 
 
 
85e590f
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# 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()