Spaces:
Running
Running
File size: 2,161 Bytes
afd56bc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks
from pydantic import BaseModel, Field
from endpoints.projects import get_db
from core.projects.models import Project
from core.subscription.middleware import verify_token
from core.graph_rag.msp_analyzer import msp_analyzer
import logging
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/graph", tags=["graph_rag"])
class MSPAnalysisRequest(BaseModel):
project_id: str
krs: str = Field(
description="Numer KRS firmy do analizy (np. 0000111111 dla testu)"
)
@router.post("/analyze_msp")
async def analyze_msp(
request: MSPAnalysisRequest,
background_tasks: BackgroundTasks,
token_data: dict = Depends(verify_token),
db=Depends(get_db),
):
"""
Analizuje status MŚP firmy o danym numerze KRS poprzez budowę grafu w Neo4j
i kalkulację powiązań własnościowych. Wynik jest zapisywany w kontekście projektu.
"""
clerk_id = token_data.get("sub")
project = (
db.query(Project)
.filter(Project.id == request.project_id, Project.clerk_user_id == clerk_id)
.first()
)
if not project:
raise HTTPException(
status_code=404, detail="Projekt nie istnieje lub brak dostępu"
)
try:
# 1. Zbudowanie grafu w Neo4j na podstawie danych z Rejestr.io
# (Wymaga połączenia do AuraDB. Jeśli nie ma, zwróci error w kolejnym kroku)
await msp_analyzer.build_graph_for_company(request.krs, depth=1)
# 2. Wykonanie analizy grafowej
report = msp_analyzer.analyze_msp_status(request.krs)
# 3. Zapisz raport do kontekstu projektu (jeśli się powiodło)
if report.get("status") == "ok":
external_context = project.external_context or {}
external_context["msp_report"] = report
project.external_context = external_context
db.commit()
return report
except Exception as e:
logger.error(
f"Error during MSP Analysis for KRS {request.krs}: {e}", exc_info=True
)
return {"status": "error", "message": str(e)}
|