El futuro sistema de plugins permitirá extensiones de terceros a través de ganchos de ciclo de vida, renderizadores personalizados y controladores de acción. Construya análisis de sentimientos, integraciones de CRM, moderación personalizada, todo sin modificar el código central. Aislado por seguridad y estabilidad.
Cada negocio tiene necesidades únicas que las soluciones genéricas no pueden abordar completamente. El sistema de plugins planeado permitirá a los desarrolladores extender la funcionalidad del widget con capacidades personalizadas, sin bifurcar el código o perder rutas de actualización.
Los widgets estándar no pueden predecir todos los requisitos comerciales. Puede que necesite:
Los plugins se registran durante la inicialización del widget y reciben callbacks en momentos clave del ciclo de vida:
onBeforeMessageSend — preprocesar mensajes de usuario antes de enviarlos al backendonAfterMessageReceive — postprocesar respuestas de IA antes de renderizaronConversationStart — inicializar el estado del plugin cuando comienza la conversaciónonConversationEnd — limpiar recursos, registrar análisisonWidgetOpen / onWidgetClose — rastrear compromiso, activar efectos secundariosonError — manejo o informe de errores personalizadosPreprocesadores modifican mensajes de usuario antes de enviar:
- Corrección ortográfica y autocorrección
- Filtro de profanidad o moderación de contenido
- Extracción de datos (detectar correos electrónicos, números de teléfono, ID de pedidos)
- Detección de sentimientos
Postprocesadores modifican respuestas de IA antes de renderizar:
- Mejora de Markdown (convertir tablas en componentes interactivos)
- Enriquecimiento de enlaces (vista previa de URLs, desdoblar metadatos)
- Filtrado de cumplimiento (redactar PII, datos financieros sensibles)
Los plugins no pueden comprometer la seguridad o estabilidad del widget:
WidgetSDK.registerPlugin({
name: 'sentiment-analyzer',
version: '1.0.0',
hooks: {
onBeforeMessageSend: async (message, context) => {
const sentiment = await analyzeSentiment(message.text);
return { ...message, metadata: { sentiment } };
},
onAfterMessageReceive: (message, context) => {
if (message.metadata?.sentiment < -0.5) {
context.escalateToHuman(message);
}
return message;
}
}
});