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_idOUmodeldoit ê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: trueest 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
- Modèle vs Assistant :
assistant_idOUmodeldoit être fourni (pas les deux vides). - Limite de vision : Maximum d’un document avec
vision: truepar requête. - Jetons max : Si fourni, il doit respecter les limites du modèle.
- Conversation : Si une conversation avec l’ID donné existe, elle doit appartenir à l’utilisateur actuel.
- Portée de la clé API : La clé API doit avoir la portée
ayeto.chatou*.