🚀 Descripción General
AIDARA API es una plataforma avanzada para integrar asistentes en tus aplicaciones. Ofrece streaming de respuestas en tiempo real y gestión completa de threads para conversaciones persistentes.
✨ Características Principales
- ⚡ Streaming en Tiempo Real: Respuestas progresivas tipo-ChatGPT
- 🔐 Autenticación Robusta: Sistema de API Keys con rate limiting
- 🧵 Gestión de Threads: Conversaciones persistentes y organizadas
- 💚 Health Checks: Monitoreo del estado del servicio
- 📋 API Simple: Endpoints intuitivos y fáciles de usar
🎯 Casos de Uso
- 💬 Chatbots Inteligentes: Asistentes virtuales para atención al cliente
- 📚 Asistentes Educativos: Tutores personalizados para e-learning
- 🏢 Herramientas Empresariales: Automatización de tareas de oficina
- 🔍 Análisis de Contenido: Procesamiento inteligente de documentos
- 🛠️ Asistentes de Código: Ayuda para desarrolladores
- 🎨 Creación de Contenido: Generación automática de textos
🔐 Autenticación
📋 Obtener API Key
Contacta con nuestro equipo para obtener tu API Key personalizada:
- Email: comercial@wittymindsets.com
- Web: https://www.wittymindsets.com/contacto
🛡️ Usar API Key
Incluye tu API Key en todas las peticiones mediante la cabecera X-API-Key:
X-API-Key: AIDARA_your-api-key-here
📡 Información Base
🌐 URL Base
https://api.wittymindsets.com/aidara
📄 Formato de Respuesta
JSON para endpoints estándar, Server-Sent Events (SSE) para streaming.
- Estándar:
application/json - Streaming:
text/event-stream
⚡ Límites y Restricciones
- Rate limiting: 60 req/min
- Mensaje máximo: 4000 chars
- Timeout: 120 segundos
📋 Endpoints Disponibles
Verifica el estado del servicio AIDARA y sus dependencias.
Verificación básica:
/health
Uso: Verificación rápida de que el servicio está en línea.
{
"status": "ok",
"timestamp": "2025-06-16T10:30:00.000Z",
"service": "AIDARA API",
"version": "3.0.0"
}
Verificación detallada:
/health/detailed
Uso: Verificación completa del estado de base de datos y servicio de IA.
{
"status": "ok",
"timestamp": "2025-06-16T10:30:00.000Z",
"service": "AIDARA API",
"version": "3.0.0",
"checks": {
"database": "ok",
"openai": "ok"
},
"uptime": 123456,
"memory": {
"rss": 123456789,
"heapTotal": 123456789,
"heapUsed": 123456789
}
}
Endpoint principal. Envía un mensaje al asistente y recibe la respuesta en streaming en tiempo real.
/chat/send
Cabeceras requeridas:
X-API-Key: tu-api-key
Content-Type: application/json
Parámetros del cuerpo:
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
message |
string | ✅ | Mensaje a enviar al asistente (máx 4000 chars) |
thread_id |
string | Opcional | ID del thread existente (se crea uno nuevo si no se proporciona) |
Respuesta (Streaming SSE):
La respuesta llega como Server-Sent Events con los siguientes tipos de eventos:
| Tipo de Evento | Descripción | Datos |
|---|---|---|
start |
Inicio del procesamiento | Mensaje informativo |
thread_id |
ID del thread (nuevo o existente) | String con ID del thread |
content |
Contenido progresivo de la respuesta | Fragmentos de texto |
complete |
Respuesta completa con estadísticas | Mensaje completo y métricas |
error |
Error durante el procesamiento | Mensaje de error |
end |
Fin del stream | Sin datos |
Ejemplo de flujo de eventos:
// Primer evento: Inicio
data: {"type": "start", "timestamp": "2025-06-16T10:30:00.000Z", "data": "Iniciando procesamiento..."}
// ID del thread
data: {"type": "thread_id", "timestamp": "2025-06-16T10:30:01.000Z", "data": "thread_abc123"}
// Eventos de contenido progresivo
data: {"type": "content", "timestamp": "2025-06-16T10:30:02.000Z", "data": "Hola, "}
data: {"type": "content", "timestamp": "2025-06-16T10:30:02.100Z", "data": "¿en qué puedo "}
data: {"type": "content", "timestamp": "2025-06-16T10:30:02.200Z", "data": "ayudarte?"}
// Evento de finalización
data: {"type": "complete", "timestamp": "2025-06-16T10:30:03.000Z", "data": {
"message": "Hola, ¿en qué puedo ayudarte?",
"tokens": {
"input": 15,
"output": 8,
"total": 23
}
}}
// Fin del stream
data: {"type": "end", "timestamp": "2025-06-16T10:30:03.100Z"}
💻 Ejemplos de Código
Ejemplos con cURL
# Verificar estado de la API
curl -X GET https://api.wittymindsets.com/aidara/health
# Verificar estado detallado
curl -X GET https://api.wittymindsets.com/aidara/health/detailed
# Enviar mensaje con streaming
curl -X POST \
https://api.wittymindsets.com/aidara/chat/send \
-H "X-API-Key: tu-api-key" \
-H "Content-Type: application/json" \
-d '{
"message": "Explícame qué es la IA",
"thread_id": "thread_abc123"
}' \
--no-buffer
Ejemplo con JavaScript (Browser)
class AidaraAPI {
constructor(apiKey, baseUrl = 'https://api.wittymindsets.com/aidara') {
this.apiKey = apiKey;
this.baseUrl = baseUrl;
}
async checkHealth() {
const response = await fetch(`${this.baseUrl}/health`);
return response.json();
}
async checkDetailedHealth() {
const response = await fetch(`${this.baseUrl}/health/detailed`);
return response.json();
}
async sendMessageStreaming(message, threadId = null, onContent, onComplete) {
const response = await fetch(`${this.baseUrl}/chat/send`, {
method: 'POST',
headers: {
'X-API-Key': this.apiKey,
'Content-Type': 'application/json'
},
body: JSON.stringify({
message,
thread_id: threadId
})
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
const reader = response.body.getReader();
const decoder = new TextDecoder();
let buffer = '';
try {
while (true) {
const { done, value } = await reader.read();
if (done) break;
buffer += decoder.decode(value, { stream: true });
const lines = buffer.split('\n');
buffer = lines.pop(); // Guardar línea incompleta
for (const line of lines) {
if (line.startsWith('data: ')) {
try {
const data = JSON.parse(line.slice(6));
switch (data.type) {
case 'thread_id':
console.log('Thread ID:', data.data);
break;
case 'content':
onContent(data.data);
break;
case 'complete':
onComplete(data.data);
break;
case 'error':
throw new Error(data.data);
case 'end':
return;
}
} catch (e) {
console.warn('Error parsing SSE data:', e);
}
}
}
}
} finally {
reader.releaseLock();
}
}
}
// Uso del cliente
const aidara = new AidaraAPI('tu-api-key');
// Verificar estado
aidara.checkHealth().then(console.log);
// Enviar mensaje con streaming
aidara.sendMessageStreaming(
'¿Puedes explicarme qué es machine learning?',
null,
(content) => {
// Mostrar contenido progresivamente
document.getElementById('chat').innerHTML += content;
},
(data) => {
console.log('Respuesta completa:', data.message);
console.log('Tokens usados:', data.tokens);
}
).catch(console.error);
Ejemplo con Python
import requests
import json
class AidaraAPI:
def __init__(self, api_key, base_url='https://api.wittymindsets.com/aidara'):
self.api_key = api_key
self.base_url = base_url
self.headers = {
'X-API-Key': api_key,
'Content-Type': 'application/json'
}
def check_health(self):
"""Verificar estado básico del servicio"""
response = requests.get(f'{self.base_url}/health')
response.raise_for_status()
return response.json()
def check_detailed_health(self):
"""Verificar estado detallado del servicio"""
response = requests.get(f'{self.base_url}/health/detailed')
response.raise_for_status()
return response.json()
def send_message_streaming(self, message, thread_id=None, on_content=None, on_complete=None):
"""Envía mensaje con streaming"""
url = f'{self.base_url}/chat/send'
data = {'message': message}
if thread_id:
data['thread_id'] = thread_id
response = requests.post(
url,
headers=self.headers,
json=data,
stream=True
)
response.raise_for_status()
for line in response.iter_lines():
if line:
line = line.decode('utf-8')
if line.startswith('data: '):
try:
data = json.loads(line[6:])
event_type = data.get('type')
if event_type == 'thread_id':
print(f"Thread ID: {data['data']}")
elif event_type == 'content':
if on_content:
on_content(data['data'])
else:
print(data['data'], end='', flush=True)
elif event_type == 'complete':
if on_complete:
on_complete(data['data'])
print(f"\nTokens: {data['data'].get('tokens', {})}")
elif event_type == 'error':
raise Exception(f"Error: {data['data']}")
elif event_type == 'end':
break
except json.JSONDecodeError:
continue
# Ejemplo de uso
if __name__ == "__main__":
aidara = AidaraAPI('tu-api-key')
# Verificar estado
print("Estado del servicio:")
print(json.dumps(aidara.check_health(), indent=2))
# Enviar mensaje con streaming
print("\nEnviando mensaje...")
aidara.send_message_streaming(
"Explícame qué es la inteligencia artificial en términos simples"
)
Ejemplo con Node.js
const fetch = require('node-fetch');
class AidaraAPI {
constructor(apiKey, baseUrl = 'https://api.wittymindsets.com/aidara') {
this.apiKey = apiKey;
this.baseUrl = baseUrl;
}
async checkHealth() {
const response = await fetch(`${this.baseUrl}/health`);
return response.json();
}
async checkDetailedHealth() {
const response = await fetch(`${this.baseUrl}/health/detailed`);
return response.json();
}
async sendMessageStreaming(message, threadId = null) {
return new Promise((resolve, reject) => {
const url = `${this.baseUrl}/chat/send`;
const headers = {
'X-API-Key': this.apiKey,
'Content-Type': 'application/json'
};
fetch(url, {
method: 'POST',
headers,
body: JSON.stringify({
message,
thread_id: threadId
})
})
.then(response => {
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
let fullResponse = '';
let currentThreadId = null;
response.body.on('data', (chunk) => {
const lines = chunk.toString().split('\n');
lines.forEach(line => {
if (line.startsWith('data: ')) {
try {
const data = JSON.parse(line.slice(6));
switch (data.type) {
case 'thread_id':
currentThreadId = data.data;
console.log(`Thread ID: ${currentThreadId}`);
break;
case 'content':
process.stdout.write(data.data);
fullResponse += data.data;
break;
case 'complete':
console.log(`\n✓ Completado`);
console.log(`Tokens: ${JSON.stringify(data.data.tokens)}`);
resolve({
threadId: currentThreadId,
message: fullResponse,
tokens: data.data.tokens
});
break;
case 'error':
reject(new Error(data.data));
break;
case 'end':
// Stream terminado
break;
}
} catch (e) {
console.warn('Error parsing SSE:', e);
}
}
});
});
response.body.on('error', reject);
})
.catch(reject);
});
}
}
// Uso
async function main() {
const aidara = new AidaraAPI('tu-api-key');
try {
// Verificar estado
console.log('Estado del servicio:');
console.log(JSON.stringify(await aidara.checkHealth(), null, 2));
console.log('\nEnviando mensaje...\n');
const result = await aidara.sendMessageStreaming(
'¿Puedes explicarme las ventajas del streaming en APIs?'
);
console.log(`\nRespuesta guardada en thread: ${result.threadId}`);
} catch (error) {
console.error('Error:', error.message);
}
}
main();
⚠️ Códigos de Error
| Código HTTP | Descripción | Solución |
|---|---|---|
| 401 | API Key requerida | Incluye el header X-API-Key con tu clave válida |
| 401 | API Key inválida | Verifica que la clave API sea correcta y esté activa |
| 403 | Límite mensual de tokens excedido | Contacta para ampliar tu límite o espera al siguiente mes |
| Código HTTP | Descripción | Solución |
|---|---|---|
| 400 | Mensaje requerido | Incluye el campo message en el cuerpo de la petición |
| 400 | Mensaje demasiado largo | El mensaje debe tener máximo 4000 caracteres |
| 400 | Assistant ID no configurado | Contacta soporte - problema de configuración de cuenta |
| Código HTTP | Descripción | Solución |
|---|---|---|
| 429 | Rate limit excedido | Espera 1 minuto antes de realizar otra petición |
| 429 | Demasiadas peticiones | Reduce la frecuencia de peticiones (máx 60/min) |
| 429 | Límite de rate de OpenAI excedido | Intenta de nuevo en unos momentos - límite del proveedor de IA |
| Código HTTP | Descripción | Solución |
|---|---|---|
| 500 | Error interno del servidor | Contacta con soporte técnico |
| 500 | Error al crear thread | Reintenta la operación o contacta soporte |
| 500 | Error al enviar mensaje | Verifica el formato del mensaje y reintenta |
| 500 | Error al ejecutar asistente | Problema con el servicio de IA, contacta soporte |
| 503 | Error al conectar con OpenAI | Servicio temporalmente no disponible, reintenta en unos minutos |
| 503 | Health check fallido | Servicio degradado - algunos componentes no están disponibles |
📋 Estructura de Respuesta de Error
{
"success": false,
"error": "Descripción del error",
"code": "CODIGO_ESPECIFICO",
"details": {
// Información adicional del error (opcional)
}
}
🌊 Errores Durante el Streaming
Durante el streaming, los errores se envían como eventos SSE del tipo error:
data: {
"type": "error",
"timestamp": "2025-06-16T10:30:00.000Z",
"data": "Descripción del error"
}
| Error | Descripción | Acción |
|---|---|---|
| El asistente falló | Error en la ejecución del asistente de IA | Reintenta o contacta soporte |
| El procesamiento fue cancelado | El run fue cancelado por el sistema | Reintenta la petición |
| El procesamiento expiró | Timeout en la respuesta del asistente | Reintenta con un mensaje más simple |
| El asistente no generó respuesta | Problema de configuración del asistente | Contacta soporte técnico |
💡 Manejo de Errores en Cliente
Implementa siempre manejo de errores robusto: captura errores HTTP, eventos SSE de error, timeouts de conexión y desconexiones inesperadas. Para errores 429 (rate limiting), implementa backoff exponencial.
📞 Soporte y Contacto
🛠️ Soporte Técnico
- Email: support@wittymindsets.com
- Horario: Lunes a Viernes, 9:00 - 18:00 (CET)
- Tiempo de respuesta: < 8 horas laborales
🔧 Información para Soporte
Cuando contactes con soporte, incluye:
- • Código de error HTTP
- • Mensaje de error completo
- • Timestamp de la petición
- • Tu API Key (solo los primeros 8 caracteres)
- • Código de ejemplo que falla
💼 Soporte Comercial
- Email: comercial@wittymindsets.com
- Horario: Lunes a Viernes, 9:00 - 18:00 (CET)
- Consultas: Precios, límites, upgrades
🌐 Enlaces Útiles
- Web: wittymindsets.com/contacto
- Base URL:
https://api.wittymindsets.com/aidara - Estado del servicio:
/health
🚀 ¿Listo para empezar?
Solicita tu API Key personalizada y comienza a integrar asistentes de IA en minutos:
- Contacta comercial@wittymindsets.com
- Recibe tu API Key y configuración de asistente
- Prueba el endpoint de health:
GET /health - Prueba los ejemplos de código con
POST /chat/send - Integra en tu aplicación
- ¡Disfruta del streaming en tiempo real!