grantforge-api / backend /core /context /context_bus.py
GrantForge Bot
Deploy sha-9a5957fcdef15b7e2623f8b147cda6026475aee0 — source build (no GHCR)
3a3734f
Raw
History Blame Contribute Delete
3.79 kB
"""GUS -> GSD context propagation."""
from __future__ import annotations
from typing import Any, Dict, List
CONTEXT_BUS_VERSION = "1.0"
KNOWN_PROFILE_FIELDS = {
"nip",
"name",
"pkd",
"pkd_codes",
"size",
"voivodeship",
"region",
"address",
"krs",
"entity_type",
}
def build_context_payload(external_context: dict | None) -> dict:
external_context = external_context or {}
company_data = dict(external_context.get("company_data") or {})
gaps = list(
external_context.get("data_gaps")
or external_context.get("gaps")
or []
)
return {
"company_data": company_data,
"gaps": gaps,
"registry_enrichment": external_context.get("registry_enrichment") or {},
"credibility_flags": external_context.get("credibility_flags") or {},
"msp_analysis": external_context.get("msp_analysis") or {},
}
def propagate_to_gsd_blackboard(blackboard: dict | None, external_context: dict | None) -> dict:
bb = dict(blackboard or {})
payload = build_context_payload(external_context)
company_data = payload.get("company_data") or {}
if company_data:
merged_company = dict(bb.get("company_data") or {})
for key, value in company_data.items():
if value not in (None, "", [], {}):
merged_company[key] = value
bb["company_data"] = merged_company
gaps = payload.get("gaps") or []
if gaps:
merged_gaps = list(bb.get("data_gaps") or [])
for gap in gaps:
if gap not in merged_gaps:
merged_gaps.append(gap)
bb["data_gaps"] = merged_gaps
if payload.get("registry_enrichment"):
bb["registry_enrichment"] = payload["registry_enrichment"]
if payload.get("credibility_flags"):
bb["credibility_flags"] = payload["credibility_flags"]
if payload.get("msp_analysis"):
bb["msp_analysis"] = payload["msp_analysis"]
bb["context_bus_version"] = CONTEXT_BUS_VERSION
return bb
def _is_known(field: str, company: dict, gaps: list) -> bool:
company = company or {}
if field == "pkd":
pkd = company.get("pkd_codes") or company.get("pkd") or []
if isinstance(pkd, str):
return bool(pkd.strip())
return bool(pkd)
if field == "region":
return bool(company.get("voivodeship") or company.get("region"))
if field == "nip":
return bool(company.get("nip"))
if field == "description":
industry = (company.get("industry") or "").strip()
if len(industry) >= 20:
return True
for gap in gaps or []:
if "opis" in str(gap).lower():
return False
return bool(industry)
return False
def filter_clarifying_questions(
questions: List[str],
company: dict,
gaps: list | None = None,
) -> List[str]:
"""Skip questions for fields already present in company profile."""
gaps = gaps or []
result: List[str] = []
for question in questions or []:
if not question:
continue
q_lower = question.lower()
skip = False
if "pkd" in q_lower and _is_known("pkd", company, gaps):
skip = True
if ("wojew" in q_lower or "region" in q_lower) and _is_known("region", company, gaps):
skip = True
if "nip" in q_lower and _is_known("nip", company, gaps):
skip = True
if (
"opis" in q_lower
or "cel projektu" in q_lower
or "działalno" in q_lower
or ("główn" in q_lower and "pkd" in q_lower)
) and _is_known("description", company, gaps):
skip = True
if not skip:
result.append(question)
return result