KI-Konzil/_bmad-output/implementation-artifacts/stories/5-2-pdf-upload-chromadb-ingestion.md
copilot-swe-agent[bot] d4cfb34423 Changes before error encountered
Co-authored-by: Kenearos <86194771+Kenearos@users.noreply.github.com>
2026-03-12 15:00:09 +00:00

2.2 KiB
Raw Blame History

Story 5.2: PDF-Upload & ChromaDB-Ingestion

Status: done

Story

Als Nutzer, möchte ich ein PDF hochladen, das als Wissensquelle für Agents dient, so dass Agents auf Inhalte aus langen Dokumenten zugreifen können.

Acceptance Criteria

  1. POST /api/councils/upload-pdf mit PDF → chunks_ingested in Response
  2. Nicht-PDF-Datei → 400 Bad Request
  3. PDF wird in Chunks aufgeteilt (PyPDF + LangChain TextSplitter) und in ChromaDB gespeichert
  4. pdf_search(query) gibt Top-K semantisch ähnliche Chunks zurück
  5. Agent mit tools.pdf_reader = true bekommt pdf_search-Tool gebunden

Tasks / Subtasks

  • Task 1: tools/pdf_reader.py (AC: 3, 4)
    • Subtask 1.1: ingest_pdf(file_path) → Chunks → ChromaDB
    • Subtask 1.2: pdf_search(query, top_k) → semantische Suche
    • Subtask 1.3: _get_chroma_collection() mit In-Memory-Cache
  • Task 2: POST /api/councils/upload-pdf Endpunkt in routes.py (AC: 1, 2)
    • Subtask 2.1: UploadFile + MIME-Type-Validierung
    • Subtask 2.2: Temp-Datei erstellen, ingest_pdf() aufrufen, bereinigen
  • Task 3: Tool-Binding im dynamischen Graph-Builder (AC: 5)
  • Task 4: Unit-Tests (gemockt) (AC: 14)

Dev Notes

  • ChromaDB PersistentClient mit CHROMA_PERSIST_DIR-Umgebungsvariable
  • Cosine-Similarity als Distance-Metrik: {"hnsw:space": "cosine"}
  • _collection_cache dict verhindert mehrfache ChromaDB-Initialisierungen
  • Tests mocken chromadb.PersistentClient komplett

Project Structure Notes

  • backend/tools/pdf_reader.py
  • backend/tests/test_tools.py

References

  • [Source: _bmad-output/planning-artifacts/architecture.md#ADR-006]
  • [Source: _bmad-output/planning-artifacts/prd.md#FR-05.3]

Dev Agent Record

Agent Model Used

Amelia (💻 BMAD Dev Agent)

Completion Notes List

  • UploadFile.content_type für MIME-Validierung; .filename.endswith(".pdf") als Fallback.
  • tempfile.NamedTemporaryFile mit delete=False für sicheres Temp-File-Handling.
  • ChromaDB-Kollektion wird pro collection_name gecacht.

File List

  • backend/tools/pdf_reader.py
  • backend/tests/test_tools.py