E· Universitetprogrammering· ca 60 min· utvecklande· verifierad 2026-09-20
Bygga ett API med FastAPI
Kunna exponera en modell bakom ett HTTP-API med validering och felhantering.
Förkunskaper
- DAPI:er och HTTPkrävs
- EAsynkron programmeringkrävs
Intuition
En modell i en notebook hjälper ingen. Bakom ett HTTP-API kan vilken app som helst använda den.
FastAPI: du deklarerar in- och utdata som Pydantic-modeller → validering, felmeddelanden och dokumentation (/docs) gratis. Async-endpoints passar LLM-anrop.
Minimikrav för något som ska köras på riktigt:
/healthzsom svarar snabbt (för övervakning),- validering av indata (längd, typ) → 422 automatiskt,
- tydliga fel: 400 för fel input, 503 när modellen/leverantören är nere, aldrig 500 med stacktrace,
- timeout mot allt externt,
- loggning av varje anrop (utan känsligt innehåll),
- en gräns på antal anrop per klient.
Kod
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
import httpx, asyncio
app = FastAPI(title="Sentiment-API")
class In(BaseModel):
text: str = Field(min_length=1, max_length=2000)
class Out(BaseModel):
label: str
score: float
@app.get("/healthz")
async def healthz():
return {"ok": True}
@app.post("/v1/sentiment", response_model=Out)
async def sentiment(body: In):
try:
async with httpx.AsyncClient(timeout=10) as c:
r = await c.post(MODEL_URL, json={"text": body.text})
r.raise_for_status()
except (httpx.TimeoutException, httpx.HTTPError):
raise HTTPException(503, "Modellen svarar inte just nu — försök igen")
d = r.json()
return Out(label=d["label"], score=d["score"])
Kör: uvicorn app:app --port 8000. Testa med httpx.AsyncClient(app=app) i pytest — inga nätverksanrop behövs.
Behärskning innebär
- Exponerar en modell bakom ett FastAPI-endpoint med Pydantic-validering
- Hanterar fel med rätt statuskoder
- Lägger till hälsokontroll, timeout och enkel rate limit
Logga in för att göra övningarna och bygga upp din behärskning.