from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import HTMLResponse from pydantic import BaseModel, Field from typing import List, Optional import json app = FastAPI( title="Simple Flashcard Display API", version="1.0.0", description="A simple tool for AI to display interactive flashcards.", ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # ------------------------------- # Pydantic models # ------------------------------- class Flashcard(BaseModel): front: str = Field(..., description="Front of the flashcard (question/prompt)") back: str = Field(..., description="Back of the flashcard (answer/explanation)") class FlashcardSet(BaseModel): title: str = Field("Flashcards", description="Title for the flashcard set") cards: List[Flashcard] = Field(..., description="List of flashcards") description: Optional[str] = Field(None, description="Optional description") # ------------------------------- # HTML Template # ------------------------------- def flashcard_html(title: str, cards: List[dict], description: str = None) -> str: cards_json = json.dumps(cards) desc_html = f"

{description}

" if description else "" return f""" {title}

{title}

{desc_html}
💡 Click card to reveal answer
/
""" # ------------------------------- # Routes # ------------------------------- @app.post("/display", summary="Display flashcards") def display_flashcards(flashcard_set: FlashcardSet): """Display a set of flashcards in an interactive HTML interface.""" if not flashcard_set.cards: raise HTTPException(status_code=400, detail="No flashcards provided") cards_dict = [ {"front": card.front, "back": card.back} for card in flashcard_set.cards ] html_content = flashcard_html( title=flashcard_set.title, cards=cards_dict, description=flashcard_set.description, ) headers = {"Content-Disposition": "inline"} return HTMLResponse(content=html_content, headers=headers) @app.get("/", summary="Home page") def home(): """Simple home page with instructions.""" html = """ Flashcard Display Tool

🃏 Flashcard Display Tool

This is a simple tool for AI assistants to display interactive flashcards.

Usage

POST to /display with JSON data:

{
  "title": "My Flashcards",
  "description": "Practice questions",
  "cards": [
    {
      "front": "What is 2 + 2?",
      "back": "4"
    },
    {
      "front": "Capital of France?",
      "back": "Paris"
    }
  ]
}

Features:

""" return HTMLResponse(content=html) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)