chore(i18n): refresh es translations
This commit is contained in:
parent
f349af7b7a
commit
f8bf7dd57b
File diff suppressed because it is too large
Load Diff
@ -4,21 +4,21 @@ read_when:
|
||||
summary: Configuración de Slack y comportamiento en tiempo de ejecución (Socket Mode + URL de solicitud HTTP)
|
||||
title: Slack
|
||||
x-i18n:
|
||||
generated_at: "2026-04-21T13:35:20Z"
|
||||
generated_at: "2026-04-21T17:45:41Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 2fe3c3c344e1c20c09b29773f4f68d2790751e76d8bbaa3c6157e3ff75978acf
|
||||
source_hash: f30b372a3ae10b7b649532181306e42792aca76b41422516e9633eb79f73f009
|
||||
source_path: channels/slack.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Slack
|
||||
|
||||
Estado: listo para producción para MD + canales mediante integraciones de aplicaciones de Slack. El modo predeterminado es Socket Mode; las URL de solicitud HTTP también son compatibles.
|
||||
Estado: listo para producción para mensajes directos y canales mediante integraciones de aplicaciones de Slack. El modo predeterminado es Socket Mode; las URL de solicitud HTTP también son compatibles.
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card title="Vinculación" icon="link" href="/es/channels/pairing">
|
||||
Los MD de Slack usan el modo de vinculación de forma predeterminada.
|
||||
Los mensajes directos de Slack usan de forma predeterminada el modo de vinculación.
|
||||
</Card>
|
||||
<Card title="Comandos slash" icon="terminal" href="/es/tools/slash-commands">
|
||||
Comportamiento nativo de comandos y catálogo de comandos.
|
||||
@ -34,10 +34,10 @@ Estado: listo para producción para MD + canales mediante integraciones de aplic
|
||||
<Tab title="Socket Mode (predeterminado)">
|
||||
<Steps>
|
||||
<Step title="Crear una nueva aplicación de Slack">
|
||||
En la configuración de la aplicación de Slack, pulsa el botón **[Create New App](https://api.slack.com/apps/new)**:
|
||||
En la configuración de la aplicación de Slack, presiona el botón **[Create New App](https://api.slack.com/apps/new)**:
|
||||
|
||||
- elige **from a manifest** y selecciona un espacio de trabajo para tu aplicación
|
||||
- pega el [manifiesto de ejemplo](#manifest-and-scope-checklist) de abajo y continúa para crearla
|
||||
- pega el [manifiesto de ejemplo](#manifest-and-scope-checklist) que aparece a continuación y continúa para crearla
|
||||
- genera un **App-Level Token** (`xapp-...`) con `connections:write`
|
||||
- instala la aplicación y copia el **Bot Token** (`xoxb-...`) que se muestra
|
||||
</Step>
|
||||
@ -57,7 +57,7 @@ Estado: listo para producción para MD + canales mediante integraciones de aplic
|
||||
}
|
||||
```
|
||||
|
||||
Alternativa con variables de entorno (solo cuenta predeterminada):
|
||||
Respaldo por variable de entorno (solo cuenta predeterminada):
|
||||
|
||||
```bash
|
||||
SLACK_APP_TOKEN=xapp-...
|
||||
@ -80,7 +80,7 @@ openclaw gateway
|
||||
<Tab title="URL de solicitud HTTP">
|
||||
<Steps>
|
||||
<Step title="Crear una nueva aplicación de Slack">
|
||||
En la configuración de la aplicación de Slack, pulsa el botón **[Create New App](https://api.slack.com/apps/new)**:
|
||||
En la configuración de la aplicación de Slack, presiona el botón **[Create New App](https://api.slack.com/apps/new)**:
|
||||
|
||||
- elige **from a manifest** y selecciona un espacio de trabajo para tu aplicación
|
||||
- pega el [manifiesto de ejemplo](#manifest-and-scope-checklist) y actualiza las URL antes de crearla
|
||||
@ -125,7 +125,7 @@ openclaw gateway
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Lista de comprobación de manifiesto y alcances
|
||||
## Lista de verificación de manifiesto y alcances
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Socket Mode (predeterminado)">
|
||||
@ -134,7 +134,7 @@ openclaw gateway
|
||||
{
|
||||
"display_information": {
|
||||
"name": "OpenClaw",
|
||||
"description": "Conector de Slack para OpenClaw"
|
||||
"description": "Slack connector for OpenClaw"
|
||||
},
|
||||
"features": {
|
||||
"bot_user": {
|
||||
@ -148,7 +148,7 @@ openclaw gateway
|
||||
"slash_commands": [
|
||||
{
|
||||
"command": "/openclaw",
|
||||
"description": "Enviar un mensaje a OpenClaw",
|
||||
"description": "Send a message to OpenClaw",
|
||||
"should_escape": false
|
||||
}
|
||||
]
|
||||
@ -211,7 +211,7 @@ openclaw gateway
|
||||
{
|
||||
"display_information": {
|
||||
"name": "OpenClaw",
|
||||
"description": "Conector de Slack para OpenClaw"
|
||||
"description": "Slack connector for OpenClaw"
|
||||
},
|
||||
"features": {
|
||||
"bot_user": {
|
||||
@ -225,7 +225,7 @@ openclaw gateway
|
||||
"slash_commands": [
|
||||
{
|
||||
"command": "/openclaw",
|
||||
"description": "Enviar un mensaje a OpenClaw",
|
||||
"description": "Send a message to OpenClaw",
|
||||
"should_escape": false,
|
||||
"url": "https://gateway-host.example.com/slack/events"
|
||||
}
|
||||
@ -289,9 +289,9 @@ openclaw gateway
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
### Configuración adicional del manifiesto
|
||||
### Configuraciones adicionales del manifiesto
|
||||
|
||||
Expone distintas funciones que amplían los valores predeterminados anteriores.
|
||||
Muestran distintas funciones que amplían los valores predeterminados anteriores.
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Comandos slash nativos opcionales">
|
||||
@ -301,7 +301,7 @@ Expone distintas funciones que amplían los valores predeterminados anteriores.
|
||||
- Usa `/agentstatus` en lugar de `/status` porque el comando `/status` está reservado.
|
||||
- No se pueden poner a disposición más de 25 comandos slash a la vez.
|
||||
|
||||
Sustituye tu sección existente `features.slash_commands` por un subconjunto de los [comandos disponibles](/es/tools/slash-commands#command-list):
|
||||
Reemplaza tu sección existente `features.slash_commands` por un subconjunto de los [comandos disponibles](/es/tools/slash-commands#command-list):
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Socket Mode (predeterminado)">
|
||||
@ -310,110 +310,110 @@ Expone distintas funciones que amplían los valores predeterminados anteriores.
|
||||
"slash_commands": [
|
||||
{
|
||||
"command": "/new",
|
||||
"description": "Iniciar una nueva sesión",
|
||||
"description": "Start a new session",
|
||||
"usage_hint": "[model]"
|
||||
},
|
||||
{
|
||||
"command": "/reset",
|
||||
"description": "Restablecer la sesión actual"
|
||||
"description": "Reset the current session"
|
||||
},
|
||||
{
|
||||
"command": "/compact",
|
||||
"description": "Compactar el contexto de la sesión",
|
||||
"description": "Compact the session context",
|
||||
"usage_hint": "[instructions]"
|
||||
},
|
||||
{
|
||||
"command": "/stop",
|
||||
"description": "Detener la ejecución actual"
|
||||
"description": "Stop the current run"
|
||||
},
|
||||
{
|
||||
"command": "/session",
|
||||
"description": "Administrar el vencimiento de la vinculación del hilo",
|
||||
"description": "Manage thread-binding expiry",
|
||||
"usage_hint": "idle <duration|off> or max-age <duration|off>"
|
||||
},
|
||||
{
|
||||
"command": "/think",
|
||||
"description": "Establecer el nivel de pensamiento",
|
||||
"description": "Set the thinking level",
|
||||
"usage_hint": "<level>"
|
||||
},
|
||||
{
|
||||
"command": "/verbose",
|
||||
"description": "Alternar la salida detallada",
|
||||
"description": "Toggle verbose output",
|
||||
"usage_hint": "on|off|full"
|
||||
},
|
||||
{
|
||||
"command": "/fast",
|
||||
"description": "Mostrar o establecer el modo rápido",
|
||||
"description": "Show or set fast mode",
|
||||
"usage_hint": "[status|on|off]"
|
||||
},
|
||||
{
|
||||
"command": "/reasoning",
|
||||
"description": "Alternar la visibilidad del razonamiento",
|
||||
"description": "Toggle reasoning visibility",
|
||||
"usage_hint": "[on|off|stream]"
|
||||
},
|
||||
{
|
||||
"command": "/elevated",
|
||||
"description": "Alternar el modo elevado",
|
||||
"description": "Toggle elevated mode",
|
||||
"usage_hint": "[on|off|ask|full]"
|
||||
},
|
||||
{
|
||||
"command": "/exec",
|
||||
"description": "Mostrar o establecer los valores predeterminados de exec",
|
||||
"description": "Show or set exec defaults",
|
||||
"usage_hint": "host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>"
|
||||
},
|
||||
{
|
||||
"command": "/model",
|
||||
"description": "Mostrar o establecer el modelo",
|
||||
"description": "Show or set the model",
|
||||
"usage_hint": "[name|#|status]"
|
||||
},
|
||||
{
|
||||
"command": "/models",
|
||||
"description": "Listar proveedores o modelos de un proveedor",
|
||||
"description": "List providers or models for a provider",
|
||||
"usage_hint": "[provider] [page] [limit=<n>|size=<n>|all]"
|
||||
},
|
||||
{
|
||||
"command": "/help",
|
||||
"description": "Mostrar el resumen breve de ayuda"
|
||||
"description": "Show the short help summary"
|
||||
},
|
||||
{
|
||||
"command": "/commands",
|
||||
"description": "Mostrar el catálogo de comandos generado"
|
||||
"description": "Show the generated command catalog"
|
||||
},
|
||||
{
|
||||
"command": "/tools",
|
||||
"description": "Mostrar lo que el agente actual puede usar ahora mismo",
|
||||
"description": "Show what the current agent can use right now",
|
||||
"usage_hint": "[compact|verbose]"
|
||||
},
|
||||
{
|
||||
"command": "/agentstatus",
|
||||
"description": "Mostrar el estado en tiempo de ejecución, incluido el uso/cuota del proveedor cuando esté disponible"
|
||||
"description": "Show runtime status, including provider usage/quota when available"
|
||||
},
|
||||
{
|
||||
"command": "/tasks",
|
||||
"description": "Listar las tareas activas o recientes en segundo plano de la sesión actual"
|
||||
"description": "List active/recent background tasks for the current session"
|
||||
},
|
||||
{
|
||||
"command": "/context",
|
||||
"description": "Explicar cómo se ensambla el contexto",
|
||||
"description": "Explain how context is assembled",
|
||||
"usage_hint": "[list|detail|json]"
|
||||
},
|
||||
{
|
||||
"command": "/whoami",
|
||||
"description": "Mostrar tu identidad de remitente"
|
||||
"description": "Show your sender identity"
|
||||
},
|
||||
{
|
||||
"command": "/skill",
|
||||
"description": "Ejecutar una skill por nombre",
|
||||
"description": "Run a skill by name",
|
||||
"usage_hint": "<name> [input]"
|
||||
},
|
||||
{
|
||||
"command": "/btw",
|
||||
"description": "Hacer una pregunta secundaria sin cambiar el contexto de la sesión",
|
||||
"description": "Ask a side question without changing session context",
|
||||
"usage_hint": "<question>"
|
||||
},
|
||||
{
|
||||
"command": "/usage",
|
||||
"description": "Controlar el pie de uso o mostrar el resumen de costo",
|
||||
"description": "Control the usage footer or show cost summary",
|
||||
"usage_hint": "off|tokens|full|cost"
|
||||
}
|
||||
]
|
||||
@ -449,12 +449,12 @@ Expone distintas funciones que amplían los valores predeterminados anteriores.
|
||||
{
|
||||
"command": "/session",
|
||||
"description": "Administrar el vencimiento de la vinculación del hilo",
|
||||
"usage_hint": "idle <duration|off> or max-age <duration|off>",
|
||||
"usage_hint": "idle <duration|off> o max-age <duration|off>",
|
||||
"url": "https://gateway-host.example.com/slack/events"
|
||||
},
|
||||
{
|
||||
"command": "/think",
|
||||
"description": "Establecer el nivel de pensamiento",
|
||||
"description": "Establecer el nivel de razonamiento",
|
||||
"usage_hint": "<level>",
|
||||
"url": "https://gateway-host.example.com/slack/events"
|
||||
},
|
||||
@ -512,18 +512,18 @@ Expone distintas funciones que amplían los valores predeterminados anteriores.
|
||||
},
|
||||
{
|
||||
"command": "/tools",
|
||||
"description": "Mostrar lo que el agente actual puede usar ahora mismo",
|
||||
"description": "Mostrar lo que el agente actual puede usar en este momento",
|
||||
"usage_hint": "[compact|verbose]",
|
||||
"url": "https://gateway-host.example.com/slack/events"
|
||||
},
|
||||
{
|
||||
"command": "/agentstatus",
|
||||
"description": "Mostrar el estado en tiempo de ejecución, incluido el uso/cuota del proveedor cuando esté disponible",
|
||||
"description": "Mostrar el estado del tiempo de ejecución, incluido el uso/cuota del proveedor cuando esté disponible",
|
||||
"url": "https://gateway-host.example.com/slack/events"
|
||||
},
|
||||
{
|
||||
"command": "/tasks",
|
||||
"description": "Listar las tareas activas o recientes en segundo plano de la sesión actual",
|
||||
"description": "Listar las tareas en segundo plano activas/recientes de la sesión actual",
|
||||
"url": "https://gateway-host.example.com/slack/events"
|
||||
},
|
||||
{
|
||||
@ -539,7 +539,7 @@ Expone distintas funciones que amplían los valores predeterminados anteriores.
|
||||
},
|
||||
{
|
||||
"command": "/skill",
|
||||
"description": "Ejecutar una skill por nombre",
|
||||
"description": "Ejecutar una Skill por nombre",
|
||||
"usage_hint": "<name> [input]",
|
||||
"url": "https://gateway-host.example.com/slack/events"
|
||||
},
|
||||
@ -551,7 +551,7 @@ Expone distintas funciones que amplían los valores predeterminados anteriores.
|
||||
},
|
||||
{
|
||||
"command": "/usage",
|
||||
"description": "Controlar el pie de uso o mostrar el resumen de costo",
|
||||
"description": "Controlar el pie de uso o mostrar el resumen de costos",
|
||||
"usage_hint": "off|tokens|full|cost",
|
||||
"url": "https://gateway-host.example.com/slack/events"
|
||||
}
|
||||
@ -563,13 +563,13 @@ Expone distintas funciones que amplían los valores predeterminados anteriores.
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Alcances de autoría opcionales (operaciones de escritura)">
|
||||
Agrega el alcance bot `chat:write.customize` si quieres que los mensajes salientes usen la identidad del agente activo (nombre de usuario e icono personalizados) en lugar de la identidad predeterminada de la aplicación de Slack.
|
||||
Agrega el alcance de bot `chat:write.customize` si quieres que los mensajes salientes usen la identidad del agente activo (nombre de usuario e ícono personalizados) en lugar de la identidad predeterminada de la aplicación de Slack.
|
||||
|
||||
Si usas un icono emoji, Slack espera la sintaxis `:emoji_name:`.
|
||||
Si usas un ícono de emoji, Slack espera la sintaxis `:emoji_name:`.
|
||||
|
||||
</Accordion>
|
||||
<Accordion title="Alcances opcionales de token de usuario (operaciones de lectura)">
|
||||
Si configuras `channels.slack.userToken`, los alcances de lectura habituales son:
|
||||
Si configuras `channels.slack.userToken`, los alcances de lectura típicos son:
|
||||
|
||||
- `channels:history`, `groups:history`, `im:history`, `mpim:history`
|
||||
- `channels:read`, `groups:read`, `im:read`, `mpim:read`
|
||||
@ -588,9 +588,9 @@ Expone distintas funciones que amplían los valores predeterminados anteriores.
|
||||
- El modo HTTP requiere `botToken` + `signingSecret`.
|
||||
- `botToken`, `appToken`, `signingSecret` y `userToken` aceptan cadenas de texto sin formato
|
||||
u objetos SecretRef.
|
||||
- Los tokens de configuración sustituyen la alternativa de variables de entorno.
|
||||
- La alternativa de variables de entorno `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` se aplica solo a la cuenta predeterminada.
|
||||
- `userToken` (`xoxp-...`) es solo de configuración (sin alternativa de variable de entorno) y usa de forma predeterminada un comportamiento de solo lectura (`userTokenReadOnly: true`).
|
||||
- Los tokens de configuración prevalecen sobre el respaldo por variable de entorno.
|
||||
- El respaldo por variable de entorno `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` solo se aplica a la cuenta predeterminada.
|
||||
- `userToken` (`xoxp-...`) es solo de configuración (sin respaldo por variable de entorno) y, de manera predeterminada, tiene comportamiento de solo lectura (`userTokenReadOnly: true`).
|
||||
|
||||
Comportamiento de la instantánea de estado:
|
||||
|
||||
@ -598,13 +598,13 @@ Comportamiento de la instantánea de estado:
|
||||
por credencial (`botToken`, `appToken`, `signingSecret`, `userToken`).
|
||||
- El estado es `available`, `configured_unavailable` o `missing`.
|
||||
- `configured_unavailable` significa que la cuenta está configurada mediante SecretRef
|
||||
u otra fuente de secretos no integrada, pero la ruta actual de comando/tiempo de ejecución
|
||||
u otra fuente de secretos no integrada, pero la ruta actual del comando/tiempo de ejecución
|
||||
no pudo resolver el valor real.
|
||||
- En modo HTTP, se incluye `signingSecretStatus`; en Socket Mode, el par
|
||||
obligatorio es `botTokenStatus` + `appTokenStatus`.
|
||||
- En modo HTTP, se incluye `signingSecretStatus`; en Socket Mode, el
|
||||
par obligatorio es `botTokenStatus` + `appTokenStatus`.
|
||||
|
||||
<Tip>
|
||||
Para acciones/lecturas de directorio, se puede dar preferencia al token de usuario cuando esté configurado. Para escrituras, el token de bot sigue siendo el preferido; las escrituras con token de usuario solo se permiten cuando `userTokenReadOnly: false` y el token de bot no está disponible.
|
||||
Para acciones/lecturas de directorio, se puede priorizar el token de usuario cuando está configurado. Para escrituras, el token de bot sigue siendo el preferido; las escrituras con token de usuario solo se permiten cuando `userTokenReadOnly: false` y el token de bot no está disponible.
|
||||
</Tip>
|
||||
|
||||
## Acciones y controles
|
||||
@ -615,40 +615,40 @@ Grupos de acciones disponibles en las herramientas actuales de Slack:
|
||||
|
||||
| Grupo | Predeterminado |
|
||||
| ---------- | -------------- |
|
||||
| messages | enabled |
|
||||
| reactions | enabled |
|
||||
| pins | enabled |
|
||||
| memberInfo | enabled |
|
||||
| emojiList | enabled |
|
||||
| messages | habilitado |
|
||||
| reactions | habilitado |
|
||||
| pins | habilitado |
|
||||
| memberInfo | habilitado |
|
||||
| emojiList | habilitado |
|
||||
|
||||
Las acciones actuales de mensajes de Slack incluyen `send`, `upload-file`, `download-file`, `read`, `edit`, `delete`, `pin`, `unpin`, `list-pins`, `member-info` y `emoji-list`.
|
||||
|
||||
## Control de acceso y enrutamiento
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Política de MD">
|
||||
`channels.slack.dmPolicy` controla el acceso a MD (legado: `channels.slack.dm.policy`):
|
||||
<Tab title="Política de mensajes directos">
|
||||
`channels.slack.dmPolicy` controla el acceso a mensajes directos (heredado: `channels.slack.dm.policy`):
|
||||
|
||||
- `pairing` (predeterminado)
|
||||
- `allowlist`
|
||||
- `open` (requiere que `channels.slack.allowFrom` incluya `"*"`; legado: `channels.slack.dm.allowFrom`)
|
||||
- `open` (requiere que `channels.slack.allowFrom` incluya `"*"`; heredado: `channels.slack.dm.allowFrom`)
|
||||
- `disabled`
|
||||
|
||||
Indicadores de MD:
|
||||
Indicadores de mensajes directos:
|
||||
|
||||
- `dm.enabled` (predeterminado: true)
|
||||
- `channels.slack.allowFrom` (preferido)
|
||||
- `dm.allowFrom` (legado)
|
||||
- `dm.groupEnabled` (los MD de grupo tienen como valor predeterminado false)
|
||||
- `dm.allowFrom` (heredado)
|
||||
- `dm.groupEnabled` (los mensajes directos de grupo están desactivados de forma predeterminada)
|
||||
- `dm.groupChannels` (lista de permitidos MPIM opcional)
|
||||
|
||||
Precedencia en varias cuentas:
|
||||
|
||||
- `channels.slack.accounts.default.allowFrom` se aplica solo a la cuenta `default`.
|
||||
- Las cuentas con nombre heredan `channels.slack.allowFrom` cuando su propio `allowFrom` no está configurado.
|
||||
- Las cuentas con nombre heredan `channels.slack.allowFrom` cuando su propio `allowFrom` no está definido.
|
||||
- Las cuentas con nombre no heredan `channels.slack.accounts.default.allowFrom`.
|
||||
|
||||
La vinculación en MD usa `openclaw pairing approve slack <code>`.
|
||||
La vinculación en mensajes directos usa `openclaw pairing approve slack <code>`.
|
||||
|
||||
</Tab>
|
||||
|
||||
@ -661,24 +661,24 @@ Las acciones actuales de mensajes de Slack incluyen `send`, `upload-file`, `down
|
||||
|
||||
La lista de permitidos de canales se encuentra en `channels.slack.channels` y debe usar IDs de canal estables.
|
||||
|
||||
Nota de tiempo de ejecución: si `channels.slack` falta por completo (configuración solo con variables de entorno), el tiempo de ejecución vuelve a `groupPolicy="allowlist"` y registra una advertencia (incluso si `channels.defaults.groupPolicy` está configurado).
|
||||
Nota de tiempo de ejecución: si falta por completo `channels.slack` (configuración solo con variables de entorno), el tiempo de ejecución usa como respaldo `groupPolicy="allowlist"` y registra una advertencia (incluso si `channels.defaults.groupPolicy` está definido).
|
||||
|
||||
Resolución de nombres/IDs:
|
||||
Resolución de nombre/ID:
|
||||
|
||||
- las entradas de la lista de permitidos de canales y las entradas de la lista de permitidos de MD se resuelven al inicio cuando el acceso con token lo permite
|
||||
- las entradas no resueltas de nombres de canal se conservan tal como están configuradas, pero se ignoran para el enrutamiento de forma predeterminada
|
||||
- la autorización entrante y el enrutamiento de canales usan IDs primero de forma predeterminada; la coincidencia directa de nombre de usuario/slug requiere `channels.slack.dangerouslyAllowNameMatching: true`
|
||||
- las entradas de la lista de permitidos de canales y de mensajes directos se resuelven al inicio cuando el acceso al token lo permite
|
||||
- las entradas no resueltas por nombre de canal se conservan como están configuradas, pero se ignoran para el enrutamiento de forma predeterminada
|
||||
- la autorización entrante y el enrutamiento de canales usan primero el ID de forma predeterminada; la coincidencia directa por nombre de usuario/slug requiere `channels.slack.dangerouslyAllowNameMatching: true`
|
||||
|
||||
</Tab>
|
||||
|
||||
<Tab title="Menciones y usuarios del canal">
|
||||
Los mensajes de canal están restringidos por mención de forma predeterminada.
|
||||
Los mensajes de canal están controlados por mención de forma predeterminada.
|
||||
|
||||
Fuentes de mención:
|
||||
|
||||
- mención explícita de la aplicación (`<@botId>`)
|
||||
- patrones regex de mención (`agents.list[].groupChat.mentionPatterns`, alternativa `messages.groupChat.mentionPatterns`)
|
||||
- comportamiento implícito de respuesta en hilo al bot (desactivado cuando `thread.requireExplicitMention` es `true`)
|
||||
- patrones regex de mención (`agents.list[].groupChat.mentionPatterns`, respaldo `messages.groupChat.mentionPatterns`)
|
||||
- comportamiento implícito de responder a un hilo del bot (desactivado cuando `thread.requireExplicitMention` es `true`)
|
||||
|
||||
Controles por canal (`channels.slack.channels.<id>`; nombres solo mediante resolución al inicio o `dangerouslyAllowNameMatching`):
|
||||
|
||||
@ -688,7 +688,7 @@ Las acciones actuales de mensajes de Slack incluyen `send`, `upload-file`, `down
|
||||
- `skills`
|
||||
- `systemPrompt`
|
||||
- `tools`, `toolsBySender`
|
||||
- formato de clave `toolsBySender`: `id:`, `e164:`, `username:`, `name:` o comodín `"*"`
|
||||
- formato de clave de `toolsBySender`: `id:`, `e164:`, `username:`, `name:` o comodín `"*"`
|
||||
(las claves heredadas sin prefijo siguen asignándose solo a `id:`)
|
||||
|
||||
</Tab>
|
||||
@ -696,37 +696,37 @@ Las acciones actuales de mensajes de Slack incluyen `send`, `upload-file`, `down
|
||||
|
||||
## Hilos, sesiones y etiquetas de respuesta
|
||||
|
||||
- Los MD se enrutan como `direct`; los canales como `channel`; los MPIM como `group`.
|
||||
- Con el valor predeterminado `session.dmScope=main`, los MD de Slack se contraen en la sesión principal del agente.
|
||||
- Los mensajes directos se enrutan como `direct`; los canales como `channel`; los MPIM como `group`.
|
||||
- Con el valor predeterminado `session.dmScope=main`, los mensajes directos de Slack se consolidan en la sesión principal del agente.
|
||||
- Sesiones de canal: `agent:<agentId>:slack:channel:<channelId>`.
|
||||
- Las respuestas en hilo pueden crear sufijos de sesión de hilo (`:thread:<threadTs>`) cuando corresponda.
|
||||
- Las respuestas en hilos pueden crear sufijos de sesión de hilo (`:thread:<threadTs>`) cuando corresponda.
|
||||
- El valor predeterminado de `channels.slack.thread.historyScope` es `thread`; el valor predeterminado de `thread.inheritParent` es `false`.
|
||||
- `channels.slack.thread.initialHistoryLimit` controla cuántos mensajes existentes del hilo se recuperan cuando comienza una nueva sesión de hilo (predeterminado `20`; establece `0` para desactivar).
|
||||
- `channels.slack.thread.requireExplicitMention` (predeterminado `false`): cuando es `true`, suprime las menciones implícitas en hilo para que el bot solo responda a menciones explícitas `@bot` dentro de los hilos, incluso cuando el bot ya participó en el hilo. Sin esto, las respuestas en un hilo con participación del bot omiten el control `requireMention`.
|
||||
- `channels.slack.thread.initialHistoryLimit` controla cuántos mensajes existentes del hilo se obtienen cuando comienza una nueva sesión de hilo (predeterminado `20`; establece `0` para desactivar).
|
||||
- `channels.slack.thread.requireExplicitMention` (predeterminado `false`): cuando es `true`, suprime las menciones implícitas en hilos para que el bot solo responda a menciones explícitas `@bot` dentro de los hilos, incluso cuando el bot ya participó en el hilo. Sin esto, las respuestas en un hilo en el que participó el bot omiten el control `requireMention`.
|
||||
|
||||
Controles de respuesta en hilo:
|
||||
Controles de respuestas en hilos:
|
||||
|
||||
- `channels.slack.replyToMode`: `off|first|all|batched` (predeterminado `off`)
|
||||
- `channels.slack.replyToModeByChatType`: por `direct|group|channel`
|
||||
- alternativa heredada para chats directos: `channels.slack.dm.replyToMode`
|
||||
- respaldo heredado para chats directos: `channels.slack.dm.replyToMode`
|
||||
|
||||
Se admiten etiquetas manuales de respuesta:
|
||||
|
||||
- `[[reply_to_current]]`
|
||||
- `[[reply_to:<id>]]`
|
||||
|
||||
Nota: `replyToMode="off"` desactiva **todo** el enhebrado de respuestas en Slack, incluidas las etiquetas explícitas `[[reply_to_*]]`. Esto difiere de Telegram, donde las etiquetas explícitas siguen respetándose en modo `"off"`. La diferencia refleja los modelos de hilos de cada plataforma: los hilos de Slack ocultan los mensajes del canal, mientras que las respuestas de Telegram siguen siendo visibles en el flujo principal del chat.
|
||||
Nota: `replyToMode="off"` desactiva **todo** el uso de respuestas en hilos en Slack, incluidas las etiquetas explícitas `[[reply_to_*]]`. Esto difiere de Telegram, donde las etiquetas explícitas siguen respetándose en modo `"off"`. La diferencia refleja los modelos de hilos de cada plataforma: los hilos de Slack ocultan los mensajes del canal, mientras que las respuestas de Telegram siguen siendo visibles en el flujo principal del chat.
|
||||
|
||||
## Reacciones de acuse
|
||||
|
||||
`ackReaction` envía un emoji de acuse mientras OpenClaw procesa un mensaje entrante.
|
||||
`ackReaction` envía un emoji de confirmación mientras OpenClaw procesa un mensaje entrante.
|
||||
|
||||
Orden de resolución:
|
||||
|
||||
- `channels.slack.accounts.<accountId>.ackReaction`
|
||||
- `channels.slack.ackReaction`
|
||||
- `messages.ackReaction`
|
||||
- alternativa con emoji de identidad del agente (`agents.list[].identity.emoji`; en caso contrario, `"👀"`)
|
||||
- respaldo del emoji de identidad del agente (`agents.list[].identity.emoji`, o bien `"👀"`)
|
||||
|
||||
Notas:
|
||||
|
||||
@ -738,19 +738,20 @@ Notas:
|
||||
`channels.slack.streaming` controla el comportamiento de vista previa en vivo:
|
||||
|
||||
- `off`: desactiva el streaming de vista previa en vivo.
|
||||
- `partial` (predeterminado): sustituye el texto de vista previa por la salida parcial más reciente.
|
||||
- `block`: agrega actualizaciones de vista previa fragmentadas.
|
||||
- `partial` (predeterminado): reemplaza el texto de vista previa con la salida parcial más reciente.
|
||||
- `block`: agrega actualizaciones de vista previa en fragmentos.
|
||||
- `progress`: muestra texto de estado de progreso mientras se genera y luego envía el texto final.
|
||||
- `streaming.preview.toolProgress`: cuando la vista previa de borrador está activa, enruta las actualizaciones de herramientas/progreso al mismo mensaje de vista previa editado (predeterminado: `true`). Establece `false` para mantener mensajes separados de herramientas/progreso.
|
||||
|
||||
`channels.slack.streaming.nativeTransport` controla el streaming de texto nativo de Slack cuando `channels.slack.streaming.mode` es `partial` (predeterminado: `true`).
|
||||
`channels.slack.streaming.nativeTransport` controla el streaming nativo de texto de Slack cuando `channels.slack.streaming.mode` es `partial` (predeterminado: `true`).
|
||||
|
||||
- Debe haber un hilo de respuesta disponible para que aparezcan el streaming de texto nativo y el estado del hilo del asistente de Slack. La selección del hilo sigue rigiéndose por `replyToMode`.
|
||||
- Las raíces de canales y chats de grupo pueden seguir usando la vista previa normal de borrador cuando el streaming nativo no está disponible.
|
||||
- Los MD de Slack de nivel superior permanecen fuera de hilo de forma predeterminada, por lo que no muestran la vista previa de estilo hilo; usa respuestas en hilo o `typingReaction` si quieres progreso visible allí.
|
||||
- Las cargas útiles multimedia y no textuales vuelven a la entrega normal.
|
||||
- Si el streaming falla a mitad de una respuesta, OpenClaw vuelve a la entrega normal para las cargas útiles restantes.
|
||||
- Debe haber disponible un hilo de respuesta para que aparezcan el streaming nativo de texto y el estado del hilo del asistente de Slack. La selección del hilo sigue respetando `replyToMode`.
|
||||
- Las raíces de canales y chats grupales pueden seguir usando la vista previa de borrador normal cuando el streaming nativo no está disponible.
|
||||
- Los mensajes directos de Slack de nivel superior permanecen fuera de hilo de forma predeterminada, por lo que no muestran la vista previa con estilo de hilo; usa respuestas en hilo o `typingReaction` si quieres progreso visible allí.
|
||||
- Las cargas de medios y las que no son de texto vuelven a la entrega normal.
|
||||
- Si el streaming falla a mitad de una respuesta, OpenClaw vuelve a la entrega normal para las cargas restantes.
|
||||
|
||||
Usa la vista previa de borrador en lugar del streaming de texto nativo de Slack:
|
||||
Usa la vista previa de borrador en lugar del streaming nativo de texto de Slack:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -768,12 +769,12 @@ Usa la vista previa de borrador en lugar del streaming de texto nativo de Slack:
|
||||
Claves heredadas:
|
||||
|
||||
- `channels.slack.streamMode` (`replace | status_final | append`) se migra automáticamente a `channels.slack.streaming.mode`.
|
||||
- el booleano `channels.slack.streaming` se migra automáticamente a `channels.slack.streaming.mode` y `channels.slack.streaming.nativeTransport`.
|
||||
- el valor heredado `channels.slack.nativeStreaming` se migra automáticamente a `channels.slack.streaming.nativeTransport`.
|
||||
- el valor booleano `channels.slack.streaming` se migra automáticamente a `channels.slack.streaming.mode` y `channels.slack.streaming.nativeTransport`.
|
||||
- `channels.slack.nativeStreaming`, heredada, se migra automáticamente a `channels.slack.streaming.nativeTransport`.
|
||||
|
||||
## Alternativa con reacción de escritura
|
||||
## Respaldo con reacción de escritura
|
||||
|
||||
`typingReaction` agrega una reacción temporal al mensaje entrante de Slack mientras OpenClaw procesa una respuesta y luego la elimina cuando termina la ejecución. Esto es especialmente útil fuera de las respuestas en hilo, que usan un indicador de estado predeterminado de "está escribiendo...".
|
||||
`typingReaction` agrega una reacción temporal al mensaje entrante de Slack mientras OpenClaw procesa una respuesta y luego la elimina cuando finaliza la ejecución. Esto es más útil fuera de las respuestas en hilo, que usan un indicador de estado predeterminado de "is typing...".
|
||||
|
||||
Orden de resolución:
|
||||
|
||||
@ -783,39 +784,39 @@ Orden de resolución:
|
||||
Notas:
|
||||
|
||||
- Slack espera códigos cortos (por ejemplo, `"hourglass_flowing_sand"`).
|
||||
- La reacción se aplica según el mejor esfuerzo y la limpieza se intenta automáticamente tras completarse la respuesta o la ruta de error.
|
||||
- La reacción es de mejor esfuerzo y se intenta limpiarla automáticamente después de que se complete la respuesta o la ruta de error.
|
||||
|
||||
## Medios, fragmentación y entrega
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Archivos adjuntos entrantes">
|
||||
Los archivos adjuntos de Slack se descargan desde URL privadas alojadas en Slack (flujo de solicitudes autenticadas con token) y se escriben en el almacén de medios cuando la recuperación se realiza correctamente y los límites de tamaño lo permiten.
|
||||
Los archivos adjuntos de Slack se descargan desde URL privadas alojadas por Slack (flujo de solicitud autenticada por token) y se escriben en el almacén de medios cuando la obtención se realiza correctamente y los límites de tamaño lo permiten.
|
||||
|
||||
El límite de tamaño entrante en tiempo de ejecución usa por defecto `20MB`, salvo que `channels.slack.mediaMaxMb` lo sustituya.
|
||||
El límite de tamaño entrante en tiempo de ejecución es `20MB` de forma predeterminada, salvo que se reemplace con `channels.slack.mediaMaxMb`.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Texto y archivos salientes">
|
||||
- los fragmentos de texto usan `channels.slack.textChunkLimit` (predeterminado: 4000)
|
||||
- los fragmentos de texto usan `channels.slack.textChunkLimit` (predeterminado 4000)
|
||||
- `channels.slack.chunkMode="newline"` habilita la división priorizando párrafos
|
||||
- los envíos de archivos usan las API de carga de Slack y pueden incluir respuestas en hilo (`thread_ts`)
|
||||
- el límite de medios salientes sigue `channels.slack.mediaMaxMb` cuando está configurado; de lo contrario, los envíos del canal usan los valores predeterminados por tipo MIME de la canalización de medios
|
||||
- el límite de medios salientes sigue `channels.slack.mediaMaxMb` cuando está configurado; de lo contrario, los envíos del canal usan los valores predeterminados por tipo MIME del flujo de medios
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Destinos de entrega">
|
||||
Destinos explícitos preferidos:
|
||||
|
||||
- `user:<id>` para MD
|
||||
- `user:<id>` para mensajes directos
|
||||
- `channel:<id>` para canales
|
||||
|
||||
Los MD de Slack se abren mediante las API de conversaciones de Slack al enviar a destinos de usuario.
|
||||
Los mensajes directos de Slack se abren mediante las API de conversaciones de Slack al enviar a destinos de usuario.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Comandos y comportamiento de slash
|
||||
|
||||
Los comandos slash aparecen en Slack como un único comando configurado o como varios comandos nativos. Configura `channels.slack.slashCommand` para cambiar los valores predeterminados de los comandos:
|
||||
Los comandos slash aparecen en Slack como un único comando configurado o como varios comandos nativos. Configura `channels.slack.slashCommand` para cambiar los valores predeterminados del comando:
|
||||
|
||||
- `enabled: false`
|
||||
- `name: "openclaw"`
|
||||
@ -826,7 +827,7 @@ Los comandos slash aparecen en Slack como un único comando configurado o como v
|
||||
/openclaw /help
|
||||
```
|
||||
|
||||
Los comandos nativos requieren [configuración adicional del manifiesto](#additional-manifest-settings) en tu aplicación de Slack y se habilitan con `channels.slack.commands.native: true` o `commands.native: true` en las configuraciones globales.
|
||||
Los comandos nativos requieren [configuraciones adicionales del manifiesto](#additional-manifest-settings) en tu aplicación de Slack y se habilitan con `channels.slack.commands.native: true` o `commands.native: true` en configuraciones globales.
|
||||
|
||||
- El modo automático de comandos nativos está **desactivado** para Slack, por lo que `commands.native: "auto"` no habilita los comandos nativos de Slack.
|
||||
|
||||
@ -834,18 +835,18 @@ Los comandos nativos requieren [configuración adicional del manifiesto](#additi
|
||||
/help
|
||||
```
|
||||
|
||||
Los menús de argumentos nativos usan una estrategia de renderizado adaptable que muestra un modal de confirmación antes de despachar un valor de opción seleccionado:
|
||||
Los menús de argumentos nativos usan una estrategia de renderizado adaptativa que muestra un modal de confirmación antes de despachar un valor de opción seleccionado:
|
||||
|
||||
- hasta 5 opciones: bloques de botones
|
||||
- de 6 a 100 opciones: menú de selección estática
|
||||
- más de 100 opciones: selección externa con filtrado asíncrono de opciones cuando los controladores de opciones de interactividad están disponibles
|
||||
- si se superan los límites de Slack: los valores de opción codificados vuelven a botones
|
||||
- de 6 a 100 opciones: menú de selección estático
|
||||
- más de 100 opciones: selección externa con filtrado asincrónico de opciones cuando están disponibles los controladores de opciones de interactividad
|
||||
- se excedieron los límites de Slack: los valores de opción codificados vuelven a botones
|
||||
|
||||
```txt
|
||||
/think
|
||||
```
|
||||
|
||||
Las sesiones de slash usan claves aisladas como `agent:<agentId>:slack:slash:<userId>` y aun así enrutan las ejecuciones de comandos a la sesión de conversación de destino usando `CommandTargetSessionKey`.
|
||||
Las sesiones slash usan claves aisladas como `agent:<agentId>:slack:slash:<userId>` y aun así enrutan las ejecuciones de comandos a la sesión de conversación de destino usando `CommandTargetSessionKey`.
|
||||
|
||||
## Respuestas interactivas
|
||||
|
||||
@ -888,39 +889,39 @@ Cuando está habilitada, los agentes pueden emitir directivas de respuesta exclu
|
||||
- `[[slack_buttons: Approve:approve, Reject:reject]]`
|
||||
- `[[slack_select: Choose a target | Canary:canary, Production:production]]`
|
||||
|
||||
Estas directivas se compilan en Slack Block Kit y enrutan clics o selecciones a través de la ruta de eventos de interacción existente de Slack.
|
||||
Estas directivas se compilan en Slack Block Kit y enrutan los clics o selecciones de regreso a través de la ruta existente de eventos de interacción de Slack.
|
||||
|
||||
Notas:
|
||||
|
||||
- Esta es una interfaz específica de Slack. Los demás canales no traducen las directivas de Slack Block Kit a sus propios sistemas de botones.
|
||||
- Los valores de callback interactivos son tokens opacos generados por OpenClaw, no valores sin procesar escritos por el agente.
|
||||
- Si los bloques interactivos generados superan los límites de Slack Block Kit, OpenClaw vuelve a la respuesta de texto original en lugar de enviar una carga útil de bloques no válida.
|
||||
- Esta es una UI específica de Slack. Otros canales no traducen las directivas de Slack Block Kit a sus propios sistemas de botones.
|
||||
- Los valores de devolución de llamada interactiva son tokens opacos generados por OpenClaw, no valores sin procesar creados por el agente.
|
||||
- Si los bloques interactivos generados exceden los límites de Slack Block Kit, OpenClaw vuelve a la respuesta de texto original en lugar de enviar una carga de bloques no válida.
|
||||
|
||||
## Aprobaciones de exec en Slack
|
||||
|
||||
Slack puede actuar como cliente nativo de aprobación con botones interactivos e interacciones, en lugar de recurrir a la interfaz web o al terminal.
|
||||
Slack puede actuar como un cliente nativo de aprobación con botones e interacciones interactivas, en lugar de volver a la Web UI o al terminal.
|
||||
|
||||
- Las aprobaciones de exec usan `channels.slack.execApprovals.*` para el enrutamiento nativo de MD/canales.
|
||||
- Las aprobaciones de Plugin pueden seguir resolviéndose mediante la misma superficie nativa de botones de Slack cuando la solicitud ya llega a Slack y el tipo de ID de aprobación es `plugin:`.
|
||||
- La autorización del aprobador sigue aplicándose: solo los usuarios identificados como aprobadores pueden aprobar o denegar solicitudes a través de Slack.
|
||||
- Las aprobaciones de exec usan `channels.slack.execApprovals.*` para el enrutamiento nativo en mensajes directos/canales.
|
||||
- Las aprobaciones de Plugin aún pueden resolverse mediante la misma superficie de botones nativos de Slack cuando la solicitud ya llega a Slack y el tipo de id de aprobación es `plugin:`.
|
||||
- La autorización del aprobador sigue aplicándose: solo los usuarios identificados como aprobadores pueden aprobar o rechazar solicitudes a través de Slack.
|
||||
|
||||
Esto usa la misma superficie compartida de botones de aprobación que otros canales. Cuando `interactivity` está habilitado en la configuración de tu aplicación de Slack, las solicitudes de aprobación se renderizan como botones de Block Kit directamente en la conversación.
|
||||
Cuando esos botones están presentes, son la experiencia principal de aprobación; OpenClaw
|
||||
Cuando esos botones están presentes, son la UX principal de aprobación; OpenClaw
|
||||
solo debe incluir un comando manual `/approve` cuando el resultado de la herramienta indique que las
|
||||
aprobaciones en chat no están disponibles o cuando la aprobación manual sea la única vía.
|
||||
aprobaciones por chat no están disponibles o que la aprobación manual es la única vía.
|
||||
|
||||
Ruta de configuración:
|
||||
|
||||
- `channels.slack.execApprovals.enabled`
|
||||
- `channels.slack.execApprovals.approvers` (opcional; usa `commands.ownerAllowFrom` como alternativa cuando es posible)
|
||||
- `channels.slack.execApprovals.approvers` (opcional; usa como respaldo `commands.ownerAllowFrom` cuando es posible)
|
||||
- `channels.slack.execApprovals.target` (`dm` | `channel` | `both`, predeterminado: `dm`)
|
||||
- `agentFilter`, `sessionFilter`
|
||||
|
||||
Slack habilita automáticamente las aprobaciones nativas de exec cuando `enabled` no está configurado o es `"auto"` y se resuelve al menos
|
||||
un aprobador. Establece `enabled: false` para desactivar Slack explícitamente como cliente nativo de aprobación.
|
||||
Slack habilita automáticamente las aprobaciones nativas de exec cuando `enabled` no está definido o es `"auto"` y se resuelve al menos un
|
||||
aprobador. Establece `enabled: false` para deshabilitar explícitamente Slack como cliente nativo de aprobación.
|
||||
Establece `enabled: true` para forzar las aprobaciones nativas cuando se resuelvan aprobadores.
|
||||
|
||||
Comportamiento predeterminado sin configuración explícita de aprobación de exec para Slack:
|
||||
Comportamiento predeterminado sin configuración explícita de aprobación de exec en Slack:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -930,8 +931,8 @@ Comportamiento predeterminado sin configuración explícita de aprobación de ex
|
||||
}
|
||||
```
|
||||
|
||||
La configuración nativa explícita de Slack solo es necesaria cuando quieres sustituir aprobadores, agregar filtros u
|
||||
optar por la entrega en el chat de origen:
|
||||
La configuración nativa explícita de Slack solo es necesaria cuando quieres reemplazar aprobadores, agregar filtros u
|
||||
optar por la entrega al chat de origen:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -949,20 +950,20 @@ optar por la entrega en el chat de origen:
|
||||
|
||||
El reenvío compartido `approvals.exec` es independiente. Úsalo solo cuando las solicitudes de aprobación de exec también deban
|
||||
enrutarse a otros chats o a destinos explícitos fuera de banda. El reenvío compartido `approvals.plugin` también es
|
||||
independiente; los botones nativos de Slack pueden seguir resolviendo aprobaciones de Plugin cuando esas solicitudes ya llegan
|
||||
independiente; los botones nativos de Slack aún pueden resolver aprobaciones de Plugin cuando esas solicitudes ya llegan
|
||||
a Slack.
|
||||
|
||||
`/approve` en el mismo chat también funciona en canales y MD de Slack que ya admiten comandos. Consulta [Aprobaciones de exec](/es/tools/exec-approvals) para ver el modelo completo de reenvío de aprobaciones.
|
||||
El comando `/approve` en el mismo chat también funciona en canales y mensajes directos de Slack que ya admiten comandos. Consulta [Aprobaciones de exec](/es/tools/exec-approvals) para ver el modelo completo de reenvío de aprobaciones.
|
||||
|
||||
## Eventos y comportamiento operativo
|
||||
|
||||
- Las ediciones/eliminaciones de mensajes y las difusiones de hilos se asignan a eventos del sistema.
|
||||
- Los eventos de agregar/quitar reacciones se asignan a eventos del sistema.
|
||||
- Los eventos de entrada/salida de miembros, creación/cambio de nombre de canales y agregar/quitar fijaciones se asignan a eventos del sistema.
|
||||
- `channel_id_changed` puede migrar claves de configuración de canales cuando `configWrites` está habilitado.
|
||||
- `channel_id_changed` puede migrar claves de configuración de canal cuando `configWrites` está habilitado.
|
||||
- Los metadatos de tema/propósito del canal se tratan como contexto no confiable y pueden inyectarse en el contexto de enrutamiento.
|
||||
- El iniciador del hilo y la siembra inicial del contexto del historial del hilo se filtran por las listas de remitentes permitidos configuradas, cuando corresponde.
|
||||
- Las acciones de bloque y las interacciones modales emiten eventos del sistema estructurados `Slack interaction: ...` con campos de carga útil enriquecidos:
|
||||
- El iniciador del hilo y la siembra inicial del contexto del historial del hilo se filtran según las listas de permitidos de remitentes configuradas, cuando corresponde.
|
||||
- Las acciones de bloque y las interacciones modales emiten eventos del sistema estructurados `Slack interaction: ...` con campos de carga enriquecidos:
|
||||
- acciones de bloque: valores seleccionados, etiquetas, valores del selector y metadatos `workflow_*`
|
||||
- eventos modales `view_submission` y `view_closed` con metadatos de canal enrutados y entradas de formulario
|
||||
|
||||
@ -974,18 +975,18 @@ Referencia principal:
|
||||
|
||||
Campos de Slack de alta señal:
|
||||
- modo/autenticación: `mode`, `botToken`, `appToken`, `signingSecret`, `webhookPath`, `accounts.*`
|
||||
- acceso a MD: `dm.enabled`, `dmPolicy`, `allowFrom` (heredado: `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels`
|
||||
- interruptor de compatibilidad: `dangerouslyAllowNameMatching` (último recurso; mantenlo desactivado salvo que sea necesario)
|
||||
- acceso a mensajes directos: `dm.enabled`, `dmPolicy`, `allowFrom` (heredado: `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels`
|
||||
- conmutador de compatibilidad: `dangerouslyAllowNameMatching` (solo emergencia; mantenlo desactivado salvo que sea necesario)
|
||||
- acceso a canales: `groupPolicy`, `channels.*`, `channels.*.users`, `channels.*.requireMention`
|
||||
- hilos/historial: `replyToMode`, `replyToModeByChatType`, `thread.*`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
|
||||
- entrega: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `streaming.nativeTransport`
|
||||
- entrega: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `streaming.nativeTransport`, `streaming.preview.toolProgress`
|
||||
- operaciones/funciones: `configWrites`, `commands.native`, `slashCommand.*`, `actions.*`, `userToken`, `userTokenReadOnly`
|
||||
|
||||
## Solución de problemas
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="No hay respuestas en los canales">
|
||||
Comprueba, en este orden:
|
||||
<Accordion title="No hay respuestas en canales">
|
||||
Verifica, en este orden:
|
||||
|
||||
- `groupPolicy`
|
||||
- lista de permitidos de canales (`channels.slack.channels`)
|
||||
@ -1002,8 +1003,8 @@ openclaw doctor
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Se ignoran los mensajes de MD">
|
||||
Comprueba:
|
||||
<Accordion title="Mensajes directos ignorados">
|
||||
Verifica:
|
||||
|
||||
- `channels.slack.dm.enabled`
|
||||
- `channels.slack.dmPolicy` (o el heredado `channels.slack.dm.policy`)
|
||||
@ -1015,8 +1016,8 @@ openclaw pairing list slack
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Socket mode no se conecta">
|
||||
Valida los tokens de bot y app, y que Socket Mode esté habilitado en la configuración de la aplicación de Slack.
|
||||
<Accordion title="El modo socket no se conecta">
|
||||
Valida los tokens de bot + app y la habilitación de Socket Mode en la configuración de la aplicación de Slack.
|
||||
|
||||
Si `openclaw channels status --probe --json` muestra `botTokenStatus` o
|
||||
`appTokenStatus: "configured_unavailable"`, la cuenta de Slack está
|
||||
@ -1029,23 +1030,23 @@ openclaw pairing list slack
|
||||
Valida:
|
||||
|
||||
- signing secret
|
||||
- ruta del webhook
|
||||
- URL de solicitud de Slack (Events + Interactivity + Slash Commands)
|
||||
- ruta del Webhook
|
||||
- URL de solicitud de Slack (Eventos + Interactividad + Comandos Slash)
|
||||
- `webhookPath` único por cuenta HTTP
|
||||
|
||||
Si `signingSecretStatus: "configured_unavailable"` aparece en las
|
||||
instantáneas de cuenta, la cuenta HTTP está configurada, pero el tiempo de ejecución actual no pudo
|
||||
resolver el signing secret respaldado por SecretRef.
|
||||
Si aparece `signingSecretStatus: "configured_unavailable"` en las
|
||||
instantáneas de la cuenta, la cuenta HTTP está configurada, pero el tiempo
|
||||
de ejecución actual no pudo resolver el signing secret respaldado por SecretRef.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Los comandos nativos/slash no se activan">
|
||||
Verifica si querías usar:
|
||||
Verifica qué pretendías:
|
||||
|
||||
- modo de comandos nativos (`channels.slack.commands.native: true`) con los comandos slash correspondientes registrados en Slack
|
||||
- o modo de un único comando slash (`channels.slack.slashCommand.enabled: true`)
|
||||
- o modo de un solo comando slash (`channels.slack.slashCommand.enabled: true`)
|
||||
|
||||
Comprueba también `commands.useAccessGroups` y las listas de permitidos de canal/usuario.
|
||||
Verifica también `commands.useAccessGroups` y las listas de permitidos de canal/usuario.
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
@ -4,41 +4,41 @@ read_when:
|
||||
summary: Estado de compatibilidad, capacidades y configuración del bot de Telegram
|
||||
title: Telegram
|
||||
x-i18n:
|
||||
generated_at: "2026-04-21T05:12:47Z"
|
||||
generated_at: "2026-04-21T17:45:39Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: b5c70775b55d4923a31ad8bae7f4c6e7cbae754c05c3a578180d63db2b59e39a
|
||||
source_hash: 816238b53942b319a300843db62ec1d4bf8d84bc11094010926ac9ad457c6d3d
|
||||
source_path: channels/telegram.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Telegram (API de Bot)
|
||||
# Telegram (API de bots)
|
||||
|
||||
Estado: listo para producción para MD de bots + grupos mediante grammY. El sondeo largo es el modo predeterminado; el modo Webhook es opcional.
|
||||
Estado: listo para producción para mensajes directos del bot + grupos mediante grammY. El sondeo largo es el modo predeterminado; el modo Webhook es opcional.
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card title="Vinculación" icon="link" href="/es/channels/pairing">
|
||||
La política predeterminada de MD para Telegram es la vinculación.
|
||||
La política predeterminada de mensajes directos para Telegram es la vinculación.
|
||||
</Card>
|
||||
<Card title="Solución de problemas del canal" icon="wrench" href="/es/channels/troubleshooting">
|
||||
Diagnósticos multicanal y guías de reparación.
|
||||
Diagnósticos entre canales y guías de reparación.
|
||||
</Card>
|
||||
<Card title="Configuración del Gateway" icon="settings" href="/es/gateway/configuration">
|
||||
Patrones completos de configuración del canal y ejemplos.
|
||||
Patrones y ejemplos completos de configuración de canales.
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## Configuración rápida
|
||||
|
||||
<Steps>
|
||||
<Step title="Crea el token del bot en BotFather">
|
||||
<Step title="Crear el token del bot en BotFather">
|
||||
Abre Telegram y chatea con **@BotFather** (confirma que el identificador sea exactamente `@BotFather`).
|
||||
|
||||
Ejecuta `/newbot`, sigue las indicaciones y guarda el token.
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="Configura el token y la política de MD">
|
||||
<Step title="Configurar el token y la política de mensajes directos">
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -54,11 +54,11 @@ Estado: listo para producción para MD de bots + grupos mediante grammY. El sond
|
||||
```
|
||||
|
||||
Respaldo por variable de entorno: `TELEGRAM_BOT_TOKEN=...` (solo cuenta predeterminada).
|
||||
Telegram **no** usa `openclaw channels login telegram`; configura el token en config/env y luego inicia el Gateway.
|
||||
Telegram **no** usa `openclaw channels login telegram`; configura el token en la configuración o en el entorno y luego inicia el gateway.
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="Inicia el Gateway y aprueba el primer MD">
|
||||
<Step title="Iniciar el gateway y aprobar el primer mensaje directo">
|
||||
|
||||
```bash
|
||||
openclaw gateway
|
||||
@ -70,16 +70,16 @@ openclaw pairing approve telegram <CODE>
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="Agrega el bot a un grupo">
|
||||
Agrega el bot a tu grupo y luego configura `channels.telegram.groups` y `groupPolicy` para que coincidan con tu modelo de acceso.
|
||||
<Step title="Añadir el bot a un grupo">
|
||||
Añade el bot a tu grupo y luego configura `channels.telegram.groups` y `groupPolicy` para que coincidan con tu modelo de acceso.
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
<Note>
|
||||
El orden de resolución del token tiene en cuenta la cuenta. En la práctica, los valores de config prevalecen sobre el respaldo por variable de entorno, y `TELEGRAM_BOT_TOKEN` solo se aplica a la cuenta predeterminada.
|
||||
El orden de resolución del token tiene en cuenta la cuenta. En la práctica, los valores de configuración prevalecen sobre el respaldo por entorno, y `TELEGRAM_BOT_TOKEN` solo se aplica a la cuenta predeterminada.
|
||||
</Note>
|
||||
|
||||
## Configuración del lado de Telegram
|
||||
## Ajustes del lado de Telegram
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Modo de privacidad y visibilidad en grupos">
|
||||
@ -87,14 +87,14 @@ El orden de resolución del token tiene en cuenta la cuenta. En la práctica, lo
|
||||
|
||||
Si el bot debe ver todos los mensajes del grupo, haz una de estas dos cosas:
|
||||
|
||||
- desactiva el modo de privacidad con `/setprivacy`, o
|
||||
- desactiva el modo de privacidad mediante `/setprivacy`, o
|
||||
- convierte al bot en administrador del grupo.
|
||||
|
||||
Al cambiar el modo de privacidad, elimina y vuelve a agregar el bot en cada grupo para que Telegram aplique el cambio.
|
||||
Al cambiar el modo de privacidad, quita y vuelve a añadir el bot en cada grupo para que Telegram aplique el cambio.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Permisos del grupo">
|
||||
<Accordion title="Permisos de grupo">
|
||||
El estado de administrador se controla en la configuración del grupo de Telegram.
|
||||
|
||||
Los bots administradores reciben todos los mensajes del grupo, lo que resulta útil para un comportamiento de grupo siempre activo.
|
||||
@ -103,7 +103,7 @@ El orden de resolución del token tiene en cuenta la cuenta. En la práctica, lo
|
||||
|
||||
<Accordion title="Opciones útiles de BotFather">
|
||||
|
||||
- `/setjoingroups` para permitir o denegar que se agregue a grupos
|
||||
- `/setjoingroups` para permitir o denegar que se añada a grupos
|
||||
- `/setprivacy` para el comportamiento de visibilidad en grupos
|
||||
|
||||
</Accordion>
|
||||
@ -112,7 +112,7 @@ El orden de resolución del token tiene en cuenta la cuenta. En la práctica, lo
|
||||
## Control de acceso y activación
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Política de MD">
|
||||
<Tab title="Política de mensajes directos">
|
||||
`channels.telegram.dmPolicy` controla el acceso a mensajes directos:
|
||||
|
||||
- `pairing` (predeterminado)
|
||||
@ -120,27 +120,27 @@ El orden de resolución del token tiene en cuenta la cuenta. En la práctica, lo
|
||||
- `open` (requiere que `allowFrom` incluya `"*"`)
|
||||
- `disabled`
|
||||
|
||||
`channels.telegram.allowFrom` acepta IDs numéricos de usuarios de Telegram. Se aceptan los prefijos `telegram:` / `tg:` y se normalizan.
|
||||
`dmPolicy: "allowlist"` con `allowFrom` vacío bloquea todos los MD y la validación de configuración lo rechaza.
|
||||
La configuración solicita solo IDs numéricos de usuario.
|
||||
`channels.telegram.allowFrom` acepta ID numéricos de usuarios de Telegram. Se aceptan y normalizan los prefijos `telegram:` / `tg:`.
|
||||
`dmPolicy: "allowlist"` con `allowFrom` vacío bloquea todos los mensajes directos y la validación de configuración lo rechaza.
|
||||
La configuración solicita solo ID numéricos de usuario.
|
||||
Si actualizaste y tu configuración contiene entradas `@username` en la lista de permitidos, ejecuta `openclaw doctor --fix` para resolverlas (mejor esfuerzo; requiere un token de bot de Telegram).
|
||||
Si antes dependías de archivos de lista de permitidos del almacén de vinculación, `openclaw doctor --fix` puede recuperar entradas en `channels.telegram.allowFrom` en flujos de lista de permitidos (por ejemplo, cuando `dmPolicy: "allowlist"` aún no tiene IDs explícitos).
|
||||
Si antes dependías de archivos de lista de permitidos del almacén de vinculación, `openclaw doctor --fix` puede recuperar entradas en `channels.telegram.allowFrom` en flujos de lista de permitidos (por ejemplo, cuando `dmPolicy: "allowlist"` aún no tiene ID explícitos).
|
||||
|
||||
Para bots de un solo propietario, prefiere `dmPolicy: "allowlist"` con IDs numéricos explícitos en `allowFrom` para mantener una política de acceso duradera en la configuración (en lugar de depender de aprobaciones de vinculación anteriores).
|
||||
Para bots con un solo propietario, prefiere `dmPolicy: "allowlist"` con ID numéricos explícitos en `allowFrom` para mantener la política de acceso de forma duradera en la configuración (en lugar de depender de aprobaciones de vinculación anteriores).
|
||||
|
||||
Confusión habitual: aprobar la vinculación de MD no significa “este remitente está autorizado en todas partes”.
|
||||
La vinculación concede acceso solo a MD. La autorización del remitente en grupos sigue viniendo de listas de permitidos explícitas en la configuración.
|
||||
Si quieres “estoy autorizado una vez y funcionan tanto los MD como los comandos de grupo”, coloca tu ID numérico de usuario de Telegram en `channels.telegram.allowFrom`.
|
||||
Confusión habitual: la aprobación de vinculación para mensajes directos no significa “este remitente está autorizado en todas partes”.
|
||||
La vinculación solo concede acceso por mensaje directo. La autorización del remitente en grupos sigue viniendo de listas de permitidos explícitas en la configuración.
|
||||
Si quieres “quedo autorizado una vez y funcionan tanto los mensajes directos como los comandos de grupo”, pon tu ID numérico de usuario de Telegram en `channels.telegram.allowFrom`.
|
||||
|
||||
### Cómo encontrar tu ID de usuario de Telegram
|
||||
|
||||
Más seguro (sin bot de terceros):
|
||||
|
||||
1. Envía un MD a tu bot.
|
||||
1. Envía un mensaje directo a tu bot.
|
||||
2. Ejecuta `openclaw logs --follow`.
|
||||
3. Lee `from.id`.
|
||||
|
||||
Método oficial de la API de Bot:
|
||||
Método oficial de la API de bots:
|
||||
|
||||
```bash
|
||||
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
@ -154,25 +154,25 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
Se aplican juntos dos controles:
|
||||
|
||||
1. **Qué grupos están permitidos** (`channels.telegram.groups`)
|
||||
- sin configuración `groups`:
|
||||
- con `groupPolicy: "open"`: cualquier grupo puede pasar las comprobaciones de ID de grupo
|
||||
- con `groupPolicy: "allowlist"` (predeterminada): los grupos se bloquean hasta que agregues entradas en `groups` (o `"*"`)
|
||||
- `groups` configurado: actúa como lista de permitidos (IDs explícitos o `"*"`)
|
||||
- sin configuración de `groups`:
|
||||
- con `groupPolicy: "open"`: cualquier grupo puede superar las comprobaciones de ID de grupo
|
||||
- con `groupPolicy: "allowlist"` (predeterminado): los grupos se bloquean hasta que añadas entradas en `groups` (o `"*"`)
|
||||
- `groups` configurado: actúa como lista de permitidos (ID explícitos o `"*"`)
|
||||
|
||||
2. **Qué remitentes están permitidos en grupos** (`channels.telegram.groupPolicy`)
|
||||
- `open`
|
||||
- `allowlist` (predeterminada)
|
||||
- `allowlist` (predeterminado)
|
||||
- `disabled`
|
||||
|
||||
`groupAllowFrom` se usa para filtrar remitentes de grupo. Si no se establece, Telegram usa `allowFrom` como respaldo.
|
||||
Las entradas de `groupAllowFrom` deben ser IDs numéricos de usuarios de Telegram (los prefijos `telegram:` / `tg:` se normalizan).
|
||||
No pongas IDs de chat de grupo o supergrupo de Telegram en `groupAllowFrom`. Los IDs de chat negativos van en `channels.telegram.groups`.
|
||||
`groupAllowFrom` se usa para filtrar remitentes en grupos. Si no está configurado, Telegram recurre a `allowFrom`.
|
||||
Las entradas de `groupAllowFrom` deben ser ID numéricos de usuarios de Telegram (los prefijos `telegram:` / `tg:` se normalizan).
|
||||
No pongas ID de chat de grupo o supergrupo de Telegram en `groupAllowFrom`. Los ID de chat negativos van en `channels.telegram.groups`.
|
||||
Las entradas no numéricas se ignoran para la autorización del remitente.
|
||||
Límite de seguridad (`2026.2.25+`): la autorización de remitentes en grupos **no** hereda aprobaciones del almacén de vinculación de MD.
|
||||
La vinculación sigue siendo solo para MD. Para grupos, configura `groupAllowFrom` o `allowFrom` por grupo/tema.
|
||||
Si `groupAllowFrom` no está establecido, Telegram usa como respaldo `allowFrom` de config, no el almacén de vinculación.
|
||||
Patrón práctico para bots de un solo propietario: configura tu ID de usuario en `channels.telegram.allowFrom`, deja `groupAllowFrom` sin establecer y permite los grupos objetivo en `channels.telegram.groups`.
|
||||
Nota de ejecución: si `channels.telegram` falta por completo, en ejecución se usa de forma predeterminada `groupPolicy="allowlist"` con cierre por defecto, salvo que `channels.defaults.groupPolicy` esté configurado explícitamente.
|
||||
Límite de seguridad (`2026.2.25+`): la autenticación del remitente en grupos **no** hereda aprobaciones del almacén de vinculación de mensajes directos.
|
||||
La vinculación sigue siendo solo para mensajes directos. Para grupos, configura `groupAllowFrom` o `allowFrom` por grupo o por tema.
|
||||
Si `groupAllowFrom` no está configurado, Telegram recurre a `allowFrom` de la configuración, no al almacén de vinculación.
|
||||
Patrón práctico para bots de un solo propietario: configura tu ID de usuario en `channels.telegram.allowFrom`, deja `groupAllowFrom` sin configurar y permite los grupos objetivo en `channels.telegram.groups`.
|
||||
Nota de tiempo de ejecución: si `channels.telegram` falta por completo, el tiempo de ejecución usa de forma predeterminada un modo de cierre por defecto con `groupPolicy="allowlist"`, a menos que `channels.defaults.groupPolicy` esté configurado explícitamente.
|
||||
|
||||
Ejemplo: permitir a cualquier miembro en un grupo específico:
|
||||
|
||||
@ -211,8 +211,8 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
<Warning>
|
||||
Error habitual: `groupAllowFrom` no es una lista de permitidos de grupos de Telegram.
|
||||
|
||||
- Coloca IDs negativos de grupos o supergrupos de Telegram como `-1001234567890` en `channels.telegram.groups`.
|
||||
- Coloca IDs de usuario de Telegram como `8734062810` en `groupAllowFrom` cuando quieras limitar qué personas dentro de un grupo permitido pueden activar el bot.
|
||||
- Pon los ID negativos de grupo o supergrupo de Telegram, como `-1001234567890`, en `channels.telegram.groups`.
|
||||
- Pon los ID de usuario de Telegram, como `8734062810`, en `groupAllowFrom` cuando quieras limitar qué personas dentro de un grupo permitido pueden activar el bot.
|
||||
- Usa `groupAllowFrom: ["*"]` solo cuando quieras que cualquier miembro de un grupo permitido pueda hablar con el bot.
|
||||
</Warning>
|
||||
|
||||
@ -233,7 +233,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
- `/activation always`
|
||||
- `/activation mention`
|
||||
|
||||
Estas opciones actualizan solo el estado de la sesión. Usa la configuración para persistencia.
|
||||
Estas actualizan solo el estado de la sesión. Usa la configuración para que persistan.
|
||||
|
||||
Ejemplo de configuración persistente:
|
||||
|
||||
@ -253,21 +253,21 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
|
||||
- reenvía un mensaje del grupo a `@userinfobot` / `@getidsbot`
|
||||
- o lee `chat.id` desde `openclaw logs --follow`
|
||||
- o inspecciona `getUpdates` de la API de Bot
|
||||
- o inspecciona `getUpdates` de la API de bots
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Comportamiento en ejecución
|
||||
## Comportamiento en tiempo de ejecución
|
||||
|
||||
- Telegram es propiedad del proceso Gateway.
|
||||
- Telegram pertenece al proceso del Gateway.
|
||||
- El enrutamiento es determinista: las respuestas entrantes de Telegram vuelven a Telegram (el modelo no elige canales).
|
||||
- Los mensajes entrantes se normalizan en el sobre compartido del canal con metadatos de respuesta y marcadores de posición de contenido multimedia.
|
||||
- Las sesiones de grupo están aisladas por ID de grupo. Los temas de foro agregan `:topic:<threadId>` para mantener los temas aislados.
|
||||
- Los mensajes MD pueden incluir `message_thread_id`; OpenClaw los enruta con claves de sesión conscientes del hilo y conserva el ID del hilo para las respuestas.
|
||||
- El sondeo largo usa grammY runner con secuenciación por chat y por hilo. La concurrencia total del sumidero del runner usa `agents.defaults.maxConcurrent`.
|
||||
- Los reinicios del watchdog de sondeo largo se activan después de 120 segundos sin actividad completada de `getUpdates` por defecto. Aumenta `channels.telegram.pollingStallThresholdMs` solo si tu despliegue sigue viendo reinicios falsos por bloqueo de sondeo durante trabajos prolongados. El valor está en milisegundos y se permite de `30000` a `600000`; se admiten anulaciones por cuenta.
|
||||
- La API de Bot de Telegram no admite confirmaciones de lectura (`sendReadReceipts` no se aplica).
|
||||
- Los mensajes entrantes se normalizan en el sobre compartido del canal con metadatos de respuesta y marcadores de posición de medios.
|
||||
- Las sesiones de grupo se aíslan por ID de grupo. Los temas del foro añaden `:topic:<threadId>` para mantener los temas aislados.
|
||||
- Los mensajes directos pueden llevar `message_thread_id`; OpenClaw los enruta con claves de sesión conscientes del hilo y conserva el ID del hilo para las respuestas.
|
||||
- El sondeo largo usa grammY runner con secuenciación por chat y por hilo. La concurrencia total del receptor del runner usa `agents.defaults.maxConcurrent`.
|
||||
- Los reinicios del watchdog de sondeo largo se activan después de 120 segundos sin actividad completada de `getUpdates` por defecto. Aumenta `channels.telegram.pollingStallThresholdMs` solo si tu despliegue sigue viendo reinicios falsos por bloqueo del sondeo durante trabajo de larga duración. El valor está en milisegundos y se permite entre `30000` y `600000`; se admiten anulaciones por cuenta.
|
||||
- La API de bots de Telegram no admite confirmaciones de lectura (`sendReadReceipts` no se aplica).
|
||||
|
||||
## Referencia de funciones
|
||||
|
||||
@ -281,35 +281,36 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
Requisito:
|
||||
|
||||
- `channels.telegram.streaming` es `off | partial | block | progress` (predeterminado: `partial`)
|
||||
- `progress` se asigna a `partial` en Telegram (compatibilidad con la nomenclatura multicanal)
|
||||
- los valores heredados `channels.telegram.streamMode` y booleanos `streaming` se asignan automáticamente
|
||||
- `progress` se asigna a `partial` en Telegram (compatibilidad con el nombre entre canales)
|
||||
- `streaming.preview.toolProgress` controla si las actualizaciones de herramienta/progreso reutilizan el mismo mensaje de vista previa editado (predeterminado: `true`). Configúralo en `false` para mantener mensajes separados de herramienta/progreso.
|
||||
- los valores heredados `channels.telegram.streamMode` y los valores booleanos `streaming` se asignan automáticamente
|
||||
|
||||
Para respuestas solo de texto:
|
||||
|
||||
- MD: OpenClaw mantiene el mismo mensaje de vista previa y realiza una edición final en el lugar (sin segundo mensaje)
|
||||
- grupo/tema: OpenClaw mantiene el mismo mensaje de vista previa y realiza una edición final en el lugar (sin segundo mensaje)
|
||||
- MD: OpenClaw mantiene el mismo mensaje de vista previa y realiza una edición final en el mismo lugar (sin segundo mensaje)
|
||||
- grupo/tema: OpenClaw mantiene el mismo mensaje de vista previa y realiza una edición final en el mismo lugar (sin segundo mensaje)
|
||||
|
||||
Para respuestas complejas (por ejemplo, cargas de contenido multimedia), OpenClaw vuelve al envío final normal y luego limpia el mensaje de vista previa.
|
||||
Para respuestas complejas (por ejemplo, cargas de medios), OpenClaw vuelve a la entrega final normal y luego limpia el mensaje de vista previa.
|
||||
|
||||
La transmisión de vista previa es independiente de la transmisión por bloques. Cuando la transmisión por bloques está habilitada explícitamente para Telegram, OpenClaw omite la transmisión de vista previa para evitar una doble transmisión.
|
||||
|
||||
Si el transporte nativo de borrador no está disponible o es rechazado, OpenClaw vuelve automáticamente a `sendMessage` + `editMessageText`.
|
||||
Si el transporte nativo de borrador no está disponible o es rechazado, OpenClaw recurre automáticamente a `sendMessage` + `editMessageText`.
|
||||
|
||||
Flujo de razonamiento solo para Telegram:
|
||||
|
||||
- `/reasoning stream` envía el razonamiento a la vista previa en vivo mientras se genera
|
||||
- la respuesta final se envía sin el texto de razonamiento
|
||||
- `/reasoning stream` envía el razonamiento a la vista previa en vivo durante la generación
|
||||
- la respuesta final se envía sin texto de razonamiento
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Formato y respaldo HTML">
|
||||
El texto saliente usa Telegram `parse_mode: "HTML"`.
|
||||
El texto saliente usa `parse_mode: "HTML"` de Telegram.
|
||||
|
||||
- El texto tipo Markdown se renderiza como HTML seguro para Telegram.
|
||||
- El HTML bruto del modelo se escapa para reducir fallos de análisis de Telegram.
|
||||
- El HTML sin procesar del modelo se escapa para reducir fallos de análisis de Telegram.
|
||||
- Si Telegram rechaza el HTML analizado, OpenClaw reintenta como texto sin formato.
|
||||
|
||||
Las vistas previas de enlaces están habilitadas de forma predeterminada y se pueden desactivar con `channels.telegram.linkPreview: false`.
|
||||
Las vistas previas de enlaces están habilitadas de forma predeterminada y pueden desactivarse con `channels.telegram.linkPreview: false`.
|
||||
|
||||
</Accordion>
|
||||
|
||||
@ -320,14 +321,14 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
|
||||
- `commands.native: "auto"` habilita comandos nativos para Telegram
|
||||
|
||||
Agrega entradas de menú de comandos personalizadas:
|
||||
Añade entradas personalizadas al menú de comandos:
|
||||
|
||||
```json5
|
||||
{
|
||||
channels: {
|
||||
telegram: {
|
||||
customCommands: [
|
||||
{ command: "backup", description: "Respaldo de Git" },
|
||||
{ command: "backup", description: "Copia de seguridad de Git" },
|
||||
{ command: "generate", description: "Crear una imagen" },
|
||||
],
|
||||
},
|
||||
@ -337,7 +338,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
|
||||
Reglas:
|
||||
|
||||
- los nombres se normalizan (quitar `/` inicial, minúsculas)
|
||||
- los nombres se normalizan (eliminan la `/` inicial, en minúsculas)
|
||||
- patrón válido: `a-z`, `0-9`, `_`, longitud `1..32`
|
||||
- los comandos personalizados no pueden sobrescribir comandos nativos
|
||||
- los conflictos y duplicados se omiten y se registran
|
||||
@ -349,26 +350,26 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
|
||||
Si los comandos nativos están deshabilitados, se eliminan los integrados. Los comandos personalizados/de Plugin aún pueden registrarse si están configurados.
|
||||
|
||||
Fallos habituales de configuración:
|
||||
Errores habituales de configuración:
|
||||
|
||||
- `setMyCommands failed` con `BOT_COMMANDS_TOO_MUCH` significa que el menú de Telegram siguió desbordado después de recortarlo; reduce los comandos de Plugin/Skills/personalizados o desactiva `channels.telegram.commands.native`.
|
||||
- `setMyCommands failed` con `BOT_COMMANDS_TOO_MUCH` significa que el menú de Telegram siguió desbordándose después del recorte; reduce los comandos personalizados/de Plugin/de Skills o desactiva `channels.telegram.commands.native`.
|
||||
- `setMyCommands failed` con errores de red/fetch normalmente significa que el DNS/HTTPS saliente hacia `api.telegram.org` está bloqueado.
|
||||
|
||||
### Comandos de vinculación de dispositivos (Plugin `device-pair`)
|
||||
### Comandos de vinculación de dispositivo (Plugin `device-pair`)
|
||||
|
||||
Cuando el Plugin `device-pair` está instalado:
|
||||
|
||||
1. `/pair` genera un código de configuración
|
||||
2. pega el código en la app de iOS
|
||||
3. `/pair pending` enumera las solicitudes pendientes (incluidos rol/alcances)
|
||||
3. `/pair pending` muestra las solicitudes pendientes (incluidos rol/scopes)
|
||||
4. aprueba la solicitud:
|
||||
- `/pair approve <requestId>` para aprobación explícita
|
||||
- `/pair approve` cuando solo hay una solicitud pendiente
|
||||
- `/pair approve latest` para la más reciente
|
||||
|
||||
El código de configuración contiene un token bootstrap de corta duración. La transferencia bootstrap integrada mantiene el token del Node principal en `scopes: []`; cualquier token de operador transferido permanece limitado a `operator.approvals`, `operator.read`, `operator.talk.secrets` y `operator.write`. Las comprobaciones de alcance bootstrap usan prefijos por rol, por lo que esa lista de permitidos de operador solo satisface solicitudes de operador; los roles que no sean de operador siguen necesitando alcances bajo el prefijo de su propio rol.
|
||||
El código de configuración lleva un token bootstrap de corta duración. La transferencia bootstrap integrada mantiene el token del nodo principal en `scopes: []`; cualquier token de operador transferido sigue limitado a `operator.approvals`, `operator.read`, `operator.talk.secrets` y `operator.write`. Las comprobaciones de scope bootstrap llevan prefijo de rol, por lo que esa lista de permitidos de operador solo satisface solicitudes de operador; los roles que no son de operador siguen necesitando scopes bajo su propio prefijo de rol.
|
||||
|
||||
Si un dispositivo reintenta con detalles de autenticación cambiados (por ejemplo, rol/alcances/clave pública), la solicitud pendiente anterior queda reemplazada y la nueva solicitud usa un `requestId` diferente. Vuelve a ejecutar `/pair pending` antes de aprobar.
|
||||
Si un dispositivo vuelve a intentar con detalles de autenticación cambiados (por ejemplo rol/scopes/clave pública), la solicitud pendiente anterior queda reemplazada y la nueva solicitud usa un `requestId` diferente. Vuelve a ejecutar `/pair pending` antes de aprobar.
|
||||
|
||||
Más detalles: [Vinculación](/es/channels/pairing#pair-via-telegram-recommended-for-ios).
|
||||
|
||||
@ -424,7 +425,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
action: "send",
|
||||
channel: "telegram",
|
||||
to: "123456789",
|
||||
message: "Elige una opción:",
|
||||
message: "Choose an option:",
|
||||
buttons: [
|
||||
[
|
||||
{ text: "Yes", callback_data: "yes" },
|
||||
@ -435,13 +436,13 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
}
|
||||
```
|
||||
|
||||
Los clics de devolución de llamada se pasan al agente como texto:
|
||||
Los clics en callbacks se pasan al agente como texto:
|
||||
`callback_data: <value>`
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Acciones de mensajes de Telegram para agentes y automatización">
|
||||
Las acciones de herramienta de Telegram incluyen:
|
||||
Las acciones de herramientas de Telegram incluyen:
|
||||
|
||||
- `sendMessage` (`to`, `content`, opcional `mediaUrl`, `replyToMessageId`, `messageThreadId`)
|
||||
- `react` (`chatId`, `messageId`, `emoji`)
|
||||
@ -451,7 +452,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
|
||||
Las acciones de mensajes del canal exponen alias ergonómicos (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`, `topic-create`).
|
||||
|
||||
Controles de restricción:
|
||||
Controles de habilitación:
|
||||
|
||||
- `channels.telegram.actions.sendMessage`
|
||||
- `channels.telegram.actions.deleteMessage`
|
||||
@ -459,7 +460,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
- `channels.telegram.actions.sticker` (predeterminado: deshabilitado)
|
||||
|
||||
Nota: `edit` y `topic-create` están habilitados actualmente de forma predeterminada y no tienen alternancias `channels.telegram.actions.*` separadas.
|
||||
Los envíos en ejecución usan la instantánea activa de config/secrets (inicio/recarga), por lo que las rutas de acción no realizan una nueva resolución ad hoc de SecretRef por envío.
|
||||
Los envíos en tiempo de ejecución usan la instantánea activa de configuración/secretos (inicio/recarga), por lo que las rutas de acción no realizan una nueva resolución ad hoc de SecretRef en cada envío.
|
||||
|
||||
Semántica de eliminación de reacciones: [/tools/reactions](/es/tools/reactions)
|
||||
|
||||
@ -477,15 +478,15 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
- `first`
|
||||
- `all`
|
||||
|
||||
Nota: `off` desactiva el uso implícito de hilos de respuesta. Las etiquetas explícitas `[[reply_to_*]]` siguen respetándose.
|
||||
Nota: `off` deshabilita el hilo implícito de respuesta. Las etiquetas explícitas `[[reply_to_*]]` siguen respetándose.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Temas del foro y comportamiento de hilos">
|
||||
<Accordion title="Temas de foro y comportamiento de hilos">
|
||||
Supergrupos de foro:
|
||||
|
||||
- las claves de sesión de temas agregan `:topic:<threadId>`
|
||||
- las respuestas y el indicador de escritura apuntan al hilo del tema
|
||||
- las claves de sesión del tema añaden `:topic:<threadId>`
|
||||
- las respuestas y la indicación de escritura apuntan al hilo del tema
|
||||
- ruta de configuración del tema:
|
||||
`channels.telegram.groups.<chatId>.topics.<threadId>`
|
||||
|
||||
@ -497,7 +498,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
Herencia de temas: las entradas de tema heredan la configuración del grupo salvo que se sobrescriba (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
|
||||
`agentId` es exclusivo del tema y no se hereda de los valores predeterminados del grupo.
|
||||
|
||||
**Enrutamiento de agente por tema**: cada tema puede enrutar a un agente distinto configurando `agentId` en la configuración del tema. Esto da a cada tema su propio espacio de trabajo, memoria y sesión aislados. Ejemplo:
|
||||
**Enrutamiento de agente por tema**: cada tema puede enrutar a un agente diferente configurando `agentId` en la configuración del tema. Esto da a cada tema su propio espacio de trabajo, memoria y sesión aislados. Ejemplo:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -517,9 +518,9 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
}
|
||||
```
|
||||
|
||||
Luego, cada tema tiene su propia clave de sesión: `agent:zu:telegram:group:-1001234567890:topic:3`
|
||||
Cada tema tiene entonces su propia clave de sesión: `agent:zu:telegram:group:-1001234567890:topic:3`
|
||||
|
||||
**Vinculación persistente de temas ACP**: los temas del foro pueden fijar sesiones del arnés ACP mediante vinculaciones ACP tipadas de nivel superior:
|
||||
**Vinculación persistente de temas ACP**: los temas de foro pueden fijar sesiones de arnés ACP mediante vinculaciones ACP tipadas de nivel superior:
|
||||
|
||||
- `bindings[]` con `type: "acp"` y `match.channel: "telegram"`
|
||||
|
||||
@ -570,13 +571,13 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
}
|
||||
```
|
||||
|
||||
Actualmente, esto se limita a temas de foro en grupos y supergrupos.
|
||||
Actualmente esto se limita a temas de foro en grupos y supergrupos.
|
||||
|
||||
**Creación de ACP vinculado al hilo desde el chat**:
|
||||
|
||||
- `/acp spawn <agent> --thread here|auto` puede vincular el tema actual de Telegram a una nueva sesión ACP.
|
||||
- Los mensajes posteriores del tema se enrutan directamente a la sesión ACP vinculada (no se requiere `/acp steer`).
|
||||
- OpenClaw fija el mensaje de confirmación de creación dentro del tema después de una vinculación correcta.
|
||||
- OpenClaw fija el mensaje de confirmación de creación dentro del tema tras una vinculación correcta.
|
||||
- Requiere `channels.telegram.threadBindings.spawnAcpSessions=true`.
|
||||
|
||||
El contexto de plantilla incluye:
|
||||
@ -584,9 +585,9 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
- `MessageThreadId`
|
||||
- `IsForum`
|
||||
|
||||
Comportamiento de hilos en MD:
|
||||
Comportamiento de hilos en mensajes directos:
|
||||
|
||||
- los chats privados con `message_thread_id` mantienen el enrutamiento de MD, pero usan claves de sesión y destinos de respuesta conscientes del hilo.
|
||||
- los chats privados con `message_thread_id` mantienen el enrutamiento de mensajes directos, pero usan claves de sesión y destinos de respuesta conscientes del hilo.
|
||||
|
||||
</Accordion>
|
||||
|
||||
@ -632,11 +633,11 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
|
||||
Manejo de stickers entrantes:
|
||||
|
||||
- WEBP estático: se descarga y procesa (marcador de posición `<media:sticker>`)
|
||||
- WEBP estático: se descarga y procesa (marcador `<media:sticker>`)
|
||||
- TGS animado: se omite
|
||||
- WEBM de video: se omite
|
||||
|
||||
Campos de contexto de stickers:
|
||||
Campos de contexto de sticker:
|
||||
|
||||
- `Sticker.emoji`
|
||||
- `Sticker.setName`
|
||||
@ -650,7 +651,7 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
|
||||
Los stickers se describen una vez (cuando es posible) y se almacenan en caché para reducir llamadas repetidas de visión.
|
||||
|
||||
Habilitar acciones de stickers:
|
||||
Habilitar acciones de sticker:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -691,9 +692,9 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
<Accordion title="Notificaciones de reacciones">
|
||||
Las reacciones de Telegram llegan como actualizaciones `message_reaction` (separadas de las cargas de mensajes).
|
||||
|
||||
Cuando están habilitadas, OpenClaw pone en cola eventos del sistema como:
|
||||
Cuando está habilitado, OpenClaw pone en cola eventos del sistema como:
|
||||
|
||||
- `Reacción de Telegram añadida: 👍 por Alice (@alice) en el mensaje 42`
|
||||
- `Telegram reaction added: 👍 by Alice (@alice) on msg 42`
|
||||
|
||||
Configuración:
|
||||
|
||||
@ -704,27 +705,27 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
|
||||
- `own` significa solo reacciones de usuarios a mensajes enviados por el bot (mejor esfuerzo mediante caché de mensajes enviados).
|
||||
- Los eventos de reacción siguen respetando los controles de acceso de Telegram (`dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`); los remitentes no autorizados se descartan.
|
||||
- Telegram no proporciona IDs de hilo en las actualizaciones de reacción.
|
||||
- los grupos que no son foros se enrutan a la sesión de chat del grupo
|
||||
- Telegram no proporciona ID de hilo en las actualizaciones de reacciones.
|
||||
- los grupos que no son foros se enrutan a la sesión del chat de grupo
|
||||
- los grupos de foro se enrutan a la sesión del tema general del grupo (`:topic:1`), no al tema exacto de origen
|
||||
|
||||
`allowed_updates` para sondeo/Webhook incluye `message_reaction` automáticamente.
|
||||
`allowed_updates` para polling/Webhook incluye `message_reaction` automáticamente.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Reacciones de acuse">
|
||||
`ackReaction` envía un emoji de acuse mientras OpenClaw procesa un mensaje entrante.
|
||||
`ackReaction` envía un emoji de confirmación mientras OpenClaw procesa un mensaje entrante.
|
||||
|
||||
Orden de resolución:
|
||||
|
||||
- `channels.telegram.accounts.<accountId>.ackReaction`
|
||||
- `channels.telegram.ackReaction`
|
||||
- `messages.ackReaction`
|
||||
- respaldo al emoji de identidad del agente (`agents.list[].identity.emoji`, o `"👀"` en su defecto)
|
||||
- respaldo con emoji de identidad del agente (`agents.list[].identity.emoji`, o "👀" si no hay otro)
|
||||
|
||||
Notas:
|
||||
|
||||
- Telegram espera emoji unicode (por ejemplo, `"👀"`).
|
||||
- Telegram espera emoji Unicode (por ejemplo, "👀").
|
||||
- Usa `""` para desactivar la reacción para un canal o cuenta.
|
||||
|
||||
</Accordion>
|
||||
@ -751,46 +752,46 @@ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Sondeo largo vs Webhook">
|
||||
Predeterminado: sondeo largo.
|
||||
<Accordion title="Long polling frente a Webhook">
|
||||
Predeterminado: long polling.
|
||||
|
||||
Modo Webhook:
|
||||
|
||||
- establecer `channels.telegram.webhookUrl`
|
||||
- establecer `channels.telegram.webhookSecret` (obligatorio cuando se establece la URL de Webhook)
|
||||
- configura `channels.telegram.webhookUrl`
|
||||
- configura `channels.telegram.webhookSecret` (obligatorio cuando se configura la URL de Webhook)
|
||||
- `channels.telegram.webhookPath` opcional (predeterminado `/telegram-webhook`)
|
||||
- `channels.telegram.webhookHost` opcional (predeterminado `127.0.0.1`)
|
||||
- `channels.telegram.webhookPort` opcional (predeterminado `8787`)
|
||||
|
||||
El listener local predeterminado para el modo Webhook se enlaza a `127.0.0.1:8787`.
|
||||
El listener local predeterminado para el modo Webhook se vincula a `127.0.0.1:8787`.
|
||||
|
||||
Si tu endpoint público es distinto, coloca un proxy inverso delante y apunta `webhookUrl` a la URL pública.
|
||||
Configura `webhookHost` (por ejemplo, `0.0.0.0`) cuando intencionalmente necesites ingreso externo.
|
||||
Si tu endpoint público es diferente, coloca un proxy inverso delante y apunta `webhookUrl` a la URL pública.
|
||||
Configura `webhookHost` (por ejemplo `0.0.0.0`) cuando necesites intencionalmente ingreso externo.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Límites, reintentos y destinos de CLI">
|
||||
- `channels.telegram.textChunkLimit` tiene como valor predeterminado 4000.
|
||||
- `channels.telegram.chunkMode="newline"` prioriza los límites de párrafo (líneas en blanco) antes de dividir por longitud.
|
||||
- `channels.telegram.mediaMaxMb` (predeterminado 100) limita el tamaño de contenido multimedia entrante y saliente de Telegram.
|
||||
- `channels.telegram.timeoutSeconds` sobrescribe el tiempo de espera del cliente de API de Telegram (si no se establece, se aplica el valor predeterminado de grammY).
|
||||
- `channels.telegram.pollingStallThresholdMs` tiene como valor predeterminado `120000`; ajústalo entre `30000` y `600000` solo para reinicios falsos positivos por bloqueo del sondeo.
|
||||
- el historial de contexto de grupo usa `channels.telegram.historyLimit` o `messages.groupChat.historyLimit` (predeterminado 50); `0` lo desactiva.
|
||||
- el contexto suplementario de respuesta/cita/reenvío se pasa actualmente tal como se recibe.
|
||||
- las listas de permitidos de Telegram sirven principalmente para controlar quién puede activar el agente, no como un límite completo de redacción del contexto suplementario.
|
||||
- controles de historial de MD:
|
||||
- `channels.telegram.textChunkLimit` tiene un valor predeterminado de 4000.
|
||||
- `channels.telegram.chunkMode="newline"` prefiere límites de párrafo (líneas en blanco) antes de dividir por longitud.
|
||||
- `channels.telegram.mediaMaxMb` (predeterminado 100) limita el tamaño de medios entrantes y salientes de Telegram.
|
||||
- `channels.telegram.timeoutSeconds` sobrescribe el tiempo de espera del cliente de la API de Telegram (si no está configurado, se aplica el valor predeterminado de grammY).
|
||||
- `channels.telegram.pollingStallThresholdMs` tiene como valor predeterminado `120000`; ajústalo entre `30000` y `600000` solo para reinicios falsos positivos por bloqueo del polling.
|
||||
- el historial del contexto de grupo usa `channels.telegram.historyLimit` o `messages.groupChat.historyLimit` (predeterminado 50); `0` lo desactiva.
|
||||
- el contexto suplementario de respuesta/cita/reenvío actualmente se pasa tal como se recibe.
|
||||
- las listas de permitidos de Telegram controlan principalmente quién puede activar el agente, no un límite completo de redacción de contexto suplementario.
|
||||
- controles del historial de mensajes directos:
|
||||
- `channels.telegram.dmHistoryLimit`
|
||||
- `channels.telegram.dms["<user_id>"].historyLimit`
|
||||
- la configuración `channels.telegram.retry` se aplica a los asistentes de envío de Telegram (CLI/tools/actions) para errores recuperables de la API saliente.
|
||||
- la configuración `channels.telegram.retry` se aplica a los helpers de envío de Telegram (CLI/tools/actions) para errores recuperables de la API saliente.
|
||||
|
||||
El destino de envío de CLI puede ser un ID numérico de chat o un nombre de usuario:
|
||||
El destino de envío de la CLI puede ser un ID numérico de chat o un nombre de usuario:
|
||||
|
||||
```bash
|
||||
openclaw message send --channel telegram --target 123456789 --message "hi"
|
||||
openclaw message send --channel telegram --target @name --message "hi"
|
||||
```
|
||||
|
||||
Los sondeos de Telegram usan `openclaw message poll` y admiten temas de foro:
|
||||
Los polls de Telegram usan `openclaw message poll` y admiten temas de foro:
|
||||
|
||||
```bash
|
||||
openclaw message poll --channel telegram --target 123456789 \
|
||||
@ -800,7 +801,7 @@ openclaw message poll --channel telegram --target -1001234567890:topic:42 \
|
||||
--poll-duration-seconds 300 --poll-public
|
||||
```
|
||||
|
||||
Indicadores de sondeo solo para Telegram:
|
||||
Indicadores de poll solo de Telegram:
|
||||
|
||||
- `--poll-duration-seconds` (5-600)
|
||||
- `--poll-anonymous`
|
||||
@ -810,69 +811,69 @@ openclaw message poll --channel telegram --target -1001234567890:topic:42 \
|
||||
El envío de Telegram también admite:
|
||||
|
||||
- `--buttons` para teclados en línea cuando `channels.telegram.capabilities.inlineButtons` lo permite
|
||||
- `--force-document` para enviar imágenes y GIF salientes como documentos en lugar de cargas comprimidas de foto o multimedia animado
|
||||
- `--force-document` para enviar imágenes salientes y GIF como documentos en lugar de cargas comprimidas de foto o medios animados
|
||||
|
||||
Restricción de acciones:
|
||||
Control de habilitación de acciones:
|
||||
|
||||
- `channels.telegram.actions.sendMessage=false` desactiva los mensajes salientes de Telegram, incluidos los sondeos
|
||||
- `channels.telegram.actions.poll=false` desactiva la creación de sondeos de Telegram mientras mantiene habilitados los envíos normales
|
||||
- `channels.telegram.actions.sendMessage=false` desactiva los mensajes salientes de Telegram, incluidos los polls
|
||||
- `channels.telegram.actions.poll=false` desactiva la creación de polls en Telegram y deja habilitados los envíos normales
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Aprobaciones de ejecución en Telegram">
|
||||
Telegram admite aprobaciones de ejecución en los MD de los aprobadores y puede, opcionalmente, publicar solicitudes de aprobación en el chat o tema de origen.
|
||||
<Accordion title="Aprobaciones de exec en Telegram">
|
||||
Telegram admite aprobaciones de exec en los mensajes directos de los aprobadores y, opcionalmente, puede publicar solicitudes de aprobación en el chat o tema de origen.
|
||||
|
||||
Ruta de configuración:
|
||||
|
||||
- `channels.telegram.execApprovals.enabled`
|
||||
- `channels.telegram.execApprovals.approvers` (opcional; usa como respaldo IDs numéricos de propietarios inferidos desde `allowFrom` y `defaultTo` directo cuando es posible)
|
||||
- `channels.telegram.execApprovals.approvers` (opcional; recurre a ID numéricos de propietario inferidos de `allowFrom` y `defaultTo` directo cuando es posible)
|
||||
- `channels.telegram.execApprovals.target` (`dm` | `channel` | `both`, predeterminado: `dm`)
|
||||
- `agentFilter`, `sessionFilter`
|
||||
|
||||
Los aprobadores deben ser IDs numéricos de usuarios de Telegram. Telegram habilita automáticamente las aprobaciones de ejecución nativas cuando `enabled` no está establecido o es `"auto"` y se puede resolver al menos un aprobador, ya sea desde `execApprovals.approvers` o desde la configuración numérica del propietario de la cuenta (`allowFrom` y `defaultTo` de mensajes directos). Establece `enabled: false` para desactivar explícitamente Telegram como cliente de aprobación nativo. En caso contrario, las solicitudes de aprobación recurren a otras rutas de aprobación configuradas o a la política de respaldo de aprobación de ejecución.
|
||||
Los aprobadores deben ser ID numéricos de usuarios de Telegram. Telegram habilita automáticamente las aprobaciones nativas de exec cuando `enabled` no está configurado o es `"auto"` y se puede resolver al menos un aprobador, ya sea desde `execApprovals.approvers` o desde la configuración numérica de propietario de la cuenta (`allowFrom` y `defaultTo` de mensaje directo). Configura `enabled: false` para desactivar explícitamente Telegram como cliente nativo de aprobación. En caso contrario, las solicitudes de aprobación recurren a otras rutas de aprobación configuradas o a la política de respaldo de aprobación de exec.
|
||||
|
||||
Telegram también renderiza los botones de aprobación compartidos usados por otros canales de chat. El adaptador nativo de Telegram principalmente agrega el enrutamiento de MD del aprobador, la distribución en canal/tema y las sugerencias de escritura antes de la entrega.
|
||||
Cuando esos botones están presentes, son la UX principal de aprobación; OpenClaw
|
||||
Telegram también renderiza los botones de aprobación compartidos usados por otros canales de chat. El adaptador nativo de Telegram añade principalmente el enrutamiento a mensajes directos del aprobador, la distribución al canal/tema y las pistas de escritura antes de la entrega.
|
||||
Cuando esos botones están presentes, son la experiencia principal de aprobación; OpenClaw
|
||||
solo debe incluir un comando manual `/approve` cuando el resultado de la herramienta indique
|
||||
que las aprobaciones por chat no están disponibles o que la aprobación manual es la única vía.
|
||||
|
||||
Reglas de entrega:
|
||||
|
||||
- `target: "dm"` envía solicitudes de aprobación solo a los MD de aprobadores resueltos
|
||||
- `target: "dm"` envía solicitudes de aprobación solo a los mensajes directos de aprobadores resueltos
|
||||
- `target: "channel"` envía la solicitud de vuelta al chat/tema de Telegram de origen
|
||||
- `target: "both"` envía a los MD de los aprobadores y al chat/tema de origen
|
||||
- `target: "both"` envía a los mensajes directos de los aprobadores y al chat/tema de origen
|
||||
|
||||
Solo los aprobadores resueltos pueden aprobar o denegar. Los no aprobadores no pueden usar `/approve` ni los botones de aprobación de Telegram.
|
||||
|
||||
Comportamiento de resolución de aprobaciones:
|
||||
Comportamiento de resolución de aprobación:
|
||||
|
||||
- los IDs con prefijo `plugin:` siempre se resuelven mediante aprobaciones de Plugin.
|
||||
- otros IDs primero intentan `exec.approval.resolve`.
|
||||
- si Telegram también está autorizado para aprobaciones de Plugin y el Gateway dice
|
||||
que la aprobación de ejecución es desconocida/caducada, Telegram reintenta una vez mediante
|
||||
- Los ID con prefijo `plugin:` siempre se resuelven mediante aprobaciones de Plugin.
|
||||
- Otros ID prueban primero `exec.approval.resolve`.
|
||||
- Si Telegram también está autorizado para aprobaciones de Plugin y el gateway dice
|
||||
que la aprobación de exec es desconocida o ha caducado, Telegram vuelve a intentar una vez mediante
|
||||
`plugin.approval.resolve`.
|
||||
- las denegaciones/errores reales de aprobación de ejecución no pasan silenciosamente a la resolución
|
||||
- Las denegaciones o errores reales de aprobación de exec no pasan silenciosamente a la resolución
|
||||
de aprobación de Plugin.
|
||||
|
||||
La entrega en canal muestra el texto del comando en el chat, así que habilita `channel` o `both` solo en grupos/temas de confianza. Cuando la solicitud llega a un tema de foro, OpenClaw conserva el tema tanto para la solicitud de aprobación como para el seguimiento posterior a la aprobación. Las aprobaciones de ejecución caducan después de 30 minutos de forma predeterminada.
|
||||
La entrega en el canal muestra el texto del comando en el chat, así que habilita `channel` o `both` solo en grupos/temas de confianza. Cuando la solicitud llega a un tema de foro, OpenClaw conserva el tema tanto para la solicitud de aprobación como para el seguimiento posterior a la aprobación. Las aprobaciones de exec caducan después de 30 minutos de forma predeterminada.
|
||||
|
||||
Los botones de aprobación en línea también dependen de que `channels.telegram.capabilities.inlineButtons` permita la superficie de destino (`dm`, `group` o `all`).
|
||||
|
||||
Documentación relacionada: [Aprobaciones de ejecución](/es/tools/exec-approvals)
|
||||
Documentación relacionada: [Aprobaciones de exec](/es/tools/exec-approvals)
|
||||
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
## Controles de respuesta de errores
|
||||
## Controles de respuesta de error
|
||||
|
||||
Cuando el agente encuentra un error de entrega o del proveedor, Telegram puede responder con el texto del error o suprimirlo. Dos claves de configuración controlan este comportamiento:
|
||||
Cuando el agente encuentra un error de entrega o de proveedor, Telegram puede responder con el texto del error o suprimirlo. Dos claves de configuración controlan este comportamiento:
|
||||
|
||||
| Clave | Valores | Predeterminado | Descripción |
|
||||
| ----------------------------------- | ----------------- | -------------- | --------------------------------------------------------------------------------------------------- |
|
||||
| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` envía un mensaje de error amigable al chat. `silent` suprime por completo las respuestas de error. |
|
||||
| `channels.telegram.errorCooldownMs` | número (ms) | `60000` | Tiempo mínimo entre respuestas de error al mismo chat. Evita el spam de errores durante interrupciones. |
|
||||
| Key | Values | Default | Description |
|
||||
| ----------------------------------- | ----------------- | ------- | ----------------------------------------------------------------------------------------------- |
|
||||
| `channels.telegram.errorPolicy` | `reply`, `silent` | `reply` | `reply` envía un mensaje de error amigable al chat. `silent` suprime por completo las respuestas de error. |
|
||||
| `channels.telegram.errorCooldownMs` | number (ms) | `60000` | Tiempo mínimo entre respuestas de error al mismo chat. Evita spam de errores durante interrupciones. |
|
||||
|
||||
Se admiten anulaciones por cuenta, por grupo y por tema (la misma herencia que otras claves de configuración de Telegram).
|
||||
Se admiten anulaciones por cuenta, por grupo y por tema (misma herencia que otras claves de configuración de Telegram).
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -882,7 +883,7 @@ Se admiten anulaciones por cuenta, por grupo y por tema (la misma herencia que o
|
||||
errorCooldownMs: 120000,
|
||||
groups: {
|
||||
"-1001234567890": {
|
||||
errorPolicy: "silent", // suprimir errores en este grupo
|
||||
errorPolicy: "silent", // suprime errores en este grupo
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -897,18 +898,18 @@ Se admiten anulaciones por cuenta, por grupo y por tema (la misma herencia que o
|
||||
|
||||
- Si `requireMention=false`, el modo de privacidad de Telegram debe permitir visibilidad completa.
|
||||
- BotFather: `/setprivacy` -> Disable
|
||||
- luego elimina y vuelve a agregar el bot al grupo
|
||||
- `openclaw channels status` avisa cuando la configuración espera mensajes de grupo sin mención.
|
||||
- `openclaw channels status --probe` puede comprobar IDs numéricos explícitos de grupo; el comodín `"*"` no permite comprobación de pertenencia.
|
||||
- luego quita y vuelve a añadir el bot al grupo
|
||||
- `openclaw channels status` muestra una advertencia cuando la configuración espera mensajes de grupo sin mención.
|
||||
- `openclaw channels status --probe` puede comprobar ID numéricos explícitos de grupo; el comodín `"*"` no puede comprobarse por pertenencia.
|
||||
- prueba rápida de sesión: `/activation always`.
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="El bot no ve mensajes de grupo en absoluto">
|
||||
|
||||
- cuando existe `channels.telegram.groups`, el grupo debe figurar en la lista (o incluir `"*"`)
|
||||
- cuando existe `channels.telegram.groups`, el grupo debe estar listado (o incluir `"*"`)
|
||||
- verifica que el bot pertenezca al grupo
|
||||
- revisa los registros: `openclaw logs --follow` para ver los motivos de omisión
|
||||
- revisa los logs: `openclaw logs --follow` para ver los motivos de omisión
|
||||
|
||||
</Accordion>
|
||||
|
||||
@ -916,18 +917,18 @@ Se admiten anulaciones por cuenta, por grupo y por tema (la misma herencia que o
|
||||
|
||||
- autoriza tu identidad de remitente (vinculación y/o `allowFrom` numérico)
|
||||
- la autorización de comandos sigue aplicándose incluso cuando la política de grupo es `open`
|
||||
- `setMyCommands failed` con `BOT_COMMANDS_TOO_MUCH` significa que el menú nativo tiene demasiadas entradas; reduce los comandos de Plugin/Skills/personalizados o desactiva los menús nativos
|
||||
- `setMyCommands failed` con `BOT_COMMANDS_TOO_MUCH` significa que el menú nativo tiene demasiadas entradas; reduce los comandos personalizados/de Plugin/de Skills o desactiva los menús nativos
|
||||
- `setMyCommands failed` con errores de red/fetch normalmente indica problemas de alcance DNS/HTTPS hacia `api.telegram.org`
|
||||
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Sondeo o inestabilidad de red">
|
||||
<Accordion title="Inestabilidad de polling o de red">
|
||||
|
||||
- Node 22+ + fetch/proxy personalizado puede activar un comportamiento de cancelación inmediata si los tipos de AbortSignal no coinciden.
|
||||
- Algunos hosts resuelven `api.telegram.org` primero a IPv6; una salida IPv6 defectuosa puede causar fallos intermitentes de la API de Telegram.
|
||||
- Si los registros incluyen `TypeError: fetch failed` o `Network request for 'getUpdates' failed!`, OpenClaw ahora los reintenta como errores de red recuperables.
|
||||
- Si los registros incluyen `Polling stall detected`, OpenClaw reinicia el sondeo y reconstruye el transporte de Telegram después de 120 segundos sin actividad completada de sondeo largo por defecto.
|
||||
- Aumenta `channels.telegram.pollingStallThresholdMs` solo cuando las llamadas `getUpdates` de larga duración son correctas pero tu host sigue reportando reinicios falsos por bloqueo del sondeo. Los bloqueos persistentes suelen indicar problemas de proxy, DNS, IPv6 o salida TLS entre el host y `api.telegram.org`.
|
||||
- Algunos hosts resuelven `api.telegram.org` primero a IPv6; una salida IPv6 defectuosa puede causar fallos intermitentes en la API de Telegram.
|
||||
- Si los logs incluyen `TypeError: fetch failed` o `Network request for 'getUpdates' failed!`, OpenClaw ahora los reintenta como errores de red recuperables.
|
||||
- Si los logs incluyen `Polling stall detected`, OpenClaw reinicia el polling y reconstruye el transporte de Telegram tras 120 segundos sin actividad completada de long polling por defecto.
|
||||
- Aumenta `channels.telegram.pollingStallThresholdMs` solo cuando las llamadas de larga duración a `getUpdates` sean sanas pero tu host siga reportando reinicios falsos por bloqueo del polling. Los bloqueos persistentes normalmente apuntan a problemas de proxy, DNS, IPv6 o salida TLS entre el host y `api.telegram.org`.
|
||||
- En hosts VPS con salida directa/TLS inestable, enruta las llamadas de la API de Telegram mediante `channels.telegram.proxy`:
|
||||
|
||||
```yaml
|
||||
@ -937,7 +938,7 @@ channels:
|
||||
```
|
||||
|
||||
- Node 22+ usa por defecto `autoSelectFamily=true` (excepto WSL2) y `dnsResultOrder=ipv4first`.
|
||||
- Si tu host es WSL2 o explícitamente funciona mejor con comportamiento solo IPv4, fuerza la selección de familia:
|
||||
- Si tu host es WSL2 o funciona claramente mejor con comportamiento solo IPv4, fuerza la selección de familia:
|
||||
|
||||
```yaml
|
||||
channels:
|
||||
@ -947,10 +948,10 @@ channels:
|
||||
```
|
||||
|
||||
- Las respuestas del rango de benchmark RFC 2544 (`198.18.0.0/15`) ya están permitidas
|
||||
de forma predeterminada para descargas de contenido multimedia de Telegram. Si una IP falsa de confianza o un
|
||||
proxy transparente reescribe `api.telegram.org` a alguna otra
|
||||
dirección privada/interna/de uso especial durante las descargas de multimedia, puedes optar
|
||||
por la omisión solo para Telegram:
|
||||
de forma predeterminada para descargas de medios de Telegram. Si una IP falsa de confianza o un
|
||||
proxy transparente reescribe `api.telegram.org` a otra
|
||||
dirección privada/interna/de uso especial durante las descargas de medios, puedes activar
|
||||
la omisión solo para Telegram:
|
||||
|
||||
```yaml
|
||||
channels:
|
||||
@ -959,24 +960,25 @@ channels:
|
||||
dangerouslyAllowPrivateNetwork: true
|
||||
```
|
||||
|
||||
- La misma activación opcional también está disponible por cuenta en
|
||||
- La misma activación opcional está disponible por cuenta en
|
||||
`channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork`.
|
||||
- Si tu proxy resuelve hosts multimedia de Telegram a `198.18.x.x`, deja primero
|
||||
desactivada la opción peligrosa. Telegram multimedia ya permite el rango benchmark RFC 2544
|
||||
- Si tu proxy resuelve hosts de medios de Telegram en `198.18.x.x`, deja primero
|
||||
desactivada la opción peligrosa. Los medios de Telegram ya permiten el rango de benchmark RFC 2544
|
||||
de forma predeterminada.
|
||||
|
||||
<Warning>
|
||||
`channels.telegram.network.dangerouslyAllowPrivateNetwork` debilita las protecciones
|
||||
SSRF de multimedia de Telegram. Úsalo solo en entornos de proxy de confianza controlados por operadores,
|
||||
como enrutamiento fake-IP de Clash, Mihomo o Surge, cuando
|
||||
sintetizan respuestas privadas o de uso especial fuera del rango benchmark RFC 2544. Déjalo desactivado para el acceso normal a Telegram por internet pública.
|
||||
`channels.telegram.network.dangerouslyAllowPrivateNetwork` debilita las protecciones SSRF de medios
|
||||
de Telegram. Úsalo solo para entornos de proxy de confianza controlados por el operador
|
||||
como Clash, Mihomo o enrutamiento fake-IP de Surge cuando
|
||||
sintetizan respuestas privadas o de uso especial fuera del rango
|
||||
de benchmark RFC 2544. Déjalo desactivado para acceso normal de Telegram por internet pública.
|
||||
</Warning>
|
||||
|
||||
- Anulaciones por variable de entorno (temporales):
|
||||
- Anulaciones por entorno (temporales):
|
||||
- `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1`
|
||||
- `OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1`
|
||||
- `OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first`
|
||||
- Valida las respuestas DNS:
|
||||
- Valida respuestas DNS:
|
||||
|
||||
```bash
|
||||
dig +short api.telegram.org A
|
||||
@ -992,80 +994,81 @@ Más ayuda: [Solución de problemas del canal](/es/channels/troubleshooting).
|
||||
|
||||
Referencia principal:
|
||||
|
||||
- `channels.telegram.enabled`: habilita/deshabilita el inicio del canal.
|
||||
- `channels.telegram.enabled`: habilita o deshabilita el inicio del canal.
|
||||
- `channels.telegram.botToken`: token del bot (BotFather).
|
||||
- `channels.telegram.tokenFile`: lee el token desde la ruta de un archivo regular. Los enlaces simbólicos se rechazan.
|
||||
- `channels.telegram.tokenFile`: lee el token desde una ruta de archivo regular. Se rechazan los enlaces simbólicos.
|
||||
- `channels.telegram.dmPolicy`: `pairing | allowlist | open | disabled` (predeterminado: pairing).
|
||||
- `channels.telegram.allowFrom`: lista de permitidos de MD (IDs numéricos de usuarios de Telegram). `allowlist` requiere al menos un ID de remitente. `open` requiere `"*"`. `openclaw doctor --fix` puede resolver entradas heredadas `@username` a IDs y puede recuperar entradas de lista de permitidos desde archivos del almacén de vinculación en flujos de migración de lista de permitidos.
|
||||
- `channels.telegram.actions.poll`: habilita o deshabilita la creación de sondeos de Telegram (predeterminado: habilitado; sigue requiriendo `sendMessage`).
|
||||
- `channels.telegram.defaultTo`: destino predeterminado de Telegram usado por CLI `--deliver` cuando no se proporciona `--reply-to` explícito.
|
||||
- `channels.telegram.allowFrom`: lista de permitidos de mensajes directos (ID numéricos de usuario de Telegram). `allowlist` requiere al menos un ID de remitente. `open` requiere `"*"`. `openclaw doctor --fix` puede resolver entradas heredadas `@username` a ID y puede recuperar entradas de lista de permitidos desde archivos del almacén de vinculación en flujos de migración de listas de permitidos.
|
||||
- `channels.telegram.actions.poll`: habilita o deshabilita la creación de polls de Telegram (predeterminado: habilitado; sigue requiriendo `sendMessage`).
|
||||
- `channels.telegram.defaultTo`: destino predeterminado de Telegram usado por la CLI `--deliver` cuando no se proporciona un `--reply-to` explícito.
|
||||
- `channels.telegram.groupPolicy`: `open | allowlist | disabled` (predeterminado: allowlist).
|
||||
- `channels.telegram.groupAllowFrom`: lista de permitidos de remitentes de grupo (IDs numéricos de usuarios de Telegram). `openclaw doctor --fix` puede resolver entradas heredadas `@username` a IDs. Las entradas no numéricas se ignoran en el momento de la autorización. La autorización de grupo no usa el respaldo del almacén de vinculación de MD (`2026.2.25+`).
|
||||
- `channels.telegram.groupAllowFrom`: lista de permitidos de remitentes en grupos (ID numéricos de usuario de Telegram). `openclaw doctor --fix` puede resolver entradas heredadas `@username` a ID. Las entradas no numéricas se ignoran en el momento de la autenticación. La autenticación de grupo no usa el respaldo del almacén de vinculación de mensajes directos (`2026.2.25+`).
|
||||
- Precedencia de múltiples cuentas:
|
||||
- Cuando se configuran dos o más IDs de cuenta, establece `channels.telegram.defaultAccount` (o incluye `channels.telegram.accounts.default`) para hacer explícito el enrutamiento predeterminado.
|
||||
- Si no se establece ninguno, OpenClaw usa como respaldo el primer ID de cuenta normalizado y `openclaw doctor` muestra una advertencia.
|
||||
- Cuando se configuran dos o más ID de cuenta, establece `channels.telegram.defaultAccount` (o incluye `channels.telegram.accounts.default`) para que el enrutamiento predeterminado sea explícito.
|
||||
- Si no se establece ninguno, OpenClaw recurre al primer ID de cuenta normalizado y `openclaw doctor` muestra una advertencia.
|
||||
- `channels.telegram.accounts.default.allowFrom` y `channels.telegram.accounts.default.groupAllowFrom` se aplican solo a la cuenta `default`.
|
||||
- Las cuentas con nombre heredan `channels.telegram.allowFrom` y `channels.telegram.groupAllowFrom` cuando los valores a nivel de cuenta no están establecidos.
|
||||
- Las cuentas con nombre heredan `channels.telegram.allowFrom` y `channels.telegram.groupAllowFrom` cuando los valores a nivel de cuenta no están configurados.
|
||||
- Las cuentas con nombre no heredan `channels.telegram.accounts.default.allowFrom` / `groupAllowFrom`.
|
||||
- `channels.telegram.groups`: valores predeterminados por grupo + lista de permitidos (usa `"*"` para valores predeterminados globales).
|
||||
- `channels.telegram.groups.<id>.groupPolicy`: anulación por grupo para groupPolicy (`open | allowlist | disabled`).
|
||||
- `channels.telegram.groups.<id>.requireMention`: valor predeterminado de restricción por mención.
|
||||
- `channels.telegram.groups.<id>.skills`: filtro de Skills (omitir = todas las Skills, vacío = ninguna).
|
||||
- `channels.telegram.groups.<id>.allowFrom`: anulación por grupo para la lista de permitidos de remitentes.
|
||||
- `channels.telegram.groups.<id>.requireMention`: valor predeterminado de control por mención.
|
||||
- `channels.telegram.groups.<id>.skills`: filtro de Skills (omitir = todos los Skills, vacío = ninguno).
|
||||
- `channels.telegram.groups.<id>.allowFrom`: anulación por grupo de la lista de permitidos de remitentes.
|
||||
- `channels.telegram.groups.<id>.systemPrompt`: prompt del sistema adicional para el grupo.
|
||||
- `channels.telegram.groups.<id>.enabled`: desactiva el grupo cuando es `false`.
|
||||
- `channels.telegram.groups.<id>.topics.<threadId>.*`: anulaciones por tema (campos de grupo + `agentId` solo para tema).
|
||||
- `channels.telegram.groups.<id>.topics.<threadId>.agentId`: enruta este tema a un agente específico (sobrescribe el enrutamiento a nivel de grupo y por bindings).
|
||||
- `channels.telegram.groups.<id>.enabled`: deshabilita el grupo cuando es `false`.
|
||||
- `channels.telegram.groups.<id>.topics.<threadId>.*`: anulaciones por tema (campos de grupo + `agentId` exclusivo del tema).
|
||||
- `channels.telegram.groups.<id>.topics.<threadId>.agentId`: enruta este tema a un agente específico (sobrescribe el enrutamiento a nivel de grupo y de binding).
|
||||
- `channels.telegram.groups.<id>.topics.<threadId>.groupPolicy`: anulación por tema para groupPolicy (`open | allowlist | disabled`).
|
||||
- `channels.telegram.groups.<id>.topics.<threadId>.requireMention`: anulación por tema de la restricción por mención.
|
||||
- `bindings[]` de nivel superior con `type: "acp"` e ID canónico de tema `chatId:topic:topicId` en `match.peer.id`: campos de vinculación persistente de tema ACP (consulta [Agentes ACP](/es/tools/acp-agents#channel-specific-settings)).
|
||||
- `channels.telegram.direct.<id>.topics.<threadId>.agentId`: enruta temas de MD a un agente específico (mismo comportamiento que los temas de foro).
|
||||
- `channels.telegram.execApprovals.enabled`: habilita Telegram como cliente de aprobación de ejecución basado en chat para esta cuenta.
|
||||
- `channels.telegram.execApprovals.approvers`: IDs de usuarios de Telegram autorizados para aprobar o denegar solicitudes de ejecución. Opcional cuando `channels.telegram.allowFrom` o un `channels.telegram.defaultTo` directo ya identifica al propietario.
|
||||
- `channels.telegram.groups.<id>.topics.<threadId>.requireMention`: anulación por tema del control por mención.
|
||||
- `bindings[]` de nivel superior con `type: "acp"` e ID canónico de tema `chatId:topic:topicId` en `match.peer.id`: campos persistentes de vinculación de temas ACP (consulta [Agentes ACP](/es/tools/acp-agents#channel-specific-settings)).
|
||||
- `channels.telegram.direct.<id>.topics.<threadId>.agentId`: enruta temas de mensajes directos a un agente específico (mismo comportamiento que los temas de foro).
|
||||
- `channels.telegram.execApprovals.enabled`: habilita Telegram como cliente de aprobación de exec basado en chat para esta cuenta.
|
||||
- `channels.telegram.execApprovals.approvers`: ID de usuario de Telegram autorizados para aprobar o denegar solicitudes de exec. Opcional cuando `channels.telegram.allowFrom` o un `channels.telegram.defaultTo` directo ya identifica al propietario.
|
||||
- `channels.telegram.execApprovals.target`: `dm | channel | both` (predeterminado: `dm`). `channel` y `both` conservan el tema de Telegram de origen cuando existe.
|
||||
- `channels.telegram.execApprovals.agentFilter`: filtro opcional de ID de agente para solicitudes de aprobación reenviadas.
|
||||
- `channels.telegram.execApprovals.sessionFilter`: filtro opcional de clave de sesión (subcadena o regex) para solicitudes de aprobación reenviadas.
|
||||
- `channels.telegram.accounts.<account>.execApprovals`: anulación por cuenta para el enrutamiento de aprobación de ejecución de Telegram y la autorización de aprobadores.
|
||||
- `channels.telegram.accounts.<account>.execApprovals`: anulación por cuenta para el enrutamiento de aprobación de exec en Telegram y la autorización del aprobador.
|
||||
- `channels.telegram.capabilities.inlineButtons`: `off | dm | group | all | allowlist` (predeterminado: allowlist).
|
||||
- `channels.telegram.accounts.<account>.capabilities.inlineButtons`: anulación por cuenta.
|
||||
- `channels.telegram.commands.nativeSkills`: habilita/deshabilita los comandos nativos de Skills en Telegram.
|
||||
- `channels.telegram.commands.nativeSkills`: habilita o deshabilita los comandos nativos de Skills en Telegram.
|
||||
- `channels.telegram.replyToMode`: `off | first | all` (predeterminado: `off`).
|
||||
- `channels.telegram.textChunkLimit`: tamaño de fragmento saliente (caracteres).
|
||||
- `channels.telegram.chunkMode`: `length` (predeterminado) o `newline` para dividir en líneas en blanco (límites de párrafo) antes de fragmentar por longitud.
|
||||
- `channels.telegram.linkPreview`: alterna las vistas previas de enlaces para mensajes salientes (predeterminado: true).
|
||||
- `channels.telegram.streaming`: `off | partial | block | progress` (vista previa de transmisión en vivo; predeterminado: `partial`; `progress` se asigna a `partial`; `block` es compatibilidad heredada con el modo de vista previa). La transmisión de vista previa de Telegram usa un único mensaje de vista previa que se edita en el lugar.
|
||||
- `channels.telegram.mediaMaxMb`: límite de contenido multimedia entrante/saliente de Telegram (MB, predeterminado: 100).
|
||||
- `channels.telegram.retry`: política de reintento para asistentes de envío de Telegram (CLI/tools/actions) en errores recuperables de la API saliente (intentos, minDelayMs, maxDelayMs, jitter).
|
||||
- `channels.telegram.network.autoSelectFamily`: sobrescribe Node autoSelectFamily (true=habilitar, false=deshabilitar). Está habilitado por defecto en Node 22+, y en WSL2 está deshabilitado por defecto.
|
||||
- `channels.telegram.network.dnsResultOrder`: sobrescribe el orden de resultados DNS (`ipv4first` o `verbatim`). El valor predeterminado es `ipv4first` en Node 22+.
|
||||
- `channels.telegram.network.dangerouslyAllowPrivateNetwork`: activación peligrosa para entornos de fake-IP o proxy transparente de confianza en los que las descargas multimedia de Telegram resuelven `api.telegram.org` a direcciones privadas/internas/de uso especial fuera del permiso predeterminado del rango benchmark RFC 2544.
|
||||
- `channels.telegram.proxy`: URL de proxy para llamadas a la API de Bot (SOCKS/HTTP).
|
||||
- `channels.telegram.streaming.preview.toolProgress`: reutiliza el mensaje de vista previa en vivo para actualizaciones de herramienta/progreso cuando la transmisión de vista previa está activa (predeterminado: `true`). Configúralo como `false` para mantener mensajes separados de herramienta/progreso.
|
||||
- `channels.telegram.mediaMaxMb`: límite de medios entrantes/salientes de Telegram (MB, predeterminado: 100).
|
||||
- `channels.telegram.retry`: política de reintento para helpers de envío de Telegram (CLI/tools/actions) ante errores recuperables de la API saliente (intentos, minDelayMs, maxDelayMs, jitter).
|
||||
- `channels.telegram.network.autoSelectFamily`: sobrescribe autoSelectFamily de Node (true=habilitar, false=deshabilitar). Predeterminado como habilitado en Node 22+, con WSL2 predeterminado como deshabilitado.
|
||||
- `channels.telegram.network.dnsResultOrder`: sobrescribe el orden de resultados DNS (`ipv4first` o `verbatim`). Predeterminado como `ipv4first` en Node 22+.
|
||||
- `channels.telegram.network.dangerouslyAllowPrivateNetwork`: activación peligrosa para entornos de fake-IP o proxy transparente de confianza donde las descargas de medios de Telegram resuelven `api.telegram.org` a direcciones privadas/internas/de uso especial fuera de la concesión predeterminada del rango benchmark RFC 2544.
|
||||
- `channels.telegram.proxy`: URL de proxy para llamadas a la API de bots (SOCKS/HTTP).
|
||||
- `channels.telegram.webhookUrl`: habilita el modo Webhook (requiere `channels.telegram.webhookSecret`).
|
||||
- `channels.telegram.webhookSecret`: secreto de Webhook (obligatorio cuando se establece webhookUrl).
|
||||
- `channels.telegram.webhookPath`: ruta local de Webhook (predeterminado `/telegram-webhook`).
|
||||
- `channels.telegram.webhookSecret`: secreto de Webhook (obligatorio cuando se configura webhookUrl).
|
||||
- `channels.telegram.webhookPath`: ruta local de Webhook (predeterminada `/telegram-webhook`).
|
||||
- `channels.telegram.webhookHost`: host local de enlace de Webhook (predeterminado `127.0.0.1`).
|
||||
- `channels.telegram.webhookPort`: puerto local de enlace de Webhook (predeterminado `8787`).
|
||||
- `channels.telegram.actions.reactions`: restringe las reacciones de herramientas de Telegram.
|
||||
- `channels.telegram.actions.sendMessage`: restringe los envíos de mensajes de herramientas de Telegram.
|
||||
- `channels.telegram.actions.deleteMessage`: restringe las eliminaciones de mensajes de herramientas de Telegram.
|
||||
- `channels.telegram.actions.sticker`: restringe las acciones de stickers de Telegram — enviar y buscar (predeterminado: false).
|
||||
- `channels.telegram.reactionNotifications`: `off | own | all` — controla qué reacciones activan eventos del sistema (predeterminado: `own` cuando no está establecido).
|
||||
- `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` — controla la capacidad de reacción del agente (predeterminado: `minimal` cuando no está establecido).
|
||||
- `channels.telegram.errorPolicy`: `reply | silent` — controla el comportamiento de respuesta de errores (predeterminado: `reply`). Se admiten anulaciones por cuenta/grupo/tema.
|
||||
- `channels.telegram.errorCooldownMs`: ms mínimos entre respuestas de error al mismo chat (predeterminado: `60000`). Evita el spam de errores durante interrupciones.
|
||||
- `channels.telegram.actions.reactions`: controla las reacciones de herramientas de Telegram.
|
||||
- `channels.telegram.actions.sendMessage`: controla los envíos de mensajes de herramientas de Telegram.
|
||||
- `channels.telegram.actions.deleteMessage`: controla la eliminación de mensajes de herramientas de Telegram.
|
||||
- `channels.telegram.actions.sticker`: controla las acciones de stickers de Telegram — enviar y buscar (predeterminado: false).
|
||||
- `channels.telegram.reactionNotifications`: `off | own | all` — controla qué reacciones activan eventos del sistema (predeterminado: `own` cuando no se configura).
|
||||
- `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` — controla la capacidad de reacción del agente (predeterminado: `minimal` cuando no se configura).
|
||||
- `channels.telegram.errorPolicy`: `reply | silent` — controla el comportamiento de respuesta ante errores (predeterminado: `reply`). Se admiten anulaciones por cuenta/grupo/tema.
|
||||
- `channels.telegram.errorCooldownMs`: ms mínimos entre respuestas de error al mismo chat (predeterminado: `60000`). Evita spam de errores durante interrupciones.
|
||||
|
||||
- [Referencia de configuración - Telegram](/es/gateway/configuration-reference#telegram)
|
||||
|
||||
Campos específicos de Telegram de alta señal:
|
||||
|
||||
- inicio/autenticación: `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` debe apuntar a un archivo regular; los enlaces simbólicos se rechazan)
|
||||
- inicio/autenticación: `enabled`, `botToken`, `tokenFile`, `accounts.*` (`tokenFile` debe apuntar a un archivo regular; se rechazan enlaces simbólicos)
|
||||
- control de acceso: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*`, `bindings[]` de nivel superior (`type: "acp"`)
|
||||
- aprobaciones de ejecución: `execApprovals`, `accounts.*.execApprovals`
|
||||
- comandos/menú: `commands.native`, `commands.nativeSkills`, `customCommands`
|
||||
- aprobaciones de exec: `execApprovals`, `accounts.*.execApprovals`
|
||||
- comando/menú: `commands.native`, `commands.nativeSkills`, `customCommands`
|
||||
- hilos/respuestas: `replyToMode`
|
||||
- transmisión: `streaming` (vista previa), `blockStreaming`
|
||||
- transmisión: `streaming` (vista previa), `streaming.preview.toolProgress`, `blockStreaming`
|
||||
- formato/entrega: `textChunkLimit`, `chunkMode`, `linkPreview`, `responsePrefix`
|
||||
- multimedia/red: `mediaMaxMb`, `timeoutSeconds`, `pollingStallThresholdMs`, `retry`, `network.autoSelectFamily`, `network.dangerouslyAllowPrivateNetwork`, `proxy`
|
||||
- medios/red: `mediaMaxMb`, `timeoutSeconds`, `pollingStallThresholdMs`, `retry`, `network.autoSelectFamily`, `network.dangerouslyAllowPrivateNetwork`, `proxy`
|
||||
- Webhook: `webhookUrl`, `webhookSecret`, `webhookPath`, `webhookHost`
|
||||
- acciones/capacidades: `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker`
|
||||
- reacciones: `reactionNotifications`, `reactionLevel`
|
||||
@ -1078,5 +1081,5 @@ Campos específicos de Telegram de alta señal:
|
||||
- [Grupos](/es/channels/groups)
|
||||
- [Seguridad](/es/gateway/security)
|
||||
- [Enrutamiento de canales](/es/channels/channel-routing)
|
||||
- [Enrutamiento de múltiples agentes](/es/concepts/multi-agent)
|
||||
- [Enrutamiento multiagente](/es/concepts/multi-agent)
|
||||
- [Solución de problemas](/es/channels/troubleshooting)
|
||||
|
||||
@ -1,108 +1,137 @@
|
||||
---
|
||||
read_when:
|
||||
- Ejecutar más de un Gateway en la misma máquina
|
||||
- Necesitas configuración/estado/puertos aislados por Gateway
|
||||
summary: Ejecuta varios Gateways de OpenClaw en un mismo host (aislamiento, puertos y perfiles)
|
||||
title: Varios Gateways
|
||||
- Necesita configuración/estado/puertos aislados por Gateway
|
||||
summary: Ejecutar múltiples Gateways de OpenClaw en un solo host (aislamiento, puertos y perfiles)
|
||||
title: Múltiples Gateways
|
||||
x-i18n:
|
||||
generated_at: "2026-04-05T12:42:09Z"
|
||||
generated_at: "2026-04-21T17:45:43Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 061f204bf56b28c6bd0e2c9aee6c561a8a162ca219060117fea4d3a007f01899
|
||||
source_hash: 8c3fcb921bc6596040e9249467964bd9dcd40ea7c16e958bb378247b0f994a7b
|
||||
source_path: gateway/multiple-gateways.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Varios Gateways (mismo host)
|
||||
# Múltiples Gateways (mismo host)
|
||||
|
||||
La mayoría de las configuraciones deberían usar un solo Gateway porque un único Gateway puede gestionar múltiples conexiones de mensajería y agentes. Si necesitas un aislamiento o redundancia más fuertes (por ejemplo, un bot de rescate), ejecuta Gateways separados con perfiles/puertos aislados.
|
||||
La mayoría de las configuraciones deberían usar un solo Gateway porque un único Gateway puede gestionar múltiples conexiones de mensajería y agentes. Si necesita un aislamiento o redundancia más sólidos (por ejemplo, un bot de rescate), ejecute Gateways separados con perfiles y puertos aislados.
|
||||
|
||||
## Lista de comprobación de aislamiento (obligatoria)
|
||||
## Lista de verificación de aislamiento (obligatoria)
|
||||
|
||||
- `OPENCLAW_CONFIG_PATH` — archivo de configuración por instancia
|
||||
- `OPENCLAW_STATE_DIR` — sesiones, credenciales y cachés por instancia
|
||||
- `agents.defaults.workspace` — raíz del espacio de trabajo por instancia
|
||||
- `agents.defaults.workspace` — raíz de espacio de trabajo por instancia
|
||||
- `gateway.port` (o `--port`) — único por instancia
|
||||
- Los puertos derivados (browser/canvas) no deben solaparse
|
||||
- Los puertos derivados (browser/canvas) no deben superponerse
|
||||
|
||||
Si estos se comparten, tendrás conflictos de configuración y de puertos.
|
||||
Si estos se comparten, tendrá condiciones de carrera en la configuración y conflictos de puertos.
|
||||
|
||||
## Recomendado: perfiles (`--profile`)
|
||||
## Recomendado: use el perfil predeterminado para principal y un perfil con nombre para rescate
|
||||
|
||||
Los perfiles delimitan automáticamente `OPENCLAW_STATE_DIR` + `OPENCLAW_CONFIG_PATH` y añaden un sufijo a los nombres de los servicios.
|
||||
Los perfiles aplican automáticamente alcance a `OPENCLAW_STATE_DIR` + `OPENCLAW_CONFIG_PATH` y agregan sufijos a los nombres de servicio. Para la mayoría de las configuraciones de bot de rescate, mantenga el bot principal en el perfil predeterminado y asigne solo al bot de rescate un perfil con nombre como `rescue`.
|
||||
|
||||
```bash
|
||||
# main
|
||||
openclaw --profile main setup
|
||||
openclaw --profile main gateway --port 18789
|
||||
# principal (perfil predeterminado)
|
||||
openclaw setup
|
||||
openclaw gateway --port 18789
|
||||
|
||||
# rescue
|
||||
# rescate
|
||||
openclaw --profile rescue setup
|
||||
openclaw --profile rescue gateway --port 19001
|
||||
```
|
||||
|
||||
Servicios por perfil:
|
||||
Servicios:
|
||||
|
||||
```bash
|
||||
openclaw --profile main gateway install
|
||||
openclaw gateway install
|
||||
openclaw --profile rescue gateway install
|
||||
```
|
||||
|
||||
Si quiere que ambos Gateways usen perfiles con nombre, eso también funciona, pero no es obligatorio.
|
||||
|
||||
## Guía del bot de rescate
|
||||
|
||||
Ejecuta un segundo Gateway en el mismo host con su propio:
|
||||
Configuración recomendada:
|
||||
|
||||
- perfil/configuración
|
||||
- directorio de estado
|
||||
- espacio de trabajo
|
||||
- puerto base (más puertos derivados)
|
||||
- mantenga el bot principal en el perfil predeterminado
|
||||
- ejecute el bot de rescate con `--profile rescue`
|
||||
- use un bot de Telegram completamente independiente para la cuenta de rescate
|
||||
- mantenga el bot de rescate en un puerto base diferente, como `19001`
|
||||
|
||||
Esto mantiene el bot de rescate aislado del bot principal para que pueda depurar o aplicar cambios de configuración si el bot principal está caído.
|
||||
Esto mantiene el bot de rescate aislado del bot principal para que pueda depurar o aplicar cambios de configuración si el bot principal deja de funcionar. Deje al menos 20 puertos entre los puertos base para que los puertos derivados de browser/canvas/CDP nunca colisionen.
|
||||
|
||||
Espaciado de puertos: deja al menos 20 puertos entre puertos base para que los puertos derivados de browser/canvas/CDP nunca colisionen.
|
||||
### Canal/cuenta de rescate recomendados
|
||||
|
||||
### Cómo instalarlo (bot de rescate)
|
||||
Para la mayoría de las configuraciones, use un bot de Telegram completamente independiente para el perfil de rescate.
|
||||
|
||||
Por qué Telegram:
|
||||
|
||||
- fácil de mantener solo para operadores
|
||||
- token e identidad del bot separados
|
||||
- independiente de la instalación del canal/aplicación del bot principal
|
||||
- ruta de recuperación simple basada en DM cuando el bot principal no funciona
|
||||
|
||||
La parte importante es la independencia total: cuenta de bot separada, credenciales separadas, perfil de OpenClaw separado, espacio de trabajo separado y puerto separado.
|
||||
|
||||
### Flujo de instalación recomendado
|
||||
|
||||
Use esto como configuración predeterminada a menos que tenga una razón de peso para hacer otra cosa:
|
||||
|
||||
```bash
|
||||
# Main bot (existing or fresh, without --profile param)
|
||||
# Runs on port 18789 + Chrome CDC/Canvas/... Ports
|
||||
# Bot principal (perfil predeterminado, puerto 18789)
|
||||
openclaw onboard
|
||||
openclaw gateway install
|
||||
|
||||
# Rescue bot (isolated profile + ports)
|
||||
# Bot de rescate (bot de Telegram separado, perfil separado, puerto 19001)
|
||||
openclaw --profile rescue onboard
|
||||
# Notes:
|
||||
# - workspace name will be postfixed with -rescue per default
|
||||
# - Port should be at least 18789 + 20 Ports,
|
||||
# better choose completely different base port, like 19789,
|
||||
# - rest of the onboarding is the same as normal
|
||||
|
||||
# To install the service (if not happened automatically during setup)
|
||||
openclaw --profile rescue gateway install
|
||||
```
|
||||
|
||||
Durante `openclaw --profile rescue onboard`:
|
||||
|
||||
- use el token del bot de Telegram separado
|
||||
- mantenga el perfil `rescue`
|
||||
- use un puerto base al menos 20 superior al del bot principal
|
||||
- acepte el espacio de trabajo de rescate predeterminado, a menos que ya gestione uno usted mismo
|
||||
|
||||
Si el onboarding ya instaló el servicio de rescate por usted, el `gateway install` final no es necesario.
|
||||
|
||||
### Qué cambia el onboarding
|
||||
|
||||
`openclaw --profile rescue onboard` usa el flujo de onboarding normal, pero escribe todo en un perfil separado.
|
||||
|
||||
En la práctica, eso significa que el bot de rescate obtiene su propio:
|
||||
|
||||
- archivo de configuración
|
||||
- directorio de estado
|
||||
- espacio de trabajo (de forma predeterminada `~/.openclaw/workspace-rescue`)
|
||||
- nombre de servicio administrado
|
||||
|
||||
Por lo demás, las indicaciones son las mismas que en el onboarding normal.
|
||||
|
||||
## Asignación de puertos (derivados)
|
||||
|
||||
Puerto base = `gateway.port` (o `OPENCLAW_GATEWAY_PORT` / `--port`).
|
||||
|
||||
- puerto del servicio de control del navegador = base + 2 (solo loopback)
|
||||
- puerto del servicio de control del browser = base + 2 (solo loopback)
|
||||
- el host de canvas se sirve en el servidor HTTP del Gateway (mismo puerto que `gateway.port`)
|
||||
- Los puertos CDP del perfil del navegador se asignan automáticamente desde `browser.controlPort + 9 .. + 108`
|
||||
- los puertos CDP del perfil de browser se asignan automáticamente desde `browser.controlPort + 9 .. + 108`
|
||||
|
||||
Si sobrescribes cualquiera de estos en la configuración o en variables de entorno, debes mantenerlos únicos por instancia.
|
||||
Si sustituye cualquiera de estos en la configuración o el entorno, debe mantenerlos únicos por instancia.
|
||||
|
||||
## Notas sobre browser/CDP (error habitual)
|
||||
## Notas sobre browser/CDP (error común)
|
||||
|
||||
- **No** fijes `browser.cdpUrl` a los mismos valores en varias instancias.
|
||||
- Cada instancia necesita su propio puerto de control del navegador y su propio rango de CDP (derivado de su puerto de gateway).
|
||||
- Si necesitas puertos CDP explícitos, establece `browser.profiles.<name>.cdpPort` por instancia.
|
||||
- Chrome remoto: usa `browser.profiles.<name>.cdpUrl` (por perfil y por instancia).
|
||||
- **No** fije `browser.cdpUrl` a los mismos valores en múltiples instancias.
|
||||
- Cada instancia necesita su propio puerto de control de browser y rango de CDP (derivado de su puerto de gateway).
|
||||
- Si necesita puertos CDP explícitos, configure `browser.profiles.<name>.cdpPort` por instancia.
|
||||
- Chrome remoto: use `browser.profiles.<name>.cdpUrl` (por perfil, por instancia).
|
||||
|
||||
## Ejemplo manual con variables de entorno
|
||||
|
||||
```bash
|
||||
OPENCLAW_CONFIG_PATH=~/.openclaw/main.json \
|
||||
OPENCLAW_STATE_DIR=~/.openclaw-main \
|
||||
OPENCLAW_STATE_DIR=~/.openclaw \
|
||||
openclaw gateway --port 18789
|
||||
|
||||
OPENCLAW_CONFIG_PATH=~/.openclaw/rescue.json \
|
||||
@ -110,18 +139,18 @@ OPENCLAW_STATE_DIR=~/.openclaw-rescue \
|
||||
openclaw gateway --port 19001
|
||||
```
|
||||
|
||||
## Comprobaciones rápidas
|
||||
## Verificaciones rápidas
|
||||
|
||||
```bash
|
||||
openclaw --profile main gateway status --deep
|
||||
openclaw gateway status --deep
|
||||
openclaw --profile rescue gateway status --deep
|
||||
openclaw --profile rescue gateway probe
|
||||
openclaw --profile main status
|
||||
openclaw status
|
||||
openclaw --profile rescue status
|
||||
openclaw --profile rescue browser status
|
||||
```
|
||||
|
||||
Interpretación:
|
||||
|
||||
- `gateway status --deep` ayuda a detectar servicios obsoletos de launchd/systemd/schtasks de instalaciones anteriores.
|
||||
- El texto de advertencia de `gateway probe`, como `multiple reachable gateways detected`, solo es esperable cuando ejecutas intencionadamente más de un gateway aislado.
|
||||
- `gateway status --deep` ayuda a detectar servicios launchd/systemd/schtasks obsoletos de instalaciones anteriores.
|
||||
- El texto de advertencia de `gateway probe`, como `multiple reachable gateways detected`, es esperable solo cuando ejecuta intencionalmente más de un gateway aislado.
|
||||
|
||||
@ -1,36 +1,36 @@
|
||||
---
|
||||
read_when:
|
||||
- Usar o configurar comandos de chat
|
||||
- Depurar el enrutamiento de comandos o los permisos
|
||||
summary: 'Comandos slash: texto frente a nativo, configuración y comandos compatibles'
|
||||
title: Comandos slash
|
||||
- Uso o configuración de comandos de chat
|
||||
- Depuración del enrutamiento de comandos o de los permisos
|
||||
summary: 'Comandos de barra: texto vs. nativos, configuración y comandos compatibles'
|
||||
title: Comandos de barra
|
||||
x-i18n:
|
||||
generated_at: "2026-04-21T13:38:38Z"
|
||||
generated_at: "2026-04-21T17:45:42Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: d90ddee54af7c05b7fdf486590561084581d750e42cd14674d43bbdc0984df5d
|
||||
source_hash: 26923608329ba2aeece2d4bc8edfa40ae86e03719a9f590f26ff79f57d97521d
|
||||
source_path: tools/slash-commands.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Comandos slash
|
||||
# Comandos de barra
|
||||
|
||||
Los comandos son gestionados por Gateway. La mayoría de los comandos deben enviarse como un mensaje **independiente** que empiece con `/`.
|
||||
Los comandos son gestionados por el Gateway. La mayoría de los comandos deben enviarse como un mensaje **independiente** que comience con `/`.
|
||||
El comando de chat bash solo para host usa `! <cmd>` (con `/bash <cmd>` como alias).
|
||||
|
||||
Hay dos sistemas relacionados:
|
||||
|
||||
- **Comandos**: mensajes independientes `/...`.
|
||||
- **Comandos**: mensajes `/...` independientes.
|
||||
- **Directivas**: `/think`, `/fast`, `/verbose`, `/trace`, `/reasoning`, `/elevated`, `/exec`, `/model`, `/queue`.
|
||||
- Las directivas se eliminan del mensaje antes de que el modelo lo vea.
|
||||
- En mensajes de chat normales (no solo de directivas), se tratan como “sugerencias en línea” y **no** conservan la configuración de la sesión.
|
||||
- En mensajes solo de directivas (el mensaje contiene únicamente directivas), se conservan en la sesión y responden con un acuse.
|
||||
- Las directivas solo se aplican a **remitentes autorizados**. Si `commands.allowFrom` está configurado, es la única
|
||||
lista de permitidos usada; en caso contrario, la autorización proviene de las listas de permitidos/emparejamiento del canal más `commands.useAccessGroups`.
|
||||
- En mensajes de chat normales (no solo de directivas), se tratan como “indicaciones en línea” y **no** conservan la configuración de la sesión.
|
||||
- En mensajes que solo contienen directivas (el mensaje contiene únicamente directivas), se conservan en la sesión y responden con una confirmación.
|
||||
- Las directivas solo se aplican para **remitentes autorizados**. Si `commands.allowFrom` está configurado, es la única
|
||||
lista de permitidos utilizada; de lo contrario, la autorización proviene de las listas de permitidos/emparejamiento del canal más `commands.useAccessGroups`.
|
||||
Los remitentes no autorizados verán las directivas tratadas como texto sin formato.
|
||||
|
||||
También hay algunos **atajos en línea** (solo para remitentes permitidos/autorizados): `/help`, `/commands`, `/status`, `/whoami` (`/id`).
|
||||
Se ejecutan de inmediato, se eliminan antes de que el modelo vea el mensaje y el texto restante sigue por el flujo normal.
|
||||
También hay algunos **atajos en línea** (solo remitentes incluidos en la lista de permitidos/autorizados): `/help`, `/commands`, `/status`, `/whoami` (`/id`).
|
||||
Se ejecutan de inmediato, se eliminan antes de que el modelo vea el mensaje, y el texto restante continúa por el flujo normal.
|
||||
|
||||
## Configuración
|
||||
|
||||
@ -59,92 +59,93 @@ Se ejecutan de inmediato, se eliminan antes de que el modelo vea el mensaje y el
|
||||
}
|
||||
```
|
||||
|
||||
- `commands.text` (predeterminado `true`) habilita el análisis de `/...` en mensajes de chat.
|
||||
- En superficies sin comandos nativos (WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams), los comandos de texto siguen funcionando aunque lo configures en `false`.
|
||||
- `commands.native` (predeterminado `"auto"`) registra comandos nativos.
|
||||
- Automático: activado para Discord/Telegram; desactivado para Slack (hasta que agregues comandos slash); ignorado para proveedores sin compatibilidad nativa.
|
||||
- Configura `channels.discord.commands.native`, `channels.telegram.commands.native` o `channels.slack.commands.native` para sustituirlo por proveedor (booleano o `"auto"`).
|
||||
- `false` borra en el inicio los comandos registrados previamente en Discord/Telegram. Los comandos de Slack se gestionan en la aplicación de Slack y no se eliminan automáticamente.
|
||||
- `commands.nativeSkills` (predeterminado `"auto"`) registra comandos de **Skills** de forma nativa cuando se admite.
|
||||
- Automático: activado para Discord/Telegram; desactivado para Slack (Slack requiere crear un comando slash por cada skill).
|
||||
- Configura `channels.discord.commands.nativeSkills`, `channels.telegram.commands.nativeSkills` o `channels.slack.commands.nativeSkills` para sustituirlo por proveedor (booleano o `"auto"`).
|
||||
- `commands.bash` (predeterminado `false`) habilita `! <cmd>` para ejecutar comandos del shell del host (`/bash <cmd>` es un alias; requiere listas de permitidos `tools.elevated`).
|
||||
- `commands.bashForegroundMs` (predeterminado `2000`) controla cuánto tiempo espera bash antes de pasar al modo en segundo plano (`0` lo envía inmediatamente al segundo plano).
|
||||
- `commands.config` (predeterminado `false`) habilita `/config` (lee/escribe `openclaw.json`).
|
||||
- `commands.mcp` (predeterminado `false`) habilita `/mcp` (lee/escribe la configuración de MCP gestionada por OpenClaw en `mcp.servers`).
|
||||
- `commands.plugins` (predeterminado `false`) habilita `/plugins` (detección/estado de plugins más controles de instalación + habilitación/deshabilitación).
|
||||
- `commands.debug` (predeterminado `false`) habilita `/debug` (sustituciones solo de tiempo de ejecución).
|
||||
- `commands.restart` (predeterminado `true`) habilita `/restart` más las acciones de herramienta de reinicio del gateway.
|
||||
- `commands.ownerAllowFrom` (opcional) establece la lista explícita de permitidos del propietario para superficies de comandos/herramientas solo para propietarios. Esto es independiente de `commands.allowFrom`.
|
||||
- `commands.ownerDisplay` controla cómo aparecen los IDs de propietario en el prompt del sistema: `raw` o `hash`.
|
||||
- `commands.ownerDisplaySecret` configura opcionalmente el secreto HMAC usado cuando `commands.ownerDisplay="hash"`.
|
||||
- `commands.text` (predeterminado: `true`) habilita el análisis de `/...` en mensajes de chat.
|
||||
- En superficies sin comandos nativos (WhatsApp/WebChat/Signal/iMessage/Google Chat/Microsoft Teams), los comandos de texto siguen funcionando incluso si configuras esto como `false`.
|
||||
- `commands.native` (predeterminado: `"auto"`) registra comandos nativos.
|
||||
- Auto: activado para Discord/Telegram; desactivado para Slack (hasta que agregues comandos de barra); ignorado para proveedores sin soporte nativo.
|
||||
- Configura `channels.discord.commands.native`, `channels.telegram.commands.native` o `channels.slack.commands.native` para sobrescribirlo por proveedor (bool o `"auto"`).
|
||||
- `false` borra los comandos registrados previamente en Discord/Telegram al iniciar. Los comandos de Slack se gestionan en la app de Slack y no se eliminan automáticamente.
|
||||
- `commands.nativeSkills` (predeterminado: `"auto"`) registra comandos de **skill** de forma nativa cuando hay soporte.
|
||||
- Auto: activado para Discord/Telegram; desactivado para Slack (Slack requiere crear un comando de barra por skill).
|
||||
- Configura `channels.discord.commands.nativeSkills`, `channels.telegram.commands.nativeSkills` o `channels.slack.commands.nativeSkills` para sobrescribirlo por proveedor (bool o `"auto"`).
|
||||
- `commands.bash` (predeterminado: `false`) habilita `! <cmd>` para ejecutar comandos de shell del host (`/bash <cmd>` es un alias; requiere listas de permitidos `tools.elevated`).
|
||||
- `commands.bashForegroundMs` (predeterminado: `2000`) controla cuánto tiempo espera bash antes de pasar al modo en segundo plano (`0` lo manda al segundo plano de inmediato).
|
||||
- `commands.config` (predeterminado: `false`) habilita `/config` (lee/escribe `openclaw.json`).
|
||||
- `commands.mcp` (predeterminado: `false`) habilita `/mcp` (lee/escribe la configuración de MCP gestionada por OpenClaw en `mcp.servers`).
|
||||
- `commands.plugins` (predeterminado: `false`) habilita `/plugins` (descubrimiento/estado de plugins además de controles de instalación y activación/desactivación).
|
||||
- `commands.debug` (predeterminado: `false`) habilita `/debug` (sobrescrituras solo de tiempo de ejecución).
|
||||
- `commands.restart` (predeterminado: `true`) habilita `/restart` además de las acciones de herramientas de reinicio del gateway.
|
||||
- `commands.ownerAllowFrom` (opcional) establece la lista de permitidos explícita del propietario para superficies de comandos/herramientas solo para el propietario. Es independiente de `commands.allowFrom`.
|
||||
- `commands.ownerDisplay` controla cómo aparecen los id del propietario en el prompt del sistema: `raw` o `hash`.
|
||||
- `commands.ownerDisplaySecret` opcionalmente establece el secreto HMAC usado cuando `commands.ownerDisplay="hash"`.
|
||||
- `commands.allowFrom` (opcional) establece una lista de permitidos por proveedor para la autorización de comandos. Cuando está configurada, es la
|
||||
única fuente de autorización para comandos y directivas (se ignoran las listas de permitidos/emparejamiento del canal y `commands.useAccessGroups`).
|
||||
Usa `"*"` para un valor predeterminado global; las claves específicas del proveedor lo sustituyen.
|
||||
- `commands.useAccessGroups` (predeterminado `true`) aplica listas de permitidos/políticas para comandos cuando `commands.allowFrom` no está configurado.
|
||||
única fuente de autorización para comandos y directivas (las listas de permitidos/emparejamiento del canal y `commands.useAccessGroups`
|
||||
se ignoran). Usa `"*"` como valor global predeterminado; las claves específicas de proveedor lo sobrescriben.
|
||||
- `commands.useAccessGroups` (predeterminado: `true`) aplica listas de permitidos/políticas para comandos cuando `commands.allowFrom` no está configurado.
|
||||
|
||||
## Lista de comandos
|
||||
|
||||
Fuente de verdad actual:
|
||||
|
||||
- los integrados del núcleo provienen de `src/auto-reply/commands-registry.shared.ts`
|
||||
- los comandos dock generados provienen de `src/auto-reply/commands-registry.data.ts`
|
||||
- los comandos de plugins provienen de llamadas `registerCommand()` del plugin
|
||||
- la disponibilidad real en tu gateway sigue dependiendo de los indicadores de configuración, la superficie del canal y los plugins instalados/habilitados
|
||||
- los comandos de dock generados provienen de `src/auto-reply/commands-registry.data.ts`
|
||||
- los comandos de plugins provienen de llamadas a `registerCommand()` del plugin
|
||||
- la disponibilidad real en tu gateway sigue dependiendo de los indicadores de configuración, la superficie del canal y los plugins instalados/activados
|
||||
|
||||
### Comandos integrados del núcleo
|
||||
|
||||
Comandos integrados disponibles hoy:
|
||||
|
||||
- `/new [model]` inicia una nueva sesión; `/reset` es el alias de restablecimiento.
|
||||
- `/new [model]` inicia una nueva sesión; `/reset` es el alias de reinicio.
|
||||
- `/reset soft [message]` mantiene la transcripción actual, elimina los id de sesión reutilizados del backend de CLI y vuelve a ejecutar en su lugar la carga de inicio/del prompt del sistema.
|
||||
- `/compact [instructions]` compacta el contexto de la sesión. Consulta [/concepts/compaction](/es/concepts/compaction).
|
||||
- `/stop` aborta la ejecución actual.
|
||||
- `/session idle <duration|off>` y `/session max-age <duration|off>` administran el vencimiento de la vinculación del hilo.
|
||||
- `/think <level>` establece el nivel de pensamiento. Las opciones provienen del perfil del proveedor del modelo activo; los niveles comunes son `off`, `minimal`, `low`, `medium` y `high`, con niveles personalizados como `xhigh`, `adaptive`, `max` o el binario `on` solo donde se admite. Alias: `/thinking`, `/t`.
|
||||
- `/session idle <duration|off>` y `/session max-age <duration|off>` gestionan el vencimiento de la vinculación del hilo.
|
||||
- `/think <level>` establece el nivel de pensamiento. Las opciones provienen del perfil de proveedor del modelo activo; los niveles habituales son `off`, `minimal`, `low`, `medium` y `high`, con niveles personalizados como `xhigh`, `adaptive`, `max`, o solo binario `on` donde sea compatible. Alias: `/thinking`, `/t`.
|
||||
- `/verbose on|off|full` alterna la salida detallada. Alias: `/v`.
|
||||
- `/trace on|off` alterna la salida de rastreo del plugin para la sesión actual.
|
||||
- `/trace on|off` alterna la salida de rastreo de plugins para la sesión actual.
|
||||
- `/fast [status|on|off]` muestra o establece el modo rápido.
|
||||
- `/reasoning [on|off|stream]` alterna la visibilidad del razonamiento. Alias: `/reason`.
|
||||
- `/elevated [on|off|ask|full]` alterna el modo elevado. Alias: `/elev`.
|
||||
- `/exec host=<auto|sandbox|gateway|node> security=<deny|allowlist|full> ask=<off|on-miss|always> node=<id>` muestra o establece los valores predeterminados de exec.
|
||||
- `/model [name|#|status]` muestra o establece el modelo.
|
||||
- `/models [provider] [page] [limit=<n>|size=<n>|all]` lista proveedores o modelos de un proveedor.
|
||||
- `/queue <mode>` administra el comportamiento de cola (`steer`, `interrupt`, `followup`, `collect`, `steer-backlog`) más opciones como `debounce:2s cap:25 drop:summarize`.
|
||||
- `/models [provider] [page] [limit=<n>|size=<n>|all]` enumera proveedores o modelos de un proveedor.
|
||||
- `/queue <mode>` gestiona el comportamiento de la cola (`steer`, `interrupt`, `followup`, `collect`, `steer-backlog`) además de opciones como `debounce:2s cap:25 drop:summarize`.
|
||||
- `/help` muestra el resumen breve de ayuda.
|
||||
- `/commands` muestra el catálogo de comandos generado.
|
||||
- `/tools [compact|verbose]` muestra lo que el agente actual puede usar ahora mismo.
|
||||
- `/status` muestra el estado en tiempo de ejecución, incluido el uso/cuota del proveedor cuando está disponible.
|
||||
- `/tasks` lista las tareas activas o recientes en segundo plano de la sesión actual.
|
||||
- `/tools [compact|verbose]` muestra lo que el agente actual puede usar en este momento.
|
||||
- `/status` muestra el estado de ejecución, incluido el uso/cuota del proveedor cuando está disponible.
|
||||
- `/tasks` enumera las tareas en segundo plano activas/recientes para la sesión actual.
|
||||
- `/context [list|detail|json]` explica cómo se ensambla el contexto.
|
||||
- `/export-session [path]` exporta la sesión actual a HTML. Alias: `/export`.
|
||||
- `/whoami` muestra tu ID de remitente. Alias: `/id`.
|
||||
- `/whoami` muestra tu id de remitente. Alias: `/id`.
|
||||
- `/skill <name> [input]` ejecuta una skill por nombre.
|
||||
- `/allowlist [list|add|remove] ...` administra entradas de la lista de permitidos. Solo texto.
|
||||
- `/allowlist [list|add|remove] ...` gestiona entradas de la lista de permitidos. Solo texto.
|
||||
- `/approve <id> <decision>` resuelve solicitudes de aprobación de exec.
|
||||
- `/btw <question>` hace una pregunta secundaria sin cambiar el contexto futuro de la sesión. Consulta [/tools/btw](/es/tools/btw).
|
||||
- `/subagents list|kill|log|info|send|steer|spawn` administra ejecuciones de subagentes para la sesión actual.
|
||||
- `/acp spawn|cancel|steer|close|sessions|status|set-mode|set|cwd|permissions|timeout|model|reset-options|doctor|install|help` administra sesiones de ACP y opciones de tiempo de ejecución.
|
||||
- `/btw <question>` hace una pregunta lateral sin cambiar el contexto futuro de la sesión. Consulta [/tools/btw](/es/tools/btw).
|
||||
- `/subagents list|kill|log|info|send|steer|spawn` gestiona ejecuciones de subagentes para la sesión actual.
|
||||
- `/acp spawn|cancel|steer|close|sessions|status|set-mode|set|cwd|permissions|timeout|model|reset-options|doctor|install|help` gestiona sesiones de ACP y opciones de ejecución.
|
||||
- `/focus <target>` vincula el hilo actual de Discord o el tema/conversación de Telegram a un destino de sesión.
|
||||
- `/unfocus` elimina la vinculación actual.
|
||||
- `/agents` lista los agentes vinculados al hilo para la sesión actual.
|
||||
- `/agents` enumera los agentes vinculados al hilo para la sesión actual.
|
||||
- `/kill <id|#|all>` aborta uno o todos los subagentes en ejecución.
|
||||
- `/steer <id|#> <message>` envía instrucciones a un subagente en ejecución. Alias: `/tell`.
|
||||
- `/config show|get|set|unset` lee o escribe `openclaw.json`. Solo propietario. Requiere `commands.config: true`.
|
||||
- `/mcp show|get|set|unset` lee o escribe la configuración del servidor MCP gestionada por OpenClaw en `mcp.servers`. Solo propietario. Requiere `commands.mcp: true`.
|
||||
- `/plugins list|inspect|show|get|install|enable|disable` inspecciona o muta el estado de plugins. `/plugin` es un alias. Solo propietario para escrituras. Requiere `commands.plugins: true`.
|
||||
- `/debug show|set|unset|reset` administra sustituciones de configuración solo de tiempo de ejecución. Solo propietario. Requiere `commands.debug: true`.
|
||||
- `/steer <id|#> <message>` envía dirección a un subagente en ejecución. Alias: `/tell`.
|
||||
- `/config show|get|set|unset` lee o escribe `openclaw.json`. Solo para el propietario. Requiere `commands.config: true`.
|
||||
- `/mcp show|get|set|unset` lee o escribe la configuración del servidor MCP gestionada por OpenClaw en `mcp.servers`. Solo para el propietario. Requiere `commands.mcp: true`.
|
||||
- `/plugins list|inspect|show|get|install|enable|disable` inspecciona o modifica el estado de plugins. `/plugin` es un alias. Solo para el propietario en operaciones de escritura. Requiere `commands.plugins: true`.
|
||||
- `/debug show|set|unset|reset` gestiona sobrescrituras de configuración solo de tiempo de ejecución. Solo para el propietario. Requiere `commands.debug: true`.
|
||||
- `/usage off|tokens|full|cost` controla el pie de uso por respuesta o imprime un resumen local de costos.
|
||||
- `/tts on|off|status|provider|limit|summary|audio|help` controla TTS. Consulta [/tools/tts](/es/tools/tts).
|
||||
- `/restart` reinicia OpenClaw cuando está habilitado. Predeterminado: habilitado; configura `commands.restart: false` para desactivarlo.
|
||||
- `/restart` reinicia OpenClaw cuando está habilitado. Predeterminado: habilitado; configura `commands.restart: false` para deshabilitarlo.
|
||||
- `/activation mention|always` establece el modo de activación de grupo.
|
||||
- `/send on|off|inherit` establece la política de envío. Solo propietario.
|
||||
- `/bash <command>` ejecuta un comando del shell del host. Solo texto. Alias: `! <command>`. Requiere `commands.bash: true` más listas de permitidos `tools.elevated`.
|
||||
- `!poll [sessionId]` comprueba un trabajo bash en segundo plano.
|
||||
- `/send on|off|inherit` establece la política de envío. Solo para el propietario.
|
||||
- `/bash <command>` ejecuta un comando de shell del host. Solo texto. Alias: `! <command>`. Requiere `commands.bash: true` además de listas de permitidos `tools.elevated`.
|
||||
- `!poll [sessionId]` consulta un trabajo bash en segundo plano.
|
||||
- `!stop [sessionId]` detiene un trabajo bash en segundo plano.
|
||||
|
||||
### Comandos dock generados
|
||||
### Comandos de dock generados
|
||||
|
||||
Los comandos dock se generan a partir de plugins de canal con compatibilidad de comandos nativos. Conjunto incluido actual:
|
||||
Los comandos de dock se generan a partir de plugins de canal con soporte para comandos nativos. Conjunto incluido actual:
|
||||
|
||||
- `/dock-discord` (alias: `/dock_discord`)
|
||||
- `/dock-mattermost` (alias: `/dock_mattermost`)
|
||||
@ -153,12 +154,12 @@ Los comandos dock se generan a partir de plugins de canal con compatibilidad de
|
||||
|
||||
### Comandos de plugins incluidos
|
||||
|
||||
Los plugins incluidos pueden agregar más comandos slash. Comandos incluidos actuales en este repositorio:
|
||||
Los plugins incluidos pueden agregar más comandos de barra. Comandos incluidos actuales en este repositorio:
|
||||
|
||||
- `/dreaming [on|off|status|help]` alterna Dreaming de memoria. Consulta [Dreaming](/es/concepts/dreaming).
|
||||
- `/pair [qr|status|pending|approve|cleanup|notify]` administra el flujo de emparejamiento/configuración del dispositivo. Consulta [Vinculación](/es/channels/pairing).
|
||||
- `/phone status|arm <camera|screen|writes|all> [duration]|disarm` activa temporalmente comandos del nodo telefónico de alto riesgo.
|
||||
- `/voice status|list [limit]|set <voiceId|name>` administra la configuración de voz de Talk. En Discord, el nombre del comando nativo es `/talkvoice`.
|
||||
- `/pair [qr|status|pending|approve|cleanup|notify]` gestiona el flujo de emparejamiento/configuración de dispositivos. Consulta [Pairing](/es/channels/pairing).
|
||||
- `/phone status|arm <camera|screen|writes|all> [duration]|disarm` activa temporalmente comandos de Node de teléfono de alto riesgo.
|
||||
- `/voice status|list [limit]|set <voiceId|name>` gestiona la configuración de voz de Talk. En Discord, el nombre del comando nativo es `/talkvoice`.
|
||||
- `/card ...` envía preajustes de tarjetas enriquecidas de LINE. Consulta [LINE](/es/channels/line).
|
||||
- `/codex status|models|threads|resume|compact|review|account|mcp|skills` inspecciona y controla el arnés app-server de Codex incluido. Consulta [Codex Harness](/es/plugins/codex-harness).
|
||||
- Comandos solo para QQBot:
|
||||
@ -168,72 +169,72 @@ Los plugins incluidos pueden agregar más comandos slash. Comandos incluidos act
|
||||
- `/bot-upgrade`
|
||||
- `/bot-logs`
|
||||
|
||||
### Comandos dinámicos de skills
|
||||
### Comandos dinámicos de Skills
|
||||
|
||||
Las skills invocables por el usuario también se exponen como comandos slash:
|
||||
Las Skills invocables por el usuario también se exponen como comandos de barra:
|
||||
|
||||
- `/skill <name> [input]` siempre funciona como punto de entrada genérico.
|
||||
- las skills también pueden aparecer como comandos directos como `/prose` cuando la skill/plugin los registra.
|
||||
- el registro nativo de comandos de skills está controlado por `commands.nativeSkills` y `channels.<provider>.commands.nativeSkills`.
|
||||
- las skills también pueden aparecer como comandos directos como `/prose` cuando la skill/el plugin las registra.
|
||||
- el registro nativo de comandos de skill está controlado por `commands.nativeSkills` y `channels.<provider>.commands.nativeSkills`.
|
||||
|
||||
Notas:
|
||||
|
||||
- Los comandos aceptan `:` opcional entre el comando y los argumentos (por ejemplo, `/think: high`, `/send: on`, `/help:`).
|
||||
- Los comandos aceptan un `:` opcional entre el comando y los argumentos (por ejemplo, `/think: high`, `/send: on`, `/help:`).
|
||||
- `/new <model>` acepta un alias de modelo, `provider/model` o un nombre de proveedor (coincidencia difusa); si no hay coincidencia, el texto se trata como el cuerpo del mensaje.
|
||||
- Para el desglose completo del uso por proveedor, usa `openclaw status --usage`.
|
||||
- Para el desglose completo de uso del proveedor, usa `openclaw status --usage`.
|
||||
- `/allowlist add|remove` requiere `commands.config=true` y respeta `configWrites` del canal.
|
||||
- En canales con varias cuentas, `/allowlist --account <id>` orientado a configuración y `/config set channels.<provider>.accounts.<id>...` también respetan `configWrites` de la cuenta de destino.
|
||||
- `/usage` controla el pie de uso por respuesta; `/usage cost` imprime un resumen local de costos a partir de los registros de sesión de OpenClaw.
|
||||
- `/restart` está habilitado de forma predeterminada; configura `commands.restart: false` para desactivarlo.
|
||||
- `/plugins install <spec>` acepta las mismas especificaciones de Plugin que `openclaw plugins install`: ruta/archivo local, paquete npm o `clawhub:<pkg>`.
|
||||
- `/plugins enable|disable` actualiza la configuración del Plugin y puede solicitar un reinicio.
|
||||
- Comando nativo solo de Discord: `/vc join|leave|status` controla canales de voz (requiere `channels.discord.voice` y comandos nativos; no está disponible como texto).
|
||||
- `/restart` está habilitado de forma predeterminada; configura `commands.restart: false` para deshabilitarlo.
|
||||
- `/plugins install <spec>` acepta las mismas especificaciones de plugin que `openclaw plugins install`: ruta/archivo local, paquete npm o `clawhub:<pkg>`.
|
||||
- `/plugins enable|disable` actualiza la configuración del plugin y puede solicitar un reinicio.
|
||||
- Comando nativo solo de Discord: `/vc join|leave|status` controla los canales de voz (requiere `channels.discord.voice` y comandos nativos; no está disponible como texto).
|
||||
- Los comandos de vinculación de hilos de Discord (`/focus`, `/unfocus`, `/agents`, `/session idle`, `/session max-age`) requieren que las vinculaciones efectivas de hilos estén habilitadas (`session.threadBindings.enabled` y/o `channels.discord.threadBindings.enabled`).
|
||||
- Referencia de comandos de ACP y comportamiento en tiempo de ejecución: [Agentes ACP](/es/tools/acp-agents).
|
||||
- `/verbose` está pensado para depuración y visibilidad adicional; mantenlo **desactivado** en uso normal.
|
||||
- `/trace` es más limitado que `/verbose`: solo revela líneas de rastreo/depuración propiedad del Plugin y mantiene desactivado el ruido normal detallado de herramientas.
|
||||
- `/fast on|off` conserva una sustitución de sesión. Usa la opción `inherit` de la UI de sesiones para borrarla y volver a los valores predeterminados de la configuración.
|
||||
- Referencia del comando ACP y comportamiento en tiempo de ejecución: [ACP Agents](/es/tools/acp-agents).
|
||||
- `/verbose` está pensado para depuración y visibilidad adicional; mantenlo **desactivado** en el uso normal.
|
||||
- `/trace` es más limitado que `/verbose`: solo revela líneas de rastreo/depuración propiedad del plugin y mantiene desactivado el ruido normal detallado de herramientas.
|
||||
- `/fast on|off` conserva una sobrescritura de sesión. Usa la opción `inherit` de la UI de Sessions para borrarla y volver a los valores predeterminados de la configuración.
|
||||
- `/fast` es específico del proveedor: OpenAI/OpenAI Codex lo asignan a `service_tier=priority` en endpoints nativos de Responses, mientras que las solicitudes públicas directas a Anthropic, incluido el tráfico autenticado por OAuth enviado a `api.anthropic.com`, lo asignan a `service_tier=auto` o `standard_only`. Consulta [OpenAI](/es/providers/openai) y [Anthropic](/es/providers/anthropic).
|
||||
- Los resúmenes de errores de herramientas siguen mostrándose cuando corresponde, pero el texto detallado del error solo se incluye cuando `/verbose` está `on` o `full`.
|
||||
- `/reasoning`, `/verbose` y `/trace` son arriesgados en entornos de grupo: pueden revelar razonamiento interno, salida de herramientas o diagnósticos del Plugin que no pretendías exponer. Es preferible dejarlos desactivados, especialmente en chats grupales.
|
||||
- `/model` conserva el nuevo modelo de sesión inmediatamente.
|
||||
- Los resúmenes de fallos de herramientas siguen mostrándose cuando es relevante, pero el texto detallado del fallo solo se incluye cuando `/verbose` está en `on` o `full`.
|
||||
- `/reasoning`, `/verbose` y `/trace` son riesgosos en entornos de grupo: pueden revelar razonamiento interno, salida de herramientas o diagnósticos de plugins que no pretendías exponer. Es preferible dejarlos desactivados, especialmente en chats grupales.
|
||||
- `/model` conserva el nuevo modelo de sesión de inmediato.
|
||||
- Si el agente está inactivo, la siguiente ejecución lo usa de inmediato.
|
||||
- Si ya hay una ejecución activa, OpenClaw marca un cambio en vivo como pendiente y solo reinicia con el nuevo modelo en un punto limpio de reintento.
|
||||
- Si la actividad de herramientas o la salida de respuesta ya comenzaron, el cambio pendiente puede permanecer en cola hasta una oportunidad de reintento posterior o el siguiente turno del usuario.
|
||||
- **Ruta rápida:** los mensajes solo de comandos de remitentes permitidos se procesan de inmediato (omiten la cola + el modelo).
|
||||
- **Control por mención en grupos:** los mensajes solo de comandos de remitentes permitidos omiten los requisitos de mención.
|
||||
- **Atajos en línea (solo remitentes permitidos):** ciertos comandos también funcionan cuando están incrustados en un mensaje normal y se eliminan antes de que el modelo vea el resto del texto.
|
||||
- Si la actividad de herramientas o la salida de respuesta ya comenzó, el cambio pendiente puede quedar en cola hasta una oportunidad posterior de reintento o el siguiente turno del usuario.
|
||||
- **Ruta rápida:** los mensajes que contienen solo comandos de remitentes en la lista de permitidos se gestionan de inmediato (omiten cola + modelo).
|
||||
- **Control por mención en grupos:** los mensajes que contienen solo comandos de remitentes en la lista de permitidos omiten los requisitos de mención.
|
||||
- **Atajos en línea (solo remitentes en la lista de permitidos):** ciertos comandos también funcionan cuando están incrustados en un mensaje normal y se eliminan antes de que el modelo vea el resto del texto.
|
||||
- Ejemplo: `hey /status` activa una respuesta de estado, y el texto restante continúa por el flujo normal.
|
||||
- Actualmente: `/help`, `/commands`, `/status`, `/whoami` (`/id`).
|
||||
- Los mensajes solo de comandos no autorizados se ignoran silenciosamente, y los tokens `/...` en línea se tratan como texto sin formato.
|
||||
- **Comandos de Skills:** las Skills invocables por el usuario se exponen como comandos slash. Los nombres se limpian a `a-z0-9_` (máximo 32 caracteres); las colisiones reciben sufijos numéricos (por ejemplo, `_2`).
|
||||
- `/skill <name> [input]` ejecuta una skill por nombre (útil cuando los límites de comandos nativos impiden comandos por skill).
|
||||
- Los mensajes no autorizados que contienen solo comandos se ignoran silenciosamente, y los tokens `/...` en línea se tratan como texto sin formato.
|
||||
- **Comandos de Skills:** las skills `user-invocable` se exponen como comandos de barra. Los nombres se normalizan a `a-z0-9_` (máx. 32 caracteres); las colisiones reciben sufijos numéricos (por ejemplo, `_2`).
|
||||
- `/skill <name> [input]` ejecuta una skill por nombre (útil cuando los límites de comandos nativos impiden usar comandos por skill).
|
||||
- De forma predeterminada, los comandos de skills se reenvían al modelo como una solicitud normal.
|
||||
- Las skills pueden declarar opcionalmente `command-dispatch: tool` para enrutar el comando directamente a una herramienta (determinista, sin modelo).
|
||||
- Ejemplo: `/prose` (Plugin OpenProse) — consulta [OpenProse](/es/prose).
|
||||
- Ejemplo: `/prose` (plugin OpenProse) — consulta [OpenProse](/es/prose).
|
||||
- **Argumentos de comandos nativos:** Discord usa autocompletado para opciones dinámicas (y menús de botones cuando omites argumentos obligatorios). Telegram y Slack muestran un menú de botones cuando un comando admite opciones y omites el argumento.
|
||||
|
||||
## `/tools`
|
||||
|
||||
`/tools` responde a una pregunta de tiempo de ejecución, no de configuración: **qué puede usar este agente ahora mismo en
|
||||
`/tools` responde una pregunta de tiempo de ejecución, no una pregunta de configuración: **qué puede usar este agente ahora mismo en
|
||||
esta conversación**.
|
||||
|
||||
- El valor predeterminado de `/tools` es compacto y está optimizado para un escaneo rápido.
|
||||
- `/tools verbose` agrega descripciones breves.
|
||||
- Las superficies de comandos nativos que admiten argumentos exponen el mismo cambio de modo que `compact|verbose`.
|
||||
- Los resultados tienen alcance de sesión, por lo que cambiar el agente, canal, hilo, autorización del remitente o modelo puede
|
||||
- Los resultados tienen alcance de sesión, así que cambiar de agente, canal, hilo, autorización del remitente o modelo puede
|
||||
cambiar la salida.
|
||||
- `/tools` incluye herramientas realmente accesibles en tiempo de ejecución, incluidas herramientas del núcleo, herramientas de
|
||||
- `/tools` incluye las herramientas realmente accesibles en tiempo de ejecución, incluidas herramientas del núcleo, herramientas de
|
||||
plugins conectados y herramientas propiedad del canal.
|
||||
|
||||
Para editar perfiles y sustituciones, usa el panel de herramientas de la UI de control o las superficies de configuración/catálogo en lugar
|
||||
Para editar perfiles y sobrescrituras, usa el panel Tools de la UI de Control o las superficies de configuración/catálogo en lugar
|
||||
de tratar `/tools` como un catálogo estático.
|
||||
|
||||
## Superficies de uso (qué se muestra y dónde)
|
||||
## Superficies de uso (qué se muestra dónde)
|
||||
|
||||
- **Uso/cuota del proveedor** (ejemplo: “Claude 80% left”) aparece en `/status` para el proveedor del modelo actual cuando el seguimiento de uso está habilitado. OpenClaw normaliza las ventanas de proveedor a `% left`; para MiniMax, los campos de porcentaje de solo restante se invierten antes de mostrarse, y las respuestas `model_remains` prefieren la entrada del modelo de chat más una etiqueta de plan con etiqueta de modelo.
|
||||
- **Líneas de tokens/caché** en `/status` pueden volver a la última entrada de uso de la transcripción cuando la instantánea de sesión en vivo es escasa. Los valores vivos existentes distintos de cero siguen prevaleciendo, y la alternativa de transcripción también puede recuperar la etiqueta del modelo activo en tiempo de ejecución más un total más orientado al prompt cuando faltan los totales almacenados o son menores.
|
||||
- **Tokens/costo por respuesta** se controla con `/usage off|tokens|full` (se agrega a las respuestas normales).
|
||||
- **Uso/cuota del proveedor** (ejemplo: “Claude 80% left”) aparece en `/status` para el proveedor del modelo actual cuando el seguimiento de uso está habilitado. OpenClaw normaliza las ventanas del proveedor a `% left`; para MiniMax, los campos de porcentaje de solo restante se invierten antes de mostrarse, y las respuestas `model_remains` prefieren la entrada del modelo de chat más una etiqueta de plan con la etiqueta del modelo.
|
||||
- Las **líneas de tokens/caché** en `/status` pueden recurrir a la última entrada de uso de la transcripción cuando la instantánea de la sesión en vivo es escasa. Los valores en vivo no nulos existentes siguen teniendo prioridad, y el recurso de transcripción también puede recuperar la etiqueta activa del modelo en ejecución además de un total más grande orientado al prompt cuando faltan los totales almacenados o son menores.
|
||||
- Los **tokens/costo por respuesta** se controlan con `/usage off|tokens|full` (se agregan a las respuestas normales).
|
||||
- `/model status` trata sobre **modelos/autenticación/endpoints**, no sobre uso.
|
||||
|
||||
## Selección de modelo (`/model`)
|
||||
@ -254,13 +255,13 @@ Ejemplos:
|
||||
Notas:
|
||||
|
||||
- `/model` y `/model list` muestran un selector compacto numerado (familia de modelos + proveedores disponibles).
|
||||
- En Discord, `/model` y `/models` abren un selector interactivo con menús desplegables de proveedor y modelo más un paso de envío.
|
||||
- En Discord, `/model` y `/models` abren un selector interactivo con menús desplegables de proveedor y modelo además de un paso Submit.
|
||||
- `/model <#>` selecciona desde ese selector (y prefiere el proveedor actual cuando es posible).
|
||||
- `/model status` muestra la vista detallada, incluido el endpoint configurado del proveedor (`baseUrl`) y el modo de API (`api`) cuando están disponibles.
|
||||
- `/model status` muestra la vista detallada, incluido el endpoint configurado del proveedor (`baseUrl`) y el modo API (`api`) cuando están disponibles.
|
||||
|
||||
## Sustituciones de depuración
|
||||
## Sobrescrituras de depuración
|
||||
|
||||
`/debug` te permite establecer sustituciones de configuración **solo de tiempo de ejecución** (memoria, no disco). Solo propietario. Desactivado de forma predeterminada; habilítalo con `commands.debug: true`.
|
||||
`/debug` te permite establecer sobrescrituras de configuración **solo en tiempo de ejecución** (en memoria, no en disco). Solo para el propietario. Deshabilitado de forma predeterminada; habilítalo con `commands.debug: true`.
|
||||
|
||||
Ejemplos:
|
||||
|
||||
@ -274,12 +275,12 @@ Ejemplos:
|
||||
|
||||
Notas:
|
||||
|
||||
- Las sustituciones se aplican de inmediato a las nuevas lecturas de configuración, pero **no** escriben en `openclaw.json`.
|
||||
- Usa `/debug reset` para borrar todas las sustituciones y volver a la configuración en disco.
|
||||
- Las sobrescrituras se aplican de inmediato a las nuevas lecturas de configuración, pero **no** escriben en `openclaw.json`.
|
||||
- Usa `/debug reset` para borrar todas las sobrescrituras y volver a la configuración en disco.
|
||||
|
||||
## Salida de rastreo del Plugin
|
||||
## Salida de rastreo de plugins
|
||||
|
||||
`/trace` te permite alternar líneas de rastreo/depuración del Plugin **con alcance de sesión** sin activar el modo detallado completo.
|
||||
`/trace` te permite alternar líneas de **rastreo/depuración de plugins con alcance de sesión** sin activar el modo detallado completo.
|
||||
|
||||
Ejemplos:
|
||||
|
||||
@ -292,15 +293,15 @@ Ejemplos:
|
||||
Notas:
|
||||
|
||||
- `/trace` sin argumento muestra el estado actual de rastreo de la sesión.
|
||||
- `/trace on` habilita líneas de rastreo del Plugin para la sesión actual.
|
||||
- `/trace off` las desactiva nuevamente.
|
||||
- Las líneas de rastreo del Plugin pueden aparecer en `/status` y como mensaje de diagnóstico de seguimiento después de la respuesta normal del asistente.
|
||||
- `/trace` no sustituye a `/debug`; `/debug` sigue administrando sustituciones de configuración solo de tiempo de ejecución.
|
||||
- `/trace on` habilita líneas de rastreo de plugins para la sesión actual.
|
||||
- `/trace off` las vuelve a deshabilitar.
|
||||
- Las líneas de rastreo de plugins pueden aparecer en `/status` y como un mensaje de diagnóstico de seguimiento después de la respuesta normal del asistente.
|
||||
- `/trace` no sustituye a `/debug`; `/debug` sigue gestionando sobrescrituras de configuración solo en tiempo de ejecución.
|
||||
- `/trace` no sustituye a `/verbose`; la salida normal detallada de herramientas/estado sigue perteneciendo a `/verbose`.
|
||||
|
||||
## Actualizaciones de configuración
|
||||
|
||||
`/config` escribe en tu configuración en disco (`openclaw.json`). Solo propietario. Desactivado de forma predeterminada; habilítalo con `commands.config: true`.
|
||||
`/config` escribe en tu configuración en disco (`openclaw.json`). Solo para el propietario. Deshabilitado de forma predeterminada; habilítalo con `commands.config: true`.
|
||||
|
||||
Ejemplos:
|
||||
|
||||
@ -315,11 +316,11 @@ Ejemplos:
|
||||
Notas:
|
||||
|
||||
- La configuración se valida antes de escribir; los cambios no válidos se rechazan.
|
||||
- Las actualizaciones de `/config` se conservan tras reinicios.
|
||||
- Las actualizaciones de `/config` persisten tras los reinicios.
|
||||
|
||||
## Actualizaciones de MCP
|
||||
|
||||
`/mcp` escribe definiciones de servidor MCP gestionadas por OpenClaw en `mcp.servers`. Solo propietario. Desactivado de forma predeterminada; habilítalo con `commands.mcp: true`.
|
||||
`/mcp` escribe definiciones de servidor MCP gestionadas por OpenClaw en `mcp.servers`. Solo para el propietario. Deshabilitado de forma predeterminada; habilítalo con `commands.mcp: true`.
|
||||
|
||||
Ejemplos:
|
||||
|
||||
@ -337,7 +338,7 @@ Notas:
|
||||
|
||||
## Actualizaciones de plugins
|
||||
|
||||
`/plugins` permite a los operadores inspeccionar plugins detectados y alternar su habilitación en la configuración. Los flujos de solo lectura pueden usar `/plugin` como alias. Desactivado de forma predeterminada; habilítalo con `commands.plugins: true`.
|
||||
`/plugins` permite a los operadores inspeccionar los plugins detectados y alternar su habilitación en la configuración. Los flujos de solo lectura pueden usar `/plugin` como alias. Deshabilitado de forma predeterminada; habilítalo con `commands.plugins: true`.
|
||||
|
||||
Ejemplos:
|
||||
|
||||
@ -351,35 +352,35 @@ Ejemplos:
|
||||
|
||||
Notas:
|
||||
|
||||
- `/plugins list` y `/plugins show` usan detección real de plugins contra el espacio de trabajo actual más la configuración en disco.
|
||||
- `/plugins enable|disable` actualiza solo la configuración del Plugin; no instala ni desinstala plugins.
|
||||
- `/plugins list` y `/plugins show` usan descubrimiento real de plugins contra el espacio de trabajo actual más la configuración en disco.
|
||||
- `/plugins enable|disable` actualiza solo la configuración del plugin; no instala ni desinstala plugins.
|
||||
- Después de cambios de habilitación/deshabilitación, reinicia el gateway para aplicarlos.
|
||||
|
||||
## Notas de superficie
|
||||
## Notas sobre superficies
|
||||
|
||||
- **Comandos de texto** se ejecutan en la sesión normal de chat (los MD comparten `main`, los grupos tienen su propia sesión).
|
||||
- **Comandos de texto** se ejecutan en la sesión normal de chat (los mensajes directos comparten `main`, los grupos tienen su propia sesión).
|
||||
- **Comandos nativos** usan sesiones aisladas:
|
||||
- Discord: `agent:<agentId>:discord:slash:<userId>`
|
||||
- Slack: `agent:<agentId>:slack:slash:<userId>` (prefijo configurable mediante `channels.slack.slashCommand.sessionPrefix`)
|
||||
- Telegram: `telegram:slash:<userId>` (apunta a la sesión de chat mediante `CommandTargetSessionKey`)
|
||||
- **`/stop`** apunta a la sesión de chat activa para poder abortar la ejecución actual.
|
||||
- **Slack:** `channels.slack.slashCommand` sigue siendo compatible para un único comando estilo `/openclaw`. Si habilitas `commands.native`, debes crear un comando slash de Slack por cada comando integrado (con los mismos nombres que `/help`). Los menús de argumentos de comandos para Slack se entregan como botones efímeros de Block Kit.
|
||||
- Excepción nativa de Slack: registra `/agentstatus` (no `/status`) porque Slack reserva `/status`. El `/status` de texto sigue funcionando en mensajes de Slack.
|
||||
- Telegram: `telegram:slash:<userId>` (apunta a la sesión del chat mediante `CommandTargetSessionKey`)
|
||||
- **`/stop`** apunta a la sesión activa del chat para poder abortar la ejecución actual.
|
||||
- **Slack:** `channels.slack.slashCommand` sigue siendo compatible para un único comando estilo `/openclaw`. Si habilitas `commands.native`, debes crear un comando de barra de Slack por cada comando integrado (con los mismos nombres que `/help`). Los menús de argumentos de comandos para Slack se entregan como botones efímeros de Block Kit.
|
||||
- Excepción nativa de Slack: registra `/agentstatus` (no `/status`) porque Slack reserva `/status`. El texto `/status` sigue funcionando en mensajes de Slack.
|
||||
|
||||
## Preguntas laterales BTW
|
||||
## Preguntas laterales con BTW
|
||||
|
||||
`/btw` es una **pregunta lateral** rápida sobre la sesión actual.
|
||||
|
||||
A diferencia del chat normal:
|
||||
|
||||
- usa la sesión actual como contexto de fondo,
|
||||
- se ejecuta como una llamada independiente **sin herramientas**,
|
||||
- se ejecuta como una llamada separada de un solo uso **sin herramientas**,
|
||||
- no cambia el contexto futuro de la sesión,
|
||||
- no se escribe en el historial de la transcripción,
|
||||
- se entrega como un resultado lateral en vivo en lugar de un mensaje normal del asistente.
|
||||
|
||||
Eso hace que `/btw` sea útil cuando quieres una aclaración temporal mientras la
|
||||
tarea principal sigue avanzando.
|
||||
Eso hace que `/btw` sea útil cuando quieres una aclaración temporal mientras la tarea principal
|
||||
sigue en curso.
|
||||
|
||||
Ejemplo:
|
||||
|
||||
@ -387,5 +388,5 @@ Ejemplo:
|
||||
/btw what are we doing right now?
|
||||
```
|
||||
|
||||
Consulta [Preguntas laterales BTW](/es/tools/btw) para ver el comportamiento completo y los detalles
|
||||
de la experiencia de cliente.
|
||||
Consulta [BTW Side Questions](/es/tools/btw) para ver el comportamiento completo y los detalles
|
||||
de UX del cliente.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user