Spaces:
Sleeping
Sleeping
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 | |
async def root(): | |
return {"service": "SoActi AI Quiz API", "status": "running"} | |
async def health(): | |
return {"status": "healthy"} | |
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) |