Spaces:
Running
Running
import asyncio | |
from typing import Any | |
from agno.agent import Agent | |
from agno.models.openai import OpenAIChat | |
from agno.tools.googlesearch import GoogleSearchTools | |
from agno.utils.pprint import pprint_run_response | |
from agno.workflow.v2.types import WorkflowExecutionInput | |
from agno.workflow.v2.workflow import Workflow | |
from pydantic import BaseModel, Field | |
from dotenv import load_dotenv | |
import os | |
script_dir = os.path.dirname(os.path.abspath(__file__)) | |
env_path = os.path.join(script_dir, '.env') | |
load_dotenv(env_path) | |
# --- Atla Insights Configuration --- | |
from atla_insights import configure, instrument, instrument_agno, instrument_openai, mark_success, mark_failure, tool, set_metadata | |
# Model configuration - using same model across all agents but you can change them to any model you want | |
DEFAULT_MODEL_ID = "gpt-4o" | |
# Define metadata for tracing | |
def get_metadata(model_id): | |
return { | |
"model": model_id, | |
"prompt": "v1.1", | |
"environment": "prod", | |
"agent_name": "Startup Idea Validator" | |
} | |
# Configure Atla Insights with metadata - REQUIRED FIRST | |
configure(token=os.getenv("ATLA_INSIGHTS_TOKEN"), metadata=get_metadata(DEFAULT_MODEL_ID)) | |
# Instrument based on detected framework and LLM provider | |
instrument_agno("openai") # Agno framework with OpenAI | |
# --- Response models --- | |
class IdeaClarification(BaseModel): | |
originality: str = Field(..., description="Originality of the idea.") | |
mission: str = Field(..., description="Mission of the company.") | |
objectives: str = Field(..., description="Objectives of the company.") | |
class MarketResearch(BaseModel): | |
total_addressable_market: str = Field( | |
..., description="Total addressable market (TAM) with specific dollar amount." | |
) | |
total_addressable_market_calculation: str = Field( | |
..., description="Step-by-step calculation methodology used to derive TAM." | |
) | |
total_addressable_market_sources: str = Field( | |
..., description="Specific data sources and citations used for TAM calculation." | |
) | |
serviceable_available_market: str = Field( | |
..., description="Serviceable available market (SAM) with specific dollar amount." | |
) | |
serviceable_available_market_calculation: str = Field( | |
..., description="Step-by-step calculation methodology used to derive SAM from TAM." | |
) | |
serviceable_obtainable_market: str = Field( | |
..., description="Serviceable obtainable market (SOM) with specific dollar amount." | |
) | |
serviceable_obtainable_market_calculation: str = Field( | |
..., description="Step-by-step calculation methodology used to derive SOM from SAM." | |
) | |
market_size_validation: str = Field( | |
..., description="Self-validation check: Does SOM < SAM < TAM? Are calculations logical and consistent?" | |
) | |
target_customer_segments: str = Field(..., description="Target customer segments with detailed demographics, needs, and market sizes.") | |
data_quality_assessment: str = Field( | |
..., description="Assessment of the reliability and recency of the data sources used." | |
) | |
class CompetitorAnalysis(BaseModel): | |
competitors: str = Field(..., description="List of identified competitors.") | |
swot_analysis: str = Field(..., description="SWOT analysis for each competitor.") | |
positioning: str = Field( | |
..., description="Startup's potential positioning relative to competitors." | |
) | |
class ValidationReport(BaseModel): | |
executive_summary: str = Field( | |
..., description="Executive summary of the validation." | |
) | |
idea_assessment: str = Field(..., description="Assessment of the startup idea.") | |
market_opportunity: str = Field(..., description="Market opportunity analysis.") | |
competitive_landscape: str = Field( | |
..., description="Competitive landscape overview." | |
) | |
recommendations: str = Field(..., description="Strategic recommendations.") | |
next_steps: str = Field(..., description="Recommended next steps.") | |
# --- Agent creation functions --- | |
def create_agents(model_id: str = DEFAULT_MODEL_ID): | |
"""Create all agents with the specified model""" | |
idea_clarifier_agent = Agent( | |
name="Idea Clarifier", | |
model=OpenAIChat(id=model_id), | |
instructions=[ | |
"Given a user's startup idea, your goal is to refine that idea.", | |
"Evaluate the originality of the idea by comparing it with existing concepts.", | |
"Define the mission and objectives of the startup.", | |
"Provide clear, actionable insights about the core business concept.", | |
], | |
add_history_to_messages=True, | |
add_datetime_to_instructions=True, | |
response_model=IdeaClarification, | |
debug_mode=False, | |
) | |
market_research_agent = Agent( | |
name="Market Research Agent", | |
model=OpenAIChat(id=model_id), | |
tools=[GoogleSearchTools()], | |
instructions=[ | |
"You are provided with a startup idea and the company's mission and objectives.", | |
"Estimate the total addressable market (TAM), serviceable available market (SAM), and serviceable obtainable market (SOM).", | |
"Define target customer segments and their characteristics.", | |
"Search the web for resources and data to support your analysis.", | |
"Provide specific market size estimates with supporting data sources.", | |
], | |
add_history_to_messages=True, | |
add_datetime_to_instructions=True, | |
response_model=MarketResearch, | |
debug_mode=False, | |
) | |
competitor_analysis_agent = Agent( | |
name="Competitor Analysis Agent", | |
model=OpenAIChat(id=model_id), | |
tools=[GoogleSearchTools()], | |
instructions=[ | |
"You are provided with a startup idea and market research data.", | |
"Identify existing competitors in the market.", | |
"Perform Strengths, Weaknesses, Opportunities, and Threats (SWOT) analysis for each competitor.", | |
"Assess the startup's potential positioning relative to competitors.", | |
"Search for recent competitor information and market positioning.", | |
], | |
add_history_to_messages=True, | |
add_datetime_to_instructions=True, | |
response_model=CompetitorAnalysis, | |
debug_mode=False, | |
) | |
report_agent = Agent( | |
name="Report Generator", | |
model=OpenAIChat(id=model_id), | |
instructions=[ | |
"You are provided with comprehensive data about a startup idea including clarification, market research, and competitor analysis.", | |
"Synthesize all information into a comprehensive validation report.", | |
"Provide clear executive summary, assessment, and actionable recommendations.", | |
"Structure the report professionally with clear sections and insights.", | |
"Include specific next steps for the entrepreneur.", | |
], | |
add_history_to_messages=True, | |
add_datetime_to_instructions=True, | |
response_model=ValidationReport, | |
debug_mode=False, | |
) | |
return idea_clarifier_agent, market_research_agent, competitor_analysis_agent, report_agent | |
# --- Execution function --- | |
async def startup_validation_execution( | |
workflow: Workflow, | |
execution_input: WorkflowExecutionInput, # This is a Pydantic model to ensure type safety | |
startup_idea: str, | |
model_id: str = DEFAULT_MODEL_ID, | |
progress_callback=None, | |
**kwargs: Any, | |
) -> str: | |
"""Execute the complete startup idea validation workflow""" | |
# Set dynamic metadata for this execution | |
set_metadata(get_metadata(model_id)) | |
# Create agents with the specified model | |
idea_clarifier_agent, market_research_agent, competitor_analysis_agent, report_agent = create_agents(model_id) | |
# Get inputs | |
message: str = execution_input.message | |
idea: str = startup_idea | |
if not idea: | |
mark_failure() | |
return "β No startup idea provided" | |
if progress_callback: | |
progress_callback(f"π Starting startup idea validation for: {idea}") | |
progress_callback(f"π‘ Validation request: {message}") | |
progress_callback(f"π€ Using model: {model_id}") | |
else: | |
print(f"π Starting startup idea validation for: {idea}") | |
print(f"π‘ Validation request: {message}") | |
print(f"π€ Using model: {model_id}") | |
# Phase 1: Idea Clarification | |
if progress_callback: | |
progress_callback(f"\nπ― PHASE 1: IDEA CLARIFICATION & REFINEMENT") | |
progress_callback("=" * 60) | |
else: | |
print(f"\nπ― PHASE 1: IDEA CLARIFICATION & REFINEMENT") | |
print("=" * 60) | |
clarification_prompt = f""" | |
{message} | |
Please analyze and refine the following startup idea: | |
STARTUP IDEA: {idea} | |
Evaluate: | |
1. The originality of this idea compared to existing solutions | |
2. Define a clear mission statement for this startup | |
3. Outline specific, measurable objectives | |
Provide insights on how to strengthen and focus the core concept. | |
""" | |
if progress_callback: | |
progress_callback(f"π Analyzing and refining the startup concept...") | |
else: | |
print(f"π Analyzing and refining the startup concept...") | |
try: | |
clarification_result = await idea_clarifier_agent.arun(clarification_prompt) | |
idea_clarification = clarification_result.content | |
if progress_callback: | |
progress_callback(f"β Idea clarification completed") | |
progress_callback(f"π Mission: {idea_clarification.mission[:100]}...") | |
else: | |
print(f"β Idea clarification completed") | |
print(f"π Mission: {idea_clarification.mission[:100]}...") | |
except Exception as e: | |
mark_failure() | |
return f"β Failed to clarify idea: {str(e)}" | |
# Phase 2: Market Research | |
if progress_callback: | |
progress_callback(f"\nπ PHASE 2: MARKET RESEARCH & ANALYSIS") | |
progress_callback("=" * 60) | |
else: | |
print(f"\nπ PHASE 2: MARKET RESEARCH & ANALYSIS") | |
print("=" * 60) | |
market_research_prompt = f""" | |
Based on the refined startup idea and clarification below, conduct comprehensive market research: | |
STARTUP IDEA: {idea} | |
ORIGINALITY: {idea_clarification.originality} | |
MISSION: {idea_clarification.mission} | |
OBJECTIVES: {idea_clarification.objectives} | |
Please research and provide: | |
1. Total Addressable Market (TAM) - overall market size | |
2. Serviceable Available Market (SAM) - portion you could serve | |
3. Serviceable Obtainable Market (SOM) - realistic market share | |
4. Target customer segments with detailed characteristics | |
Use web search to find current market data and trends. | |
""" | |
if progress_callback: | |
progress_callback(f"π Researching market size and customer segments...") | |
else: | |
print(f"π Researching market size and customer segments...") | |
try: | |
market_result = await market_research_agent.arun(market_research_prompt) | |
market_research = market_result.content | |
if progress_callback: | |
progress_callback(f"β Market research completed") | |
progress_callback(f"π― TAM: {market_research.total_addressable_market[:100]}...") | |
else: | |
print(f"β Market research completed") | |
print(f"π― TAM: {market_research.total_addressable_market[:100]}...") | |
except Exception as e: | |
mark_failure() | |
return f"β Failed to complete market research: {str(e)}" | |
# Phase 3: Competitor Analysis | |
if progress_callback: | |
progress_callback(f"\nπ’ PHASE 3: COMPETITIVE LANDSCAPE ANALYSIS") | |
progress_callback("=" * 60) | |
else: | |
print(f"\nπ’ PHASE 3: COMPETITIVE LANDSCAPE ANALYSIS") | |
print("=" * 60) | |
competitor_prompt = f""" | |
Based on the startup idea and market research below, analyze the competitive landscape: | |
STARTUP IDEA: {idea} | |
TAM: {market_research.total_addressable_market} | |
SAM: {market_research.serviceable_available_market} | |
SOM: {market_research.serviceable_obtainable_market} | |
TARGET SEGMENTS: {market_research.target_customer_segments} | |
Please research and provide: | |
1. Identify direct and indirect competitors | |
2. SWOT analysis for each major competitor | |
3. Assessment of startup's potential competitive positioning | |
4. Market gaps and opportunities | |
Use web search to find current competitor information. | |
""" | |
if progress_callback: | |
progress_callback(f"π Analyzing competitive landscape...") | |
else: | |
print(f"π Analyzing competitive landscape...") | |
try: | |
competitor_result = await competitor_analysis_agent.arun(competitor_prompt) | |
competitor_analysis = competitor_result.content | |
if progress_callback: | |
progress_callback(f"β Competitor analysis completed") | |
progress_callback(f"π Positioning: {competitor_analysis.positioning[:100]}...") | |
else: | |
print(f"β Competitor analysis completed") | |
print(f"π Positioning: {competitor_analysis.positioning[:100]}...") | |
except Exception as e: | |
mark_failure() | |
return f"β Failed to complete competitor analysis: {str(e)}" | |
# Phase 4: Final Validation Report | |
if progress_callback: | |
progress_callback(f"\nπ PHASE 4: COMPREHENSIVE VALIDATION REPORT") | |
progress_callback("=" * 60) | |
else: | |
print(f"\nπ PHASE 4: COMPREHENSIVE VALIDATION REPORT") | |
print("=" * 60) | |
report_prompt = f""" | |
Synthesize all the research and analysis into a comprehensive startup validation report: | |
STARTUP IDEA: {idea} | |
IDEA CLARIFICATION: | |
- Originality: {idea_clarification.originality} | |
- Mission: {idea_clarification.mission} | |
- Objectives: {idea_clarification.objectives} | |
MARKET RESEARCH: | |
- TAM: {market_research.total_addressable_market} | |
- SAM: {market_research.serviceable_available_market} | |
- SOM: {market_research.serviceable_obtainable_market} | |
- Target Segments: {market_research.target_customer_segments} | |
COMPETITOR ANALYSIS: | |
- Competitors: {competitor_analysis.competitors} | |
- SWOT: {competitor_analysis.swot_analysis} | |
- Positioning: {competitor_analysis.positioning} | |
Create a professional validation report with: | |
1. Executive summary | |
2. Idea assessment (strengths/weaknesses) | |
3. Market opportunity analysis | |
4. Competitive landscape overview | |
5. Strategic recommendations | |
6. Specific next steps for the entrepreneur | |
""" | |
if progress_callback: | |
progress_callback(f"π Generating comprehensive validation report...") | |
else: | |
print(f"π Generating comprehensive validation report...") | |
try: | |
final_result = await report_agent.arun(report_prompt) | |
validation_report = final_result.content | |
if progress_callback: | |
progress_callback(f"β Validation report completed") | |
else: | |
print(f"β Validation report completed") | |
except Exception as e: | |
mark_failure() | |
return f"β Failed to generate final report: {str(e)}" | |
# Final summary | |
summary = f""" | |
π STARTUP IDEA VALIDATION COMPLETED! | |
π Validation Summary: | |
β’ Startup Idea: {idea} | |
β’ Idea Clarification: β Completed | |
β’ Market Research: β Completed | |
β’ Competitor Analysis: β Completed | |
β’ Final Report: β Generated | |
π Key Market Insights: | |
β’ TAM: {market_research.total_addressable_market[:150]}... | |
β’ Target Segments: {market_research.target_customer_segments[:150]}... | |
π Competitive Positioning: | |
{competitor_analysis.positioning[:200]}... | |
π COMPREHENSIVE VALIDATION REPORT: | |
## Executive Summary | |
{validation_report.executive_summary} | |
## Idea Assessment | |
{validation_report.idea_assessment} | |
## Market Opportunity | |
{validation_report.market_opportunity} | |
## Competitive Landscape | |
{validation_report.competitive_landscape} | |
## Strategic Recommendations | |
{validation_report.recommendations} | |
## Next Steps | |
{validation_report.next_steps} | |
β οΈ Disclaimer: This validation is for informational purposes only. Conduct additional due diligence before making investment decisions. | |
""" | |
# Mark successful completion | |
mark_success() | |
return summary | |
# --- Workflow definition --- | |
startup_validation_workflow = Workflow( | |
name="Startup Idea Validator", | |
description="Comprehensive startup idea validation with market research and competitive analysis", | |
steps=startup_validation_execution, | |
workflow_session_state={}, # Initialize empty workflow session state | |
) | |
if __name__ == "__main__": | |
async def main(): | |
from rich.prompt import Prompt | |
# Get idea from user | |
idea = Prompt.ask( | |
"[bold]What is your startup idea?[/bold]\nβ¨", | |
default="A marketplace for Christmas Ornaments made from leather", | |
) | |
print("π§ͺ Testing Startup Idea Validator with New Workflow Structure") | |
print("=" * 70) | |
try: | |
result = await startup_validation_workflow.arun( | |
message="Please validate this startup idea with comprehensive market research and competitive analysis", | |
startup_idea=idea, | |
model_id=DEFAULT_MODEL_ID, | |
) | |
pprint_run_response(result, markdown=True) | |
mark_success() | |
except Exception as e: | |
print(f"β Application failed: {str(e)}") | |
mark_failure() | |
raise | |
asyncio.run(main()) |