Soacti's picture
Update app.py
3e1ff70 verified
raw
history blame
5.63 kB
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)