Spaces:
Sleeping
Sleeping
MCQ test3
Browse files- api/main.py +48 -7
api/main.py
CHANGED
|
@@ -485,18 +485,41 @@ async def generate_mcqs(request: MCQGenerateRequest):
|
|
| 485 |
if mcq in valid_mcqs:
|
| 486 |
continue
|
| 487 |
|
|
|
|
|
|
|
|
|
|
| 488 |
question = str(mcq.get("question", "")).strip()
|
| 489 |
-
|
| 490 |
correct = str(mcq.get("correct_answer", "A")).strip().upper()
|
| 491 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 492 |
normalized = {
|
| 493 |
"question": question,
|
| 494 |
-
"options":
|
| 495 |
-
"A": str(options_map.get("A", "Option A")),
|
| 496 |
-
"B": str(options_map.get("B", "Option B")),
|
| 497 |
-
"C": str(options_map.get("C", "Option C")),
|
| 498 |
-
"D": str(options_map.get("D", "Option D")),
|
| 499 |
-
},
|
| 500 |
"correct_answer": correct if correct in ["A", "B", "C", "D"] else "A",
|
| 501 |
"explanation": str(mcq.get("explanation", "Based on the provided context.")),
|
| 502 |
"difficulty": str(mcq.get("difficulty", request.difficulty or "medium")).lower(),
|
|
@@ -505,6 +528,24 @@ async def generate_mcqs(request: MCQGenerateRequest):
|
|
| 505 |
if normalized["question"]:
|
| 506 |
valid_mcqs.append(normalized)
|
| 507 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 508 |
valid_mcqs = valid_mcqs[:request.num_questions]
|
| 509 |
|
| 510 |
return {
|
|
|
|
| 485 |
if mcq in valid_mcqs:
|
| 486 |
continue
|
| 487 |
|
| 488 |
+
if not isinstance(mcq, dict):
|
| 489 |
+
continue
|
| 490 |
+
|
| 491 |
question = str(mcq.get("question", "")).strip()
|
| 492 |
+
options_raw = mcq.get("options", {}) or {}
|
| 493 |
correct = str(mcq.get("correct_answer", "A")).strip().upper()
|
| 494 |
|
| 495 |
+
if isinstance(options_raw, dict):
|
| 496 |
+
options_map = {
|
| 497 |
+
"A": str(options_raw.get("A") or options_raw.get("a") or "Option A"),
|
| 498 |
+
"B": str(options_raw.get("B") or options_raw.get("b") or "Option B"),
|
| 499 |
+
"C": str(options_raw.get("C") or options_raw.get("c") or "Option C"),
|
| 500 |
+
"D": str(options_raw.get("D") or options_raw.get("d") or "Option D"),
|
| 501 |
+
}
|
| 502 |
+
elif isinstance(options_raw, list):
|
| 503 |
+
normalized = [str(x) for x in options_raw]
|
| 504 |
+
while len(normalized) < 4:
|
| 505 |
+
normalized.append(f"Option {chr(65 + len(normalized))}")
|
| 506 |
+
options_map = {
|
| 507 |
+
"A": normalized[0],
|
| 508 |
+
"B": normalized[1],
|
| 509 |
+
"C": normalized[2],
|
| 510 |
+
"D": normalized[3],
|
| 511 |
+
}
|
| 512 |
+
else:
|
| 513 |
+
options_map = {
|
| 514 |
+
"A": str(mcq.get("option_a", "Option A")),
|
| 515 |
+
"B": str(mcq.get("option_b", "Option B")),
|
| 516 |
+
"C": str(mcq.get("option_c", "Option C")),
|
| 517 |
+
"D": str(mcq.get("option_d", "Option D")),
|
| 518 |
+
}
|
| 519 |
+
|
| 520 |
normalized = {
|
| 521 |
"question": question,
|
| 522 |
+
"options": options_map,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 523 |
"correct_answer": correct if correct in ["A", "B", "C", "D"] else "A",
|
| 524 |
"explanation": str(mcq.get("explanation", "Based on the provided context.")),
|
| 525 |
"difficulty": str(mcq.get("difficulty", request.difficulty or "medium")).lower(),
|
|
|
|
| 528 |
if normalized["question"]:
|
| 529 |
valid_mcqs.append(normalized)
|
| 530 |
|
| 531 |
+
# Absolute fallback: synthesize missing MCQs so API always returns requested count.
|
| 532 |
+
if len(valid_mcqs) < request.num_questions:
|
| 533 |
+
missing = request.num_questions - len(valid_mcqs)
|
| 534 |
+
base_topic = request.source.strip() if request.source else "the topic"
|
| 535 |
+
for i in range(missing):
|
| 536 |
+
valid_mcqs.append({
|
| 537 |
+
"question": f"Which statement best describes {base_topic} (item {i + 1})?",
|
| 538 |
+
"options": {
|
| 539 |
+
"A": f"A key concept of {base_topic}",
|
| 540 |
+
"B": f"An incorrect interpretation of {base_topic}",
|
| 541 |
+
"C": "An unrelated concept",
|
| 542 |
+
"D": "None of the above",
|
| 543 |
+
},
|
| 544 |
+
"correct_answer": "A",
|
| 545 |
+
"explanation": "Option A is the best-supported choice based on available context.",
|
| 546 |
+
"difficulty": (request.difficulty or "medium").lower(),
|
| 547 |
+
})
|
| 548 |
+
|
| 549 |
valid_mcqs = valid_mcqs[:request.num_questions]
|
| 550 |
|
| 551 |
return {
|