← Back to Blog
Tutorial · 10 min read

API Chat v3 : d’une requête simple au streaming et à la vision

AYETO Team ·
API Chat v3 : d’une requête simple au streaming et à la vision

Informations de base

Propriété Valeur
Point de terminaison POST /api/v3/chat
Authentification Clé API avec portée ayeto.chat
Modèle de réponse BasicLLMMessageView
Limite de débit Limites par défaut

Authentification

Clé API

Le point de terminaison nécessite une clé API avec l’autorisation (portée) ayeto.chat.

En-tête d’authentification

uni-api-key: <VOTRE_CLÉ_API>

Format de la clé API

La clé API a le format suivant :

ayeto-{64_caractères_hexadécimaux_aléatoires}

Exemple :

ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2

Portées

Pour utiliser le point de terminaison de chat, la clé API doit avoir l’une des portées suivantes : - ayeto.chat - portée spécifique au chat - * - portée générique (accès à tous les points de terminaison)

Réponses d’erreur d’authentification

Erreur Description
API key not provided L’en-tête uni-api-key est manquant ou vide.
API key is invalid La clé API n’existe pas, est désactivée ou ne possède pas la portée requise.

Sécurité : Lorsqu’une clé API invalide est utilisée, un délai de sécurité est appliqué pour protéger contre les attaques par force brute.


Corps de la requête - ChatRequest

Champ Type Obligatoire Par défaut Description
conversation_id UUID Non Généré automatiquement Identifiant de conversation. S’il n’est pas fourni, un nouveau est créé.
assistant_id UUID Non* null ID de l’assistant à utiliser.
organization_id UUID Non null ID de l’organisation pour le contexte de conversation.
model string Non* null ID du modèle pour générer la réponse.
message string Oui - Texte du message utilisateur.
max_tokens integer Non null Nombre maximal de jetons dans la réponse.
image boolean Non false Utiliser la génération d’image au lieu du texte.
documents EncodedData[] Non null Pièces jointes (documents, images).
relevant_history boolean Non false Utiliser l’historique de conversation pertinent.
dynamic_tools boolean Non false Activer les outils dynamiques.
stream boolean Non false Diffuser la réponse en continu (SSE).
remove_tool_calls boolean Non false Supprimer les appels d’outils de la réponse.

Important : assistant_id OU model doit être fourni. L’un de ces champs est obligatoire.


Pièces jointes - EncodedData

Pour joindre des documents ou des images, utilisez le champ documents :

Champ Type Obligatoire Description
filename string Oui Nom du fichier avec extension.
data string Oui Contenu du fichier encodé en Base64 (avec le préfixe data:{mime};base64,).
size integer Oui Taille du fichier en octets.
mime_type string Oui Type MIME du fichier (par ex. image/png, application/pdf).
vision boolean Non true = image pour analyse visuelle.

Limitation : Une seule image avec vision: true est autorisée dans une requête unique.


Réponse - BasicLLMMessageView

Champ Type Description
id UUID Identifiant unique du message.
timestamp integer Horodatage Unix de création du message (en millisecondes).
role string Rôle du message : system, user, assistant, tool, internal.
content string \| null Contenu textuel de la réponse.
reasoning_content string \| null Contenu de raisonnement (si pris en charge par le modèle).
model string \| null ID du modèle utilisé.
img_gen ImgGenMessage \| null Données d’image générée (si image: true).

Exemple de réponse

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "timestamp": 1735815581000,
  "role": "assistant",
  "content": "Bonjour ! Je vais bien, merci de demander. Comment puis-je vous aider ?",
  "reasoning_content": null,
  "model": "gpt-4o",
  "img_gen": null
}

Réponse de génération d’image - ImgGenMessage

Si image: true, la réponse contient un objet img_gen :

Champ Type Description
id UUID ID de l’image générée.
timestamp integer Horodatage Unix (en millisecondes).
model string Modèle utilisé pour la génération.
format string Format de l’image (par ex. 1024x1024, 1792x1024, 1024x1792).
hd boolean Qualité HD.
prompt string Prompt utilisé pour la génération.
content string Contenu de la réponse.
response_id string ID de réponse du fournisseur.
image_url string URL de l’image générée.
image_file_id UUID \| null ID du fichier stocké.

Réponse en streaming (SSE)

Si stream: true, le point de terminaison renvoie un flux Server-Sent Events (SSE).

En-têtes de réponse du streaming

Content-Type: text/event-stream
Transfer-Encoding: chunked

Format des segments du flux - StreamChunk

Chaque segment est un objet JSON sur une ligne séparée :

Champ Type Description
timestamp integer Horodatage Unix au moment de création du segment (en millisecondes).
data string \| null Partie de la réponse textuelle (jeton/mot).
error StreamError \| null Objet d’erreur si une erreur s’est produite.

Format d’erreur du flux - StreamError

Si une erreur se produit pendant le streaming :

Champ Type Description
status integer Code de statut HTTP de l’erreur.
text string Nom/type de l’erreur.
detail any Description détaillée de l’erreur.

Exemple de réponse en streaming

{"timestamp": 1735815581000, "data": "Bonjour", "error": null}
{"timestamp": 1735815581050, "data": ",", "error": null}
{"timestamp": 1735815582100, "data": " comment", "error": null}
{"timestamp": 1735815582150, "data": " allez", "error": null}
{"timestamp": 1735815582200, "data": " vous", "error": null}
{"timestamp": 1735815583000, "data": " ?", "error": null}

Exemple d’erreur en streaming

{"timestamp": 1735815590000, "data": null, "error": {"status": 500, "text": "Internal Server Error", "detail": "Model timeout"}}

Exemples cURL

1. Chat de base avec un modèle

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "message": "Bonjour, comment allez-vous ?"
  }'

2. Chat avec une conversation existante

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d '{
    "conversation_id": "550e8400-e29b-41d4-a716-446655440000",
    "model": "gpt-4o",
    "message": "Continuez le sujet précédent."
  }'

3. Chat avec un assistant

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d '{
    "assistant_id": "123e4567-e89b-12d3-a456-426614174000",
    "message": "Aidez-moi avec l’analyse de données."
  }'

4. Chat avec une pièce jointe (document)

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "message": "Analysez ce document.",
    "documents": [
      {
        "filename": "report.txt",
        "data": "data:text/plain;base64,VGhpcyBpcyBhIHRlc3QgZG9jdW1lbnQu",
        "size": 25,
        "mime_type": "text/plain",
        "vision": false
      }
    ]
  }'

5. Chat avec une image (Vision)

# Encodez d’abord l’image en base64
IMAGE_BASE64=$(base64 -w 0 photo.jpg)  # Linux
# ou : IMAGE_BASE64=$(base64 -i photo.jpg)  # macOS

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d "{
    \"model\": \"gpt-4o\",
    \"message\": \"Que voyez-vous dans cette image ?\",
    \"documents\": [
      {
        \"filename\": \"photo.jpg\",
        \"data\": \"data:image/jpeg;base64,${IMAGE_BASE64}\",
        \"size\": $(stat -f%z photo.jpg 2>/dev/null || stat -c%s photo.jpg),
        \"mime_type\": \"image/jpeg\",
        \"vision\": true
      }
    ]
  }"

6. Génération d’image

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "dall-e-3",
    "message": "Dessinez un coucher de soleil sur des montagnes dans le style de l’impressionnisme.",
    "image": true
  }'

7. Réponse en streaming

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -N \
  -d '{
    "model": "gpt-4o",
    "message": "Écrivez une courte histoire sur un robot.",
    "stream": true
  }'

Astuce : L’option -N (ou --no-buffer) désactive la mise en mémoire tampon pour l’affichage du flux en temps réel.

8. Streaming avec traitement des segments (Bash + jq)

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -N -s \
  -d '{
    "model": "gpt-4o",
    "message": "Expliquez la physique quantique.",
    "stream": true
  }' | while IFS= read -r line; do
    echo "$line" | jq -r '.data // empty' | tr -d '\n'
  done
echo ""

9. Chat dans le contexte d’une organisation

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d '{
    "organization_id": "550e8400-e29b-41d4-a716-446655440000",
    "model": "gpt-4o",
    "message": "Quels sont nos objectifs d’entreprise ?"
  }'

10. Chat avec limite de jetons

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "message": "Résumez l’histoire des ordinateurs.",
    "max_tokens": 500
  }'

11. Chat avec outils dynamiques et historique pertinent

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d '{
    "assistant_id": "123e4567-e89b-12d3-a456-426614174000",
    "message": "Trouvez les informations météo à Prague.",
    "relevant_history": true,
    "dynamic_tools": true
  }'

12. Chat avec appels d’outils supprimés de la réponse

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d '{
    "assistant_id": "123e4567-e89b-12d3-a456-426614174000",
    "message": "Calculez 2+2 à l’aide d’une calculatrice.",
    "remove_tool_calls": true
  }'

13. Exemple complet avec plusieurs paramètres

curl -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d '{
    "conversation_id": "550e8400-e29b-41d4-a716-446655440000",
    "organization_id": "123e4567-e89b-12d3-a456-426614174000",
    "assistant_id": "abcd1234-e89b-12d3-a456-426614174000",
    "message": "Analysez le document joint et créez un résumé.",
    "max_tokens": 1000,
    "relevant_history": true,
    "dynamic_tools": true,
    "stream": false,
    "remove_tool_calls": true,
    "documents": [
      {
        "filename": "report.pdf",
        "data": "data:application/pdf;base64,JVBERi0xLjQK...",
        "size": 102400,
        "mime_type": "application/pdf",
        "vision": false
      }
    ]
  }'

14. cURL détaillé pour le débogage

curl -v -X POST "https://beta.ayeto.ai/api/v3/chat" \
  -H "uni-api-key: ayeto-a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o",
    "message": "Message de test"
  }'

États d’erreur

Code HTTP Description
400 Requête incorrecte (modèle ou assistant_id manquant, données invalides).
401 Clé API invalide ou manquante (en-tête uni-api-key).
403 Permissions insuffisantes (l’utilisateur n’a pas accès à la conversation/l’assistant/l’organisation).
404 Assistant ou organisation introuvable.
500 Erreur interne du serveur.

Exemple de réponse d’erreur

{
  "detail": "API key is invalid"
}

Règles de validation

  1. Modèle vs Assistant : assistant_id OU model doit être fourni (pas les deux vides).
  2. Limite de vision : Maximum d’un document avec vision: true par requête.
  3. Jetons max : Si fourni, il doit respecter les limites du modèle.
  4. Conversation : Si une conversation avec l’ID donné existe, elle doit appartenir à l’utilisateur actuel.
  5. Portée de la clé API : La clé API doit avoir la portée ayeto.chat ou *.