Claire — Chatbot IA multi-brain avec Telegram, ComfyUI et OpenTelemetry
Claire est une application de chat IA construite avec Slim 4, Twig et Neuron AI. Elle s'exécute dans un conteneur Docker basé sur FrankenPHP/Caddy et fournit une interface web, une API REST, une intégration Telegram et une observabilité complète via OpenTelemetry.
- Interface web de chat avec streaming SSE, horodatage, suppression du dernier message
- API REST
POST /brain/messageset healthcheckGET /health - Multi-brain : sélection dynamique d'agents IA (Claire, Einstein, Calliope...)
- Création d'agents personnalisés via fichiers YAML dans
/opt/addons/agents/ - Mémoire courte avec résumé automatique de l'historique
- Recherche web via SearXNG et RAG fichier via embeddings
- Génération d'images avec ComfyUI (workflows multiples)
- Intégration Telegram complète (messages, photos, documents, Mini-App)
- Queue de fond Redis pour traitements asynchrones
- Observabilité OpenTelemetry (traces, métriques, logs)
- Authentification SSO OpenID Connect obligatoire
- Runtime : FrankenPHP + Caddy (PHP 8.5)
- Framework : Slim 4 avec PHP-DI
- Templates : Twig
- ORM : Doctrine ORM/DBAL (SQLite, MySQL, PostgreSQL)
- LLM : Neuron AI avec support OpenAI-compatible
- Queue : Redis (BRPOP/LPUSH)
- Observabilité : OpenTelemetry SDK + auto-instrumentation
- Bot : phptg/bot-api (Telegram)
| Variable | Description |
|---|---|
BASE_URL |
URL publique de l'application (ex: https://claire.example.com) |
OPENAPI_KEY |
Clé API du fournisseur LLM |
OPENAPI_URL |
URL de l'API LLM |
OPENAPI_MODEL |
Modèle par défaut |
OPENID_WELLKNOWN_URL |
URL de découverte OpenID Connect |
OPENID_CLIENT_ID |
Identifiant client OIDC |
SESSION_JWT_SECRET |
Clé secrète JWT (min 32 caractères) |
| Variable | Description | Défaut |
|---|---|---|
OPENAPI_MODEL_SUMMARY |
Modèle pour les résumés | valeur de OPENAPI_MODEL |
OPENAPI_MODEL_EMBED |
Modèle pour embeddings (RAG) | désactivé |
SEARXNG_URL |
URL SearXNG pour recherche web | - |
TELEGRAM_BOT_TOKEN |
Token du bot Telegram | - |
TELEGRAM_WEBHOOK_SECRET |
Secret webhook Telegram | - |
COMFYUI_ENABLED |
Active la génération d'images | false |
COMFYUI_URL |
URL de l'instance ComfyUI | http://localhost:8188 |
DATABASE_KIND |
Type de base (sqlite, mysql, postgres) |
sqlite |
DEBUG_MODE |
Mode debug | false |
QUEUE_WORKERS |
Nombre de workers de queue | 1 |
Voir docker/compose.yml pour un exemple complet avec toutes les variables.
| Chemin | Usage |
|---|---|
/data |
Base SQLite, fichiers uploadés, données persistantes |
/opt/addons |
Agents YAML personnalisés, workflows ComfyUI |
# Démarrer la stack
docker compose up -d
# Voir les logs
docker compose logs -f claire
# Exécuter des commandes
docker compose exec claire ./console migrations:migrate
docker compose exec claire ./console cache:clear
docker compose exec claire ./console telegram:set-commands
# Lancer le worker de queue
docker compose exec claire ./console queue:workCréez vos propres agents sans coder en ajoutant des fichiers YAML dans /opt/addons/agents/ :
name: "Coach Personnel"
description: "Un coach motivant pour vous aider à atteindre vos objectifs"
avatar: "data:image/png;base64,..."
css_inline: |
:root { --accent: #FF6B35; }
welcomes:
- "Prêt à relever de nouveaux défis ?"
- "Bonjour champion !"
instruction: |
Tu es un coach personnel motivant et bienveillant...Les cerveaux par défaut : claire (généraliste), einstein (scientifique), calliope (conteuse).
Activez avec COMFYUI_ENABLED=true et ajoutez des workflows dans /opt/addons/comfyui/ :
label: Portrait Flux
workflow: |
{
"3": { "inputs": { "seed": {{SEED}} }, "class_type": "KSampler" },
"6": { "inputs": { "text": "{{PROMPT}}" }, "class_type": "CLIPTextEncode" }
}| Variable | Description |
|---|---|
TELEGRAM_BOT_TOKEN |
Token de @BotFather |
TELEGRAM_WEBHOOK_SECRET |
Secret pour sécuriser le webhook |
# Configurer le webhook
docker compose exec claire ./console telegram:webhook --set
# Vérifier le statut
docker compose exec claire ./console telegram:webhook --info
# Configurer le bouton Mini-App
docker compose exec claire ./console telegram:menu-button --setLe bot supporte les commandes /start, /help, /brain, /comfyui.
Nécessaire pour Telegram et le streaming SSE multi-instance :
# Lancer le worker
docker compose exec claire ./console queue:work
# Options
--once # Traiter un seul job
--timeout=5 # Timeout BRPOP
--max-jobs=100GET /health — Retourne la version et la date.
POST /brain/messages HTTP/1.1
Content-Type: multipart/form-data; boundary=----BOUND
------BOUND
Content-Disposition: form-data; name="message"
Bonjour Claire !
------BOUND
Content-Disposition: form-data; name="sessionId"
sess-abc123
------BOUND--GET /files/count,GET /files/listPOST /files/upload,POST /files/upload_ragDELETE /files/delete/{id}GET /files/img_serve/{id}
GET /history/count,GET /history/listGET /history/open/{threadId},POST /history/newDELETE /history/exchange/last,DELETE /history/delete/{threadId}
# Lancer Claire avec Docker
docker run -d \
--name claire \
-p 8080:80 \
-v claire_data:/data \
-e OPENAPI_KEY=votre-clé-api \
-e OPENAPI_URL=https://api.openai.com/v1 \
-e OPENAPI_MODEL=gpt-4o-mini \
-e SESSION_JWT_SECRET=$(openssl rand -hex 32) \
-e OTEL_PHP_AUTOLOAD_ENABLED=true \
-e OTEL_SERVICE_NAME=claire \
-e OTEL_LOGS_EXPORTER=console \
-e OTEL_LOGS_PROCESSOR=simple \
semhoun/claire-chatbot:latest
# Initialiser la base de données
docker exec claire ./console migrations:migrate
# Accéder à l'application
# Ouvrir http://localhost:8080Avec Docker Compose:
services:
claire:
image: semhoun/claire-chatbot:latest
container_name: claire
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- claire-data:/data
- claire-addons:/opt/addons
environment:
# === Configuration serveur ===
BASE_URL: https://claire.example.com
SERVER_NAME: claire.example.com
ENABLE_LETSENCRYPT: true
ACME_EMAIL: admin@example.com
# === LLM Configuration ===
OPENAPI_KEY: ${OPENAPI_KEY:?set_me}
OPENAPI_URL: https://api.mistral.ai/v1
OPENAPI_MODEL: mistral-large-latest
# === Authentification OpenID (obligatoire) ===
OPENID_WELLKNOWN_URL: https://lastlogin.net/.well-known/openid-configuration
OPENID_CLIENT_ID: https://claire.example.com
# === Sécurité ===
SESSION_JWT_SECRET: ${SESSION_JWT_SECRET:?set_me}
# === Observabilité ===
OTEL_PHP_AUTOLOAD_ENABLED: true
OTEL_SERVICE_NAME: claire
OTEL_LOGS_EXPORTER: console
OTEL_LOGS_PROCESSOR: simple
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
- claire-redis:/data
volumes:
claire-data:
claire-addons:
claire-redis:Image Docker : semhoun/claire-chatbot
Pour contribuer ou modifier le code :
# Cloner et installer
git clone https://github.com/semhoun/claire-chatbot.git
cd claire-chatbot
composer install
# Exporter les variables
export OPENAPI_KEY=votre-clé-api
export OPENAPI_URL=https://api.openai.com/v1
export OPENAPI_MODEL=gpt-4o-mini
export SESSION_JWT_SECRET=$(openssl rand -hex 32)
# Initialiser et lancer
./console migrations:migrate
composer startcomposer rector-check # Vérifier
composer rector-fix # Appliquer
composer insights-check # Analyser
composer insights-fix # Corriger
vendor/bin/phpunit # Tests
composer pre-commit # Tous les checks| Problème | Solution |
|---|---|
500 au GET / |
Vérifiez les permissions du dossier var/ |
| Pas de logs | Définissez OTEL_LOGS_EXPORTER=console |
| RAG inactif | Vérifiez OPENAPI_MODEL_EMBED |
| ComfyUI non dispo | Vérifiez COMFYUI_ENABLED=true et les workflows |
| Worker bloqué | Vérifiez Redis et REDIS_READ_TIMEOUT |
MIT — Voir le fichier LICENSE.