Sources et entraînement API v2

Répertoriez et créez des sources d’agent, envoyez des fichiers directement vers le stockage, supprimez des documents, consultez l’état de l’entraînement et démarrez le réentraînement des sources web.

Utilisez ces points de terminaison pour gérer les sources de texte, de Q&R, d’URL et de fichier, et pour réentraîner les sources web indexées. Chaque point de terminaison de cette page nécessite Authorization: Bearer YOUR_API_KEY et un accès à {agentId}.

Consultez le catalogue des erreurs pour connaître les erreurs d’authentification, de validation, de quota et de ressource communes.

Objet Source

ChampTypeRemarques
idchaîneID du document.
titlechaîneTitre de la source.
sourceTypechaîneType de source stocké, notamment web_crawl, file_upload, text_snippet, ou qna_entry.
createdAtentier ou nullHorodatage Unix en secondes.
lastCrawledAtentier ou nullHorodatage Unix en secondes.
sourceMetadatatoute valeur JSONMétadonnées de source stockées.

Lister les sources

Chemin : /api/v2/agents/{agentId}/sources

GET /api/v2/agents/{agentId}/sources

Authentification : clé API Bearer ayant accès à {agentId}.

ParamètreObligatoireContraintes
limitNonEntier de 1 à 100 ; 20 par défaut.
cursorNonCurseur opaque renvoyé par la page précédente. Réutilisez-le tel quel.
sourceTypeNonweb_crawl, file_upload, text_snippet, ou qna_entry.
curl 'https://your-domain.com/api/v2/agents/955f28f1-8515-40bb-802c-f3f730bf0343/sources?sourceType=text_snippet&limit=20' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Succès : 200 OK

{
  "data": [
    {
      "id": "41b4c1d3-887d-46a5-95ae-c761922c6bc7",
      "title": "Refund policy",
      "sourceType": "text_snippet",
      "createdAt": 1784332800,
      "lastCrawledAt": null,
      "sourceMetadata": null
    }
  ],
  "pagination": {
    "cursor": null,
    "hasMore": false,
    "total": 1
  }
}

Une limite, un curseur, ou un type de source invalide renvoient 400 VALIDATION_INVALID_BODY.

Ajouter une source de texte

Chemin : /api/v2/agents/{agentId}/sources/text

POST /api/v2/agents/{agentId}/sources/text

Authentification : clé API Bearer ayant accès à {agentId}.

Champ du corpsObligatoireType et contraintes
titleOuiChaîne de 1 à 200 caractères avant suppression des espaces superflus ; la valeur acceptée est nettoyée de ces espaces.
contentOuiChaîne non vide, d’au plus 262 144 octets UTF-8 (256 Ko), et ne comportant pas uniquement des espaces.
curl -X POST 'https://your-domain.com/api/v2/agents/955f28f1-8515-40bb-802c-f3f730bf0343/sources/text' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"title":"Refund policy","content":"Refunds are available within 30 days."}'

Succès : 201 Created

{
  "documentId": "41b4c1d3-887d-46a5-95ae-c761922c6bc7"
}

Une entrée invalide ou un échec de traitement non lié au stockage renvoie 400 VALIDATION_INVALID_BODY. Un échec de traitement dû à une limite de stockage renvoie 403 QUOTA_STORAGE_LIMIT.

Ajouter une source Q&R

Chemin : /api/v2/agents/{agentId}/sources/qna

POST /api/v2/agents/{agentId}/sources/qna

Authentification : clé API Bearer ayant accès à {agentId}.

Champ du corpsObligatoireType et contraintes
titleOuiChaîne de 1 à 200 caractères avant suppression des espaces superflus ; la valeur acceptée est nettoyée de ces espaces.
questionsOuiTableau d’au plus 10 chaînes, chacune d’au plus 500 caractères. Au moins une entrée doit contenir un caractère autre qu’un espace.
answerOuiChaîne non vide, d’au plus 262 144 octets UTF-8 (256 Ko), et ne comportant pas uniquement des espaces.
curl -X POST 'https://your-domain.com/api/v2/agents/955f28f1-8515-40bb-802c-f3f730bf0343/sources/qna' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"title":"Shipping time","questions":["How long does shipping take?","When will my order arrive?"],"answer":"Standard shipping takes 3–5 business days."}'

Succès : 201 Created

{
  "documentId": "531a3fbe-40c2-4d22-a524-1f4a70f509f1"
}

Une entrée invalide ou un échec de traitement non lié au stockage renvoie 400 VALIDATION_INVALID_BODY. Un échec de traitement dû à une limite de stockage renvoie 403 QUOTA_STORAGE_LIMIT.

Ajouter ou réentraîner une source URL

Chemin : /api/v2/agents/{agentId}/sources/url

POST /api/v2/agents/{agentId}/sources/url

Authentification : clé API Bearer ayant accès à {agentId}.

Champ du corpsObligatoireType et contraintes
urlOuiURL HTTP ou HTTPS non vide, avec un domaine. Un protocole manquant est normalisé en https://. Les adresses IP de boucle locale, privées, link-local, unique-local, dans des plages réservées, les variantes de localhost, les TLD internes et les noms d’hôte à un seul label sont rejetés.

Soumettre une URL déjà indexée pour l’agent crée une tâche de réentraînement. Une nouvelle URL vérifie d’abord la capacité de stockage disponible. Les URL vidéo nécessitent en outre un accès au forfait permettant la transcription vidéo.

curl -X POST 'https://your-domain.com/api/v2/agents/955f28f1-8515-40bb-802c-f3f730bf0343/sources/url' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"url":"https://docs.example.com/getting-started"}'

Succès : 202 Accepted

{
  "jobId": "c3c61f67-70fe-42da-a843-24112ded8aeb",
  "isRetrain": false
}

Une entrée invalide renvoie 400 VALIDATION_INVALID_BODY. L’absence d’accès à la transcription vidéo renvoie 403 SUBSCRIPTION_API_RESTRICTED_PLAN ; un échec de quota de stockage ou de file d’attente renvoie 403 QUOTA_STORAGE_LIMIT ; un échec de création de tâche non lié à un quota renvoie 500 INTERNAL_SERVER_ERROR.

Ajouter des sources de fichier avec des URL d’envoi signées

Les sources de fichier utilisent un flux API en deux étapes, afin que les octets du fichier transitent directement de votre client vers le stockage privé, sans passer par la route de l’API. Chaque fichier peut peser au plus 50 Mo, et une requête peut contenir au plus 20 fichiers. Les extensions prises en charge sont .pdf, .txt, .md, .docx, .xlsx, et .pptx.

1. Créer des URL d’envoi signées

Chemin : /api/v2/agents/{agentId}/sources/file/upload-url

POST /api/v2/agents/{agentId}/sources/file/upload-url

Envoyez les noms de fichiers d’origine :

{
  "files": [
    { "fileName": "product-guide.pdf" },
    { "fileName": "faq.md" }
  ]
}
curl -X POST 'https://your-domain.com/api/v2/agents/955f28f1-8515-40bb-802c-f3f730bf0343/sources/file/upload-url' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"files":[{"fileName":"product-guide.pdf"},{"fileName":"faq.md"}]}'

Succès : 200 OK

{
  "files": [
    {
      "fileName": "product-guide.pdf",
      "storagePath": "chatbot-955f28f1-8515-40bb-802c-f3f730bf0343/V1StGXR8_Z5jdHi6-product-guide.pdf",
      "uploadUrl": "https://storage.example.com/storage/v1/object/upload/sign/training_files/chatbot-955f28f1-8515-40bb-802c-f3f730bf0343/V1StGXR8_Z5jdHi6-product-guide.pdf?token=SIGNED_TOKEN",
      "token": "SIGNED_TOKEN"
    },
    {
      "fileName": "faq.md",
      "storagePath": "chatbot-955f28f1-8515-40bb-802c-f3f730bf0343/N5jFt4Z9kSC3vHqA-faq.md",
      "uploadUrl": "https://storage.example.com/storage/v1/object/upload/sign/training_files/chatbot-955f28f1-8515-40bb-802c-f3f730bf0343/N5jFt4Z9kSC3vHqA-faq.md?token=SIGNED_TOKEN",
      "token": "SIGNED_TOKEN"
    }
  ]
}

2. Envoyer les octets du fichier

Envoyez chaque fichier directement à son uploadUrl avec PUT :

await fetch(uploadUrl, {
  method: 'PUT',
  headers: { 'Content-Type': file.type },
  body: file,
});

Si vous utilisez le client JavaScript Supabase, transmettez le chemin et le jeton correspondants obtenus à l’étape 1 :

await supabase.storage
  .from('training_files')
  .uploadToSignedUrl(storagePath, token, file);

Ne modifiez ni ne construisez vous-même les chemins de stockage. L’enregistrement n’accepte que les chemins renvoyés pour cet agent à l’étape 1.

3. Enregistrer les fichiers envoyés

Chemin : /api/v2/agents/{agentId}/sources/file

POST /api/v2/agents/{agentId}/sources/file

Une fois chaque envoi direct terminé, enregistrez les chemins renvoyés avec leurs noms de fichiers d’origine :

{
  "files": [
    {
      "storagePath": "chatbot-955f28f1-8515-40bb-802c-f3f730bf0343/V1StGXR8_Z5jdHi6-product-guide.pdf",
      "fileName": "product-guide.pdf"
    },
    {
      "storagePath": "chatbot-955f28f1-8515-40bb-802c-f3f730bf0343/N5jFt4Z9kSC3vHqA-faq.md",
      "fileName": "faq.md"
    }
  ]
}

Succès : 202 Accepted

{
  "jobId": 321,
  "fileCount": 2
}

L’enregistrement vérifie que chaque objet existe, n’est pas vide, ne dépasse pas 50 Mo, et appartient à l’agent demandé, avant de démarrer la tâche de traitement. Un envoi invalide ou manquant renvoie 400 VALIDATION_INVALID_BODY ; un refus de quota de stockage renvoie 403 QUOTA_STORAGE_LIMIT ; un échec de stockage ou de file d’attente renvoie 500 INTERNAL_SERVER_ERROR.

Supprimer une source

Chemin : /api/v2/agents/{agentId}/sources/{documentId}

DELETE /api/v2/agents/{agentId}/sources/{documentId}

Authentification : clé API Bearer ayant accès à {agentId}.

{documentId} doit être un UUID renvoyé par une réponse de création ou de liste de sources.

curl -X DELETE 'https://your-domain.com/api/v2/agents/955f28f1-8515-40bb-802c-f3f730bf0343/sources/41b4c1d3-887d-46a5-95ae-c761922c6bc7' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Succès : 200 OK

{
  "deleted": true
}

Un UUID invalide renvoie 400 VALIDATION_INVALID_BODY. Un UUID valide qui n’identifie aucun document pour l’agent renvoie 404 RESOURCE_DOCUMENT_NOT_FOUND.

Obtenir l’état de l’entraînement

Chemin : /api/v2/agents/{agentId}/train

GET /api/v2/agents/{agentId}/train

Authentification : clé API Bearer ayant accès à {agentId}.

Succès : 200 OK, avec un objet de statut nu.

ChampTypeRemarques
statuschaînetraining lorsqu’une tâche en attente ou en cours existe, sinon trained lorsqu’un horodatage de dernier entraînement existe, sinon idle.
documentCountentierNombre de documents source pour l’agent.
lastTrainedAtentier ou nullHorodatage Unix en secondes.
activeJobobjet ou nullTâche en attente ou en cours la plus récente.
activeJob.idchaîneID de la tâche.
activeJob.statuschaîneStatut de tâche stocké.
activeJob.tasksCountentierNombre total de sous-tâches.
activeJob.tasksCompletedCountentierNombre de sous-tâches terminées.
activeJob.createdAtentier ou nullHorodatage Unix en secondes.
{
  "status": "training",
  "documentCount": 12,
  "lastTrainedAt": 1784246400,
  "activeJob": {
    "id": "c3c61f67-70fe-42da-a843-24112ded8aeb",
    "status": "running",
    "tasksCount": 8,
    "tasksCompletedCount": 3,
    "createdAt": 1784332800
  }
}

Démarrer le réentraînement des sources web

POST /api/v2/agents/{agentId}/train

Authentification : clé API Bearer ayant accès à {agentId}. Ce point de terminaison ne prend aucun corps de requête.

Le point de terminaison réentraîne les URL web indexées, et non les sources de texte, de Q&R, ou de fichier envoyé.

Lorsqu’au moins une URL indexée existe, le succès correspond à 202 Accepted :

{
  "jobId": "c3c61f67-70fe-42da-a843-24112ded8aeb",
  "count": 8,
  "message": "Retraining started for 8 URLs"
}

Lorsqu’aucune URL indexée n’existe, le succès correspond à 200 OK et aucune tâche n’est créée :

{
  "jobId": null,
  "count": 0,
  "message": "No web sources to retrain"
}
curl -X POST 'https://your-domain.com/api/v2/agents/955f28f1-8515-40bb-802c-f3f730bf0343/train' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Référence associée