AI Agents,  Code

Flujo de Ejecución del Agente OpenClaw

Analicemos el pipeline de ejecución de agentes de OpenClaw, cubriendo todo desde la deduplicación de mensajes de canal hasta las estrategias automáticas de failover. Perfecto para desarrolladores que construyen sistemas de agentes de IA o contribuyen a OpenClaw.

OpenClaw parece engañosamente simple desde fuera: un agente conectado a un canal de comunicación que simplemente ejecuta código. Pero bajo el capó, está impulsado por Pi Monorepo, un agente de programación deliberadamente minimalista construido en torno a una única idea, casi herética: que los LLM ya son buenos escribiendo y ejecutando software, por lo que el sistema debería apartarse de su camino y permitirles hacer exactamente eso.

Con un núcleo diminuto, un puñado de herramientas y una potente arquitectura autoextensible, Pi trata el software como algo maleable, inspeccionable y desechable, lo que permite agentes que no solo usan herramientas, sino que se reescriben y evolucionan activamente a sí mismos. OpenClaw es lo que sucede cuando esa filosofía se toma en serio y se conecta directamente con interfaces del mundo real.

Tabla de Contenidos

  1. Introducción
  2. Visión General de la Arquitectura
  3. Fase 1: Recepción de Mensajes y Enrutamiento de Canal
  4. Fase 2: Enrutamiento y Control de Acceso
  5. Fase 3: Resolución de Sesión y Bloqueo
  6. Fase 4: Ensamblaje de Contexto
  7. Fase 5: Inicialización del Runtime del Agente
  8. Fase 6: Ejecución del Modelo y Streaming
  9. Fase 7: Enrutamiento y Ejecución de Llamadas a Herramientas
  10. Fase 8: Entrega de Respuesta
  11. Fase 9: Persistencia de Estado
  12. Manejo de Errores y Estrategias de Failover
  13. Ejemplo de Traza de Extremo a Extremo
  14. Conclusiones Clave

Introducción

OpenClaw es una plataforma de asistente de IA personal autoalojada que conecta modelos de IA (Claude, GPT, Gemini, modelos locales) con canales de mensajería que ya usas: WhatsApp, Telegram, Discord, Slack, Signal, iMessage y más de 15 adicionales.

Lo que distingue a OpenClaw es su sofisticado pipeline de ejecución de agentes, un sistema de orquestación de nueve fases que maneja todo desde la deduplicación de mensajes hasta el failover automático de modelos. Entender este flujo es crucial para:

  • Contribuidores que quieren extender las capacidades de OpenClaw
  • Ingenieros de IA diseñando arquitecturas de agentes similares
  • Equipos de DevOps solucionando problemas en despliegues de producción

Profundicemos en cada fase con referencias de código e insights arquitectónicos.


Visión General de la Arquitectura

La ejecución del agente de OpenClaw envuelve la biblioteca Pi Agent Core y añade integraciones específicas de plataforma para canales, herramientas, sandboxing y configuración.

Punto de Entrada Principal:

  • runEmbeddedPiAgent en src/agents/pi-embedded-runner/run.ts

Abstracciones Clave:

AbstracciónPropósito
EmbeddedPiAgentMetaConfiguración para una instancia de agente (workspace, modelo, herramientas, sandbox)
EmbeddedPiRunMetaMetadatos por turno (clave de sesión, mensaje, contexto de canal)
EmbeddedPiRunResultResultado de ejecución (éxito, error, uso, tiempo)
SubscribeEmbeddedPiSessionParamsCallbacks de streaming para salida en tiempo real

Fase 1: Recepción de Mensajes y Enrutamiento de Canal

Cómo Funciona

Cada adaptador de canal (Telegram, Discord, Slack, WhatsApp, etc.) implementa un pipeline estandarizado de manejo de mensajes:

Estrategia de Deduplicación

Cada canal usa IDs de actualización únicos para prevenir el reprocesamiento. Para Telegram:

// src/telegram/bot.ts (líneas 157-178)
function buildTelegramUpdateKey(update: Update): string {
  return `telegram:${update.update_id}`;
}

// La verificación de duplicados previene que el mismo mensaje active múltiples turnos del agente
if (await isDuplicateUpdate(updateKey)) {
  return; // Descarte silencioso
}

Adaptadores Específicos por Canal

CanalBibliotecaArchivo Clave
TelegramgrammYsrc/telegram/bot.ts
Discorddiscord.jssrc/discord/monitor.ts
SlackBoltsrc/slack/monitor.ts
WhatsAppBaileyssrc/provider-web.ts
Signalsignal-clisrc/signal/
iMessageimsgsrc/imessage/

Fase 2: Enrutamiento y Control de Acceso

Aplicación de Políticas

Antes de que cualquier mensaje llegue al agente, pasa por puertas de control de acceso:


// Las políticas de acceso determinan quién puede interactuar
interface AccessPolicy {
  dmPolicy: 'open' | 'allowlist' | 'pairing' | 'deny';
  groupPolicy: 'open' | 'allowlist' | 'mention' | 'deny';
}

Tipos de Políticas:

PolíticaComportamiento en DMComportamiento en Grupo
openAcepta todosAcepta todos
allowlistVerifica lista allowFromVerifica lista allowFrom
pairingEnvía código de emparejamientoN/A
mentionN/ASolo responde cuando es @mencionado
denyDescarte silenciosoDescarte silencioso

Enrutamiento de Agentes

La función resolveAgentRoute determina qué agente maneja un mensaje basándose en los bindings de canal:


// Ejemplo de configuración de binding
{
  bindings: {
    agents: {
      "whatsapp:default": "main",
      "telegram:work_bot": "work",
      "slack:support_bot": "support"
    }
  }
}

Fase 3: Resolución de Sesión y Bloqueo

Patrones de Clave de Sesión

Las claves de sesión aíslan el contexto de conversación. El patrón sigue:

agent:{agentId}:{channel}:{scope}:{identifier}

Ejemplos:

Clave de SesiónTipoDescripción
agent:main:telegram:dm:123456789Telegram DMMensaje directo
agent:main:discord:group:987654321Canal de DiscordCanal del servidor
agent:work:whatsapp:group:120363...@g.usGrupo de WhatsAppChat grupal
agent:main:mainCLI/TUIInteracción directa por CLI

Flujo de Resolución de Sesión

Modos de Cola

OpenClaw soporta dos modos de ejecución:

ModoComportamientoCaso de Uso
sequential (por defecto)Adquiere bloqueo, procesa uno a la vez por sesiónFlujos de trabajo críticos en consistencia
concurrentSin bloqueo, procesamiento paraleloEscenarios de alto rendimiento

// src/agents/pi-embedded-runner/lanes.ts
const lane = await resolveSessionLane(sessionKey, config);
if (lane.mode === 'sequential') {
  await acquireSessionWriteLock(sessionKey);
}

Fase 4: Ensamblaje de Contexto

Construcción del System Prompt

El system prompt se construye desde múltiples fuentes—aquí es donde el poder de OpenClaw se hace evidente:

Secciones del Prompt (Modo Completo)

El system prompt completo incluye estas secciones:

SecciónCondiciónPropósito
Identidad de UsuarioownerNumbers configuradoIdentificar usuarios autorizados
Fecha y Hora ActualuserTimezone configuradoZona horaria para programación
SkillsskillsPrompt presenteDescubrimiento y carga de habilidades
Recuperación de Memoriaherramienta memory_search disponibleGuía de integración de memoria
MensajeríaNo en modo minimalReglas de mensajería cross-channel
Voz (TTS)ttsHint configuradoUso de etiquetas TTS
Etiquetas de RespuestaNo en modo minimalSintaxis nativa de respuesta/cita
DocumentacióndocsPath configuradoReferencia de docs de OpenClaw
Formato de RazonamientoreasoningTagHint trueUso de etiquetas <think>/<final>
Referencia Rápida CLISiempre (modo completo)Comandos del gateway
Entorno de EjecuciónruntimeInfo presenteContexto de host/OS/modelo
HerramientastoolNames presenteLista de herramientas disponibles
WorkspaceSiempreDirectorio del workspace
SandboxSandbox habilitadoPuente del navegador, modo elevado

Modos de Prompt


type PromptMode = 'full' | 'minimal' | 'none';

// Full: Todas las secciones (por defecto para agente principal)
// Minimal: Secciones reducidas - usado para subagentes
// None: Solo línea básica de identidad

Fase 5: Inicialización del Runtime del Agente

Configuración del Runtime

Antes de la ejecución del modelo, el runtime ensambla el contexto de ejecución completo:


// src/agents/pi-embedded-runner/run.ts
interface RuntimeContext {
  sessionKey: string;              // ej., "agent:main:telegram:dm:123"
  agentConfig: AgentConfig;        // De agents.list[agentId]
  workspace: string;               // Directorio raíz para archivos del agente
  agentDir: string;                // ~/.openclaw/agents/main/agent
  toolRegistry: Tool[];            // De createOpenClawCodingTools
  sandboxContext: SandboxContext;  // Configuración de contenedor Docker
  bootstrapFiles: string[];        // AGENTS.md, SOUL.md, TOOLS.md
  memoryResults: MemoryResult[];   // De búsqueda de memoria
}

Componentes Clave del Runtime

ComponenteFuenteDescripción
Workspaceagents.list[].workspaceDirectorio raíz para archivos del agente
Directorio del AgenteDerivado del ID del agentePerfiles de auth, caché, estado
Archivos BootstrapAuto-descubiertosAGENTS.md, SOUL.md, TOOLS.md
Registro de Herramientastools.allow, tools.denyHerramientas disponibles (exec, read, browser)
Contexto de Sandboxagents.list[].sandboxContenedor Docker para aislamiento
Búsqueda de MemoriamemorySearch.*Recuperación híbrida BM25 + vector

Fase 6: Ejecución del Modelo y Streaming

Flujo de Solicitud al Modelo

Esta fase maneja la interacción real con el modelo de IA con failover sofisticado:

Tipos de Eventos


// Eventos de streaming del proveedor de modelo
type StreamEvent = 
  | { type: 'text_delta'; content: string }
  | { type: 'tool_call'; name: string; arguments: object }
  | { type: 'thinking_delta'; content: string }
  | { type: 'message_end'; reason: StopReason }
  | { type: 'error'; error: Error };

Manejo de Eventos en subscribeEmbeddedPiSession

EventoComportamiento del Handler
text_deltaAcumula en deltaBuffer, fragmenta para streaming
tool_callEnruta al ejecutor de herramientas, espera resultado
thinking_deltaOpcionalmente transmite razonamiento (si reasoningMode=stream)
message_endFinaliza texto del asistente, guarda en sesión

Fase 7: Enrutamiento y Ejecución de Llamadas a Herramientas

Árbol de Decisión de Ejecución de Herramientas

OpenClaw implementa un sofisticado sistema de políticas multicapa para la ejecución de herramientas:

Precedencia de Políticas de Herramientas

Las políticas se evalúan en orden de más a menos restrictiva:

  1. Perfil de Herramientas: Lista permitida base (tools.profile)
  2. Perfil de Proveedor: Restricciones específicas por proveedor (tools.byProvider)
  3. Política Global: tools.allow / tools.deny
  4. Política de Agente: agents.list[].tools.allow / agents.list[].tools.deny
  5. Política de Grupo: Restricciones por grupo/canal
  6. Política de Sandbox: Lista permitida de herramientas del sandbox (agents.list[].sandbox.tools)
  7. Política de Subagente: Heredada del padre

Flujo de Aprobación de Herramienta Exec

Para la ejecución de comandos shell, se aplican puertas de seguridad adicionales:


// Configuración de tools.exec
interface ExecToolConfig {
  ask: 'off' | 'elevated' | 'always';
  security: 'full' | 'sandbox';
  safeBins: string[];  // Comandos auto-aprobados (ls, cat, etc.)
}

// ¿Se necesita aprobación? Verificar en este orden:
// 1. ¿Está el comando en safeBins? → Auto-aprobar
// 2. ¿Es security=sandbox y ejecutando en sandbox? → Auto-aprobar
// 3. ¿Es ask=off? → Auto-aprobar
// 4. De lo contrario → Enviar prompt de aprobación, esperar /approve <id>

Grupos de Herramientas

GrupoHerramientas Incluidas
group:fsread, write, edit, apply_patch, grep, find, ls
group:runtimeexec, process
group:sessionssessions_list, sessions_history, sessions_send, sessions_spawn
group:memorymemory_search, memory_get
group:messagingmessage (todas las acciones)

Fase 8: Entrega de Respuesta

Streaming y Fragmentación

La entrega de respuestas se adapta a las capacidades del canal:

Modos de Streaming por Bloques

ModoComportamiento
text_endTransmitir mensaje completo después de message_end
tool_callTransmitir después de que cada llamada a herramienta complete
text_deltaTransmitir en cada text delta (tiempo real)

Configuración de Fragmentación


// Configuración de fragmentación por canal
interface ChunkConfig {
  textChunkLimit: number;  // Máx caracteres por fragmento (varía por canal)
  chunkMode: 'length' | 'newline';  // Estrategia de división
}

// Valores por defecto por canal:
// Telegram: 4096 caracteres
// Discord: 2000 caracteres
// WhatsApp: 65536 caracteres

Fase 9: Persistencia de Estado

Esquema del Almacén de Sesión

Después de cada turno del agente, el estado de la sesión se persiste:


interface SessionStore {
  history: Array<{
    role: 'user' | 'assistant' | 'system';
    content: string;
    timestamp: string;
  }>;
  thinkingLevel: 'off' | 'low' | 'medium' | 'high';
  verboseLevel: 0 | 1 | 2 | 3;
  model?: string;
  sendPolicy?: 'announce' | 'quiet';
  groupActivation?: 'mention' | 'always';
  lastActiveAt?: string;
  messageCount?: number;
  totalTokens?: number;
  totalCost?: number;
}

Ubicación de Almacenamiento

Las sesiones se almacenan como archivos JSONL:

  • Ubicación: ~/.openclaw/sessions/{sessionKey}.jsonl
  • Formato: Un objeto JSON por línea (mensajes, metadatos, eventos)

Auto-Compactación

Cuando el contexto se desborda, OpenClaw compacta automáticamente el historial:



Estrategia de Compactación:
  1. Divide el historial en segmentos semánticos (chunking adaptativo)
  2. Resume cada segmento vía modelo
  3. Fusiona resúmenes en contexto compacto
  4. Retiene los últimos N turnos literalmente (configurable)

Políticas de Reinicio

PolíticaComportamiento
dailyReiniciar a las 4am hora local
idleReiniciar después de N horas de inactividad
noneSolo /reset manual

Manejo de Errores y Estrategias de Failover

Clasificación de Errores

OpenClaw clasifica los errores para determinar la estrategia de failover apropiada:

Tipo de ErrorDetecciónAcción de Recuperación
Errores de AuthisAuthAssistantError (401, invalid_api_key)Rotar perfil de auth
Errores de FacturaciónisBillingAssistantError (402, insufficient_quota)Cooldown + modelo de respaldo
Límites de TasaisRateLimitAssistantError (429)Failover inmediato
Desbordamiento de ContextoisContextOverflowErrorAuto-compactar + reintentar
TimeoutsisTimeoutErrorMessageReintentar mismo modelo
Errores de Tamaño de ImagenisImageSizeErrorMostrar al usuario

Comportamiento de Cooldown


// Configuración de cooldown por defecto
interface CooldownConfig {
  billingBackoffHours: 24;      // Cooldown por defecto para error de facturación
  failureWindowHours: 1;        // Rastrear errores durante esta ventana
  billingMaxHours: 168;         // Cooldown máximo (7 días)
}

Algoritmo de Rotación de Perfil de Auth


1. Verificar auth.order[provider] para lista de perfiles
2. Omitir perfiles en cooldown
3. Intentar siguiente perfil con credenciales válidas
4. Si todos los perfiles agotados → recurrir al siguiente modelo en la cadena de fallback

Ejemplo de Traza de Extremo a Extremo

Tracemos una ejecución completa para: «Escribe un script de hola mundo» enviado vía Telegram.

  1. RECEPCIÓN — Bot de Telegram recibe update y valida que no es duplicado.
  2. POLÍTICA — Verifica channels.telegram.allowFrom y pasa.
  3. ENRUTAMIENTO — Resuelve a agent:main:telegram:dm:123456789.
  4. COLA — Llama queueEmbeddedPiMessage con clave de sesión.
  5. BLOQUEO — Adquiere bloqueo de sesión (si queueMode=sequential).
  6. CARGAR — Lee almacén de sesión desde ~/.openclaw/sessions/agent:main/sessions.json.
  7. BOOTSTRAP — Lee AGENTS.md, SOUL.md y TOOLS.md del workspace.
  8. MEMORIA — Consulta búsqueda de memoria con «Escribe un script…».
  9. HERRAMIENTAS — Construye registro de herramientas (exec, read, write).
  10. PROMPT — Combina bootstrap + memoria + herramientas en el system prompt.
  11. MODELO — Transmite a anthropic/claude-sonnet-4-5 con failover.
  12. DELTA — Recibe eventos text_delta y los acumula en buffer.
  13. TOOL CALL — El modelo llama:
    write(
      path="hello.sh",
      content="#!/bin/bash
    echo 'Hola, Mundo!'
    ")
  14. VERIFICACIÓN DE POLÍTICA — Valida que write esté permitido.
  15. EJECUTAR — Escribe el archivo en el workspace.
  16. RESULTADO — Retorna éxito al modelo.
  17. FINAL — El modelo envía: «He creado un script de hola mundo».
  18. STREAM — Fragmenta respuesta para Telegram (límite 4096).
  19. GUARDAR — Escribe el almacén de sesión actualizado con el nuevo turno.
  20. DESBLOQUEAR — Libera el bloqueo de sesión.


Conclusiones Clave

1. La Arquitectura Multi-Fase Proporciona Flexibilidad

El pipeline de nueve fases permite una separación limpia de responsabilidades. Cada fase puede ser extendida o modificada independientemente.

2. La Seguridad es Multi-Capa

La ejecución de herramientas pasa por 7 capas de políticas. El aislamiento de sandbox proporciona protección adicional para ejecución de código no confiable.

3. El Failover es Automático e Inteligente

La clasificación de errores impulsa la estrategia de recuperación—desde reintentos simples hasta rotación de auth y cadenas de failover de modelos.

4. La Gestión de Contexto es Sofisticada

La búsqueda híbrida de memoria (BM25 + vector) combinada con compactación automática asegura que los agentes mantengan contexto relevante sin alcanzar límites de tokens.

5. La Abstracción de Canal Habilita Portabilidad

La misma lógica de agente funciona a través de más de 15 plataformas de mensajería a través de adaptadores de canal que manejan formateo y capacidades específicas de cada plataforma.


Contribuir a OpenClaw

¿Quieres profundizar más? Aquí están los archivos fuente clave:

ComponenteRuta del Archivo
Punto de Entrada del Agentesrc/agents/pi-embedded-runner/run.ts
Gestión de Sesionessrc/config/sessions.ts
Registro de Herramientassrc/agents/pi-tools.ts
Constructor de System Promptsrc/agents/pi-embedded-runner/system-prompt.ts
Clasificación de Erroressrc/agents/pi-embedded-helpers/errors.ts
Enrutamiento de Canalsrc/routing/session-key.ts
Streamingsrc/agents/pi-embedded-subscribe.ts

Repositorio de GitHub: github.com/openclaw/openclaw


¿Te resultó útil esta inmersión profunda? ¡Sígueme para más análisis técnicos de proyectos de infraestructura de IA de código abierto!


Happy Hacking!!!