# SPDX-FileCopyrightText: 2026 LobotomyLabs # SPDX-License-Identifier: MPL-2.0 import os import json import httpx from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from classquiz.auth import get_current_user from classquiz.db.models import User, QuizInput router = APIRouter() class AIGenerateRequest(BaseModel): topic: str num_questions: int = 5 @router.post("/generate", response_model=QuizInput) async def generate_ai_quiz(req: AIGenerateRequest, user: User = Depends(get_current_user)): api_key = os.getenv("AI_API_KEY", "") base_url = os.getenv("AI_BASE_URL", "https://api.openai.com/v1") model = os.getenv("AI_MODEL", "gpt-4o-mini") prompt = f"Generate a quiz about '{req.topic}' with exactly {req.num_questions} multiple-choice questions (ABCD type). Return ONLY valid JSON with keys: title, description, questions (list of {{question, time: '20', type: 'ABCD', answers: [{{answer, right: bool, color}}]}})." async with httpx.AsyncClient(timeout=30.0) as client: res = await client.post( f"{base_url}/chat/completions", headers={"Authorization": f"Bearer {api_key}"}, json={"model": model, "messages": [{"role": "user", "content": prompt}], "temperature": 0.7}, ) if res.status_code != 200: raise HTTPException(status_code=502, detail=f"AI provider error: {res.text}") content = res.json()["choices"][0]["message"]["content"].strip() if content.startswith("```"): content = content.split("```")[1] if content.startswith("json"): content = content[4:] content = content.strip("` \n") return QuizInput(**json.loads(content))