main.py

from fastapi.middleware.cors import CORSMiddleware

from dotenv import load_dotenv

from fastapi import UploadFile, File

from fastapi import FastAPI, HTTPException

from pydantic import BaseModel

from vectorstore.store import SimpleVectorStore

from nlpgen.generation import generate_answer

import os

# Laad het .env-bestand

load_dotenv()

# Haal DATABASE_URL op

DATABASE_URL = os.getenv(“DATABASE_URL”)

# Definieer de FastAPI-app

app = FastAPI()

# Middleware

app.add_middleware(

    CORSMiddleware,

    allow_origins=[“*”],

    allow_credentials=True,

    allow_methods=[“*”],

    allow_headers=[“*”],

)

@app.get(“/”)

async def root():

    return {“greeting”: “Hello, World!”, “message”: “Welcome to FastAPI!”}

@app.get(“/test-db”)

def test_db():

    # Controleer of DATABASE_URL correct is geladen

    if not DATABASE_URL:

        return {“error”: “DATABASE_URL niet gevonden”}

    return {“database_url”: DATABASE_URL}

# Dummy dataset

texts = [

    “FastAPI is een modern webframework voor Python.”,

    “Retrieval-Augmented Generation combineert zoekfunctionaliteit met tekstgeneratie.”,

    “Vectorstores zoals FAISS worden vaak gebruikt om semantische zoekopdrachten te versnellen.”,

    “Het ontwikkelen van een CKBA-product vereist een combinatie van backend, frontend en machine learning.”

]

# Initialiseer vectorstore en voeg teksten toe

vectorstore = SimpleVectorStore()

vectorstore.add_texts(texts)

# Requestmodel

class QuestionRequest(BaseModel):

    question: str

@app.post(“/answer”)

async def answer_question(request: QuestionRequest):

    “””

    Beantwoord een vraag op basis van de opgeslagen teksten.

    “””

    try:

        # Zoek relevante context

        relevant_context = vectorstore.search(request.question, top_k=3)

        context = “\n”.join(relevant_context[:3])  # Beperk de context tot 3 resultaten

        # Genereer antwoord

        answer = generate_answer(request.question, context)

        return {“question”: request.question, “context”: relevant_context, “answer”: answer}

    except Exception as e:

        raise HTTPException(status_code=500, detail=f”Fout bij beantwoording: {str(e)}”)

@app.post(“/upload”)

async def upload_document(file: UploadFile):

    try:

        # Log details van het bestand

        print(f”Ontvangen bestand: {file.filename}, content type: {file.content_type}”)

        content = (await file.read()).decode(“utf-8”)

        vectorstore.add_texts([content])

        return {“filename”: file.filename, “message”: “Document succesvol geupload en toegevoegd aan de vectorstore.”}

    except Exception as e:

        print(f”Fout bij uploaden: {e}”)

        raise HTTPException(status_code=500, detail=f”Fout bij uploaden: {str(e)}”)