File size: 3,199 Bytes
e11ad92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import os, requests
from pypdf import PdfReader
import streamlit as st

# --- Setup ---
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
if not OPENAI_API_KEY:
    st.warning("⚠️ Set your OpenAI key using the next cell before generating.")
OPENAI_URL = "https://api.openai.com/v1/chat/completions"
MODEL = "gpt-4o-mini"
MAX_PAGES, MAX_CHARS = 15, 10000

# --- UI ---
st.set_page_config(page_title="StudySnap", page_icon="πŸ“š", layout="centered")
st.title("πŸ“š StudySnap β€” Summaries + MCQs")
tab1, tab2 = st.tabs(["Paste Text", "Upload PDF"])
length = st.radio("Output length:", ["short","medium","long"], index=1, horizontal=True)

with tab1:
    text_input = st.text_area("Paste your notes/article here:", height=220)

with tab2:
    pdf_file = st.file_uploader("Upload PDF (first 15 pages only)", type=["pdf"])

# --- Helpers ---
def extract_pdf_text(file):
    r = PdfReader(file)
    pages = min(len(r.pages), MAX_PAGES)
    text = "\n".join(r.pages[i].extract_text() or "" for i in range(pages))
    lines = [ln.strip() for ln in text.splitlines() if ln.strip()]
    return "\n".join(lines)[:MAX_CHARS]

def call_openai(system, user):
    if not OPENAI_API_KEY:
        raise RuntimeError("API key missing.")
    headers = {"Authorization": f"Bearer {OPENAI_API_KEY}", "Content-Type": "application/json"}
    body = {"model": MODEL, "messages":[{"role":"system","content":system},{"role":"user","content":user}], "temperature":0.2}
    r = requests.post(OPENAI_URL, headers=headers, json=body, timeout=60)
    r.raise_for_status()
    return r.json()["choices"][0]["message"]["content"]

# --- AI Wrappers ---
def summarize(txt, length):
    sys = ("You are a precise study assistant. Summarize in bullet points for MBA-level students. "
           "short=5 bullets, medium=8–10, long=12–15.")
    usr = f"Length: {length}\n\nCONTENT:\n{txt[:MAX_CHARS]}"
    return call_openai(sys, usr)

def make_mcqs(txt):
    sys = ("Create 10 single-answer MCQs with 4 options (A–D), plus 'Answer: X' and a short explanation. "
           "Keep options plausible, style professional.")
    usr = txt[:8000]
    return call_openai(sys, usr)

# --- Main ---
if st.button("Generate", type="primary"):
    if pdf_file:
        content = extract_pdf_text(pdf_file)
        title = pdf_file.name
    elif text_input.strip():
        content = text_input.strip()
        title = "Pasted Text"
    else:
        st.warning("Paste text or upload a PDF first.")
        st.stop()

    if len(content) < 200:
        st.warning("Input too short.")
        st.stop()

    with st.spinner("Summarizing..."):
        try:
            summary = summarize(content, length)
            st.success("βœ… Summary Ready!")
            st.markdown(summary)
        except Exception as e:
            st.error(f"Summarization failed: {e}")
            st.stop()

    st.divider()
    st.subheader("🧠 Practice β€” 10 MCQs")
    with st.spinner("Generating questions..."):
        try:
            mcqs = make_mcqs(content)
            st.markdown(mcqs)
        except Exception as e:
            st.error(f"MCQ generation failed: {e}")

st.caption("MVP limits: 15 pages / 10k characters. We never store your files.")