Fuentes y entrenamiento de la API v2

Lista y crea fuentes de agentes, sube archivos directamente al almacenamiento, elimina documentos, revisa el estado del entrenamiento e inicia el reentrenamiento de fuentes web.

Usa estos endpoints para administrar fuentes de texto, preguntas y respuestas, URL y archivos, y para reentrenar las fuentes web indexadas. Todos los endpoints de esta página requieren Authorization: Bearer YOUR_API_KEY y acceso a {agentId}.

Consulta el catálogo de errores para conocer los errores compartidos de autenticación, validación, cuota y recursos.

Objeto de fuente

CampoTipoNotas
idstringID del documento.
titlestringTítulo de la fuente.
sourceTypestringTipo de fuente almacenado, incluidos web_crawl, file_upload, text_snippet o qna_entry.
createdAtinteger o nullMarca de tiempo Unix en segundos.
lastCrawledAtinteger o nullMarca de tiempo Unix en segundos.
sourceMetadataany JSON valueMetadatos de fuente almacenados.

Listar fuentes

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

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

Autenticación: Clave de API bearer con acceso a {agentId}.

QueryRequeridoRestricciones
limitNoNúmero entero de 1 a 100; el valor predeterminado es 20.
cursorNoCursor opaco devuelto por la página anterior. Reenvíalo sin modificarlo.
sourceTypeNoweb_crawl, file_upload, text_snippet o 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'

Éxito: 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
  }
}

Los límites, cursores y tipos de fuente inválidos devuelven 400 VALIDATION_INVALID_BODY.

Agregar una fuente de texto

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

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

Autenticación: Clave de API bearer con acceso a {agentId}.

Campo del cuerpoRequeridoTipo y restricciones
titleString de 1 a 200 caracteres antes de recortar; el valor aceptado se recorta.
contentString no vacío, de no más de 262.144 bytes UTF-8 (256 KB), y que no contenga solo espacios en blanco.
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."}'

Éxito: 201 Created

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

Una entrada inválida o un fallo de procesamiento que no sea de almacenamiento devuelve 400 VALIDATION_INVALID_BODY. Un fallo de procesamiento por límite de almacenamiento devuelve 403 QUOTA_STORAGE_LIMIT.

Agregar una fuente de preguntas y respuestas

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

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

Autenticación: Clave de API bearer con acceso a {agentId}.

Campo del cuerpoRequeridoTipo y restricciones
titleString de 1 a 200 caracteres antes de recortar; el valor aceptado se recorta.
questionsArray de máximo 10 strings, cada uno de máximo 500 caracteres. Al menos una entrada debe contener un carácter que no sea de espacio en blanco.
answerString no vacío, de no más de 262.144 bytes UTF-8 (256 KB), y que no contenga solo espacios en blanco.
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."}'

Éxito: 201 Created

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

Una entrada inválida o un fallo de procesamiento que no sea de almacenamiento devuelve 400 VALIDATION_INVALID_BODY. Un fallo de procesamiento por límite de almacenamiento devuelve 403 QUOTA_STORAGE_LIMIT.

Agregar o reentrenar una fuente de URL

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

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

Autenticación: Clave de API bearer con acceso a {agentId}.

Campo del cuerpoRequeridoTipo y restricciones
urlURL HTTP o HTTPS no vacía, con un dominio. Si falta el protocolo, se normaliza a https://. Se rechazan los rangos loopback, privados, link-local, unique-local, reservados, las variantes de localhost, los TLD internos y los nombres de host de una sola etiqueta.

Enviar una URL ya indexada para el agente crea un trabajo de reentrenamiento. Una URL nueva primero verifica la capacidad de almacenamiento. Las URL de video también requieren acceso al plan de transcripción de video.

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"}'

Éxito: 202 Accepted

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

Una entrada inválida devuelve 400 VALIDATION_INVALID_BODY. La falta de acceso a la transcripción de video devuelve 403 SUBSCRIPTION_API_RESTRICTED_PLAN; los fallos de cuota de almacenamiento o de cola devuelven 403 QUOTA_STORAGE_LIMIT; un fallo en la creación del trabajo que no sea de cuota devuelve 500 INTERNAL_SERVER_ERROR.

Agregar fuentes de archivo con URL de carga firmadas

Las fuentes de archivo usan un flujo de API en dos pasos, de modo que los bytes del archivo viajan directamente desde tu cliente al almacenamiento privado en lugar de pasar por la ruta de la API. Cada archivo puede pesar como máximo 50 MB, y una solicitud puede contener como máximo 20 archivos. Las extensiones admitidas son .pdf, .txt, .md, .docx, .xlsx y .pptx.

1. Crear URL de carga firmadas

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

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

Envía los nombres de archivo originales:

{
  "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"}]}'

Éxito: 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. Subir los bytes del archivo

Sube cada archivo directamente a su uploadUrl con PUT:

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

Cuando uses el cliente de JavaScript de Supabase, pasa la ruta y el token correspondientes del paso 1:

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

No cambies ni construyas las rutas de almacenamiento por tu cuenta. El registro solo acepta rutas devueltas para este agente en el paso 1.

3. Registrar los archivos subidos

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

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

Después de que cada carga directa se complete, registra las rutas devueltas con sus nombres de archivo originales:

{
  "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"
    }
  ]
}

Éxito: 202 Accepted

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

El registro verifica que cada objeto exista, no esté vacío, no supere los 50 MB y pertenezca al agente solicitado antes de iniciar el trabajo de procesamiento. Las cargas inválidas o faltantes devuelven 400 VALIDATION_INVALID_BODY; una denegación por cuota de almacenamiento devuelve 403 QUOTA_STORAGE_LIMIT; los fallos de almacenamiento o de cola devuelven 500 INTERNAL_SERVER_ERROR.

Eliminar una fuente

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

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

Autenticación: Clave de API bearer con acceso a {agentId}.

{documentId} debe ser un UUID devuelto por una respuesta de creación o listado de fuentes.

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'

Éxito: 200 OK

{
  "deleted": true
}

Un UUID inválido devuelve 400 VALIDATION_INVALID_BODY. Un UUID válido que no identifica ningún documento del agente devuelve 404 RESOURCE_DOCUMENT_NOT_FOUND.

Obtener el estado del entrenamiento

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

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

Autenticación: Clave de API bearer con acceso a {agentId}.

Éxito: 200 OK, con un objeto de estado simple.

CampoTipoNotas
statusstringtraining cuando existe un trabajo pendiente o en ejecución; de lo contrario, trained cuando existe una marca de tiempo del último entrenamiento; de lo contrario, idle.
documentCountintegerCantidad de documentos de fuente del agente.
lastTrainedAtinteger o nullMarca de tiempo Unix en segundos.
activeJobobject o nullTrabajo pendiente o en ejecución más reciente.
activeJob.idstringID del trabajo.
activeJob.statusstringEstado del trabajo almacenado.
activeJob.tasksCountintegerCantidad total de tareas.
activeJob.tasksCompletedCountintegerCantidad de tareas completadas.
activeJob.createdAtinteger o nullMarca de tiempo Unix en segundos.
{
  "status": "training",
  "documentCount": 12,
  "lastTrainedAt": 1784246400,
  "activeJob": {
    "id": "c3c61f67-70fe-42da-a843-24112ded8aeb",
    "status": "running",
    "tasksCount": 8,
    "tasksCompletedCount": 3,
    "createdAt": 1784332800
  }
}

Iniciar el reentrenamiento de fuentes web

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

Autenticación: Clave de API bearer con acceso a {agentId}. Este endpoint no requiere cuerpo de solicitud.

El endpoint reentrena las URL web indexadas, no las fuentes de texto, preguntas y respuestas, ni las de archivos subidos.

Cuando existe al menos una URL indexada, el éxito es 202 Accepted:

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

Cuando no existe ninguna URL indexada, el éxito es 200 OK y no se crea ningún trabajo:

{
  "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'

Referencia relacionada