Backend – FastAPI¶
Fil: API/python/app/app.py¶
Oppstart og konfigurasjon¶
Applikasjonen lastes med uvicorn via START_CHATBOT_v2.ps1:
Miljøvariabler lastes fra .env-filen spesifisert av ENV_PATH-miljøvariabelen (standard: API/chatbot/.env).
Nøkkelvariabler (fra .env)¶
| Variabel | Beskrivelse |
|---|---|
GEMINI_API_KEY |
Google Gemini API-nøkkel |
CACHE_DIR |
Sti til JSON-cache-mappe |
LOG_DIR |
Sti til loggmappe |
ALLOWED_TENANT_ID |
⚠️ Hardkodet til "SKI" i kode |
Kjent begrensning
ALLOWED_TENANT_ID = "SKI" er hardkodet på linje 20 i app.py. Alle forespørsler med annen tenant_id avvises med HTTP 403. Dette må fjernes for full multitenant-støtte.
Endepunkter¶
POST /api/chat¶
Mottar en chatmelding og returnerer AI-svar.
Forespørselsmodell:
class ChatRequest(BaseModel):
tenant_id: str
message: str
history: list[dict] # [{"role": "user"|"assistant", "content": "..."}]
Svarmodell:
Feilkoder:
| Kode | Årsak |
|---|---|
| 403 | tenant_id er ikke ALLOWED_TENANT_ID |
| 404 | Ingen cache-fil funnet for tenant |
| 500 | Gemini-feil eller intern serverfeil |
GET /health¶
Returnerer enkel helsestatus:
Systemprompten¶
build_system_prompt(tenant_id) leser cache/{tenant_id}_context.json og konstruerer en systemmelding til Gemini som inneholder:
- Klubbens navn og basisinfo
- Relevante data fra alle synkroniserte tabeller (nyheter, aktiviteter, baneinfo, osv.)
- Instruks om å svare kun på norsk (eller det språket gjesten bruker)
- Instruks om å begrense svar til klubbrelevant informasjon
Logging¶
log_interaction(tenant_id, message, reply) skriver til {LOG_DIR}/{tenant_id}_chat.jsonl:
{"ts": "2026-05-02T14:23:00Z", "tenant": "SKI", "user": "Hei", "bot": "Hei! Hva kan jeg hjelpe deg med?"}
Logger inneholder ikke IP-adresser eller personidentifiserende informasjon.
Fil: API/chatbot/requirements.txt¶
Fil: API/chatbot/.env.example¶
Malen som brukes for å opprette .env ved installasjon. Inneholder aldri ekte verdier – se .gitignore.