Stop Cyberviolence
Data for Good - Saison 13
Last updated: 2026-04-08
This page contains an introduction and the technical documentation for the project Stop Cyberviolence as a part of season 13 hosted by Data for Good France.
What is Monstermessenger?
Monstermessenger is a multilingual AI-powered chatbot designed to help young people (10–13 years) and parents address cyberbullying and online safety concerns. It supports two user audiences and six languages, offering context-aware conversations backed by curated educational documents.
The system is built on LangGraph, FastAPI, and React, with a persistent session layer, an IDP-based authentication flow, and remote feature-flag management via OpenFeature.
Dual-Variant Architecture
A single codebase serves two audiences, selected at deployment time via CHATBOT_VARIANT:
| Variant | Target | Address style |
|---|---|---|
teenager |
Children/teens (10–13 years) | Direct (“tu”, “you”) |
parent |
Parents of children | Formal (“votre enfant”, “your child”) |
Each variant gets its own:
- Set of context-collection questions and system prompts (via the i18n layer)
- RAG knowledge-base collection (
docs_youth/docs_adult) - Frontend deployment (separate GCS bucket)
- Feature-flag context (some flags are variant-specific)
Key Features
🗣️ Multilingual Support (6 Languages)
French (FR, default), English (EN), Spanish (ES), Italian (IT), German (DE), Portuguese (PT).
All prompts, questions, and UI strings are in YAML files under api/i18n/, with a two-layer in-memory cache.
🤖 Intelligent Conversation Flow
- Context Collection — Structured questions gather the situation. An optional AI-driven dynamic follow-up mode (feature-flagged) generates additional questions based on the user’s answers.
- AI Advice — The
give_advicenode, driven bygemini-3.1-flash-lite-preview, produces empathetic, age-appropriate guidance. - RAG — Educational documents are retrieved from
PGVectorStoreusing multi-query parallelised search, filtered by an LLM relevance score, and injected into the advice prompt. A two-level semantic cache (embedding cache + cosine-similarity query cache) keeps latency low. - Ongoing Support — Follow-up conversation supported by a rolling summary persisted via the MemoryLake async queue.
🔐 Identity & Session Management
- IDP Authentication: Clients obtain a signed token from an Identity Provider and exchange it at
POST /auth/loginfor an application session. - Persistent Profiles:
User,AppSession,Conversation, andIDPLoginrecords are stored in PostgreSQL and eagerly loaded through a repository pattern (AppDataService). - Session Resumption: Returning users are offered the Simple Resume Prompt (floating one-click card) or the full Conversation History Modal — controlled by the
enable_simple_resume_promptfeature flag.
🎛️ Feature Flags (OpenFeature)
Runtime toggle of UI and backend behaviour via GET /features. The ApiFeatureProvider on the frontend fetches flags on startup. See Backend API for the full flag catalogue.
📱 Modern Tech Stack
| Layer | Technologies |
|---|---|
| Backend | FastAPI, LangGraph, SQLAlchemy async, Alembic, psycopg3 |
| AI | Google Gemini (via langchain_google_genai), LangGraph tool nodes |
| Data | PostgreSQL (multi-schema: app, langgraph, rag, cache) |
| Frontend | React 18, TypeScript, Vite, Tailwind CSS, OpenFeature |
| Deployment | Google Cloud Run (backend) + Cloud Storage (frontend), GitHub Actions |
System Architecture
┌───────────────────┐ ┌────────────────────┐ ┌──────────────────────┐
│ React Frontend │ │ FastAPI Backend │ │ LangGraph AI Agent │
│ │ │ │ │ │
│ • AuthContext │ │ • /auth/login │ │ • collect_context │
│ • BrandScreen │◄──┤ • /chat/init ├──►│ • give_advice │
│ • MonsterAvatar │ │ • /chat │ │ • research_tools │
│ • HistoryModal │ │ • /features │ │ • ongoing_support │
│ • OpenFeature │ │ • /chat/history │ │ • summarize │
└───────────────────┘ └─────────┬──────────┘ └──────────────────────┘
│
┌─────────────▼─────────────┐
│ PostgreSQL │
│ schema: app │
│ Users, AppSessions, │
│ Conversations, │
│ FeatureFlags │
│ schema: langgraph │
│ Checkpoint store │
│ schema: rag │
│ PGVectorStore │
│ schema: cache │
│ Semantic query cache │
└────────────────────────────┘
Project Structure (Top-Level)
stopcyberviolences-chatbot/
├── api/ # Backend — FastAPI + LangGraph
│ ├── agents/service1/ # Conversation agent (nodes, memory, tools, manifests)
│ ├── i18n/ # YAML prompts, questions, UI strings
│ ├── database/ # Multi-schema models, engines, Alembic
│ ├── services/ # AppDataService, FeatureFlagService, RAG, Chat
│ ├── routers/ # auth, chat, features, contacts, files, feedback
│ ├── core/ # Logging, dependency singletons
│ └── main.py
├── frontend/ # React SPA
│ └── src/
│ ├── components/ # BrandScreen, MonsterAvatar, HistoryModal, …
│ ├── context/ # AuthContext
│ ├── providers/ # ApiFeatureProvider (OpenFeature)
│ └── hooks/ # useChat
├── rag/ # Document indexing scripts + raw PDFs
├── deployment/ # deploy.py CLI, Dockerfiles, shell scripts
├── discord_bot/ # Discord bot client
└── doc/ # This documentation (Quarto .qmd files)
Use the sidebar to navigate between documentation sections.