API de Chat IA

La API de Chat permite una integración completa con el asistente de IA de CapData. Puedes gestionar carpetas, conversaciones, GPTs personalizados y enviar mensajes para obtener respuestas del modelo.

Autenticación

Utiliza la cabecera unificada X-CapData-Token. El valor puede ser la API Key de un Propietario, una Agencia o el token de un Agente.

Ejemplo de Cabecera
X-CapData-Token: tu_api_key_o_token_de_agente

Gestión de Carpetas (Folders)

Organiza tus conversaciones en carpetas para una mejor gestión.

GET /api/chat/folders

Obtiene una lista de todas las carpetas de chat pertenecientes al actor autenticado.

Respuesta Exitosa (200 OK)

application/json
{
    "folders": [
        {
            "id": 1,
            "name": "Viajes Personales",
            "conversation_count": 5
        },
        {
            "id": 2,
            "name": "Consultas de Clientes",
            "conversation_count": 12
        }
    ]
}

POST /api/chat/folders

Crea una nueva carpeta de chat.

Cuerpo de la Petición

application/json
{
    "name": "Nuevos Proyectos"
}

Respuesta Exitosa (201 Created)

Devuelve el objeto de la carpeta recién creada.

application/json
{
    "folder": {
        "id": 3,
        "name": "Nuevos Proyectos",
        "conversation_count": 0
    }
}

PUT /api/chat/folders/<folder_id>

Renombra una carpeta existente.

Cuerpo de la Petición

application/json
{
    "new_name": "Proyectos Archivados"
}

Respuesta Exitosa (200 OK)

Devuelve el objeto de la carpeta actualizada.

DELETE /api/chat/folders/<folder_id>

Elimina una carpeta. Las conversaciones que contenía no se eliminan, simplemente quedan sin asignar a ninguna carpeta.

Respuesta Exitosa (200 OK)

application/json
{
    "message": "Carpeta ID 3 eliminada correctamente."
}

GET /api/chat/conversations/unfoldered

Obtiene una lista de las conversaciones que no están asignadas a ninguna carpeta.

Respuesta Exitosa (200 OK)

Devuelve un array de objetos de conversación.

GET /api/chat/folders/<folder_id>/conversations

Obtiene una lista de todas las conversaciones dentro de una carpeta específica.

Respuesta Exitosa (200 OK)

Devuelve un array de objetos de conversación.

PUT /api/chat/conversations/<conversation_id>/move

Mueve una conversación a una carpeta diferente. Para sacar una conversación de su carpeta, usa null como valor.

Cuerpo de la Petición

application/json
{
    "folder_id": 2
}

Respuesta Exitosa (200 OK)

Devuelve el objeto de la conversación actualizada.


Gestión de Conversaciones

Endpoints para crear, consultar y modificar conversaciones.

POST /api/chat/conversations

Crea una nueva conversación. Opcionalmente, se puede asignar a una carpeta y/o a un GPT personalizado desde su creación. Si indicas chat_gpt_id, el ID debe corresponder a un GPT accesible y activo para el actor autenticado.

Cuerpo de la Petición

application/json
{
    "title": "Planificación de viaje a Japón",
    "folder_id": 1,
    "chat_gpt_id": 7
}

Respuesta Exitosa (201 Created)

Devuelve el objeto de la conversación recién creada.

GET /api/chat/conversations/<conversation_id>/messages

Recupera el historial completo de mensajes de una conversación.

Respuesta Exitosa (200 OK)

application/json
{
    "messages": [
        {
            "role": "user",
            "content": "¿Cuáles son los mejores meses para visitar Kioto?",
            "timestamp": "..."
        },
        {
            "role": "assistant",
            "content": "Los mejores meses para visitar Kioto son...",
            "timestamp": "..."
        }
    ]
}

POST /api/chat/conversations/<conversation_id>/messages

Envía un mensaje a una conversación existente y obtiene una respuesta del asistente de IA. Esta acción consume tokens.

Cuerpo de la Petición

application/json
{
    "message": "¿Cuáles son los mejores meses para visitar Kioto?"
}

Respuesta Exitosa (200 OK)

application/json
{
    "reply": "Los mejores meses para visitar Kioto son la primavera (marzo-mayo) por los cerezos en flor, y el otoño (octubre-noviembre) por los colores vibrantes...",
    "tokens_remaining": 98
}

POST /api/chat/conversations/<conversation_id>/upload

Sube un documento (.pdf, .txt, .md) a una conversación para que su contenido sea utilizado como contexto en los siguientes mensajes.

Cuerpo de la Petición

La petición debe ser de tipo multipart/form-data. El archivo debe enviarse bajo la clave document.

Ejemplo (pseudocódigo cURL)
curl -X POST "https://capdata.es/api/chat/conversations/42/upload" \
     -H "X-CapData-Token: tu_api_key_o_token" \
     -F "document=@/ruta/a/tu/reserva_hotel.pdf"

Respuesta Exitosa (200 OK)

application/json
{
    "success": true,
    "message": "Archivo 'reserva_hotel.pdf' analizado y añadido al contexto de esta conversación. Ya puedes hacer preguntas sobre él."
}

Gestión de GPTs Personalizados

Crea, gestiona e importa asistentes de IA especializados con su propia base de conocimiento.

GET /api/chat/gpts

Obtiene una lista de todos los GPTs accesibles para el actor (incluye los importados de los globales). La respuesta incluye metadatos como knowledge_file_count, is_global_origin y display_type.

Respuesta Exitosa (200 OK)

application/json
{
  "gpts": [
    {
      "id": 7,
      "name": "Asistente de Viajes",
      "description": "Especializado en rutas y aerolíneas",
      "is_active": true,
      "knowledge_file_count": 3,
      "is_global_origin": false,
      "display_type": "Cliente"
    }
  ]
}

GET /api/chat/gpts/available-global

Lista los GPTs globales disponibles para ser importados por el cliente.

Respuesta Exitosa (200 OK)

application/json
{
  "available_global_gpts": [
    {
      "id": 3,
      "name": "Plantilla Hotelera",
      "description": "Base para atención hotelera",
      "is_global": true,
      "can_import": true,
      "knowledge_file_count": 5
    }
  ]
}

POST /api/chat/gpts/import/<global_gpt_id>

Importa un GPT global para el cliente autenticado.

Respuesta Exitosa (201 Created)

application/json
{
  "message": "GPT 'Plantilla Hotelera' importado exitosamente.",
  "imported_gpt": {
    "id": 12,
    "name": "Plantilla Hotelera",
    "is_active": true
  }
}

POST /api/chat/gpts

Crea un nuevo GPT personalizado con sus archivos de conocimiento.

Cuerpo de la Petición

La petición debe ser multipart/form-data con campos:

Ejemplo (pseudocódigo cURL)
curl -X POST "https://capdata.es/api/chat/gpts" \
  -H "X-CapData-Token: tu_api_key_o_token" \
  -F "name=Asistente Comercial" \
  -F "system_prompt=Responde como un asesor comercial experto" \
  -F "description=Entrenado con PDFs de producto" \
  -F "is_active=true" \
  -F "knowledge_files=@/ruta/catálogo.pdf" \
  -F "knowledge_files=@/ruta/procedimientos.txt"

Respuesta Exitosa (201 Created)

application/json
{
  "gpt": {
    "id": 21,
    "name": "Asistente Comercial",
    "description": "Entrenado con PDFs de producto",
    "is_active": true,
    "knowledge_file_count": 2
  }
}

Errores comunes y consumo de tokens

Consumo de tokens

402 Payment Required (saldo insuficiente)

Cuando el actor no tiene suficientes tokens para completar la operación, el servidor devuelve 402 con información del saldo.

application/json
{
  "error": "Tokens insuficientes para enviar el mensaje.",
  "tokens_remaining": 0
}

404 / 403 (recurso inexistente o sin permisos)

Ejemplo 404 (JSON)
{
  "error": "Conversación no encontrada."
}
Ejemplo 403 (JSON)
{
  "error": "No tienes permisos para esta acción."
}

415 Unsupported Media Type (subida de ficheros)

En POST /api/chat/conversations/<id>/upload solo se aceptan extensiones .pdf, .txt y .md. Si envías otro tipo de archivo, recibirás 415.

application/json
{
  "error": "Tipo de archivo no permitido. Sube solo .pdf, .txt, .md."
}

503 Service Unavailable (fallo del asistente IA)

Si el motor de IA no puede generar respuesta (p.ej., error temporal del proveedor), la API devolverá 503 en POST /api/chat/conversations/<id>/messages.

application/json
{
  "error": "Error del asistente IA: servicio temporalmente no disponible."
}
Recomendación: gestiona de forma explícita los estados 402, 403, 404, 415 y 503 en tu cliente para ofrecer mensajes claros al usuario final.