debug mode im router

This commit is contained in:
Lars 2025-12-11 11:35:27 +01:00
parent 54e38d58c3
commit 06f77fe8b7

View File

@ -1,25 +1,21 @@
""" """
app/routers/ingest.py app/routers/ingest.py - DEBUG VERSION
API-Endpunkte für WP-11 (Discovery & Persistence).
Fixed Async/Await Integration with Discovery Service.
""" """
import os import os
import time import time
import logging import logging
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from pydantic import BaseModel from pydantic import BaseModel
from typing import Optional, Dict, Any from typing import Optional, List, Dict, Any
from app.core.ingestion import IngestionService from app.core.ingestion import IngestionService
# WICHTIG: Wir nutzen wieder den spezialisierten DiscoveryService from app.core.retriever import Retriever
from app.services.discovery import DiscoveryService from app.models.dto import QueryRequest
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
router = APIRouter() router = APIRouter()
# --- DTOs --- # --- DTOs ---
class AnalyzeRequest(BaseModel): class AnalyzeRequest(BaseModel):
text: str text: str
type: str = "concept" type: str = "concept"
@ -35,20 +31,61 @@ class SaveResponse(BaseModel):
note_id: str note_id: str
stats: Dict[str, Any] stats: Dict[str, Any]
# --- Services ---
discovery_service = DiscoveryService()
# --- Endpoints --- # --- Endpoints ---
@router.post("/analyze") @router.post("/analyze")
async def analyze_draft(req: AnalyzeRequest): async def analyze_draft(req: AnalyzeRequest):
""" """
WP-11 Intelligence: Liefert Link-Vorschläge (Exact + Semantic). WP-11 Intelligence: Liefert Link-Vorschläge.
DEBUG MODE: Threshold gesenkt, Logging erhöht.
""" """
try: try:
# Wir delegieren an den Service, der Exact Matching, Config und Semantik beherrscht retriever = Retriever()
result = await discovery_service.analyze_draft(req.text, req.type) suggestions = []
return result
query_text = req.text[:400]
logger.info(f"ANALYZING TEXT: '{query_text}' (Type: {req.type})")
if not query_text.strip():
return {"suggestions": []}
# Wir suchen
hits_result = await retriever.search(QueryRequest(query=query_text, top_k=5, mode="hybrid"))
logger.info(f"RETRIEVER FOUND: {len(hits_result.results)} raw hits")
seen_titles = set()
for hit in hits_result.results:
# Titel holen
title = hit.payload.get("title") or hit.payload.get("note_id") or hit.node_id
# Logging für jeden Treffer
logger.info(f" -> CHECK HIT: {title} | Score: {hit.total_score:.4f}")
if not title or title in seen_titles:
continue
seen_titles.add(title)
# Edge Logic
edge_kind = "related_to"
if req.type == "project": edge_kind = "depends_on"
if req.type == "decision": edge_kind = "references"
# --- ÄNDERUNG: THRESHOLD GESENKT ---
# War vorher 0.65. Jetzt 0.3 für Tests.
if hit.total_score > 0.3:
suggestions.append({
"target_title": title,
"target_id": hit.node_id,
"suggested_markdown": f"[[rel:{edge_kind} {title}]]",
"reason": f"Semantisch ähnlich ({hit.total_score:.2f})",
"type": "semantic"
})
else:
logger.info(f" -> SKIPPED (Score too low)")
logger.info(f"RETURNING {len(suggestions)} SUGGESTIONS")
return {"suggestions": suggestions}
except Exception as e: except Exception as e:
logger.error(f"Analyze failed: {e}", exc_info=True) logger.error(f"Analyze failed: {e}", exc_info=True)
@ -56,36 +93,24 @@ async def analyze_draft(req: AnalyzeRequest):
@router.post("/save", response_model=SaveResponse) @router.post("/save", response_model=SaveResponse)
async def save_note(req: SaveRequest): async def save_note(req: SaveRequest):
""" """WP-11 Persistence"""
WP-11 Persistence: Speichert Markdown physisch und indiziert es sofort.
"""
try: try:
# 1. Pfad-Setup
vault_root = os.getenv("MINDNET_VAULT_ROOT", "./vault") vault_root = os.getenv("MINDNET_VAULT_ROOT", "./vault")
abs_vault_root = os.path.abspath(vault_root) abs_vault_root = os.path.abspath(vault_root)
if not os.path.exists(abs_vault_root): if not os.path.exists(abs_vault_root):
try: os.makedirs(abs_vault_root, exist_ok=True)
os.makedirs(abs_vault_root, exist_ok=True)
except Exception:
raise HTTPException(status_code=500, detail=f"Vault root missing and cannot create: {abs_vault_root}")
# 2. Filename
final_filename = req.filename final_filename = req.filename
if not final_filename: if not final_filename:
final_filename = f"draft_{int(time.time())}.md" final_filename = f"draft_{int(time.time())}.md"
# 3. Ingestion Service (Async)
ingest_service = IngestionService() ingest_service = IngestionService()
logger.info(f"Saving {final_filename}")
logger.info(f"Saving {final_filename} to {req.folder}")
# Async Call zum Ingestion Service result = await ingest_service.save_and_index(
result = await ingest_service.create_from_text(
markdown_content=req.markdown_content, markdown_content=req.markdown_content,
filename=final_filename, filename=final_filename
vault_root=abs_vault_root,
folder=req.folder
) )
if result.get("status") == "error": if result.get("status") == "error":
@ -93,12 +118,9 @@ async def save_note(req: SaveRequest):
return SaveResponse( return SaveResponse(
status="success", status="success",
file_path=result.get("path", "unknown"), file_path=result.get("file_path", "unknown"),
note_id=result.get("note_id", "unknown"), note_id=result.get("note_id", "unknown"),
stats={ stats=result.get("stats", {})
"chunks": result.get("chunks_count", 0),
"edges": result.get("edges_count", 0)
}
) )
except HTTPException as he: except HTTPException as he: