RWA Assistant — Documentation

Guide de référence

Widget d'assistance IA conversationnel, déployable sur n'importe quelle plateforme via un snippet JS. Alimenté par Claude Haiku (Anthropic).

Aperçu

RWA Assistant est un widget universel en Shadow DOM fermé (~25 kB minifié) couplé à un dashboard de gestion complet. Il s'installe en une ligne de code sur n'importe quel site et communique avec une API Next.js hébergée sur le VPS RELIANCE. Les réponses arrivent en streaming SSE token par token.

Chat IA

Claude Haiku, streaming SSE, BM25 RAG sur vos documents

Lead capture

Formulaire intégré, détection contextuelle par mots-clés

Shadow DOM

Isolation totale, aucun conflit CSS avec le site hôte

Banques de données

Upload PDF/Excel/JSON, extraction automatique, indexation BM25

Contrôle d'accès

Domaines autorisés, types PUBLIC / INTERNAL / MIXED

Règles de gestion

Règles globales ou par assistant, injectées en priorité absolue

Installation

Assistant PUBLIC — collez ce snippet juste avant </body> :

html
<script
  src="https://assistant.rwa-core.com/widget/rwa-widget.js"
  data-assistant-id="<ID_ASSISTANT>"
  async>
</script>

Assistant INTERNAL — ajoutez data-internal-token :

html
<script
  src="https://assistant.rwa-core.com/widget/rwa-widget.js"
  data-assistant-id="<ID_ASSISTANT>"
  data-internal-token="<INTERNAL_ACCESS_TOKEN>"
  async>
</script>

Note : Le token est transmis à chaque requête via le header X-RWA-Internal-Token. Ne déployez jamais ce snippet sur une page publique — il n'est destiné qu'à des pages internes protégées. L'ID de l'assistant se récupère dans le dashboard (Assistants → copier l'identifiant).

Types d'assistants

Chaque assistant a un type d'audience qui détermine qui peut l'utiliser et comment il est protégé.

PUBLIC

Grand public

Accessible depuis n'importe quel navigateur. Rejette automatiquement les requêtes avec un token interne.

INTERNAL

Interne

Requiert le header X-RWA-Internal-Token. Bloque toute requête sans token valide. Jamais exposé au public.

MIXED

Mixte

Accepte les deux. Utile pour des outils accessibles en interne ET en externe sans restriction.

En plus du type d'audience, chaque assistant ne peut être utilisé que depuis les domaines déclarés à sa création (deployedOn). Des domaines supplémentaires peuvent être accordés depuis la page Accès & Autorisations du dashboard.

Assistants disponibles

IDNomUsage
demoReliance AssistantAssistant généraliste — tous projets RWA, expert immobilier premium
east-lake-parkEast Lake ParkAssistant dédié au projet résidentiel East Lake Park

API Reference

Toutes les routes /api/widget/* ont des headers CORS ouverts (Access-Control-Allow-Origin: *).

GET/api/widget/config/:id

Config publique de l'assistant (sans systemPrompt). Cache 60 s.

Réponse

json
{
  "id": "clx...",
  "name": "East Lake Park",
  "subtitle": "Projet résidentiel premium",
  "accentColor": "#343977",
  "greeting": "Bonjour ! ...",
  "quickActions": [...]
}
POST/api/widget/chat

Pipeline complet : rate limit → domain check → audience check → règles → RAG BM25 → réponse SSE streaming.

Limites : message ≤ 2 000 chars · historique ≤ 40 tours · 30 req/min par IP

Corps (JSON)

json
{
  "assistantId": "clx...",
  "conversationId": "uuid-v4",
  "message": "Quels sont vos projets ?",
  "history": [{ "role": "user", "content": "..." }]
}

Header requis pour assistants INTERNAL

http
X-RWA-Internal-Token: <valeur de INTERNAL_ACCESS_TOKEN>

Réponse — flux SSE (text/event-stream)

text
data: {"text":"Nous "}

data: {"text":"développons "}

data: {"text":"six projets..."}

data: {"done":true,"action":null,"conversationId":"uuid"}

action peut valoir collect_lead pour déclencher le formulaire de capture, ou null.

POST/api/widget/leads

Soumet un lead capturé via le formulaire du widget.

name requis · phone requis (6–30 chars) · email optionnel

Corps (JSON)

json
{
  "assistantId": "clx...",
  "conversationId": "uuid",
  "name": "Jean Dupont",
  "phone": "+225 07 00 00 00",
  "email": "jean@example.com"
}

Réponse

json
{ "success": true }
GET/api/health

Healthcheck utilisé par Docker Compose.

json
{ "status": "ok", "service": "rwa-assistant", "timestamp": "2026-07-03T..." }

Attributs du snippet

AttributTypeRequisDescription
data-assistant-idstringrequisIdentifiant de l'assistant tel qu'affiché dans le dashboard
data-api-basestringoptionnelURL de base de l'API si différente de l'origine du fichier JS
data-internal-tokenstringoptionnelToken d'accès interne — obligatoire pour les assistants de type INTERNAL. Doit correspondre à INTERNAL_ACCESS_TOKEN côté serveur.

Si data-api-base est absent, le widget détecte l'API depuis l'origine du script puis depuis window.location.origin. Le data-internal-token est transmis via le header HTTP X-RWA-Internal-Token — il n'est jamais exposé dans l'URL.

Variables d'environnement

VariableObligatoireDescription
ANTHROPIC_API_KEYouiClé secrète Anthropic — injectée au runtime (jamais dans le build)
DATABASE_URLouiChemin SQLite : file:./prisma/dev.db (dev) ou chemin absolu (prod)
AUTH_SECRETouiClé de chiffrement des sessions NextAuth (openssl rand -base64 32)
AUTH_KEYCLOAK_ISSUERouiRealm SSO RWA Core : https://auth.rwa-core.com/realms/rwa
AUTH_KEYCLOAK_IDouiClient OIDC de cette app dans le realm : rwa-assistant
AUTH_KEYCLOAK_SECRETouiSecret du client OIDC (onglet Credentials du client Keycloak)
INTERNAL_ACCESS_TOKENouiToken transmis par les widgets INTERNAL via X-RWA-Internal-Token
NEXT_PUBLIC_WIDGET_URLnonURL publique de rwa-widget.js — injectée au build Docker
NEXT_PUBLIC_APP_URLnonURL publique du dashboard — injectée au build Docker

Copier .env.example.env à la racine du projet pour le développement local.
En production, créer apps/dashboard/.env.local avec la vraie clé Anthropic.

Déploiement VPS

L'application s'exécute dans un conteneur Docker (image multi-stage, ~180 MB). Voir DEPLOY.md pour le guide complet.

bash
# 1. Build l'image
docker build \
  --file apps/dashboard/Dockerfile \
  --build-arg NEXT_PUBLIC_WIDGET_URL=https://assistant.rwa-core.com/widget/rwa-widget.js \
  --build-arg NEXT_PUBLIC_APP_URL=https://assistant.rwa-core.com \
  --tag rwa-assistant:latest .

# 2. Exporter et transférer sur le VPS
docker save rwa-assistant:latest | gzip > rwa-assistant.tar.gz
scp rwa-assistant.tar.gz user@VPS_IP:/opt/rwa-assistant/

# 3. Sur le VPS
docker load < rwa-assistant.tar.gz
docker compose up -d

# 4. Vérifier
curl http://localhost:3001/api/health

Note importante

ANTHROPIC_API_KEY est injectée au runtime via le fichier .env sur le VPS — elle ne doit jamais être passée en --build-arg pour ne pas être exposée dans les layers Docker.