跳转到内容

通道

PRX 通过通道进行通信——实现通用 Channel trait 的消息集成。每个通道运行自己的监听循环,维护每个发送者的对话历史,并执行独立的访问策略。

通道后端协议备注
Signal (CLI)signal-cliD-Bus / JSON-RPC基于 CLI 的 Signal 客户端
Signal (原生)libsignalSignal 协议原生 Rust 实现
WhatsApp (whatsmeow)whatsmeow 桥接WebSocket基于 Go 的 WhatsApp Web 桥接
WhatsApp (wacli)wacliCLI轻量级 WhatsApp CLI
WhatsApp (wa-rs)wa-rs原生纯 Rust WhatsApp 客户端
TelegramteloxideBot API完整的 Bot API 支持
DiscordserenityGateway WebSocket斜杠命令和消息事件
Slackslack-morphismEvents API + WebSocket兼容 Bolt 的事件处理
Matrixmatrix-sdk客户端-服务器 API通过 vodozemac 完整支持 E2EE
iMessageapplescript / imessage-rsAppleScript / BlueBubbles仅 macOS
IRCirc crateIRC 协议标准 IRC,支持 TLS
EmailIMAP + SMTPIMAP IDLE / 轮询支持 HTML 和附件
钉钉钉钉开放 APIHTTP Webhook + WebSocket中国企业消息
飞书飞书开放 APIHTTP Webhook + WebSocket字节跳动企业套件
QQOpenShamrock / LagrangeOneBot v11通过反向 WebSocket 的 QQ 机器人
MattermostMattermost APIWebSocket + REST自托管团队聊天
Nextcloud TalkNextcloud Talk API轮询自托管协作工具
LinQLinQ 协议自定义内部消息协议
CLIstdin/stdoutTTY本地交互模式

每个通道独立配置,包含访问控制策略:

[channels.telegram]
enabled = true
token = "BOT_TOKEN"
# DM 策略:谁可以直接向机器人发消息
dm_policy = "allowlist" # "allowlist" | "open" | "disabled"
dm_allowlist = [123456789, 987654321]
# 群组策略:机器人在哪些群组中响应
group_policy = "allowlist" # "allowlist" | "open" | "disabled"
group_allowlist = [-1001234567890]
# 发送者白名单(同时适用于 DM 和群组)
sender_allowlist = ["user_id_1", "user_id_2"]
策略行为
allowlist仅明确列出的用户/群组可以交互
open任何人都可以交互(请谨慎使用)
disabled通道方向(DM 或群组)完全关闭

每条传入消息遵循以下流程:

通道监听循环
├─ 1. 从平台接收消息
├─ 2. 策略检查(dm_policy / group_policy / sender_allowlist)
│ 拒绝 → 静默丢弃
├─ 3. 每发送者历史查找
│ 每个发送者维护 50 条消息的滚动窗口
├─ 4. 并发控制
│ 每个通道最多 4 个并行请求
│ 超出的请求进入队列
├─ 5. 超时预算
│ 每个请求的超时,防止 LLM 挂起
├─ 6. 通过路由器路由到 LLM
│ 意图分类 → 模型选择 → 生成
├─ 7. 将响应发回通道
├─ 8. 记忆自动保存
│ 重要对话持久化到 prx-memory
└─ 9. 历史压缩
当历史超过 50 条消息时,旧条目
被总结和压缩以保持上下文质量

PRX 维护每个发送者最近 50 条消息的对话缓冲区。这不是简单的截断:

  • 消息带有时间戳、角色(用户/助手)和通道元数据
  • 当缓冲区满时,最旧的消息被压缩为摘要
  • 摘要添加到历史开头,在不消耗完整令牌窗口的情况下保留上下文
  • 历史按发送者隔离——对话不会在用户之间泄露

每个通道强制执行最多 4 个并行 LLM 请求。这可以防止:

  • LLM 供应商的速率限制耗尽
  • 过多并发上下文窗口的内存压力
  • 快速响应突发导致的平台端限流

超出并发限制的请求在 FIFO 队列中等待,当槽位释放时处理。

PRX 为通过 Webhook 而非持久连接通信的通道暴露 HTTP 网关。用于:

  • 钉钉(事件订阅回调)
  • 飞书(事件订阅回调)
  • Slack(Events API 模式)
  • 通过 HTTP 向 PRX 发送的自定义集成

网关验证传入的 Webhook 签名,将载荷映射为内部消息格式,并送入相同的消息流处理流程。