"""Knowledge base ingestion API.""" from pathlib import Path from fastapi import APIRouter, Depends, File, UploadFile from sqlalchemy.ext.asyncio import AsyncSession from app.config import get_settings from app.db import get_db from app.models import KnowledgeDoc from app.schemas import KnowledgeIngestResponse from app.services.rag import get_knowledge_store, ingest_path router = APIRouter(prefix="/api/knowledge", tags=["knowledge"]) @router.get("/status") async def knowledge_status() -> dict: """Return current knowledge chunk count.""" store = get_knowledge_store() return {"chunk_count": store.chunk_count} @router.post( "/ingest", response_model=KnowledgeIngestResponse, ) async def ingest_upload( file: UploadFile = File(...), db: AsyncSession = Depends(get_db), ) -> KnowledgeIngestResponse: """Upload and ingest a knowledge document.""" settings = get_settings() target_dir = Path(settings.knowledge_path) target_dir.mkdir(parents=True, exist_ok=True) filename = Path(file.filename or "upload.txt").name dest = target_dir / filename content = await file.read() dest.write_bytes(content) source = dest.suffix.lower().lstrip(".") or "text" count = await ingest_path(dest, source) db.add( KnowledgeDoc( filename=filename, source_type=source, chunk_count=count, ) ) await db.commit() return KnowledgeIngestResponse( filename=filename, chunk_count=count, message=f"Ingested {count} chunks from {filename}", )