import os import gradio as gr from groq import Groq from reportlab.lib.pagesizes import A4 from reportlab.pdfgen import canvas import textwrap # ========================= # Load API Key # ========================= api_key = os.getenv("GROQ_API_KEY") if not api_key: raise ValueError("❌ GROQ_API_KEY not found. Add it in HF Secrets.") client = Groq(api_key=api_key) # ========================= # Generate Roadmap # ========================= def generate_roadmap(domain, level, time): if not domain or not time: msg = "❌ Please fill all fields." return msg, msg prompt = f""" Create a detailed learning roadmap. Domain: {domain} Skill Level: {level} Time Available: {time} Include: - Weekly plan - Resources - Projects - Tips """ try: response = client.chat.completions.create( model="llama-3.1-8b-instant", messages=[ {"role": "system", "content": "You are an expert mentor."}, {"role": "user", "content": prompt} ], max_tokens=3000, temperature=0.7 ) result = response.choices[0].message.content return result, result except Exception as e: err = f"❌ Error: {e}" return err, err # ========================= # Generate PDF (FULLY FIXED) # ========================= def create_pdf(text): if not text: return None file_path = "ai_roadmap.pdf" c = canvas.Canvas(file_path, pagesize=A4) width, height = A4 margin_x = 40 margin_y = 40 max_chars = 90 def new_text_object(): t = c.beginText(margin_x, height - margin_y) t.setFont("Helvetica", 11) return t text_obj = new_text_object() paragraphs = text.split("\n\n") for para in paragraphs: for raw_line in para.split("\n"): wrapped = textwrap.wrap(raw_line, max_chars) if not wrapped: wrapped = [""] for line in wrapped: # Page break check if text_obj.getY() < margin_y: # Draw current page FIRST c.drawText(text_obj) c.showPage() # Start new page text_obj = new_text_object() text_obj.textLine(line) # Space after paragraph text_obj.textLine("") # Draw last page c.drawText(text_obj) # Footer c.setFont("Helvetica-Bold", 10) c.drawCentredString(width / 2, 25, "Made by Kubra 🌻") c.save() return file_path # ========================= # Custom CSS # ========================= custom_css = """ html, body { margin: 0; padding: 0; font-family: Arial, sans-serif; } /* Light Mode */ @media (prefers-color-scheme: light) { html, body, .gradio-container, .app, .wrap, .container { background: linear-gradient(to right, #dff5e3, #b7e4c7) !important; color: #1a1a1a !important; } input, textarea, select { background: #f6fff8 !important; color: #1a1a1a !important; border: 1px solid #9dd9b1 !important; border-radius: 6px; } button { background: #6fcf97 !important; color: #103822 !important; border-radius: 8px !important; font-weight: 600; } button:hover { background: #5bbd84 !important; } } /* Dark Mode */ @media (prefers-color-scheme: dark) { html, body, .gradio-container, .app, .wrap, .container { background: linear-gradient(to right, #667eea, #764ba2) !important; color: #ffffff !important; } input, textarea, select { background: #1e1e2f !important; color: #ffffff !important; border: 1px solid #444 !important; } button { background: #7c83fd !important; color: white !important; border-radius: 8px !important; font-weight: 600; } button:hover { background: #6a70e0 !important; } } """ # ========================= # UI # ========================= with gr.Blocks(css=custom_css) as app: gr.Markdown( """ # 📘 AI Learning Roadmap Generator 🚀 Generate a personalized learning roadmap in seconds. """ ) with gr.Row(): domain = gr.Textbox(label="📚 Domain / Field") level = gr.Dropdown( ["Beginner", "Intermediate", "Advanced"], label="🎯 Skill Level" ) time = gr.Textbox(label="⏳ Time to Learn (e.g. 3 Months)") generate_btn = gr.Button("✨ Generate Roadmap") output = gr.Markdown() hidden_text = gr.Textbox(visible=False) pdf_btn = gr.Button("📥 Download as PDF") pdf_file = gr.File(label="Download PDF") generate_btn.click( generate_roadmap, inputs=[domain, level, time], outputs=[output, hidden_text] ) pdf_btn.click( create_pdf, inputs=hidden_text, outputs=pdf_file ) gr.Markdown( """ --- **Made by Kubra** 🌻 """ ) # ========================= # Launch # ========================= app.launch(server_name="0.0.0.0", server_port=7860)