← KinWiki
Concepts·live · auto-updated

消息接入 — 把一座蜂群城连上所有 IM

OpenClaw 连上 Telegram,进来的是一个 bot;LocalKin 连上 Telegram,进来的是 一座城 —— 130 个专家、隔离的多租户、连着 IoT 边缘的巡查蜂群。

这一层让任何 agent 能跟外界的消息应用双向通信。设计上全 stdlib:输出走 HTTP/SMTP,输入走 HTTP long-poll,没有引入任何 websocket/第三方依赖。

架构:三件套

                    ┌─────────────── 输出侧(agent 主动发)
                    │   send_telegram / send_discord / send_slack
                    │   send_email / send_sms  —— 都是 SKILL.md + python
                    │   一个模子:读 ~/.localkin/env 凭证 → HTTP POST / SMTP
   agent ◄──────────┤
                    │
                    └─────────────── 输入侧(平台消息进来)
                        localkin -telegram-bridge —— 常驻进程
                        long-poll 平台 → 按 soul channels 路由 → /v1/chat
                        → 回复发回平台

   soul 的 channels: 块 —— 声明这个 agent 监听哪个平台/哪个 chat

接入矩阵

平台输出(发)输入(收)接入难度
Telegramsend_telegram-telegram-bridge(long-poll,无需公网)⭐ 最简单,双向已通
Discordsend_discord(Incoming Webhook)⚠️ 需 gateway websocket 或公网 Interactions输出 ⭐ / 输入 ⭐⭐⭐
Slacksend_slack(Incoming Webhook)⚠️ 需 Socket Mode 或公网 Events API输出 ⭐ / 输入 ⭐⭐⭐
Emailsend_email(SMTP)⚠️ 需 IMAP poll(后续)输出 ⭐
SMSsend_sms(Twilio)⚠️ 需 Twilio 公网 webhook输出 ⭐
WhatsApp🔜 Twilio/Meta(要资质审核)🔜 公网 webhook⭐⭐⭐⭐ 见下方说明

为什么 Telegram 是首选双向通道:它的 Bot API 支持 long-poll(getUpdates), 一个进程拉就行,不需要公网 endpoint、不需要 websocket —— 唯一一个零基建的优雅 双向。其它平台的输入要么要 websocket(违反 stdlib-only),要么要把一个公网 webhook endpoint 暴露给平台(你有 cloudflared,可做,但多一道配置)。所以现阶段:Telegram 管双向对话,其余平台管输出通知,这覆盖 80% 的真实场景。

凭证配置(~/.localkin/env 一览)

每个 skill 只在用到时才要对应凭证,缺了就优雅报错、绝不空发:

# Telegram —— 找 @BotFather /newbot 拿 token
export TELEGRAM_BOT_TOKEN="123456:ABC-DEF..."

# Discord —— 频道设置 → 整合 → Webhooks → 复制 URL
export DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/.../..."

# Slack —— api.slack.com/apps → Incoming Webhooks → 复制 URL
export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/.../.../..."

# Email —— Gmail 用 App Password(非登录密码)
export SMTP_HOST="smtp.gmail.com"
export SMTP_PORT="587"
export SMTP_USER="you@gmail.com"
export SMTP_PASS="16-char-app-password"
export SMTP_FROM="you@gmail.com"

# SMS —— twilio.com 拿号 + SID + Token
export TWILIO_ACCOUNT_SID="ACxxxx"
export TWILIO_AUTH_TOKEN="xxxx"
export TWILIO_FROM="+1xxxxxxxxxx"

agent 怎么用

1. 让 agent 能发 —— 在 soul 的 skills.enable 加上要用的 send skill:

skills:
  enable: ["send_telegram", "send_discord", "send_email", "knowledge_search"]

之后 agent 在对话/自治中需要发通知时,直接调用即可。

2. 让 agent 能收(Telegram) —— 在 soul 加 channels 块:

channels:
  telegram:
    chat_id: "*"                       # "*" = 接所有 chat,或具体 id
    endpoint: "http://127.0.0.1:8019"  # 这个 agent 的 base url
    # auth_token 可选,默认回退到 server.auth_token,再回退 "lk2026"

3. 起 bridge:

localkin -telegram-bridge

它扫所有 soul 的 channels.telegram,建路由表,然后 long-poll。参考实现见 souls/telegram_concierge.soul.md(一个前台客服人设)。

物业场景的完整闭环

租户在 Telegram 发"B栋3楼漏水"
   → bridge 收到 → 路由进隔离的物业蜂群
   → 前台 agent 分类 → 巡查 agent 调 IoT 看现场传感器
   → send_telegram 回租户 "已派单,预计30分钟到场"
   → send_sms 给值班维修 "🚨 B栋3楼漏水,IoT 已确认"
全链路在一台 mini 上闭环,租户之间隐私隔离。

WhatsApp 单独说明

商业价值最高(物业/拉美/东南亚/中东主场),但最讲究:

扩展一个新平台 = 填一个适配器

输出:照 skills/send_telegram/ 复制一份,改 API 端点和 payload 字段即可。 输入:照 cmd/localkin/telegram_bridge.go 的 scan→route→ask→reply 四段,换成 目标平台的拉取/接收方式。soul 的 channels 块和路由逻辑完全复用。