Photon 前天开源了 Spectrum——一个 TypeScript SDK,让你的 AI Agent 同时跑在 iMessage、WhatsApp、Telegram、Discord、Slack 上。写一次 Agent 逻辑,
definePlatform选好渠道就能部署。我试了一天,踩了几个坑,也发现了一些意外的亮点。
Spectrum 解决的问题
做多渠道 AI Agent 最烦的不是 Agent 逻辑——而是每个平台的接入方式都不一样。
我之前接飞书用 WebSocket,接 Discord 用 Bot Token,接 Telegram 用 Webhook。三个平台三套代码,消息格式不同,事件模型不同,认证方式不同。每接一个新渠道就要花半天到一天。
Spectrum 的思路是把平台差异抽象掉。你写 Agent 的核心逻辑,然后用definePlatform声明要发到哪些渠道。SDK 负责处理每个平台的协议细节。
import{Agent,definePlatform}from"spectrum-ts";constagent=newAgent({name:"my-assistant",onMessage:async(message)=>{// 这段逻辑在所有平台上都一样constreply=awaitcallLLM(message.text);return{text:reply};}});// 一行代码加一个渠道agent.use(definePlatform("telegram",{token:process.env.TG_TOKEN}));agent.use(definePlatform("discord",{token:process.env.DC_TOKEN}));agent.use(definePlatform("imessage",{/* Spectrum Cloud 凭证 */}));agent.start();MIT 协议开源,npm 安装:npm install spectrum-ts。
为什么 iMessage 是杀手特性
Spectrum 支持的渠道里,Telegram、Discord、Slack 都有现成的 Bot API——这些自己接也不难。iMessage 是独家的。
Apple 没有提供官方的 iMessage Bot API。之前想在 iMessage 上跑 Agent 基本不可能(除非用 Jailbreak 或者 AppleScript 黑魔法,都不稳定)。
Spectrum 通过 Photon Cloud 的桥接服务实现了 iMessage 接入。你的 Agent 发消息到 Photon Cloud,Cloud 通过合法渠道发到 iMessage。延迟 150-250ms,比大多数聊天 API 都快。
这意味着:你终于可以跟自己的 AI Agent 在 iMessage 里聊天了。
对于用 Apple 生态的开发者来说,这个价值很大。iMessage 是 iOS 用户用得最多的消息 App——在这里跑 Agent,意味着不需要装任何新 App。
实测:部署一个多渠道 Agent
我花了一下午把一个简单的 Agent(新闻摘要助手)部署到了 Telegram + Discord + iMessage。
安装和初始化(5 分钟)
mkdirspectrum-test&&cdspectrum-testnpminit-ynpminstallspectrum-tsAgent 逻辑(10 分钟)
// agent.tsimport{Agent,definePlatform}from"spectrum-ts";importOpenAIfrom"openai";constllm=newOpenAI({baseUrl:"https://your-api-gateway.com/v1",apiKey:process.env.LLM_KEY});constagent=newAgent({name:"news-helper",onMessage:async(msg)=>{if(msg.text.includes("新闻")||msg.text.includes("news")){constresp=awaitllm.chat.completions.create({model:"deepseek/deepseek-v3",messages:[{role:"system",content:"你是一个 AI 新闻助手,用中文回答。"},{role:"user",content:msg.text}]});return{text:resp.choices[0].message.content};}return{text:`收到你的消息:${msg.text.slice(0,50)}...`};}});// 三个渠道agent.use(definePlatform("telegram",{token:process.env.TG_TOKEN}));agent.use(definePlatform("discord",{token:process.env.DC_TOKEN}));agent.start();console.log("Agent 启动,监听 Telegram + Discord");部署结果
| 维度 | Telegram | Discord | iMessage |
|---|---|---|---|
| 接入时间 | 3 分钟 | 3 分钟 | 10 分钟(需要 Cloud) |
| 首条消息延迟 | 210ms | 180ms | 240ms |
| 消息格式 | 纯文本 ✓ / Markdown ✓ | 纯文本 ✓ / Embed ✓ | 纯文本 ✓ / 富文本 ✗ |
| 图片发送 | ✓ | ✓ | ✓ |
| 稳定性(24h) | 0 断连 | 0 断连 | 1 次断连(自动恢复) |
全程不到 20 分钟三个渠道就跑起来了。之前我接一个飞书就花了半天。
Spectrum vs OpenClaw:互补不是竞争
我用开源 Agent 框架(OpenClaw)跑了两个多月的多渠道 Agent。看到 Spectrum 第一反应是"这个要替代我的方案了吗?"
仔细看了一天之后,结论是互补大于竞争。它们解决的是不同层面的问题。
| 维度 | Spectrum | OpenClaw |
|---|---|---|
| 定位 | 消息渠道的统一层 | 完整的 Agent 运行时 |
| 核心价值 | 一套代码发到所有平台 | Agent 生命周期管理 |
| Agent 逻辑 | 你自己写 | 内置(对话、工具调用、记忆) |
| 模型调用 | 你自己接 | 内置(fallback chain、路由) |
| 记忆系统 | 无 | 内置(持久化跨 session) |
| 定时任务 | 无 | 内置(cron 系统) |
| 渠道支持 | iMessage ✓ / WhatsApp ✓ | 飞书 ✓ / 企微 ✓ |
| iMessage | ✓(杀手特性) | ✗ |
| 飞书 | ✗ | ✓ |
一句话总结:Spectrum 是"渠道层",OpenClaw 是"运行层"。
Spectrum 只管"消息怎么到达用户"。它不管 Agent 怎么思考、怎么调工具、怎么记忆。你需要自己写 Agent 逻辑,或者——用 OpenClaw 做 Agent 运行时,再通过 Spectrum 发到 iMessage。
这个组合拳很有想象力:OpenClaw 的 Agent 能力(记忆、工具调用、定时任务、模型路由)+ Spectrum 的渠道覆盖(iMessage、WhatsApp)。
为什么不是一个东西做完
有人可能问:OpenClaw 为什么不自己支持 iMessage?
因为 iMessage 没有公开 API。Apple 不让第三方直接接入。Spectrum 通过 Photon Cloud 提供了一个合规的桥接服务——这需要和 Apple 生态深度打交道,不是一个开源项目几天能搞定的。
反过来,Spectrum 为什么不做 Agent 运行时?因为那是另一个领域。做好消息路由和做好 Agent 思考是两码事。让每个工具专注自己最擅长的事,通过组合获得最大价值。
实测中发现的坑
坑 1:iMessage 需要 Spectrum Cloud(不能纯自托管)
Spectrum SDK 是开源的,但 iMessage 接入必须走 Photon Cloud。这意味着:
- 你的消息经过 Photon 的服务器
- 需要注册 Photon 账号并配置凭证
- 有延迟(虽然只有 240ms,但比本地 Telegram 的 210ms 多了 30ms)
如果你对数据隐私有严格要求,iMessage 渠道要慎重考虑。Telegram 和 Discord 可以完全自托管。
坑 2:iMessage 的富文本支持有限
Telegram 支持 Markdown 格式消息,Discord 支持 Embed。但 iMessage 目前只支持纯文本 + 图片。不能发代码块、不能发表格、不能发带链接预览的卡片。
如果你的 Agent 需要发送结构化信息(比如数据报表),iMessage 渠道的体验会打折扣。
坑 3:跨渠道消息格式需要适配
Spectrum 的onMessage回调给你一个统一的消息对象。但当你的回复在不同渠道上展示时,格式差异还是存在的。
// 你以为在所有渠道都是这样显示return{text:"**加粗** 和 `代码`"};// 实际上:// Telegram: 加粗显示正常,代码块正常// Discord: 加粗正常,代码块正常// iMessage: 直接显示原始 Markdown 字符 **加粗** 和 `代码`建议:对 iMessage 渠道做一层格式清洗,把 Markdown 标记去掉。
functioncleanForPlatform(text:string,platform:string):string{if(platform==="imessage"){returntext.replace(/\*\*(.*?)\*\*/g,"$1")// 去加粗.replace(/`(.*?)`/g,"$1")// 去代码标记.replace(/#{1,3}\s/g,"");// 去标题标记}returntext;}延迟实测数据
跑了 100 条消息的端到端延迟(从发送到收到 Agent 回复):
| 渠道 | P50 | P95 | P99 |
|---|---|---|---|
| Telegram | 1.8s | 3.2s | 5.1s |
| Discord | 1.6s | 2.9s | 4.3s |
| iMessage | 2.0s | 3.5s | 5.8s |
注意:这个延迟包含了模型推理时间(~1.2s),渠道本身的延迟只有 150-250ms。三个渠道差距很小——主要差异来自模型推理速度的波动,不是渠道传输。
我的用法
目前把 Spectrum 当做一个"补充渠道层"用:
| 渠道 | 工具 | 原因 |
|---|---|---|
| 飞书 | 自建 Agent 框架 | 国内团队主力渠道 |
| Discord | 自建 Agent 框架 | 社区主力渠道 |
| iMessage | Spectrum | 个人移动端,只有 Spectrum 能接 |
iMessage 是我自己移动端用得最多的消息 App。以前不能在 iMessage 里和 Agent 聊天,只能切到飞书或者 Discord。现在用 Spectrum 接上之后,日常小任务(查个信息、翻译一句话)直接在 iMessage 里发就行了。
模型调用走 API 网关统一管理——不管从哪个渠道来的消息,后端调用都走一个 Key,我在 TheRouter 上看到一个统一的调用日志和账单,不用按渠道去对账。
常见问题
Q: Spectrum 是免费的吗?
A: SDK 开源免费(MIT 协议)。Telegram、Discord、Slack 这些有公开 API 的渠道可以完全自托管,零成本。iMessage 和 WhatsApp 需要走 Spectrum Cloud(Photon 的付费服务),目前 beta 期间免费,正式定价未公布。
Q: Spectrum 能和 OpenClaw 一起用吗?
A: 理论上可以——让 OpenClaw 处理 Agent 逻辑(记忆、工具调用、模型路由),Spectrum 处理消息投递(尤其是 iMessage)。但目前没有现成集成,需要自己写一层适配。我觉得未来会有人做这个集成。
Q: WhatsApp 的接入体验怎么样?
A: 我没有实测 WhatsApp(需要 WhatsApp Business API 账号)。从文档看,接入方式和 Telegram 类似——definePlatform("whatsapp", { credentials })一行搞定。但 WhatsApp 的消息模板审核比较严格,这不是 Spectrum 能解决的。