From bc727a4ed36ca13150031a54e8b1a7f07cc143a3 Mon Sep 17 00:00:00 2001 From: Ashad Qureshi Date: Sun, 15 Jun 2025 18:50:33 +0500 Subject: [PATCH 1/3] Agent Suggestion improved --- auto-analyst-backend/chat_database.db | 4 +- .../components/chat/AgentSuggestions.tsx | 23 +- .../components/chat/ChatInput.tsx | 7 + .../components/chat/Sidebar.tsx | 2 +- .../custom-templates/useTemplates.ts | 16 +- .../components/landing/AgentsSection.tsx | 231 +++++++++++++----- .../components/landing/FnT.tsx | 67 +---- 7 files changed, 215 insertions(+), 135 deletions(-) diff --git a/auto-analyst-backend/chat_database.db b/auto-analyst-backend/chat_database.db index f991a3aa..c8f9bd01 100644 --- a/auto-analyst-backend/chat_database.db +++ b/auto-analyst-backend/chat_database.db @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:576d57c765fb2c0c432f9381bcf1c4abfd679be4bb986453757b253ec053cc0a -size 69632 +oid sha256:61639e5bb19bdd13c83e7ad10d3bbaab442ed8b461c21632d0c71f2409d118bb +size 77824 diff --git a/auto-analyst-frontend/components/chat/AgentSuggestions.tsx b/auto-analyst-frontend/components/chat/AgentSuggestions.tsx index e699875e..20dd1705 100644 --- a/auto-analyst-frontend/components/chat/AgentSuggestions.tsx +++ b/auto-analyst-frontend/components/chat/AgentSuggestions.tsx @@ -188,15 +188,23 @@ export default function AgentSuggestions({ ? message.slice(activeAtPos + 1, activeAtPos + 1 + spaceIndex) : textAfterAt - // Only show suggestions if we're actively typing an agent name - if (typedText && !typedText.includes(' ')) { - const filtered = agents.filter(agent => - agent.name.toLowerCase().includes(typedText.toLowerCase()) - ) - setFilteredAgents(filtered) - setSelectedIndex(filtered.length > 0 ? 0 : -1) + // Show suggestions if we're actively typing an agent name or just typed @ + if (!typedText.includes(' ')) { + // If no text after @, show all agents + if (typedText === '') { + setFilteredAgents(agents) + setSelectedIndex(agents.length > 0 ? 0 : -1) return } + + // If there's text after @, filter agents based on that text + const filtered = agents.filter(agent => + agent.name.toLowerCase().includes(typedText.toLowerCase()) + ) + setFilteredAgents(filtered) + setSelectedIndex(filtered.length > 0 ? 0 : -1) + return + } } setFilteredAgents([]) @@ -223,6 +231,7 @@ export default function AgentSuggestions({ break case 'Enter': e.preventDefault() + e.stopPropagation() if (selectedIndex >= 0 && selectedIndex < filteredAgents.length) { onSuggestionSelect(filteredAgents[selectedIndex].name) } diff --git a/auto-analyst-frontend/components/chat/ChatInput.tsx b/auto-analyst-frontend/components/chat/ChatInput.tsx index 20744e21..5ff61148 100644 --- a/auto-analyst-frontend/components/chat/ChatInput.tsx +++ b/auto-analyst-frontend/components/chat/ChatInput.tsx @@ -1951,6 +1951,13 @@ const ChatInput = forwardRef< onChange={handleInputChange} onKeyDown={(e) => { if (e.key === 'Enter' && !e.shiftKey) { + // Check if agent suggestions are visible and should handle the Enter key + const isAgentSuggestionsVisible = !showCommandSuggestions && message.includes('@'); + if (isAgentSuggestionsVisible) { + // Don't handle Enter here, let AgentSuggestions component handle it + // The AgentSuggestions component will preventDefault if it handles the event + return; + } e.preventDefault() handleSubmit(e) } diff --git a/auto-analyst-frontend/components/chat/Sidebar.tsx b/auto-analyst-frontend/components/chat/Sidebar.tsx index 8c6ee85c..6a88bd24 100644 --- a/auto-analyst-frontend/components/chat/Sidebar.tsx +++ b/auto-analyst-frontend/components/chat/Sidebar.tsx @@ -95,7 +95,7 @@ const Sidebar: React.FC = ({ isOpen, onClose, onNewChat, chatHisto // Use templates hook for data management const { templateCount, enabledCount } = useTemplates({ userId, - enabled: isOpen && !!userId + enabled: isOpen && !!userId && userId > 0 }) const handleNewChat = async () => { diff --git a/auto-analyst-frontend/components/custom-templates/useTemplates.ts b/auto-analyst-frontend/components/custom-templates/useTemplates.ts index c0ee739a..38faf05e 100644 --- a/auto-analyst-frontend/components/custom-templates/useTemplates.ts +++ b/auto-analyst-frontend/components/custom-templates/useTemplates.ts @@ -28,7 +28,7 @@ export function useTemplates({ userId, enabled = true }: UseTemplatesProps): Use const { toast } = useToast() const loadData = useCallback(async () => { - if (!enabled || !userId) return + if (!enabled || !userId || userId <= 0) return setLoading(true) setError(null) @@ -56,11 +56,15 @@ export function useTemplates({ userId, enabled = true }: UseTemplatesProps): Use const errorMessage = err instanceof Error ? err.message : 'Failed to load data' setError(errorMessage) console.error('Error loading templates data:', err) - toast({ - title: "Error", - description: errorMessage, - variant: "destructive", - }) + + // Only show toast if it's not a network/fetch error to avoid persistent error popups + if (!(err instanceof TypeError && err.message.includes('Failed to fetch'))) { + toast({ + title: "Error", + description: errorMessage, + variant: "destructive", + }) + } } finally { setLoading(false) } diff --git a/auto-analyst-frontend/components/landing/AgentsSection.tsx b/auto-analyst-frontend/components/landing/AgentsSection.tsx index 1b36547d..a208ab9e 100644 --- a/auto-analyst-frontend/components/landing/AgentsSection.tsx +++ b/auto-analyst-frontend/components/landing/AgentsSection.tsx @@ -1,10 +1,81 @@ "use client" import { motion } from "framer-motion" -import { agents } from "./FnT" import { Badge } from "@/components/ui/badge" -import { CheckCircle } from "lucide-react" +import { CheckCircle, Palette, Database, Sparkles, Zap } from "lucide-react" + +// Template categories and their agents based on populate_agent_templates.py +const templateCategories = [ + { + category: "Visualization", + icon: Palette, + color: "from-purple-500 to-purple-600", + description: "Professional data visualization and statistical plotting", + templates: [ + { + name: "Matplotlib Visualization Agent", + description: "Publication-quality static plots with matplotlib and seaborn", + capabilities: [ + "High-quality static visualizations", + "Professional styling and themes", + "Statistical plot annotations", + "Publication-ready outputs" + ] + }, + { + name: "Seaborn Statistical Plots Agent", + description: "Statistical visualizations and exploratory data analysis", + capabilities: [ + "Distribution analysis plots", + "Correlation and relationship visualization", + "Categorical data plotting", + "Statistical significance testing" + ] + } + ] + }, + { + category: "Data Manipulation", + icon: Database, + color: "from-blue-500 to-blue-600", + description: "High-performance data processing and feature engineering", + templates: [ + { + name: "Polars Data Processing Agent", + description: "Lightning-fast data manipulation with memory efficiency", + capabilities: [ + "High-performance data processing", + "Lazy evaluation optimization", + "Complex data transformations", + "Memory-efficient operations" + ] + }, + { + name: "Data Cleaning Specialist Agent", + description: "Comprehensive data quality assessment and cleaning", + capabilities: [ + "Missing value detection & handling", + "Data quality assessment reports", + "Outlier detection & treatment", + "Inconsistency resolution" + ] + }, + { + name: "Feature Engineering Agent", + description: "Advanced feature creation for machine learning", + capabilities: [ + "Intelligent feature creation", + "Categorical encoding strategies", + "Feature selection methods", + "Cross-validation techniques" + ] + } + ] + } +] export default function AgentsSection() { + const totalTemplates = templateCategories.reduce((sum, cat) => sum + cat.templates.length, 0) + return (
@@ -15,66 +86,101 @@ export default function AgentsSection() { viewport={{ once: true }} className="text-center mb-10 sm:mb-16" > +
+ + + Template Library + +

- Four Specialized AI Agents + Specialized AI Agent Templates

- Unlike ChatGPT's general-purpose approach, Auto-Analyst uses four specialized agents that work together to handle complex data science workflows with precision and reliability. + Choose from our growing library of specialized agent templates, each expertly crafted for specific data science tasks. More templates are continuously being added to expand your analytical capabilities.

+
+
+ + {totalTemplates}+ Expert Templates +
+
+ + {templateCategories.length} Categories +
+
-
- {agents.map((agent, index) => ( +
+ {templateCategories.map((category, categoryIndex) => ( - {/* Gradient Background */} -
- -
- {/* Agent Header */} -
-
- -
-
-

{agent.name}

-

{agent.description}

+ {/* Category Header */} +
+
+
+
+

{category.category}

+

{category.description}

+
- {/* Capabilities */} -
-

Key Capabilities:

- {agent.capabilities.map((capability, capIndex) => ( - - - {capability} - - ))} -
+ {/* Templates Grid */} +
+ {category.templates.map((template, templateIndex) => ( + + {/* Gradient Background */} +
+ +
+ {/* Template Header */} +
+

+ {template.name} +

+

{template.description}

+
- {/* Agent Usage Indicator */} -
- - @{agent.name.toLowerCase().replace(/\s+/g, '_')} - -

- Direct your queries to this agent using @mentions -

-
+ {/* Capabilities */} +
+
Key Features:
+ {template.capabilities.map((capability, capIndex) => ( + + + {capability} + + ))} +
+ + {/* Premium Badge */} +
+ + Premium Template + +
+
+ + ))}
))} @@ -84,24 +190,31 @@ export default function AgentsSection() { -
+
+
+ + + Growing Library + +

- Intelligent Agent Orchestration + More Templates Coming Soon

-

- Our planner automatically selects and coordinates the right agents for your specific query, - or you can direct questions to specific agents using @mentions for precise control. +

+ Our expert team continuously develops new specialized agent templates for advanced analytics, + machine learning, statistical modeling, and domain-specific use cases. Each template is crafted + with best practices and proven methodologies.

- {agents.map((agent, index) => ( - - @{agent.name.toLowerCase().replace(/\s+/g, '_')} - - ))} + Machine Learning + Time Series + NLP Analysis + Statistical Modeling + Business Intelligence
diff --git a/auto-analyst-frontend/components/landing/FnT.tsx b/auto-analyst-frontend/components/landing/FnT.tsx index a528f8e9..ecb54c0c 100644 --- a/auto-analyst-frontend/components/landing/FnT.tsx +++ b/auto-analyst-frontend/components/landing/FnT.tsx @@ -1,11 +1,11 @@ "use client" -import { Brain, LineChart, Database, BarChart2, Lock, Zap, FileText, TrendingUp, Cog, BarChart3, Github, Server, Cpu, Globe } from "lucide-react" +import { Brain, LineChart, Database, BarChart2, Lock, Zap, FileText, TrendingUp, Cog, BarChart3, Github, Server, Cpu, Globe, Sparkles, Palette } from "lucide-react" export const features = [ { - icon: FileText, - title: "Multi-Agent Orchestration", - description: "Unlike ChatGPT's single model, Auto-Analyst uses specialized agents that work together for complex data science workflows" + icon: Sparkles, + title: "Specialized Agent Templates", + description: "Choose from expert-crafted templates for visualization, data processing, feature engineering, and more specialized tasks" }, { icon: Github, @@ -29,65 +29,12 @@ export const features = [ }, { icon: Cog, - title: "Specialized for Analytics", - description: "Purpose-built for data science workflows with guardrails and reliability features ChatGPT lacks" + title: "Expert-Level Analytics", + description: "Access professional-grade data science capabilities through carefully designed template workflows" }, ] -export const agents = [ - { - icon: Database, - name: "Preprocessing Agent", - description: "Data cleaning specialist using pandas and numpy", - capabilities: [ - "Clean and transform datasets", - "Handle missing values intelligently", - "Convert data types automatically", - "Create aggregates and summaries", - "Detect and fix data quality issues" - ], - color: "from-blue-500 to-blue-600" - }, - { - icon: TrendingUp, - name: "Statistical Analytics Agent", - description: "Advanced statistical analysis using statsmodels", - capabilities: [ - "Correlation and regression analysis", - "Hypothesis testing and A/B tests", - "Time series analysis", - "Statistical modeling", - "Confidence intervals and p-values" - ], - color: "from-green-500 to-green-600" - }, - { - icon: Brain, - name: "Scikit-Learn Agent", - description: "Machine learning specialist for predictive modeling", - capabilities: [ - "Random Forest and ensemble methods", - "K-means clustering analysis", - "Classification and regression", - "Feature selection and engineering", - "Model evaluation and validation" - ], - color: "from-purple-500 to-purple-600" - }, - { - icon: BarChart3, - name: "Data Visualization Agent", - description: "Interactive visualizations using Plotly", - capabilities: [ - "Interactive charts and graphs", - "Statistical plot recommendations", - "Multi-dimensional visualizations", - "Custom styling and formatting", - "Export-ready visualizations" - ], - color: "from-orange-500 to-orange-600" - } -] + export const supportedConnectors = [ { From 88f14654beeca2b7301e6ded3dd6f329e79c7713 Mon Sep 17 00:00:00 2001 From: Ashad Qureshi Date: Sun, 15 Jun 2025 22:50:48 +0500 Subject: [PATCH 2/3] use static links instead of urls --- auto-analyst-backend/app.py | 16 +- auto-analyst-backend/chat_database.db | 4 +- .../scripts/populate_agent_templates.py | 10 +- .../components/chat/Sidebar.tsx | 2 +- .../custom-templates/useTemplates.ts | 16 +- .../components/landing/AgentsSection.tsx | 231 +- .../components/landing/FnT.tsx | 67 +- .../public/icons/logos/auto-analyst-logo.png | Bin 0 -> 10102 bytes .../public/icons/logos/firebird-logo.png | Bin 0 -> 3782 bytes .../public/icons/templates/data-cleaning.png | Bin 0 -> 28254 bytes .../icons/templates/feature-engineering.png | Bin 0 -> 39022 bytes .../public/icons/templates/matplotlib.svg | 1 + .../public/icons/templates/polars.svg | 83 + .../public/icons/templates/seaborn.svg | 4946 +++++++++++++++++ 14 files changed, 5171 insertions(+), 205 deletions(-) create mode 100644 auto-analyst-frontend/public/icons/logos/auto-analyst-logo.png create mode 100644 auto-analyst-frontend/public/icons/logos/firebird-logo.png create mode 100644 auto-analyst-frontend/public/icons/templates/data-cleaning.png create mode 100644 auto-analyst-frontend/public/icons/templates/feature-engineering.png create mode 100644 auto-analyst-frontend/public/icons/templates/matplotlib.svg create mode 100644 auto-analyst-frontend/public/icons/templates/polars.svg create mode 100644 auto-analyst-frontend/public/icons/templates/seaborn.svg diff --git a/auto-analyst-backend/app.py b/auto-analyst-backend/app.py index 6ecee146..9be76a74 100644 --- a/auto-analyst-backend/app.py +++ b/auto-analyst-backend/app.py @@ -449,7 +449,7 @@ async def chat_with_agent( _execute_custom_agents(ai_system, agent_list, enhanced_query), timeout=REQUEST_TIMEOUT_SECONDS ) - else: + else: # All standard/template agents - use auto_analyst_ind standard_agent_sigs = [AVAILABLE_AGENTS[agent] for agent in standard_agents] user_id = session_state.get("user_id") @@ -457,9 +457,9 @@ async def chat_with_agent( # Create database session for template loading from src.db.init_db import session_factory db_session = session_factory() - try: + try: agent = auto_analyst_ind(agents=standard_agent_sigs, retrievers=session_state["retrievers"], user_id=user_id, db_session=db_session) - session_lm = get_session_lm(session_state) + session_lm = get_session_lm(session_state) with dspy.context(lm=session_lm): response = await asyncio.wait_for( agent.forward(enhanced_query, ",".join(agent_list)), @@ -479,11 +479,11 @@ async def chat_with_agent( try: agent = auto_analyst_ind(agents=[AVAILABLE_AGENTS[agent_name]], retrievers=session_state["retrievers"], user_id=user_id, db_session=db_session) session_lm = get_session_lm(session_state) - with dspy.context(lm=session_lm): - response = await asyncio.wait_for( - agent.forward(enhanced_query, agent_name), - timeout=REQUEST_TIMEOUT_SECONDS - ) + with dspy.context(lm=session_lm): + response = await asyncio.wait_for( + agent.forward(enhanced_query, agent_name), + timeout=REQUEST_TIMEOUT_SECONDS + ) finally: db_session.close() elif _is_template_agent(agent_name): diff --git a/auto-analyst-backend/chat_database.db b/auto-analyst-backend/chat_database.db index c8f9bd01..c8fe109a 100644 --- a/auto-analyst-backend/chat_database.db +++ b/auto-analyst-backend/chat_database.db @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:61639e5bb19bdd13c83e7ad10d3bbaab442ed8b461c21632d0c71f2409d118bb -size 77824 +oid sha256:5182504f09b433865500dea5844a934662270e3aba11fae15c58df19855b2ba1 +size 81920 diff --git a/auto-analyst-backend/scripts/populate_agent_templates.py b/auto-analyst-backend/scripts/populate_agent_templates.py index b0d9789d..97894af3 100644 --- a/auto-analyst-backend/scripts/populate_agent_templates.py +++ b/auto-analyst-backend/scripts/populate_agent_templates.py @@ -22,7 +22,7 @@ "template_name": "matplotlib_agent", "display_name": "Matplotlib Visualization Agent", "description": "Creates static publication-quality plots using matplotlib and seaborn", - "icon_url": "https://cdn.jsdelivr.net/gh/devicons/devicon/icons/matplotlib/matplotlib-original.svg", + "icon_url": "/icons/templates/matplotlib.svg", "prompt_template": """ You are a matplotlib/seaborn visualization expert. Your task is to create high-quality static visualizations using matplotlib and seaborn libraries. @@ -42,7 +42,7 @@ "template_name": "seaborn_agent", "display_name": "Seaborn Statistical Plots Agent", "description": "Creates statistical visualizations and data exploration plots using seaborn", - "icon_url": "https://seaborn.pydata.org/_images/logo-mark-lightbg.svg", + "icon_url": "/icons/templates/seaborn.svg", "prompt_template": """ You are a seaborn statistical visualization expert. Your task is to create statistical plots and exploratory data visualizations. @@ -65,7 +65,7 @@ "template_name": "polars_agent", "display_name": "Polars Data Processing Agent", "description": "High-performance data manipulation and analysis using Polars", - "icon_url": "https://raw.githubusercontent.com/pola-rs/polars-static/master/logos/polars-logo-dark.svg", + "icon_url": "/icons/templates/polars.svg", "prompt_template": """ You are a Polars data processing expert. Perform high-performance data manipulation and analysis using Polars. @@ -88,7 +88,7 @@ "template_name": "data_cleaning_agent", "display_name": "Data Cleaning Specialist Agent", "description": "Specialized in comprehensive data cleaning and quality assessment", - "icon_url": "https://cdn-icons-png.flaticon.com/512/2103/2103633.png", + "icon_url": "/icons/templates/data-cleaning.png", "prompt_template": """ You are a data cleaning specialist. Perform comprehensive data quality assessment and cleaning. @@ -111,7 +111,7 @@ "template_name": "feature_engineering_agent", "display_name": "Feature Engineering Agent", "description": "Creates and transforms features for machine learning models", - "icon_url": "https://cdn-icons-png.flaticon.com/512/2103/2103658.png", + "icon_url": "/icons/templates/feature-engineering.png", "prompt_template": """ You are a feature engineering expert. Create, transform, and select features for machine learning. diff --git a/auto-analyst-frontend/components/chat/Sidebar.tsx b/auto-analyst-frontend/components/chat/Sidebar.tsx index 6a88bd24..8c6ee85c 100644 --- a/auto-analyst-frontend/components/chat/Sidebar.tsx +++ b/auto-analyst-frontend/components/chat/Sidebar.tsx @@ -95,7 +95,7 @@ const Sidebar: React.FC = ({ isOpen, onClose, onNewChat, chatHisto // Use templates hook for data management const { templateCount, enabledCount } = useTemplates({ userId, - enabled: isOpen && !!userId && userId > 0 + enabled: isOpen && !!userId }) const handleNewChat = async () => { diff --git a/auto-analyst-frontend/components/custom-templates/useTemplates.ts b/auto-analyst-frontend/components/custom-templates/useTemplates.ts index 38faf05e..c0ee739a 100644 --- a/auto-analyst-frontend/components/custom-templates/useTemplates.ts +++ b/auto-analyst-frontend/components/custom-templates/useTemplates.ts @@ -28,7 +28,7 @@ export function useTemplates({ userId, enabled = true }: UseTemplatesProps): Use const { toast } = useToast() const loadData = useCallback(async () => { - if (!enabled || !userId || userId <= 0) return + if (!enabled || !userId) return setLoading(true) setError(null) @@ -56,15 +56,11 @@ export function useTemplates({ userId, enabled = true }: UseTemplatesProps): Use const errorMessage = err instanceof Error ? err.message : 'Failed to load data' setError(errorMessage) console.error('Error loading templates data:', err) - - // Only show toast if it's not a network/fetch error to avoid persistent error popups - if (!(err instanceof TypeError && err.message.includes('Failed to fetch'))) { - toast({ - title: "Error", - description: errorMessage, - variant: "destructive", - }) - } + toast({ + title: "Error", + description: errorMessage, + variant: "destructive", + }) } finally { setLoading(false) } diff --git a/auto-analyst-frontend/components/landing/AgentsSection.tsx b/auto-analyst-frontend/components/landing/AgentsSection.tsx index a208ab9e..1b36547d 100644 --- a/auto-analyst-frontend/components/landing/AgentsSection.tsx +++ b/auto-analyst-frontend/components/landing/AgentsSection.tsx @@ -1,81 +1,10 @@ "use client" import { motion } from "framer-motion" +import { agents } from "./FnT" import { Badge } from "@/components/ui/badge" -import { CheckCircle, Palette, Database, Sparkles, Zap } from "lucide-react" - -// Template categories and their agents based on populate_agent_templates.py -const templateCategories = [ - { - category: "Visualization", - icon: Palette, - color: "from-purple-500 to-purple-600", - description: "Professional data visualization and statistical plotting", - templates: [ - { - name: "Matplotlib Visualization Agent", - description: "Publication-quality static plots with matplotlib and seaborn", - capabilities: [ - "High-quality static visualizations", - "Professional styling and themes", - "Statistical plot annotations", - "Publication-ready outputs" - ] - }, - { - name: "Seaborn Statistical Plots Agent", - description: "Statistical visualizations and exploratory data analysis", - capabilities: [ - "Distribution analysis plots", - "Correlation and relationship visualization", - "Categorical data plotting", - "Statistical significance testing" - ] - } - ] - }, - { - category: "Data Manipulation", - icon: Database, - color: "from-blue-500 to-blue-600", - description: "High-performance data processing and feature engineering", - templates: [ - { - name: "Polars Data Processing Agent", - description: "Lightning-fast data manipulation with memory efficiency", - capabilities: [ - "High-performance data processing", - "Lazy evaluation optimization", - "Complex data transformations", - "Memory-efficient operations" - ] - }, - { - name: "Data Cleaning Specialist Agent", - description: "Comprehensive data quality assessment and cleaning", - capabilities: [ - "Missing value detection & handling", - "Data quality assessment reports", - "Outlier detection & treatment", - "Inconsistency resolution" - ] - }, - { - name: "Feature Engineering Agent", - description: "Advanced feature creation for machine learning", - capabilities: [ - "Intelligent feature creation", - "Categorical encoding strategies", - "Feature selection methods", - "Cross-validation techniques" - ] - } - ] - } -] +import { CheckCircle } from "lucide-react" export default function AgentsSection() { - const totalTemplates = templateCategories.reduce((sum, cat) => sum + cat.templates.length, 0) - return (
@@ -86,101 +15,66 @@ export default function AgentsSection() { viewport={{ once: true }} className="text-center mb-10 sm:mb-16" > -
- - - Template Library - -

- Specialized AI Agent Templates + Four Specialized AI Agents

- Choose from our growing library of specialized agent templates, each expertly crafted for specific data science tasks. More templates are continuously being added to expand your analytical capabilities. + Unlike ChatGPT's general-purpose approach, Auto-Analyst uses four specialized agents that work together to handle complex data science workflows with precision and reliability.

-
-
- - {totalTemplates}+ Expert Templates -
-
- - {templateCategories.length} Categories -
-
-
- {templateCategories.map((category, categoryIndex) => ( +
+ {agents.map((agent, index) => ( - {/* Category Header */} -
-
-
- + {/* Gradient Background */} +
+ +
+ {/* Agent Header */} +
+
+ +
+
+

{agent.name}

+

{agent.description}

-

{category.category}

-

{category.description}

-
- - {/* Templates Grid */} -
- {category.templates.map((template, templateIndex) => ( - - {/* Gradient Background */} -
- -
- {/* Template Header */} -
-

- {template.name} -

-

{template.description}

-
- {/* Capabilities */} -
-
Key Features:
- {template.capabilities.map((capability, capIndex) => ( - - - {capability} - - ))} -
+ {/* Capabilities */} +
+

Key Capabilities:

+ {agent.capabilities.map((capability, capIndex) => ( + + + {capability} + + ))} +
- {/* Premium Badge */} -
- - Premium Template - -
-
- - ))} + {/* Agent Usage Indicator */} +
+ + @{agent.name.toLowerCase().replace(/\s+/g, '_')} + +

+ Direct your queries to this agent using @mentions +

+
))} @@ -190,31 +84,24 @@ export default function AgentsSection() { -
-
- - - Growing Library - -
+

- More Templates Coming Soon + Intelligent Agent Orchestration

-

- Our expert team continuously develops new specialized agent templates for advanced analytics, - machine learning, statistical modeling, and domain-specific use cases. Each template is crafted - with best practices and proven methodologies. +

+ Our planner automatically selects and coordinates the right agents for your specific query, + or you can direct questions to specific agents using @mentions for precise control.

- Machine Learning - Time Series - NLP Analysis - Statistical Modeling - Business Intelligence + {agents.map((agent, index) => ( + + @{agent.name.toLowerCase().replace(/\s+/g, '_')} + + ))}
diff --git a/auto-analyst-frontend/components/landing/FnT.tsx b/auto-analyst-frontend/components/landing/FnT.tsx index ecb54c0c..a528f8e9 100644 --- a/auto-analyst-frontend/components/landing/FnT.tsx +++ b/auto-analyst-frontend/components/landing/FnT.tsx @@ -1,11 +1,11 @@ "use client" -import { Brain, LineChart, Database, BarChart2, Lock, Zap, FileText, TrendingUp, Cog, BarChart3, Github, Server, Cpu, Globe, Sparkles, Palette } from "lucide-react" +import { Brain, LineChart, Database, BarChart2, Lock, Zap, FileText, TrendingUp, Cog, BarChart3, Github, Server, Cpu, Globe } from "lucide-react" export const features = [ { - icon: Sparkles, - title: "Specialized Agent Templates", - description: "Choose from expert-crafted templates for visualization, data processing, feature engineering, and more specialized tasks" + icon: FileText, + title: "Multi-Agent Orchestration", + description: "Unlike ChatGPT's single model, Auto-Analyst uses specialized agents that work together for complex data science workflows" }, { icon: Github, @@ -29,12 +29,65 @@ export const features = [ }, { icon: Cog, - title: "Expert-Level Analytics", - description: "Access professional-grade data science capabilities through carefully designed template workflows" + title: "Specialized for Analytics", + description: "Purpose-built for data science workflows with guardrails and reliability features ChatGPT lacks" }, ] - +export const agents = [ + { + icon: Database, + name: "Preprocessing Agent", + description: "Data cleaning specialist using pandas and numpy", + capabilities: [ + "Clean and transform datasets", + "Handle missing values intelligently", + "Convert data types automatically", + "Create aggregates and summaries", + "Detect and fix data quality issues" + ], + color: "from-blue-500 to-blue-600" + }, + { + icon: TrendingUp, + name: "Statistical Analytics Agent", + description: "Advanced statistical analysis using statsmodels", + capabilities: [ + "Correlation and regression analysis", + "Hypothesis testing and A/B tests", + "Time series analysis", + "Statistical modeling", + "Confidence intervals and p-values" + ], + color: "from-green-500 to-green-600" + }, + { + icon: Brain, + name: "Scikit-Learn Agent", + description: "Machine learning specialist for predictive modeling", + capabilities: [ + "Random Forest and ensemble methods", + "K-means clustering analysis", + "Classification and regression", + "Feature selection and engineering", + "Model evaluation and validation" + ], + color: "from-purple-500 to-purple-600" + }, + { + icon: BarChart3, + name: "Data Visualization Agent", + description: "Interactive visualizations using Plotly", + capabilities: [ + "Interactive charts and graphs", + "Statistical plot recommendations", + "Multi-dimensional visualizations", + "Custom styling and formatting", + "Export-ready visualizations" + ], + color: "from-orange-500 to-orange-600" + } +] export const supportedConnectors = [ { diff --git a/auto-analyst-frontend/public/icons/logos/auto-analyst-logo.png b/auto-analyst-frontend/public/icons/logos/auto-analyst-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..49fb93737f8ff71f13134d740226ee99f6c97cd8 GIT binary patch literal 10102 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 literal 0 HcmV?d00001 diff --git a/auto-analyst-frontend/public/icons/logos/firebird-logo.png b/auto-analyst-frontend/public/icons/logos/firebird-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..389d05dab1e5d7c3041af7cfa36a8d3707905134 GIT binary patch literal 3782 zcmV;%4mt6OP)StO&>uS)ve<0AYj> z5AR{$W90N^4L=L-RlQUJ&DC0@ZjPh;=*jPLSYvv5M~MFBAl0-BNIsH15C~g000{K(ZT*WKal6< z?_01!^k@7iDG<<3=fuAC~28EsPoqkpK{9G%|Vj z005J}`Hw&=0RYXHq~ibpyyzHQsFW8>#s~laM4*8xut5h5!4#~(4xGUqyucR%VFpA% z3?#rj5JCpzfE)^;7?wd9RKPme1hudO8lVxH;SjXJF*pt9;1XPc>u?taU>Kgl7`%oF z1VP9M6Ja4bh!J9r*dopd7nzO(B4J20l7OTj>4+3jBE`sZqynizYLQ(?Bl0bB6giDt zK>Co|$RIL`{EECsF_eL_Q3KQhbwIhO9~z3rpmWi5G!I>XmZEFX8nhlgfVQHi(M#xc zbO3#dj$?q)F%D*o*1Pf{>6$SWH+$s3q(pv=X`qR|$iJF~TPzlc-O$C3+J1#CT#lv5;6stS0Uu9wDA3 zUMCI{Uz12A4#|?_P6{CkNG+sOq(0IRX`DyT~9-sA|ffUF>wk++Z! zkWZ5P$;0Hg6gtI-;!FvmBvPc55=u2?Kjj3apE5$3psG>Lsh-pbs)#zDT1jo7c2F-< zhp7`Zb($s3n-)XMq%EV>(3)vyY4>O^>2$gY-Gd%Qm(Z8eYv>2*=jns=cMJ`N4THx> zVkjAF8G9M07`GWOnM|ey)0dgZR4~^v8<}UA514ONSSt1^d=-((5|uiYR+WC0=c-gy zb5%dpd8!Lkt5pxHURHgkMpd&=fR^vEcAI*_=wwAG z2sV%zY%w@v@XU~7=xdm1xY6*0;iwVIXu6TaXrs|dqbIl~?uTdNHFy_3W~^@g_pF#!K2~{F^;XxcN!DEJEbDF7S8PxlSDOr*I-AS3sI8l= z#CDr)-xT5$k15hA^;2%zG3@;83hbKf2JJcaVfH2VZT8O{%p4LO);n}Nd~$Sk%yw*W zyz8XlG{dRHsl(}4XB%gsbDi@w7p6;)%MzD%mlsoQr;4X;pL)xc% z+^yMd)ZNTI#eJ*$O)i@o$z8)e??LqN_gLa_%;TM>o2SC_kmoO6c3xRt`@J4dvz#WL z)-Y|z+r(Soy~}%GIzByR`p)SCKE^%*pL(B%zNWq+-#xw~e%5}Oeh2)X`#bu}{g3#+ z;d$~F@lFL`0l@*~0lk45fwKc^10MvL1f>Tx1&sx}1}_Xg6+#RN4Ot&@lW)Km@*DYM zGu&q^n$Z=?2%QyL8~QNJCQKgI5srq>2;UHXZ>IT7>CCnWh~P(Th`1kV8JQRPeH1Aw zGO8}>QM6NZadh`A)~w`N`)9q5@sFvDxjWlxwsLl7tZHmhY-8-3xPZ8-xPf?w_(k!T z5_A(J3GIpG#Ms0=iQ{tu=WLoYoaCBRmULsT<=mpV7v|~C%bs^USv6UZd^m-e5|^?+ z<%1wXP%juy<)>~<9TW0|n}ttBzM_qyQL(qUN<5P0omQ3hINdvaL;7fjPeygdGYL;p zD|wL_lDQ-EO;$wK-mK5raoH_7l$?~Dqf!lNmb5F^Ft;eTPi8AClMUo~=55LwlZVRp z zxOiFd;3B_8yA~shQx|tGF!j;$toK>JuS&gYLDkTP@C~gS@r~shUu{a>bfJ1`^^VQ7&C1OKHDNXFTgC{M|V%fo{xK_dk6MK@9S!GZ*1JJzrV5xZBjOk9!NTH<(q(S+MDf~ceQX@ zDh|Ry<-sT4rhI$jQ0Sq~!`#Eo-%($2E^vo}is5J@NVEf|KK?WT&2;PCq@=ncR8zO#GQ^T~S@VXG71PKNocF zOt)Y6$@AXlk6rM*aP%VgV%sIRORYVwJx6|U{ozQjTW{-S_si{9Jg#)~P3t?+@6&(! zYQWWV*Z9{iU7vZq@5byKw{9lg9JnRA_4s!7?H6|n?o8ZWdXIRo{Jz@#>IeD{>VLHU zv1Pz*;P_y`V9&!@5AO~Mho1hF|I>%z(nrik)gwkDjgOrl9~%uCz4Bzvli{bbrxVZ0 zepdf^>vOB;-~HnIOV3#R*zgPai_gEVd8zYq@2jb=I>#f&AH2?aJ@Kaet!DG(62^-p+jQ?e1^Bq2*(fQYvC?SQfUFNMOSd z004F6D3dj^RFG<=lZ#`ueN=gV{M*mudFxfIrECwST+YuysjgixrmLQf)uz7S{0HWV z2`PtNDs0Kmkn2HYeF0klq|WcE*>UWW*|Y4Wq=x|DD>=%^)RV?>SSkVXSU&4OxRvwQqCS*^la)jvS#v@{}e z)6g1h!Q2^ufj|vzgE6oSK(UQ)|JAtmjdSEE0R8B0wRww#CEC<4%LVd$wRteUdy9e$ zlm-A1CkecJ9S6x7(=B( zo)4orHwyxiE(IA0i-sJh@$J=$oA%FMB*y{ZzVf;r9Ht=Ce0jZd518rUL7hxdDg{4) zwPIt+_DXG)wC33<^0Nj2d4Bz?D-t#Qv+q$V1;Cknwu_0S0?*yod-lqFj^}f*Rt;_i zGbNL}me0u`6l z&^B@$>Koufz6rVlAmwu6&}4A&a$6<7{)^4c{`a++f~+3fEz1Sc+Klc}Tem|%2?xTe zw+{dWN}@*M&@;h1?~@-iH`c%YtoZ6N&doHZe18UMU*>c6#&uq;+PPW85v=9Kc`1hw zQA5KZ(9+~V_0Rx$K5Ps?nC+cg-s!iJ&%Xq~-n&yed0ZCrX5Tn3%#-I)khS-2ckGRY zj1h=|BK!AEv9?WsGx20o1%SPIgYVuZ&zG=7zAv?!lxN6scrMpAHi1yjCIbM8M8{YO zAl3XA5|(P8e~MHZ+VH|0`2nR|E)-h^&}~WG9JNXah@>2br%psaeouY|5UG@*6oe#d zQ2GH2-dHG^lu|J~eKPvtI|?!_yH`rWB0#FQ?|+Ofj@QmfYY9u?8*P=fYqf+c5=Afu w!d;Kzm^QeMSj0w@a5iWbfULiZ08l3TFIg-8vx(3iZ~y=R07*qoM6N<$f+C_bc>n+a literal 0 HcmV?d00001 diff --git a/auto-analyst-frontend/public/icons/templates/data-cleaning.png b/auto-analyst-frontend/public/icons/templates/data-cleaning.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4c7ea67f8305c9243520ca47714c7ac62348ba GIT binary patch literal 28254 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 E0J{fGssI20 literal 0 HcmV?d00001 diff --git a/auto-analyst-frontend/public/icons/templates/feature-engineering.png b/auto-analyst-frontend/public/icons/templates/feature-engineering.png new file mode 100644 index 0000000000000000000000000000000000000000..760c757cf2b9abf3f790ad6f7474490fed1e1420 GIT binary patch literal 39022 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≺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 UEHT>!ywX4i9e>AG*%Pk*3+T6RZU6uP literal 0 HcmV?d00001 diff --git a/auto-analyst-frontend/public/icons/templates/matplotlib.svg b/auto-analyst-frontend/public/icons/templates/matplotlib.svg new file mode 100644 index 00000000..3b133c9b --- /dev/null +++ b/auto-analyst-frontend/public/icons/templates/matplotlib.svg @@ -0,0 +1 @@ + diff --git a/auto-analyst-frontend/public/icons/templates/polars.svg b/auto-analyst-frontend/public/icons/templates/polars.svg new file mode 100644 index 00000000..5a99c887 --- /dev/null +++ b/auto-analyst-frontend/public/icons/templates/polars.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/auto-analyst-frontend/public/icons/templates/seaborn.svg b/auto-analyst-frontend/public/icons/templates/seaborn.svg new file mode 100644 index 00000000..1405269e --- /dev/null +++ b/auto-analyst-frontend/public/icons/templates/seaborn.svg @@ -0,0 +1,4946 @@ + + + + + + + + + 2020-09-07T14:13:57.855925 + image/svg+xml + + + Matplotlib v3.3.1, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a89a4df8f5d3eed116eeab839eb83ef04dcf2a8c Mon Sep 17 00:00:00 2001 From: Ashad Qureshi Date: Sun, 15 Jun 2025 23:44:08 +0500 Subject: [PATCH 3/3] app.py indentation fixed --- auto-analyst-backend/app.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/auto-analyst-backend/app.py b/auto-analyst-backend/app.py index 9be76a74..6ecee146 100644 --- a/auto-analyst-backend/app.py +++ b/auto-analyst-backend/app.py @@ -449,7 +449,7 @@ async def chat_with_agent( _execute_custom_agents(ai_system, agent_list, enhanced_query), timeout=REQUEST_TIMEOUT_SECONDS ) - else: + else: # All standard/template agents - use auto_analyst_ind standard_agent_sigs = [AVAILABLE_AGENTS[agent] for agent in standard_agents] user_id = session_state.get("user_id") @@ -457,9 +457,9 @@ async def chat_with_agent( # Create database session for template loading from src.db.init_db import session_factory db_session = session_factory() - try: + try: agent = auto_analyst_ind(agents=standard_agent_sigs, retrievers=session_state["retrievers"], user_id=user_id, db_session=db_session) - session_lm = get_session_lm(session_state) + session_lm = get_session_lm(session_state) with dspy.context(lm=session_lm): response = await asyncio.wait_for( agent.forward(enhanced_query, ",".join(agent_list)), @@ -479,11 +479,11 @@ async def chat_with_agent( try: agent = auto_analyst_ind(agents=[AVAILABLE_AGENTS[agent_name]], retrievers=session_state["retrievers"], user_id=user_id, db_session=db_session) session_lm = get_session_lm(session_state) - with dspy.context(lm=session_lm): - response = await asyncio.wait_for( - agent.forward(enhanced_query, agent_name), - timeout=REQUEST_TIMEOUT_SECONDS - ) + with dspy.context(lm=session_lm): + response = await asyncio.wait_for( + agent.forward(enhanced_query, agent_name), + timeout=REQUEST_TIMEOUT_SECONDS + ) finally: db_session.close() elif _is_template_agent(agent_name):