Version : 4.15.0 Société : AISIA — Structure juridique en cours de création URL publique : https://aisia.fr/ Contact : contact@aisia.fr
---
1. Premier accès : Bootstrap Admin 2. Interface d'administration 3. Gestion des clés API 4. Gestion des utilisateurs 5. Groupes et permissions 6. Règles IA / Guardrails 7. Maintenance planifiée 8. Self-Audit et Self-Repair 9. Auto-Test par LLM 10. Billing et monitoring 11. Gestion des modèles locaux 12. Synchronisation des modèles 13. Base de connaissances 14. RGPD et conformité
---
Lors du premier déploiement, un mécanisme de bootstrap permet de créer le premier compte administrateur. La procédure détaillée est fournie dans la documentation d'installation interne (non publique pour raisons de sécurité).
Contactez l'équipe technique pour obtenir les instructions : admin@aisia.fr
secret_key ou app_secret_key dans le body (rétro-compatibilité).AUTH_TOKEN_EXPIRE_HOURS)./run/secrets/auth_secret_key.---
L'interface web d'administration est accessible à l'adresse :
https://aisia.fr/admin
Elle comporte les onglets suivants :
| Onglet | Description | Endpoint API |
|---|---|---|
| Clés API | Configuration des clés providers | GET/PUT /admin/api-keys/ |
| Utilisateurs | Gestion des comptes | GET/PUT /admin/users/ |
| Groupes | Gestion des groupes et permissions | GET/POST/PUT/DELETE /admin/groups/ |
| Règles IA | Guardrails et filtres | GET/PUT /admin/ai-rules |
| Maintenance | 17 tâches planifiées | GET/POST /admin/maintenance/ |
| Bot | Statut du bot d'interaction | GET/POST /admin/bot/ |
| Modèles locaux | Gestion des 83 modèles locaux (52 activés) | GET/PUT /admin/local-models |
| Billing | Suivi des coûts API | GET /admin/billing |
| Knowledge | Base de connaissances RAG | GET/POST /admin/knowledge |
| Self-Audit | Diagnostic automatique | GET /admin/self-audit |
| Datasets | Gestion des datasets HuggingFace | GET/POST /admin/datasets |
| Investisseurs | Page investisseurs | GET /admin/investors |
Depends(get_admin_user). Un token JWT
avec role=admin est requis pour chaque appel.
# Inclure le token dans le header Authorization
curl -H "Authorization: Bearer VOTRE_TOKEN_JWT" \
https://aisia.fr/admin/self-audit
---
AISIA utilise un système de résolution de clés API à trois niveaux de priorité :
1. Cache DB admin : clés définies via l'interface d'administration (priorité maximale)
2. Variable d'environnement : OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.
3. Docker Swarm secret : fichiers /run/secrets/
# Mettre à jour la clé d'un provider
curl -X PUT https://aisia.fr/admin/api-keys/{provider_id} \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"api_key": "sk-xxx..."}'
Les clés sont configurées dans providers.yaml via le champ env_api_key qui indique
la variable d'environnement ou le Docker secret correspondant.
AISIA détecte et ignore automatiquement les clés commençant par :
placeholder, changez, change-me, xxx, your-, sk-xxx.
---
GET /admin/users/
Retourne la liste de tous les utilisateurs enregistrés avec : id, email, display_name, role (user/admin), active, auth_provider.
PUT /admin/users/{user_id}/role
Body: {"role": "admin"} # ou "user"
PUT /admin/users/{user_id}/active
Body: {"active": false}
Un utilisateur désactivé ne peut plus se connecter. Son token JWT existant continuera de fonctionner jusqu'à expiration (le JWT est stateless).
Chaque utilisateur peut avoir des permissions individuelles limitant l'accès à certains providers :
# Consulter les permissions
GET /admin/users/{user_id}/permissions
Définir les permissions
PUT /admin/users/{user_id}/permissions
Body: [
{"provider_id": "openai", "enabled": true},
{"provider_id": "anthropic", "enabled": false}
]
---
Les groupes permettent de gérer les permissions de manière collective.
# Lister les groupes
GET /admin/groups/
Créer un groupe
POST /admin/groups/
Body: {"name": "Équipe Data Science", "description": "Accès modèles spécialisés"}
Modifier un groupe
PUT /admin/groups/{group_id}
Body: {"name": "Nouveau nom", "description": "Nouvelle description"}
Supprimer un groupe
DELETE /admin/groups/{group_id}
# Lister les membres
GET /admin/groups/{group_id}/members
Définir les membres (remplacement complet)
PUT /admin/groups/{group_id}/members
Body: {"user_ids": ["user-uuid-1", "user-uuid-2"]}
Retirer un membre
DELETE /admin/groups/{group_id}/members/{user_id}
Les permissions s'appliquent par type de ressource et niveau d'accès.
Types de ressources disponibles : llm, routing, model, token, api_key,
storage, download, upload, admin, maintenance, provider, integration,
group, user, learning, bot, chat, settings, monitoring, cluster.
Niveaux de permission : read, write, execute, manage, admin, owner, full.
# Consulter les permissions du groupe
GET /admin/groups/{group_id}/permissions
Définir les permissions
PUT /admin/groups/{group_id}/permissions
Body: [
{"resource_type": "llm", "resource_id": "*", "permission": "execute"},
{"resource_type": "admin", "resource_id": "*", "permission": "read"}
]
---
Les guardrails permettent de configurer des règles de sécurité applicables à toutes
les requêtes LLM. Elles sont stockées dans la table aisia_ai_rules (MariaDB)
avec cache Redis (TTL 300s) et cache mémoire (TTL 30s).
| Clé | Description | Défaut |
|---|---|---|
system_prompt_global | Prompt système injecté avant chaque requête | "" (désactivé) |
max_tokens_per_request | Limite tokens par requête (0 = illimité) | 0 |
forbidden_keywords | Mots-clés interdits dans les messages (liste JSON) | [] |
forbidden_topics | Sujets interdits | [] |
output_filter_keywords | Mots-clés bloqués dans les réponses | [] |
rate_limit_requests_per_hour | Limite par utilisateur par heure (0 = illimité) | 0 |
rate_limit_requests_per_day | Limite par utilisateur par jour | 0 |
allow_local_models_for_users | Modèles locaux pour non-admins | true |
allow_cloud_providers_for_users | Providers cloud pour non-admins | true |
refusal_message | Message affiché lors d'un blocage | "Cette demande ne peut pas être traitée par AISIA." |
log_refused_requests | Journaliser les requêtes refusées | true |
# Lire les règles actuelles
GET /admin/ai-rules
Mettre à jour les règles
PUT /admin/ai-rules
Body: {
"forbidden_keywords": ["violence", "armes"],
"rate_limit_requests_per_hour": 100,
"system_prompt_global": "Tu es un assistant professionnel AISIA."
}
Le rate limiting utilise des compteurs Redis avec des buckets horaires et journaliers. Les clés Redis suivent le format :
aisia:rl:hour:{user_id}:{bucket} (TTL 3600s)aisia:rl:day:{user_id}:{bucket} (TTL 86400s)Le MaintenanceScheduler centralise 17 tâches de maintenance, remplaçant les anciens cron jobs distribués sur les workers du cluster.
GET /admin/maintenance/status
POST /admin/maintenance/tasks/{task_id}/run
PUT /admin/maintenance/tasks/{task_id}/enabled
Body: {"enabled": true}
| ID | Catégorie | Auto | Intervalle | Description |
|---|---|---|---|---|
cluster-runtime-reconcile | cluster | oui | 15min | Réconciliation Docker workers |
cluster-root-usage-audit | audit | oui | 1h | Audit occupation disque workers |
cluster-logging-audit | audit | oui | 30min | Audit uniformité syslog |
manager-syslog-share-audit | audit | oui | 15min | Audit partage syslog manager |
syslog-health-summary | analysis | oui | 15min | Résumé santé syslog |
cluster-package-uniformity-audit | audit | oui | 6h | Homogénéité paquets |
cluster-worker-baseline-audit | audit | oui | 6h | Baseline système workers |
cluster-docker-prune | maintenance | non | 24h | Purge Docker (destructif) |
cluster-image-refresh | maintenance | non | 24h | Refresh images Docker (destructif) |
integrations-health-check | intégrations | oui | 1h | Health check intégrations |
integrations-update-review | intégrations | oui | 24h | Revue versions API |
sia-state-backup | backup | oui | 24h | Backup MariaDB + Qdrant |
redis-backup | backup | oui | 6h | BGSAVE Redis |
rgpd-data-purge | rgpd | oui | 24h | Purge données expirées (destructif) |
self-audit | audit | oui | 1h | Auto-diagnostic AISIA |
model-sync | audit | non | 24h | Synchronisation modèles LLM |
Quand Redis est disponible, le scheduler utilise un mécanisme de leader election
(clé aisia:maintenance:leader avec TTL) pour garantir qu'une seule replica exécute
les tâches planifiées. En l'absence de Redis, le fallback local s'active.
---
GET /admin/self-audit
Exécute un diagnostic complet automatique :
POST /admin/self-repair
Exécute des actions correctives automatiques basées sur le dernier rapport self-audit :
POST /admin/auto-test
AISIA utilise ses propres LLM pour tester l'intégralité de la plateforme :
1. Pages web : teste les 17 pages (/, /chat, /about, /contact, /investors, etc.) 2. Endpoints admin : teste 12 endpoints admin avec token 3. Chat : 10 questions dans différents domaines (math, coding, général, traduction, science, créatif) 4. Cycle auth : register, login, profile, login-history, OIDC Google 5. Intégrité données : providers (>50), modèles locaux (>40), OpenAPI (>60 paths), health
Le rapport final inclut :
GET /admin/billing
Retourne les statistiques de la journée :
GET /admin/billing/users
GET /admin/billing/providers
AISIA estime les coûts en USD par million de tokens (approximation 30% input / 70% output) :
| Provider | Input / 1M tokens | Output / 1M tokens |
|---|---|---|
| OpenAI | $0.15 | $0.60 |
| Anthropic | $0.25 | $1.25 |
| Gemini | $0.00 | $0.00 (free tier) |
| Groq | $0.00 | $0.00 (free tier) |
| Cerebras | $0.00 | $0.00 (free tier) |
| DeepSeek | $0.07 | $0.28 |
| Mistral | $0.10 | $0.30 |
aisia:billing:daily:{date}aisia:billing:user:{user_id}:{date}aisia:billing:provider:{provider_id}:{date}GET /admin/local-models
Retourne les 83 modèles locaux (52 activés) configurés dans local_models.yaml avec leur statut
(actif/inactif, runtime, endpoint, priorité).
PUT /admin/local-models/{model_id}/enabled
Body: {"enabled": false}
Les surcharges sont persistées dans la table aisia_local_model_overrides (MariaDB)
et cachées dans Redis pour accès rapide.
POST /admin/autonomy/reload
Recharge à chaud tous les modèles locaux sans redémarrer le service :
local_models.yamlPOST /admin/models/sync
Déclenche manuellement la synchronisation des modèles :
/v1/models/api/tags pour les modèles locauxproviders.yaml et local_models.yaml---
GET /admin/knowledge
Retourne les statistiques des collections Qdrant (nombre de points, vecteurs).
POST /admin/knowledge/ingest
Body: {"text": "Contenu à indexer...", "source": "documentation"}
Ou depuis une URL
POST /admin/knowledge/ingest
Body: {"url": "https://exemple.com/doc.html"}
Le texte est :
1. Nettoyé (suppression HTML, normalisation espaces)
2. Découpé en chunks de 500 caractères avec chevauchement de 50 caractères
3. Encodé avec le modèle all-MiniLM-L6-v2 (384 dimensions, cosine)
4. Stocké dans la collection Qdrant mtp_knowledge
POST /admin/knowledge/clear
---
| Variable | Défaut | Description |
|---|---|---|
RGPD_USER_RETENTION_DAYS | 1095 (3 ans) | Durée de rétention des comptes |
RGPD_AUDIT_RETENTION_DAYS | 365 (1 an) | Durée de rétention des logs audit |
RGPD_DPO_EMAIL | contact@aisia.fr | Email du DPO |
La tâche rgpd-data-purge s'exécute quotidiennement et supprime :
RGPD_USER_RETENTION_DAYS joursRGPD_AUDIT_RETENTION_DAYS joursGET /auth/me/exportDELETE /auth/meGET/PUT /auth/me/consentsGET /auth/me/login-history
Les chemins /auth/* sont automatiquement filtrés des logs d'accès HTTP pour éviter
la journalisation de données personnelles (emails, tokens) dans les logs serveur.
---
Document AISIA v4.21.0