Arquitectura de integración de Pi
Este documento describe cómo OpenClaw se integra con pi-coding-agent y sus paquetes hermanos (pi-ai, pi-agent-core, pi-tui) para potenciar sus capacidades de agente de IA.
Visión general
OpenClaw usa el SDK de Pi para integrar un agente de codificación con IA en su arquitectura de gateway de mensajería. En lugar de lanzar Pi como un subproceso o usar el modo RPC, OpenClaw importa e instancia directamenteAgentSession de Pi mediante createAgentSession(). Este enfoque embebido proporciona:
- Control total sobre el ciclo de vida de la sesión y el manejo de eventos
- Inyección de herramientas personalizadas (mensajería, sandbox, acciones específicas del canal)
- Personalización del prompt del sistema por canal/contexto
- Persistencia de sesión con soporte para ramificación/Compaction
- Rotación de perfiles de autenticación multiaccount con failover
- Cambio de modelo independiente del proveedor
Dependencias de paquetes
| Paquete | Propósito |
|---|---|
pi-ai | Abstracciones centrales de LLM: Model, streamSimple, tipos de mensajes, APIs de proveedor |
pi-agent-core | Bucle del agente, ejecución de herramientas, tipos AgentMessage |
pi-coding-agent | SDK de alto nivel: createAgentSession, SessionManager, AuthStorage, ModelRegistry, herramientas integradas |
pi-tui | Componentes de UI de terminal (usados en el modo TUI local de OpenClaw) |
Estructura de archivos
src/agents/tools, por ejemplo:
- los archivos de runtime de acciones del Plugin de Discord
- el archivo de runtime de acciones del Plugin de Slack
- el archivo de runtime de acciones del Plugin de Telegram
- el archivo de runtime de acciones del Plugin de WhatsApp
Flujo principal de integración
1. Ejecutar un agente embebido
El punto de entrada principal esrunEmbeddedPiAgent() en pi-embedded-runner/run.ts:
2. Creación de sesión
Dentro derunEmbeddedAttempt() (llamado por runEmbeddedPiAgent()), se usa el SDK de Pi:
3. Suscripción a eventos
subscribeEmbeddedPiSession() se suscribe a los eventos de AgentSession de Pi:
message_start/message_end/message_update(streaming de texto/thinking)tool_execution_start/tool_execution_update/tool_execution_endturn_start/turn_endagent_start/agent_endcompaction_start/compaction_end
4. Prompting
Después de la configuración, se envía el prompt a la sesión:images solo para ese turno. No vuelve a escanear turnos anteriores del historial
para volver a inyectar cargas útiles de imágenes.
Arquitectura de herramientas
Canalización de herramientas
- Herramientas base:
codingToolsde Pi (read,bash,edit,write) - Reemplazos personalizados: OpenClaw reemplaza bash con
exec/process, personaliza read/edit/write para sandbox - Herramientas de OpenClaw: mensajería, navegador, canvas, sesiones, cron, gateway, etc.
- Herramientas de canal: herramientas de acción específicas de Discord/Telegram/Slack/WhatsApp
- Filtrado por política: herramientas filtradas por perfil, proveedor, agente, grupo y políticas de sandbox
- Normalización de esquemas: esquemas limpiados para particularidades de Gemini/OpenAI
- Envoltura con AbortSignal: herramientas envueltas para respetar señales de cancelación
Adaptador de definición de herramientas
ElAgentTool de pi-agent-core tiene una firma execute distinta de ToolDefinition de pi-coding-agent. El adaptador en pi-tool-definition-adapter.ts hace este puente:
Estrategia de división de herramientas
splitSdkTools() pasa todas las herramientas mediante customTools:
Construcción del prompt del sistema
El prompt del sistema se construye enbuildAgentSystemPrompt() (system-prompt.ts). Ensambla un prompt completo con secciones que incluyen Tooling, estilo de llamada de herramientas, barreras de seguridad, referencia de la CLI de OpenClaw, Skills, Docs, Workspace, Sandbox, Mensajería, etiquetas de respuesta, Voz, respuestas silenciosas, Heartbeats, metadatos de runtime, además de Memory y Reactions cuando están activados, y archivos de contexto opcionales y contenido adicional opcional del prompt del sistema. Las secciones se recortan para el modo de prompt mínimo usado por subagentes.
El prompt se aplica después de crear la sesión mediante applySystemPromptOverrideToSession():
Gestión de sesiones
Archivos de sesión
Las sesiones son archivos JSONL con estructura de árbol (enlace por id/parentId).SessionManager de Pi maneja la persistencia:
guardSessionManager() para seguridad en los resultados de herramientas.
Caché de sesiones
session-manager-cache.ts almacena en caché instancias de SessionManager para evitar analizar repetidamente archivos:
Limitación del historial
limitHistoryTurns() recorta el historial de la conversación según el tipo de canal (DM frente a grupo).
Compaction
La Compaction automática se activa cuando se desborda el contexto. Las firmas comunes de desbordamiento incluyenrequest_too_large, context length exceeded, input exceeds the maximum number of tokens, input token count exceeds the maximum number of input tokens, input is too long for the model y ollama error: context length exceeded. compactEmbeddedPiSessionDirect() maneja la
Compaction manual:
Autenticación y resolución de modelos
Perfiles de autenticación
OpenClaw mantiene un almacén de perfiles de autenticación con varias claves API por proveedor:Resolución de modelos
Failover
FailoverError activa el fallback de modelo cuando está configurado:
Extensiones de Pi
OpenClaw carga extensiones personalizadas de Pi para comportamientos especializados:Protección de Compaction
src/agents/pi-hooks/compaction-safeguard.ts añade barreras de seguridad a Compaction, incluido presupuesto adaptativo de tokens y resúmenes de fallos de herramientas y operaciones de archivos:
Poda de contexto
src/agents/pi-hooks/context-pruning.ts implementa poda de contexto basada en cache-TTL:
Streaming y respuestas por bloques
Fragmentación por bloques
EmbeddedBlockChunker gestiona el streaming de texto en bloques discretos de respuesta:
Eliminación de etiquetas Thinking/Final
La salida en streaming se procesa para eliminar bloques<think>/<thinking> y extraer el contenido de <final>:
Directivas de respuesta
Las directivas de respuesta como[[media:url]], [[voice]], [[reply:id]] se analizan y extraen:
Manejo de errores
Clasificación de errores
pi-embedded-helpers.ts clasifica errores para un manejo adecuado:
Fallback de nivel de thinking
Si un nivel de thinking no es compatible, se aplica un fallback:Integración con sandbox
Cuando el modo sandbox está activado, las herramientas y rutas quedan restringidas:Manejo específico por proveedor
Anthropic
- Limpieza de cadenas mágicas de rechazo
- Validación de turnos para roles consecutivos
- Validación estricta en upstream Pi de parámetros de herramientas
Google/Gemini
- Saneamiento de esquemas de herramientas propiedad del Plugin
OpenAI
- Herramienta
apply_patchpara modelos Codex - Manejo de degradación del nivel de thinking
Integración con TUI
OpenClaw también tiene un modo TUI local que usa directamente componentes de pi-tui:Diferencias clave frente a la CLI de Pi
| Aspecto | CLI de Pi | OpenClaw embebido |
|---|---|---|
| Invocación | comando pi / RPC | SDK mediante createAgentSession() |
| Herramientas | Herramientas de codificación predeterminadas | Suite de herramientas personalizada de OpenClaw |
| Prompt del sistema | AGENTS.md + prompts | Dinámico por canal/contexto |
| Almacenamiento de sesión | ~/.pi/agent/sessions/ | ~/.openclaw/agents/<agentId>/sessions/ (o $OPENCLAW_STATE_DIR/agents/<agentId>/sessions/) |
| Auth | Credencial única | Multiprofile con rotación |
| Extensiones | Cargadas desde disco | Programáticas + rutas en disco |
| Manejo de eventos | Renderizado TUI | Basado en callbacks (onBlockReply, etc.) |
Consideraciones futuras
Áreas para posible reelaboración:- Alineación de firmas de herramientas: actualmente se adapta entre las firmas de pi-agent-core y pi-coding-agent
- Envoltura del gestor de sesiones:
guardSessionManagerañade seguridad, pero aumenta la complejidad - Carga de extensiones: podría usar
ResourceLoaderde Pi más directamente - Complejidad del manejador de streaming:
subscribeEmbeddedPiSessionha crecido mucho - Particularidades de proveedores: muchos caminos de código específicos por proveedor que Pi podría manejar potencialmente
Pruebas
La cobertura de integración con Pi abarca estas suites:src/agents/pi-*.test.tssrc/agents/pi-auth-json.test.tssrc/agents/pi-embedded-*.test.tssrc/agents/pi-embedded-helpers*.test.tssrc/agents/pi-embedded-runner*.test.tssrc/agents/pi-embedded-runner/**/*.test.tssrc/agents/pi-embedded-subscribe*.test.tssrc/agents/pi-tools*.test.tssrc/agents/pi-tool-definition-adapter*.test.tssrc/agents/pi-settings.test.tssrc/agents/pi-hooks/**/*.test.ts
src/agents/pi-embedded-runner-extraparams.live.test.ts(activaOPENCLAW_LIVE_TEST=1)