Mensajes de Agente
Los agentes pueden enviar mensajes a candidatos con atribucion visual, indicadores de escritura y confirmaciones de lectura en tiempo real.
Atribucion de Mensajes
Identificacion Visual
Cuando un agente envia un mensaje, se muestra con un icono de robot para diferenciarlo de mensajes humanos.
TIPOS DE MENSAJES
| Origen | Icono | Color | Identificador |
|---|---|---|---|
| Chatbot | Robot | Rosa (#eb2f96) | channel="chatbot" |
| Agente Workflow | Robot | Morado (#722ed1) | senderAgentId presente |
| Reclutador Humano | Avatar | Azul | Sin senderAgentId |
| Candidato | Avatar | Gris | direction="inbound" |
Parametros de Mensaje
Cuando un agente envia un mensaje, se incluyen estos campos:
{
"content": "Hola! Soy tu asistente virtual.",
"channel": "platform",
"direction": "outbound",
"senderAgentId": 5, // ID del agente
"senderName": "Maria" // Nombre del agente para mostrar
}
Vista del Candidato
El candidato ve en su inbox:
┌─────────────────────────────────────┐
│ [Robot] Maria │
│ Hola! Soy tu asistente virtual. │
│ 10:30 AM ✓✓│
└─────────────────────────────────────┘
Vista del Reclutador
El reclutador ve el mismo mensaje con contexto adicional:
┌─────────────────────────────────────┐
│ [Robot] Agente: Maria (ID: 5) │
│ Hola! Soy tu asistente virtual. │
│ 10:30 AM │
│ Ejecucion #123 │
└─────────────────────────────────────┘
Indicador de Escritura
Comportamiento
Cuando un agente esta procesando y a punto de enviar un mensaje:
- Se emite evento "agent:typing" con
isTyping=true - UI muestra "Maria escribiendo..."
- Agente procesa y envia mensaje
- Se emite evento "agent:typing" con
isTyping=false - UI oculta indicador
Destinatarios del Indicador
El indicador se emite a todos los participantes relevantes:
| Destinatario | Evento | Uso |
|---|---|---|
| Owner (Reclutador) | agent:typing | Ve actividad del agente |
| Candidato | agent:typing | Ve que alguien responde |
| Sesion Chatbot | agent:typing | Widget muestra indicador |
Estructura del Evento
{
"event": "agent:typing",
"data": {
"threadId": 123,
"agentName": "Maria",
"isTyping": true
}
}
UI del Indicador
┌─────────────────────────────────────┐
│ │
│ Maria escribiendo... │
│ ● ● ● │
│ │
└─────────────────────────────────────┘
Confirmacion de Lectura
Comportamiento Automatico
Cuando un agente responde a un mensaje del candidato:
- Agente recibe el mensaje entrante
- Agente procesa y genera respuesta
- Antes de enviar: marca mensajes entrantes como leidos
- Emite evento "message:statusChanged" al candidato
- Envia respuesta
Estados de Mensaje
| Estado | Icono | Descripcion |
|---|---|---|
| sent | ✓ | Mensaje enviado al servidor |
| delivered | ✓✓ | Mensaje entregado (WebSocket activo) |
| read | ✓✓ (azul) | Mensaje leido por el destinatario |
Evento de Cambio de Estado
{
"event": "message:statusChanged",
"data": {
"messageId": 456,
"threadId": 123,
"status": "read",
"readAt": "2024-01-11T10:30:00Z"
}
}
Vista del Candidato
Antes de que el agente lea:
Mis documentos estan listos ✓✓
Despues de que el agente lea:
Mis documentos estan listos ✓✓ (azul)
Leido 10:30
Flujo Completo de Interaccion
Secuencia de Eventos
1. Candidato envia mensaje
→ message:new emitido a owner
→ Agente detecta mensaje entrante
2. Agente comienza a procesar
→ agent:typing (isTyping=true) a candidato
→ UI muestra "Maria escribiendo..."
3. Agente marca mensaje como leido
→ message:statusChanged (status=read) a candidato
→ UI actualiza checks a azul
4. Agente envia respuesta
→ message:new emitido a candidato
→ agent:typing (isTyping=false) a candidato
→ UI oculta indicador y muestra mensaje
Diagrama de Tiempo
Candidato Servidor Agente
│ │ │
│──── mensaje ────▶│ │
│ │──── detecta ────▶│
│ │ │
│◀─ typing:true ───│◀─── procesa ─────│
│ │ │
│◀── read:true ────│◀─── lee ─────────│
│ │ │
│◀── mensaje ──────│◀─── responde ────│
│◀─ typing:false ──│ │
│ │ │
Configuracion
Habilitar Indicadores en Agente
En la accion send_message:
{
"actionType": "send_message",
"parameters": {
"message": "{{response}}",
"showTypingIndicator": true,
"markAsRead": true
}
}
Personalizar Nombre del Agente
En la configuracion del agente:
{
"name": "Maria",
"displayName": "Maria - Asistente de RRHH",
"configuration": {
"personality": "friendly",
"showTypingDelay": 500
}
}
WebSocket Events Reference
Eventos Emitidos
| Evento | Payload | Destinatarios |
|---|---|---|
| message:new | {id, content, channel, senderAgentId, ...} | Owner, Candidato |
| agent:typing | {threadId, agentName, isTyping} | Owner, Candidato, Chatbot Session |
| message:statusChanged | {messageId, threadId, status, readAt} | Candidato |
| thread:updated | {threadId, lastMessage, unreadCount} | Owner |
Suscripcion en Frontend
// Escuchar typing
socket.on('agent:typing', (data) => {
if (data.isTyping) {
showTypingIndicator(data.threadId, data.agentName);
} else {
hideTypingIndicator(data.threadId);
}
});
// Escuchar cambio de estado
socket.on('message:statusChanged', (data) => {
updateMessageStatus(data.messageId, data.status, data.readAt);
});
Debugging
Logs Relevantes
[InboxService] Emitting agent typing indicator: threadId=123, agentName=Maria, isTyping=true
[MessageService] Agent marked 3 inbound messages as read
[WebSocketService] Emitting message:statusChanged to user:5
[InboxService] Emitting message:new to candidate 5 for outbound message
[InboxService] Emitting agent typing indicator: threadId=123, agentName=Maria, isTyping=false
Problemas Comunes
| Problema | Causa | Solucion |
|---|---|---|
| No muestra robot | senderAgentId no incluido | Verificar WebSocket emission |
| Typing no aparece | Candidato no suscrito | Verificar conexion WebSocket |
| Read no actualiza | Evento no emitido | Verificar markAsRead en MessageService |
| Indicador no desaparece | isTyping=false no enviado | Verificar finally block |
Proximos Pasos
- Agentes Encadenados - Parent-child sync
- Bloqueo de Threads - Concurrencia
- Reclutador Virtual - Bot conversacional