mindnet/app/routers/ingest.py

89 lines
2.7 KiB
Python
Raw Normal View History

2025-12-10 22:05:35 +01:00
"""
2025-12-11 12:04:08 +01:00
app/routers/ingest.py
API-Endpunkte für WP-11 (Discovery & Persistence).
2025-12-11 13:50:40 +01:00
Delegiert an Services.
2025-12-10 22:05:35 +01:00
"""
import os
import time
2025-12-11 08:18:41 +01:00
import logging
2025-12-10 22:05:35 +01:00
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
2025-12-11 12:04:08 +01:00
from typing import Optional, Dict, Any
2025-12-10 22:05:35 +01:00
from app.core.ingestion import IngestionService
2025-12-11 13:50:40 +01:00
from app.services.discovery import DiscoveryService
2025-12-10 22:05:35 +01:00
2025-12-11 10:46:37 +01:00
logger = logging.getLogger(__name__)
2025-12-10 22:05:35 +01:00
router = APIRouter()
2025-12-11 13:50:40 +01:00
# Services Init (Global oder via Dependency Injection)
discovery_service = DiscoveryService()
2025-12-11 12:04:08 +01:00
2025-12-10 22:05:35 +01:00
class AnalyzeRequest(BaseModel):
text: str
type: str = "concept"
class SaveRequest(BaseModel):
markdown_content: str
2025-12-11 08:18:41 +01:00
filename: Optional[str] = None
2025-12-11 10:46:37 +01:00
folder: str = "00_Inbox"
2025-12-10 22:05:35 +01:00
class SaveResponse(BaseModel):
status: str
file_path: str
note_id: str
stats: Dict[str, Any]
@router.post("/analyze")
async def analyze_draft(req: AnalyzeRequest):
"""
2025-12-11 13:50:40 +01:00
WP-11 Intelligence: Liefert Link-Vorschläge via DiscoveryService.
2025-12-10 22:05:35 +01:00
"""
try:
2025-12-11 13:50:40 +01:00
# Hier rufen wir jetzt den verbesserten Service auf
result = await discovery_service.analyze_draft(req.text, req.type)
return result
2025-12-10 22:05:35 +01:00
except Exception as e:
2025-12-11 08:18:41 +01:00
logger.error(f"Analyze failed: {e}", exc_info=True)
2025-12-11 12:04:08 +01:00
return {"suggestions": [], "error": str(e)}
2025-12-10 22:05:35 +01:00
@router.post("/save", response_model=SaveResponse)
async def save_note(req: SaveRequest):
2025-12-11 12:04:08 +01:00
"""
2025-12-11 13:50:40 +01:00
WP-11 Persistence: Speichert und indiziert.
2025-12-11 12:04:08 +01:00
"""
2025-12-11 08:18:41 +01:00
try:
vault_root = os.getenv("MINDNET_VAULT_ROOT", "./vault")
abs_vault_root = os.path.abspath(vault_root)
if not os.path.exists(abs_vault_root):
2025-12-11 13:50:40 +01:00
try: os.makedirs(abs_vault_root, exist_ok=True)
except: pass
2025-12-10 22:05:35 +01:00
2025-12-11 13:50:40 +01:00
final_filename = req.filename or f"draft_{int(time.time())}.md"
2025-12-11 08:18:41 +01:00
ingest_service = IngestionService()
2025-12-11 12:04:08 +01:00
2025-12-11 13:50:40 +01:00
# Async Call
result = await ingest_service.create_from_text(
markdown_content=req.markdown_content,
filename=final_filename,
vault_root=abs_vault_root,
folder=req.folder
)
2025-12-11 08:18:41 +01:00
if result.get("status") == "error":
raise HTTPException(status_code=500, detail=result.get("error"))
return SaveResponse(
status="success",
2025-12-11 13:50:40 +01:00
file_path=result.get("path", "unknown"),
2025-12-11 08:18:41 +01:00
note_id=result.get("note_id", "unknown"),
2025-12-11 13:50:40 +01:00
stats={
"chunks": result.get("chunks_count", 0),
"edges": result.get("edges_count", 0)
}
2025-12-11 08:18:41 +01:00
)
2025-12-11 13:50:40 +01:00
except HTTPException as he: raise he
2025-12-11 08:18:41 +01:00
except Exception as e:
logger.error(f"Save failed: {e}", exc_info=True)
raise HTTPException(status_code=500, detail=f"Save failed: {str(e)}")