File size: 7,258 Bytes
946af90 d871e31 4ee77f6 52f9dcb d871e31 0afdd3b d871e31 52f9dcb d1fe61c 0afdd3b 52f9dcb d404e12 0afdd3b 52f9dcb 0afdd3b 52f9dcb e60d73d 52f9dcb 0afdd3b e60d73d 0afdd3b 52f9dcb e60d73d 52f9dcb 0afdd3b 52f9dcb e60d73d 52f9dcb 0afdd3b 52f9dcb e60d73d 0afdd3b 52f9dcb ac04eb4 52f9dcb 0afdd3b 52f9dcb 0afdd3b 52f9dcb 0afdd3b 52f9dcb e60d73d 0afdd3b 52f9dcb e60d73d 52f9dcb e60d73d 52f9dcb e60d73d 28d1bc0 e60d73d 28d1bc0 52f9dcb d6c1fc7 146fdcf d6c1fc7 28d1bc0 d6c1fc7 28d1bc0 d6c1fc7 28d1bc0 d6c1fc7 28d1bc0 e60d73d 28d1bc0 19a3440 |
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 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
#to-do: generate graph
import streamlit as st
from crewai import Agent, Task, Crew
import os
from langchain_groq import ChatGroq
from fpdf import FPDF
import pandas as pd
import plotly.express as px
import time
# Title and Sidebar
st.title("π€ Multi-Agent Business Consultant")
st.sidebar.write(
"This Business Consultant is built using Multi-Agent system. "
"Use this application to generate actionable business insights and data-driven analysis!"
)
# User Inputs
business = st.text_input('Enter The Required Business Search Area', value="Artificial Intelligence")
stakeholder = st.text_input('Enter The Stakeholder Team', value="Executives")
# Optional Customization
st.sidebar.subheader("Agent Customization")
# Display customization section in a collapsible expander
with st.sidebar.expander("Customize Agent Goals", expanded=False):
enable_customization = st.checkbox("Enable Custom Goals")
if enable_customization:
planner_goal = st.text_area(
"Planner Goal",
value="Develop a comprehensive plan focusing on market trends and strategies."
)
writer_goal = st.text_area(
"Writer Goal",
value="Craft engaging and actionable content based on analysis."
)
analyst_goal = st.text_area(
"Analyst Goal",
value="Perform advanced statistical analysis and generate key insights."
)
else:
planner_goal = "Develop a comprehensive plan focusing on market trends and strategies."
writer_goal = "Craft engaging and actionable content based on analysis."
analyst_goal = "Perform advanced statistical analysis and generate key insights."
#=================
# LLM Object
#=================
llm = ChatGroq(groq_api_key=os.getenv("GROQ_API_KEY"), model="groq/llama-3.3-70b-versatile")
#=================
# Crew Agents
#=================
planner = Agent(
role="Business Consultant",
goal=planner_goal,
backstory=(
"You're tasked with providing insights about {topic} to the stakeholder: {stakeholder}. "
"Your work will form the foundation for the Business Writer and Data Analyst."
),
allow_delegation=False,
verbose=True,
llm=llm
)
writer = Agent(
role="Business Writer",
goal=writer_goal,
backstory=(
"You will write a professional insights document about {topic}, "
"based on the Business Consultant's plan and the Data Analyst's results."
),
allow_delegation=False,
verbose=True,
llm=llm
)
analyst = Agent(
role="Data Analyst",
goal=analyst_goal,
backstory=(
"You will perform statistical analysis on {topic}, based on the Business Consultant's plan. "
"Your analysis will support the Business Writer's final document for {stakeholder}."
),
allow_delegation=False,
verbose=True,
llm=llm
)
#=================
# Crew Tasks
#=================
plan = Task(
description=(
"1. Research trends, key players, and noteworthy news for {topic}.\n"
"2. Provide structured insights and actionable recommendations.\n"
"3. Suggest strategies for dealing with international operators.\n"
"4. Limit content to 500 words."
),
expected_output="A comprehensive consultancy document with insights and recommendations.",
agent=planner
)
write = Task(
description=(
"1. Use the Business Consultant's plan to write a professional document for {topic}.\n"
"2. Structure the content with engaging sections and visuals.\n"
"3. Ensure alignment with the stakeholder's goals.\n"
"4. Limit the document to 400 words."
),
expected_output="A professional document tailored for {stakeholder}.",
agent=writer
)
analyse = Task(
description=(
"1. Perform statistical analysis to provide actionable insights for {topic}.\n"
"2. Collaborate with the Business Consultant and Writer to align on key metrics.\n"
"3. Present findings in a format suitable for inclusion in the final document."
),
expected_output="A data-driven analysis tailored for {stakeholder}.",
agent=analyst
)
#=================
# Execution
#=================
crew = Crew(
agents=[planner, analyst, writer],
tasks=[plan, analyse, write],
verbose=True
)
def generate_pdf_report(result):
"""Generate a professional PDF report from the Crew output."""
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
pdf.set_auto_page_break(auto=True, margin=15)
# Title
pdf.set_font("Arial", size=16, style="B")
pdf.cell(200, 10, txt="AI Business Consultant Report", ln=True, align="C")
pdf.ln(10)
# Content
pdf.set_font("Arial", size=12)
pdf.multi_cell(0, 10, txt=result)
# Save PDF
report_path = "Business_Insights_Report.pdf"
pdf.output(report_path)
return report_path
if st.button("Generate Insights"):
with st.spinner('Processing...'):
try:
start_time = time.time()
results = crew.kickoff(inputs={"topic": business, "stakeholder": stakeholder})
elapsed_time = time.time() - start_time
# Display Final Report (Writer's Output)
st.markdown("### Final Report:")
writer_output = getattr(results.tasks_output[2], "raw", "No details available.")
if writer_output:
st.write(writer_output)
else:
st.warning("No final report available.")
# Option for Detailed Insights
with st.expander("Explore Detailed Insights"):
tab1, tab2 = st.tabs(["Planner's Insights", "Analyst's Analysis"])
# Planner's Output
with tab1:
st.markdown("### Planner's Insights")
planner_output = getattr(results.tasks_output[0], "raw", "No details available.")
st.write(planner_output)
# Analyst's Output
with tab2:
st.markdown("### Analyst's Analysis")
analyst_output = getattr(results.tasks_output[1], "raw", "No details available.")
st.write(analyst_output)
# Display Token Usage and Execution Time
st.success(f"Analysis completed in {elapsed_time:.2f} seconds.")
token_usage = getattr(results, "token_usage", None)
if token_usage:
st.markdown("#### Token Usage")
st.json(token_usage)
# Generate PDF Report
if writer_output:
report_path = generate_pdf_report(writer_output)
with open(report_path, "rb") as report_file:
st.download_button("Download Report", data=report_file, file_name="Business_Report.pdf")
except Exception as e:
st.error(f"An error occurred during execution: {e}")
# Add reference and credits in the sidebar
st.sidebar.markdown("---")
st.sidebar.markdown("### Reference:")
st.sidebar.markdown("[Multi-Agent Business Consultant - Hanan Tabak](https://medium.com/@hanan.tabak/user-friendly-open-source-multi-agent-ai-business-consultant-on-crewai-and-streamlit-0f972feb1b74)")
|