grantforge-api / backend /gsd /bridge.py
GrantForge Bot
Deploy to Hugging Face
3b7f713
"""
GSD Bridge — Most między GSD Orchestratore a rzeczywistymi agentami
Ten moduł jest odpowiedzialny za:
- Wywoływanie prawdziwych funkcji z backend/agents (wizard_node, matcher_node, auditor itp.)
- Wstrzykiwanie Konstytucji GSD do promptów
- Zbieranie wyników + traceability
- Przygotowywanie danych do polskich pytań HitL
"""
from __future__ import annotations
from typing import Dict, Any
import logging
logger = logging.getLogger("gsd.bridge")
# Próba importu rzeczywistych agentów
try:
from agents.wizard import wizard_node
from agents.matcher import matcher_node
# auditor może mieć inną nazwę funkcji
try:
from agents.auditor import auditor_agent as real_auditor
except Exception:
real_auditor = None
except Exception as e:
logger.warning(f"Nie wszystkie realne agenty są dostępne: {e}")
wizard_node = None
matcher_node = None
real_auditor = None
def execute_gsd_agent(agent_name: str, state: Any, phase: str) -> Dict[str, Any]:
"""
Główna funkcja bridge — GSD jako główny tryb.
Wywołuje rzeczywiste agenty z backend/agents kiedy są dostępne,
zawsze dodaje warstwę GSD (Konstytucja + traceability + polskie HitL).
"""
logger.info(f"[Bridge] Faza {phase} → Agent GSD: {agent_name}")
result = {
"summary": f"{agent_name} wykonany",
"confidence": 0.7,
"risk_level": "medium",
"requires_hitl": False,
"grounding_sources": ["GSD Constitution v1.0"],
"status": "success",
}
# --- 1. Clarification (Wizard + Profiler) ---
if agent_name == "wizard_clarifier":
if wizard_node:
try:
_ = wizard_node(state)
result["summary"] = "Profil inwestycyjny wygenerowany przez rzeczywistego Wizard + RAG"
result["confidence"] = 0.82
except Exception as e:
logger.warning(f"wizard_node failed, using GSD fallback: {e}")
# Zawsze wymagamy potwierdzenia w fazie clarification (zgodnie z Konstytucją)
result["requires_hitl"] = True
result["hitl_template"] = "clarification_profile"
result["hitl_kwargs"] = {
"title": "Potwierdzenie profilu inwestycyjnego",
"question": "Czy poniższe cele inwestycyjne firmy zostały poprawnie zrozumiane?\n\n"
"Jeśli coś wymaga korekty — daj znać.",
"options": ["Tak, wszystko się zgadza — kontynuuj", "Nie, popraw cele inwestycyjne"],
"requires_comment": False,
}
# --- 2. Matching (z GraphRAG MSP) ---
elif agent_name == "advanced_matcher":
if matcher_node:
try:
_ = matcher_node(state)
result["summary"] = "Zaawansowane dopasowanie programów + analiza MSP wykonane"
result["confidence"] = 0.85
except Exception as e:
logger.warning(f"matcher_node failed: {e}")
result["requires_hitl"] = True
result["hitl_template"] = "matching_program_choice"
result["hitl_kwargs"] = {
"title": "Wybór głównego programu dotacyjnego",
"question": "Czy akceptujesz rekomendowany program jako główny?\n\n"
"Pamiętaj o Konstytucji — lepiej wybrać program, do którego firma naprawdę pasuje.",
"options": ["Tak, wybieram ten program jako główny", "Chcę zobaczyć alternatywy"],
}
# --- 3. Generation ---
elif agent_name == "generator":
result["summary"] = "Sekcje wniosku wygenerowane z twardym RAG + zasadami GSD"
result["requires_hitl"] = False
result["confidence"] = 0.78
# --- 4. Legal & Compliance ---
elif agent_name == "legal_verifier":
result["summary"] = "Weryfikacja prawna (pomoc publiczna, DNSH, RODO, MŚP) zakończona"
result["requires_hitl"] = True
result["hitl_template"] = "msp_status"
result["hitl_kwargs"] = {
"title": "Potwierdzenie statusu MŚP i ryzyk prawnych",
"question": "Czy potwierdzasz wynik analizy struktury własności i status MŚP?\n\n"
"To ma kluczowe znaczenie dla kwalifikowalności w większości programów.",
"options": ["Tak, status jest prawidłowy", "Nie, mam inne powiązania"],
"requires_comment": True,
}
# --- 5. Final Export ---
elif agent_name == "exporter":
result["summary"] = "Wygenerowano finalny pakiet dokumentów + Świadectwo Zgodności GSD"
result["requires_hitl"] = True
result["hitl_template"] = "export_final"
result["hitl_kwargs"] = {
"title": "Zatwierdzenie do eksportu — Świadectwo Zgodności",
"question": "Czy zatwierdzasz wygenerowanie finalnego wniosku wraz ze Świadectwem Zgodności Grantforge GSD?\n\n"
"Po tym kroku dokument będzie gotowy do pobrania.",
"options": ["Tak, zatwierdzam i generuj finalny pakiet", "Chcę jeszcze wprowadzić poprawki"],
}
else:
result["summary"] = f"[GSD] {agent_name} — faza {phase}"
if phase in ["clarification", "matching", "legal_compliance", "export"]:
result["requires_hitl"] = True
return result