mirror of
https://github.com/zylon-ai/private-gpt.git
synced 2025-12-22 13:55:41 +01:00
feat(API): Ingest plain text (#1417)
* Add ingest/text route to ingest plain text * Add new ingest text test and adapt ingest/file ones * Include new API in docs * Remove duplicated logic
This commit is contained in:
parent
059f35840a
commit
6eeb95ec7f
6 changed files with 198 additions and 17 deletions
|
|
@ -1,7 +1,7 @@
|
|||
from typing import Literal
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request, UploadFile
|
||||
from pydantic import BaseModel
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from private_gpt.server.ingest.ingest_service import IngestService
|
||||
from private_gpt.server.ingest.model import IngestedDoc
|
||||
|
|
@ -10,14 +10,35 @@ from private_gpt.server.utils.auth import authenticated
|
|||
ingest_router = APIRouter(prefix="/v1", dependencies=[Depends(authenticated)])
|
||||
|
||||
|
||||
class IngestTextBody(BaseModel):
|
||||
file_name: str = Field(examples=["Avatar: The Last Airbender"])
|
||||
text: str = Field(
|
||||
examples=[
|
||||
"Avatar is set in an Asian and Arctic-inspired world in which some "
|
||||
"people can telekinetically manipulate one of the four elements—water, "
|
||||
"earth, fire or air—through practices known as 'bending', inspired by "
|
||||
"Chinese martial arts."
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
class IngestResponse(BaseModel):
|
||||
object: Literal["list"]
|
||||
model: Literal["private-gpt"]
|
||||
data: list[IngestedDoc]
|
||||
|
||||
|
||||
@ingest_router.post("/ingest", tags=["Ingestion"])
|
||||
@ingest_router.post("/ingest", tags=["Ingestion"], deprecated=True)
|
||||
def ingest(request: Request, file: UploadFile) -> IngestResponse:
|
||||
"""Ingests and processes a file.
|
||||
|
||||
Deprecated. Use ingest/file instead.
|
||||
"""
|
||||
return ingest_file(request, file)
|
||||
|
||||
|
||||
@ingest_router.post("/ingest/file", tags=["Ingestion"])
|
||||
def ingest_file(request: Request, 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
|
||||
|
|
@ -40,6 +61,26 @@ def ingest(request: Request, file: UploadFile) -> IngestResponse:
|
|||
return IngestResponse(object="list", model="private-gpt", data=ingested_documents)
|
||||
|
||||
|
||||
@ingest_router.post("/ingest/text", tags=["Ingestion"])
|
||||
def ingest_text(request: Request, body: IngestTextBody) -> IngestResponse:
|
||||
"""Ingests and processes a text, storing its chunks to be used as context.
|
||||
|
||||
The context obtained from files is later used in
|
||||
`/chat/completions`, `/completions`, and `/chunks` APIs.
|
||||
|
||||
A Document will be generated with the given text. The Document
|
||||
ID is returned in the response, together with the
|
||||
extracted Metadata (which is later used to improve context retrieval). That ID
|
||||
can be used to filter the context used to create responses in
|
||||
`/chat/completions`, `/completions`, and `/chunks` APIs.
|
||||
"""
|
||||
service = request.state.injector.get(IngestService)
|
||||
if len(body.file_name) == 0:
|
||||
raise HTTPException(400, "No file name provided")
|
||||
ingested_documents = service.ingest_text(body.file_name, body.text)
|
||||
return IngestResponse(object="list", model="private-gpt", data=ingested_documents)
|
||||
|
||||
|
||||
@ingest_router.get("/ingest/list", tags=["Ingestion"])
|
||||
def list_ingested(request: Request) -> IngestResponse:
|
||||
"""Lists already ingested Documents including their Document ID and metadata.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue