Emparejamiento
Solución de problemas de canales
Configuración del Gateway
Configuración rápida
Crear el token del bot en BotFather
- Flujo de chat: abre Telegram, chatea con @BotFather (confirma que el identificador sea exactamente
@BotFather), ejecuta/newbot, sigue las indicaciones y guarda el token. - Flujo web: abre la aplicación web de BotFather; se ejecuta en todos los clientes de Telegram, incluido web.telegram.org; crea el bot en la UI y copia su token.
Configurar el token y la política de DM
TELEGRAM_BOT_TOKEN (solo cuenta predeterminada; las cuentas con nombre deben usar botToken o tokenFile).
Telegram no usa openclaw channels login telegram; define el token en la configuración o el entorno y luego inicia el Gateway.Agregar el bot a un grupo
- tu ID de usuario de Telegram, para
allowFrom/groupAllowFrom - el ID del chat de grupo de Telegram, como clave en
channels.telegram.groups
openclaw logs --follow, un bot de ID reenviados o getUpdates de la Bot API. Después de permitir el grupo, /whoami@<bot_username> confirma los ID de usuario y de grupo.Los ID negativos de supergrupo que comienzan con -100 son ID de chat de grupo. Van en channels.telegram.groups, no en groupAllowFrom.tokenFile tiene prioridad sobre botToken, que tiene prioridad sobre el entorno, y la configuración siempre prevalece sobre TELEGRAM_BOT_TOKEN (que solo se resuelve para la cuenta predeterminada). Después de un inicio correcto, OpenClaw almacena en caché la identidad del bot durante hasta 24 horas para que los reinicios omitan una llamada adicional a getMe; cambiar o eliminar el token borra esa caché.Ajustes del lado de Telegram
Modo de privacidad y visibilidad de grupo
Modo de privacidad y visibilidad de grupo
- desactiva el modo de privacidad mediante
/setprivacy, o - convierte el bot en administrador del grupo.
Permisos de grupo
Permisos de grupo
Controles útiles de BotFather
Controles útiles de BotFather
/setjoingroups— permitir/denegar agregados a grupos/setprivacy— comportamiento de visibilidad de grupo
Control de acceso y activación
Identidad del bot en grupos
En grupos y temas de foro, una mención explícita del identificador del bot configurado (por ejemplo,@my_bot) se dirige al agente de OpenClaw seleccionado, incluso cuando el nombre de la persona del agente difiere del nombre de usuario de Telegram. La política de silencio del grupo sigue aplicándose al tráfico no relacionado, pero el identificador del bot nunca es “otra persona”.
- Política de DM
- Política de grupo y listas de permitidos
- Comportamiento de menciones
channels.telegram.dmPolicy controla el acceso por mensaje directo:pairing(predeterminado)allowlist(requiere al menos un ID de remitente enallowFrom)open(requiere queallowFromincluya"*")disabled
dmPolicy: "open" con allowFrom: ["*"] permite que cualquier cuenta de Telegram que encuentre o adivine el nombre de usuario del bot lo controle. Úsalo solo para bots intencionalmente públicos con herramientas muy restringidas; los bots de un solo propietario deben usar allowlist con ID de usuario numéricos.channels.telegram.allowFrom acepta ID de usuario numéricos de Telegram. Se aceptan y normalizan los prefijos telegram: / tg:.
En configuraciones de varias cuentas, un channels.telegram.allowFrom restrictivo de nivel superior es un límite de seguridad: un allowFrom: ["*"] a nivel de cuenta no hace pública esa cuenta a menos que la lista de permitidos efectiva combinada aún contenga un comodín explícito.
dmPolicy: "allowlist" con allowFrom vacío bloquea todos los DM y la validación de configuración lo rechaza.
La configuración solicita solo ID de usuario numéricos. Si tu configuración tiene entradas de lista de permitidos @username de una configuración anterior, ejecuta openclaw doctor --fix para resolverlas a ID numéricos (mejor esfuerzo; requiere un token de bot de Telegram).
Si antes dependías de archivos de lista de permitidos del almacén de emparejamiento, openclaw doctor --fix puede recuperar entradas en channels.telegram.allowFrom para 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 ID numéricos explícitos en allowFrom en lugar de depender de aprobaciones de emparejamiento previas.Confusión común: la aprobación de emparejamiento por DM no significa “este remitente está autorizado en todas partes”. El emparejamiento solo concede acceso por DM. Si aún no existe propietario de comandos, el primer emparejamiento aprobado también define commands.ownerAllowFrom, lo que da a los comandos solo para propietario y a las aprobaciones de ejecución una cuenta de operador explícita. La autorización de remitente de grupo sigue viniendo de listas de permitidos explícitas en la configuración.
Para estar autorizado tanto para DM como para comandos de grupo con una sola identidad: coloca tu ID de usuario numérico de Telegram en channels.telegram.allowFrom y, para comandos solo para propietario, asegúrate de que commands.ownerAllowFrom contenga telegram:<your user id>.Encontrar tu ID de usuario de Telegram
Más seguro (sin bot de terceros): envía un DM a tu bot, ejecutaopenclaw logs --follow y lee from.id.Método oficial de la Bot API:@userinfobot o @getidsbot.Comportamiento en runtime
- Telegram se ejecuta dentro del proceso del Gateway.
- El enrutamiento es determinista: las entradas de Telegram responden de vuelta a Telegram (el modelo no elige canales).
- Los mensajes entrantes se normalizan en el sobre de canal compartido con metadatos de respuesta, marcadores de posición de medios y contexto persistido de cadena de respuestas para respuestas que el Gateway ha observado.
- Las sesiones de grupo se aíslan por ID de grupo. Los temas de foro agregan
:topic:<threadId>. - Los mensajes de DM pueden llevar
message_thread_id; OpenClaw lo conserva para las respuestas. Las sesiones de temas de DM se dividen solo cuandogetMede Telegram informahas_topics_enabled: truepara el bot; de lo contrario, los DM permanecen en la sesión plana. - El sondeo largo usa el runner de grammY con secuenciación por chat/por hilo. La concurrencia del sumidero del runner usa
agents.defaults.maxConcurrent. - El inicio de varias cuentas limita las sondas
getMeconcurrentes para que las flotas grandes de bots no disparen todas las sondas de cuenta a la vez. - Cada proceso de Gateway protege el sondeo largo para que solo un sondeador activo pueda usar un token de bot a la vez. Los conflictos persistentes 409 de
getUpdatesapuntan a otro Gateway de OpenClaw, script o sondeador externo que usa el mismo token. - El watchdog de sondeo se reinicia después de 120 segundos sin vivacidad de
getUpdatescompletada de forma predeterminada. Aumentachannels.telegram.pollingStallThresholdMs(30000-600000, con sobrescrituras por cuenta admitidas) solo si tu despliegue ve reinicios falsos por bloqueo de sondeo durante trabajos de larga duración. - La Bot API de Telegram no tiene soporte de confirmación de lectura (
sendReadReceiptsno aplica).
channels.telegram.dm.threadReplies y channels.telegram.direct.<chatId>.threadReplies. Ejecuta openclaw doctor --fix después de actualizar si tu configuración aún tiene esas claves. El enrutamiento de temas de DM ahora sigue getMe.has_topics_enabled de Telegram (controlado por el modo con hilos de BotFather): los bots con temas habilitados usan sesiones de DM con ámbito de hilo cuando Telegram envía message_thread_id; los demás DM permanecen en la sesión plana.Referencia de funciones
Vista previa de transmisión en vivo (ediciones de mensajes)
Vista previa de transmisión en vivo (ediciones de mensajes)
editMessageText repetidamente y finaliza en el mismo lugar.channels.telegram.streamingesoff | partial | block | progress(predeterminado:partial)- las vistas previas cortas de respuesta inicial se atenúan con debounce y luego se materializan tras una demora acotada si la ejecución sigue activa
progressmantiene un borrador de estado editable para el progreso de herramientas, muestra la etiqueta de estado estable cuando llega actividad de respuesta antes del progreso de herramientas, lo borra al completarse y envía la respuesta final como un mensaje normalstreaming.preview.toolProgresscontrola si las actualizaciones de herramientas/progreso reutilizan el mismo mensaje de vista previa editado (predeterminado:truecuando la transmisión de vista previa está activa)streaming.preview.commandTextcontrola el detalle de comando/ejecución dentro de esas líneas:raw(predeterminado) ostatus(solo etiqueta de herramienta)streaming.progress.commentary(predeterminado:false) habilita texto de comentario/preámbulo del asistente en el borrador temporal de progreso- se detectan
channels.telegram.streamModeheredado, valores booleanos destreamingy claves retiradas de vista previa de borrador nativo; ejecutaopenclaw doctor --fixpara migrarlos
v2026.4.22+).Mantén las ediciones de vista previa de respuesta, pero oculta las líneas de progreso de herramientas:progress muestra el progreso de herramientas sin editar la respuesta final dentro de ese mensaje. Coloca la política de texto de comando en streaming.progress:streaming.mode: "off" desactiva las ediciones de vista previa y suprime el parloteo genérico de herramientas/progreso en lugar de enviarlo como mensajes de estado independientes; las solicitudes de aprobación, los medios y los errores siguen enrutándose mediante la entrega final normal. streaming.preview.toolProgress: false conserva solo las ediciones de vista previa de respuesta.replyToMode es first, all o batched y el mensaje entrante tiene texto de cita seleccionado, OpenClaw envía la respuesta final mediante la ruta nativa de respuesta con cita de Telegram en lugar de editar la vista previa de respuesta, por lo que streaming.preview.toolProgress no puede mostrar líneas de estado en ese turno. Las respuestas al mensaje actual sin texto de cita seleccionado siguen transmitiéndose. Define replyToMode: "off" cuando la visibilidad del progreso de herramientas importe más que las respuestas nativas con cita, o streaming.preview.toolProgress: false para aceptar esa compensación./reasoning stream transmite el razonamiento en la vista previa en vivo mientras genera y luego elimina la vista previa de razonamiento después de la entrega final (usa /reasoning on para mantenerla visible). La respuesta final se envía sin texto de razonamiento.Formato enriquecido de mensajes
Formato enriquecido de mensajes
$400-600K no se interpretan como matemáticas. El texto enriquecido largo se divide automáticamente según los límites de Telegram. Las tablas que superan el límite de 20 columnas vuelven a un bloque de código.Predeterminado: desactivado, por compatibilidad con clientes; algunos clientes actuales de escritorio, web, Android y de terceros renderizan los mensajes enriquecidos aceptados como no compatibles. Mantenlo desactivado salvo que todos los clientes usados con el bot puedan renderizarlos. /status muestra si la sesión actual tiene los mensajes enriquecidos activados o desactivados.Las vistas previas de enlaces están activadas de forma predeterminada. channels.telegram.linkPreview: false desactiva la detección automática de entidades para texto enriquecido.Comandos nativos y comandos personalizados
Comandos nativos y comandos personalizados
setMyCommands. commands.native: "auto" habilita los comandos nativos para Telegram.Agrega entradas personalizadas al menú de comandos:/ inicial, se convierten a minúsculas); patrón válido a-z, 0-9, _, longitud 1-32; los comandos personalizados no pueden sobrescribir comandos nativos; los conflictos/duplicados se omiten y se registran.Los comandos personalizados son solo entradas de menú: no implementan comportamiento automáticamente. Los comandos de Plugin/skill aún pueden funcionar al escribirse aunque no se muestren en el menú de Telegram. Si los comandos nativos están deshabilitados, se eliminan los integrados; los comandos personalizados/de Plugin aún pueden registrarse si están configurados.Errores comunes de configuración:setMyCommands failedconBOT_COMMANDS_TOO_MUCHdespués de un reintento de recorte significa que el menú aún se desborda; reduce los comandos de Plugin, Skills o personalizados, o desactivachannels.telegram.commands.native.- Si
deleteWebhook,deleteMyCommandsosetMyCommandsfallan con404: Not Foundmientras los comandos directos de curl de Bot API funcionan, normalmente significa quechannels.telegram.apiRootse configuró con el endpoint completo/bot<TOKEN>.apiRootdebe ser solo la raíz de Bot API;openclaw doctor --fixelimina un/bot<TOKEN>final accidental. getMe returned 401significa que Telegram rechazó el token de bot configurado. ActualizabotToken,tokenFileoTELEGRAM_BOT_TOKEN(cuenta predeterminada) con el token actual de BotFather; OpenClaw se detiene antes del sondeo, así que esto no se informa como un fallo de limpieza de Webhook.setMyCommands failedcon errores de red/fetch normalmente significa que el DNS/HTTPS saliente haciaapi.telegram.orgestá bloqueado.
Comandos de emparejamiento de dispositivos (Plugin device-pair)
Cuando está instalado:/pairgenera un código de configuración- pega el código en la app de iOS
/pair pendingenumera las solicitudes pendientes (incluidos rol/alcances)- aprueba:
/pair approve <requestId>,/pair approve(única solicitud pendiente) o/pair approve latest
requestId; vuelve a ejecutar /pair pending antes de aprobar.Más detalle: Emparejamiento.Telegram message actions for agents and automation
Telegram message actions for agents and automation
sendMessage(to,content,mediaUrlopcional,replyToMessageId,messageThreadId)react(chatId,messageId,emoji)deleteMessage(chatId,messageId)editMessage(chatId,messageId,contentocaption, botones en líneapresentationopcionales; las ediciones solo de botones actualizan el marcado de respuesta)createForumTopic(chatId,name,iconColoropcional,iconCustomEmojiId)
send, react, delete, edit, sticker, sticker-search, topic-create.Control de acceso: channels.telegram.actions.sendMessage, deleteMessage, reactions, sticker (predeterminado: desactivado). edit, createForumTopic y editForumTopic están activados de forma predeterminada sin un interruptor dedicado.
Los envíos en Runtime usan la instantánea activa de configuración/secretos desde el inicio o la recarga, por lo que las rutas de acción no vuelven a resolver valores SecretRef en cada envío.Semántica de eliminación de reacciones: /tools/reactions.Temas de foro y comportamiento de hilos
Temas de foro y comportamiento de hilos
:topic:<threadId>; las respuestas y el indicador de escritura apuntan al hilo del tema; la ruta de configuración del tema es channels.telegram.groups.<chatId>.topics.<threadId>.El tema general (threadId=1) es un caso especial: los envíos de mensajes omiten message_thread_id (Telegram rechaza sendMessage(...thread_id=1) con “thread not found”), pero las acciones de escritura todavía incluyen message_thread_id (requisito empírico para que aparezca el indicador de escritura).Las entradas de tema heredan la configuración del grupo salvo que se sobrescriban (requireMention, allowFrom, skills, systemPrompt, enabled, groupPolicy). agentId es exclusivo del tema y no se hereda de los valores predeterminados del grupo. topics."*" establece valores predeterminados para todos los temas de ese grupo; los ID de tema exactos siguen prevaleciendo sobre "*".Enrutamiento de agentes por tema: cada tema puede enrutarse a un agente diferente mediante agentId en la configuración del tema, lo que le da su propio espacio de trabajo, memoria y sesión:agent:zu:telegram:group:-1001234567890:topic:3.Vinculación persistente de temas ACP: los temas de foro pueden fijar sesiones del arnés ACP mediante vinculaciones tipadas de nivel superior (bindings[] con type: "acp", match.channel: "telegram", peer.kind: "group" y un id calificado por tema como -1001234567890:topic:42). Actualmente está limitado a temas de foro en grupos/supergrupos. Consulta Agentes ACP.Generación ACP ligada al hilo desde el chat: /acp spawn <agent> --thread here|auto vincula el tema actual a una nueva sesión ACP; los seguimientos se enrutan allí directamente, y OpenClaw fija la confirmación de generación dentro del tema. Requiere channels.telegram.threadBindings.spawnSessions (predeterminado: true).El contexto de plantilla expone MessageThreadId e IsForum. Los chats por DM con message_thread_id conservan los metadatos de respuesta, pero solo usan claves de sesión conscientes del hilo cuando Telegram getMe informa has_topics_enabled: true.
Las sobrescrituras retiradas dm.threadReplies y direct.*.threadReplies ya no existen; el modo con hilos de BotFather es la única fuente de verdad. Ejecuta openclaw doctor --fix para eliminar claves de configuración obsoletas.Audio, video y stickers
Audio, video y stickers
Mensajes de audio
Telegram distingue las notas de voz de los archivos de audio. Predeterminado: comportamiento de archivo de audio; etiqueta[[audio_as_voice]] en la respuesta del agente para forzar el envío como nota de voz. Las transcripciones entrantes de notas de voz se enmarcan como texto generado por máquina y no confiable en el contexto del agente, pero la detección de menciones sigue usando la transcripción sin procesar para que los mensajes de voz sujetos a menciones sigan funcionando.Mensajes de video
Telegram distingue los archivos de video de las notas de video. Las notas de video no admiten subtítulos; el texto del mensaje proporcionado se envía por separado.Stickers
Entrante: WEBP estático se descarga y procesa (marcador de posición<media:sticker>); TGS animado y WEBM de video se omiten.Campos de contexto de sticker: Sticker.emoji, Sticker.setName, Sticker.fileId, Sticker.fileUniqueId, Sticker.cachedDescription. Las descripciones se almacenan en caché en el estado del Plugin SQLite de OpenClaw para reducir llamadas de visión repetidas.Habilitar acciones de sticker:Notificaciones de reacción
Notificaciones de reacción
message_reaction, separadas de las cargas útiles de mensajes. Cuando está habilitado, OpenClaw encola eventos del sistema como Telegram reaction added: 👍 by Alice (@alice) on msg 42.channels.telegram.reactionNotifications:off | own | all(predeterminado:own)channels.telegram.reactionLevel:off | ack | minimal | extensive(predeterminado:minimal)
own significa solo reacciones de usuario a mensajes enviados por el bot (mejor esfuerzo mediante una 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 ID de hilo en las actualizaciones de reacción: los grupos que no son de foro se enrutan a la sesión del chat grupal; los grupos de foro se enrutan a la sesión del tema general (:topic:1), no al tema exacto de origen.allowed_updates para polling/webhook incluye message_reaction automáticamente.Reacciones de acuse
Reacciones de acuse
ackReaction envía un emoji de acuse mientras OpenClaw procesa un mensaje entrante. messages.ackReactionScope decide cuándo se envía.Orden de resolución de emoji:channels.telegram.accounts.<accountId>.ackReactionchannels.telegram.ackReactionmessages.ackReaction- reserva de emoji de identidad del agente (
agents.list[].identity.emoji, o ”👀”)
"" para deshabilitar la reacción en un canal o una cuenta.Alcance (messages.ackReactionScope, predeterminado "group-mentions"; hoy no hay sobrescritura por cuenta de Telegram ni por canal de Telegram):all (DMs + grupos, incluidos eventos de sala ambientales), direct (solo DMs), group-all (todos los mensajes de grupo excepto eventos de sala ambientales, sin DMs), group-mentions (grupos cuando se menciona al bot; sin DMs — predeterminado), off / none (deshabilitado).group-mentions) no dispara reacciones de acuse en DMs ni en eventos de sala ambientales. Usa direct o all para DMs; solo all acusa recibo de eventos de sala ambientales. Este valor se lee al iniciar el proveedor de Telegram, por lo que se necesita reiniciar el gateway para que el cambio surta efecto.Escrituras de configuración desde eventos y comandos de Telegram
Escrituras de configuración desde eventos y comandos de Telegram
configWrites !== false). Las escrituras disparadas por Telegram incluyen eventos de migración de grupo (migrate_to_chat_id, actualiza channels.telegram.groups) y /config set / /config unset (requiere habilitación de comandos).Deshabilitar:Long polling frente a webhook
Long polling frente a webhook
channels.telegram.webhookUrl y channels.telegram.webhookSecret; opcionalmente webhookPath (predeterminado /telegram-webhook), webhookHost (predeterminado 127.0.0.1), webhookPort (predeterminado 8787), webhookCertPath (certificado PEM autofirmado para configuraciones con IP directa o sin dominio).En modo long-polling, OpenClaw persiste su marca de agua de reinicio solo después de que una actualización se despacha correctamente; un controlador fallido deja esa actualización reintentable en el mismo proceso en lugar de marcarla como completada.El listener local se enlaza a 127.0.0.1:8787 de forma predeterminada. Para ingreso público, coloca un proxy inverso delante del puerto local, o establece webhookHost: "0.0.0.0" de forma intencional.El modo webhook valida las protecciones de solicitud, el token secreto de Telegram y el cuerpo JSON antes de devolver 200. Luego OpenClaw procesa la actualización de forma asíncrona mediante los mismos carriles de bot por chat/por tema que usa long polling, así que los turnos lentos del agente no retienen el ACK de entrega de Telegram.Límites, reintentos y destinos de CLI
Límites, reintentos y destinos de CLI
channels.telegram.textChunkLimitpredeterminado 4000;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.channels.telegram.mediaGroupFlushMs(predeterminado 500, rango 10-60000) controla cuánto tiempo se almacenan en búfer los álbumes/grupos de medios antes de que OpenClaw los despache como un solo mensaje entrante. Auméntalo si las partes del álbum llegan tarde; redúcelo para disminuir la latencia de respuesta al álbum.channels.telegram.timeoutSecondssobrescribe el timeout del cliente de API (se aplica el predeterminado de grammY si no se establece). Los clientes de bot limitan los valores configurados por debajo de la protección de solicitud saliente de texto/escritura de 60 segundos para que grammY no aborte la entrega de respuestas visibles antes de que puedan ejecutarse la protección de transporte y la reserva de OpenClaw. Long polling todavía usa una protección de solicitudgetUpdatesde 45 segundos para que los polls inactivos no queden abandonados indefinidamente.channels.telegram.pollingStallThresholdMstiene un valor predeterminado de 120000; ajusta entre 30000 y 600000 solo para reinicios por bloqueo de polling falsos positivos.- el historial de contexto de grupo usa
channels.telegram.historyLimitomessages.groupChat.historyLimit(predeterminado 50);0lo deshabilita. - el contexto suplementario de respuesta/cita/reenvío se normaliza en una única ventana de contexto de conversación seleccionada cuando el gateway ha observado los mensajes padre; la caché de mensajes observados vive en el estado del Plugin SQLite de OpenClaw, y
openclaw doctor --fiximporta sidecars heredados. Telegram solo incluye unreply_to_messagesuperficial por actualización, por lo que las cadenas más antiguas que la caché quedan limitadas a esa carga útil. - Las listas de permitidos de Telegram controlan principalmente quién puede activar el agente, no son un límite completo de redacción de contexto suplementario.
- Historial de DM:
channels.telegram.dmHistoryLimit,channels.telegram.dms["<user_id>"].historyLimit. channels.telegram.retryse aplica a los helpers de envío de Telegram (CLI/herramientas/acciones) para errores de API saliente recuperables. La entrega de respuesta final entrante usa un reintento de envío seguro acotado para fallos previos a la conexión, pero no reintenta envoltorios de red ambiguos posteriores al envío que podrían duplicar mensajes visibles.
openclaw message poll y admiten temas de foro:--poll-duration-seconds (5-600), --poll-anonymous, --poll-public, --thread-id (o un destino :topic:). --poll-option se repite 2-12 veces (límite de opciones de Telegram).El envío de Telegram también admite --presentation con bloques buttons para teclados en línea (cuando channels.telegram.capabilities.inlineButtons lo permite), --pin o --delivery '{"pin":true}' para solicitar entrega fijada cuando el bot puede fijar en ese chat, y --force-document para enviar imágenes, GIFs y videos salientes como documentos en lugar de cargas comprimidas/animadas/de video.Control de acciones: channels.telegram.actions.sendMessage=false deshabilita todos los mensajes salientes, incluidas las encuestas; channels.telegram.actions.poll=false deshabilita la creación de encuestas y deja habilitados los envíos normales.Aprobaciones exec en Telegram
Aprobaciones exec en Telegram
channels.telegram.execApprovals.enabled("auto"se habilita cuando al menos un aprobador se puede resolver)channels.telegram.execApprovals.approvers(recurre a los ID numéricos de propietarios decommands.ownerAllowFrom)channels.telegram.execApprovals.target:dm(predeterminado) |channel|bothagentFilter,sessionFilter
channels.telegram.allowFrom, groupAllowFrom y defaultTo controlan quién puede hablar con el bot y dónde envía respuestas normales; no convierten a alguien en aprobador de ejecución. El primer emparejamiento por DM aprobado inicializa commands.ownerAllowFrom cuando aún no existe ningún propietario de comandos, por lo que las configuraciones con un solo propietario funcionan sin duplicar ID en execApprovals.approvers.La entrega en canal muestra el texto del comando en el chat; habilita channel o both solo en grupos/temas de confianza. Cuando el prompt llega a un tema de foro, OpenClaw conserva el tema para el prompt de aprobación y el seguimiento. Las aprobaciones de ejecución caducan después de 30 minutos de forma predeterminada.Los botones de aprobación inline también requieren que channels.telegram.capabilities.inlineButtons permita la superficie de destino (dm, group o all). Los ID de aprobación con prefijo plugin: se resuelven mediante aprobaciones de plugin; los demás se resuelven primero mediante aprobaciones de ejecución.Consulta Aprobaciones de ejecución.Controles de respuesta de error
Cuando el agente encuentra un error de entrega o de proveedor, la política de errores controla si los mensajes de error llegan al chat de Telegram:| Clave | Valores | Predeterminado | Descripción |
|---|---|---|---|
channels.telegram.errorPolicy | always, once, silent | always | always envía cada mensaje de error al chat. once envía cada mensaje de error único una vez por ventana de enfriamiento (suprime errores idénticos repetidos). silent nunca envía mensajes de error al chat. |
channels.telegram.errorCooldownMs | número (ms) | 14400000 (4h) | Ventana de enfriamiento para la política once. Después de enviar un error, el mismo mensaje se suprime hasta que transcurre este intervalo. Evita spam de errores durante interrupciones. |
Solución de problemas
El bot no responde a mensajes de grupo sin mención
El bot no responde a mensajes de grupo sin mención
- Si
requireMention=false, el modo de privacidad de Telegram debe permitir visibilidad completa: BotFather/setprivacy-> Disable, luego elimina y vuelve a añadir el bot al grupo. openclaw channels statusavisa cuando la configuración espera mensajes de grupo sin mención.openclaw channels status --probecomprueba ID numéricos explícitos de grupo; el comodín"*"no puede sondearse para pertenencia.- Prueba rápida de sesión:
/activation always.
El bot no ve ningún mensaje de grupo
El bot no ve ningún mensaje de grupo
- Cuando existe
channels.telegram.groups, el grupo debe estar listado (o incluir"*"). - Verifica la pertenencia del bot al grupo.
- Revisa
openclaw logs --followpara ver motivos de omisión.
Los comandos funcionan parcialmente o no funcionan
Los comandos funcionan parcialmente o no funcionan
- Autoriza tu identidad de remitente (emparejamiento y/o
allowFromnumérico); la autorización de comandos sigue aplicándose incluso cuando la política de grupo esopen. setMyCommands failedconBOT_COMMANDS_TOO_MUCHsignifica que el menú nativo tiene demasiadas entradas; reduce los comandos de plugin/Skills/personalizados o deshabilita los menús nativos.- Las llamadas de inicio
deleteMyCommands/setMyCommandsy las llamadas de escriturasendChatActionestán limitadas y se reintentan una vez mediante el fallback de transporte de Telegram en caso de timeout de solicitud. Los errores persistentes de red/fetch suelen significar que DNS/HTTPS haciaapi.telegram.orgno es accesible.
El inicio informa token no autorizado
El inicio informa token no autorizado
getMe returned 401es un fallo de autenticación de Telegram para el token de bot configurado. Vuelve a copiar o regenera el token en BotFather y luego actualizachannels.telegram.botToken,tokenFile,accounts.<id>.botTokenoTELEGRAM_BOT_TOKEN(cuenta predeterminada).deleteWebhook 401 Unauthorizeddurante el inicio también es un fallo de autenticación; tratarlo como “no existe ningún Webhook” solo diferiría el mismo fallo de token incorrecto a una llamada de API posterior.
Inestabilidad de polling o red
Inestabilidad de polling o red
- Node 22+ con un fetch/proxy personalizado puede activar comportamiento de aborto inmediato si los tipos de
AbortSignalno coinciden. - Algunos hosts resuelven
api.telegram.orga IPv6 primero; una salida IPv6 defectuosa causa fallos intermitentes de API. - Los logs con
TypeError: fetch failedoNetwork request for 'getUpdates' failed!se reintentan como errores de red recuperables. - Durante el inicio de polling, OpenClaw reutiliza el sondeo
getMede inicio correcto para grammY, de modo que el ejecutor no necesita un segundogetMeantes del primergetUpdates. - Si
deleteWebhookfalla con un error de red transitorio durante el inicio de polling, OpenClaw continúa con long polling en lugar de hacer otra llamada de plano de control previa al polling. Un Webhook aún activo aparece entonces como conflicto degetUpdates; OpenClaw reconstruye el transporte y reintenta la limpieza del Webhook. - Si los sockets de Telegram se reciclan en una cadencia fija corta, comprueba si
channels.telegram.timeoutSecondses bajo: los clientes de bot restringen los valores configurados por debajo de los guardas de solicitud saliente ygetUpdates, pero versiones antiguas podían abortar cada sondeo o respuesta cuando esto se configuraba por debajo de esos guardas. Polling stall detecteden los logs significa que OpenClaw reinicia el polling y reconstruye el transporte después de 120 segundos sin liveness de long-poll completada de forma predeterminada.openclaw channels status --probeyopenclaw doctoravisan cuando una cuenta de polling en ejecución no ha completadogetUpdatesdespués de la gracia de inicio, una cuenta de Webhook en ejecución no ha completadosetWebhookdespués de la gracia de inicio, o la última actividad correcta del transporte de polling está obsoleta.- Aumenta
channels.telegram.pollingStallThresholdMssolo cuando las llamadasgetUpdatesde larga duración están sanas pero tu host sigue informando reinicios falsos por bloqueo de polling. Los bloqueos persistentes suelen apuntar a problemas de proxy, DNS, IPv6 o salida TLS haciaapi.telegram.org. - Telegram respeta las variables de entorno de proxy del proceso para el transporte de Bot API:
HTTP_PROXY,HTTPS_PROXY,ALL_PROXYy variantes en minúsculas.NO_PROXY/no_proxyaún puede omitirapi.telegram.org. - Si
OPENCLAW_PROXY_URLestá configurado para un entorno de servicio y no hay ninguna variable de entorno de proxy estándar presente, Telegram también usa esa URL para el transporte de Bot API. - En hosts VPS con salida directa/TLS inestable, enruta las llamadas a la API de Telegram mediante un proxy:
- Node 22+ usa
autoSelectFamily=truede forma predeterminada (excepto WSL2). El orden de resultados DNS de Telegram respetaOPENCLAW_TELEGRAM_DNS_RESULT_ORDER, luegochannels.telegram.network.dnsResultOrder, luego el valor predeterminado del proceso (por ejemploNODE_OPTIONS=--dns-result-order=ipv4first), y recurre aipv4firsten Node 22+ si no aplica ninguno. - En WSL2, o cuando el comportamiento solo IPv4 funciona mejor, fuerza la selección de familia:
- Las respuestas del rango de benchmark RFC 2544 (
198.18.0.0/15) ya están permitidas para descargas de medios de Telegram de forma predeterminada. Si un fake-IP o proxy transparente de confianza reescribeapi.telegram.orga alguna otra dirección privada/interna/de uso especial durante descargas de medios, habilita el bypass solo para Telegram:
- La misma habilitación está disponible por cuenta en
channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork. - Si tu proxy resuelve hosts de medios de Telegram a
198.18.x.x, deja primero desactivada la marca peligrosa: ese rango ya está permitido de forma predeterminada.
- Sobrescrituras temporales de entorno:
OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=1,OPENCLAW_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY=1,OPENCLAW_TELEGRAM_DNS_RESULT_ORDER=ipv4first. - Valida las respuestas DNS:
Referencia de configuración
Referencia principal: Referencia de configuración - Telegram.Campos de alta señal de Telegram
Campos de alta señal de Telegram
- inicio/autenticación:
enabled,botToken,tokenFile(debe ser un archivo regular; los symlinks se rechazan),accounts.* - control de acceso:
dmPolicy,allowFrom,groupPolicy,groupAllowFrom,groups,groups.*.topics.*,bindings[]de nivel superior (type: "acp") - valores predeterminados de tema:
groups.<chatId>.topics."*"se aplica a temas de foro sin coincidencia; los ID exactos de tema lo sobrescriben - aprobaciones de ejecución:
execApprovals,accounts.*.execApprovals - comando/menú:
commands.native,commands.nativeSkills,customCommands - hilos/respuestas:
replyToMode,threadBindings - streaming:
streaming(modosoff | partial | block | progress),streaming.preview.toolProgress - formato/entrega:
textChunkLimit,chunkMode,richMessages,markdown.tables(off | bullets | code | block),linkPreview,responsePrefix - medios/red:
mediaMaxMb,mediaGroupFlushMs,timeoutSeconds,pollingStallThresholdMs,retry,network.autoSelectFamily,network.dangerouslyAllowPrivateNetwork,proxy - raíz de API personalizada:
apiRoot(solo raíz de Bot API; no incluyas/bot<TOKEN>),trustedLocalFileRoots(raíces absolutas defile_pathde Bot API autohospedada) - Webhook:
webhookUrl,webhookSecret,webhookPath,webhookHost,webhookPort,webhookCertPath - acciones/capacidades:
capabilities.inlineButtons,actions.sendMessage|editMessage|deleteMessage|reactions|sticker|createForumTopic|editForumTopic - reacciones:
reactionNotifications,reactionLevel - errores:
errorPolicy,errorCooldownMs,silentErrorReplies - escrituras/historial:
configWrites,historyLimit,dmHistoryLimit,dms.*.historyLimit
channels.telegram.defaultAccount (o incluye channels.telegram.accounts.default) para hacer explícito el enrutamiento predeterminado. De lo contrario, OpenClaw recurre al primer ID de cuenta normalizado y openclaw doctor avisa. Las cuentas con nombre heredan channels.telegram.allowFrom / groupAllowFrom, pero no los valores de accounts.default.*.