from fastapi import APIRouter, HTTPException, UploadFile from pydantic import BaseModel, Field from private_gpt.di import root_injector from private_gpt.server.ingest.ingest_service import IngestedDoc, IngestService ingest_router = APIRouter(prefix="/v1") class IngestResponse(BaseModel): object: str = Field(enum=["list"]) model: str = Field(enum=["private-gpt"]) data: list[IngestedDoc] @ingest_router.post("/ingest", tags=["Ingestion"]) def ingest(file: UploadFile) -> IngestResponse: """Ingests and processes a file, storing its chunks to be used as context. The context obtained from files is later used in `/chat/completions`, `/completions`, and `/chunks` APIs. Most common document formats are supported, but you may be prompted to install an extra dependency to manage a specific file type. A file can generate different Documents (for example a PDF generates one Document per page). All Documents IDs are returned in the response, together with the extracted Metadata (which is later used to improve context retrieval). Those IDs can be used to filter the context used to create responses in `/chat/completions`, `/completions`, and `/chunks` APIs. """ service = root_injector.get(IngestService) if file.filename is None: raise HTTPException(400, "No file name provided") ingested_documents = service.ingest(file.filename, file.file.read()) return IngestResponse(object="list", model="private-gpt", data=ingested_documents) @ingest_router.get("/ingest/list", tags=["Ingestion"]) def list_ingested() -> IngestResponse: """Lists already ingested Documents including their Document ID and metadata. Those IDs can be used to filter the context used to create responses in `/chat/completions`, `/completions`, and `/chunks` APIs. """ service = root_injector.get(IngestService) ingested_documents = service.list_ingested() return IngestResponse(object="list", model="private-gpt", data=ingested_documents)