docs_parser is a FastAPI-based document ingestion and search service.
It creates indexing tasks for documents stored in Google Drive, parses content from PDF/DOC/DOCX files, stores page-level text in Typesense, and provides a search API over indexed pages.
A browser-based operator UI is available separately: docs-parser-dashboard (search and task submission against this API; point its VITE_API_URL at this service and reuse API_TOKEN).
- Python 3.13
- FastAPI + Starlette (HTTP API)
- Pydantic / pydantic-settings (config and models)
- Typesense (document storage and full-text search)
- Google Drive API (file/folder ingestion source)
- PDF and OCR:
pypdfpdf2imagepytesseract
- Word parsing:
python-docx - Docker + Docker Compose (local orchestration)
- Auth middleware checks bearer token from
Authorizationheader. POST /v1/taskscreates an investigate task for a Google Drive folder/file.- Worker
investigatescans a Google Drive folder and creates upload tasks per file. - Worker
uploaddownloads each file, selects parser by extension, extracts text by pages/chunks, and saves documents to Typesense collection for the project. POST /v1/searchperforms full-text search in the selected project collection and returns matching pages with snippets/highlights.
main.py- FastAPI app initializationmiddlewares.py- token authentication middlewareapi/- API routes, schemas, dependenciesservices/- business logic (FileUploader,TextSearch)tasks/- background task runners (investigate,upload)lib/converter/- PDF/Word converterslib/typesense/client.py- async wrapper around Typesense Python clientdb/typesense/models.py- Typesense documents/task modelsrun_task.py- starts worker loopcreate_task.py- quick script to enqueue investigate task
- Client creates investigate task (
/v1/tasks). investigateworker reads folder content from Google Drive and creates upload tasks intaskscollection.uploadworker processes waiting upload tasks:
- downloads file from Google Drive
- chooses parser by extension (
pdf,doc,docx) - detects PDF text-vs-image path (OCR if image-based)
- saves extracted pages into project collection in Typesense
- Client searches indexed data via
/v1/search.
Copy env.example to .env and fill values:
TYPESENSE_API_KEY=your_typesense_key
GOOGLE_SERVICE_ACCOUNT_FILE=/absolute/path/to/service-account.json
API_TOKEN=your_api_bearer_tokenAlso used in Docker Compose:
TYPESENSE_HOST(defaults tolocalhost, compose usesdocs_parser_typesense)TYPESENSE_PORT(default8108)TYPESENSE_PROTOCOL(defaulthttp)TYPESENSE_DATA(host directory for persistent Typesense data)
- Install dependencies:
pip install -r requirements.txt- Make sure these services/tools are available:
- running Typesense instance
- Tesseract OCR + Poppler binaries (required for image PDF OCR flow)
- Export env vars or create
.env. - Start API:
uvicorn main:app --host 0.0.0.0 --port 8000 --reload- Start workers in separate terminals:
python run_task.py --task=investigate
python run_task.py --task=upload- Set env vars (
.envfile recommended), including:
TYPESENSE_API_KEYTYPESENSE_DATAGOOGLE_SERVICE_ACCOUNT_FILEAPI_TOKEN
- Start all services:
docker compose up --buildThis starts:
docs_parser_typesensedocs_parser_backenddocs_parser_investigate_taskdocs_parser_upload_task
API will be exposed on http://localhost:8083.
Base prefix: /v1
POST /v1/tasks
Request:
{
"lang": "ukr",
"file_path": "https://drive.google.com/drive/folders/<folder_id>",
"project_name": "kgb_project",
"provider": "google"
}Response:
{}POST /v1/search
Request:
{
"query": "архів",
"project_name": "kgb_project"
}Response (example):
[
{
"file_path": "...",
"book_name": "...",
"page_number": 12,
"page_content": "...",
"snippets": ["..."]
}
]Send bearer token header for protected routes:
Authorization: Bearer <API_TOKEN>If token is missing/invalid, API returns 401 Unauthorized.
python run_task.py --task=investigate- run investigate workerpython run_task.py --task=upload- run upload workerpython create_task.py <google_file_or_folder_id_or_url> <lang>- enqueue quick investigate task (uses hardcoded project namekgb_project)
- Collections in Typesense are created dynamically (
tasksplus per-project collections). - Current provider implementation is Google Drive only.
- Supported file formats by uploader mapping:
pdf,doc,docx.