mirror of
https://github.com/th30d4y/OpenLearnX.git
synced 2026-05-26 11:25:49 +00:00
214 lines
6.9 KiB
Python
214 lines
6.9 KiB
Python
from flask import Blueprint, jsonify, request
|
|
from datetime import datetime
|
|
from bson import ObjectId
|
|
import uuid
|
|
|
|
bp = Blueprint('adaptive_quiz', __name__)
|
|
|
|
def get_db():
|
|
"""Get database connection"""
|
|
from main import get_db as main_get_db
|
|
return main_get_db()
|
|
|
|
def get_ai_service():
|
|
"""Get AI service from app config"""
|
|
from flask import current_app
|
|
return current_app.config.get('AI_QUIZ_SERVICE')
|
|
|
|
@bp.route('/start', methods=['POST', 'OPTIONS'])
|
|
def start_adaptive_quiz():
|
|
"""Start new adaptive quiz session"""
|
|
if request.method == "OPTIONS":
|
|
response = jsonify({'status': 'ok'})
|
|
response.headers.add("Access-Control-Allow-Origin", "*")
|
|
response.headers.add("Access-Control-Allow-Headers", "Content-Type,Authorization")
|
|
response.headers.add("Access-Control-Allow-Methods", "POST,OPTIONS")
|
|
return response
|
|
|
|
try:
|
|
data = request.get_json()
|
|
user_id = data.get('user_id', f'anonymous_{uuid.uuid4()}')
|
|
|
|
ai_service = get_ai_service()
|
|
if not ai_service:
|
|
return jsonify({
|
|
"success": False,
|
|
"error": "AI Quiz service not available"
|
|
}), 503
|
|
|
|
# Create new session
|
|
session_data = ai_service.create_session(user_id)
|
|
|
|
# Get first question
|
|
first_question = ai_service.get_adaptive_question(session_data)
|
|
|
|
# Save session to database
|
|
db = get_db()
|
|
db.adaptive_quiz_sessions.insert_one(session_data)
|
|
|
|
return jsonify({
|
|
"success": True,
|
|
"session_id": session_data['session_id'],
|
|
"question": first_question,
|
|
"session_stats": ai_service.get_session_stats(session_data)
|
|
})
|
|
|
|
except Exception as e:
|
|
return jsonify({"success": False, "error": str(e)}), 500
|
|
|
|
@bp.route('/<session_id>/answer', methods=['POST', 'OPTIONS'])
|
|
def submit_answer(session_id):
|
|
"""Submit answer and get next question"""
|
|
if request.method == "OPTIONS":
|
|
response = jsonify({'status': 'ok'})
|
|
response.headers.add("Access-Control-Allow-Origin", "*")
|
|
response.headers.add("Access-Control-Allow-Headers", "Content-Type,Authorization")
|
|
response.headers.add("Access-Control-Allow-Methods", "POST,OPTIONS")
|
|
return response
|
|
|
|
try:
|
|
data = request.get_json()
|
|
user_answer = data.get('answer', '').upper()
|
|
question_data = data.get('question_data', {})
|
|
|
|
if not user_answer or not question_data:
|
|
return jsonify({
|
|
"success": False,
|
|
"error": "Answer and question_data required"
|
|
}), 400
|
|
|
|
ai_service = get_ai_service()
|
|
if not ai_service:
|
|
return jsonify({
|
|
"success": False,
|
|
"error": "AI Quiz service not available"
|
|
}), 503
|
|
|
|
db = get_db()
|
|
|
|
# Get session data
|
|
session = db.adaptive_quiz_sessions.find_one({"session_id": session_id})
|
|
if not session:
|
|
return jsonify({
|
|
"success": False,
|
|
"error": "Session not found"
|
|
}), 404
|
|
|
|
# Remove MongoDB _id for processing
|
|
if '_id' in session:
|
|
del session['_id']
|
|
|
|
# Evaluate answer
|
|
result = ai_service.evaluate_answer(session, question_data, user_answer)
|
|
|
|
# Update session in database
|
|
db.adaptive_quiz_sessions.replace_one(
|
|
{"session_id": session_id},
|
|
session
|
|
)
|
|
|
|
# Check if quiz should continue
|
|
if session['total_questions'] >= 20: # Max 20 questions
|
|
session['status'] = 'completed'
|
|
db.adaptive_quiz_sessions.replace_one(
|
|
{"session_id": session_id},
|
|
session
|
|
)
|
|
|
|
return jsonify({
|
|
"success": True,
|
|
"quiz_completed": True,
|
|
"result": result,
|
|
"final_stats": ai_service.get_session_stats(session)
|
|
})
|
|
|
|
# Get next question
|
|
next_question = ai_service.get_adaptive_question(session)
|
|
|
|
return jsonify({
|
|
"success": True,
|
|
"quiz_completed": False,
|
|
"result": result,
|
|
"next_question": next_question,
|
|
"session_stats": ai_service.get_session_stats(session)
|
|
})
|
|
|
|
except Exception as e:
|
|
return jsonify({"success": False, "error": str(e)}), 500
|
|
|
|
@bp.route('/<session_id>/stats', methods=['GET', 'OPTIONS'])
|
|
def get_session_stats(session_id):
|
|
"""Get session statistics"""
|
|
if request.method == "OPTIONS":
|
|
response = jsonify({'status': 'ok'})
|
|
response.headers.add("Access-Control-Allow-Origin", "*")
|
|
return response
|
|
|
|
try:
|
|
ai_service = get_ai_service()
|
|
if not ai_service:
|
|
return jsonify({
|
|
"success": False,
|
|
"error": "AI Quiz service not available"
|
|
}), 503
|
|
|
|
db = get_db()
|
|
session = db.adaptive_quiz_sessions.find_one({"session_id": session_id})
|
|
|
|
if not session:
|
|
return jsonify({
|
|
"success": False,
|
|
"error": "Session not found"
|
|
}), 404
|
|
|
|
if '_id' in session:
|
|
del session['_id']
|
|
|
|
stats = ai_service.get_session_stats(session)
|
|
|
|
return jsonify({
|
|
"success": True,
|
|
"stats": stats
|
|
})
|
|
|
|
except Exception as e:
|
|
return jsonify({"success": False, "error": str(e)}), 500
|
|
|
|
@bp.route('/predict', methods=['POST', 'OPTIONS'])
|
|
def get_ai_prediction():
|
|
"""Get AI prediction for a question"""
|
|
if request.method == "OPTIONS":
|
|
response = jsonify({'status': 'ok'})
|
|
response.headers.add("Access-Control-Allow-Origin", "*")
|
|
response.headers.add("Access-Control-Allow-Headers", "Content-Type,Authorization")
|
|
response.headers.add("Access-Control-Allow-Methods", "POST,OPTIONS")
|
|
return response
|
|
|
|
try:
|
|
data = request.get_json()
|
|
question_text = data.get('question_text', '')
|
|
choices = data.get('choices', {})
|
|
|
|
if not question_text or not choices:
|
|
return jsonify({
|
|
"success": False,
|
|
"error": "question_text and choices required"
|
|
}), 400
|
|
|
|
ai_service = get_ai_service()
|
|
if not ai_service:
|
|
return jsonify({
|
|
"success": False,
|
|
"error": "AI Quiz service not available"
|
|
}), 503
|
|
|
|
prediction = ai_service.get_llm_prediction(question_text, choices)
|
|
|
|
return jsonify({
|
|
"success": True,
|
|
"prediction": prediction
|
|
})
|
|
|
|
except Exception as e:
|
|
return jsonify({"success": False, "error": str(e)}), 500
|