Journalisation IA
Table thalia_ai_logs
CREATE TABLE thalia_ai_logs (
id BIGSERIAL PRIMARY KEY,
api_key_id INTEGER, -- clé utilisée
client_name VARCHAR(100), -- 'OpenWebUI', 'Claude Desktop'
ip INET,
tool VARCHAR(100) NOT NULL, -- 'elevage.lot'
action VARCHAR(100) NOT NULL, -- 'localisation'
params JSONB, -- paramètres reçus (sans données sensibles)
status VARCHAR(20) NOT NULL, -- success|error|forbidden|pending_approval
status_code SMALLINT,
duration_ms INTEGER,
response_size INTEGER,
pending_action_id INTEGER REFERENCES thalia_pending_actions(id),
created_at TIMESTAMP NOT NULL
);
CREATE INDEX ON thalia_ai_logs (tool, created_at DESC);
CREATE INDEX ON thalia_ai_logs (status, created_at DESC);
Ce qui est toujours tracé
- Outil appelé + action + paramètres (anonymisés si sensibles)
- Statut de la réponse (succès, erreur, refus de permission)
- Durée d'exécution
- IP source + identifiant client
Ce qui n'est jamais loggé
- Tokens, mots de passe, clés API
- Contenu complet des réponses
- Données personnelles de santé
ThaliaAuditService
Appelé automatiquement par le middleware ApiScopeMiddleware en v2 :
$audit->log(
tool: 'elevage.lot',
action: 'localisation',
params: ['code' => 'T2604'],
result: $response,
status: 'success',
durationMs: 123,
);
Dashboard admin
Page /thalia/admin/logs :
- Volume d'appels par jour / par outil
- Taux d'erreur et de refus
- Temps de réponse moyen par outil
- Liste des derniers appels avec drill-down
- Export CSV