|
from flask import Flask, request, jsonify |
|
from huggingface_hub import InferenceClient |
|
from requests.exceptions import RequestException |
|
|
|
app = Flask(__name__) |
|
|
|
|
|
client = InferenceClient("mistralai/Mistral-7B-Instruct-v0.2") |
|
|
|
def system_instructions(context): |
|
return f"""<s> [INST] Your are a great teacher and your task is to create 6 questions with answer and 4 choices based on the following context:\n\n{context}\n\n. Each example should be like this |
|
Question: "" |
|
Choices: |
|
A): "" |
|
B): "" |
|
C): "" |
|
D): "" |
|
Answer: "Choose either A, B, C, or D as the correct answer" |
|
Explanation: "" |
|
\n |
|
[/INST] |
|
""" |
|
|
|
def generate_quiz(context): |
|
formatted_prompt = system_instructions(context) |
|
|
|
generate_kwargs = dict( |
|
temperature=0.1, |
|
max_new_tokens=2048, |
|
top_p=0.95, |
|
repetition_penalty=1.0, |
|
do_sample=True, |
|
seed=42,) |
|
|
|
try: |
|
response = client.text_generation( |
|
formatted_prompt, |
|
**generate_kwargs, |
|
stream=False, |
|
details=False, |
|
return_full_text=False, |
|
) |
|
return response |
|
|
|
except (RequestException, SystemExit) as e: |
|
return {"error": str(e)} |
|
|
|
@app.route("/", methods=["GET", "POST"]) |
|
def generate_quiz_page(): |
|
if request.method == "POST": |
|
if request.content_type == 'application/json': |
|
data = request.get_json() |
|
context = data.get("context") |
|
if context is None or context.strip() == "": |
|
return jsonify({"error": "Missing or empty 'context' parameter"}), 400 |
|
else: |
|
context = request.form.get("context") |
|
if context is None or context.strip() == "": |
|
return jsonify({"error": "Missing or empty 'context' parameter"}), 400 |
|
|
|
response = generate_quiz(context) |
|
|
|
if request.content_type == 'application/json': |
|
return jsonify(response) |
|
|
|
|
|
quiz_html = f""" |
|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>Generated Quiz</title> |
|
<style> |
|
body {{ |
|
font-family: Arial, sans-serif; |
|
background-color: #f0f0f0; /* Light grey background */ |
|
color: #333; /* Dark grey text color */ |
|
margin: 20px; |
|
}} |
|
h2 {{ |
|
background-color: #ffc107; /* Yellow background for heading */ |
|
padding: 10px; |
|
border-radius: 5px; |
|
}} |
|
form {{ |
|
display: none; /* Hide the form after generating quiz */ |
|
}} |
|
.quiz-container {{ |
|
background-color: #f0f0f0; /* Light grey background */ |
|
padding: 20px; |
|
border-radius: 5px; |
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* Light shadow effect */ |
|
margin-bottom: 20px; |
|
}} |
|
.quiz-container pre {{ |
|
white-space: pre-wrap; /* Preserve line breaks in quiz response */ |
|
}} |
|
.generate-link {{ |
|
display: inline-block; /* Make the link inline-block */ |
|
margin-top: 10px; |
|
border: 2px solid transparent; /* Transparent border initially */ |
|
padding: 5px 10px; /* Padding for spacing inside the border */ |
|
text-decoration: none; /* Remove underline */ |
|
color: #ffc107; /* Yellow text color */ |
|
font-weight: bold; /* Bold text */ |
|
border-radius: 4px; |
|
background-color: #333; /* Dark grey background color */ |
|
}} |
|
.generate-link:hover {{ |
|
text-decoration: none; /* Remove underline on hover */ |
|
background-color: #555; /* Darker grey background color on hover */ |
|
}} |
|
a {{ |
|
color: #ffc107; /* Yellow text color for links */ |
|
text-decoration: none; |
|
}} |
|
a:hover {{ |
|
text-decoration: underline; /* Underline on hover */ |
|
}} |
|
textarea {{ |
|
width: 100%; |
|
padding: 10px; |
|
border: 1px solid #ccc; |
|
border-radius: 4px; |
|
resize: vertical; /* Allow vertical resizing of textarea */ |
|
min-height: 150px; /* Minimum height for textarea */ |
|
}} |
|
input[type="submit"] {{ |
|
background-color: #ffc107; /* Yellow background for submit button */ |
|
color: #333; /* Dark grey text color */ |
|
border: none; |
|
padding: 10px 20px; |
|
cursor: pointer; |
|
border-radius: 4px; |
|
}} |
|
input[type="submit"]:hover {{ |
|
background-color: #ffca28; /* Lighter yellow on hover */ |
|
}} |
|
</style> |
|
</head> |
|
<body> |
|
<div class="quiz-container"> |
|
<h2>Generated Quiz</h2> |
|
<pre>{response}</pre> |
|
<a href="/" class="generate-link">Back to generate another quiz</a> |
|
</div> |
|
</body> |
|
</html> |
|
""" |
|
|
|
return quiz_html |
|
|
|
|
|
default_html = """ |
|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>Generate Quiz</title> |
|
<style> |
|
body { |
|
font-family: Arial, sans-serif; |
|
background-color: #f0f0f0; /* Light grey background */ |
|
color: #333; /* Dark grey text color */ |
|
margin: 20px; |
|
} |
|
h2 { |
|
background-color: #ffc107; /* Yellow background for heading */ |
|
padding: 10px; |
|
border-radius: 5px; |
|
} |
|
form { |
|
background-color: #fff; /* White background for form */ |
|
padding: 20px; |
|
border-radius: 5px; |
|
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* Light shadow effect */ |
|
margin-bottom: 20px; |
|
} |
|
label { |
|
display: block; |
|
margin-bottom: 10px; |
|
} |
|
textarea { |
|
width: 98%; |
|
padding: 10px; |
|
border: 2px solid #ffc107; /* Yellow border */ |
|
border-radius: 4px; |
|
resize: vertical; /* Allow vertical resizing of textarea */ |
|
min-height: 150px; /* Minimum height for textarea */ |
|
background-color: #f0f0f0; /* Light grey background */ |
|
} |
|
input[type="submit"] { |
|
background-color: #ffc107; /* Yellow background for submit button */ |
|
color: #333; /* Dark grey text color */ |
|
border: none; |
|
padding: 10px 20px; |
|
cursor: pointer; |
|
border-radius: 4px; |
|
} |
|
input[type="submit"]:hover { |
|
background-color: #ffca28; /* Lighter yellow on hover */ |
|
} |
|
</style> |
|
</head> |
|
<body> |
|
<h2>Generate Quiz</h2> |
|
<form action="/" method="post"> |
|
<label for="context">Context:</label><br> |
|
<textarea id="context" name="context" rows="20" required></textarea><br><br> |
|
<input type="submit" value="Generate Quiz"> |
|
</form> |
|
</body> |
|
</html> |
|
""" |
|
|
|
return default_html |
|
|
|
if __name__ == "__main__": |
|
app.run(debug=True) |