committing the project AI Design Agent Team
This commit is contained in:
parent
ece3f8e88f
commit
a1ff299116
3 changed files with 348 additions and 0 deletions
73
ai_agent_tutorials/ai_multimodal_design_agent/README.md
Normal file
73
ai_agent_tutorials/ai_multimodal_design_agent/README.md
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
# Multimodal AI Design Agent Team
|
||||||
|
|
||||||
|
A multimodal design analysis tool powered by Google's Gemini 2.0 multimodal capabilities. This application leverages multiple specialized AI agents to provide comprehensive analysis of UI/UX designs of your product and your competitors, combining visual understanding, user experience evaluation, and market research insights.
|
||||||
|
|
||||||
|
## Demo
|
||||||
|
|
||||||
|
|
||||||
|
## About
|
||||||
|
|
||||||
|
The Design Agent Team utilizes Gemini 2.0's advanced multimodal capabilities to analyze design assets from multiple perspectives:
|
||||||
|
|
||||||
|
- 🎨 **Visual Design Analysis**: Evaluates design elements, patterns, color schemes, typography, and visual hierarchy
|
||||||
|
- 🔄 **UX Analysis**: Assesses user flows, interaction patterns, usability, and accessibility
|
||||||
|
- 📊 **Market Analysis**: Provides market insights, competitor analysis, and positioning recommendations
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Multiple Analysis Types**: Choose from Visual Design, UX, and Market Analysis
|
||||||
|
- **Comparative Analysis**: Upload competitor designs for comparative insights
|
||||||
|
- **Customizable Focus Areas**: Select specific aspects for detailed analysis
|
||||||
|
- **Context-Aware**: Provide additional context for more relevant insights
|
||||||
|
- **Real-time Processing**: Get instant analysis with progress indicators
|
||||||
|
- **Structured Output**: Receive well-organized, actionable insights
|
||||||
|
|
||||||
|
## How to Run
|
||||||
|
|
||||||
|
1. **Setup Environment**
|
||||||
|
```bash
|
||||||
|
# Clone the repository
|
||||||
|
git clone https://github.com/Shubhamsaboo/awesome-llm-apps.git
|
||||||
|
cd ai_agent_tutorials/ai_multimodal_design_agent
|
||||||
|
|
||||||
|
# Create and activate virtual environment (optional)
|
||||||
|
python -m venv venv
|
||||||
|
source venv/bin/activate # On Windows: venv\Scripts\activate
|
||||||
|
|
||||||
|
# Install dependencies
|
||||||
|
pip install -r requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Get API Key**
|
||||||
|
- Visit [Google AI Studio](https://makersuite.google.com/app/apikey)
|
||||||
|
- Create or select a project
|
||||||
|
- Generate an API key
|
||||||
|
|
||||||
|
3. **Run the Application**
|
||||||
|
```bash
|
||||||
|
streamlit run design_agent_team.py
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Use the Application**
|
||||||
|
- Enter your Gemini API key in the sidebar
|
||||||
|
- Upload design files (supported formats: JPG, JPEG, PNG)
|
||||||
|
- Select analysis types and focus areas
|
||||||
|
- Add context if needed
|
||||||
|
- Click "Run Analysis" to get insights
|
||||||
|
|
||||||
|
|
||||||
|
## Technical Stack
|
||||||
|
|
||||||
|
- **Frontend**: Streamlit
|
||||||
|
- **AI Model**: Google Gemini 2.0
|
||||||
|
- **Image Processing**: Pillow
|
||||||
|
- **Market Research**: DuckDuckGo Search API
|
||||||
|
- **Framework**: Phidata for agent orchestration
|
||||||
|
|
||||||
|
## Tips for Best Results
|
||||||
|
|
||||||
|
- Upload clear, high-resolution images
|
||||||
|
- Include multiple views/screens for better context
|
||||||
|
- Add competitor designs for comparative analysis
|
||||||
|
- Provide specific context about your target audience
|
||||||
|
|
||||||
|
|
@ -0,0 +1,269 @@
|
||||||
|
from phi.agent import Agent
|
||||||
|
from phi.model.google import Gemini
|
||||||
|
from phi.tools.duckduckgo import DuckDuckGo
|
||||||
|
import streamlit as st
|
||||||
|
from PIL import Image
|
||||||
|
from typing import List, Optional
|
||||||
|
|
||||||
|
def initialize_agents(api_key: str) -> tuple[Agent, Agent, Agent]:
|
||||||
|
try:
|
||||||
|
model = Gemini(id="gemini-2.0-flash-exp", api_key=api_key)
|
||||||
|
|
||||||
|
vision_agent = Agent(
|
||||||
|
model=model,
|
||||||
|
instructions=[
|
||||||
|
"You are a visual analysis expert that:",
|
||||||
|
"1. Identifies design elements, patterns, and visual hierarchy",
|
||||||
|
"2. Analyzes color schemes, typography, and layouts",
|
||||||
|
"3. Detects UI components and their relationships",
|
||||||
|
"4. Evaluates visual consistency and branding",
|
||||||
|
"Be specific and technical in your analysis"
|
||||||
|
],
|
||||||
|
markdown=True
|
||||||
|
)
|
||||||
|
|
||||||
|
ux_agent = Agent(
|
||||||
|
model=model,
|
||||||
|
instructions=[
|
||||||
|
"You are a UX analysis expert that:",
|
||||||
|
"1. Evaluates user flows and interaction patterns",
|
||||||
|
"2. Identifies usability issues and opportunities",
|
||||||
|
"3. Suggests UX improvements based on best practices",
|
||||||
|
"4. Analyzes accessibility and inclusive design",
|
||||||
|
"Focus on user-centric insights and practical improvements"
|
||||||
|
],
|
||||||
|
markdown=True
|
||||||
|
)
|
||||||
|
|
||||||
|
market_agent = Agent(
|
||||||
|
model=model,
|
||||||
|
tools=[DuckDuckGo(search=True)],
|
||||||
|
instructions=[
|
||||||
|
"You are a market research expert that:",
|
||||||
|
"1. Identifies market trends and competitor patterns",
|
||||||
|
"2. Analyzes similar products and features",
|
||||||
|
"3. Suggests market positioning and opportunities",
|
||||||
|
"4. Provides industry-specific insights",
|
||||||
|
"Focus on actionable market intelligence"
|
||||||
|
],
|
||||||
|
markdown=True
|
||||||
|
)
|
||||||
|
|
||||||
|
return vision_agent, ux_agent, market_agent
|
||||||
|
except Exception as e:
|
||||||
|
st.error(f"Error initializing agents: {str(e)}")
|
||||||
|
return None, None, None
|
||||||
|
|
||||||
|
# Sidebar for API key input
|
||||||
|
with st.sidebar:
|
||||||
|
st.header("🔑 API Configuration")
|
||||||
|
|
||||||
|
if "api_key_input" not in st.session_state:
|
||||||
|
st.session_state.api_key_input = ""
|
||||||
|
|
||||||
|
api_key = st.text_input(
|
||||||
|
"Enter your Gemini API Key",
|
||||||
|
value=st.session_state.api_key_input,
|
||||||
|
type="password",
|
||||||
|
help="Get your API key from Google AI Studio",
|
||||||
|
key="api_key_widget"
|
||||||
|
)
|
||||||
|
|
||||||
|
if api_key != st.session_state.api_key_input:
|
||||||
|
st.session_state.api_key_input = api_key
|
||||||
|
|
||||||
|
if api_key:
|
||||||
|
st.success("API Key provided! ✅")
|
||||||
|
else:
|
||||||
|
st.warning("Please enter your API key to proceed")
|
||||||
|
st.markdown("""
|
||||||
|
To get your API key:
|
||||||
|
1. Go to [Google AI Studio](https://makersuite.google.com/app/apikey)
|
||||||
|
""")
|
||||||
|
|
||||||
|
st.title("Multimodal AI Design Agent Team")
|
||||||
|
|
||||||
|
if st.session_state.api_key_input:
|
||||||
|
vision_agent, ux_agent, market_agent = initialize_agents(st.session_state.api_key_input)
|
||||||
|
|
||||||
|
if all([vision_agent, ux_agent, market_agent]):
|
||||||
|
# File Upload Section
|
||||||
|
st.header("📤 Upload Content")
|
||||||
|
col1, space, col2 = st.columns([1, 0.1, 1])
|
||||||
|
|
||||||
|
with col1:
|
||||||
|
design_files = st.file_uploader(
|
||||||
|
"Upload UI/UX Designs",
|
||||||
|
type=["jpg", "jpeg", "png"],
|
||||||
|
accept_multiple_files=True,
|
||||||
|
key="designs"
|
||||||
|
)
|
||||||
|
|
||||||
|
if design_files:
|
||||||
|
for file in design_files:
|
||||||
|
image = Image.open(file)
|
||||||
|
st.image(image, caption=file.name, use_container_width=True)
|
||||||
|
|
||||||
|
with col2:
|
||||||
|
competitor_files = st.file_uploader(
|
||||||
|
"Upload Competitor Designs (Optional)",
|
||||||
|
type=["jpg", "jpeg", "png"],
|
||||||
|
accept_multiple_files=True,
|
||||||
|
key="competitors"
|
||||||
|
)
|
||||||
|
|
||||||
|
if competitor_files:
|
||||||
|
for file in competitor_files:
|
||||||
|
image = Image.open(file)
|
||||||
|
st.image(image, caption=f"Competitor: {file.name}", use_container_width=True)
|
||||||
|
|
||||||
|
# Analysis Configuration
|
||||||
|
st.header("🎯 Analysis Configuration")
|
||||||
|
|
||||||
|
analysis_types = st.multiselect(
|
||||||
|
"Select Analysis Types",
|
||||||
|
["Visual Design", "User Experience", "Market Analysis"],
|
||||||
|
default=["Visual Design"]
|
||||||
|
)
|
||||||
|
|
||||||
|
specific_elements = st.multiselect(
|
||||||
|
"Focus Areas",
|
||||||
|
["Color Scheme", "Typography", "Layout", "Navigation",
|
||||||
|
"Interactions", "Accessibility", "Branding", "Market Fit"]
|
||||||
|
)
|
||||||
|
|
||||||
|
context = st.text_area(
|
||||||
|
"Additional Context",
|
||||||
|
placeholder="Describe your product, target audience, or specific concerns..."
|
||||||
|
)
|
||||||
|
|
||||||
|
# Analysis Process
|
||||||
|
if st.button("🚀 Run Analysis", type="primary"):
|
||||||
|
if design_files:
|
||||||
|
try:
|
||||||
|
st.header("📊 Analysis Results")
|
||||||
|
|
||||||
|
# Process images once
|
||||||
|
def process_images(files):
|
||||||
|
processed_images = []
|
||||||
|
for file in files:
|
||||||
|
try:
|
||||||
|
# Create a temporary file path for the image
|
||||||
|
import tempfile
|
||||||
|
import os
|
||||||
|
|
||||||
|
temp_dir = tempfile.gettempdir()
|
||||||
|
temp_path = os.path.join(temp_dir, f"temp_{file.name}")
|
||||||
|
|
||||||
|
# Save the uploaded file to temp location
|
||||||
|
with open(temp_path, "wb") as f:
|
||||||
|
f.write(file.getvalue())
|
||||||
|
|
||||||
|
# Add the path to processed images
|
||||||
|
processed_images.append(temp_path)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
st.error(f"Error processing image {file.name}: {str(e)}")
|
||||||
|
continue
|
||||||
|
return processed_images
|
||||||
|
|
||||||
|
design_images = process_images(design_files)
|
||||||
|
competitor_images = process_images(competitor_files) if competitor_files else []
|
||||||
|
all_images = design_images + competitor_images
|
||||||
|
|
||||||
|
# Visual Design Analysis
|
||||||
|
if "Visual Design" in analysis_types and design_files:
|
||||||
|
with st.spinner("🎨 Analyzing visual design..."):
|
||||||
|
if all_images:
|
||||||
|
vision_prompt = f"""
|
||||||
|
Analyze these designs focusing on: {', '.join(specific_elements)}
|
||||||
|
Additional context: {context}
|
||||||
|
Provide specific insights about visual design elements.
|
||||||
|
|
||||||
|
Please format your response with clear headers and bullet points.
|
||||||
|
Focus on concrete observations and actionable insights.
|
||||||
|
"""
|
||||||
|
|
||||||
|
response = vision_agent.run(
|
||||||
|
message=vision_prompt,
|
||||||
|
images=all_images
|
||||||
|
)
|
||||||
|
|
||||||
|
st.subheader("🎨 Visual Design Analysis")
|
||||||
|
st.markdown(response.content)
|
||||||
|
|
||||||
|
# UX Analysis
|
||||||
|
if "User Experience" in analysis_types:
|
||||||
|
with st.spinner("🔄 Analyzing user experience..."):
|
||||||
|
if all_images:
|
||||||
|
ux_prompt = f"""
|
||||||
|
Evaluate the user experience considering: {', '.join(specific_elements)}
|
||||||
|
Additional context: {context}
|
||||||
|
Focus on user flows, interactions, and accessibility.
|
||||||
|
|
||||||
|
Please format your response with clear headers and bullet points.
|
||||||
|
Focus on concrete observations and actionable improvements.
|
||||||
|
"""
|
||||||
|
|
||||||
|
response = ux_agent.run(
|
||||||
|
message=ux_prompt,
|
||||||
|
images=all_images
|
||||||
|
)
|
||||||
|
|
||||||
|
st.subheader("🔄 UX Analysis")
|
||||||
|
st.markdown(response.content)
|
||||||
|
|
||||||
|
# Market Analysis
|
||||||
|
if "Market Analysis" in analysis_types:
|
||||||
|
with st.spinner("📊 Conducting market analysis..."):
|
||||||
|
market_prompt = f"""
|
||||||
|
Analyze market positioning and trends based on these designs.
|
||||||
|
Context: {context}
|
||||||
|
Compare with competitor designs if provided.
|
||||||
|
Suggest market opportunities and positioning.
|
||||||
|
|
||||||
|
Please format your response with clear headers and bullet points.
|
||||||
|
Focus on concrete market insights and actionable recommendations.
|
||||||
|
"""
|
||||||
|
|
||||||
|
response = market_agent.run(
|
||||||
|
message=market_prompt,
|
||||||
|
images=all_images
|
||||||
|
)
|
||||||
|
|
||||||
|
st.subheader("📊 Market Analysis")
|
||||||
|
st.markdown(response.content)
|
||||||
|
|
||||||
|
# Combined Insights
|
||||||
|
if len(analysis_types) > 1:
|
||||||
|
st.subheader("🎯 Key Takeaways")
|
||||||
|
st.info("""
|
||||||
|
Above you'll find detailed analysis from multiple specialized AI agents, each focusing on their area of expertise:
|
||||||
|
- Visual Design Agent: Analyzes design elements and patterns
|
||||||
|
- UX Agent: Evaluates user experience and interactions
|
||||||
|
- Market Research Agent: Provides market context and opportunities
|
||||||
|
""")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
st.error(f"An error occurred during analysis: {str(e)}")
|
||||||
|
st.error("Please check your API key and try again.")
|
||||||
|
else:
|
||||||
|
st.warning("Please upload at least one design to analyze.")
|
||||||
|
else:
|
||||||
|
st.info("👈 Please enter your API key in the sidebar to get started")
|
||||||
|
else:
|
||||||
|
st.info("👈 Please enter your API key in the sidebar to get started")
|
||||||
|
|
||||||
|
# Footer with usage tips
|
||||||
|
st.markdown("---")
|
||||||
|
st.markdown("""
|
||||||
|
<div style='text-align: center'>
|
||||||
|
<h4>Tips for Best Results</h4>
|
||||||
|
<p>
|
||||||
|
• Upload clear, high-resolution images<br>
|
||||||
|
• Include multiple views/screens for better context<br>
|
||||||
|
• Add competitor designs for comparative analysis<br>
|
||||||
|
• Provide specific context about your target audience
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
""", unsafe_allow_html=True)
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
google-generativeai==0.8.3
|
||||||
|
streamlit==1.30.0
|
||||||
|
phidata==2.7.2
|
||||||
|
Pillow==11.0.0
|
||||||
|
duckduckgo-search==6.3.7
|
||||||
|
|
||||||
Loading…
Reference in a new issue