L’API AI Chat v2 (Documentation Index
Fetch the complete documentation index at: https://docs.xhuoapi.ai/llms.txt
Use this file to discover all available pages before exploring further.
/aichat2/conversations) est la nouvelle génération d’interface de conversation, une version entièrement améliorée de l’API AI Chat. Elle étend la simplicité et la gestion des conversations multi-tours de la v1 avec :
- Entrées utilisateur multimodales : possibilité d’envoyer directement du texte + images + fichiers via le champ structuré
message, sans passer par desreferencesen annexe. - Appel d’outils agentisés : intégration d’outils comme recherche web, extraction de pages, lecture de fichiers, et possibilité de connecter des serveurs MCP autorisés par l’utilisateur (Google Drive, Notion, Slack, GitHub, etc.). Le modèle peut appeler plusieurs outils de manière autonome en une seule requête pour accomplir des tâches complexes.
- Événements structurés en streaming : via
accept: text/event-streamouapplication/x-ndjson, réception en temps réel de tokens incrémentauxtext_delta,tool_use,tool_result,thinking,citation,card,artifact, facilitant un rendu différencié côté frontend. - Interruption / reprise possibles : le modèle émet un événement
ask_user_questionet suspend la conversation lorsqu’il a besoin d’informations supplémentaires de l’utilisateur ; la reprise s’effectue en renvoyant la réponse viatool_results. - Actions CRUD ajoutées : sur le même endpoint, le champ
actionpermet d’effectuerretrieve/retrieve_batch/update/deletesans API de gestion de session supplémentaire. - Liste de modèles continuellement mise à jour : accès par défaut à GPT-5.4, Claude Opus 4.7, Claude Sonnet 4.6, Gemini 3.1 Pro, GLM 5.1, DeepSeek V4, Kimi K2.5, etc.
model + question (+ optionnel stateful / id / references / preset) retourne un JSON {answer, id} équivalent à la v1. Ainsi, la migration depuis /aichat/conversations ne nécessite aucun réécriture client, il suffit de changer l’URL en /aichat2/conversations.
Si vous utilisez actuellement /aichat/conversations, l’ancienne interface restera disponible, vous pouvez migrer à votre rythme.
Processus de demande
Pour utiliser l’API, rendez-vous sur la page correspondante de l’API AI Chat v2 et cliquez sur le bouton « Acquire » pour obtenir les identifiants nécessaires. Si vous n’êtes pas connecté ou inscrit, vous serez redirigé vers la page de connexion. Après inscription et connexion, vous serez automatiquement renvoyé à la page actuelle. Une allocation gratuite est offerte lors de la première demande, permettant une utilisation gratuite de l’API.Utilisation basique
La méthode la plus simple est identique à la v1 : envoyermodel + question et recevoir {answer, id}.
Exemple CURL :
model sont visibles dans le panneau Try à droite, catégories courantes :
- OpenAI :
gpt-5.4-mini,gpt-5.4-nano,gpt-5.2-pro,gpt-5.1-all,gpt-5-all,gpt-4.1,gpt-4o,gpt-4o-image,o3,o4-mini, etc. - Anthropic :
claude-opus-4-7,claude-opus-4-6,claude-opus-4-5-20251101,claude-sonnet-4-6,claude-sonnet-4-5-20250929,claude-haiku-4-5-20251001, etc. - Google :
gemini-3.1-pro,gemini-3.1-pro-preview,gemini-3.1-flash-image-preview,gemini-3-pro-preview,gemini-2.5-flash-lite, etc. - xAI :
grok-4,grok-4-1-fast,grok-4-1-fast-reasoning,grok-3-mini-fast, etc. - DeepSeek :
deepseek-v4-flash,deepseek-v3.2-exp,deepseek-r1-0528, etc. - Moonshot :
kimi-k2.5,kimi-k2-thinking,kimi-k2-thinking-turbo, etc. - Zhipu :
glm-5.1,glm-5,glm-5-turbo,glm-4.7,glm-4.5v, etc.
Conversations multi-tours
Comme en v1, envoyezstateful: true pour activer la sauvegarde de session. L’API renvoie un id ; les requêtes suivantes avec ce même id poursuivent la conversation sans que vous ayez à gérer l’historique des messages.
Première requête :
id :
statefulesttruepar défaut, omettre ou spécifiertrueest équivalent. Pour ne pas conserver la conversation côté serveur, envoyez explicitementstateful: false.
Réponses en streaming
La v2 supporte deux formats de streaming, choisis via l’en-têteaccept :
| Scénario | accept | Format des données |
|---|---|---|
| Frontend web / EventSource | text/event-stream | data: {json}\n\n, dernière ligne data: [DONE]\n\n |
| Serveur / CLI / parsing Node en streaming | application/x-ndjson | Un objet JSON par ligne |
| Pas de streaming | application/json (par défaut) | Réponse complète {answer, id} |
Exemple NDJSON
text_delta :
Exemple SSE
Le navigateur avecEventSource ne supporte pas les corps personnalisés, il est recommandé d’utiliser fetch et de parser manuellement par \n\n :
Types d’événements en streaming
type | Signification |
|---|---|
text_delta | Fragment incrémental de la réponse de l’assistant. content contient le nouveau texte ; pour compatibilité v1, l’événement contient aussi delta_answer (identique à content) et id. |
thinking | Processus de réflexion du modèle (présent uniquement si le modèle expose le raisonnement). |
tool_use | Le modèle décide d’appeler un outil, l’événement contient tool_id, tool_name, input. |
tool_result | Résultat de l’outil, apparié au tool_use précédent via tool_id, is_error indique un échec. |
card | Carte structurée produite par un outil (image, aperçu de lien), prête à être affichée. |
citation | URL source pour citer un fragment de texte. |
ask_user_question | Le modèle demande une information à l’utilisateur, la conversation passe en état awaiting_user_input, voir Reprise de conversation suspendue. |
artifact | Production indépendante du modèle (ex : bloc de code, document), pouvant être sauvegardée ou téléchargée. |
system_message | Message système (hors contenu utilisateur-assistant), pour affichage UI uniquement. |
compact | Contexte interne compressé, sans traitement spécial nécessaire. |
error | Erreur survenue durant la session, message décrit l’erreur. |
done | Fin du streaming, contient usage (tokens prompt / completion / total) et terminal_reason. |
content de text_delta équivaut à la réponse answer en mode application/json.
Entrée multimodale
Si l’utilisateur envoie images ou fichiers, utilisezmessage (tableau) au lieu de question. Chaque élément est un bloc de contenu :
text— texte simple, champtextobligatoire.image_url— image, champimage_url.urlobligatoire.file_url— fichier (PDF, CSV, TXT, etc.), champfile_url.urlobligatoire.
Relation avec references en v1
Pour compatibilité avec les anciens clients, v2 reconnaît toujours le champ references: ["https://...", ...] :
- Les URLs avec extensions
jpg / jpeg / png / gif / bmp / webp / svg / heic / heifsont converties automatiquement en blocsimage_url. - Les autres extensions deviennent des blocs
file_url. - Si
questionest aussi fourni, il est placé en bloctexten tête.
/aichat2/conversations ; l’usage de references reste inchangé.
Pour un contrôle plus fin (ex : plusieurs images entre des textes, ordre important), utilisez directement un tableau message.
Appel d’outils et MCP
Le point fort de v2 est que le modèle peut appeler des outils de façon autonome pour accomplir des tâches multi-étapes, activé par défaut sans configuration supplémentaire côté client. Exemples courants :- L’utilisateur demande « Cherche-moi les nouvelles expositions à Shanghai » → le modèle utilise la recherche web intégrée → compile la réponse.
- L’utilisateur demande « Lis ce PDF et fais un résumé » → le modèle utilise file_read → rédige un résumé.
- L’utilisateur a autorisé Google Drive / GitHub / Notion via Connections → le modèle peut lire/écrire via les outils MCP correspondants.
tool_use et tool_result, par exemple :
tool_use / tool_result / card / citation. La sortie finale du modèle reste dans le flux text_delta.
Le paramètre max_turns limite le nombre maximal d’appels d’outils auto-invoqués par le modèle dans la requête, la limite par défaut est fixée par la plateforme. Le réduire (ex : max_turns: 1) force une réponse unique sans appel d’outil.
Reprise de conversation suspendue
Certains outils font que le modèle « interroge l’utilisateur ». Dans ce cas, un événementask_user_question est émis, la conversation passe en état awaiting_user_input :
id en renvoyant la réponse via tool_results :
tool_use_id dans le corps doit correspondre exactement au tool_id de la suspension, sinon la requête retourne une erreur 400. Lorsqu’un champ tool_results est présent, question / message / references sont ignorés.
Si l’utilisateur souhaite abandonner la question, il suffit d’envoyer une nouvelle question ou message, la plateforme marquera automatiquement l’appel d’outil suspendu comme « ignoré par l’utilisateur ».
Gestion des conversations (CRUD)
v2 propose une gestion légère des conversations via le champaction sur le même endpoint, sans API additionnelle.
action: retrieve — Récupérer une conversation
messages, model, title, tools_used, etc.).
action: retrieve_batch — Lister les résumés de conversations
{ items: [...], total }. Les résumés ne contiennent pas les messages, adaptés pour une liste latérale ; pour voir les messages complets, utilisez action: retrieve sur un élément.
Filtres optionnels : user_id, application_id, model_group, model.
action: update — Modifier le titre ou réécrire l’historique
messages, mais le serveur applique une validation stricte du schéma (doit être sous forme pliée ToolUseContent), sinon erreur 400. En général, il est conseillé de ne modifier que le title.
action: delete — Supprimer une conversation
{ id, success: true }. La suppression est définitive, assurez-vous avant d’appeler.
Migration fluide depuis v1
Si vous utilisez déjà/aichat/conversations, la migration vers v2 nécessite peu de modifications :
- Changez l’URL de
https://api.xhuoapi.ai/v1/aichat/conversationsàhttps://api.xhuoapi.ai/v1/aichat2/conversations. - Si vous utilisiez des noms de modèles v1 (ex :
gpt-3.5,gpt-4-browsing), il est recommandé de passer aux modèles contemporains v2 (ex :gpt-5.4,claude-opus-4-7,gemini-3.1-pro). - Le flux NDJSON reste rétrocompatible : chaque événement
text_deltacontient toujoursdelta_answeretid, donc les clients qui parseaientdelta_answerligne par ligne n’ont pas besoin de changer.
message, SSE, appels d’outils, CRUD via action) à votre rythme.
Gestion des erreurs
Les réponses d’erreur sont uniformes :400 bad_request: champ obligatoire manquant,tool_use_idnon concordant, schémamessagesinvalide, etc.401 invalid_token: en-têteauthorizationincorrect.404 not_found: conversation introuvable pouraction: retrieve / update / delete.429 too_many_requests: limite de débit dépassée.500 chat_error: erreur du LLM en amont oucompletion_tokens=0(considéré comme non consommé, pas facturé).
{"type":"error","message":"..."}, suivi de la fin du flux.

