import os import gradio as gr from groq import Groq import spaces from dotenv import load_dotenv # Load local .env file (useful for local testing) load_dotenv() # Safely retrieve the key from environment variables (Hugging Face Secrets) api_key = os.getenv("Roadmap_Key") if not api_key: print("⚠️ Warning: 'Roadmap_Key' environment variable not found. Please set it in Hugging Face Space Secrets.") else: print("API Key Loaded Successfully!") # Initialize the Groq client client = Groq(api_key=api_key) @spaces.GPU def generate_roadmap(domain, level, duration): # Ensure the client is initialized with an API key before trying to make a call if not api_key: return "❌ Error: API Key missing. Please set 'Roadmap_Key' as a Secret in your Hugging Face Space settings." if not domain.strip(): return "❌ Please enter a learning domain." if not duration.strip(): return "❌ Please enter the learning duration." prompt = f""" You are an expert learning mentor. Create a detailed roadmap. Domain: {domain} Level: {level} Duration: {duration} Generate: # Overview # Weekly Learning Plan # Resources # Practice Websites # Projects # Career Advice """ try: response = client.chat.completions.create( model="llama-3.3-70b-versatile", messages=[ { "role": "user", "content": prompt } ] ) return response.choices[0].message.content except Exception as e: return f"❌ An error occurred during roadmap generation: {str(e)}" # Custom CSS styling for the interface custom_css = """ @import url('https://fonts.googleapis.com/css2?family=Inter:wght=300;400;600;700&display=swap'); /* ---------- Overall Page ---------- */ body{ font-family:'Inter',sans-serif; background:#0f172a; } /* Wider app for desktop */ .gradio-container{ max-width:1500px !important; width:96% !important; margin:auto !important; background:linear-gradient(135deg,#0f172a,#111827,#1e293b); } /* ---------- Title ---------- */ .main-title{ text-align:center; font-size:44px; font-weight:700; background:linear-gradient(90deg,#00DBDE,#FC00FF); -webkit-background-clip:text; -webkit-text-fill-color:transparent; margin-bottom:8px; } .subtitle{ text-align:center; color:#cbd5e1; font-size:18px; margin-bottom:30px; } /* ---------- Glass Cards ---------- */ .glass{ background:rgba(255,255,255,0.08); backdrop-filter:blur(16px); border:1px solid rgba(255,255,255,0.12); border-radius:18px; padding:22px; box-shadow:0 8px 30px rgba(0,0,0,.25); } /* ---------- Output ---------- */ .output-box{ min-height:650px; overflow:auto; } /* ---------- Buttons ---------- */ button{ border-radius:12px !important; font-weight:600 !important; transition:.25s ease; } button:hover{ transform:translateY(-2px); } .generate-btn{ background:linear-gradient(90deg,#06b6d4,#3b82f6) !important; color:white !important; } .clear-btn{ background:#ef4444 !important; color:white !important; } /* ---------- Examples ---------- */ .examples-table{ width:100% !important; margin-top:20px; } .examples-table table{ width:100% !important; } .examples-table td{ white-space:normal !important; word-break:break-word; font-size:15px; padding:12px !important; } /* ---------- Inputs ---------- */ textarea, input{ font-size:16px !important; } /* ---------- Markdown Output ---------- */ .prose{ font-size:16px !important; line-height:1.8 !important; } /* ---------- Footer ---------- */ .footer{ text-align:center; color:#94a3b8; margin-top:30px; font-size:14px; } /* Hide Gradio Footer */ footer{ visibility:hidden; } /* ---------- Desktop ---------- */ @media (min-width:1200px){ .glass{ padding:26px; } .output-box{ min-height:700px; } } /* ---------- Mobile ---------- */ @media (max-width:768px){ .main-title{ font-size:34px; } .subtitle{ font-size:16px; } } """ with gr.Blocks( css=custom_css, title="AI Learning Roadmap Generator", theme=gr.themes.Soft() ) as demo: gr.HTML("""