File size: 4,696 Bytes
85e590f
d4fb052
814d355
a99cdc3
a8ead94
0a6c0de
85e590f
 
d4fb052
85e590f
 
 
75f8ce6
d4fb052
154424a
 
 
85e590f
154424a
85e590f
154424a
 
b4187b5
85e590f
 
 
 
 
 
6152aba
 
 
 
 
85e590f
 
 
 
 
 
 
 
 
 
 
 
 
 
6152aba
 
 
 
 
85e590f
 
 
d4fb052
 
 
85e590f
 
 
 
 
 
 
6152aba
 
 
 
 
85e590f
 
 
d4fb052
 
 
 
 
 
 
 
 
 
85e590f
 
 
 
 
 
 
 
 
 
 
 
 
d4fb052
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85e590f
6152aba
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
132
133
134
135
136
# 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",
            role="Presentation Planner",
            goal="Create detailed and well-structured presentation outlines",
            backstory="""You are an experienced presentation strategist who excels at 
            creating logical and impactful presentation structures. You understand how 
            to organize information for maximum audience engagement.""",
            llm=llm,
            tools=[serper_tool]
        )

    def run(self, theme):
        research = serper_tool.search(query=f"Best practices for {theme} presentations")
        plan = "Introduction\nMain Points\nConclusion"
        return plan

# Content Generator Agent
class ContentGeneratorAgent(Agent):
    def __init__(self):
        super().__init__(
            name="ContentGenerator",
            role="Content Creator",
            goal="Generate engaging and informative presentation content",
            backstory="""You are a creative content specialist with expertise in 
            transforming ideas into compelling presentation material. You know how 
            to balance information with engagement.""",
            llm=llm
        )

    def run(self, section, theme):
        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",
            role="Document Formatter",
            goal="Create professional and well-formatted PDF presentations",
            backstory="""You are a document formatting expert who knows how to 
            transform content into visually appealing and professional PDFs. You 
            understand typography, layout, and document structure.""",
            llm=llm
        )

    def run(self, content_dict):
        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:
            plan = self.delegate("Generate a detailed plan for the presentation on {}".format(theme))
            sections = plan.split("\n")
            content_dict = {}

            for section in sections:
                if section:
                    content = self.delegate("Generate content for the presentation section: {}".format(section), theme=theme)
                    content_dict[section] = content

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