grantforge-api / backend /docs /FILE_ANALYSIS.md
GrantForge Bot
Deploy sha-9a5957fcdef15b7e2623f8b147cda6026475aee0 — source build (no GHCR)
3a3734f
|
Raw
History Blame Contribute Delete
6.49 kB
# Analiza struktury GrantForge — Hybrid Grant Intelligence System
Data: 2026-06-23 | Ścieżka wdrożenia: `grantforge-patch/backend/`
## 1. Modele grantów i naborów
| Plik | Rola |
|------|------|
| `core/grants/models.py` | `Grant` ORM (pełne pola HGIS), `GrantVersion`, `ResearchJob`, `HumanVerificationItem` |
| `core/grants/wyszukiwarka_mapper.py` | Mapowanie rekordów JSON WYSZUKIWARKA → payload API (PKD, regiony, linki, program_year) |
| `core/grants/wyszukiwarka_import.py` | Upsert DB, wersjonowanie przy imporcie, enrichment; **nie** seeduje snapshotów research |
| `core/grants/eligibility_fields.py` | Parser PKD, beneficjentów, regionów, rozmiarów firm |
| `core/grants/catalog_visibility.py` | Jedno źródło prawdy: `resolve_catalog_hidden`, `is_catalog_visible`, wiek >3 lat |
| `core/grants/catalog_filters.py` | Re-eksport widoczności + `build_catalog_description` |
| `core/grants/completeness.py` | `compute_completeness`, `grant_dict_from_row` |
| `core/grants/versioning.py` | `detect_field_changes`, `record_changes`, `get_recent_versions` |
| `core/grants/enrichment.py` | Uzupełnianie pól z surowego JSON (regulamin, linki, PKD) |
| `core/grants/research_snapshot.py` | Pure helpers: hash/diff snapshotów dla Live Research |
## 2. Endpointy wyszukiwania i rekomendacji
| Plik | Endpointy / funkcje |
|------|---------------------|
| `endpoints/grants_nabory_enhanced.py` | `GET /api/grants/nabory` — filtry + `hybrid=true` |
| `endpoints/grants_catalog.py` | `POST /catalog/search`, stats — `use_hybrid` |
| `endpoints/grants_intelligence.py` | `/intelligence/dashboard`, `/recommendations`, `/hybrid-search`, `/research/*`, `/verification/*` |
| `endpoints/grants_loader.py` | Rejestracja routerów grants |
| `core/grants/catalog_service.py` | `nabory_search`, `search_catalog`, `get_catalog_stats`, filtry PKD |
| `core/grants/hybrid_search.py` | FTS + Pinecone (gdy klucz) lub `fts_only` bez klucza |
| `core/grants/regulation_backfill.py` | Backfill `regulation_url` z raw_data + raport kompletności + próbka HTTP |
| `core/grants/catalog_vector_index.py` | Indeksowanie grantów do Pinecone (`grants_catalog` namespace) |
| `core/grants/recommendations.py` | `recommend_grants_for_company`, `score_grant_for_company` + `why_it_fits` |
## 3. Agenci LangGraph
| Plik | Rola |
|------|------|
| `agents/generator_agent.py` | Wzorzec StateGraph (generator wniosków) |
| `agents/researcher.py` | `researcher_node` — katalog PostgreSQL |
| `agents/grant_research_agent.py` | HGIS: `analyze_changes``enrich_metadata``summarize``recommend` |
| `agents/matcher.py` | Dopasowanie grantów do profilu firmy (istniejący) |
## 4. Scraping / sync / research
| Plik | Rola |
|------|------|
| `rag_pipeline/scraper.py` | Scraping treści programów |
| `rag_pipeline/refresh_job.py` | `ContentRefreshJob` + hash diff URL |
| `rag_pipeline/change_detector.py` | Hash diff treści (plik JSON) |
| `rag_pipeline/vector_store.py` | Pinecone store |
| `rag_pipeline/hybrid_retriever.py` | RRF FTS + vector |
| `core/grants/live_research.py` | `detect_grant_changes`, `establish_research_baselines`, kolejka `research_jobs` |
| `core/grants/source_research.py` | Organic refresh: dwa snapshoty agregatora + `detect_url_content_changes` |
| `core/grants/hybrid_search_status.py` | Jawny status FTS vs Pinecone (`get_hybrid_search_status`) |
| `core/grants/credibility.py` | `score_source_credibility` |
| `core/grants/sync_service.py` | `sync_wyszukiwarka_catalog`, live scrape |
| `core/grants/catalog_freshness.py` | Sprawdzanie URL |
| `core/grants/human_verification.py` | Human Verification Queue |
| `scripts/full_catalog_cron.py` | Cron katalogu |
| `scripts/sync_grants_cron.py` | Sync grantów |
| `scripts/import_wyszukiwarka.py` | CLI import |
| `bootstrap_wyszukiwarka.py` | Hook bootstrap przy starcie |
## 5. Admin / diagnostyka
| Plik | Rola |
|------|------|
| `endpoints/admin_diagnostics.py` | Diagnostyka admin (istniejący) |
| `endpoints/grants_intelligence.py` | Dashboard HGIS (4 warstwy) |
| `grantforge_bootstrap.py` | Migracja HGIS przy starcie |
| `scripts/migrate_hgis_schema.py` | Idempotentna migracja kolumn/tabel |
| `scripts/verify_hgis.py` | Gating verification (6 kroków) |
| `scripts/verify_catalog.py` | Weryfikacja katalogu |
| `scripts/test_intelligence_local.py` | Lokalne endpointy bez serwera HTTP |
## 6. Testy (shipped)
| Plik | Zakres |
|------|--------|
| `tests/test_hgis.py` | completeness, versioning, recs, agent, filtry (fixture PARP + verify DB) |
| `tests/fixtures/real_grant_sample.json` | Rzeczywisty rekord PARP z `dotacje-latest.json` |
| `tests/test_research_snapshot.py` | Unit snapshot helpers |
| `tests/test_wyszukiwarka_pipeline.py` | Import JSON → baseline → file mutation → detect |
| `tests/test_catalog_filters.py` | Widoczność, catalog_hidden |
| `tests/test_catalog_pipeline.py` | Pipeline katalogu |
## 7. Przepływ danych (skrót)
```
dotacje-latest.json
→ wyszukiwarka_mapper (map)
→ enrichment + catalog_visibility
→ wyszukiwarka_import (upsert, NO snapshot seed)
→ establish_research_baselines (detect_grant_changes)
→ run_organic_aggregator_refresh (older JSON → newer JSON, real field diffs)
→ [cron] detect_grant_changes + detect_url_content_changes
→ versioning + research_jobs + HVQ
→ grant_research_agent (LangGraph)
→ nabory_search / hybrid_search / recommendations
```
## 8. Ograniczenia środowiska (ujawnione w verify)
| Obszar | Stan w sandbox |
|--------|----------------|
| `regulation_url` w DB | ~26% widocznych rekordów (limit źródła JSON ~23% surowych) |
| `PINECONE_API_KEY` | Brak → `search_mode=fts_only`; semantic wymaga klucza (`hybrid_search_status`) |
| Organic change detection | `dotacje-2026-06-20.json``dotacje-latest.json`: 149 zmian w verify |
| Mutacje importu | Tylko przez edycję pliku JSON (brak `mutations=` w API) |
| Neo4j / pełny server HTTP | Opcjonalne; verify używa direct function calls |
## 9. Zmienne środowiskowe (HGIS)
| Zmienna | Domyślnie | Opis |
|---------|-----------|------|
| `ENABLE_LIVE_RESEARCH` | `true` | Warstwa 2 |
| `ENABLE_GRANT_RESEARCH_AGENT` | `true` | LangGraph agent |
| `ENABLE_HYBRID_SEARCH` | `true` | Hybrydowe wyszukiwanie |
| `ENABLE_PINECONE_SEMANTIC` | `true` | Wymaga `PINECONE_API_KEY` |
| `HUMAN_VERIF_QUEUE` | `true` | Kolejka weryfikacji |
| `ENABLE_IMPORT_MUTATIONS` | `false` | Dev-only patch importu |