Changed ai_generated_remark to submission_remark
Browse files
app.py
CHANGED
|
@@ -911,7 +911,7 @@ async def homework_validate(
|
|
| 911 |
"student_level": student_level,
|
| 912 |
"status": "Unreadable",
|
| 913 |
"match_percentage": 0,
|
| 914 |
-
"
|
| 915 |
"rule_based_remark": "Answer text could not be read clearly. Please upload a clearer file.",
|
| 916 |
"student_extracted_text": student_text,
|
| 917 |
"llm_used": False,
|
|
@@ -928,7 +928,7 @@ async def homework_validate(
|
|
| 928 |
"student_level": student_level,
|
| 929 |
"status": "Unreadable",
|
| 930 |
"match_percentage": 0,
|
| 931 |
-
"
|
| 932 |
"rule_based_remark": "This PDF looks scanned. OCR is required (install pdf2image + poppler) or upload a clearer file.",
|
| 933 |
"student_extracted_text": student_text,
|
| 934 |
"llm_used": False,
|
|
@@ -1063,7 +1063,7 @@ async def homework_validate(
|
|
| 1063 |
"student_level": student_level,
|
| 1064 |
"status": status,
|
| 1065 |
"match_percentage": final_score,
|
| 1066 |
-
"
|
| 1067 |
"rule_based_remark": f"MCQ: {correct_mcq}/{total_mcq} correct. Narrative score: {narrative_score}%. (Level: {student_level}, Credit per Q: {credit_per_q}%)",
|
| 1068 |
"llm_used": bool(narrative_results and 'error' not in narrative_results),
|
| 1069 |
"student_extracted_text": student_text,
|
|
@@ -1154,7 +1154,7 @@ async def homework_validate(
|
|
| 1154 |
"student_level": student_level,
|
| 1155 |
"status": status,
|
| 1156 |
"match_percentage": match_percentage,
|
| 1157 |
-
"
|
| 1158 |
"rule_based_remark": f"Multiple MCQ: {correct_count}/{total_count} correct. Score: {match_percentage}% (Level: {student_level})",
|
| 1159 |
"student_extracted_text": student_text,
|
| 1160 |
"llm_used": False,
|
|
@@ -1172,7 +1172,7 @@ async def homework_validate(
|
|
| 1172 |
"student_level": student_level,
|
| 1173 |
"status": "Needs Review",
|
| 1174 |
"match_percentage": 0,
|
| 1175 |
-
"
|
| 1176 |
"rule_based_remark": f"Found {len(student_answers_by_qid)} MCQ answers but no correct answers in prompt. Include 'Correct: B' for each question.",
|
| 1177 |
"student_extracted_text": student_text,
|
| 1178 |
"llm_used": False,
|
|
@@ -1192,7 +1192,7 @@ async def homework_validate(
|
|
| 1192 |
"student_level": student_level,
|
| 1193 |
"status": "Needs Review",
|
| 1194 |
"match_percentage": 0,
|
| 1195 |
-
"
|
| 1196 |
"rule_based_remark": "MCQ correct option not found in prompt. Include 'Correct: B' or similar in prompt.",
|
| 1197 |
"student_extracted_text": student_text,
|
| 1198 |
"llm_used": False,
|
|
@@ -1209,7 +1209,7 @@ async def homework_validate(
|
|
| 1209 |
"student_level": student_level,
|
| 1210 |
"status": "Needs Review",
|
| 1211 |
"match_percentage": 0,
|
| 1212 |
-
"
|
| 1213 |
"rule_based_remark": "Student option (A/B/C/D) not detected clearly.",
|
| 1214 |
"student_extracted_text": student_text,
|
| 1215 |
"llm_used": False,
|
|
@@ -1241,7 +1241,7 @@ async def homework_validate(
|
|
| 1241 |
"student_level": student_level,
|
| 1242 |
"status": status,
|
| 1243 |
"match_percentage": match_percentage,
|
| 1244 |
-
"
|
| 1245 |
"rule_based_remark": f"{'Correct' if is_correct else 'Incorrect'}. Score: {match_percentage}% (Level: {student_level}, Credit per Q: {credit_per_q}%)",
|
| 1246 |
"student_extracted_text": student_text,
|
| 1247 |
"llm_used": False,
|
|
@@ -1260,7 +1260,7 @@ async def homework_validate(
|
|
| 1260 |
"student_level": student_level,
|
| 1261 |
"status": "Needs Review",
|
| 1262 |
"match_percentage": 0,
|
| 1263 |
-
"
|
| 1264 |
"rule_based_remark": "Gemini not configured. Check /health/llm.",
|
| 1265 |
"llm_used": False,
|
| 1266 |
"llm_error": parse_gemini_error(GEMINI_LAST_ERROR),
|
|
@@ -1294,7 +1294,7 @@ async def homework_validate(
|
|
| 1294 |
"student_level": student_level,
|
| 1295 |
"status": "Needs Review",
|
| 1296 |
"match_percentage": 0,
|
| 1297 |
-
"
|
| 1298 |
"rule_based_remark": "Gemini failed. Check /health/llm.",
|
| 1299 |
"llm_used": False,
|
| 1300 |
"llm_error": parse_gemini_error(GEMINI_LAST_ERROR),
|
|
@@ -1315,7 +1315,7 @@ async def homework_validate(
|
|
| 1315 |
"student_level": student_level,
|
| 1316 |
"status": "Needs Review",
|
| 1317 |
"match_percentage": 0,
|
| 1318 |
-
"
|
| 1319 |
"rule_based_remark": "Gemini returned non-JSON output.",
|
| 1320 |
"llm_used": False,
|
| 1321 |
"llm_error": {"ok": False, "error_type": "GEMINI_BAD_JSON", "message": str(e), "raw": response_text[:800]},
|
|
@@ -1339,7 +1339,7 @@ async def homework_validate(
|
|
| 1339 |
"student_level": student_level,
|
| 1340 |
"status": "Needs Review",
|
| 1341 |
"match_percentage": 0,
|
| 1342 |
-
"
|
| 1343 |
"rule_based_remark": "AI returned empty reference answer.",
|
| 1344 |
"llm_used": True,
|
| 1345 |
"student_extracted_text": student_text,
|
|
@@ -1373,7 +1373,7 @@ async def homework_validate(
|
|
| 1373 |
f"{remark_prompt}"
|
| 1374 |
)
|
| 1375 |
|
| 1376 |
-
|
| 1377 |
prompt=resp2_prompt,
|
| 1378 |
system_prompt="You are a strict, helpful teacher. Be concise and factual.",
|
| 1379 |
max_tokens=140,
|
|
@@ -1381,10 +1381,10 @@ async def homework_validate(
|
|
| 1381 |
)
|
| 1382 |
|
| 1383 |
rule_based_remark = None
|
| 1384 |
-
remark_llm_used = bool(
|
| 1385 |
-
remark_llm_error = None if
|
| 1386 |
|
| 1387 |
-
if not
|
| 1388 |
if status == "Verified":
|
| 1389 |
rule_based_remark = "Homework matches the expected answer well. Good coverage of the key ideas."
|
| 1390 |
elif status == "Partial":
|
|
@@ -1401,7 +1401,7 @@ async def homework_validate(
|
|
| 1401 |
"student_level": student_level,
|
| 1402 |
"status": status,
|
| 1403 |
"match_percentage": match_pct,
|
| 1404 |
-
"
|
| 1405 |
"rule_based_remark": rule_based_remark,
|
| 1406 |
"llm_used": True,
|
| 1407 |
"remark_llm_used": remark_llm_used,
|
|
|
|
| 911 |
"student_level": student_level,
|
| 912 |
"status": "Unreadable",
|
| 913 |
"match_percentage": 0,
|
| 914 |
+
"submission_remark": None,
|
| 915 |
"rule_based_remark": "Answer text could not be read clearly. Please upload a clearer file.",
|
| 916 |
"student_extracted_text": student_text,
|
| 917 |
"llm_used": False,
|
|
|
|
| 928 |
"student_level": student_level,
|
| 929 |
"status": "Unreadable",
|
| 930 |
"match_percentage": 0,
|
| 931 |
+
"submission_remark": None,
|
| 932 |
"rule_based_remark": "This PDF looks scanned. OCR is required (install pdf2image + poppler) or upload a clearer file.",
|
| 933 |
"student_extracted_text": student_text,
|
| 934 |
"llm_used": False,
|
|
|
|
| 1063 |
"student_level": student_level,
|
| 1064 |
"status": status,
|
| 1065 |
"match_percentage": final_score,
|
| 1066 |
+
"submission_remark": None,
|
| 1067 |
"rule_based_remark": f"MCQ: {correct_mcq}/{total_mcq} correct. Narrative score: {narrative_score}%. (Level: {student_level}, Credit per Q: {credit_per_q}%)",
|
| 1068 |
"llm_used": bool(narrative_results and 'error' not in narrative_results),
|
| 1069 |
"student_extracted_text": student_text,
|
|
|
|
| 1154 |
"student_level": student_level,
|
| 1155 |
"status": status,
|
| 1156 |
"match_percentage": match_percentage,
|
| 1157 |
+
"submission_remark": None,
|
| 1158 |
"rule_based_remark": f"Multiple MCQ: {correct_count}/{total_count} correct. Score: {match_percentage}% (Level: {student_level})",
|
| 1159 |
"student_extracted_text": student_text,
|
| 1160 |
"llm_used": False,
|
|
|
|
| 1172 |
"student_level": student_level,
|
| 1173 |
"status": "Needs Review",
|
| 1174 |
"match_percentage": 0,
|
| 1175 |
+
"submission_remark": None,
|
| 1176 |
"rule_based_remark": f"Found {len(student_answers_by_qid)} MCQ answers but no correct answers in prompt. Include 'Correct: B' for each question.",
|
| 1177 |
"student_extracted_text": student_text,
|
| 1178 |
"llm_used": False,
|
|
|
|
| 1192 |
"student_level": student_level,
|
| 1193 |
"status": "Needs Review",
|
| 1194 |
"match_percentage": 0,
|
| 1195 |
+
"submission_remark": None,
|
| 1196 |
"rule_based_remark": "MCQ correct option not found in prompt. Include 'Correct: B' or similar in prompt.",
|
| 1197 |
"student_extracted_text": student_text,
|
| 1198 |
"llm_used": False,
|
|
|
|
| 1209 |
"student_level": student_level,
|
| 1210 |
"status": "Needs Review",
|
| 1211 |
"match_percentage": 0,
|
| 1212 |
+
"submission_remark": None,
|
| 1213 |
"rule_based_remark": "Student option (A/B/C/D) not detected clearly.",
|
| 1214 |
"student_extracted_text": student_text,
|
| 1215 |
"llm_used": False,
|
|
|
|
| 1241 |
"student_level": student_level,
|
| 1242 |
"status": status,
|
| 1243 |
"match_percentage": match_percentage,
|
| 1244 |
+
"submission_remark": None,
|
| 1245 |
"rule_based_remark": f"{'Correct' if is_correct else 'Incorrect'}. Score: {match_percentage}% (Level: {student_level}, Credit per Q: {credit_per_q}%)",
|
| 1246 |
"student_extracted_text": student_text,
|
| 1247 |
"llm_used": False,
|
|
|
|
| 1260 |
"student_level": student_level,
|
| 1261 |
"status": "Needs Review",
|
| 1262 |
"match_percentage": 0,
|
| 1263 |
+
"submission_remark": None,
|
| 1264 |
"rule_based_remark": "Gemini not configured. Check /health/llm.",
|
| 1265 |
"llm_used": False,
|
| 1266 |
"llm_error": parse_gemini_error(GEMINI_LAST_ERROR),
|
|
|
|
| 1294 |
"student_level": student_level,
|
| 1295 |
"status": "Needs Review",
|
| 1296 |
"match_percentage": 0,
|
| 1297 |
+
"submission_remark": None,
|
| 1298 |
"rule_based_remark": "Gemini failed. Check /health/llm.",
|
| 1299 |
"llm_used": False,
|
| 1300 |
"llm_error": parse_gemini_error(GEMINI_LAST_ERROR),
|
|
|
|
| 1315 |
"student_level": student_level,
|
| 1316 |
"status": "Needs Review",
|
| 1317 |
"match_percentage": 0,
|
| 1318 |
+
"submission_remark": None,
|
| 1319 |
"rule_based_remark": "Gemini returned non-JSON output.",
|
| 1320 |
"llm_used": False,
|
| 1321 |
"llm_error": {"ok": False, "error_type": "GEMINI_BAD_JSON", "message": str(e), "raw": response_text[:800]},
|
|
|
|
| 1339 |
"student_level": student_level,
|
| 1340 |
"status": "Needs Review",
|
| 1341 |
"match_percentage": 0,
|
| 1342 |
+
"submission_remark": None,
|
| 1343 |
"rule_based_remark": "AI returned empty reference answer.",
|
| 1344 |
"llm_used": True,
|
| 1345 |
"student_extracted_text": student_text,
|
|
|
|
| 1373 |
f"{remark_prompt}"
|
| 1374 |
)
|
| 1375 |
|
| 1376 |
+
submission_remark = generate_gemini_response(
|
| 1377 |
prompt=resp2_prompt,
|
| 1378 |
system_prompt="You are a strict, helpful teacher. Be concise and factual.",
|
| 1379 |
max_tokens=140,
|
|
|
|
| 1381 |
)
|
| 1382 |
|
| 1383 |
rule_based_remark = None
|
| 1384 |
+
remark_llm_used = bool(submission_remark)
|
| 1385 |
+
remark_llm_error = None if submission_remark else (GEMINI_LAST_ERROR or "Unknown LLM error")
|
| 1386 |
|
| 1387 |
+
if not submission_remark:
|
| 1388 |
if status == "Verified":
|
| 1389 |
rule_based_remark = "Homework matches the expected answer well. Good coverage of the key ideas."
|
| 1390 |
elif status == "Partial":
|
|
|
|
| 1401 |
"student_level": student_level,
|
| 1402 |
"status": status,
|
| 1403 |
"match_percentage": match_pct,
|
| 1404 |
+
"submission_remark": submission_remark if submission_remark else None,
|
| 1405 |
"rule_based_remark": rule_based_remark,
|
| 1406 |
"llm_used": True,
|
| 1407 |
"remark_llm_used": remark_llm_used,
|