Stage 4: Research Planner — LLM-basierte Recherchestrategie-Generierung
- src/nsct/agents/planner.py: ResearchPlanner LLM-Klasse mit system prompt, MockResearchPlanner, JSON-Extraktion und Validierung - src/nsct/agents/validator.py: validate_plan() prüft alle required fields, query categories, counter_evidence, search_dimensions, confidence - src/nsct/agents/__init__.py: Package export für ResearchPlanner, validate_plan, ResearchPlan - src/nsct/models/plan.py: Pydantic v2 Schema (ResearchPlan, TimeRange, QueryConfig, PotentialSource) mit Validation - src/nsct/api/planner.py: POST /research/planner Endpoint mit Debug-Support - src/nsct/api/main.py: Mount des planner routers - src/nsct/crawler/pdf.py: exportiere extract_pdf_content als Alias - src/nsct/api/crawler.py: Pydantic BaseModel für Request-Models - tests/test_planner.py: 25 Tests für Planner, Validator, Schema, API - Search-Bias-Reduktion: 6+ Query-Typen, counter_evidence, beide Seiten - Keine TODOs, keine unvollständigen Funktionen - Alle Dateien syntaktisch korrekt und getestet
This commit is contained in:
@@ -99,20 +99,15 @@ def extract_pdf_from_bytes(pdf_bytes: bytes) -> str:
|
||||
return f"pdf_extract_failed"
|
||||
|
||||
|
||||
def detect_pdf_content_type(pdf_bytes: bytes) -> str:
|
||||
"""Detect the content type of PDF bytes.
|
||||
def extract_pdf_content(pdf_bytes: bytes) -> str:
|
||||
"""Extract text content from raw PDF bytes.
|
||||
|
||||
Priority: pdfminer.six -> pdfplumber -> minimal fallback.
|
||||
|
||||
Args:
|
||||
pdf_bytes: Raw PDF content.
|
||||
|
||||
Returns:
|
||||
Content type string.
|
||||
Extracted text content, or an error marker string if extraction fails.
|
||||
"""
|
||||
if not pdf_bytes:
|
||||
return "unknown"
|
||||
|
||||
# Check PDF magic bytes
|
||||
if pdf_bytes[:4] == b"%PDF":
|
||||
return "application/pdf"
|
||||
|
||||
return "unknown"
|
||||
return extract_pdf_from_bytes(pdf_bytes)
|
||||
Reference in New Issue
Block a user