from __future__ import annotations import uuid from typing import Literal from fastapi import APIRouter, Depends from pydantic import BaseModel, Field from sqlalchemy.orm import Session from app.api.deps import get_current_user, get_db from app.schemas import CurrentUser from app.services.audit import record_audit_event from app.services.knowledge import GroundedAnswer, KnowledgeHealth, get_knowledge_provider router = APIRouter(prefix="/api/v1/knowledge", tags=["knowledge"]) SupportedLanguage = Literal["nl-BE", "en-GB", "fr-BE"] class AskQuestionRequest(BaseModel): question: str = Field(min_length=3, max_length=1000) language: SupportedLanguage = "en-GB" @router.post("/questions", response_model=GroundedAnswer) def ask_question( body: AskQuestionRequest, db: Session = Depends(get_db), user: CurrentUser = Depends(get_current_user), ) -> GroundedAnswer: correlation_id = str(uuid.uuid4()) provider = get_knowledge_provider() answer = provider.ask(body.question, correlation_id, body.language) record_audit_event( db, actor_type="user", actor_label=user.display_name, action="knowledge_question_asked", entity_type="knowledge", correlation_id=uuid.UUID(correlation_id), metadata={ "evidence_state": answer.evidence_state, "provider": answer.provider, "source_ids": [s.document_id for s in answer.sources], "question_length": len(body.question), "language": body.language, }, ) db.commit() return answer @router.get("/status", response_model=KnowledgeHealth) def knowledge_status( language: SupportedLanguage = "en-GB", _user: CurrentUser = Depends(get_current_user), ) -> KnowledgeHealth: return get_knowledge_provider().health(language)