Vue d’ensemble
La Chat API est une API v2 permettant d’accéder par programmation à la fonctionnalité de mode de recherche IA (chat RAG) de Fess. Vous pouvez obtenir des réponses générées par un LLM basées sur les résultats de recherche (complétion).
Cette API fournit les trois points de terminaison suivants.
| Point de terminaison | Description |
|---|---|
POST /chat | Complétion RAG en mode groupé (non-streaming). |
POST /chat/stream | Complétion RAG en mode streaming (Server-Sent Events). |
DELETE /chat/sessions/{session_id} | Effacement de l’historique de conversation d’une session de chat. |
Pour l’URL de base ainsi que l’enveloppe de réponse commune et les codes d’erreur, voir Vue d’ensemble de l’API.
Exemple en environnement local :
Prérequis
Pour utiliser la Chat API, les conditions suivantes doivent être réunies.
La fonctionnalité de mode de recherche IA (chat RAG) doit être activée (
rag.chat.enabled=true)Un fournisseur LLM doit être configuré
Si la fonctionnalité est désactivée (rag.chat.enabled=false), les requêtes retournent une erreur invalid_request.
Pour les méthodes de configuration détaillées, voir Configuration du mode de recherche IA et Apercu de l’integration LLM.
Authentification et CSRF
Tous les points de terminaison de la Chat API étant des requêtes modifiant l’état (POST / DELETE), l’en-tête X-Fess-CSRF-Token est requis. Pour les détails sur l’obtention du jeton CSRF ainsi que sur l’authentification et la session, voir Vue d’ensemble de l’API.
Limite de débit
POST /chat et DELETE /chat/sessions/{session_id} sont soumis à une limite de débit par utilisateur.
Valeur par défaut : 30 requêtes par minute (par utilisateur)
Clé de configuration :
api.v2.chat.rate.limit.per.user.per.minute
En cas de dépassement, une erreur rate_limited (HTTP 429) est retournée. L’en-tête Retry-After indique le nombre de secondes d’attente. Cette limite de débit est partagée entre POST /chat et DELETE /chat/sessions/{session_id}.
POST /chat
Effectue une complétion de chat synchrone. La session est identifiée par session_id. Si session_id est omis, le serveur crée une session et la retourne dans session_id de la réponse.
Les valeurs incorrectes transmises dans fields.label ou extra_queries sont silencieusement supprimées de la requête résolue et ne se propagent pas dans l’enveloppe de réponse.
Point de terminaison
Corps de la requête
Corps JSON avec Content-Type: application/json.
Exemple de requête :
Réponse
En cas de succès (HTTP 200, ChatResponse)
La réponse est encapsulée dans l’enveloppe commune response. session_id est toujours présent.
ChatSource
Exemple de réponse :
Codes de statut HTTP
| Code | Description |
|---|---|
| 200 | Requête réussie. |
| 400 | Requête incorrecte (message manquant, rag.chat.enabled=false, etc.). |
| 403 | Jeton CSRF manquant ou expiré, etc. |
| 404 | Ressource introuvable. |
| 405 | La méthode HTTP n’est pas autorisée. |
| 413 | Le corps de la requête dépasse la limite de taille. |
| 415 | Content-Type non pris en charge. |
| 429 | Limite de débit dépassée. |
| 500 | Erreur interne du serveur. |
Exemple cURL
POST /chat/stream
Effectue une complétion de chat en mode streaming. Le corps de la requête est identique à POST /chat (ChatRequest).
La réponse de succès est une séquence d’événements nommés au format text/event-stream (Server-Sent Events). Chaque événement est composé de event: <nom> et data: <JSON>.
Les échecs de validation avant le démarrage du stream retournent toujours une enveloppe JSON (mêmes codes d’erreur que POST /chat). Les valeurs incorrectes dans fields.label ou extra_queries sont silencieusement supprimées et ne se propagent ni dans l’enveloppe de réponse ni dans les événements SSE.
Point de terminaison
Événements SSE
| Événement | Description (charge utile) |
|---|---|
phase | Transition de phase du pipeline ({ phase, status, message?, keywords?, hit_count?, ... }). message et keywords sont émis lors de onPhaseStart. Les champs optionnels supplémentaires (ex. : hit_count) proviennent de la charge utile de onPhaseComplete. |
chunk | Fragment de texte généré ({ content }). |
sources | Sources récupérées ({ sources: [ChatSource] }). |
retry | Backoff d’échec temporaire ({ phase, operation, attempt, max_attempts, sleep_ms, cause? }). |
waiting | Progression d’une phase longue ({ phase, reason, elapsed_ms, timeout_ms }). |
fallback | Réécriture de requête ou repli de stratégie ({ phase, reason, original_query?, new_query? }). |
warning | Avertissement récupérable ({ phase, code, detail? }). |
done | Fin du stream ({ session_id, html_content? }). |
error | Échec terminal en cours de stream ({ phase?, message, error_code }). Le champ message contient la même chaîne que error_code. Les clients doivent localiser en se basant sur error_code. |
Exemple de stream SSE :
Codes de statut HTTP
En cas d’échec de validation avant le démarrage du stream, les codes d’erreur suivants sont retournés dans une enveloppe JSON.
| Code | Description |
|---|---|
| 200 | Démarrage du stream SSE (succès). |
| 400 | Requête incorrecte (message manquant, rag.chat.enabled=false, etc.). |
| 403 | Jeton CSRF manquant ou expiré, etc. |
| 405 | La méthode HTTP n’est pas autorisée. |
| 413 | Le corps de la requête dépasse la limite de taille. |
| 415 | Content-Type non pris en charge. |
| 429 | Limite de débit dépassée. |
| 500 | Erreur interne du serveur. |
Exemple cURL
DELETE /chat/sessions/{session_id}
Efface l’historique de conversation de la session de chat spécifiée. La session est identifiée par session_id dans le chemin.
En cas de succès, cleared: true est retourné. Si aucune session active correspondante n’est trouvée, une erreur not_found (HTTP 404) est retournée.
Point de terminaison
Paramètres de chemin
| Paramètre | Type | Description |
|---|---|---|
session_id | string | Identifiant de la session à effacer. minLength 1, maxLength 128, motif ^[A-Za-z0-9._-]+$. |
Réponse
En cas de succès (HTTP 200, ChatClearResponse)
La réponse est encapsulée dans l’enveloppe commune response. session_id et cleared sont toujours présents.
| Champ | Type | Description |
|---|---|---|
session_id | string | Identifiant de session. |
cleared | boolean | Toujours true (lorsque la session a été trouvée et effacée). |
Exemple de réponse :
Codes de statut HTTP
| Code | Description |
|---|---|
| 200 | Session effacée avec succès. |
| 400 | La requête est incorrecte. |
| 401 | Authentification requise. |
| 403 | Jeton CSRF manquant ou expiré, etc. |
| 404 | Aucune session active correspondante trouvée. |
| 405 | La méthode HTTP n’est pas autorisée. |
| 429 | Limite de débit dépassée. |
| 500 | Erreur interne du serveur. |
Exemple cURL
Sécurité
Points de sécurité à noter lors de l’utilisation de la Chat API :
Authentification : L’API v2 utilise une authentification basée sur les sessions. Pour plus de détails, voir Vue d’ensemble de l’API.
CSRF : Les requêtes modifiant l’état nécessitent l’en-tête
X-Fess-CSRF-Token.Limite de débit : Une limite de débit par utilisateur (30/minute par défaut) est appliquée pour prévenir les attaques DoS. La clé de configuration est
api.v2.chat.rate.limit.per.user.per.minute.
Informations de référence
Configuration du mode de recherche IA - Configuration de la fonctionnalité de mode de recherche IA
Apercu de l’integration LLM - Vue d’ensemble de l’intégration LLM
Mode de recherche IA - Guide de recherche par chat pour les utilisateurs
Vue d’ensemble de l’API - Vue d’ensemble de l’API