Neo4j operations (connect, get_triplets, upsert_nodes,
build_communities) are synchronous blocking calls. When run as an
asyncio.ensure_future() task, they block the event loop and prevent
Hypercorn from binding to the port or accepting connections.
Fix: launch GraphRAG init in a daemon thread with its own event loop
so the main event loop stays free to serve HTTP requests immediately
after Phase 1 completes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
startup_event was registered as a Hypercorn startup hook AND called
manually in run_server_with_startup(), causing it to execute twice.
The second execution blocked the server from accepting connections
until vector init completed again.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Server now starts serving vector-only queries in ~1-2 minutes instead of
30-60 minutes. GraphRAG initializes in a background task and its tool is
dynamically added to the agent when ready.
- Cache extracted triples to disk (neo4j_triples.pickle) so Neo4j can be
repopulated without expensive LLM re-extraction
- Split initialize_global_index() into initialize_vector_index() (fast) and
initialize_graphrag_components() (background)
- Add graphrag_ready/graphrag_initializing status flags to shared_state
- Launch GraphRAG init as asyncio background task in main.py
- Report GraphRAG status in /status endpoint for frontend awareness
- Add comprehensive migration guide for applying to other projects
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>