Agentes ACP
Las sesiones del Protocolo de Agente Cliente (ACP) permiten a OpenClaw ejecutar entornos de codificación externos (por ejemplo Pi, Claude Code, Codex, OpenCode y Gemini CLI) a través de un plugin backend ACP. Si le pides a OpenClaw en lenguaje natural que "ejecute esto en Codex" o "inicie Claude Code en un hilo", OpenClaw debería enrutar esa solicitud al tiempo de ejecución ACP (no al tiempo de ejecución nativo de sub-agentes).
Flujo rápido para operadores
Usa esto cuando quieras un manual de ejecución /acp práctico:
- Generar una sesión:
/acp spawn codex --mode persistent --thread auto
- Trabajar en el hilo vinculado (o apuntar explícitamente a esa clave de sesión).
- Verificar el estado del tiempo de ejecución:
/acp status
- Ajustar las opciones de tiempo de ejecución según sea necesario:
/acp model <provider/model>/acp permissions <profile>/acp timeout <seconds>
- Guiar una sesión activa sin reemplazar el contexto:
/acp steer tighten logging and continue
- Detener el trabajo:
/acp cancel(detener el turno actual), o/acp close(cerrar sesión + eliminar vinculaciones)
Inicio rápido para humanos
Ejemplos de solicitudes naturales:
- "Inicia una sesión persistente de Codex en un hilo aquí y mantenla enfocada."
- "Ejecuta esto como una sesión ACP única de Claude Code y resume el resultado."
- "Usa Gemini CLI para esta tarea en un hilo, luego mantén los seguimientos en ese mismo hilo."
Lo que OpenClaw debería hacer:
- Elegir
runtime: "acp". - Resolver el entorno objetivo solicitado (
agentId, por ejemplocodex). - Si se solicita vinculación de hilo y el canal actual lo admite, vincular la sesión ACP al hilo.
- Enrutar los mensajes de seguimiento en el hilo a esa misma sesión ACP hasta que se pierda el enfoque/se cierre/caduque.
ACP versus sub-agentes
Usa ACP cuando quieras un entorno de ejecución externo. Usa sub-agentes cuando quieras ejecuciones delegadas nativas de OpenClaw.
| Área | Sesión ACP | Ejecución de sub-agente |
|---|---|---|
| Tiempo de ejecución | Plugin backend ACP (por ejemplo acpx) | Tiempo de ejecución nativo de sub-agentes de OpenClaw |
| Clave de sesión | agent:<agentId>:acp:<uuid> | agent:<agentId>:subagent:<uuid> |
| Comandos principales | /acp ... | /subagents ... |
| Herramienta de generación | sessions_spawn con runtime:"acp" | sessions_spawn (tiempo de ejecución por defecto) |
Ver también Sub-agentes.
Sesiones vinculadas a hilos (independientes del canal)
Cuando las vinculaciones de hilos están habilitadas para un adaptador de canal, las sesiones ACP pueden vincularse a hilos:
- OpenClaw vincula un hilo a una sesión ACP objetivo.
- Los mensajes de seguimiento en ese hilo se enrutan a la sesión ACP vinculada.
- La salida ACP se entrega al mismo hilo.
- La pérdida de enfoque/cierre/archivado/caducidad por inactividad o antigüedad máxima elimina la vinculación.
El soporte de vinculación de hilos es específico del adaptador. Si el adaptador de canal activo no admite vinculaciones de hilos, OpenClaw devuelve un mensaje claro de no admitido/no disponible. Banderas de características requeridas para ACP vinculado a hilos:
acp.enabled=trueacp.dispatch.enabledestá activado por defecto (establecerfalsepara pausar el despacho ACP)- Bandera de generación de hilos ACP del adaptador de canal habilitada (específica del adaptador)
- Discord:
channels.discord.threadBindings.spawnAcpSessions=true - Telegram:
channels.telegram.threadBindings.spawnAcpSessions=true
- Discord:
Canales que admiten hilos
- Cualquier adaptador de canal que exponga capacidad de vinculación de sesión/hilo.
- Soporte incorporado actual:
- Hilos/canales de Discord
- Temas de Telegram (temas de foro en grupos/supergrupos y temas de DM)
- Los canales de plugin pueden agregar soporte a través de la misma interfaz de vinculación.
Configuración específica del canal
Para flujos de trabajo no efímeros, configura vinculaciones ACP persistentes en entradas de nivel superior bindings[].
Modelo de vinculación
bindings[].type="acp"marca una vinculación de conversación ACP persistente.bindings[].matchidentifica la conversación objetivo:- Canal o hilo de Discord:
match.channel="discord"+match.peer.id="<channelOrThreadId>" - Tema de foro de Telegram:
match.channel="telegram"+match.peer.id="<chatId>:topic:<topicId>"
- Canal o hilo de Discord:
bindings[].agentIdes el id del agente OpenClaw propietario.- Las anulaciones ACP opcionales se encuentran bajo
bindings[].acp:mode(persistentooneshot)labelcwdbackend
Valores predeterminados de tiempo de ejecución por agente
Usa agents.list[].runtime para definir valores predeterminados ACP una vez por agente:
agents.list[].runtime.type="acp"agents.list[].runtime.acp.agent(id del entorno, por ejemplocodexoclaude)agents.list[].runtime.acp.backendagents.list[].runtime.acp.modeagents.list[].runtime.acp.cwd
Precedencia de anulación para sesiones ACP vinculadas:
bindings[].acp.*agents.list[].runtime.acp.*- Valores predeterminados globales de ACP (por ejemplo
acp.backend)
Ejemplo:
{
agents: {
list: [
{
id: "codex",
runtime: {
type: "acp",
acp: {
agent: "codex",
backend: "acpx",
mode: "persistent",
cwd: "/workspace/openclaw",
},
},
},
{
id: "claude",
runtime: {
type: "acp",
acp: { agent: "claude", backend: "acpx", mode: "persistent" },
},
},
],
},
bindings: [
{
type: "acp",
agentId: "codex",
match: {
channel: "discord",
accountId: "default",
peer: { kind: "channel", id: "222222222222222222" },
},
acp: { label: "codex-main" },
},
{
type: "acp",
agentId: "claude",
match: {
channel: "telegram",
accountId: "default",
peer: { kind: "group", id: "-1001234567890:topic:42" },
},
acp: { cwd: "/workspace/repo-b" },
},
{
type: "route",
agentId: "main",
match: { channel: "discord", accountId: "default" },
},
{
type: "route",
agentId: "main",
match: { channel: "telegram", accountId: "default" },
},
],
channels: {
discord: {
guilds: {
"111111111111111111": {
channels: {
"222222222222222222": { requireMention: false },
},
},
},
},
telegram: {
groups: {
"-1001234567890": {
topics: { "42": { requireMention: false } },
},
},
},
},
}
Comportamiento:
- OpenClaw asegura que la sesión ACP configurada exista antes de usarla.
- Los mensajes en ese canal o tema se enrutan a la sesión ACP configurada.
- En conversaciones vinculadas,
/newy/resetreinician la misma clave de sesión ACP en su lugar. - Las vinculaciones de tiempo de ejecución temporales (por ejemplo creadas por flujos de enfoque de hilo) aún se aplican donde estén presentes.
Iniciar sesiones ACP (interfaces)
Desde sessions_spawn
Usa runtime: "acp" para iniciar una sesión ACP desde un turno de agente o una llamada a herramienta.
{
"task": "Open the repo and summarize failing tests",
"runtime": "acp",
"agentId": "codex",
"thread": true,
"mode": "session"
}
Notas:
runtimepor defecto essubagent, así que estableceruntime: "acp"explícitamente para sesiones ACP.- Si se omite
agentId, OpenClaw usaacp.defaultAgentcuando está configurado. mode: "session"requierethread: truepara mantener una conversación vinculada persistente.
Detalles de la interfaz:
task(requerido): prompt inicial enviado a la sesión ACP.runtime(requerido para ACP): debe ser"acp".agentId(opcional): id del entorno objetivo ACP. Recurre aacp.defaultAgentsi está configurado.thread(opcional, por defectofalse): solicitar flujo de vinculación de hilo donde sea compatible.mode(opcional):run(única) osession(persistente).- el valor por defecto es
run - si
thread: truey se omite mode, OpenClaw puede usar un comportamiento persistente predeterminado según la ruta de tiempo de ejecución mode: "session"requierethread: true
- el valor por defecto es
cwd(opcional): directorio de trabajo de tiempo de ejecución solicitado (validado por política de backend/tiempo de ejecución).label(opcional): etiqueta orientada al operador usada en texto de sesión/banner.streamTo(opcional):"parent"transmite resúmenes de progreso de la ejecución ACP inicial de vuelta a la sesión del solicitante como eventos del sistema.- Cuando está disponible, las respuestas aceptadas incluyen
streamLogPathque apunta a un registro JSONL con alcance de sesión (<sessionId>.acp-stream.jsonl) que puedes seguir para el historial completo de retransmisión.
- Cuando está disponible, las respuestas aceptadas incluyen
Compatibilidad con sandbox
Las sesiones ACP actualmente se ejecutan en el tiempo de ejecución del host, no dentro del sandbox de OpenClaw. Limitaciones actuales:
- Si la sesión del solicitante está en sandbox, los spawns ACP están bloqueados.
- Error:
Sandboxed sessions cannot spawn ACP sessions because runtime="acp" runs on the host. Use runtime="subagent" from sandboxed sessions.
- Error:
sessions_spawnconruntime: "acp"no admitesandbox: "require".- Error:
sessions_spawn sandbox="require" is unsupported for runtime="acp" because ACP sessions run outside the sandbox. Use runtime="subagent" or sandbox="inherit".
- Error:
Usa runtime: "subagent" cuando necesites ejecución forzada por sandbox.
Desde el comando /acp
Usa /acp spawn para control explícito del operador desde el chat cuando sea necesario.
/acp spawn codex --mode persistent --thread auto
/acp spawn codex --mode oneshot --thread off
/acp spawn codex --thread here
Banderas clave:
--mode persistent|oneshot--thread auto|here|off--cwd <absolute-path>--label <name>
Ver Comandos de barra.
Resolución del objetivo de sesión
La mayoría de las acciones /acp aceptan un objetivo de sesión opcional (session-key, session-id, o session-label). Orden de resolución:
- Argumento de objetivo explícito (o
--sessionpara/acp steer)- intenta clave
- luego id de sesión con formato UUID
- luego etiqueta
- Vinculación de hilo actual (si esta conversación/hilo está vinculado a una sesión ACP)
- Recurso de sesión del solicitante actual
Si no se resuelve ningún objetivo, OpenClaw devuelve un error claro (Unable to resolve session target: ...).
Modos de generación de hilos
/acp spawn admite --thread auto|here|off.
| Modo | Comportamiento |
|---|---|
auto | En un hilo activo: vincular ese hilo. Fuera de un hilo: crear/vincular un hilo hijo cuando sea compatible. |
here | Requerir hilo activo actual; fallar si no está en uno. |
off | Sin vinculación. La sesión comienza sin vincular. |
Notas:
- En superficies sin vinculación de hilos, el comportamiento predeterminado es efectivamente
off. - La generación vinculada a hilos requiere soporte de política de canal:
- Discord:
channels.discord.threadBindings.spawnAcpSessions=true - Telegram:
channels.telegram.threadBindings.spawnAcpSessions=true
- Discord:
Controles ACP
Familia de comandos disponible:
/acp spawn/acp cancel/acp steer/acp close/acp status/acp set-mode/acp set/acp cwd/acp permissions/acp timeout/acp model/acp reset-options/acp sessions/acp doctor/acp install
/acp status muestra las opciones efectivas de tiempo de ejecución y, cuando están disponibles, tanto los identificadores de sesión a nivel de tiempo de ejecución como a nivel de backend. Algunos controles dependen de las capacidades del backend. Si un backend no admite un control, OpenClaw devuelve un error claro de control no admitido.
Recetario de comandos ACP
| Comando | Qué hace | Ejemplo |
|---|---|---|
/acp spawn | Crear sesión ACP; vinculación de hilo opcional. | /acp spawn codex --mode persistent --thread auto --cwd /repo |
/acp cancel | Cancelar turno en curso para la sesión objetivo. | /acp cancel agent:codex:acp:<uuid> |
/acp steer | Enviar instrucción de guía a la sesión en ejecución. | /acp steer --session support inbox prioritize failing tests |
/acp close | Cerrar sesión y desvincular objetivos de hilo. | /acp close |
/acp status | Mostrar backend, modo, estado, opciones de tiempo de ejecución, capacidades. | /acp status |
/acp set-mode | Establecer modo de tiempo de ejecución para la sesión objetivo. | /acp set-mode plan |
/acp set | Escritura genérica de opción de configuración de tiempo de ejecución. | /acp set model openai/gpt-5.2 |
/acp cwd | Establecer anulación del directorio de trabajo de tiempo de ejecución. | /acp cwd /Users/user/Projects/repo |
/acp permissions | Establecer perfil de política de aprobación. | /acp permissions strict |
/acp timeout | Establecer tiempo de espera de tiempo de ejecución (segundos). | /acp timeout 120 |
/acp model | Establecer anulación de modelo de tiempo de ejecución. | /acp model anthropic/claude-opus-4-5 |
/acp reset-options | Eliminar anulaciones de opciones de tiempo de ejecución de la sesión. | /acp reset-options |
/acp sessions | Listar sesiones ACP recientes del almacén. | /acp sessions |
/acp doctor | Salud del backend, capacidades, correcciones accionables. | /acp doctor |
/acp install | Imprimir pasos de instalación y habilitación deterministas. | /acp install |
Mapeo de opciones de tiempo de ejecución
/acp tiene comandos de conveniencia y un establecedor genérico. Operaciones equivalentes:
/acp model <id>se mapea a la clave de configuración de tiempo de ejecuciónmodel./acp permissions <profile>se mapea a la clave de configuración de tiempo de ejecuciónapproval_policy./acp timeout <seconds>se mapea a la clave de configuración de tiempo de ejecucióntimeout./acp cwd <path>actualiza la anulación de cwd de tiempo de ejecución directamente./acp set <key> <value>es la ruta genérica.- Caso especial:
key=cwdusa la ruta de anulación de cwd.
- Caso especial:
/acp reset-optionsborra todas las anulaciones de tiempo de ejecución para la sesión objetivo.
Soporte de entorno acpx (actual)
Alias de entorno incorporados actuales de acpx:
piclaudecodexopencodegeminikimi
Cuando OpenClaw usa el backend acpx, prefiere estos valores para agentId a menos que tu configuración de acpx defina alias de agente personalizados. El uso directo de la CLI acpx también puede apuntar a adaptadores arbitrarios a través de --agent <command>, pero esa escotilla de escape cruda es una característica de la CLI acpx (no la ruta normal de agentId de OpenClaw).
Configuración requerida
Línea base ACP central:
{
acp: {
enabled: true,
// Opcional. Por defecto es true; establecer false para pausar el despacho ACP manteniendo los controles /acp.
dispatch: { enabled: true },
backend: "acpx",
defaultAgent: "codex",
allowedAgents: ["pi", "claude", "codex", "opencode", "gemini", "kimi"],
maxConcurrentSessions: 8,
stream: {
coalesceIdleMs: 300,
maxChunkChars: 1200,
},
runtime: {
ttlMinutes: 120,
},
},
}
La configuración de vinculación de hilos es específica del adaptador de canal. Ejemplo para Discord:
{
session: {
threadBindings: {
enabled: true,
idleHours: 24,
maxAgeHours: 0,
},
},
channels: {
discord: {
threadBindings: {
enabled: true,
spawnAcpSessions: true,
},
},
},
}
Si la generación ACP vinculada a hilos no funciona, verifica primero la bandera de característica del adaptador:
- Discord:
channels.discord.threadBindings.spawnAcpSessions=true
Ver Referencia de Configuración.
Configuración del plugin para backend acpx
Instalar y habilitar plugin:
openclaw plugins install acpx
openclaw config set plugins.entries.acpx.enabled true
Instalación local en espacio de trabajo durante desarrollo:
openclaw plugins install ./extensions/acpx
Luego verificar la salud del backend:
/acp doctor
Configuración de comando y versión de acpx
Por defecto, el plugin acpx (publicado como @openclaw/acpx) usa el binario fijado local al plugin:
- El comando por defecto es
extensions/acpx/node_modules/.bin/acpx. - La versión esperada por defecto es la fijación de la extensión.
- El inicio registra el backend ACP inmediatamente como no listo.
- Un trabajo de verificación en segundo plano verifica
acpx --version. - Si falta el binario local al plugin o no coincide, ejecuta:
npm install --omit=dev --no-save acpx@<pinned>y vuelve a verificar.
Puedes anular comando/versión en la configuración del plugin:
{
"plugins": {
"entries": {
"acpx": {
"enabled": true,
"config": {
"command": "../acpx/dist/cli.js",
"expectedVersion": "any"
}
}
}
}
}
Notas:
commandacepta una ruta absoluta, ruta relativa o nombre de comando (acpx).- Las rutas relativas se resuelven desde el directorio del espacio de trabajo de OpenClaw.
expectedVersion: "any"desactiva la coincidencia estricta de versiones.- Cuando
commandapunta a un binario/ruta personalizado, la auto-instalación local al plugin está deshabilitada. - El inicio de OpenClaw permanece no bloqueante mientras se ejecuta la verificación de salud del backend.
Ver Plugins.
Configuración de permisos
Las sesiones ACP se ejecutan de forma no interactiva — no hay TTY para aprobar o denegar solicitudes de permisos de escritura de archivos y ejecución de shell. El plugin acpx proporciona dos claves de configuración que controlan cómo se manejan los permisos:
permissionMode
Controla qué operaciones puede realizar el agente del entorno sin solicitar confirmación.
| Valor | Comportamiento |
|---|---|
approve-all | Aprobar automáticamente todas las escrituras de archivos y comandos de shell. |
approve-reads | Aprobar automáticamente solo lecturas; escrituras y ejecuciones requieren solicitudes. |
deny-all | Denegar todas las solicitudes de permiso. |
nonInteractivePermissions
Controla qué sucede cuando se mostraría una solicitud de permiso pero no hay TTY interactivo disponible (que siempre es el caso para sesiones ACP).
| Valor | Comportamiento |
|---|---|
fail | Abortar la sesión con AcpRuntimeError. (por defecto) |
deny | Denegar silenciosamente el permiso y continuar (degradación elegante). |
Configuración
Establecer a través de la configuración del plugin:
openclaw config set plugins.entries.acpx.config.permissionMode approve-all
openclaw config set plugins.entries.acpx.config.nonInteractivePermissions fail
Reiniciar la puerta de enlace después de cambiar estos valores.
Importante: OpenClaw actualmente tiene por defecto
permissionMode=approve-readsynonInteractivePermissions=fail. En sesiones ACP no interactivas, cualquier escritura o ejecución que active una solicitud de permiso puede fallar conAcpRuntimeError: Permission prompt unavailable in non-interactive mode. Si necesitas restringir permisos, establecenonInteractivePermissionsendenypara que las sesiones se degraden elegantemente en lugar de fallar.
Solución de problemas
| Síntoma | Causa probable | Solución |
|---|---|---|
ACP runtime backend is not configured | Plugin backend faltante o deshabilitado. | Instalar y habilitar plugin backend, luego ejecutar /acp doctor. |
ACP is disabled by policy (acp.enabled=false) | ACP globalmente deshabilitado. | Establecer acp.enabled=true. |
ACP dispatch is disabled by policy (acp.dispatch.enabled=false) | Despacho desde mensajes normales de hilo deshabilitado. | Establecer acp.dispatch.enabled=true. |
ACP agent "<id>" is not allowed by policy | Agente no en lista de permitidos. | Usar agentId permitido o actualizar acp.allowedAgents. |
Unable to resolve session target: ... | Token de clave/id/etiqueta incorrecto. | Ejecutar /acp sessions, copiar clave/etiqueta exacta, reintentar. |
--thread here requires running /acp spawn inside an active ... thread | --thread here usado fuera de un contexto de hilo. | Moverse al hilo objetivo o usar --thread auto/off. |
Only <user-id> can rebind this thread. | Otro usuario posee la vinculación del hilo. | Revincular como propietario o usar un hilo diferente. |
Thread bindings are unavailable for <channel>. | El adaptador carece de capacidad de vinculación de hilos. | Usar --thread off o moverse a adaptador/canal compatible. |
Sandboxed sessions cannot spawn ACP sessions ... | El tiempo de ejecución ACP está en el lado del host; la sesión del solicitante está en sandbox. | Usar runtime="subagent" desde sesiones en sandbox, o ejecutar spawn ACP desde una sesión no sandbox. |
sessions_spawn sandbox="require" is unsupported for runtime="acp" ... | sandbox="require" solicitado para tiempo de ejecución ACP. | Usar runtime="subagent" para sandbox requerido, o usar ACP con sandbox="inherit" desde una sesión no sandbox. |
| Falta metadato ACP para sesión vinculada | Metadato de sesión ACP obsoleto/eliminado. | Recrear con /acp spawn, luego revincular/enfocar hilo. |
AcpRuntimeError: Permission prompt unavailable in non-interactive mode | permissionMode bloquea escrituras/ejecuciones en sesión ACP no interactiva. | Establecer plugins.entries.acpx.config.permissionMode en approve-all y reiniciar puerta de enlace. Ver Configuración de permisos. |
| La sesión ACP falla temprano con poca salida | Las solicitudes de permiso están bloqueadas por permissionMode/nonInteractivePermissions. | Verificar registros de la puerta de enlace para AcpRuntimeError. Para permisos completos, establecer permissionMode=approve-all; para degradación elegante, establecer nonInteractivePermissions=deny. |
| La sesión ACP se detiene indefinidamente después de completar el trabajo | El proceso del entorno terminó pero la sesión ACP no reportó finalización. | Monitorear con ps aux | grep acpx; matar procesos obsoletos manualmente. |