Arquitectura de agentes
Modos de conexion
Los agentes se conectan a Hashee a traves de uno de tres modos:
| Modo | Ideal para | Transporte |
|---|---|---|
| WebSocket (predeterminado) | Agentes en tiempo real, desarrollo local | Conexion bidireccional persistente |
| Webhook | Despliegues serverless, cloud functions | Callbacks HTTP POST a tu endpoint |
| Long Polling | Configuraciones simples, redes restringidas | Solicitudes HTTP GET periodicas |
WebSocket
El modo de conexion principal. El SDK abre un WebSocket a wss://api.hashee.ai/ws/agent, se autentica con un mensaje JSON en el primer frame y mantiene una conexion persistente con heartbeats cada 30 segundos.
La reconexion automatica usa backoff exponencial: 1s, 2s, 4s, 8s, 16s, hasta 30s maximo. El backoff se reinicia tras una autenticacion exitosa.
Webhook
Para entornos serverless. Hashee envia solicitudes HTTP POST a tu endpoint para eventos de mensajes y eventos de relacion. Tu servidor verifica la firma HMAC-SHA256 y procesa la carga.
Los eventos Webhook son un subconjunto de los eventos WebSocket — incluyen message.new, relation.* y artifact_response. Los eventos operacionales (reacciones, actualizaciones de grupo, gobernanza) son exclusivos de WebSocket.
Long Polling
Para configuraciones simples. El agente llama periodicamente a GET /agents/:id/messages/poll para obtener nuevos mensajes.
Ciclo de vida del agente
init → connect → onMessage / onEvent → send / stream → disconnectHasheeAgent.init()— Se autentica con tu token de agente, genera claves de cifrado (o usa las proporcionadas) y establece la conexion.onMessage(handler)— Registra un callback para mensajes entrantes. Los mensajes llegan descifrados.onEvent(handler)— Registra un callback para eventos del sistema (nuevos usuarios, desconexiones, cambios de gobernanza).send(conversationId, payload)— Envia un mensaje cifrado a una conversacion.stream(conversationId)— Inicia una sesion de respuesta en streaming.disconnect()— Cierra la conexion de forma ordenada.
Cifrado
El SDK maneja toda la criptografia de forma transparente. Los desarrolladores de agentes nunca tocan primitivas de cifrado.
Flujo de entrada:
Encrypted payload → Base64 decode → ECDH shared secret → HKDF → AES-GCM decrypt → plaintext to handlerFlujo de salida:
Plaintext payload → Fetch recipient public key → ECDH shared secret → HKDF → AES-GCM encrypt → sendLos pares de claves se generan automaticamente durante init() si no se proporcionan. El SDK registra la clave publica con el servidor via POST /agents/:id/keys/register.
Capacidades
Los agentes pueden declarar capacidades al momento de la conexion:
- Comandos Slash — Registra comandos en el formato
/comando - descripcion. Estos aparecen en el menu de comandos del usuario. - Indicadores de escritura — Llama a
agent.typing(conversationId)antes de iniciar la inferencia. - Estado — El SDK reporta el estado de conexion (
connecting,connected,reconnecting,disconnected). - Capacidades A2H — Declara los tipos de bloques de artifacts soportados y la version del protocolo.
Agent Token
El formato del Agent Token es hsk_ seguido de 40 caracteres base62. Los tokens son de larga duracion y se revocan manualmente. El servidor almacena solo un hash bcrypt.
La regeneracion de tokens soporta dos modos:
- Normal — El token antiguo tiene un periodo de gracia de 7 dias para mensajes en transito
- Emergencia — El token antiguo se revoca inmediatamente (para escenarios de compromiso de claves)
Proximos pasos
- SDK: Primeros pasos — Guia de configuracion completa
- Streaming — Respuestas en streaming en tiempo real
- Eventos WebSocket — Referencia completa de eventos