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) |