当前位置: 首页 > news >正文

【Nanobot】README09_LEVEL4 添加新聊天渠道

【Nanobot】README09_LEVEL4 添加新聊天渠道

源码地址:https://github.com/HKUDS/nanobot


🎯 目标

指导如何为 nanobot 添加新的聊天渠道(如 Signal、Matrix、Line 等)。


📋 添加新 Channel 的步骤

步骤 1:创建 Channel 类

文件nanobot/channels/signal.py

fromnanobot.channels.baseimportBaseChannelfromnanobot.bus.eventsimportInboundMessage,OutboundMessagefromnanobot.bus.queueimportMessageBusfromtypingimportAnyclassSignalChannel(BaseChannel):""" Signal 消息渠道实现。 特性: 1. 接收 Signal 消息 2. 发送消息到 Signal 3. 支持流式输出(可选) """name="signal"display_name="Signal"def__init__(self,config:Any,bus:MessageBus):super().__init__(config,bus)# 初始化 Signal 客户端importsignalbot self.bot=signalbot.Bot(config.phone_number)self._running=Falseasyncdefstart(self)->None:"""启动 Signal Bot。"""self._running=True# 注册消息处理器@self.bot.handler()asyncdefon_message(message):awaitself._handle_message(sender_id=str(message.source),chat_id=str(message.chat_id),content=message.text,media=message.attachmentsor[],)# 启动 Botawaitself.bot.start()asyncdefstop(self)->None:"""停止 Signal Bot。"""self._running=Falseawaitself.bot.stop()asyncdefsend(self,msg:OutboundMessage)->None:"""发送消息到 Signal。"""awaitself.bot.send_message(chat_id=msg.chat_id,text=msg.content,quote_reply_to=msg.reply_to,)

步骤 2:实现流式输出(可选)

如果 Channel 支持编辑消息(如 Telegram),可以实现流式输出:

asyncdefsend_delta(self,chat_id:str,delta:str,metadata:dict[str,Any]|None=None,)->None:""" 交付流式文本块。 实现: 1. 提取 stream_id 2. 第一条消息 → 发送新消息 3. 后续消息 → 编辑已有消息 4. _stream_end → 清理缓冲区 """stream_id=metadata.get("_stream_id")ifmetadataelseNoneifnotstream_id:returnifmetadata.get("_stream_delta"):# 增量内容ifstream_idnotinself._edit_buffers:# 发送第一条消息sent_msg=awaitself.bot.send_message(chat_id=chat_id,text=delta,)self._edit_buffers[stream_id]=sent_msgelse:# 编辑已有消息old_msg=self._edit_buffers[stream_id]new_content=old_msg.text+deltaawaitold_msg.edit(text=new_content)elifmetadata.get("_stream_end"):# 流式结束ifstream_idinself._edit_buffers:delself._edit_buffers[stream_id]

步骤 3:添加配置字段

文件nanobot/config/schema.py

ChannelsConfig中添加字段:

classChannelsConfig(Base):telegram:TelegramConfig|None=Nonediscord:DiscordConfig|None=Nonesignal:SignalConfig|None=None# 新增classSignalConfig(Base):enabled:bool=Falsephone_number:str=""allow_from:list[str]=["*"]# 访问控制列表

步骤 4:配置新 Channel

文件~/.nanobot/config.json

{"channels":{"signal":{"enabled":true,"phoneNumber":"+1234567890","allowFrom":["*"]}}}

步骤 5:测试新 Channel

# 启动 gatewaynanobot gateway# 在 Signal 中发送消息给 Bot# 应该收到回复

🔧 高级:插件化 Channel

如果希望将 Channel 作为独立插件发布(不修改核心代码),可以使用entry_points

项目结构

nanobot-signal/ ├── nanobot_signal/ │ └── __init__.py └── pyproject.toml

pyproject.toml

[project] name = "nanobot-signal" version = "0.1.0" [project.entry-points."nanobot.channels"] signal = "nanobot_signal:SignalChannel" [project.dependencies] nanobot-ai = ">=0.1.0" signalbot = "*"

nanobot_signal/__init__.py

fromnanobot.channels.baseimportBaseChannelfromnanobot.bus.queueimportMessageBusfromtypingimportAnyclassSignalChannel(BaseChannel):name="signal"display_name="Signal"def__init__(self,config:Any,bus:MessageBus):super().__init__(config,bus)# ... 实现代码 ...

安装和使用

# 安装插件pipinstallnanobot-signal# 配置(不需要修改核心代码)cat>~/.nanobot/config.json<<EOF { "channels": { "signal": { "enabled": true } } } EOF# 启动nanobot gateway

📝 检查清单

  • 实现BaseChannel接口
    • start()- 启动监听
    • send()- 发送消息
    • stop()- 停止监听
  • 处理消息
    • 接收消息并调用_handle_message()
    • 支持媒体文件(图片、文档等)
    • 支持音频转录(可选)
  • 实现流式输出(可选)
    • send_delta()- 增量更新
    • 消息编辑缓冲区
  • 添加配置字段
    • schema.py中添加配置类
    • config.json中启用
  • 测试
    • 基本对话功能
    • 工具调用
    • 流式输出(如果支持)
    • 访问控制(allow_from

🎯 完整示例:添加 Email Channel

Email Channel 已经内置,参考实现:

文件nanobot/channels/email.py

classEmailChannel(BaseChannel):"""电子邮件渠道。"""name="email"display_name="Email"asyncdefstart(self):"""启动 IMAP 监听。"""importimaplib self.imap=imaplib.IMAP4_SSL(self.config.imap_server)self.imap.login(self.config.email,self.config.password)self.imap.select("INBOX")whileself._running:# 轮询新邮件awaitself._check_new_emails()awaitasyncio.sleep(30)asyncdefsend(self,msg:OutboundMessage):"""发送邮件。"""importsmtplibfromemail.messageimportEmailMessage email=EmailMessage()email["From"]=self.config.email email["To"]=msg.chat_id email.set_content(msg.content)withsmtplib.SMTP_SSL(self.config.smtp_server)assmtp:smtp.login(self.config.email,self.config.password)smtp.send_message(email)

📚 相关文件

  • nanobot/channels/base.py- BaseChannel 抽象基类
  • nanobot/channels/telegram.py- Telegram 实现示例
  • nanobot/channels/discord.py- Discord 实现示例
  • nanobot/config/schema.py- 配置模式

🎉 完成分析

全部 9 个分析单元已完成!

生成的文档列表

  1. ✅ README01_LEVEL1_项目架构与目录说明.md
  2. ✅ README02_LEVEL2_Agent核心循环设计.md
  3. ✅ README03_LEVEL2_工具系统架构.md
  4. ✅ README04_LEVEL2_提供商系统设计.md
  5. ✅ README05_LEVEL2_渠道系统设计.md
  6. ✅ README06_LEVEL3_消息流转深度追踪.md
  7. ✅ README07_LEVEL3_会话管理与记忆.md
  8. ✅ README08_LEVEL4_添加新LLM提供商.md
  9. ✅ README09_LEVEL4_添加新聊天渠道.md

文档位置.aitalk/目录

建议阅读顺序:README01 → README02 → … → README09

http://www.jsqmd.com/news/839536/

相关文章:

  • Ultimate ASI Loader:Windows游戏插件加载终极指南,轻松实现零风险游戏修改
  • 3步实现微信聊天记录永久备份:WeChatExporter完整解决方案
  • 逃跑路线【牛客tracker 每日一题】
  • 告别玄学调试:用示波器和抓包工具搞定ARM ast1520与RTL8367的MDIO通信
  • Windows文件管理难题:如何让APK文件显示原生图标?
  • 2026年武汉办公室空调深度测评:如何为你的办公空间匹配最佳方案? - 速递信息
  • 晶晨T972嵌入式主板开发指南:从硬件选型到量产部署
  • 2026年全国人力资源咨询公司哪家好 专注落地服务 口碑良好的专业服务机构 - 深度智识库
  • MASA模组汉化包终极指南:快速解决Minecraft英文界面问题
  • WinForm上位机实战:5分钟用C#连接西门子PLC(Modbus TCP,含仿真环境搭建)
  • Windows平台防撤回利器:RevokeMsgPatcher深度技术解析与实战指南
  • SteamVR Unity插件终极指南:5分钟快速配置VR应用的完整教程
  • CSS 伪类完全指南
  • 2026海南自贸港税务服务市场调研:一份来自海南的市场侧记 - 速递信息
  • 【简单】一行代码求两个数的最大公约数-Java
  • 2026年帝舵中国区售后服务网络升级全流程记录(附最新电话及地址) - 亨得利官方服务中心
  • 上海创赢建筑科技:口碑好的上海围挡销售公司 - LYL仔仔
  • openclaw用户如何快速接入taotoken扩展ai能力
  • Grafana 9.5 版本启动报错 panic: runtime error 怎么解决?
  • 家庭日常水果挑选实用指南:兼顾口感、保鲜与营养留存 - 奔跑123
  • 在Windows上安装APK的完整指南:告别模拟器,拥抱原生体验
  • WeChatExporter:基于iOS备份解析的微信聊天记录数据提取架构
  • 【困难】丟棋子问题-Java:解法五
  • STM32 GPIO八种模式详解:从硬件原理到实战配置
  • 2026苏州搬家公司推荐,大件搬运,同城搬家,长短途搬家,公司搬家公司优选指南! - 品牌鉴赏师
  • DLSS版本切换终极指南:一键解锁游戏性能新境界
  • 首驱电动车和雅迪、台铃质量真实差距:日常通勤到底怎么选? - 速递信息
  • Cursor Pro免费激活终极指南:10步解锁AI编程助手完整功能
  • 【简单】字符串的统计字符串-Java:补充问题
  • 2026年推荐榜:青岛无人机培训top5教练案例分享 - 速递信息