Skip to main content

Eventos del SDK

El SDK emite eventos globales que puedes escuchar para monitorear el estado:
// Error no manejado
thaliq.on('error', (error) => {
  console.error('Error:', error.message);
});

// Rate limit alcanzado
thaliq.on('rateLimit', (info) => {
  console.warn(`Rate limit. Retry en ${info.retryAfter}s`);
});

// Reintento automatico
thaliq.on('retry', (attempt, error, delayMs) => {
  console.warn(`Retry #${attempt} en ${delayMs}ms: ${error.message}`);
});

// Stream iniciado
thaliq.on('stream.start', (conversationId) => {
  console.log('Stream iniciado:', conversationId);
});

// Stream completado
thaliq.on('stream.end', (conversationId) => {
  console.log('Stream completado:', conversationId);
});

// Usuario identificado
thaliq.on('identify', (userId) => {
  console.log('Identificado:', userId);
});

// Estado limpiado
thaliq.on('reset', () => {
  console.log('Reset');
});

Metodos

MetodoDescripcion
on(event, handler)Registra un listener
off(event, handler)Elimina un listener
once(event, handler)Listener que se ejecuta una sola vez

Tabla de eventos

EventoHandlerCuando se emite
error(error: ThaliqError) => voidError no manejado
rateLimit(error: ThaliqError & { retryAfter }) => voidRate limit alcanzado
retry(attempt, error, delayMs) => voidAntes de un reintento automatico
stream.start(conversationId) => voidStream SSE iniciado
stream.end(conversationId) => voidStream SSE finalizado
identify(userId: string) => voididentify() llamado
reset() => voidreset() llamado

Eventos SSE del stream

Al consumir un stream con for await, cada evento tiene un campo type que identifica su contenido. La tabla completa de tipos:

Eventos de contenido

TipoDescripcionCampos
metaMetadata inicialconversationId: string
statusEstado del agentetext: string
content.deltaFragmento de textodelta: string

Eventos de tools

TipoDescripcionCampos
tool.startTool comienza a ejecutarsetool: string
tool.endTool terminotool: string, success: boolean

Eventos interactivos

TipoDescripcionCampos
actionAccion HITL requeridaaction: PendingAction
handoffEscalado a agente humanomessage: string, agentName?: string, reason?: string

Eventos de finalizacion

TipoDescripcionCampos
response.completedRespuesta completamessage, conversationId, insights[], metadata
message_stopGeneracion finalizadamodel: string, usage: { inputTokens, outputTokens }

Eventos de error y control

TipoDescripcionCampos
rate_limitRate limit excedidomessage: string, retryAfter: number
errorError durante el streammessage: string
keepalivePing para mantener conexionts: number

Ejemplo completo de manejo de eventos

const stream = thaliq.agent.stream('Analiza los datos');

for await (const event of stream) {
  switch (event.type) {
    case 'meta':
      console.log('Conversacion:', event.conversationId);
      break;

    case 'status':
      showSpinner(event.text);
      break;

    case 'content.delta':
      appendText(event.delta);
      break;

    case 'tool.start':
      showToolIndicator(event.tool);
      break;

    case 'tool.end':
      hideToolIndicator(event.tool, event.success);
      break;

    case 'action':
      await handleAction(event.action);
      break;

    case 'handoff':
      showHandoffNotice(event.message, event.agentName);
      break;

    case 'response.completed':
      showInsights(event.insights);
      saveMessageId(event.metadata?.messageId); // Para feedback
      break;

    case 'rate_limit':
      showRetryCountdown(event.retryAfter);
      break;

    case 'error':
      showError(event.message);
      break;
  }
}

Manejo de errores

El SDK expone errores tipados para un manejo granular:
import { ThaliqError, RateLimitError, AuthError } from '@thaliq/sdk';

try {
  const response = await thaliq.agent.chat('Hola');
} catch (error) {
  if (error instanceof RateLimitError) {
    console.log(`Rate limit. Retry en ${error.retryAfter}s`);
  } else if (error instanceof AuthError) {
    console.log('API Key invalida o feature no disponible');
  } else if (error instanceof ThaliqError) {
    console.log(`Error ${error.status}: ${error.message}`);
  }
}

Clases de error

ClaseHTTP StatusDescripcion
ThaliqErrorBaseError base del SDK
AuthError401 / 403API Key invalida o plan insuficiente
RateLimitError429Rate limit alcanzado (incluye retryAfter)
ValidationError400Request invalido (ej: falta apiKey)
ServiceError503Servicio no disponible
StreamErrorError durante streaming SSE
TimeoutErrorRequest timeout (configurable)
ConnectionErrorError de red

Propiedades de ThaliqError

class ThaliqError extends Error {
  message: string;      // Descripcion del error
  code: ErrorCode;      // Codigo unico (ej: 'AUTH_ERROR')
  status?: number;      // HTTP status (si aplica)
  retryable: boolean;   // Si se puede reintentar
}

Codigos de error

CodigoDescripcion
AUTH_ERRORAutenticacion fallida
RATE_LIMITRate limit excedido
VALIDATION_ERRORRequest invalido
SERVICE_ERRORServicio no disponible
STREAM_ERRORError en streaming
TIMEOUT_ERRORTimeout de request
CONNECTION_ERRORError de conexion
UNKNOWN_ERRORError no clasificado

RateLimitError

class RateLimitError extends ThaliqError {
  retryAfter?: number;  // Segundos para esperar
}

StreamError

Error especifico del streaming. Se lanza cuando:
  • El servidor envia un evento de error
  • Se intenta consumir un stream mas de una vez
  • El rate limit se excede durante el stream
try {
  for await (const event of stream) { /* ... */ }
} catch (error) {
  if (error instanceof StreamError) {
    console.log('Error de stream:', error.message);
  }
}

Errores en SSE vs excepciones

Hay dos formas en que pueden llegar errores durante streaming:
MecanismoCuandoComo manejarlo
Evento errorEl agente emite un error controladoif (event.type === 'error') dentro del loop
Evento rate_limitSe excedio el rate limit del tenantif (event.type === 'rate_limit') dentro del loop
Excepcion StreamErrorError de red, stream corruptotry/catch alrededor del for await
Excepcion RateLimitErrorRate limit en chat() (sin stream)try/catch alrededor de chat()
try {
  for await (const event of stream) {
    if (event.type === 'error') {
      // Error controlado del agente
      console.error('Agent error:', event.message);
    }
    if (event.type === 'rate_limit') {
      // Rate limit — esperar y reintentar
      console.warn(`Rate limit. Espera ${event.retryAfter}s`);
    }
  }
} catch (error) {
  // Error de red, stream corrupto, o doble consumo
  if (error instanceof StreamError) {
    console.error('Stream error:', error.message);
  }
}

Imports

Todos los errores se importan directamente desde el SDK:
import {
  ThaliqError,
  AuthError,
  RateLimitError,
  ValidationError,
  ServiceError,
  StreamError,
  TimeoutError,
  ConnectionError,
} from '@thaliq/sdk';