import streamlit as st import pandas as pd import requests from io import BytesIO import os # --- CONFIGURATION --- EXCEL_CSV_URL = "https://docs.google.com/spreadsheets/d/1b_gBz-_TZZNJLIM5sYyYJQfBVNua7dFf/export?format=csv" GROQ_API_KEY = os.getenv("GROQ_API_KEY") # Ensure this is set in your environment GROQ_URL = "https://api.groq.com/openai/v1/chat/completions" LLAMA3_MODEL = "llama3-8b-8192" # --- FUNCTIONS --- def load_excel_data(): try: response = requests.get(EXCEL_CSV_URL) response.raise_for_status() df = pd.read_csv(BytesIO(response.content)) return df except Exception as e: st.error(f"Error loading sheet: {e}") return pd.DataFrame() def search_student(data, roll_number, student_name): df = data.copy() # Normalize column names df.columns = [col.strip().lower().replace(" ", "_") for col in df.columns] # Normalize input roll_number = roll_number.strip().lower() student_name = student_name.strip().lower() # Search for matching row result = df[ (df['roll_number'].astype(str).str.lower() == roll_number) & (df['student_name'].astype(str).str.lower() == student_name) ] return result def generate_summary_from_data(student_row): content = student_row.to_dict(orient="records")[0] prompt = ( f"Generate a detailed student result summary in the following format:\n\n" f"Student Name: {content.get('student_name', '')}\n" f"Roll Number: {content.get('roll_number', '')}\n" f"Class: {content.get('class', '')}\n" f"Subjects and Marks:\n" ) # Add subjects and marks for key, value in content.items(): if key not in ['student_name', 'roll_number', 'class']: prompt += f"{key.replace('_', ' ').title()}: {value}\n" prompt += "\nInclude total marks, percentage, and a performance remark." headers = { "Authorization": f"Bearer {GROQ_API_KEY}", "Content-Type": "application/json" } data = { "model": LLAMA3_MODEL, "messages": [ {"role": "system", "content": "You are a student result generator for a school."}, {"role": "user", "content": prompt} ] } response = requests.post(GROQ_URL, headers=headers, json=data) response.raise_for_status() return response.json()["choices"][0]["message"]["content"] # --- UI --- def main(): st.set_page_config("🎓 Student Result Lookup", layout="centered") st.title("🎓 Student Result Generator with AI") st.markdown("Enter your **Roll Number** and **Student Name** to generate your result.") roll_number = st.text_input("Roll Number", placeholder="e.g., k0000") student_name = st.text_input("Student Name", placeholder="e.g., Ahmed Raza") if st.button("Generate Result"): with st.spinner("📥 Loading data and generating result..."): data = load_excel_data() if data.empty: return try: result = search_student(data, roll_number, student_name) if not result.empty: st.success("✅ Student found. Generating summary...") summary = generate_summary_from_data(result) st.markdown("### 📝 Result Summary:") st.markdown(summary) else: st.warning("❌ No student found with that roll number and name.") except Exception as e: st.error(f"❌ Error: {e}") if __name__ == "__main__": main()