Spaces:
Sleeping
Sleeping
| import json | |
| import re | |
| import io | |
| import os | |
| from datetime import datetime | |
| from openai import OpenAI | |
| from reportlab.lib.pagesizes import letter | |
| from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image | |
| from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle | |
| from reportlab.lib.units import inch | |
| from reportlab.lib.enums import TA_CENTER | |
| client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) | |
| # validate_startup_idea | |
| def validate_startup_idea(idea, category=None, subcategory=None): | |
| category_text = f"Category: {category}" if category else "" | |
| subcategory_text = f"Subcategory: {subcategory}" if subcategory else "" | |
| prompt = f""" | |
| You are a business analysis assistant. Analyze the following startup idea: | |
| "{idea}" | |
| {category_text} | |
| {subcategory_text} | |
| Return your analysis strictly in the following JSON format without extra text: | |
| {{ | |
| "swot": {{ | |
| "strengths": ["bullet point", "bullet point", "bullet point", "bullet point", "bullet point"], | |
| "weaknesses": ["bullet point", "bullet point", "bullet point", "bullet point", "bullet point"], | |
| "opportunities": ["bullet point", "bullet point", "bullet point", "bullet point", "bullet point"], | |
| "threats": ["bullet point", "bullet point", "bullet point", "bullet point", "bullet point"] | |
| }}, | |
| "audience": [ | |
| "bullet point audience segment", | |
| "bullet point audience segment", | |
| "bullet point audience segment", | |
| "bullet point audience segment", | |
| "bullet point audience segment" | |
| ], | |
| "competitors": [ | |
| {{"name": "Exact Competitor Name", "description": "Short description of why they're a competitor", "link": "https://competitor-website.com"}}, | |
| {{"name": "Exact Competitor Name", "description": "Short description", "link": "https://competitor-website.com"}}, | |
| {{"name": "Exact Competitor Name", "description": "Short description", "link": "https://competitor-website.com"}} | |
| ], | |
| "tools_and_tips": [ | |
| {{"name": "Tool or Platform Name", "description": "What it helps with", "link": "https://link-to-tool.com"}}, | |
| {{"name": "Tool or Platform Name", "description": "What it helps with", "link": "https://link-to-tool.com"}}, | |
| {{"name": "Tool or Platform Name", "description": "What it helps with", "link": "https://link-to-tool.com"}} | |
| ], | |
| "tools_and_resources": [ | |
| {{"name": "Resource Name", "description": "Why it’s useful", "link": "https://link-to-resource.com"}}, | |
| {{"name": "Resource Name", "description": "Why it’s useful", "link": "https://link-to-resource.com"}}, | |
| {{"name": "Resource Name", "description": "Why it’s useful", "link": "https://link-to-resource.com"}}, | |
| {{"name": "Resource Name", "description": "Why it’s useful", "link": "https://link-to-resource.com"}}, | |
| {{"name": "Resource Name", "description": "Why it’s useful", "link": "https://link-to-resource.com"}} | |
| ] | |
| }} | |
| Rules: | |
| - Always include **at least 5 bullet points** for "audience" and "tools_and_resources". | |
| - All tools, platforms, competitors, and resources must include clickable **links**. | |
| - Be very specific and practical. Avoid generic placeholders like "Competitor A" or "use social media". | |
| - In "tools_and_tips", name the platform (e.g., "Instagram") and the tool (e.g., "Buffer") and explain why. | |
| """ | |
| response = client.chat.completions.create( | |
| model="gpt-4o-mini", | |
| messages=[ | |
| {"role": "system", "content": "You are a business strategy expert."}, | |
| {"role": "user", "content": prompt} | |
| ], | |
| temperature=0.7 | |
| ) | |
| content = response.choices[0].message.content | |
| try: | |
| data = json.loads(content) | |
| except json.JSONDecodeError: | |
| raise ValueError(f"Invalid JSON format returned from AI: {content}") | |
| swot = data.get("swot", {}) | |
| swot_scores = {} | |
| for key in ["strengths", "weaknesses", "opportunities", "threats"]: | |
| items = swot.get(key, []) | |
| swot_scores[key] = len(items) | |
| data["swot_scores"] = swot_scores | |
| return data | |
| # Removed generate_brand_name function completely | |
| # generate_pdf (Removed brand_names section) | |
| def generate_pdf(data, user_name=None, logo_path=None): | |
| buffer = io.BytesIO() | |
| doc = SimpleDocTemplate(buffer, pagesize=letter, | |
| rightMargin=72, leftMargin=72, | |
| topMargin=72, bottomMargin=18) | |
| styles = getSampleStyleSheet() | |
| story = [] | |
| title_style = ParagraphStyle( | |
| name='TitleStyle', | |
| fontSize=18, | |
| leading=22, | |
| alignment=TA_CENTER, | |
| spaceAfter=14 | |
| ) | |
| if logo_path and os.path.exists(logo_path): | |
| img = Image(logo_path, width=2*inch, height=2*inch) | |
| img.hAlign = 'CENTER' | |
| story.append(img) | |
| story.append(Spacer(1, 12)) | |
| story.append(Paragraph("Startup Idea Analysis Report", title_style)) | |
| story.append(Spacer(1, 12)) | |
| current_date = datetime.now().strftime("%B %d, %Y %H:%M") | |
| user_line = f"Prepared for: {user_name}" if user_name else "Prepared for: Anonymous User" | |
| story.append(Paragraph(user_line, styles['Normal'])) | |
| story.append(Paragraph(f"Date: {current_date}", styles['Normal'])) | |
| story.append(Spacer(1, 12)) | |
| # Removed Brand Names Section | |
| # Loop through other sections | |
| for category, content in data.items(): | |
| if category == "swot_scores": | |
| continue | |
| story.append(Paragraph(f"<b>{category.upper()}</b>", styles['Heading2'])) | |
| story.append(Spacer(1, 0.1 * inch)) | |
| if isinstance(content, list): | |
| for item in content: | |
| if isinstance(item, dict): | |
| text = f"• <b>{item['name']}</b>: {item['description']} (<a href='{item['link']}' color='blue'>{item['link']}</a>)" | |
| else: | |
| text = f"• {item}" | |
| story.append(Paragraph(text, styles['Normal'])) | |
| elif isinstance(content, dict): | |
| for subcategory, bullets in content.items(): | |
| story.append(Paragraph(f"<b>{subcategory.capitalize()}</b>", styles['Heading3'])) | |
| for bullet in bullets: | |
| story.append(Paragraph(f"• {bullet}", styles['Normal'])) | |
| story.append(Spacer(1, 0.2 * inch)) | |
| doc.build(story) | |
| buffer.seek(0) | |
| return buffer.getvalue() | |