Spaces:
Running
Running
# Install required libraries | |
# !pip install gradio>=3.50.2 transformers>=4.30.0 networkx>=3.0 plotly>=5.0.0 torch>=2.0.0 numpy>=1.21.0 | |
import gradio as gr | |
import torch | |
import networkx as nx | |
import plotly.graph_objects as go | |
from transformers import pipeline | |
import numpy as np | |
import traceback | |
# Check device | |
device = "cuda" if torch.cuda.is_available() else "cpu" | |
print(f"Using device: {device}") | |
# Load models with fallback | |
try: | |
summarizer = pipeline("summarization", model="facebook/bart-large-cnn", device=0 if device == "cuda" else -1) | |
text_generator = pipeline("text-generation", model="gpt2", device=0 if device == "cuda" else -1) | |
print("✓ Models loaded successfully") | |
except Exception as e: | |
print(f"Model loading error: {e}") | |
try: | |
summarizer = pipeline("summarization", model="sshleifer/distilbart-cnn-6-6", device=0 if device == "cuda" else -1) | |
text_generator = pipeline("text-generation", model="distilgpt2", device=0 if device == "cuda" else -1) | |
print("✓ Fallback models loaded successfully") | |
except: | |
print("Critical error loading models. Exiting.") | |
# Progress tracking | |
progress_status = {"value": 0, "desc": ""} | |
def update_progress(value, desc=""): | |
progress_status["value"] = value | |
progress_status["desc"] = desc | |
print(f"Progress: {value}% - {desc}") | |
# Simplified summary generation | |
def generate_summary(topic): | |
try: | |
update_progress(10, "Starting your idea analysis") | |
if "AI" in topic or "artificial intelligence" in topic.lower(): | |
ai_component = "The AI part makes it super smart by figuring out patterns and doing tasks automatically!" | |
else: | |
ai_component = "Adding some AI could make it even cooler by helping with data or tasks." | |
if "urban farming" in topic.lower() or "agriculture" in topic.lower(): | |
summary = f""" | |
Your idea, {topic}, is a fresh way to grow food right in cities! | |
What it’s about: This startup uses cool tech to grow fresh food indoors or on rooftops. Think sensors and smart systems to keep plants happy. | |
Who it’s for: People like restaurants wanting fresh veggies, city folks who love healthy food, or stores looking to cut delivery costs. | |
How it works: You’d need things like sensors, grow lights, and a smart app to run it all. {ai_component} | |
How it makes money: Sell to businesses, charge people monthly for fresh food, or share your tech with others. | |
Why it stands out: Fresher food, less travel, and it works all year—no matter the weather! | |
Things to watch out for: It might cost a lot to start, and some cities have rules about this. | |
""" | |
else: | |
outputs = text_generator( | |
f"A startup idea about {topic} could be:", | |
max_length=300, | |
num_return_sequences=1, | |
temperature=0.7 | |
) | |
generated_text = outputs[0]['generated_text'] | |
summary = f""" | |
Your idea, {topic}, is a cool way to make something better! | |
What it’s about: This startup helps with [problem/need] by using [simple solution]. It’s special because [unique bit]. | |
Who it’s for: People like [customer type] would love this—think [example customers]. | |
How it works: You’d need [basic tools/tech] to build it. {ai_component} | |
How it makes money: You could [simple revenue idea, e.g., sell it or charge a fee]. | |
Why it stands out: It’s better because [easy advantage, e.g., it’s simpler or cheaper]. | |
Things to watch out for: Starting might be tough because of [simple challenge, e.g., money or time]. | |
{generated_text} | |
""" | |
update_progress(60, "Idea analysis ready") | |
return summary | |
except Exception as e: | |
print(f"Error generating summary: {str(e)}\n{traceback.format_exc()}") | |
return f"Oops! Something went wrong: {str(e)}. Try again with a new idea!" | |
# Responsive interactive mind map with Plotly | |
def generate_mindmap(topic, summary): | |
try: | |
update_progress(70, "Building your idea map") | |
concepts = [ | |
"What It Does", "Who It’s For", "How It Makes Money", | |
"What Makes It Special", "What’s Needed", "Next Steps" | |
] | |
subconcepts = { | |
"What It Does": ["Main Idea", "Key Features"], | |
"Who It’s For": ["Customers", "Why They’d Like It"], | |
"How It Makes Money": ["Ways to Earn", "Pricing"], | |
"What Makes It Special": ["Standout Points", "Edge Over Others"], | |
"What’s Needed": ["Tools or Tech", "Skills"], | |
"Next Steps": ["First Moves", "Goals"] | |
} | |
nodes = [topic] + concepts + [sub for concept in concepts for sub in subconcepts[concept]] | |
edges = [(topic, concept) for concept in concepts] + \ | |
[(concept, sub) for concept in concepts for sub in subconcepts[concept]] | |
pos = {topic: (0, 0)} | |
for i, concept in enumerate(concepts): | |
pos[concept] = (np.cos(i * 2 * np.pi / len(concepts)), np.sin(i * 2 * np.pi / len(concepts))) | |
for j, sub in enumerate(subconcepts[concept]): | |
pos[sub] = (pos[concept][0] + 0.3 * np.cos(j), pos[concept][1] + 0.3 * np.sin(j)) | |
edge_x, edge_y = [], [] | |
for edge in edges: | |
x0, y0 = pos[edge[0]] | |
x1, y1 = pos[edge[1]] | |
edge_x.extend([x0, x1, None]) | |
edge_y.extend([y0, y1, None]) | |
node_x, node_y = [pos[node][0] for node in nodes], [pos[node][1] for node in nodes] | |
fig = go.Figure() | |
fig.add_trace(go.Scatter(x=edge_x, y=edge_y, mode='lines', line=dict(color='gray', width=1), hoverinfo='none')) | |
fig.add_trace(go.Scatter( | |
x=node_x, y=node_y, mode='markers+text', text=nodes, textposition="middle center", | |
marker=dict(size=[30 if n == topic else 20 if n in concepts else 15 for n in nodes], | |
color=['#FF9999' if n == topic else '#99CCFF' if n in concepts else '#CCFF99' for n in nodes]), | |
hoverinfo='text' | |
)) | |
# Responsive layout for mind map | |
fig.update_layout( | |
showlegend=False, | |
title=f"Your Idea Map: {topic}", | |
title_x=0.5, | |
paper_bgcolor='white', | |
plot_bgcolor='white', | |
autosize=True, # Makes it scale with container | |
margin=dict(l=20, r=20, t=40, b=20) # Reduced margins for mobile | |
) | |
update_progress(100, "Idea map ready") | |
return fig | |
except Exception as e: | |
print(f"Error generating mind map: {str(e)}") | |
return None | |
# Main processing | |
def process_input(topic): | |
try: | |
if not topic or len(topic.strip()) < 3: | |
return "Please enter a real idea (3+ characters)!", None, gr.update(visible=False) | |
print(f"Processing: {topic}") | |
update_progress(0, "Starting your idea journey") | |
summary = f"Congrats! You’ve started shaping {topic}. Here’s your plan:\n\n{generate_summary(topic)}" | |
mindmap = generate_mindmap(topic, summary) | |
return summary, mindmap, gr.update(visible=True) | |
except Exception as e: | |
print(f"Error in processing: {str(e)}\n{traceback.format_exc()}") | |
return f"Oops! Something broke: {str(e)}", None, gr.update(visible=True) | |
# Follow-up question processing | |
def process_followup_question(question, current_summary): | |
try: | |
if not question or len(question.strip()) < 5: | |
return "Ask something longer (5+ characters)!", None | |
print(f"Follow-up: {question}") | |
prompt = f"Question: {question}\n\nContext: {current_summary}\n\nAnswer:" | |
response = text_generator(prompt, max_length=300, num_return_sequences=1, temperature=0.7) | |
answer = response[0]['generated_text'].split("Answer:")[-1].strip() | |
return f"Here’s your answer:\n\n{answer}", None | |
except Exception as e: | |
print(f"Error in follow-up: {str(e)}\n{traceback.format_exc()}") | |
return f"Sorry, something went wrong: {str(e)}", None | |
# Save and load ideas | |
def save_idea(name, summary, mindmap, saved): | |
if not name: | |
return gr.update(), "Please give your idea a name!" | |
saved[name] = {"summary": summary, "mindmap": mindmap} | |
return gr.update(choices=list(saved.keys())), f"Great job! '{name}' is saved—keep refining it!" | |
def load_idea(name, saved): | |
if name in saved: | |
return saved[name]["summary"], saved[name]["mindmap"], gr.update(visible=True) | |
return "No idea found with that name.", None, gr.update(visible=False) | |
# Custom CSS for responsiveness | |
custom_css = """ | |
.container { | |
max-width: 100%; | |
padding: 10px; | |
} | |
.header { | |
font-size: clamp(1.5rem, 4vw, 2.5rem); | |
text-align: center; | |
} | |
.textbox { | |
width: 100% !important; | |
min-height: 100px; | |
} | |
.button { | |
width: 100%; | |
margin: 5px 0; | |
} | |
.plot { | |
width: 100% !important; | |
height: auto !important; | |
} | |
@media (max-width: 768px) { | |
.gr-row { | |
flex-direction: column !important; | |
} | |
.gr-column { | |
width: 100% !important; | |
} | |
} | |
""" | |
# Gradio interface | |
with gr.Blocks(theme=gr.themes.Glass(primary_hue="blue", secondary_hue="green"), css=custom_css) as demo: | |
current_summary = gr.State("") | |
saved_ideas = gr.State({}) | |
gr.Markdown("# 🧠 VisualMind - Grow Your Startup Idea", elem_classes=["header"]) | |
gr.Markdown("Dream up a startup idea and watch it come to life—works great on any screen!", elem_classes=["container"]) | |
with gr.Tabs(): | |
with gr.Tab("Create Your Idea"): | |
with gr.Row(equal_height=False): | |
with gr.Column(scale=1, min_width=300): | |
topic_input = gr.Textbox( | |
label="Your Startup Idea", | |
placeholder="e.g., Smart Urban Gardens", | |
elem_classes=["textbox"] | |
) | |
submit_btn = gr.Button("Build My Idea", variant="primary", elem_classes=["button"]) | |
progress = gr.Textbox(label="What’s Happening", value="Ready to start!", interactive=False, elem_classes=["textbox"]) | |
with gr.Row(visible=False, equal_height=False) as results_container: | |
with gr.Column(scale=1, min_width=300): | |
summary_output = gr.Textbox(label="Your Idea Plan", lines=10, elem_classes=["textbox"]) | |
with gr.Accordion("Explore More", open=False): | |
followup_input = gr.Textbox( | |
label="Got a question?", | |
placeholder="e.g., How do I start small?", | |
elem_classes=["textbox"] | |
) | |
followup_btn = gr.Button("Ask Away", elem_classes=["button"]) | |
followup_output = gr.Textbox(label="Here’s What We Think", lines=5, elem_classes=["textbox"]) | |
gr.Markdown(""" | |
### Need Ideas to Ask? | |
- How can I make this stand out? | |
- Who might love this? | |
- What’s my first step? | |
""") | |
with gr.Column(scale=1, min_width=300): | |
mindmap_output = gr.Plot(label="Your Interactive Idea Map", elem_classes=["plot"]) | |
with gr.Row(equal_height=False): | |
with gr.Column(scale=1, min_width=150): | |
idea_name = gr.Textbox(label="Name Your Idea", placeholder="e.g., GreenCity", elem_classes=["textbox"]) | |
save_btn = gr.Button("Save Idea", elem_classes=["button"]) | |
with gr.Column(scale=1, min_width=150): | |
load_dropdown = gr.Dropdown(label="Pick a Saved Idea", choices=[], elem_classes=["textbox"]) | |
load_btn = gr.Button("Load Idea", elem_classes=["button"]) | |
with gr.Tab("Tips & Inspiration"): | |
gr.Markdown(""" | |
### Spark Your Next Big Thing! | |
- **Example:** *Eco-Friendly Packaging* - Uses plant-based materials and smart tech to cut waste. | |
- **Try This:** Think of something you wish worked better—how could an app or gadget fix it? | |
- **Tip:** Start small—test your idea with friends first! | |
""", elem_classes=["container"]) | |
# Event handlers | |
submit_btn.click( | |
fn=lambda: "Bringing your idea to life...", | |
inputs=None, | |
outputs=progress | |
).then( | |
process_input, | |
inputs=[topic_input], | |
outputs=[summary_output, mindmap_output, results_container] | |
).then( | |
fn=lambda s: s, | |
inputs=[summary_output], | |
outputs=[current_summary] | |
).then( | |
fn=lambda: "Ready for more questions—keep exploring!", | |
inputs=None, | |
outputs=progress | |
) | |
followup_btn.click( | |
fn=lambda: "Thinking about your question...", | |
inputs=None, | |
outputs=progress | |
).then( | |
process_followup_question, | |
inputs=[followup_input, current_summary], | |
outputs=[followup_output, mindmap_output] | |
).then( | |
fn=lambda: "All set—ask another if you’d like!", | |
inputs=None, | |
outputs=progress | |
) | |
save_btn.click( | |
save_idea, | |
inputs=[idea_name, summary_output, mindmap_output, saved_ideas], | |
outputs=[load_dropdown, progress] | |
) | |
load_btn.click( | |
load_idea, | |
inputs=[load_dropdown, saved_ideas], | |
outputs=[summary_output, mindmap_output, results_container] | |
) | |
# Launch with error handling | |
try: | |
demo.launch(debug=True, share=True, height=800) # Set a default height for better mobile scrolling | |
except Exception as e: | |
print(f"Launch error: {e}") | |
try: | |
demo.launch(debug=True, server_name="0.0.0.0", height=800) | |
except Exception as e2: | |
print(f"Second launch failed: {e2}") | |
print("Try restarting your runtime or checking library installations.") |