Saltar al contenido principal
OpenClaw enruta cada mensaje entrante a una sesión según su origen: mensajes directos, chats grupales, trabajos cron, etc. Todo el estado de la sesión pertenece al Gateway; los clientes de UI consultan al Gateway para obtener los datos de sesión.

Cómo se enrutan los mensajes

OrigenComportamiento
Mensajes directosSesión compartida de forma predeterminada
Chats grupalesAislado por grupo
Salas/canalesAislado por sala
Trabajos CronSesión nueva por ejecución
WebhooksAislado por hook

Aislamiento de DM

De forma predeterminada, todos los DM comparten una sesión para mantener la continuidad, lo cual está bien para configuraciones de un solo usuario.
Si varias personas pueden enviar mensajes a tu agente, activa el aislamiento de DM. Sin él, todos los usuarios comparten el mismo contexto de conversación, por lo que los mensajes privados de Alice serían visibles para Bob.
{
  session: {
    dmScope: "per-channel-peer", // isolate by channel + sender
  },
}
Opciones de session.dmScope:
ValorComportamiento
main (predeterminado)Todos los DM comparten una sesión
per-peerAislar por remitente, entre canales
per-channel-peerAislar por canal + remitente (recomendado)
per-account-channel-peerAislar por cuenta + canal + remitente
Si la misma persona te contacta desde varios canales, usa session.identityLinks para mapear sus identidades a un id de peer canónico, de modo que compartan una sesión.

Acoplar canales vinculados

Los comandos de acoplamiento mueven la ruta de respuesta de la sesión actual de chat directo a otro canal vinculado sin iniciar una sesión nueva. Consulta Acoplamiento de canales para ver ejemplos, configuración y solución de problemas. Verifica tu configuración con openclaw security audit.

Ciclo de vida de la sesión

Las sesiones se reutilizan hasta que caducan según session.reset:
  • Restablecimiento diario (predeterminado mode: "daily") - sesión nueva a una hora local configurada (session.reset.atHour, predeterminado 4, 0-23) en el host del Gateway. La vigencia diaria se basa en cuándo comenzó el sessionId actual, no en escrituras posteriores de metadatos.
  • Restablecimiento por inactividad (mode: "idle") - sesión nueva después de session.reset.idleMinutes de inactividad. La vigencia por inactividad se basa en la última interacción real de usuario/canal, por lo que los eventos de sistema de Heartbeat, Cron y exec no mantienen viva la sesión.
  • Restablecimiento manual - escribe /new o /reset en el chat. /new <model> también cambia el modelo.
Cuando se configuran restablecimientos diarios y por inactividad, gana el que caduque primero. Los turnos de Heartbeat, Cron, exec y otros eventos de sistema pueden escribir metadatos de sesión, pero esas escrituras no extienden la vigencia del restablecimiento diario ni por inactividad. Cuando un restablecimiento cambia la sesión, los avisos de eventos de sistema en cola para la sesión anterior se descartan para que las actualizaciones de fondo obsoletas no se antepongan al primer prompt de la nueva sesión. Las sesiones con una sesión CLI activa propiedad del proveedor no se cortan por el valor diario implícito predeterminado. Usa /reset o configura session.reset explícitamente cuando esas sesiones deban caducar con un temporizador. Anula el valor predeterminado por tipo de chat o por canal:
{
  session: {
    reset: { mode: "daily", atHour: 4 },
    resetByType: {
      group: { mode: "idle", idleMinutes: 120 },
      thread: { mode: "daily", atHour: 6 },
    },
    resetByChannel: {
      discord: { mode: "idle", idleMinutes: 10080 },
    },
  },
}
resetByType admite direct (alias heredado dm), group y thread. El valor heredado de nivel superior session.idleMinutes sigue funcionando como alias de compatibilidad para un valor predeterminado de modo inactivo cuando no hay ningún bloque session.reset/resetByType configurado.

Dónde vive el estado

  • Almacén: ~/.openclaw/agents/<agentId>/sessions/sessions.json
  • Transcripciones: ~/.openclaw/agents/<agentId>/sessions/<sessionId>.jsonl
sessions.json mantiene marcas de tiempo de ciclo de vida separadas:
  • sessionStartedAt: cuándo comenzó el sessionId actual; el restablecimiento diario usa esto.
  • lastInteractionAt: última interacción de usuario/canal que extiende la vida útil por inactividad.
  • updatedAt: última mutación de fila del almacén; útil para listar y podar, pero no autoritativa para la vigencia de restablecimiento diario/por inactividad.
Las filas antiguas sin sessionStartedAt se resuelven desde el encabezado de sesión JSONL de la transcripción cuando está disponible. Si a una fila antigua también le falta lastInteractionAt, la vigencia por inactividad recurre a la hora de inicio de esa sesión, no a escrituras posteriores de mantenimiento interno.

Mantenimiento de sesiones

OpenClaw limita el almacenamiento de sesiones con el tiempo mediante session.maintenance; se muestran los valores predeterminados:
{
  session: {
    maintenance: {
      mode: "enforce", // "enforce" applies cleanup; "warn" only reports
      pruneAfter: "30d",
      maxEntries: 500,
    },
  },
}
Para límites maxEntries de tamaño de producción, las escrituras del runtime del Gateway usan un pequeño búfer de marca alta y limpian por lotes hasta volver al límite configurado. Las lecturas del almacén de sesiones no podan ni limitan entradas durante el inicio del Gateway, por lo que el inicio y las sesiones Cron aisladas no pagan el costo de una limpieza completa del almacén. openclaw sessions cleanup --enforce aplica el límite inmediatamente. Las sesiones de sondeo de ejecución de modelo del Gateway son de vida corta de forma predeterminada. Las filas que coinciden con agent:*:explicit:model-run-<uuid> usan una retención fija de 24h, pero la limpieza está limitada por presión: solo elimina filas de sondeo obsoletas cuando se alcanza la presión de mantenimiento/límite de entradas de sesión, y se ejecuta antes del corte de edad de entradas obsoletas más amplio y del límite de entradas. Las sesiones directas, grupales, de hilo, Cron, hook, Heartbeat, ACP y de subagente normales no heredan esta retención de 24h. El mantenimiento conserva punteros duraderos a conversaciones externas, incluidas las sesiones de grupo y las sesiones de chat con ámbito de hilo, mientras permite que las entradas sintéticas de Cron, hook, Heartbeat, ACP y subagente caduquen. Si antes usabas aislamiento de DM y luego devolviste session.dmScope a main, previsualiza las filas de DM obsoletas basadas en claves de peer con openclaw sessions cleanup --dry-run --fix-dm-scope. Aplicar el mismo flag retira esas filas antiguas de DM directo y conserva sus transcripciones como archivos eliminados. Previsualiza cualquier ejecución de mantenimiento con openclaw sessions cleanup --dry-run.

Inspeccionar sesiones

ComandoMuestra
openclaw statusRuta del almacén de sesiones y actividad reciente
openclaw sessions --jsonTodas las sesiones (filtra con --active <minutes>)
/status en el chatUso de contexto, modelo y conmutadores
/context listQué hay en el prompt del sistema

Lecturas adicionales

Relacionado