Spaces:
Sleeping
Sleeping
| from flask import Flask, render_template, request, jsonify | |
| import os | |
| import google.generativeai as genai | |
| app = Flask(__name__) | |
| # Retrieve the Gemini API key from environment variables | |
| GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY") | |
| # Set the Gemini 2.5 Flash Preview model name | |
| MODEL = "gemini-2.5-flash" | |
| def generate_quiz(parameters): | |
| """ | |
| Builds a prompt based on user parameters, sends it to the Gemini 2.5 Flash API, | |
| and returns the quiz generated by the LLM in Markdown format. | |
| """ | |
| total_questions = sum(parameters['type_counts'].get(t, 0) for t in parameters['question_types']) | |
| if total_questions <= 0: | |
| return { | |
| "quiz_text": "Error: Please request at least one question.\n\nNo questions were requested. Please select at least one question type with a quantity greater than 0." | |
| } | |
| if not GEMINI_API_KEY: | |
| return { | |
| "quiz_text": "Error: API key not configured.\n\nThe GEMINI_API_KEY environment variable is not set. Please configure it to use the Gemini API." | |
| } | |
| # Build the prompt dynamically using the provided parameters | |
| prompt = f"Generate a quiz with the following parameters:\n" | |
| prompt += f"- Topic: {parameters['topic']}\n" | |
| prompt += f"- Difficulty: {parameters['difficulty']}\n" | |
| type_lines = [] | |
| for t in parameters['question_types']: | |
| count = parameters['type_counts'].get(t, 1) | |
| type_lines.append(f"{t} ({count})") | |
| prompt += f"- Question types: {', '.join(type_lines)}\n" | |
| if parameters.get("subtopics"): | |
| prompt += f"- Sub-topics: {', '.join(parameters['subtopics'])}\n" | |
| if parameters.get("keywords"): | |
| prompt += f"- Context keywords: {', '.join(parameters['keywords'])}\n" | |
| if parameters.get("audience"): | |
| prompt += f"- Target audience: {parameters['audience']}\n" | |
| if parameters.get("language", "en") != "en": | |
| prompt += f"- Language: {parameters['language']}\n" | |
| prompt += f"- Include explanations: {'Yes' if parameters.get('include_explanations', False) else 'No'}\n" | |
| if parameters.get("max_length"): | |
| prompt += f"- Maximum length per question: {parameters['max_length']} words\n" | |
| prompt += ( | |
| "Please format the quiz in Markdown as follows:\n" | |
| "1. Start with a heading like # Topic Quiz\n" | |
| "2. For each question, use a subheading like ## Question X: Type (e.g., ## Question 1: Multiple Choice)\n" | |
| "3. For multiple choice questions, label options as - A), - B), - C), - D)\n" | |
| "4. For other question types (e.g., Short Answer, True/False, or custom types like Fill-in-the-blank), present the question clearly and provide the answer format expected (e.g., for Short Answer, provide a brief sentence; for True/False, state True or False; for custom types, follow a similar clear format).\n" | |
| "5. If explanations are requested, include them after each question in a paragraph starting with **Explanation:**\n" | |
| "6. Make sure all information is factually correct\n" | |
| "7. Ensure each question's answer matches its explanation, and place the explanation after the answer.\n" | |
| ) | |
| try: | |
| genai.configure(api_key=GEMINI_API_KEY) | |
| model = genai.GenerativeModel(model_name=MODEL) | |
| response = model.generate_content(prompt) | |
| quiz_text = response.text | |
| if not quiz_text or not quiz_text.strip(): | |
| return { | |
| "quiz_text": "Error: No quiz content generated.\n\nThe API returned an empty response. This might be due to rate limits or an unexpected response format." | |
| } | |
| return { | |
| "quiz_text": quiz_text | |
| } | |
| except Exception as e: | |
| return { | |
| "quiz_text": f"Error: API request failed.\n\nThe request to the Gemini API failed: {str(e)}. Please check your network connection or try again later." | |
| } | |
| def index(): | |
| # You should have an 'index.html' template in your templates folder | |
| return render_template('index.html') | |
| def generate_quiz_endpoint(): | |
| parameters = request.get_json() | |
| result = generate_quiz(parameters) | |
| return jsonify(result) | |
| if __name__ == '__main__': | |
| app.run(host='0.0.0.0', port=7860) | |