import gradio as gr from fastapi import FastAPI, HTTPException from pydantic import BaseModel import json import time from typing import List, Literal # FastAPI app app = FastAPI(title="SoActi AI Quiz API", version="1.0.0") # Request/Response models class QuizRequest(BaseModel): tema: str språk: Literal["no", "en"] = "no" antall_spørsmål: int = 5 type: Literal["sted", "rute"] = "sted" vanskelighetsgrad: int = 3 class QuizQuestion(BaseModel): spørsmål: str alternativer: List[str] korrekt_svar: int forklaring: str class QuizResponse(BaseModel): success: bool questions: List[QuizQuestion] metadata: dict message: str # Hardkodede spørsmål QUIZ_DATABASE = { "oslo": [ { "spørsmål": "Hva heter Oslos hovedflyplass?", "alternativer": ["Fornebu", "Gardermoen", "Torp", "Rygge"], "korrekt_svar": 1, "forklaring": "Oslo lufthavn Gardermoen er Oslos hovedflyplass, åpnet i 1998." }, { "spørsmål": "Hvilken fjord ligger Oslo ved?", "alternativer": ["Trondheimsfjorden", "Oslofjorden", "Hardangerfjorden", "Sognefjorden"], "korrekt_svar": 1, "forklaring": "Oslo ligger innerst i Oslofjorden." }, { "spørsmål": "Hva heter Oslos berømte operahus?", "alternativer": ["Operaen", "Den Norske Opera", "Oslo Opera House", "Operahuset"], "korrekt_svar": 3, "forklaring": "Operahuset i Oslo åpnet i 2008." } ], "bergen": [ { "spørsmål": "Hva kalles det fargerike kaiområdet i Bergen?", "alternativer": ["Bryggen", "Fisketorget", "Torgallmenningen", "Nordnes"], "korrekt_svar": 0, "forklaring": "Bryggen er UNESCOs verdensarvsted." }, { "spørsmål": "Hvilket fjell kan man ta Fløibanen opp til?", "alternativer": ["Ulriken", "Fløyen", "Løvstakken", "Sandviksfjellet"], "korrekt_svar": 1, "forklaring": "Fløibanen går opp til Fløyen, 320 meter over havet." } ], "norsk historie": [ { "spørsmål": "Hvilket år ble Norge selvstendig fra Danmark?", "alternativer": ["1814", "1905", "1821", "1830"], "korrekt_svar": 0, "forklaring": "Norge ble selvstendig fra Danmark i 1814." } ] } def get_questions_for_topic(tema: str, antall: int = 5): """Hent spørsmål for et tema""" tema_lower = tema.lower().strip() if tema_lower in QUIZ_DATABASE: questions = QUIZ_DATABASE[tema_lower] elif "oslo" in tema_lower: questions = QUIZ_DATABASE["oslo"] elif "bergen" in tema_lower: questions = QUIZ_DATABASE["bergen"] elif "historie" in tema_lower: questions = QUIZ_DATABASE["norsk historie"] else: questions = QUIZ_DATABASE["oslo"] return questions[:antall] # API Endpoints @app.get("/") async def root(): return {"service": "SoActi AI Quiz API", "status": "running"} @app.get("/health") async def health(): return {"status": "healthy"} @app.post("/generate-quiz", response_model=QuizResponse) async def generate_quiz_api(request: QuizRequest): """API endpoint - INGEN AUTENTISERING""" try: questions = get_questions_for_topic(request.tema, request.antall_spørsmål) quiz_questions = [ QuizQuestion( spørsmål=q["spørsmål"], alternativer=q["alternativer"], korrekt_svar=q["korrekt_svar"], forklaring=q["forklaring"] ) for q in questions ] return QuizResponse( success=True, questions=quiz_questions, metadata={"generation_time": 0.1, "model_used": "Database"}, message=f"Genererte {len(quiz_questions)} spørsmål" ) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) # Gradio interface def generate_quiz_gradio(tema, språk, antall, type_val, vanskelighet): try: questions = get_questions_for_topic(tema, antall) output = f"✅ Genererte {len(questions)} spørsmål om '{tema}'\n\n" for i, q in enumerate(questions, 1): output += f"📝 **Spørsmål {i}:** {q['spørsmål']}\n" for j, alt in enumerate(q['alternativer']): marker = "✅" if j == q['korrekt_svar'] else "❌" output += f" {chr(65+j)}) {alt} {marker}\n" output += f"💡 **Forklaring:** {q['forklaring']}\n\n" return output except Exception as e: return f"❌ Feil: {str(e)}" with gr.Blocks(title="SoActi AI Quiz API") as demo: gr.Markdown("# 🧠 SoActi AI Quiz API") with gr.Row(): with gr.Column(): tema_input = gr.Textbox(label="Tema", value="Oslo") antall_input = gr.Slider(1, 5, 3, label="Antall spørsmål") generate_btn = gr.Button("🚀 Generer Quiz", variant="primary") with gr.Column(): output = gr.Textbox(label="Quiz", lines=15) generate_btn.click( fn=generate_quiz_gradio, inputs=[tema_input, gr.Dropdown(["no"], value="no"), antall_input, gr.Dropdown(["sted"], value="sted"), gr.Slider(1, 5, 3)], outputs=output ) app = gr.mount_gradio_app(app, demo, path="/") if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=7860)