import logging from typing import Dict, Any from langchain_core.tools import tool from integrations.krs_client import KRSClient from rag_pipeline.graph_store import graph_store logger = logging.getLogger(__name__) @tool def analyze_company_network(krs_number: str) -> Dict[str, Any]: """ Analizuje strukturę powiązań kapitałowych i osobowych firmy na podstawie numeru KRS. Narzędzie pobiera oficjalne dane z API KRS (odpis aktualny), dodaje je do bazy grafowej Neo4j, a następnie wyszukuje jakiekolwiek powiązania weryfikujące status MŚP (związki z innymi firmami). Zwraca słownik zawierający dane rejestrowe firmy oraz zidentyfikowaną siatkę powiązań (wraz ze wspólnikami i zarządem). """ logger.info(f"Rozpoczęcie analizy powiązań dla KRS: {krs_number}") # 1. Pobierz aktualne dane z publicznego API KRS odpis_json = KRSClient.get_odpis_aktualny(krs_number) if not odpis_json: return { "error": f"Nie udało się pobrać odpisu dla KRS {krs_number}. Upewnij się, że wpisany KRS jest poprawny." } # 2. Przekształć JSON w węzły struktur (Wspólnicy, Zarząd) extracted_data = KRSClient.extract_graph_relations(odpis_json) if not extracted_data: return { "error": "Format odpisu KRS był niepoprawny lub nie wspierany w obecnej strukturze." } # 3. Zapisz/zaktualizuj graf Neo4j graph_store.merge_company_graph(extracted_data) # 4. Sprawdź powiązania grafowe - szukaj firm zależnych, powiązanych osób network = graph_store.check_company_network(krs_number) # Zwróć zagregowany profil do Agenta (np. Audytora) return { "podmiot": { "nazwa": extracted_data.get("nazwa"), "krs": extracted_data.get("krs"), "nip": extracted_data.get("nip"), "kapital_zakladowy": extracted_data.get("kapitalZakladowy"), }, "wspolnicy_bezposredni": [ f"{w.get('imiona')} {w.get('nazwa')} (Spółka: {w.get('is_spolka')})" for w in extracted_data.get("wspolnicy", []) ], "zarzad": [ f"{z.get('imiona')} {z.get('nazwa')} - {z.get('funkcja')}" for z in extracted_data.get("zarzad", []) ], "wykryte_relacje_grafowe": network if network else "Brak zidentyfikowanych powiązań sieciowych w bazie GraphRAG poza bezpośrednio ujawnionymi w odpisie.", "rekomendacja_msp": "UWAGA: Jeżeli w sekcji 'wykryte_relacje_grafowe' zidentyfikowano inne spółki, kapitał, zatrudnienie lub przychody z tych firm mogą wliczać się w weryfikację statusu MŚP analizowanej firmy!", }