""" app/routers/ingest.py API-Endpunkte für WP-11 (Discovery & Persistence). """ import os import time from fastapi import APIRouter, HTTPException from pydantic import BaseModel from typing import Optional, List, Dict, Any from app.core.ingestion import IngestionService from app.services.discovery import DiscoveryService router = APIRouter() # --- DTOs --- class AnalyzeRequest(BaseModel): text: str type: str = "concept" class SaveRequest(BaseModel): markdown_content: str filename: Optional[str] = None # Optional, fallback auf Timestamp folder: str = "00_Inbox" # Zielordner class SaveResponse(BaseModel): status: str file_path: str note_id: str stats: Dict[str, Any] # --- Services --- discovery_service = DiscoveryService() @router.post("/analyze") async def analyze_draft(req: AnalyzeRequest): """ WP-11 Intelligence: Analysiert einen Entwurf und liefert Link-Vorschläge. """ try: result = await discovery_service.analyze_draft(req.text, req.type) return result except Exception as e: raise HTTPException(status_code=500, detail=f"Analysis failed: {str(e)}") @router.post("/save", response_model=SaveResponse) async def save_note(req: SaveRequest): """ WP-11 Persistence: Speichert Markdown physisch und indiziert es in Qdrant. """ # 1. Vault Root ermitteln vault_root = os.getenv("MINDNET_VAULT_ROOT", "./vault") if not os.path.exists(vault_root): # Fallback relative paths if os.path.exists("vault"): vault_root = "vault" elif os.path.exists("../vault"): vault_root = "../vault" else: raise HTTPException(status_code=500, detail="Vault root not configured or missing") # 2. Filename generieren falls fehlend final_filename = req.filename if not final_filename: final_filename = f"draft_{int(time.time())}.md" # 3. Ingestion Service nutzen ingest_service = IngestionService() result = ingest_service.create_from_text( markdown_content=req.markdown_content, filename=final_filename, vault_root=os.path.abspath(vault_root), folder=req.folder ) if result.get("status") == "error": raise HTTPException(status_code=500, detail=result.get("error")) return SaveResponse( status="success", file_path=result["path"], note_id=result.get("note_id", "unknown"), stats={ "chunks": result.get("chunks_count", 0), "edges": result.get("edges_count", 0) } )