多平台网关架构(CLI/Telegram/Discord/Slack)
第20章:多平台网关架构(CLI/Telegram/Discord/Slack)
Hermes Agent 不只是一个命令行工具,它通过网关架构将同一个 Agent 核心接入多个用户界面平台。无论是工程师偏好的 CLI,还是团队协作用的 Slack,抑或是自动化机器人常驻的 Telegram,Hermes 都能以统一的方式进行配置和部署。本章深入分析各平台架构差异、Token 开销对比和选型建议。
20.1 网关架构总览
Hermes 的多平台支持基于"核心 + 网关适配器"的分层架构:
┌──────────────────────────────────────────────────────────────┐
│ Hermes Agent 核心 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────┐ │
│ │ LLM 推理 │ │ 工具执行 │ │ 记忆管理 │ │ Skill 编排 │ │
│ └──────────┘ └──────────┘ └──────────┘ └─────────────┘ │
└──────────────────────────┬───────────────────────────────────┘
│ Agent Core API
┌──────────────────┼──────────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ CLI 网关│ │Telegram │ │Discord │
│ │ │ 网关 │ │ 网关 │
└─────────┘ └─────────┘ └─────────┘
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│终端用户 │ │TG 用户 │ │DC 用户 │
└─────────┘ └─────────┘ └─────────┘
每个网关适配器负责:
- 监听对应平台的消息事件
- 将平台消息格式转换为 Hermes 统一消息格式
- 将 Agent 响应转换回平台格式(包括处理字符限制、格式化等)
- 管理会话状态(用户 ID → 会话 ID 映射)
20.2 CLI 模式详解
CLI 是 Hermes 最轻量的运行模式,直接在终端中与 Agent 交互。
20.2.1 CLI 启动方式
# 基础交互模式
hermes chat
# 单轮问答模式(适合脚本调用)
hermes run "帮我分析 ./logs/error.log 中最常见的错误类型"
# 指定配置文件启动
hermes chat --config ./hermes_prod.yaml
# 带系统提示词启动
hermes chat --system "你是一名专业的 DevOps 工程师,专注于 Kubernetes 运维"
# 加载工作区(自动发现本地 Skills)
hermes chat --workspace ./my_project/
# 调试模式(显示工具调用详情和 Token 统计)
hermes chat --debug
# 指定模型
hermes chat --model nous-hermes-2-mixtral-8x7b-dpo
20.2.2 CLI 会话管理
# 列出历史会话
hermes session list
# 恢复历史会话
hermes session resume session_20240115_103022
# 导出会话记录
hermes session export session_abc123 --format json > session.json
# 删除会话
hermes session delete session_abc123
20.2.3 CLI 模式的 Token 特征
CLI 模式的提示词结构最为精简,典型的上下文占用:
系统提示词: ~800 tokens (基础能力描述 + 工具列表)
用户消息: ~50-200 tokens
历史对话: ~0-2000 tokens (根据配置的记忆长度)
工具调用结果: ~0-1000 tokens (按实际调用数量)
─────────────────────────────────────
总计典型范围: 850 - 4000 tokens/轮
20.3 网关模式:Token 开销分析
网关模式(Telegram/Discord/Slack)因需要处理平台元数据、权限管理、消息路由等额外逻辑,Token 开销显著高于 CLI 模式。
20.3.1 Token 开销对比表
| 组成部分 | CLI 模式 | 网关模式 | 差值说明 |
|---|---|---|---|
| 基础系统提示词 | ~800 tokens | ~800 tokens | 相同 |
| 平台上下文注入 | 0 tokens | ~200-400 tokens | 用户身份、频道、权限信息 |
| 消息路由指令 | 0 tokens | ~100-200 tokens | 多用户消息分发逻辑 |
| 并发会话管理 | 0 tokens | ~150-300 tokens | 多用户会话状态 |
| 格式化约束 | 0 tokens | ~50-150 tokens | 平台字符限制说明 |
| 合计额外开销 | 0 | 500-1050 tokens | 额外多 2-3 倍基础开销 |
实际测量数据(GPT-4 Turbo 128K,20轮对话场景):
CLI 模式平均上下文: 3,200 tokens
Telegram 网关平均: 7,800 tokens (+144%)
Discord 网关平均: 8,100 tokens (+153%)
Slack 网关平均: 8,900 tokens (+178%)
20.3.2 Token 开销高的原因
# 网关模式额外注入的系统上下文(示例)
GATEWAY_SYSTEM_INJECTION = """
## 当前运行环境
- 平台: Telegram
- 频道类型: group_chat
- 频道 ID: -1001234567890
- 频道名称: AI 研究小组
## 当前用户信息
- 用户 ID: 123456789
- 用户名: @alice_researcher
- 显示名: Alice
- 角色权限: member (非管理员)
- 语言偏好: zh-CN
- 时区: Asia/Shanghai
## 消息格式约束
- Telegram 单条消息最大 4096 字符
- 超长响应需分段发送(自动处理)
- 支持 Markdown V2 格式
- 不支持内嵌图片(需用 URL 链接代替)
## 多用户会话隔离
- 当前活跃用户: 3人(Alice/Bob/Charlie)
- 本次消息来自 Alice (@alice_researcher)
- 其他用户的对话在独立上下文中处理
"""
20.4 各平台网关详解
20.4.1 Telegram 网关
配置:
# hermes_config.yaml
gateways:
telegram:
enabled: true
bot_token: "${TELEGRAM_BOT_TOKEN}"
# 访问控制
allowed_users: [] # 空=不限制
allowed_groups: [-1001234567890]
admin_users: [123456789]
# 消息处理
max_message_length: 4096
auto_split_long_messages: true
typing_indicator: true # 处理时显示"正在输入..."
# 媒体支持
handle_photos: true # 接受图片(触发视觉分析)
handle_documents: true # 接受文件(触发文件分析)
handle_voice: true # 接受语音(触发转录)
# 按钮与交互
enable_inline_buttons: true
approval_timeout_seconds: 300 # 需审批操作的超时时间
特有能力:
- 内联键盘按钮(InlineKeyboardMarkup)用于 Agent 操作审批
- 支持语音消息自动转录
- Bot 命令(/start, /help, /status)
- 频道发布模式(Channel Post Mode)
启动网关:
hermes gateway telegram start
# 或后台运行
hermes gateway telegram start --daemon
20.4.2 Discord 网关
配置:
gateways:
discord:
enabled: true
bot_token: "${DISCORD_BOT_TOKEN}"
application_id: "${DISCORD_APP_ID}"
# Slash Command 注册
register_slash_commands: true
slash_commands:
- name: "ask"
description: "向 Hermes Agent 提问"
- name: "research"
description: "执行深度调研任务"
# 频道白名单
allowed_channel_ids: [123456789, 987654321]
# 消息限制
max_message_length: 2000 # Discord 消息上限
use_embeds: true # 超长内容使用 Embed 卡片
max_embed_fields: 25
# 线程支持
create_thread_for_long_tasks: true # 长任务自动创建讨论线程
thread_auto_archive_minutes: 60
特有能力:
- Slash Command(/ask、/research 等斜线命令)
- Embed 卡片(支持字段、缩略图、颜色标注)
- 自动创建线程隔离长任务对话
- Discord Webhooks 主动推送
20.4.3 Slack 网关
配置:
gateways:
slack:
enabled: true
bot_token: "${SLACK_BOT_TOKEN}"
app_token: "${SLACK_APP_TOKEN}" # Socket Mode 需要
# 事件订阅
event_subscriptions:
- app_mention # @hermes 触发
- message.im # DM 触发
- message.channels # 频道消息触发(谨慎开启)
# Block Kit 消息格式
use_block_kit: true
# 工作流集成
enable_workflow_steps: true
# 频道配置
default_channel: "#hermes-bot"
allowed_channels: ["#ai-team", "#dev-tools"]
特有能力:
- Block Kit 富文本消息格式
- Workflow Builder 集成(无代码自动化)
- Slack Actions(消息内按钮操作)
- App Home 标签(个人仪表板)
- 线程回复(Thread replies)保持对话整洁
20.4.4 WhatsApp 的特殊限制
WhatsApp 网关需要注意以下重要限制:
| 限制项 | 说明 |
|---|---|
| 独立手机号 | 必须注册独立的 WhatsApp Business 号码,不能复用个人号 |
| 会话窗口 | 用户主动发消息后,Bot 有 24 小时内免费回复窗口 |
| 模板消息 | 24小时窗口外只能发送预审批的模板消息 |
| API 费用 | WhatsApp Business API 按对话计费 |
| 内容限制 | 不支持 Markdown,消息格式高度受限 |
gateways:
whatsapp:
enabled: true
provider: "360dialog" # 或 twilio, vonage
api_key: "${WA_API_KEY}"
phone_number_id: "${WA_PHONE_ID}"
# 独立号码配置
business_phone: "+1234567890"
# 模板消息(24h 窗口外使用)
templates:
task_complete: "wa_template_task_done_v1"
error_notify: "wa_template_error_v2"
20.5 多平台统一配置方案
为了在多平台间保持一致的 Agent 行为,Hermes 支持分层配置:
# hermes_config.yaml —— 完整多平台配置示例
# 全局配置(所有平台共享)
global:
model: "nous-hermes-2-mixtral-8x7b-dpo"
temperature: 0.7
max_tokens: 4096
system_prompt: |
你是 YiteAI 助手,专注于帮助用户解决技术问题。
请用用户提问的语言回答。
# 记忆配置
memory:
provider: "redis"
redis_url: "${REDIS_URL}"
session_ttl_hours: 24
max_history_turns: 20
# 工具配置
tools:
enabled_categories: [system, network, file, code]
permission_profile: "readonly_research"
# 平台特定配置(可覆盖全局设置)
gateways:
telegram:
enabled: true
bot_token: "${TELEGRAM_BOT_TOKEN}"
# Telegram 专属:温度略低,回答更严谨
model_overrides:
temperature: 0.5
discord:
enabled: true
bot_token: "${DISCORD_BOT_TOKEN}"
application_id: "${DISCORD_APP_ID}"
# Discord 专属:允许更激进的工具使用
permission_profile_override: "full_developer"
slack:
enabled: true
bot_token: "${SLACK_BOT_TOKEN}"
app_token: "${SLACK_APP_TOKEN}"
# Slack 专属:集成企业内部工具
extra_tools: ["jira_create_ticket", "confluence_search"]
20.6 平台选型建议
| 场景 | 推荐平台 | 理由 |
|---|---|---|
| 个人开发者日常使用 | CLI | 最低 Token 开销,完整功能,无延迟 |
| 小型技术团队协作 | Slack | 与工程工具链深度集成,支持 Workflow |
| 社区/公开 Bot | Discord | Slash Command 体验好,线程支持强 |
| 个人/小团队私密使用 | Telegram | 隐私性好,端对端加密,部署简单 |
| 客户服务场景 | 用户基数最大,但有 24h 窗口限制 | |
| CI/CD 流水线集成 | CLI(API 模式) | 脚本友好,支持非交互模式 |
20.6.1 生产部署架构
# 使用 Docker Compose 部署多网关
# docker-compose.yml
version: '3.8'
services:
hermes-core:
image: nousresearch/hermes-agent:4.0
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- REDIS_URL=redis://redis:6379
volumes:
- ./hermes_config.yaml:/app/config.yaml
- ./skills:/app/skills
hermes-telegram:
image: nousresearch/hermes-agent:4.0
command: ["hermes", "gateway", "telegram", "start"]
environment:
- TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
depends_on: [hermes-core]
hermes-slack:
image: nousresearch/hermes-agent:4.0
command: ["hermes", "gateway", "slack", "start"]
environment:
- SLACK_BOT_TOKEN=${SLACK_BOT_TOKEN}
- SLACK_APP_TOKEN=${SLACK_APP_TOKEN}
depends_on: [hermes-core]
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
20.7 小结
本章系统讲解了 Hermes Agent 的多平台网关架构:
- 分层架构:Agent 核心与平台网关解耦,支持独立扩展
- Token 开销差异:网关模式比 CLI 多消耗 2-3 倍 Token(额外 500-1050 tokens)
- 四大平台对比:CLI/Telegram/Discord/Slack 各有适用场景
- WhatsApp 特殊限制:必须独立号码 + 24h 对话窗口
- 统一配置:分层 YAML 支持全局配置 + 平台级覆盖
合理的平台选型能在用户体验和运营成本之间取得最佳平衡。
思考题
-
网关模式额外注入的系统上下文(用户身份、频道信息等)会占用宝贵的上下文窗口空间。如何设计一种"上下文压缩"方案,在不丢失关键信息的前提下减少 Token 消耗?
-
当同一用户同时在 Telegram 和 Slack 与 Hermes 交互时,两个平台的会话应该共享上下文还是独立隔离?如何设计跨平台的会话合并策略?
-
Discord 的 Slash Command 需要提前向 Discord API 注册,这意味着工具列表的变更需要手动触发注册更新。如何设计自动同步机制,在 Skills/Tools 更新时自动刷新 Slash Command 列表?