File size: 3,078 Bytes
4694a5f 0167dce b2df0c2 4694a5f b2df0c2 0451804 b2df0c2 0451804 b0def4e b2df0c2 3f762f1 657a419 3f762f1 657a419 b2df0c2 b7273e5 bcc0ac4 b2df0c2 b0def4e b2df0c2 3f762f1 b2df0c2 4694a5f 657a419 b0def4e bcc0ac4 b0def4e bcc0ac4 b0def4e bcc0ac4 b0def4e bcc0ac4 b0def4e b2e2010 6d0d2a5 b0def4e bcc0ac4 b0def4e bcc0ac4 b0def4e bcc0ac4 b0def4e bcc0ac4 | 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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | import os
import gradio as gr
from groq import Groq
from pypdf import PdfReader
MODEL = "llama-3.1-8b-instant"
api_key = os.getenv("GROQ_API_KEY")
if not api_key:
raise RuntimeError("GROQ_API_KEY not found")
client = Groq(api_key=api_key)
DEFAULT_MSG = "How can I help you today?"
def read_pdf(file):
if file is None:
return ""
# HF sends dict: {'name':..., 'path':...}
if isinstance(file, dict):
path = file.get("path")
else:
path = getattr(file, "name", file)
reader = PdfReader(path)
text = ""
for page in reader.pages:
text += page.extract_text() or ""
return text
def ask_ai(prompt):
res = client.chat.completions.create(
model=MODEL,
messages=[{"role": "user", "content": prompt}],
temperature=0.4,
max_tokens=700,
)
return res.choices[0].message.content
def summarizer(text): return ask_ai("Summarize:\n"+text)
def explainer(text): return ask_ai("Explain simply:\n"+text)
def mcq_generator(text): return ask_ai("Generate 10 MCQs:\n"+text)
def flashcard_generator(text): return ask_ai("Create 10 flashcards:\n"+text)
def router(text, mode):
return {
"Summarize": summarizer,
"Explain": explainer,
"MCQs": mcq_generator,
"Flashcards": flashcard_generator,
}[mode](text)
def app(text, pdf, mode):
if pdf is not None:
text = read_pdf(pdf)
if not text.strip():
return DEFAULT_MSG
return router(text, mode)
custom_css = """
/* FORCE OVERRIDE HF THEME */
.gradio-container * { box-sizing: border-box; }
/* Remove radio circles */
input[type="radio"]{display:none !important;}
/* Pills */
label:has(input[type="radio"]) {
padding:6px 12px;
margin:4px;
border-radius:999px;
border:1px solid #334155;
color:#cbd5f5;
cursor:pointer;
}
label:has(input[type="radio"]:checked) {
background:linear-gradient(90deg,#38bdf8,#a78bfa);
color:black !important;
font-weight:700;
border:none;
}
/* Center fake message */
.center-fake textarea{
text-align:center !important;
font-size:22px !important;
padding-top:40% !important;
}
"""
with gr.Blocks(css=custom_css) as interface:
gr.Markdown("## 📘 AI Study Assistant")
output = gr.Textbox(
lines=10,
label="Output",
value=DEFAULT_MSG,
interactive=False,
elem_classes=["center-fake"]
)
text = gr.Textbox(lines=4, label="Enter Notes or Topic")
pdf = gr.File(label="Upload PDF (optional)")
mode = gr.Radio(
["Summarize","Explain","MCQs","Flashcards"],
value="Summarize",
label="Choose Mode"
)
run = gr.Button("⚡ Generate")
def run_app(t,p,m):
res = app(t,p,m)
if res == DEFAULT_MSG:
return gr.update(value=res, interactive=False, elem_classes=["center-fake"])
else:
return gr.update(value=res, interactive=True, elem_classes=[])
run.click(run_app,[text,pdf,mode],output)
text.submit(run_app,[text,pdf,mode],output)
interface.launch() |