Adala-ai / apps /api /app /seed.py
quantumsquatan's picture
Deploy Adala AI application
ee9de9c verified
Raw
History Blame Contribute Delete
3.03 kB
from __future__ import annotations
import hashlib
import json
import shutil
from pathlib import Path
from typing import Any
from pypdf import PdfReader
from app import db
from app.config import settings
from app.rag.ingestion import ingest_pdf
from app.security import sanitize_filename
def _sha256(path: Path) -> str:
hasher = hashlib.sha256()
with path.open("rb") as handle:
while chunk := handle.read(1024 * 1024):
hasher.update(chunk)
return hasher.hexdigest()
def _read_manifest(seed_dir: Path) -> list[dict[str, Any]]:
manifest_path = seed_dir / "manifest.json"
if not manifest_path.exists():
return []
try:
payload = json.loads(manifest_path.read_text(encoding="utf-8"))
except json.JSONDecodeError:
return []
if not isinstance(payload, list):
return []
return [item for item in payload if isinstance(item, dict)]
def _seed_document_id(digest: str) -> str:
return f"seed_{digest[:24]}"
def seed_documents() -> list[dict[str, Any]]:
seed_dir = settings.seed_documents_dir
if not seed_dir or not seed_dir.exists():
return []
seeded: list[dict[str, Any]] = []
original_ocr_on_upload = settings.ocr_on_upload
settings.ocr_on_upload = False
try:
for item in _read_manifest(seed_dir):
source_path = seed_dir / str(item.get("file") or "")
display_name = str(item.get("name") or source_path.name).strip()
if not source_path.exists() or source_path.suffix.lower() != ".pdf":
continue
digest = _sha256(source_path)
existing = db.get_document_by_sha(digest)
if existing and not Path(existing["path"]).exists():
db.delete_document(existing["id"])
existing = None
if existing:
if existing["name"] != display_name:
existing = db.update_document_name(existing["id"], display_name) or existing
if not db.list_chunks_for_document(existing["id"]):
ingest_pdf(existing["id"], display_name, Path(existing["path"]))
seeded.append(existing)
continue
document_id = _seed_document_id(digest)
target_path = settings.upload_dir / f"{document_id}_{sanitize_filename(source_path.name)}"
shutil.copyfile(source_path, target_path)
pages = len(PdfReader(str(target_path)).pages)
document = db.create_document(document_id, display_name, target_path, digest, pages)
chunk_count = ingest_pdf(document_id, display_name, target_path)
if chunk_count == 0:
db.delete_document(document_id)
target_path.unlink(missing_ok=True)
continue
seeded.append(document)
finally:
settings.ocr_on_upload = original_ocr_on_upload
return seeded