sunbal7 commited on
Commit
2b8aece
Β·
verified Β·
1 Parent(s): 431d541

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +75 -101
app.py CHANGED
@@ -1,116 +1,90 @@
1
- # app.py
2
-
3
  import streamlit as st
4
- import requests
5
- from fpdf import FPDF
6
  import pytesseract
7
  from PIL import Image
8
  import fitz # PyMuPDF
9
  import io
10
- import re
11
 
12
- # ====== CONFIG ======
13
- API_KEY = "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"
 
14
  MODEL = "mistralai/mistral-7b-instruct"
15
 
16
- # ====== FUNCTIONS ======
17
- def query_llm(prompt):
18
- url = "https://openrouter.ai/api/v1/chat/completions"
19
- headers = {
20
- "Authorization": f"Bearer {API_KEY}",
21
- "Content-Type": "application/json"
22
- }
23
- data = {
24
- "model": MODEL,
25
- "messages": [
26
- {"role": "user", "content": prompt}
27
- ]
28
- }
29
- response = requests.post(url, headers=headers, json=data)
30
- if response.status_code == 200:
31
- return response.json()['choices'][0]['message']['content']
32
- else:
33
- return f"❌ API Error: {response.text}"
34
-
35
- def extract_text_from_image(image):
36
- return pytesseract.image_to_string(Image.open(image))
37
-
38
- def extract_text_from_pdf(pdf_file):
39
- text = ""
40
- doc = fitz.open(stream=pdf_file.read(), filetype="pdf")
41
- for page in doc:
42
- text += page.get_text()
43
- return text
44
-
45
- def evaluate_lab_report(text):
46
- missing_sections = []
47
- suggestions = []
48
- score = 0
49
- total = 5
50
-
51
- if re.search(r"objective", text, re.I): score += 1
52
- else:
53
- missing_sections.append("Objective")
54
- suggestions.append("Add a clear objective stating what the experiment is trying to discover.")
55
-
56
- if re.search(r"hypothesis", text, re.I): score += 1
57
- else:
58
- missing_sections.append("Hypothesis")
59
- suggestions.append("Include a hypothesis that predicts the experiment outcome.")
60
-
61
- if re.search(r"procedure|method", text, re.I): score += 1
62
- else:
63
- missing_sections.append("Procedure")
64
- suggestions.append("Describe the steps followed during the experiment.")
65
-
66
- if re.search(r"observation", text, re.I): score += 1
67
- else:
68
- missing_sections.append("Observation")
69
- suggestions.append("Mention what was observed during the experiment.")
70
-
71
- if re.search(r"conclusion", text, re.I): score += 1
72
- else:
73
- missing_sections.append("Conclusion")
74
- suggestions.append("Summarize the findings in a conclusion.")
75
-
76
- return score, total, missing_sections, suggestions
77
-
78
- # ====== STREAMLIT UI ======
79
  st.set_page_config(page_title="πŸ§ͺ AI Science Lab Assistant", layout="centered")
80
  st.title("πŸ§ͺ AI Science Lab Assistant")
81
- st.markdown("Upload your **lab report** (image or PDF), and the AI will analyze, evaluate, and answer questions about it!")
82
-
83
- uploaded_file = st.file_uploader("πŸ“€ Upload Lab Report (Image or PDF)", type=["png", "jpg", "jpeg", "pdf"])
84
 
85
- if uploaded_file:
86
- with st.spinner("πŸ” Extracting content..."):
87
- if uploaded_file.type == "application/pdf":
88
- text_content = extract_text_from_pdf(uploaded_file)
89
- else:
90
- text_content = extract_text_from_image(uploaded_file)
 
91
 
92
- st.subheader("πŸ“„ Extracted Text")
93
- st.text_area("Here is what we found:", value=text_content, height=250)
94
 
95
- st.subheader("πŸ“Š Report Evaluation")
96
- score, total, missing, tips = evaluate_lab_report(text_content)
97
- st.markdown(f"βœ… **Score**: {score}/{total}")
98
- if missing:
99
- st.markdown("❗ **Missing Sections**:")
100
- for m in missing:
101
- st.write(f"- {m}")
102
- if tips:
103
- st.markdown("πŸ’‘ **Improvement Tips**:")
104
- for t in tips:
105
- st.write(f"- {t}")
106
 
107
- st.subheader("πŸ’¬ Ask a Question About This Report")
108
- user_q = st.text_input("Your question:")
109
- if user_q:
110
- full_prompt = f"Here is a science lab report:
111
- {text_content}\n\nNow answer this question about it:\n{user_q}"
112
- response = query_llm(full_prompt)
113
- st.markdown(f"**Answer**: {response}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
 
115
- else:
116
- st.info("Please upload a lab report image or PDF to get started.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import streamlit as st
 
 
2
  import pytesseract
3
  from PIL import Image
4
  import fitz # PyMuPDF
5
  import io
6
+ import requests
7
 
8
+ # --- Config ---
9
+ API_KEY = "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"
10
+ API_URL = "https://openrouter.ai/api/v1/chat/completions"
11
  MODEL = "mistralai/mistral-7b-instruct"
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  st.set_page_config(page_title="πŸ§ͺ AI Science Lab Assistant", layout="centered")
14
  st.title("πŸ§ͺ AI Science Lab Assistant")
 
 
 
15
 
16
+ st.markdown("""
17
+ This tool helps students evaluate their lab reports by:
18
+ - Extracting text from uploaded **PDFs** or **images**
19
+ - Automatically **checking for completeness** (Objective, Hypothesis, etc.)
20
+ - Giving **improvement tips** πŸ’‘
21
+ - Letting you **ask questions** about your report πŸ“˜
22
+ """)
23
 
24
+ # --- Upload ---
25
+ uploaded_file = st.file_uploader("πŸ“Έ Upload Your Lab Report Image or PDF", type=["jpg", "jpeg", "png", "pdf"])
26
 
27
+ lab_text = ""
28
+ if uploaded_file:
29
+ file_bytes = uploaded_file.read()
30
+ file_ext = uploaded_file.name.split(".")[-1].lower()
 
 
 
 
 
 
 
31
 
32
+ if file_ext == "pdf":
33
+ doc = fitz.open(stream=file_bytes, filetype="pdf")
34
+ for page in doc:
35
+ lab_text += page.get_text()
36
+ else:
37
+ image = Image.open(io.BytesIO(file_bytes))
38
+ lab_text = pytesseract.image_to_string(image)
39
+
40
+ st.subheader("πŸ“„ Extracted Lab Report Text:")
41
+ st.text_area("", lab_text, height=300)
42
+
43
+ # -- AI Evaluation Prompt --
44
+ full_prompt = f"""Here is a science lab report:
45
+ {lab_text}
46
+
47
+ Please evaluate the report based on the following:
48
+ - Does it include sections like Objective, Hypothesis, Procedure, Observation, and Conclusion?
49
+ - Point out any missing or incomplete sections.
50
+ - Give feedback or improvement suggestions like: "Try writing a more detailed observation."
51
+ - Grade it roughly on a scale from 1 to 10 for completeness.
52
+
53
+ Respond clearly:
54
+ """
55
+
56
+ def query_ai(prompt):
57
+ headers = {
58
+ "Authorization": f"Bearer {API_KEY}",
59
+ "Content-Type": "application/json"
60
+ }
61
+ payload = {
62
+ "model": MODEL,
63
+ "messages": [
64
+ {"role": "system", "content": "You are a helpful science teacher."},
65
+ {"role": "user", "content": prompt}
66
+ ]
67
+ }
68
+ response = requests.post(API_URL, headers=headers, json=payload)
69
+ return response.json()['choices'][0]['message']['content']
70
 
71
+ if st.button("🧠 Evaluate My Lab Report"):
72
+ with st.spinner("Analyzing report with AI..."):
73
+ result = query_ai(full_prompt)
74
+ st.success("βœ… Evaluation Complete")
75
+ st.markdown("### πŸ“Š AI Feedback:")
76
+ st.markdown(result)
77
+
78
+ # Ask follow-up questions
79
+ st.subheader("πŸ€” Ask AI About Your Report")
80
+ user_question = st.text_input("Type your question")
81
+ if st.button("πŸ” Ask") and user_question:
82
+ with st.spinner("Thinking..."):
83
+ followup_prompt = f"Here is the lab report:
84
+ {lab_text}
85
+
86
+ Now answer this question about it:
87
+ {user_question}"
88
+ followup_response = query_ai(followup_prompt)
89
+ st.markdown("### πŸ’¬ AI Answer:")
90
+ st.markdown(followup_response)