---
title: Canales (Telegram, Chatwoot…)
description: Conecta un agente de Lampson a Telegram, a WhatsApp e Instagram vía Chatwoot, o a cualquier plataforma con un plugin de canal — incluso sin URL pública.
---
# Canales

Un **canal** conecta un agente con una plataforma de mensajería: el agente contesta los mensajes de tus clientes. Lampson trae dos y cada canal es un [plugin](/es/docs/plugins), así que puedes agregar los que necesites:

- **Telegram** — un bot, gratis y sin intermediarios.
- **Chatwoot** — una bandeja que ya une WhatsApp, Instagram, Facebook, email y el chat web: un solo canal cubre todo eso.

Para todos, Lampson pone lo mismo: una conversación por cliente, el [buzón](/es/docs/api#el-buzon) que junta los mensajes en ráfaga en **una** respuesta, el «escribiendo…» mientras el agente trabaja, las fotos como imagen para los modelos con visión, los [permisos](/es/docs/agents#herramientas-y-permisos) y la traza.

## Comandos

```sh
lampson channel list               # cada canal: encendido, agente, modo, URL del webhook
lampson channel on telegram        # encender (decisión tuya, como un plugin)
lampson channel setup telegram     # dejarlo funcionando
lampson channel off telegram
```

En la web: **Canales** en el panel izquierdo — encender, ver el modo y el agente, «configurar» y los últimos eventos.

**Qué agente contesta**: `LAMPSON_CHANNEL_<CANAL>_AGENT=tienda` en `~/lampson/.env` (por ejemplo `LAMPSON_CHANNEL_TELEGRAM_AGENT`). Si no lo defines, el agente por defecto. → [Agentes](/es/docs/agents)

## Con o sin URL pública

Una plataforma avisa de los mensajes nuevos llamando a una URL (un **webhook**). Si tu Lampson tiene URL pública ([`lampson --domain`](/es/docs/phone) o un túnel), `lampson channel setup` registra ese webhook.

**Sin URL pública** — Lampson en la PC de tu casa — los canales que lo permiten (Telegram) funcionan igual: `lampson channel setup` los pasa a **modo sin URL pública** y es Lampson quien le pide los mensajes nuevos a la plataforma. No hace falta dominio ni túnel; solo que el workspace esté encendido (con el hub corriendo, un workspace con canales queda encendido).

## Telegram

1. En Telegram, habla con **@BotFather**, `/newbot`, y copia el token.
2. En `~/lampson/.env`:
   ```sh
   LAMPSON_TELEGRAM_TOKEN=123456789:AA…
   LAMPSON_TELEGRAM_WEBHOOK_SECRET=una-frase-larga-cualquiera
   LAMPSON_CHANNEL_TELEGRAM_AGENT=tienda
   ```
3. En la carpeta del proyecto:
   ```sh
   lampson channel on telegram
   lampson channel setup telegram
   ```

Con URL pública, `setup` registra el webhook con el secreto (Telegram lo manda en cada aviso y Lampson rechaza lo que no lo traiga). Sin URL pública, pasa a modo sin URL pública.

Qué hace el canal: contesta los mensajes nuevos de personas (ignora ediciones, mensajes de otros bots y posts de canales); una foto llega al agente como imagen, con su texto; audios, archivos y ubicaciones llegan como una nota; las respuestas largas se parten en mensajes de hasta 4000 caracteres, cortando en un salto de línea.

> Si el token del bot quedó escrito en algún lugar compartido, regenéralo en @BotFather (`/revoke`) y cámbialo en el `.env`.

## Chatwoot

> **En prueba.** El canal sigue la documentación oficial de Chatwoot y pasa nuestros tests contra un Chatwoot simulado, pero todavía no lo probamos contra una instancia real. Si lo usas y algo no anda, [avísanos](https://github.com/kitecosmic/lampson/issues).

1. En Chatwoot: **Ajustes → Integraciones → Webhooks** → URL `https://tu-lampson/w/<workspace>/ch/chatwoot`, evento `message_created`. Copia el secreto que te muestra.
2. Un token de acceso (tu perfil, o un agent bot) con permiso para responder.
3. En `~/lampson/.env`:
   ```sh
   LAMPSON_CHATWOOT_URL=https://app.chatwoot.com
   LAMPSON_CHATWOOT_TOKEN=…
   LAMPSON_CHATWOOT_WEBHOOK_SECRET=…
   LAMPSON_CHANNEL_CHATWOOT_AGENT=tienda
   ```
4. `lampson channel on chatwoot`.

El canal verifica la firma de Chatwoot, contesta solo los mensajes entrantes y públicos (sus propias respuestas y las notas privadas se ignoran: si no, el bot se contestaría a sí mismo) y pasa las imágenes adjuntas como imagen. Chatwoot necesita una URL pública para llegar a Lampson.

## Escribir tu propio canal

Un canal es un plugin con `"channel"` en su `plugin.json`. Puede no tener herramientas para el modelo:

```json
{
  "name": "mi-canal",
  "description": "Mi plataforma de mensajería",
  "kind": "exec",
  "command": "node canal.js",
  "config": ["MICANAL_TOKEN"],
  "channel": {"agent": "", "typing": true, "poll": false}
}
```

`"config"` le pasa al plugin sus secretos desde el `.env`: `LAMPSON_MICANAL_TOKEN` llega como `PLUGIN_MICANAL_TOKEN`. El plugin recibe la acción en `PLUGIN_TOOL` y sus datos (JSON) en `PLUGIN_ARGS`, e imprime un JSON por stdout:

| acción | recibe | imprime |
|---|---|---|
| `receive` | el webhook crudo: `{method, path, query, headers, body}` (el body exacto, para verificar firmas) | `{"messages": [{"thread", "text", "sent_at"?, "from"?, "images"?, "meta"?}], "http"?: {"status", "body"}}` |
| `send` | `{thread, text, meta, agent, session, batch}` | lo que quieras; una salida que empieza con `ERROR` cuenta como fallo |
| `typing` (opcional) | `{thread, meta}` | — |
| `setup` (opcional) | `{"mode": "webhook", "webhook_url"}` o `{"mode": "poll"}` | un mensaje para la persona |
| `poll` (opcional) | `{cursor}` | `{"messages": [...], "cursor": <el siguiente>}` |

El webhook de un canal es `https://tu-lampson/w/<workspace>/ch/<canal>`: Lampson le contesta a la plataforma enseguida y el agente trabaja aparte. Lo que `send` recibe en `meta` es lo que `receive` devolvió para el último mensaje del lote (los ids de tu plataforma). Cada canal lleva un log en `.lampson/channels/<canal>.log`.

También puedes pedírselo al agente: «haz un canal para Discord» — lo escribe con este contrato, lo valida y te pide encenderlo.
