第 20 章

多平台网关架构(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 用户  │
   └─────────┘        └─────────┘       └─────────┘

每个网关适配器负责:


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  # 需审批操作的超时时间

特有能力:

启动网关:

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

特有能力:

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"]

特有能力:

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 隐私性好,端对端加密,部署简单
客户服务场景 WhatsApp 用户基数最大,但有 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 的多平台网关架构:

合理的平台选型能在用户体验和运营成本之间取得最佳平衡。

思考题

  1. 网关模式额外注入的系统上下文(用户身份、频道信息等)会占用宝贵的上下文窗口空间。如何设计一种"上下文压缩"方案,在不丢失关键信息的前提下减少 Token 消耗?

  2. 当同一用户同时在 Telegram 和 Slack 与 Hermes 交互时,两个平台的会话应该共享上下文还是独立隔离?如何设计跨平台的会话合并策略?

  3. Discord 的 Slash Command 需要提前向 Discord API 注册,这意味着工具列表的变更需要手动触发注册更新。如何设计自动同步机制,在 Skills/Tools 更新时自动刷新 Slash Command 列表?

本章评分
4.8  / 5  (13 评分)

💬 留言讨论