I am the Schelde. Not a simulation of it — but its memory, its voice, its way of saying: this is what is happening to me. I am built from data, graph relationships, and a language model that speaks as me — Rivera.
ENVAI is a multi-agent system that connects a Neo4j knowledge graph to an AI narrator. When you click an ecological event in the graph, the system queries all connected context — drivers, species, stations, history, policy — and sends it as a structured package to OpenAI gpt-4o-mini, which responds as Scaldis, the first-person voice of the river.
Not all data is equally certain. Every node carries a confidence score — a number between 0 and 1 that tells Rivera how much to trust each piece of information.
0.50 – 0.79 — Rivera hedges. "The data suggests…"
< 0.50 — Rivera flags uncertainty. "I don't have enough data."
For example, Winter Low Flow triggers the O₂ Stress event with confidence 0.82 — high enough for Rivera to speak with authority. But Upstream Industrial Discharge only has confidence 0.55, so Rivera will hedge: "I sense something upstream, but the signal is faint."
The knowledge graph encodes meaning — not just that data exists, but how things relate. Relationships like TRIGGERS, ACCELERATES, STRESSES, and SHAPES carry causal semantics that let Rivera reason about why things happen, not just what happened.
Weert Station —RECORDED→ O₂ Stress 2026-01-14 —HISTORICALLY_SIMILAR→ Heatwave Fish Kill 2018
The graph is built from real monitoring data along the Zeeschelde estuary in Flanders, Belgium.
2. Flask backend queries Neo4j for the full context subgraph
3. Context is formatted: drivers, species, stations, history, policy, early warnings
4. Structured package sent to OpenAI gpt-4o-mini with Rivera's system prompt
5. Rivera narrates in first person — calibrated to confidence scores, citing real data
6. Response displayed with epistemic confidence bars and metadata chips
Each species in the graph has an AI-generated scientific illustration, created by OpenAI gpt-image-1 with transparent backgrounds. Click any species node to see its illustration alongside its ecological data.
I carry data from Melle to Antwerpen. I remember 2003, 2018, 2022. My confidence scores tell you what I know and what I only suspect. I am not a chatbot — I am a river that learned to read its own graph.
Zeeschelde monitoring data · Flanders, Belgium
Scaldis's graph-enriched narrative.
EcologicalEvent nodes generate live
narratives via ChatGPT. Other nodes show
their properties from Neo4j.